From: "Nicolai Hähnle" <nhaehnle@gmail.com>
To: Emil Velikov <emil.l.velikov@gmail.com>, dri-devel@lists.freedesktop.org
Cc: "Mauro Santos" <registo.mailling@gmail.com>,
"Michel Dänzer" <michel.daenzer@amd.com>
Subject: Re: [PATCH libdrm v2] xf86drm: Parse the separate files to retrieve the vendor, ... info
Date: Thu, 10 Nov 2016 13:40:15 +0100 [thread overview]
Message-ID: <6144b875-884d-e858-062f-97172e29bf47@gmail.com> (raw)
In-Reply-To: <20161109180850.6012-1-emil.l.velikov@gmail.com>
On 09.11.2016 19:08, Emil Velikov wrote:
> From: Emil Velikov <emil.velikov@collabora.com>
>
> Parsing config 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 that
> is about to change.
>
> Since returning 0 when one might expect a valid value is a no-go add a
> workaround drmDeviceUseRevisionFile() which one can use to say "I don't
> care if the revision file returns 0."
>
> v2: Complete rework - add new API to control the method, instead of
> changing it underneat the users' feet.
>
> 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>
> ---
> I don't have a strong preference for/against this or v1.
>
> With this Mesa will require a 2 line patch. With v1 things will get
> fixed magically, when rebuilt against newer libdrm.
>
> Mauro I'll send the mesa patch in a second. Feel free to give it a spin.
>
> Thanks
> ---
> xf86drm.c | 70 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++---
> xf86drm.h | 11 ++++++++++
> 2 files changed, 78 insertions(+), 3 deletions(-)
>
> diff --git a/xf86drm.c b/xf86drm.c
> index 52add5e..676effc 100644
> --- a/xf86drm.c
> +++ b/xf86drm.c
> @@ -113,6 +113,13 @@ void drmSetServerInfo(drmServerInfoPtr info)
> drm_server_info = info;
> }
>
> +static bool use_revision_file;
> +
> +void drmDeviceUseRevisionFile(void)
> +{
> + use_revision_file = true;
> +}
I think this API of setting a magic hidden global variable is really nasty.
Can we add new drmGetDevice[s] entry points with a flags parameter and a
flag (per Michel's suggestion) which says "I don't care about the
revision ID"? It kind of sucks because they'll have to get a silly name
like drmGetDevice[s]2, but I think that's still better than magic global
state.
Cheers,
Nicolai
> +
> /**
> * Output a message to stderr.
> *
> @@ -2946,10 +2953,56 @@ static int drmGetMaxNodeName(void)
> 3 /* length of the node number */;
> }
>
> -static int drmParsePciDeviceInfo(const char *d_name,
> - drmPciDeviceInfoPtr device)
> -{
> #ifdef __linux__
> +static int parse_separate_sysfs_files(const char *d_name,
> + drmPciDeviceInfoPtr device)
> +{
> +#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];
> + unsigned int data[ARRAY_SIZE(attrs)];
> + FILE *fp;
> + int ret;
> +
> + 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 = fscanf(fp, "%x", &data[i]);
> + fclose(fp);
> + if (ret != 1)
> + return -errno;
> +
> + }
> +
> + 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;
> +}
> +
> +static int parse_config_sysfs_file(const char *d_name,
> + drmPciDeviceInfoPtr device)
> +{
> char path[PATH_MAX + 1];
> unsigned char config[64];
> int fd, ret;
> @@ -2971,6 +3024,17 @@ static int drmParsePciDeviceInfo(const char *d_name,
> device->subdevice_id = config[46] | (config[47] << 8);
>
> return 0;
> +}
> +#endif
> +
> +static int drmParsePciDeviceInfo(const char *d_name,
> + drmPciDeviceInfoPtr device)
> +{
> +#ifdef __linux__
> + if (use_revision_file)
> + return parse_separate_sysfs_files(d_name, device);
> +
> + return parse_config_sysfs_file(d_name, device);
> #else
> #warning "Missing implementation of drmParsePciDeviceInfo"
> return -EINVAL;
> diff --git a/xf86drm.h b/xf86drm.h
> index 481d882..d1ebc32 100644
> --- a/xf86drm.h
> +++ b/xf86drm.h
> @@ -796,6 +796,17 @@ extern void drmFreeDevice(drmDevicePtr *device);
> extern int drmGetDevices(drmDevicePtr devices[], int max_devices);
> extern void drmFreeDevices(drmDevicePtr devices[], int count);
>
> +
> +/**
> + * Force any sequential calls to drmGetDevice/drmGetDevices to use the
> + * revision sysfs file instead of config one. The latter wakes up the device
> + * if powered off.
> + *
> + * A value of 0 will be returned for the revision_id field if the sysfs file
> + * is missing. DO NOT USE THIS if you depend on a correct revision_id.
> + */
> +extern void drmDeviceUseRevisionFile(void);
> +
> #if defined(__cplusplus)
> }
> #endif
>
_______________________________________________
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-10 12:40 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
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 [this message]
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=6144b875-884d-e858-062f-97172e29bf47@gmail.com \
--to=nhaehnle@gmail.com \
--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.