Ping ...... >-----Original Message----- >From: amd-gfx <amd-gfx-bounces@xxxxxxxxxxxxxxxxxxxxx> On Behalf Of Deng, >Emily >Sent: Monday, February 18, 2019 10:17 AM >To: Alex Deucher <alexdeucher@xxxxxxxxx>; Maling list - DRI developers <dri- >devel@xxxxxxxxxxxxxxxxxxxxx> >Cc: amd-gfx list <amd-gfx@xxxxxxxxxxxxxxxxxxxxx> >Subject: RE: [PATCH libdrm] libdrm: Fix issue about differrent domainID but same >BDF > >Thanks Alex to help to add the dri-devel. > >Best wishes >Emily Deng > > >>-----Original Message----- >>From: Alex Deucher <alexdeucher@xxxxxxxxx> >>Sent: Friday, February 15, 2019 11:14 PM >>To: Deng, Emily <Emily.Deng@xxxxxxx>; Maling list - DRI developers >><dri- devel@xxxxxxxxxxxxxxxxxxxxx> >>Cc: amd-gfx list <amd-gfx@xxxxxxxxxxxxxxxxxxxxx> >>Subject: Re: [PATCH libdrm] libdrm: Fix issue about differrent domainID >>but same BDF >> >>Adding dri-devel. >> >>On Thu, Feb 14, 2019 at 2:53 AM Emily Deng <Emily.Deng@xxxxxxx> wrote: >>> >>> 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.Deng@xxxxxxx> >>> --- >>> 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@xxxxxxxxxxxxxxxxxxxxx >>> https://lists.freedesktop.org/mailman/listinfo/amd-gfx >_______________________________________________ >amd-gfx mailing list >amd-gfx@xxxxxxxxxxxxxxxxxxxxx >https://lists.freedesktop.org/mailman/listinfo/amd-gfx _______________________________________________ amd-gfx mailing list amd-gfx@xxxxxxxxxxxxxxxxxxxxx https://lists.freedesktop.org/mailman/listinfo/amd-gfx