halapi: common: Add hal_common_get/put_backend_v2 to support ABI compatibility 70/313670/2
authorChanwoo Choi <cw00.choi@samsung.com>
Thu, 27 Jun 2024 12:56:46 +0000 (21:56 +0900)
committerChanwoo Choi <cw00.choi@samsung.com>
Mon, 1 Jul 2024 09:25:57 +0000 (18:25 +0900)
Add hal_common_get_backend_v2 and put_backend_v2 to support ABI
compatibility between HAL interface and HAL backend.

In order to suport HAL ABI compatibility, need to allocate the memory of
hal interface structure instead of hal bakcend.
So that hal_common_get/put_backend_v2 functions requires the init/exit_backend
function pointer of which initialize and deinitialze the
hal_backend_[module]_funcs instance like allocation/free memory.

[Newly added function to get/put backend]
int hal_common_get_backend_v2(enum hal_module module,
void **data, void *user_data,
int (*init_backend)(void **data, void *user_data));
int hal_common_put_backend_v2(enum hal_module module,
void *data, void *user_data,
int (*exit_backend)(void *data, void *user_data));

int hal_common_get_backend_with_library_name_v2(enum hal_module module,
void **data, void *user_data,
int (*init_backend)(void **data, void *user_data),
const char *library_name);

int hal_common_put_backend_with_library_name_v2(enum hal_module module,
void **data, void *user_data,
int (*exit_backend)(void *data, void *user_data),
const char *library_name);

Change-Id: I71de896383162032bc5b03348888dd97dedb5f52
Suggested-by: Jeongmo Yang <jm80.yang@samsung.com>
Signed-off-by: Chanwoo Choi <cw00.choi@samsung.com>
include/hal-common.h
src/hal-api-common.c

index fed844466143f3b4da8a0424cb6e87372a6d4cc0..b861b8ac57ffb4abdc84dd2c3faf537a8a2f7d9f 100644 (file)
@@ -156,6 +156,72 @@ int hal_common_get_backend_with_library_name(enum hal_module module,
 int hal_common_put_backend_with_library_name(enum hal_module module,
                                        void *data, const char *library_name);
 
+/**
+ * @brief Get the backend data according to the HAL module type
+ *        and initialize 'hal_backend_[module]_funcs' instance
+ *        via the passed init_backend function pointer.
+ * @param[in] HAL module id among enum hal_module
+ * @param[out] Data pointer where 'hal_backend_[module]_funcs' instance
+ *             should be initialized by HAL backend binary.
+ * @param[in] User data passed to init_backend function pointer.
+ * @param[in] init_backend function pointer to initialize
+ *            'hal_backend_[module]_funcs' instance.
+ * @return @c 0 on success, otherwise a negative error value
+ */
+int hal_common_get_backend_v2(enum hal_module module,
+                               void **data, void *user_data,
+                               int (*init_backend)(void **data, void *user_data));
+
+/**
+ * @brief Put the backend data according to HAL module type
+ *        and deinitialize 'hal_backend_[module]_funcs' instance.
+ *        via the passed init_backend function pointer.
+ * @param[in] HAL module id among enum hal_module
+ * @param[in] Data pointer where 'hal_backend_[module]_funcs' instance
+ * @param[in] User data passed to init_backend function pointer.
+ * @param[in] exit_backend function pointer to deinitialize
+ *            'hal_backend_[module]_funcs' instance.
+ * @return @c 0 on success, otherwise a negative error value
+ */
+int hal_common_put_backend_v2(enum hal_module module,
+                               void *data, void *user_data,
+                               int (*exit_backend)(void *data, void *user_data));
+
+/**
+ * @brief Get the backend data with the specific library name according to HAL module type
+ *        and initialize 'hal_backend_[module]_funcs' instance
+ *        via the passed init_backend function pointer.
+ * @param[in] HAL module id among enum hal_module
+ * @param[out] Data pointer where 'hal_backend_[module]_funcs' instance
+ *             should be stored from HAL backend binary.
+ * @param[in] User data passed to init_backend function pointer.
+ * @param[in] init_backend function pointer to initialize
+ *            'hal_backend_[module]_funcs' instance.
+ * @param[in] HAL backend library name which is not default library name
+ * @return @c 0 on success, otherwise a negative error value
+ */
+int hal_common_get_backend_with_library_name_v2(enum hal_module module,
+                               void **data, void *user_data,
+                               int (*init_backend)(void **data, void *user_data),
+                               const char *library_name);
+
+/**
+ * @brief Put the backend data with the specific library name according to HAL module type
+ *        and deinitialize 'hal_backend_[module]_funcs' instance.
+ *        via the passed init_backend function pointer.
+ * @param[in] HAL module id among enum hal_module
+ * @param[in] Data pointer where 'hal_backend_[module]_funcs' instance
+ * @param[in] User data passed to init_backend function pointer.
+ * @param[in] exit_backend function pointer to deinitialize
+ *            'hal_backend_[module]_funcs' instance.
+ * @param[in] HAL backend library name which is not default library name
+ * @return @c 0 on success, otherwise a negative error value
+ */
+int hal_common_put_backend_with_library_name_v2(enum hal_module module,
+                               void **data, void *user_data,
+                               int (*exit_backend)(void *data, void *user_data),
+                               const char *library_name);
+
 /**
  * @brief Get the backend HAL major/minor version according to the type of HAL module
  * @param[in] HAL module id among enum hal_moudle
index 38697397af1a088687495f549fb756ede1f5cef5..e4cb73198f5ecc3e63087ce4b3ef6c6244203bfe 100644 (file)
@@ -234,8 +234,9 @@ static void __close_backend(struct __hal_module_info *info)
        info->handle = NULL;
 }
 
-static int __init_backend(struct __hal_module_info *info, void **data,
-                               const char *library_name)
+static int __init_backend(struct __hal_module_info *info,
+                       void **data, void *user_data,
+                       int (*init_backend)(void **data, void *user_data))
 {
        int ret;
        enum hal_common_backend_compatibility compatibility =
@@ -246,6 +247,14 @@ static int __init_backend(struct __hal_module_info *info, void **data,
                return 0;
        }
 
+       if (init_backend) {
+               ret = init_backend(data, user_data);
+               if (ret < 0) {
+                       _E("%s: Failed to init_backend of hal-api\n", info->module_name);
+                       return ret;
+               }
+       }
+
        if (!info->backend->init) {
                _E("%s: hal_backend->init() is NULL\n", info->module_name);
                return -EINVAL;
@@ -276,8 +285,9 @@ static int __init_backend(struct __hal_module_info *info, void **data,
        return 0;
 }
 
-static int __exit_backend(struct __hal_module_info *info, void *data,
-                               const char *library_name)
+static int __exit_backend(struct __hal_module_info *info,
+                       void *data, void *user_data,
+                       int (*exit_backend)(void *interface, void *user_data))
 {
        int ret;
 
@@ -297,11 +307,23 @@ static int __exit_backend(struct __hal_module_info *info, void *data,
                }
        }
 
+       if (exit_backend) {
+               ret = exit_backend(data, user_data);
+               if (ret < 0) {
+                       _E("%s: Failed to execute exit_backend of hal-api: name(%s)/vendor(%s)\n",
+                               info->module_name, info->backend->name,
+                               info->backend->vendor);
+                       return ret;
+               }
+       }
+
        return 0;
 }
 
-static int __get_backend(enum hal_module module, void **data,
-                               const char *library_name)
+static int __get_backend(enum hal_module module,
+                       void **data, void *user_data,
+                       int (*init_backend)(void **data, void *user_data),
+                       const char *library_name)
 {
        struct __hal_module_info *info = NULL;
        int ret;
@@ -332,7 +354,7 @@ static int __get_backend(enum hal_module module, void **data,
        if (ret < 0)
                goto err;
 
-       ret = __init_backend(info, data, NULL);
+       ret = __init_backend(info, data, user_data, init_backend);
        if (ret < 0) {
                _E("%s: Failed to initialize the backend library\n",
                                info->module_name);
@@ -358,8 +380,10 @@ err:
        return ret;
 }
 
-static int __put_backend(enum hal_module module, void *data,
-                               const char *library_name)
+static int __put_backend(enum hal_module module,
+                       void *data, void *user_data,
+                       int (*exit_backend)(void *data, void *user_data),
+                       const char *library_name)
 {
        struct __hal_module_info *info = NULL;
        int ret;
@@ -391,7 +415,7 @@ static int __put_backend(enum hal_module module, void *data,
                goto out;
        }
 
-       ret = __exit_backend(info, data, NULL);
+       ret = __exit_backend(info, data, user_data, exit_backend);
        if (ret < 0) {
                _E("%s: Failed to exit the backend library\n",
                                info->module_name);
@@ -494,27 +518,83 @@ err_unlock:
 EXPORT
 int hal_common_get_backend(enum hal_module module, void **data)
 {
-       return __get_backend(module, data, NULL);
+       return __get_backend(module, data, NULL, NULL, NULL);
 }
 
 EXPORT
 int hal_common_put_backend(enum hal_module module, void *data)
 {
-       return __put_backend(module, data, NULL);
+       return __put_backend(module, data, NULL, NULL, NULL);
 }
 
 EXPORT
 int hal_common_get_backend_with_library_name(enum hal_module module,
                                        void **data, const char *library_name)
 {
-       return __get_backend(module, data, library_name);
+       return __get_backend(module, data, NULL, NULL, library_name);
 }
 
 EXPORT
 int hal_common_put_backend_with_library_name(enum hal_module module,
                                        void *data, const char *library_name)
 {
-       return __put_backend(module, data, library_name);
+       return __put_backend(module, data, NULL, NULL, library_name);
+}
+
+EXPORT
+int hal_common_get_backend_v2(enum hal_module module,
+                               void **data, void *user_data,
+                               int (*init_backend)(void **data, void *user_data))
+{
+
+       if (!init_backend) {
+               _E("Invalid parameter of hal_module(%d)\n", module);
+               return -EINVAL;
+       }
+
+       return __get_backend(module, data, user_data, init_backend, NULL);
+}
+
+
+EXPORT
+int hal_common_put_backend_v2(enum hal_module module,
+                               void *data, void *user_data,
+                               int (*exit_backend)(void *data, void *user_data))
+{
+       if (!data || !exit_backend) {
+               _E("Invalid parameter of hal_module(%d)\n", module);
+               return -EINVAL;
+       }
+
+       return __put_backend(module, data, user_data, exit_backend, NULL);
+}
+
+EXPORT
+int hal_common_get_backend_with_library_name_v2(enum hal_module module,
+                               void **data, void *user_data,
+                               int (*init_backend)(void **data, void *user_data),
+                               const char *library_name)
+{
+       if (!init_backend) {
+               _E("Invalid parameter of hal_module(%d)\n", module);
+               return -EINVAL;
+       }
+
+       return __get_backend(module, data, user_data, init_backend, library_name);
+}
+
+EXPORT
+int hal_common_put_backend_with_library_name_v2(enum hal_module module,
+                               void **data, void *user_data,
+                               int (*exit_backend)(void *data, void *user_data),
+                               const char *library_name)
+{
+       if (!data || !exit_backend) {
+               _E("Invalid parameter of hal_module(%d)\n", module);
+               return -EINVAL;
+       }
+
+       return __put_backend(module, data, user_data, exit_backend, library_name);
 }
 
 EXPORT