From f24c007eac981e3c1581deddb49f8e53c6498f6c Mon Sep 17 00:00:00 2001 From: SooChan Lim Date: Mon, 8 Feb 2021 17:26:05 +0900 Subject: [PATCH] add drm information from backend and to libtdm 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 | 10 ++++++ include/hal-tdm-types.h | 5 +++ include/hal-tdm.h | 3 ++ src/hal-api-tdm.c | 64 ++++++++++++++++++++++++++++++++++++- 4 files changed, 81 insertions(+), 1 deletion(-) diff --git a/include/hal-tdm-interface.h b/include/hal-tdm-interface.h index 0b1730e..5f08a6d 100644 --- a/include/hal-tdm-interface.h +++ b/include/hal-tdm-interface.h @@ -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]; diff --git a/include/hal-tdm-types.h b/include/hal-tdm-types.h index 3758eaf..48ca3e2 100644 --- a/include/hal-tdm-types.h +++ b/include/hal-tdm-types.h @@ -454,6 +454,11 @@ typedef enum { HAL_TDM_HWC_COMMIT_INTERVAL_VBLANK = 1, } hal_tdm_hwc_commit_interval; +/** + * @brief The tdm fd + */ +typedef int hal_tdm_fd; + /** * @brief The tdm display object */ diff --git a/include/hal-tdm.h b/include/hal-tdm.h index 73518a4..a053cfe 100644 --- a/include/hal-tdm.h +++ b/include/hal-tdm.h @@ -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 */ diff --git a/src/hal-api-tdm.c b/src/hal-api-tdm.c index 0da0b92..e99b308 100644 --- a/src/hal-api-tdm.c +++ b/src/hal-api-tdm.c @@ -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; -- 2.34.1