summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/intel_device.c32
-rw-r--r--src/intel_driver.h1
-rw-r--r--src/sna/sna.h1
-rw-r--r--src/sna/sna_dri.c4
4 files changed, 29 insertions, 9 deletions
diff --git a/src/intel_device.c b/src/intel_device.c
index 5c49db03..5c369351 100644
--- a/src/intel_device.c
+++ b/src/intel_device.c
@@ -42,6 +42,7 @@
#include "intel_driver.h"
struct intel_device {
+ char *path;
int fd;
int open_count;
int master_count;
@@ -80,11 +81,11 @@ static int fd_set_cloexec(int fd)
return fd;
}
-static int __intel_open_device(const struct pci_device *pci, const char *path)
+static int __intel_open_device(const struct pci_device *pci, char **path)
{
int fd;
- if (path == NULL) {
+ if (*path == NULL) {
char id[20];
int ret;
@@ -103,14 +104,21 @@ static int __intel_open_device(const struct pci_device *pci, const char *path)
}
fd = drmOpen(NULL, id);
+ if (fd != -1) {
+ *path = drmGetDeviceNameFromFd(fd);
+ if (*path == NULL) {
+ close(fd);
+ fd = -1;
+ }
+ }
} else {
#ifdef O_CLOEXEC
- fd = open(path, O_RDWR | O_CLOEXEC);
+ fd = open(*path, O_RDWR | O_CLOEXEC);
#else
fd = -1;
#endif
if (fd == -1)
- fd = fd_set_cloexec(open(path, O_RDWR));
+ fd = fd_set_cloexec(open(*path, O_RDWR));
}
return fd;
@@ -121,6 +129,7 @@ int intel_open_device(int entity_num,
const char *path)
{
struct intel_device *dev;
+ char *local_path;
int fd;
if (intel_device_key == -1)
@@ -132,16 +141,20 @@ int intel_open_device(int entity_num,
if (dev)
return dev->fd;
- fd = __intel_open_device(pci, path);
+ local_path = path ? strdup(path) : NULL;
+
+ fd = __intel_open_device(pci, &local_path);
if (fd == -1)
return -1;
dev = malloc(sizeof(*dev));
if (dev == NULL) {
+ free(local_path);
close(fd);
return -1;
}
+ dev->path = local_path;
dev->fd = fd;
dev->open_count = 0;
dev->master_count = 0;
@@ -190,6 +203,13 @@ int intel_get_device(ScrnInfoPtr scrn)
return dev->fd;
}
+const char *intel_get_device_name(ScrnInfoPtr scrn)
+{
+ struct intel_device *dev = intel_device(scrn);
+ assert(dev && dev->path);
+ return dev->path;
+}
+
int intel_get_master(ScrnInfoPtr scrn)
{
struct intel_device *dev = intel_device(scrn);
@@ -236,6 +256,7 @@ void __intel_uxa_release_device(ScrnInfoPtr scrn)
intel_set_device(scrn, NULL);
drmClose(dev->fd);
+ free(dev->path);
free(dev);
}
}
@@ -253,5 +274,6 @@ void intel_put_device(ScrnInfoPtr scrn)
intel_set_device(scrn, NULL);
drmClose(dev->fd);
+ free(dev->path);
free(dev);
}
diff --git a/src/intel_driver.h b/src/intel_driver.h
index ed58444f..22b623ff 100644
--- a/src/intel_driver.h
+++ b/src/intel_driver.h
@@ -313,6 +313,7 @@ void intel_detect_chipset(ScrnInfoPtr scrn,
int intel_open_device(int entity_num, const struct pci_device *pci, const char *path);
int intel_get_device(ScrnInfoPtr scrn);
+const char *intel_get_device_name(ScrnInfoPtr scrn);
int intel_get_master(ScrnInfoPtr scrn);
int intel_put_master(ScrnInfoPtr scrn);
void intel_put_device(ScrnInfoPtr scrn);
diff --git a/src/sna/sna.h b/src/sna/sna.h
index f720c64f..7fe73597 100644
--- a/src/sna/sna.h
+++ b/src/sna/sna.h
@@ -293,7 +293,6 @@ struct sna {
bool dri_available;
bool dri_open;
- char *deviceName;
/* Broken-out options. */
OptionInfoPtr Options;
diff --git a/src/sna/sna_dri.c b/src/sna/sna_dri.c
index e610d521..ca5f0889 100644
--- a/src/sna/sna_dri.c
+++ b/src/sna/sna_dri.c
@@ -2445,11 +2445,10 @@ bool sna_dri_open(struct sna *sna, ScreenPtr screen)
return false;
}
- sna->deviceName = drmGetDeviceNameFromFd(sna->kgem.fd);
memset(&info, '\0', sizeof(info));
info.fd = sna->kgem.fd;
info.driverName = dri_driver_name(sna);
- info.deviceName = sna->deviceName;
+ info.deviceName = intel_get_device_name(sna->scrn);
DBG(("%s: loading dri driver '%s' [gen=%d] for device '%s'\n",
__FUNCTION__, info.driverName, sna->kgem.gen, info.deviceName));
@@ -2487,5 +2486,4 @@ void sna_dri_close(struct sna *sna, ScreenPtr screen)
{
DBG(("%s()\n", __FUNCTION__));
DRI2CloseScreen(screen);
- drmFree(sna->deviceName);
}