diff options
-rw-r--r-- | bmm_lib.c | 40 | ||||
-rw-r--r-- | bmm_lib_priv.h | 1 |
2 files changed, 41 insertions, 0 deletions
@@ -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" |