From: Peter Wu <peter@lekensteyn.nl>
To: Emil Velikov <emil.l.velikov@gmail.com>
Cc: "Mauro Santos" <registo.mailling@gmail.com>,
"Michel Dänzer" <michel.daenzer@amd.com>,
dri-devel@lists.freedesktop.org
Subject: Re: [PATCH libdrm] xf86drm: Parse the separate files to retrieve the vendor/device info
Date: Wed, 2 Nov 2016 12:14:58 +0100 [thread overview]
Message-ID: <20161102111458.GA5682@al> (raw)
In-Reply-To: <20161101181334.8225-1-emil.l.velikov@gmail.com>
On Tue, Nov 01, 2016 at 06:13:34PM +0000, Emil Velikov wrote:
> sysfs file wakes up the device. The latter of which may
> be slow and isn't required to begin with.
>
> Reading through config is/was required since the revision is not
> available by other means, although with a kernel patch in the way we can
> 'cheat' temporarily.
>
> That should be fine, since no open-source project has ever used the
> value.
>
> Cc: Michel Dänzer <michel.daenzer@amd.com>
> Cc: Mauro Santos <registo.mailling@gmail.com>
> Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=98502
> Signed-off-by: Emil Velikov <emil.velikov@collabora.com>
See below for one observation. Other than that, strace confirms that
the new sysfs files are being accessed.
Reviewed-and-tested-by: Peter Wu <peter@lekensteyn.nl>
This was tested with Linux 4.8.4 (unpatched) and libdrm 2.4.71 (+this
patch) with i915 + nouveau. Tested with running glxgears and glxinfo.
Note that glxinfo still accesses 'config' due to libpciaccess.
+ drm_intel_get_aperture_sizes
+ drm_intel_probe_agp_aperture_size
+ pci_system_init()
+ pci_system_linux_sysfs_create
+ populate_entries
+ pci_device_linux_sysfs_read() <-- offending function
+ pci_device_find_by_slot(0, 0, 2, 0)
That populate_entries function can probably use a fix similar to this
one.
> ---
> Mauro can you apply this against libdrm and rebuild it. You do _not_
> need to rebuild mesa afterwords.
>
> Thanks
> ---
> xf86drm.c | 50 +++++++++++++++++++++++++++++++++++---------------
> 1 file changed, 35 insertions(+), 15 deletions(-)
>
> diff --git a/xf86drm.c b/xf86drm.c
> index 52add5e..5a5100c 100644
> --- a/xf86drm.c
> +++ b/xf86drm.c
> @@ -2950,25 +2950,45 @@ static int drmParsePciDeviceInfo(const char *d_name,
> drmPciDeviceInfoPtr device)
> {
> #ifdef __linux__
> +#define ARRAY_SIZE(a) (sizeof(a) / sizeof((a)[0]))
> + static const char *attrs[] = {
> + "revision", /* XXX: make sure it's always first, see note below */
> + "vendor",
> + "device",
> + "subsystem_vendor",
> + "subsystem_device",
> + };
> char path[PATH_MAX + 1];
The size for snprintf already includes the nul-terminator, so strictly
speaking the +1 is not needed. It does not hurt either though.
> - unsigned char config[64];
> - int fd, ret;
> + unsigned int data[ARRAY_SIZE(attrs)];
> + FILE *fp;
> + int ret;
>
> - snprintf(path, PATH_MAX, "/sys/class/drm/%s/device/config", d_name);
> - fd = open(path, O_RDONLY);
> - if (fd < 0)
> - return -errno;
> + for (unsigned i = 0; i < ARRAY_SIZE(attrs); i++) {
> + snprintf(path, PATH_MAX, "/sys/class/drm/%s/device/%s",
> + d_name, attrs[i]);
> + fp = fopen(path, "r");
> + if (!fp) {
> + /* Note: First we check the revision, since older kernels
> + * may not have it. Default to zero in such cases. */
> + if (i == 0) {
> + data[i] = 0;
> + continue;
> + }
> + return -errno;
> + }
>
> - ret = read(fd, config, sizeof(config));
> - close(fd);
> - if (ret < 0)
> - return -errno;
> + ret = fscanf(fp, "%x", &data[i]);
> + fclose(fp);
> + if (ret != 1)
> + return -errno;
> +
> + }
>
> - device->vendor_id = config[0] | (config[1] << 8);
> - device->device_id = config[2] | (config[3] << 8);
> - device->revision_id = config[8];
> - device->subvendor_id = config[44] | (config[45] << 8);
> - device->subdevice_id = config[46] | (config[47] << 8);
> + device->revision_id = data[0] & 0xff;
> + device->vendor_id = data[1] & 0xffff;
> + device->device_id = data[2] & 0xffff;
> + device->subvendor_id = data[3] & 0xffff;
> + device->subdevice_id = data[4] & 0xffff;
>
> return 0;
> #else
> --
> 2.10.0
_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel
next prev parent reply other threads:[~2016-11-02 11:15 UTC|newest]
Thread overview: 27+ messages / expand[flat|nested] mbox.gz Atom feed top
2016-11-01 18:13 [PATCH libdrm] xf86drm: Parse the separate files to retrieve the vendor/device info Emil Velikov
2016-11-01 18:47 ` Mauro Santos
2016-11-08 11:06 ` Emil Velikov
2016-11-08 13:38 ` Mauro Santos
2016-11-08 15:00 ` Emil Velikov
2016-11-08 15:27 ` Mauro Santos
2016-11-08 15:57 ` Emil Velikov
2016-11-08 16:57 ` Mauro Santos
2016-11-08 17:13 ` Emil Velikov
2016-11-08 18:08 ` Mauro Santos
2016-11-08 18:36 ` Mauro Santos
2016-11-08 18:47 ` Emil Velikov
[not found] ` <20161101181334.8225-1-emil.l.velikov-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
2016-11-02 3:07 ` Fwd: " Michel Dänzer
[not found] ` <071ab37d-9897-760f-5a63-5f5ede867bd3-otUistvHUpPR7s880joybQ@public.gmane.org>
2016-11-04 18:14 ` Emil Velikov
[not found] ` <CACvgo52D+zVZMs_RM5_2sWX4=DnWi15bKSXBh-jYBfDQRm9_cw-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
2016-11-07 9:14 ` Michel Dänzer
[not found] ` <467a1840-f812-eb3e-ac61-50eb3799e94b-otUistvHUpPR7s880joybQ@public.gmane.org>
2016-11-07 11:30 ` Emil Velikov
[not found] ` <CACvgo50feO=LxuW7TXn89dFSfno7hBFw+JXvyyt9586qmo7yyQ-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
2016-11-08 8:44 ` Michel Dänzer
[not found] ` <e35dce0f-cfd4-02d0-97ef-5f32572d1864-otUistvHUpPR7s880joybQ@public.gmane.org>
2016-11-08 11:33 ` Emil Velikov
2016-11-02 11:14 ` Peter Wu [this message]
2016-11-02 11:47 ` Emil Velikov
2016-11-02 12:32 ` Peter Wu
2016-11-09 18:08 ` [PATCH libdrm v2] xf86drm: Parse the separate files to retrieve the vendor, ... info Emil Velikov
2016-11-10 8:00 ` Michel Dänzer
2016-11-10 12:40 ` Nicolai Hähnle
2016-11-10 13:38 ` Emil Velikov
2016-11-14 9:56 ` Michel Dänzer
2016-11-14 10:46 ` Emil Velikov
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20161102111458.GA5682@al \
--to=peter@lekensteyn.nl \
--cc=dri-devel@lists.freedesktop.org \
--cc=emil.l.velikov@gmail.com \
--cc=michel.daenzer@amd.com \
--cc=registo.mailling@gmail.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.