For xf86CallDriverProbe, xf86platformProbeDev can usually pass, but it
may fail in some cases (i.e, multiple X servers) because of the error
"failed to set DRM interface version 1.4: Permission denied"

drmSetInterfaceVersion requires drm master, but when do the platform probe
for the second X server, the master may not be dropped by previous X server.
The platform probe fails in this case, and then the pci prove patch is used.

Change-Id: Ic4581e3e932157c09a535a198e80601d5f710688
Signed-off-by: Jammy Zhou <[email protected]>
---
 src/amdgpu_probe.c | 18 ++++++++++++++++--
 1 file changed, 16 insertions(+), 2 deletions(-)

diff --git a/src/amdgpu_probe.c b/src/amdgpu_probe.c
index 481271b..c041401 100644
--- a/src/amdgpu_probe.c
+++ b/src/amdgpu_probe.c
@@ -183,6 +183,7 @@ static Bool amdgpu_open_drm_master(ScrnInfoPtr pScrn)
                return FALSE;
        }
 
+       info->drmmode.fd = pAMDGPUEnt->fd = info->dri2.drm_fd;
        return TRUE;
 }
 
@@ -234,13 +235,23 @@ static Bool amdgpu_get_scrninfo(int entity_num, void 
*pci_dev)
        if (!pPriv->ptr) {
                uint32_t major_version;
                uint32_t minor_version;
+               AMDGPUInfoPtr info;
 
                pPriv->ptr = xnfcalloc(sizeof(AMDGPUEntRec), 1);
                pAMDGPUEnt = pPriv->ptr;
+               if (!pPriv->ptr)
+                       return FALSE;
+
+               pScrn->driverPrivate = xnfcalloc(sizeof(AMDGPUInfoRec), 1);
+               if (!pScrn->driverPrivate)
+                       goto error_private;
 
-               if (amdgpu_open_drm_master(pScrn)) {
+               info = (AMDGPUInfoPtr)pScrn->driverPrivate;
+               info->pEnt = pEnt;
+               info->PciInfo = xf86GetPciInfoForEntity(info->pEnt->index);
+
+               if (!amdgpu_open_drm_master(pScrn))
                        goto error_fd;
-               }
 
                pAMDGPUEnt->fd_ref = 1;
 
@@ -267,6 +278,9 @@ static Bool amdgpu_get_scrninfo(int entity_num, void 
*pci_dev)
 error_amdgpu:
        drmClose(pAMDGPUEnt->fd);
        pAMDGPUEnt->fd = 0;
+error_private:
+       free(pScrn->driverPrivate);
+       pScrn->driverPrivate = NULL;
 error_fd:
        free(pPriv->ptr);
        return FALSE;
-- 
1.9.1

_______________________________________________
xorg-driver-ati mailing list
[email protected]
http://lists.x.org/mailman/listinfo/xorg-driver-ati

Reply via email to