1 /**************************************************************************
5 * Copyright 2021 Samsung Electronics co., Ltd. All Rights Reserved.
7 * Contact: SooChan Lim <sc1.lim@samsung.com>,
8 * Junkyeong Kim <jk0430.kim@samsung.com>,
9 * Changyeon Lee <cyeon.lee@samsung.com>
11 * Permission is hereby granted, free of charge, to any person obtaining a
12 * copy of this software and associated documentation files (the
13 * "Software"), to deal in the Software without restriction, including
14 * without limitation the rights to use, copy, modify, merge, publish,
15 * distribute, sub license, and/or sell copies of the Software, and to
16 * permit persons to whom the Software is furnished to do so, subject to
17 * the following conditions:
19 * The above copyright notice and this permission notice (including the
20 * next paragraph) shall be included in all copies or substantial portions
23 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
24 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
25 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
26 * IN NO EVENT SHALL PRECISION INSIGHT AND/OR ITS SUPPLIERS BE LIABLE FOR
27 * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
28 * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
29 * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
31 **************************************************************************/
37 #include <hal-common.h>
40 #include "hal-tbm-interface.h"
42 #if defined(__GNUC__) && __GNUC__ >= 4
43 #define EXTERN __attribute__ ((visibility("default")))
48 #if defined(__GNUC__) && __GNUC__ >= 4
49 #define INTERN __attribute__ ((visibility("hidden")))
54 #define ARRAY_SIZE(name) (sizeof(name)/sizeof(name[0]))
56 #define BUFMGR_ENTRY() \
57 hal_tbm_bufmgr_funcs *bufmgr_funcs; \
58 if (!g_tbm_backend_data) return HAL_TBM_ERROR_NOT_SUPPORTED;
60 #define BUFMGR_ENTRY_NULL() \
61 hal_tbm_bufmgr_funcs *bufmgr_funcs; \
62 if (!g_hal_tbm_backend_data) { if (error) *error = HAL_TBM_ERROR_NOT_SUPPORTED; return NULL; }
64 #define BUFMGR_ENTRY_VOID() \
65 hal_tbm_bufmgr_funcs *bufmgr_funcs; \
66 if (!g_hal_tbm_backend_data) return;
68 #define BUFMGR_ENTRY_GOTO(__goto__) \
69 hal_tbm_bufmgr_funcs *bufmgr_funcs; \
70 if (!g_hal_tbm_backend_data) goto __goto__;
72 #define BUFMGR_FUNC_ENTRY(__func__) \
73 hal_tbm_bufmgr_funcs *bufmgr_funcs; \
74 if (!bufmgr) return HAL_TBM_ERROR_INVALID_PARAMETER; \
75 if (!g_hal_tbm_backend_data || !g_hal_tbm_backend_data->bufmgr_funcs) return HAL_TBM_ERROR_NOT_SUPPORTED; \
76 bufmgr_funcs = g_hal_tbm_backend_data->bufmgr_funcs; \
77 if (!bufmgr_funcs->__func__) return HAL_TBM_ERROR_NOT_SUPPORTED;
79 #define BUFMGR_FUNC_ENTRY_NULL(__func__) \
80 hal_tbm_bufmgr_funcs *bufmgr_funcs; \
81 if (!bufmgr) { if (error) *error = HAL_TBM_ERROR_INVALID_PARAMETER; return NULL; } \
82 if (!g_hal_tbm_backend_data || !g_hal_tbm_backend_data->bufmgr_funcs) { if (error) *error = HAL_TBM_ERROR_NOT_SUPPORTED; return NULL; } \
83 bufmgr_funcs = g_hal_tbm_backend_data->bufmgr_funcs; \
84 if (!bufmgr_funcs->__func__) { if (error) *error = HAL_TBM_ERROR_NOT_SUPPORTED; return NULL; };
86 #define BUFMGR_FUNC_ENTRY_GOTO(__func__, __goto__) \
87 hal_tbm_bufmgr_funcs *bufmgr_funcs; \
88 if (!bufmgr) goto __goto__; \
89 if (!g_hal_tbm_backend_data || !g_hal_tbm_backend_data->bufmgr_funcs) goto __goto__; \
90 bufmgr_funcs = (hal_tbm_bufmgr_funcs *)g_hal_tbm_backend_data->bufmgr_funcs; \
91 if (!bufmgr_funcs->__func__) goto __goto__;
93 #define BO_FUNC_ENTRY(__func__) \
94 hal_tbm_bo_funcs *bo_funcs; \
95 if (!g_hal_tbm_backend_data || !g_hal_tbm_backend_data->bo_funcs) return HAL_TBM_ERROR_NOT_SUPPORTED; \
96 bo_funcs = g_hal_tbm_backend_data->bo_funcs; \
97 if (!bo_funcs->__func__) return HAL_TBM_ERROR_NOT_SUPPORTED;
99 #define BO_FUNC_ENTRY_VOID(__func__) \
100 hal_tbm_bo_funcs *bo_funcs; \
101 if (!g_hal_tbm_backend_data || !g_hal_tbm_backend_data->bo_funcs) return; \
102 bo_funcs = g_hal_tbm_backend_data->bo_funcs; \
103 if (!bo_funcs->__func__) return;
105 #define BO_FUNC_ENTRY_GOTO(__func__, __goto__) \
106 hal_tbm_bo_funcs *bo_funcs; \
107 if (!g_hal_tbm_backend_data || !g_hal_tbm_backend_data->bo_funcs) goto __goto__; \
108 bo_funcs = g_hal_tbm_backend_data->bo_funcs; \
109 if (!bo_funcs->__func__) goto __goto__;
111 static hal_tbm_backend_data *g_hal_tbm_backend_data = NULL;
113 EXTERN hal_tbm_backend *
114 hal_tbm_get_backend(hal_tbm_error *error)
116 hal_tbm_backend_data *backend_data;
119 if (g_hal_tbm_backend_data) {
121 *error = HAL_TBM_ERROR_INVALID_OPERATION;
125 ret = hal_common_get_backend(HAL_MODULE_TBM, (void **)&backend_data);
127 _E("Failed to get backend\n");
129 *error = HAL_TBM_ERROR_INVALID_OPERATION;
133 g_hal_tbm_backend_data = (hal_tbm_backend_data *)backend_data;
136 *error = HAL_TBM_ERROR_NONE;
138 _I("hal_tbm_get_backend");
140 return (hal_tbm_backend *)backend_data;
144 hal_tbm_put_backend(hal_tbm_backend *backend)
146 hal_tbm_backend_data *backend_data = (hal_tbm_backend_data *)backend;
149 if (!backend_data && g_hal_tbm_backend_data != backend) {
150 _E("no backend_data\n");
151 return HAL_TBM_ERROR_INVALID_OPERATION;
154 ret = hal_common_put_backend(HAL_MODULE_TBM, backend_data);
156 _E("Failed to put backend\n");
157 return HAL_TBM_ERROR_INVALID_OPERATION;
160 g_hal_tbm_backend_data = NULL;
162 _I("hal_tbm_put_backend");
164 return HAL_TBM_ERROR_NONE;
167 EXTERN hal_tbm_bufmgr *
168 hal_tbm_backend_get_bufmgr(hal_tbm_backend *backend, hal_tbm_error *error)
170 hal_tbm_backend_data *backend_data = (hal_tbm_backend_data *)backend;
171 hal_tbm_bufmgr *bufmgr;
173 if (!backend_data || g_hal_tbm_backend_data != backend_data) {
174 _E("no backend_data\n");
176 *error = HAL_TBM_ERROR_INVALID_OPERATION;
180 bufmgr = backend_data->bufmgr;
184 *error = HAL_TBM_ERROR_INVALID_OPERATION;
189 *error = HAL_TBM_ERROR_NONE;
195 hal_tbm_backend_has_drm_device(hal_tbm_backend *backend, hal_tbm_error *error)
197 hal_tbm_backend_data *backend_data = (hal_tbm_backend_data *)backend;
199 if (!backend_data || g_hal_tbm_backend_data != backend_data) {
200 _E("no backend_data\n");
202 *error = HAL_TBM_ERROR_INVALID_OPERATION;
206 return backend_data->has_drm_device;
210 hal_tbm_backend_get_master_drm_fd(hal_tbm_backend *backend, hal_tbm_error *error)
212 hal_tbm_backend_data *backend_data = (hal_tbm_backend_data *)backend;
214 if (!backend_data || g_hal_tbm_backend_data != backend_data) {
215 _E("no backend_data\n");
217 *error = HAL_TBM_ERROR_INVALID_OPERATION;
221 if (!backend_data->drm_info.is_master) {
222 _I("no master_drm_fd");
226 _I("master_drm_fd is %d", backend_data->drm_info.drm_fd);
228 return backend_data->drm_info.drm_fd;
232 hal_tbm_backend_set_authenticated_drm_fd(hal_tbm_backend *backend, hal_tbm_fd auth_drm_fd)
234 hal_tbm_backend_data *backend_data = (hal_tbm_backend_data *)backend;
237 if (!backend_data || g_hal_tbm_backend_data != backend_data) {
238 _E("no backend_data\n");
239 return HAL_TBM_ERROR_INVALID_OPERATION;
242 if (!backend_data->drm_info.auth_drm_fd_func) {
243 _E("no backend_data->drm_info.auth_drm_fd_func\n");
244 return HAL_TBM_ERROR_INVALID_OPERATION;
247 ret = backend_data->drm_info.auth_drm_fd_func(auth_drm_fd, backend_data->drm_info.user_data);
248 if (ret != HAL_TBM_ERROR_NONE) {
249 _E("backend_data->drm_info.auth_drm_fd_func failed\n");
253 return HAL_TBM_ERROR_NONE;
256 /* tbm_bufmgr_func */
257 EXTERN hal_tbm_bufmgr_capability
258 hal_tbm_bufmgr_get_capabilities(hal_tbm_bufmgr *bufmgr, hal_tbm_error *error)
260 BUFMGR_FUNC_ENTRY_GOTO(bufmgr_get_capabilities, fail);
262 return bufmgr_funcs->bufmgr_get_capabilities((hal_tbm_bufmgr *)bufmgr, error);
266 *error = HAL_TBM_ERROR_NOT_SUPPORTED;
268 return HAL_TBM_BUFMGR_CAPABILITY_NONE;
272 hal_tbm_bufmgr_get_supported_formats(hal_tbm_bufmgr *bufmgr, uint32_t **formats, uint32_t *num)
274 BUFMGR_FUNC_ENTRY(bufmgr_get_supported_formats);
276 return bufmgr_funcs->bufmgr_get_supported_formats((hal_tbm_bufmgr *)bufmgr, formats, num);
280 hal_tbm_bufmgr_get_plane_data(hal_tbm_bufmgr *bufmgr, hal_tbm_format format, int plane_idx, int width, int height,
281 uint32_t *size, uint32_t *offset, uint32_t *pitch, int *bo_idx)
283 BUFMGR_FUNC_ENTRY(bufmgr_get_plane_data);
285 return bufmgr_funcs->bufmgr_get_plane_data((hal_tbm_bufmgr *)bufmgr, format, plane_idx, width, height, size, offset, pitch, bo_idx);
289 hal_tbm_bufmgr_alloc_bo(hal_tbm_bufmgr *bufmgr, unsigned int size, hal_tbm_bo_memory_type mem_types, hal_tbm_error *error)
291 BUFMGR_FUNC_ENTRY_NULL(bufmgr_alloc_bo);
293 return bufmgr_funcs->bufmgr_alloc_bo((hal_tbm_bufmgr *)bufmgr, size, mem_types, error);
297 hal_tbm_bufmgr_alloc_bo_with_format(hal_tbm_bufmgr *bufmgr, int format, int bo_idx, int width, int height,
298 hal_tbm_bo_memory_type mem_types, hal_tbm_error *error)
300 BUFMGR_FUNC_ENTRY_NULL(bufmgr_alloc_bo_with_format);
302 return bufmgr_funcs->bufmgr_alloc_bo_with_format((hal_tbm_bufmgr *)bufmgr, format, bo_idx, width, height, mem_types, error);
306 hal_tbm_bufmgr_import_fd(hal_tbm_bufmgr *bufmgr, hal_tbm_fd fd, hal_tbm_error *error)
308 BUFMGR_FUNC_ENTRY_NULL(bufmgr_import_fd);
310 return bufmgr_funcs->bufmgr_import_fd((hal_tbm_bufmgr *)bufmgr, fd, error);
314 hal_tbm_bufmgr_import_key(hal_tbm_bufmgr *bufmgr, hal_tbm_key key, hal_tbm_error *error)
316 BUFMGR_FUNC_ENTRY_NULL(bufmgr_import_key);
318 return bufmgr_funcs->bufmgr_import_key((hal_tbm_bufmgr *)bufmgr, key, error);
324 hal_tbm_bo_free(hal_tbm_bo *bo)
326 BO_FUNC_ENTRY_VOID(bo_free);
328 bo_funcs->bo_free((hal_tbm_bo *)bo);
332 hal_tbm_bo_get_size(hal_tbm_bo *bo, hal_tbm_error *error)
334 BO_FUNC_ENTRY_GOTO(bo_get_size, fail);
336 return bo_funcs->bo_get_size((hal_tbm_bo *)bo, error);
340 *error = HAL_TBM_ERROR_NOT_SUPPORTED;
345 EXTERN hal_tbm_bo_memory_type
346 hal_tbm_bo_get_memory_types(hal_tbm_bo *bo, hal_tbm_error *error)
348 BO_FUNC_ENTRY_GOTO(bo_get_memory_types, fail);
350 return bo_funcs->bo_get_memory_types((hal_tbm_bo *)bo, error);
354 *error = HAL_TBM_ERROR_NOT_SUPPORTED;
356 return HAL_TBM_BO_DEFAULT;
359 EXTERN hal_tbm_bo_handle
360 hal_tbm_bo_get_handle(hal_tbm_bo *bo, hal_tbm_bo_device_type device, hal_tbm_error *error)
362 BO_FUNC_ENTRY_GOTO(bo_get_handle, fail);
364 return bo_funcs->bo_get_handle((hal_tbm_bo *)bo, device, error);
368 *error = HAL_TBM_ERROR_NOT_SUPPORTED;
370 return (hal_tbm_bo_handle)NULL;
373 EXTERN hal_tbm_bo_handle
374 hal_tbm_bo_map(hal_tbm_bo *bo, hal_tbm_bo_device_type device, hal_tbm_bo_access_option opt, hal_tbm_error *error)
376 BO_FUNC_ENTRY_GOTO(bo_map, fail);
378 return bo_funcs->bo_map((hal_tbm_bo *)bo, device, opt, error);
382 *error = HAL_TBM_ERROR_NOT_SUPPORTED;
384 return (hal_tbm_bo_handle)NULL;
388 hal_tbm_bo_unmap(hal_tbm_bo *bo)
390 BO_FUNC_ENTRY(bo_unmap);
392 return bo_funcs->bo_unmap((hal_tbm_bo *)bo);
396 hal_tbm_bo_lock(hal_tbm_bo *bo, hal_tbm_bo_device_type device, hal_tbm_bo_access_option opt)
398 BO_FUNC_ENTRY(bo_lock);
400 return bo_funcs->bo_lock((hal_tbm_bo *)bo, device, opt);
404 hal_tbm_bo_unlock(hal_tbm_bo *bo)
406 BO_FUNC_ENTRY(bo_unlock);
408 return bo_funcs->bo_unlock((hal_tbm_bo *)bo);
412 hal_tbm_bo_export_fd(hal_tbm_bo *bo, hal_tbm_error *error)
414 BO_FUNC_ENTRY_GOTO(bo_export_fd, fail);
416 return bo_funcs->bo_export_fd((hal_tbm_bo *)bo, error);
420 *error = HAL_TBM_ERROR_NOT_SUPPORTED;
426 hal_tbm_bo_export_key(hal_tbm_bo *bo, hal_tbm_error *error)
428 BO_FUNC_ENTRY_GOTO(bo_export_key, fail);
430 return bo_funcs->bo_export_key((hal_tbm_bo *)bo, error);
434 *error = HAL_TBM_ERROR_NOT_SUPPORTED;