From patchwork Wed Nov 30 20:35:10 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Emil Velikov X-Patchwork-Id: 9454877 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork.web.codeaurora.org (Postfix) with ESMTP id C1B046074E for ; Wed, 30 Nov 2016 20:35:50 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id B623928484 for ; Wed, 30 Nov 2016 20:35:50 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id AB116284A2; Wed, 30 Nov 2016 20:35:50 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-4.1 required=2.0 tests=BAYES_00, DKIM_ADSP_CUSTOM_MED, DKIM_SIGNED, FREEMAIL_FROM, RCVD_IN_DNSWL_MED, T_DKIM_INVALID autolearn=ham version=3.3.1 Received: from gabe.freedesktop.org (gabe.freedesktop.org [131.252.210.177]) (using TLSv1.2 with cipher DHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.wl.linuxfoundation.org (Postfix) with ESMTPS id 3454428484 for ; Wed, 30 Nov 2016 20:35:50 +0000 (UTC) Received: from gabe.freedesktop.org (localhost [127.0.0.1]) by gabe.freedesktop.org (Postfix) with ESMTP id C4B486E522; Wed, 30 Nov 2016 20:35:47 +0000 (UTC) X-Original-To: dri-devel@lists.freedesktop.org Delivered-To: dri-devel@lists.freedesktop.org Received: from mail-wj0-x242.google.com (mail-wj0-x242.google.com [IPv6:2a00:1450:400c:c01::242]) by gabe.freedesktop.org (Postfix) with ESMTPS id 98CD36E522 for ; Wed, 30 Nov 2016 20:35:36 +0000 (UTC) Received: by mail-wj0-x242.google.com with SMTP id kp2so23890056wjc.0 for ; Wed, 30 Nov 2016 12:35:36 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=ZuUtZBqYv+BzbTG1wlCwk8NWUcjrHhFRmvApN4lm1d4=; b=Co6vQ5UTBIp43PVVvWTIQes8Z+Vir0+qrigyGXhDQO49NJDC7RmANEE1suQpw1GQYJ S5bupkfKkGZuodP3wGoaJkP7UBR0tsMwbo5tWIFSaoCvuoeUCo4wmuGdZNtUg9gNNVsK YexQUKkYDbKJ+2l4jamFhJWYam/dkX9CSM4bYm8suhEjhH/i+G0XxRUUEGu2OjogwDQr iG53t843nOWOK7REA+kZ/KbK+BVvLFC3QjvHBkdRwj8bq+VXc6Up6BkqQwADXBgsVdM3 LJH50mMQJCQgfXM0l3cQLrXDBYU96fiBifJqR3JuKyXf85xOx4Xv/Z7fTW9p9HxxpvpP nqmA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=ZuUtZBqYv+BzbTG1wlCwk8NWUcjrHhFRmvApN4lm1d4=; b=Zn5J44DjGHesuQ/2hJ/j8f8Y0FaRfy+kMutR5kDuSP0x1pRjyPkFFZOL7+LFn973LM CMIjShDahG/fUpw58PJkRdLQWoNG/V+B6FNzo0t8k8yBfdI4+tHZhamiwe8IhiXhwqRZ BBaz9V3GjqkEUjdd/9zVemoOVV8mQ9xoD/MOCG6WPvZwIHWLQnLMnu+wKcH2+8VKSoJM i5O4CZH1Az7EAYB/c9RrFp9lZOp9Y9eBv5oyTJhRMyuXp1mp53cg3JeDqrc7MaA7hob0 YLJMsv4C9i9juHbBQ99vmuiB7H5/+aVDu09EwnM/DLbqSLBBvOx5gW1hNA1j1rKhykKP 9JLg== X-Gm-Message-State: AKaTC01nhuCUOtU0tZtqTXp7u32XV45zvFqysn+G0M5kpOLxLeFjFSsdLZW1wDHS5QK0Jg== X-Received: by 10.194.222.202 with SMTP id qo10mr29628833wjc.115.1480538134975; Wed, 30 Nov 2016 12:35:34 -0800 (PST) Received: from arch-x1c3.cbg.collabora.co.uk ([2a00:1098:5:0:9665:9cff:feee:aa4d]) by smtp.gmail.com with ESMTPSA id ei2sm74572607wjd.47.2016.11.30.12.35.34 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Wed, 30 Nov 2016 12:35:34 -0800 (PST) From: Emil Velikov To: dri-devel@lists.freedesktop.org Subject: [PATCH libdrm 4/5] xf86drm: introduce drmGetDevice[s]2 Date: Wed, 30 Nov 2016 20:35:10 +0000 Message-Id: <20161130203511.18910-4-emil.l.velikov@gmail.com> X-Mailer: git-send-email 2.10.2 In-Reply-To: <20161130203511.18910-1-emil.l.velikov@gmail.com> References: <20161130203511.18910-1-emil.l.velikov@gmail.com> MIME-Version: 1.0 Cc: Mauro Santos , =?UTF-8?q?Michel=20D=C3=A4nzer?= , emil.l.velikov@gmail.com X-BeenThere: dri-devel@lists.freedesktop.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: Direct Rendering Infrastructure - Development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" X-Virus-Scanned: ClamAV using ClamSMTP From: Emil Velikov Relative to the original version, here one can provide a flags bitmask. Currently only DRM_DEVICE_IGNORE_PCI_REVISION is supported. Implementation detail: If it's set, we will only parse the separate sysfs files and we won't touch the config one. The latter awakes the device (causing delays) which is the core reason why this API was introduced. Cc: Michel Dänzer Cc: Nicolai Hähnle Cc: Mauro Santos Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=98502 Signed-off-by: Emil Velikov Reviewed-by: Michel Dänzer --- Michel, Nicolai any naming suggestions or input in general will be appreciated. --- xf86drm.c | 64 +++++++++++++++++++++++++++++++++++++++++++++++++++++++-------- xf86drm.h | 4 ++++ 2 files changed, 60 insertions(+), 8 deletions(-) diff --git a/xf86drm.c b/xf86drm.c index 701cf29..f117716 100644 --- a/xf86drm.c +++ b/xf86drm.c @@ -2948,7 +2948,8 @@ static int drmGetMaxNodeName(void) #ifdef __linux__ static int parse_separate_sysfs_files(int maj, int min, - drmPciDeviceInfoPtr device) + drmPciDeviceInfoPtr device, + bool ignore_revision) { #define ARRAY_SIZE(a) (sizeof(a) / sizeof((a)[0])) static const char *attrs[] = { @@ -2963,7 +2964,7 @@ static int parse_separate_sysfs_files(int maj, int min, FILE *fp; int ret; - for (unsigned i = 0; i < ARRAY_SIZE(attrs); i++) { + for (unsigned i = (0 + !!ignore_revision); i < ARRAY_SIZE(attrs); i++) { snprintf(path, PATH_MAX, "/sys/dev/char/%d:%d/device/%s", maj, min, attrs[i]); fp = fopen(path, "r"); @@ -2977,7 +2978,7 @@ static int parse_separate_sysfs_files(int maj, int min, } - device->revision_id = data[0] & 0xff; + device->revision_id = ignore_revision ? 0 : data[0] & 0xff; device->vendor_id = data[1] & 0xffff; device->device_id = data[2] & 0xffff; device->subvendor_id = data[3] & 0xffff; @@ -3018,7 +3019,10 @@ static int drmParsePciDeviceInfo(int maj, int min, uint32_t flags) { #ifdef __linux__ - if (parse_separate_sysfs_files(maj, min, device)) + if (flags & DRM_DEVICE_IGNORE_PCI_REVISION) + return parse_separate_sysfs_files(maj, min, device, true); + + if (parse_separate_sysfs_files(maj, min, device, false)) return parse_config_sysfs_file(maj, min, device); return 0; @@ -3125,16 +3129,24 @@ static void drmFoldDuplicatedDevices(drmDevicePtr local_devices[], int count) } } +/* Check that the given flags are valid returning 0 on success */ +static int +drm_device_validate_flags(uint32_t flags) +{ + return (flags & ~DRM_DEVICE_IGNORE_PCI_REVISION); +} + /** * Get information about the opened drm device * * \param fd file descriptor of the drm device + * \param flags feature/behaviour bitmask * \param device the address of a drmDevicePtr where the information * will be allocated in stored * * \return zero on success, negative error code otherwise. */ -int drmGetDevice(int fd, drmDevicePtr *device) +int drmGetDevice2(int fd, uint32_t flags, drmDevicePtr *device) { drmDevicePtr *local_devices; drmDevicePtr d; @@ -3147,7 +3159,9 @@ int drmGetDevice(int fd, drmDevicePtr *device) int ret, i, node_count; int max_count = 16; dev_t find_rdev; - uint32_t flags = 0; + + if (drm_device_validate_flags(flags)) + return -EINVAL; if (fd == -1 || device == NULL) return -EINVAL; @@ -3246,8 +3260,23 @@ free_locals: } /** + * Get information about the opened drm device + * + * \param fd file descriptor of the drm device + * \param device the address of a drmDevicePtr where the information + * will be allocated in stored + * + * \return zero on success, negative error code otherwise. + */ +int drmGetDevice(int fd, drmDevicePtr *device) +{ + return drmGetDevice2(fd, 0, device); +} + +/** * Get drm devices on the system * + * \param flags feature/behaviour bitmask * \param devices the array of devices with drmDevicePtr elements * can be NULL to get the device number first * \param max_devices the maximum number of devices for the array @@ -3257,7 +3286,7 @@ free_locals: * alternatively the number of devices stored in devices[], which is * capped by the max_devices. */ -int drmGetDevices(drmDevicePtr devices[], int max_devices) +int drmGetDevices2(uint32_t flags, drmDevicePtr devices[], int max_devices) { drmDevicePtr *local_devices; drmDevicePtr device; @@ -3269,7 +3298,9 @@ int drmGetDevices(drmDevicePtr devices[], int max_devices) int maj, min; int ret, i, node_count, device_count; int max_count = 16; - uint32_t flags = 0; + + if (drm_device_validate_flags(flags)) + return -EINVAL; local_devices = calloc(max_count, sizeof(drmDevicePtr)); if (local_devices == NULL) @@ -3357,6 +3388,23 @@ free_locals: return ret; } +/** + * Get drm devices on the system + * + * \param devices the array of devices with drmDevicePtr elements + * can be NULL to get the device number first + * \param max_devices the maximum number of devices for the array + * + * \return on error - negative error code, + * if devices is NULL - total number of devices available on the system, + * alternatively the number of devices stored in devices[], which is + * capped by the max_devices. + */ +int drmGetDevices(drmDevicePtr devices[], int max_devices) +{ + return drmGetDevices2(0, devices, max_devices); +} + char *drmGetDeviceNameFromFd2(int fd) { #ifdef __linux__ diff --git a/xf86drm.h b/xf86drm.h index 4da6bd3..1c6ed36 100644 --- a/xf86drm.h +++ b/xf86drm.h @@ -801,6 +801,10 @@ extern void drmFreeDevice(drmDevicePtr *device); extern int drmGetDevices(drmDevicePtr devices[], int max_devices); extern void drmFreeDevices(drmDevicePtr devices[], int count); +#define DRM_DEVICE_IGNORE_PCI_REVISION 0x0001 +extern int drmGetDevice2(int fd, uint32_t flags, drmDevicePtr *device); +extern int drmGetDevices2(uint32_t flags, drmDevicePtr devices[], int max_devices); + #if defined(__cplusplus) } #endif