Ping ......

Best wishes
Emily Deng

>-----Original Message-----
>From: Deng, Emily <emily.d...@amd.com>
>Sent: Friday, February 15, 2019 11:51 AM
>To: Deng, Emily <emily.d...@amd.com>; amd-gfx@lists.freedesktop.org
>Subject: RE: [PATCH libdrm] libdrm: Fix issue about differrent domainID but 
>same
>BDF
>
>Ping ......
>
>>-----Original Message-----
>>From: amd-gfx <amd-gfx-boun...@lists.freedesktop.org> On Behalf Of
>>Emily Deng
>>Sent: Thursday, February 14, 2019 3:54 PM
>>To: amd-gfx@lists.freedesktop.org
>>Cc: Deng, Emily <emily.d...@amd.com>
>>Subject: [PATCH libdrm] libdrm: Fix issue about differrent domainID but
>>same BDF
>>
>>For multiple GPUs which has the same BDF, but has different domain ID,
>>the drmOpenByBusid will return the wrong fd when startx.
>>
>>The reproduce sequence as below:
>>1. Call drmOpenByBusid to open Card0, then will return the right fd0,
>>and the
>>fd0 is master privilege;
>>2. Call drmOpenByBusid to open Card1. In function drmOpenByBusid, it
>>will open
>>Card0 first, this time, the fd1 for opening Card0 is not master
>>privilege, and will call drmSetInterfaceVersion to identify the domain
>>ID feature, as the fd1 is not master privilege, then
>>drmSetInterfaceVersion will fail, and then won't compare domain ID, then
>return the wrong fd for Card1.
>>
>>Solution:
>>First loop search the best match fd about drm 1.4.
>>
>>Signed-off-by: Emily Deng <emily.d...@amd.com>
>>---
>> xf86drm.c | 23 +++++++++++++++++++++++
>> 1 file changed, 23 insertions(+)
>>
>>diff --git a/xf86drm.c b/xf86drm.c
>>index 336d64d..b60e029 100644
>>--- a/xf86drm.c
>>+++ b/xf86drm.c
>>@@ -584,11 +584,34 @@ static int drmOpenByBusid(const char *busid, int
>type)
>>     if (base < 0)
>>         return -1;
>>
>>+    /* We need to try for 1.4 first for proper PCI domain support */
>>     drmMsg("drmOpenByBusid: Searching for BusID %s\n", busid);
>>     for (i = base; i < base + DRM_MAX_MINOR; i++) {
>>         fd = drmOpenMinor(i, 1, type);
>>         drmMsg("drmOpenByBusid: drmOpenMinor returns %d\n", fd);
>>         if (fd >= 0) {
>>+            sv.drm_di_major = 1;
>>+            sv.drm_di_minor = 4;
>>+            sv.drm_dd_major = -1;        /* Don't care */
>>+            sv.drm_dd_minor = -1;        /* Don't care */
>>+            if (!drmSetInterfaceVersion(fd, &sv)) {
>>+                buf = drmGetBusid(fd);
>>+                drmMsg("drmOpenByBusid: drmGetBusid reports %s\n", buf);
>>+                if (buf && drmMatchBusID(buf, busid, 1)) {
>>+                    drmFreeBusid(buf);
>>+                    return fd;
>>+                }
>>+                if (buf)
>>+                    drmFreeBusid(buf);
>>+            }
>>+            close(fd);
>>+        }
>>+    }
>>+
>>+   for (i = base; i < base + DRM_MAX_MINOR; i++) {
>>+        fd = drmOpenMinor(i, 1, type);
>>+        drmMsg("drmOpenByBusid: drmOpenMinor returns %d\n", fd);
>>+        if (fd >= 0) {
>>             /* We need to try for 1.4 first for proper PCI domain support
>>              * and if that fails, we know the kernel is busted
>>              */
>>--
>>2.7.4
>>
>>_______________________________________________
>>amd-gfx mailing list
>>amd-gfx@lists.freedesktop.org
>>https://lists.freedesktop.org/mailman/listinfo/amd-gfx
_______________________________________________
amd-gfx mailing list
amd-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/amd-gfx

Reply via email to