add drm information from backend and to libtdm 49/253749/1
authorSooChan Lim <sc1.lim@samsung.com>
Mon, 8 Feb 2021 08:26:05 +0000 (17:26 +0900)
committerSooChan Lim <sc1.lim@samsung.com>
Wed, 17 Feb 2021 03:35:13 +0000 (12:35 +0900)
When tdm backend has master_drm_fd, hal-api-tdm sends it to libtdm.
when tdm backend has no master_drm_fd, hal-api-tdm gets the master_drm_fd from libtdm.

Change-Id: Ifcb7080bb70de1556a8a73205df752230d0a6408

include/hal-tdm-interface.h
include/hal-tdm-types.h
include/hal-tdm.h
src/hal-api-tdm.c

index 0b1730e..5f08a6d 100644 (file)
@@ -55,9 +55,19 @@ typedef struct _hal_tdm_pp_funcs          hal_tdm_pp_funcs;
 typedef struct _hal_tdm_capture_funcs     hal_tdm_capture_funcs;
 typedef struct _hal_tdm_voutput_funcs     hal_tdm_voutput_funcs;
 
+typedef hal_tdm_error (*hal_tdm_master_drm_fd_handler)(hal_tdm_fd master_drm_fd, void *user_data);
+
 struct _hal_tdm_backend_data {
        hal_tdm_display         *display; // handle
 
+       int has_drm_device;
+       struct {
+               hal_tdm_fd drm_fd;
+               int is_master;
+               hal_tdm_master_drm_fd_handler master_drm_fd_func;
+               void *user_data;
+       } drm_info;
+
        int                      num_event_sources;
        hal_tdm_event_source    *event_sources[HAL_TDM_EVENT_SOURCE_MAX];
 
index 3758eaf..48ca3e2 100644 (file)
@@ -455,6 +455,11 @@ typedef enum {
 } hal_tdm_hwc_commit_interval;
 
 /**
+ * @brief The tdm fd
+ */
+typedef int hal_tdm_fd;
+
+/**
  * @brief The tdm display object
  */
 typedef void hal_tdm_display;
index 73518a4..a053cfe 100644 (file)
@@ -49,6 +49,9 @@ hal_tdm_error      hal_tdm_put_backend(hal_tdm_backend *backend);
 
 /* tdm_backend_data */
 hal_tdm_display        *hal_tdm_backend_get_display(hal_tdm_backend *backend, hal_tdm_error *error);
+int                     hal_tdm_backend_has_drm_device(hal_tdm_backend *backend, hal_tdm_error *error);
+hal_tdm_fd              hal_tdm_backend_get_master_drm_fd(hal_tdm_backend *backend, hal_tdm_error *error);
+hal_tdm_error           hal_tdm_backend_set_master_drm_fd(hal_tdm_backend *backend, hal_tdm_fd master_drm_fd);
 hal_tdm_event_source  **hal_tdm_backend_get_event_sources(hal_tdm_backend *backend, int *num_event_sources, hal_tdm_error *error);
 
 /* tdm_display_funcs */
index 0da0b92..e99b308 100644 (file)
@@ -260,13 +260,75 @@ hal_tdm_backend_get_display(hal_tdm_backend *backend, hal_tdm_error *error)
        return display;
 }
 
+EXTERN int
+hal_tdm_backend_has_drm_device(hal_tdm_backend *backend, hal_tdm_error *error)
+{
+       hal_tdm_backend_data *backend_data = (hal_tdm_backend_data *)backend;
+
+       if (!backend_data || g_hal_tdm_backend_data != backend) {
+               _E("no backend_data\n");
+               if (error)
+                       *error = HAL_TDM_ERROR_OPERATION_FAILED;
+               return 0;
+       }
+
+       return backend_data->has_drm_device;
+}
+
+EXTERN hal_tdm_fd
+hal_tdm_backend_get_master_drm_fd(hal_tdm_backend *backend, hal_tdm_error *error)
+{
+       hal_tdm_backend_data *backend_data = (hal_tdm_backend_data *)backend;
+
+       if (!backend_data || g_hal_tdm_backend_data != backend) {
+               _E("no backend_data\n");
+               if (error)
+                       *error = HAL_TDM_ERROR_OPERATION_FAILED;
+               return -1;
+       }
+
+       if (!backend_data->drm_info.is_master) {
+               _I("no master_drm_fd");
+               return -1;
+       }
+
+       _I("master_drm_fd is %d", backend_data->drm_info.drm_fd);
+
+       return backend_data->drm_info.drm_fd;
+}
+
+EXTERN hal_tdm_error
+hal_tdm_backend_set_master_drm_fd(hal_tdm_backend *backend, hal_tdm_fd master_drm_fd)
+{
+       hal_tdm_backend_data *backend_data = (hal_tdm_backend_data *)backend;
+       int ret;
+
+       if (!backend_data || g_hal_tdm_backend_data != backend) {
+               _E("no backend_data\n");
+               return HAL_TDM_ERROR_OPERATION_FAILED;
+       }
+
+       if (!backend_data->drm_info.master_drm_fd_func) {
+               _E("no backend_data->drm_info.auth_fd_func\n");
+               return HAL_TDM_ERROR_OPERATION_FAILED;
+       }
+
+       ret = backend_data->drm_info.master_drm_fd_func(master_drm_fd, backend_data->drm_info.user_data);
+       if (ret != HAL_TDM_ERROR_NONE) {
+               _E("backend_data->drm_info.master_drm_fd_func failed\n");
+               return ret;
+       }
+
+       return HAL_TDM_ERROR_NONE;
+}
+
 EXTERN hal_tdm_event_source **
 hal_tdm_backend_get_event_sources(hal_tdm_backend *backend, int *num_event_sources, hal_tdm_error *error)
 {
        hal_tdm_backend_data *backend_data = (hal_tdm_backend_data *)backend;
        hal_tdm_event_source **event_source;
 
-       if (!backend_data && g_hal_tdm_backend_data != backend_data) {
+       if (!backend_data || g_hal_tdm_backend_data != backend) {
                _E("no backend_data\n");
                if (error)
                        *error = HAL_TDM_ERROR_NO_MODULE;