summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorWladimir J. van der Laan <laanwj@gmail.com>2013-08-15 14:32:51 +0200
committerWladimir J. van der Laan <laanwj@gmail.com>2013-08-15 14:32:51 +0200
commit499e7f7bb43f72d76b698e6eeae92ddbcbcd2511 (patch)
treefeea3fbff60e8af3a6b7d940ec41fa93476ae481
parenteaf43ccbd3b1243c0fd3eb7e00df528131867040 (diff)
etnaviv: query and report kernel version
Only possible for v4+ kernel drivers. Older drivers are always reported as 2.0.0.0 for now.
-rw-r--r--native/etnaviv/viv.c26
-rw-r--r--native/etnaviv/viv.h6
2 files changed, 31 insertions, 1 deletions
diff --git a/native/etnaviv/viv.c b/native/etnaviv/viv.c
index 314cab8..5f25c1b 100644
--- a/native/etnaviv/viv.c
+++ b/native/etnaviv/viv.c
@@ -159,7 +159,31 @@ int viv_open(enum viv_hw_type hw_type, struct viv_conn **out)
}
if((err=conn->fd) < 0)
goto error;
-
+
+#ifdef VIV_HAS_STATE_DELTAS
+ /* Determine version */
+ id.command = gcvHAL_VERSION;
+ if((err=viv_invoke(conn, &id)) != gcvSTATUS_OK)
+ goto error;
+ conn->kernel_driver.major = id.u.Version.major;
+ conn->kernel_driver.minor = id.u.Version.minor;
+ conn->kernel_driver.patch = id.u.Version.patch;
+ conn->kernel_driver.build = id.u.Version.build;
+#else
+ /* <=v2 drivers don't have an always available mechanism for getting the driver version,
+ * although in some (like dove) a /proc file is available that gives the version.
+ */
+ conn->kernel_driver.major = 2;
+ conn->kernel_driver.minor = 0;
+ conn->kernel_driver.patch = 0;
+ conn->kernel_driver.build = 0;
+#endif
+ snprintf(conn->kernel_driver.name, sizeof(conn->kernel_driver.name),
+ "Vivante GPL kernel driver %i.%i.%i.%i",
+ conn->kernel_driver.major, conn->kernel_driver.minor,
+ conn->kernel_driver.patch, conn->kernel_driver.build);
+ printf("Kernel: %s\n", conn->kernel_driver.name);
+
/* Determine base address */
id.command = gcvHAL_GET_BASE_ADDRESS;
if((err=viv_invoke(conn, &id)) != gcvSTATUS_OK)
diff --git a/native/etnaviv/viv.h b/native/etnaviv/viv.h
index 4f444d2..017ff67 100644
--- a/native/etnaviv/viv.h
+++ b/native/etnaviv/viv.h
@@ -168,6 +168,11 @@ struct viv_specs {
uint32_t varyings_count;
};
+struct viv_kernel_driver_version {
+ char name[40];
+ int major, minor, patch, build;
+};
+
/* Structure encompassing a connection to kernel driver */
struct viv_conn {
int fd;
@@ -178,6 +183,7 @@ struct viv_conn {
viv_addr_t mem_base;
viv_handle_t process;
struct viv_specs chip;
+ struct viv_kernel_driver_version kernel_driver;
};
/* Predefines for some kernel structures */