summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--bmm_lib.c40
-rw-r--r--bmm_lib_priv.h1
2 files changed, 41 insertions, 0 deletions
diff --git a/bmm_lib.c b/bmm_lib.c
index e6ba3e9..f9d8e69 100644
--- a/bmm_lib.c
+++ b/bmm_lib.c
@@ -30,8 +30,37 @@
#define pr_debug(fmt, arg...) do { } while(0)
#endif
+#define API_FEAT_MIN 0x0000
+#define API_COMP_MAX 0x0000
+#define API_FEAT(x) ((x) >> 16)
+#define API_COMP(x) ((x) & 0xffff)
+
+static unsigned bmm_api;
static int bmm_fd = -1;
+static int bmm_get_api_version(void)
+{
+ ioctl_arg_t io;
+
+ /* Get the BMM API version */
+ io.input = 0;
+ io.arg = 0;
+ io.output = 0;
+ if (ioctl(bmm_fd, BMM_API_VERSION, &io) == 0 &&
+ io.input == 0xdeaddead && io.arg == 0xfacebeef)
+ bmm_api = io.output;
+ else
+ bmm_api = 0;
+
+ pr_debug("BMM API version %08x\n", bmm_api);
+
+ if (API_FEAT(bmm_api) < API_FEAT_MIN ||
+ API_COMP(bmm_api) > API_COMP_MAX)
+ return -1;
+
+ return 0;
+}
+
int bmm_init()
{
/* attempt to open the BMM driver */
@@ -39,9 +68,20 @@ int bmm_init()
bmm_fd = open(BMM_DEVICE_FILE, O_RDWR | O_CLOEXEC);
pr_debug("BMM device fd: %d\n", bmm_fd);
+ if (bmm_fd < 0)
+ goto err_open;
+
+ if (bmm_get_api_version() < 0)
+ goto err_api;
}
return bmm_fd;
+
+ err_api:
+ close(bmm_fd);
+ bmm_fd = -1;
+ err_open:
+ return bmm_fd;
}
void bmm_exit()
diff --git a/bmm_lib_priv.h b/bmm_lib_priv.h
index 3ae48f2..41cb680 100644
--- a/bmm_lib_priv.h
+++ b/bmm_lib_priv.h
@@ -41,6 +41,7 @@ typedef struct {
#define BMM_GET_KERN_PHYS_ADDR _IOWR(BMEM_IOCTL_MAGIC, 15, ioctl_arg_t)
#define BMM_SYNC_USER _IOWR(BMEM_IOCTL_MAGIC, 16, ioctl_arg_t)
#define BMM_MALLOC_ALIGNED _IOWR(BMEM_IOCTL_MAGIC, 17, ioctl_arg_t)
+#define BMM_API_VERSION _IOWR(BMEM_IOCTL_MAGIC, 18, ioctl_arg_t)
#define BMM_DEVICE_FILE "/dev/bmm"