summaryrefslogtreecommitdiff
path: root/freedreno/freedreno_device.c
diff options
context:
space:
mode:
authorRob Clark <robclark@freedesktop.org>2013-07-10 15:20:04 -0400
committerRob Clark <robclark@freedesktop.org>2013-08-28 15:50:15 -0400
commitb2b1885dfcb3a206623e926704057b448d06781d (patch)
tree6ca7628bb7504364a8f0eeffebbed9b6ce05f4a9 /freedreno/freedreno_device.c
parent3c967e715528ee52195c178c4d09d03b643f0c06 (diff)
freedreno: support either kgsl or msm
Split out common code and backend. Current backend is for 'kgsl' android driver, but a new backend will provide support for the upstream msm drm/kms driver. Signed-off-by: Rob Clark <robclark@freedesktop.org>
Diffstat (limited to 'freedreno/freedreno_device.c')
-rw-r--r--freedreno/freedreno_device.c45
1 files changed, 27 insertions, 18 deletions
diff --git a/freedreno/freedreno_device.c b/freedreno/freedreno_device.c
index 901d0667..03553b9f 100644
--- a/freedreno/freedreno_device.c
+++ b/freedreno/freedreno_device.c
@@ -36,35 +36,43 @@
static pthread_mutex_t table_lock = PTHREAD_MUTEX_INITIALIZER;
static void * dev_table;
+struct fd_device * kgsl_device_new(int fd);
+
static struct fd_device * fd_device_new_impl(int fd)
{
- struct fd_device *dev = calloc(1, sizeof(*dev));
+ struct fd_device *dev;
+ drmVersionPtr version;
+
+ /* figure out if we are kgsl or msm drm driver: */
+ version = drmGetVersion(fd);
+ if (!version) {
+ ERROR_MSG("cannot get version: %s", strerror(errno));
+ return NULL;
+ }
+
+ if (!strcmp(version->name, "kgsl")) {
+ DEBUG_MSG("kgsl DRM device");
+ dev = kgsl_device_new(fd);
+ } else {
+ ERROR_MSG("unknown device: %s", version->name);
+ dev = NULL;
+ }
+
if (!dev)
return NULL;
+
atomic_set(&dev->refcnt, 1);
dev->fd = fd;
dev->handle_table = drmHashCreate();
dev->name_table = drmHashCreate();
- return dev;
-}
-/* use inode for key into dev_table, rather than fd, to avoid getting
- * confused by multiple-opens:
- */
-static int devkey(int fd)
-{
- struct stat s;
- if (fstat(fd, &s)) {
- ERROR_MSG("stat failed: %s", strerror(errno));
- return -1;
- }
- return s.st_ino;
+ return dev;
}
struct fd_device * fd_device_new(int fd)
{
struct fd_device *dev = NULL;
- int key = devkey(fd);
+ int key = fd;
pthread_mutex_lock(&table_lock);
@@ -73,7 +81,8 @@ struct fd_device * fd_device_new(int fd)
if (drmHashLookup(dev_table, key, (void **)&dev)) {
dev = fd_device_new_impl(fd);
- drmHashInsert(dev_table, key, dev);
+ if (dev)
+ drmHashInsert(dev_table, key, dev);
} else {
dev = fd_device_ref(dev);
}
@@ -96,7 +105,7 @@ void fd_device_del(struct fd_device *dev)
pthread_mutex_lock(&table_lock);
drmHashDestroy(dev->handle_table);
drmHashDestroy(dev->name_table);
- drmHashDelete(dev_table, devkey(dev->fd));
+ drmHashDelete(dev_table, dev->fd);
pthread_mutex_unlock(&table_lock);
- free(dev);
+ dev->funcs->destroy(dev);
}