summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEmil Velikov <emil.velikov@collabora.com>2019-07-17 00:01:51 +0100
committerEmil Velikov <emil.l.velikov@gmail.com>2020-03-16 14:25:16 +0000
commitb357a8474074d911d1c03572d4d9db3ee420633a (patch)
tree1638bae4a72308f8cd8d39ff7cbed5296c286a07
parent2c0c154a838060eb683599faf9cbfa3e66dd42c8 (diff)
Store the busid string in AMDGPUEnt
This way we can reuse it, instead of redoing it later on. v2: Pass the AMDGPUEnt as argument. v3: free() the string at AMDGPUFreeRec (Michel) v4: Inline amdgpu_bus_id, move at top of mdgpu_kernel_open_fd (Michel) Signed-off-by: Emil Velikov <emil.velikov@collabora.com> Reviewed-by: Michel Dänzer <michel.daenzer@amd.com> (v3) Acked-by: Alex Deucher <alexander.deucher@amd.com>
-rw-r--r--src/amdgpu_kms.c1
-rw-r--r--src/amdgpu_probe.c46
-rw-r--r--src/amdgpu_probe.h1
3 files changed, 20 insertions, 28 deletions
diff --git a/src/amdgpu_kms.c b/src/amdgpu_kms.c
index 94d1c0b..15b8327 100644
--- a/src/amdgpu_kms.c
+++ b/src/amdgpu_kms.c
@@ -283,6 +283,7 @@ static void AMDGPUFreeRec(ScrnInfoPtr pScrn)
amdgpu_unwrap_property_requests(pScrn);
amdgpu_device_deinitialize(pAMDGPUEnt->pDev);
amdgpu_kernel_close_fd(pAMDGPUEnt);
+ free(pAMDGPUEnt->busid);
free(pPriv->ptr);
pPriv->ptr = NULL;
}
diff --git a/src/amdgpu_probe.c b/src/amdgpu_probe.c
index 8250156..ebd2aa7 100644
--- a/src/amdgpu_probe.c
+++ b/src/amdgpu_probe.c
@@ -77,19 +77,11 @@ static void AMDGPUIdentify(int flags)
xf86PrintChipsets(AMDGPU_NAME, "Driver for AMD Radeon", AMDGPUAny);
}
-static char *amdgpu_bus_id(ScrnInfoPtr pScrn, struct pci_device *dev)
-{
- char *busid;
-
- XNFasprintf(&busid, "pci:%04x:%02x:%02x.%u",
- dev->domain, dev->bus, dev->dev, dev->func);
-
- return busid;
-}
-
-static Bool amdgpu_kernel_mode_enabled(ScrnInfoPtr pScrn, char *busIdString)
+static Bool amdgpu_kernel_mode_enabled(ScrnInfoPtr pScrn)
{
#if defined(__FreeBSD__) || defined(__FreeBSD_kernel__)
+ AMDGPUEntPtr pAMDGPUEnt = AMDGPUEntPriv(pScrn);
+ const char *busIdString = pAMDGPUEnt->busid;
int ret = drmCheckModesettingSupported(busIdString);
if (ret) {
@@ -110,13 +102,21 @@ static Bool amdgpu_kernel_mode_enabled(ScrnInfoPtr pScrn, char *busIdString)
static int amdgpu_kernel_open_fd(ScrnInfoPtr pScrn,
struct pci_device *pci_dev,
- struct xf86_platform_device *platform_dev)
+ struct xf86_platform_device *platform_dev,
+ AMDGPUEntPtr pAMDGPUEnt)
{
struct pci_device *dev;
const char *path;
- char *busid;
int fd;
+ if (platform_dev)
+ dev = platform_dev->pdev;
+ else
+ dev = pci_dev;
+
+ XNFasprintf(&pAMDGPUEnt->busid, "pci:%04x:%02x:%02x.%u",
+ dev->domain, dev->bus, dev->dev, dev->func);
+
if (platform_dev) {
#ifdef ODEV_ATTRIB_FD
fd = xf86_get_platform_device_int_attrib(platform_dev,
@@ -135,24 +135,14 @@ static int amdgpu_kernel_open_fd(ScrnInfoPtr pScrn,
#endif
}
- if (platform_dev)
- dev = platform_dev->pdev;
- else
- dev = pci_dev;
-
- busid = amdgpu_bus_id(pScrn, dev);
-
- if (!amdgpu_kernel_mode_enabled(pScrn, busid)) {
- free(busid);
+ if (!amdgpu_kernel_mode_enabled(pScrn))
return -1;
- }
- fd = drmOpen(NULL, busid);
+ fd = drmOpen(NULL, pAMDGPUEnt->busid);
if (fd == -1)
xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
"[drm] Failed to open DRM device for %s: %s\n",
- busid, strerror(errno));
- free(busid);
+ pAMDGPUEnt->busid, strerror(errno));
return fd;
}
@@ -172,7 +162,7 @@ static Bool amdgpu_open_drm_master(ScrnInfoPtr pScrn, AMDGPUEntPtr pAMDGPUEnt,
drmSetVersion sv;
int err;
- pAMDGPUEnt->fd = amdgpu_kernel_open_fd(pScrn, pci_dev, NULL);
+ pAMDGPUEnt->fd = amdgpu_kernel_open_fd(pScrn, pci_dev, NULL, pAMDGPUEnt);
if (pAMDGPUEnt->fd == -1)
return FALSE;
@@ -364,7 +354,7 @@ amdgpu_platform_probe(DriverPtr pDriver,
pPriv->ptr = xnfcalloc(sizeof(AMDGPUEntRec), 1);
pAMDGPUEnt = pPriv->ptr;
pAMDGPUEnt->platform_dev = dev;
- pAMDGPUEnt->fd = amdgpu_kernel_open_fd(pScrn, NULL, dev);
+ pAMDGPUEnt->fd = amdgpu_kernel_open_fd(pScrn, NULL, dev, pAMDGPUEnt);
if (pAMDGPUEnt->fd < 0)
goto error;
diff --git a/src/amdgpu_probe.h b/src/amdgpu_probe.h
index 306c9a5..fea4d39 100644
--- a/src/amdgpu_probe.h
+++ b/src/amdgpu_probe.h
@@ -69,6 +69,7 @@ typedef struct {
ScrnInfoPtr scrn[6];
struct xf86_platform_device *platform_dev;
char *render_node;
+ char *busid;
} AMDGPUEntRec, *AMDGPUEntPtr;
extern void amdgpu_kernel_close_fd(AMDGPUEntPtr pAMDGPUEnt);