[PATCH xf86-video-amdgpu 3/3] Only call amdgpu_bus_id once in each probe path
Michel Dänzer
michel at daenzer.net
Fri Jan 8 01:04:56 PST 2016
From: Michel Dänzer <michel.daenzer at amd.com>
Instead of up to twice as before.
Signed-off-by: Michel Dänzer <michel.daenzer at amd.com>
---
src/amdgpu_probe.c | 52 +++++++++++++++++++++++++---------------------------
1 file changed, 25 insertions(+), 27 deletions(-)
diff --git a/src/amdgpu_probe.c b/src/amdgpu_probe.c
index f74eb29..ea9ffa7 100644
--- a/src/amdgpu_probe.c
+++ b/src/amdgpu_probe.c
@@ -99,16 +99,10 @@ static char *amdgpu_bus_id(ScrnInfoPtr pScrn, struct pci_device *dev)
return busid;
}
-static Bool amdgpu_kernel_mode_enabled(ScrnInfoPtr pScrn,
- struct pci_device *pci_dev)
+static Bool amdgpu_kernel_mode_enabled(ScrnInfoPtr pScrn, char *busIdString)
{
- char *busIdString = amdgpu_bus_id(pScrn, pci_dev);
- int ret;
+ int ret = drmCheckModesettingSupported(busIdString);
- if (!busIdString)
- return FALSE;
-
- ret = drmCheckModesettingSupported(busIdString);
#if defined(__FreeBSD__) || defined(__FreeBSD_kernel__)
if (ret) {
if (xf86LoadKernelModule("amdgpukms"))
@@ -127,10 +121,9 @@ static Bool amdgpu_kernel_mode_enabled(ScrnInfoPtr pScrn,
return TRUE;
}
-static int amdgpu_kernel_open_fd(ScrnInfoPtr pScrn, struct pci_device *dev,
+static int amdgpu_kernel_open_fd(ScrnInfoPtr pScrn, char *busid,
struct xf86_platform_device *platform_dev)
{
- char *busid;
int fd;
#ifdef XF86_PDEV_SERVER_FD
@@ -142,29 +135,21 @@ static int amdgpu_kernel_open_fd(ScrnInfoPtr pScrn, struct pci_device *dev,
}
#endif
- busid = amdgpu_bus_id(pScrn, dev);
- if (!busid)
- return -1;
-
fd = drmOpen(NULL, busid);
- if (fd == -1) {
+ if (fd == -1)
xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
"[drm] Failed to open DRM device for %s: %s\n",
busid, strerror(errno));
- free(busid);
- return fd;
- }
- free(busid);
return fd;
}
static Bool amdgpu_open_drm_master(ScrnInfoPtr pScrn, AMDGPUEntPtr pAMDGPUEnt,
- struct pci_device *pci_dev)
+ char *busid)
{
drmSetVersion sv;
int err;
- pAMDGPUEnt->fd = amdgpu_kernel_open_fd(pScrn, pci_dev, NULL);
+ pAMDGPUEnt->fd = amdgpu_kernel_open_fd(pScrn, busid, NULL);
if (pAMDGPUEnt->fd == -1)
return FALSE;
@@ -190,6 +175,7 @@ static Bool amdgpu_open_drm_master(ScrnInfoPtr pScrn, AMDGPUEntPtr pAMDGPUEnt,
static Bool amdgpu_get_scrninfo(int entity_num, struct pci_device *pci_dev)
{
ScrnInfoPtr pScrn = NULL;
+ char *busid;
EntityInfoPtr pEnt;
DevUnion *pPriv;
AMDGPUEntPtr pAMDGPUEnt;
@@ -200,8 +186,9 @@ static Bool amdgpu_get_scrninfo(int entity_num, struct pci_device *pci_dev)
if (!pScrn)
return FALSE;
- if (!amdgpu_kernel_mode_enabled(pScrn, pci_dev))
- return FALSE;
+ busid = amdgpu_bus_id(pScrn, pci_dev);
+ if (!amdgpu_kernel_mode_enabled(pScrn, busid))
+ goto error;
pScrn->driverVersion = AMDGPU_VERSION_CURRENT;
pScrn->driverName = AMDGPU_DRIVER_NAME;
@@ -235,10 +222,10 @@ static Bool amdgpu_get_scrninfo(int entity_num, struct pci_device *pci_dev)
pPriv->ptr = xnfcalloc(sizeof(AMDGPUEntRec), 1);
if (!pPriv->ptr)
- return FALSE;
+ goto error;
pAMDGPUEnt = pPriv->ptr;
- if (!amdgpu_open_drm_master(pScrn, pAMDGPUEnt, pci_dev))
+ if (!amdgpu_open_drm_master(pScrn, pAMDGPUEnt, busid))
goto error_fd;
pAMDGPUEnt->fd_ref = 1;
@@ -261,6 +248,7 @@ static Bool amdgpu_get_scrninfo(int entity_num, struct pci_device *pci_dev)
index)
- 1);
free(pEnt);
+ free(busid);
return TRUE;
@@ -268,6 +256,8 @@ error_amdgpu:
drmClose(pAMDGPUEnt->fd);
error_fd:
free(pPriv->ptr);
+error:
+ free(busid);
return FALSE;
}
@@ -304,6 +294,7 @@ amdgpu_platform_probe(DriverPtr pDriver,
{
ScrnInfoPtr pScrn;
int scr_flags = 0;
+ char *busid;
EntityInfoPtr pEnt;
DevUnion *pPriv;
AMDGPUEntPtr pAMDGPUEnt;
@@ -319,9 +310,13 @@ amdgpu_platform_probe(DriverPtr pDriver,
xf86SetEntityShared(entity_num);
xf86AddEntityToScreen(pScrn, entity_num);
- if (!amdgpu_kernel_mode_enabled(pScrn, dev->pdev))
+ busid = amdgpu_bus_id(pScrn, dev->pdev);
+ if (!busid)
return FALSE;
+ if (!amdgpu_kernel_mode_enabled(pScrn, busid))
+ goto error;
+
pScrn->driverVersion = AMDGPU_VERSION_CURRENT;
pScrn->driverName = AMDGPU_DRIVER_NAME;
pScrn->name = AMDGPU_NAME;
@@ -353,7 +348,7 @@ amdgpu_platform_probe(DriverPtr pDriver,
pPriv->ptr = xnfcalloc(sizeof(AMDGPUEntRec), 1);
pAMDGPUEnt = pPriv->ptr;
- pAMDGPUEnt->fd = amdgpu_kernel_open_fd(pScrn, dev->pdev, dev);
+ pAMDGPUEnt->fd = amdgpu_kernel_open_fd(pScrn, busid, dev);
if (pAMDGPUEnt->fd < 0)
goto error_fd;
@@ -378,6 +373,7 @@ amdgpu_platform_probe(DriverPtr pDriver,
index)
- 1);
free(pEnt);
+ free(busid);
return TRUE;
@@ -385,6 +381,8 @@ error_amdgpu:
drmClose(pAMDGPUEnt->fd);
error_fd:
free(pPriv->ptr);
+error:
+ free(busid);
return FALSE;
}
#endif
--
2.6.2
More information about the xorg-driver-ati
mailing list