2a27021f25eb3f9af448ff42f89a9061c2caf9b7
[platform/core/uifw/libtbm.git] / src / tbm_module.c
1 /**************************************************************************
2
3 libtbm
4
5 Copyright 2012-2021 Samsung Electronics co., Ltd. All Rights Reserved.
6
7 Contact: SooChan Lim <sc1.lim@samsung.com>
8          Changyeon Lee <cyeon.lee@samsung.com>
9
10 Permission is hereby granted, free of charge, to any person obtaining a
11 copy of this software and associated documentation files (the
12 "Software"), to deal in the Software without restriction, including
13 without limitation the rights to use, copy, modify, merge, publish,
14 distribute, sub license, and/or sell copies of the Software, and to
15 permit persons to whom the Software is furnished to do so, subject to
16 the following conditions:
17
18 The above copyright notice and this permission notice (including the
19 next paragraph) shall be included in all copies or substantial portions
20 of the Software.
21
22 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
23 OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
24 MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
25 IN NO EVENT SHALL PRECISION INSIGHT AND/OR ITS SUPPLIERS BE LIABLE FOR
26 ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
27 TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
28 SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
29
30 **************************************************************************/
31
32 #include "config.h"
33
34 #include "tbm_bufmgr_int.h"
35 #include "tbm_bufmgr_backend.h"
36 #include "tbm_drm_helper.h"
37
38 #define PREFIX_LIB    "libtbm_"
39 #define SUFFIX_LIB    ".so"
40 #define DEFAULT_LIB   PREFIX_LIB"default"SUFFIX_LIB
41
42 /* values to indicate unspecified fields in XF86ModReqInfo. */
43 #define MAJOR_UNSPEC      0xFF
44 #define MINOR_UNSPEC      0xFF
45 #define PATCH_UNSPEC      0xFFFF
46 #define ABI_VERS_UNSPEC   0xFFFFFFFF
47
48 #define MODULE_VERSION_NUMERIC(maj, min, patch) \
49                         ((((maj) & 0xFF) << 24) | (((min) & 0xFF) << 16) | (patch & 0xFFFF))
50 #define GET_MODULE_MAJOR_VERSION(vers)    (((vers) >> 24) & 0xFF)
51 #define GET_MODULE_MINOR_VERSION(vers)    (((vers) >> 16) & 0xFF)
52 #define GET_MODULE_PATCHLEVEL(vers)    ((vers) & 0xFFFF)
53
54 /* LCOV_EXCL_START */
55 static int
56 _tbm_backend_load_hal_tbm(tbm_module *module)
57 {
58         hal_tbm_backend *hal_backend = NULL;
59         hal_tbm_bufmgr *hal_bufmgr;
60         hal_tbm_error ret = HAL_TBM_ERROR_NONE;
61         hal_tbm_fd auth_drm_fd = -1;
62
63         hal_backend = hal_tbm_get_backend(&ret);
64         if (hal_backend == NULL || ret != HAL_TBM_ERROR_NONE) {
65                 TBM_ERR("get backend fail");
66                 return 0;
67         }
68
69         hal_bufmgr = hal_tbm_backend_get_bufmgr(hal_backend, &ret);
70         if (hal_bufmgr == NULL || ret != HAL_TBM_ERROR_NONE) {
71                 TBM_ERR("get hal_bufmgr fail");
72                 goto get_backend_fail;
73         }
74
75         if (hal_tbm_backend_has_drm_device(hal_backend, &ret)) {
76                 auth_drm_fd = hal_tbm_backend_get_master_drm_fd(hal_backend, &ret);
77                 if (auth_drm_fd < 0) {
78                         TBM_INFO("tbm_backend has no master drm_fd.");
79
80                         auth_drm_fd = tbm_drm_helper_get_master_fd();
81                         if (auth_drm_fd < 0) {
82                                 TBM_INFO("libtbm requests an authenticated drm_fd to a process(display server).");
83                                 if (!tbm_drm_helper_get_auth_info(&auth_drm_fd, NULL, NULL)) {
84                                         TBM_ERR("get auth drm_fd fail");
85                                         goto get_backend_fail;
86                                 }
87                         } else {
88                                 TBM_INFO("libtbm gets a master drm_fd from libtdm via tbm_drm_helper.");
89                         }
90
91                         TBM_INFO("libtbm sends a master drm_fd as an authentiated drm_fd to tbm_backend.");
92                         ret = hal_tbm_backend_set_authenticated_drm_fd(hal_backend, auth_drm_fd);
93                         if (ret != HAL_TBM_ERROR_NONE) {
94                                 TBM_ERR("hal_tbm_backend_set_authenticated_drm_fd failed.");
95                                 goto get_backend_fail;
96                         }
97                 } else {
98                         TBM_INFO("tbm_backend has a master drm_fd.");
99
100                         tbm_drm_helper_set_tbm_master_fd(auth_drm_fd);
101                 }
102                 tbm_drm_helper_set_fd(auth_drm_fd);
103         }
104
105         module->hal_backend = hal_backend;
106         module->hal_bufmgr = hal_bufmgr;
107
108         module->use_hal_tbm = 1;
109
110         TBM_INFO("use HAL-TBM_API");
111
112         return 1;
113
114 get_backend_fail:
115         if (auth_drm_fd >= 0)
116                 close(auth_drm_fd);
117         hal_tbm_put_backend(hal_backend);
118         return 0;
119 }
120
121 static int
122 _check_version(TBMModuleVersionInfo *data)
123 {
124         int backend_module_major, backend_module_minor;
125         int tbm_backend_major, tbm_backend_minor;
126
127         backend_module_major = GET_ABI_MAJOR(data->abiversion);
128         backend_module_minor = GET_ABI_MINOR(data->abiversion);
129
130         TBM_DBG("TBM module %s: vendor=\"%s\" ABI=%d,%d\n",
131             data->modname ? data->modname : "UNKNOWN!",
132             data->vendor ? data->vendor : "UNKNOWN!", backend_module_major, backend_module_minor);
133
134         tbm_backend_major = GET_ABI_MAJOR(TBM_ABI_VERSION);
135         tbm_backend_minor = GET_ABI_MINOR(TBM_ABI_VERSION);
136
137         TBM_DBG("TBM ABI version %d.%d\n",
138             tbm_backend_major, tbm_backend_minor);
139
140         if (backend_module_major != tbm_backend_major) {
141                 TBM_ERR("TBM module ABI major ver(%d) doesn't match the TBM's ver(%d)\n",
142                         backend_module_major, tbm_backend_major);
143                 return 0;
144         } else if (backend_module_minor > tbm_backend_minor) {
145                 TBM_ERR("TBM module ABI minor ver(%d) is newer than the TBM's ver(%d)\n",
146                         backend_module_minor, tbm_backend_minor);
147                 return 0;
148         }
149
150         return 1;
151 }
152
153 static int
154 _tbm_backend_check_bufmgr_func(tbm_backend_bufmgr_func *bufmgr_func)
155 {
156         TBM_RETURN_VAL_IF_FAIL(bufmgr_func, 0); /* mandatory symbol */
157         TBM_RETURN_VAL_IF_FAIL(bufmgr_func->bufmgr_get_capabilities, 0); /* mandatory symbol */
158         TBM_RETURN_VAL_IF_FAIL(bufmgr_func->bufmgr_bind_native_display, 0); /* mandatory symbol */
159         TBM_RETURN_VAL_IF_FAIL(bufmgr_func->bufmgr_get_supported_formats, 0); /* mandatory symbol */
160         TBM_RETURN_VAL_IF_FAIL(bufmgr_func->bufmgr_get_plane_data, 0); /* mandatory symbol */
161         TBM_RETURN_VAL_IF_FAIL(bufmgr_func->bufmgr_alloc_bo, 0); /* mandatory symbol */
162         if (!bufmgr_func->bufmgr_alloc_bo_with_format)
163                 TBM_DBG("No bufmgr_func->bufmgr_alloc_bo_with_format.");
164         TBM_RETURN_VAL_IF_FAIL(bufmgr_func->bufmgr_import_fd, 0); /* mandatory symbol */
165         if (!bufmgr_func->bufmgr_import_key)
166                 TBM_DBG("No bufmgr_func->bo_export_key.");
167
168         return 1;
169 }
170
171 static int
172 _tbm_backend_check_bufmgr_bo(tbm_backend_bo_func *bo_func)
173 {
174         TBM_RETURN_VAL_IF_FAIL(bo_func, 0); /* mandatory symbol */
175         TBM_RETURN_VAL_IF_FAIL(bo_func->bo_free, 0); /* mandatory symbol */
176         TBM_RETURN_VAL_IF_FAIL(bo_func->bo_get_size, 0); /* mandatory symbol */
177         TBM_RETURN_VAL_IF_FAIL(bo_func->bo_get_memory_types, 0); /* mandatory symbol */
178         TBM_RETURN_VAL_IF_FAIL(bo_func->bo_get_handle, 0); /* mandatory symbol */
179         TBM_RETURN_VAL_IF_FAIL(bo_func->bo_map, 0); /* mandatory symbol */
180         TBM_RETURN_VAL_IF_FAIL(bo_func->bo_unmap, 0); /* mandatory symbol */
181         if (!bo_func->bo_lock)
182                 TBM_DBG("No bo_func->bo_lock.");
183         if (!bo_func->bo_unlock)
184                 TBM_DBG("No bo_func->bo_unlock.");
185         TBM_RETURN_VAL_IF_FAIL(bo_func->bo_export_fd, 0); /* mandatory symbol */
186         if (!bo_func->bo_export_key)
187                 TBM_INFO("No bo_func->bo_export_key.");
188
189         return 1;
190 }
191
192 static int
193 _tbm_backend_load_module(tbm_module *module, const char *file)
194 {
195         char path[PATH_MAX] = {0, };
196         void *module_data = NULL;
197         tbm_backend_module *backend_module_data = NULL;
198         tbm_backend_bufmgr_data *bufmgr_data = NULL;
199         int backend_module_major, backend_module_minor;
200         int tbm_backend_major, tbm_backend_minor;
201         tbm_error_e error;
202
203         snprintf(path, sizeof(path), BUFMGR_MODULE_DIR "/%s", file);
204
205         module_data = dlopen(path, RTLD_LAZY);
206         if (!module_data) {
207                 TBM_ERR("failed to load module: %s(%s)\n", dlerror(), file);
208                 return 0;
209         }
210
211         backend_module_data = dlsym(module_data, "tbm_backend_module_data");
212         if (!backend_module_data) {
213                 TBM_ERR("Error: module does not have data object.\n");
214                 goto err;
215         }
216
217         tbm_backend_major = GET_ABI_MAJOR(TBM_BACKEND_ABI_LATEST_VERSION);
218         tbm_backend_minor = GET_ABI_MINOR(TBM_BACKEND_ABI_LATEST_VERSION);
219         TBM_INFO("TBM Backend ABI version %d.%d\n", tbm_backend_major, tbm_backend_minor);
220
221         backend_module_major = GET_ABI_MAJOR(backend_module_data->abi_version);
222         backend_module_minor = GET_ABI_MINOR(backend_module_data->abi_version);
223
224         TBM_INFO("TBM module %s: vendor=\"%s\" Backend ABI version=%d.%d\n",
225             backend_module_data->name ? backend_module_data->name : "UNKNOWN!",
226             backend_module_data->vendor ? backend_module_data->vendor : "UNKNOWN!",
227                 backend_module_major, backend_module_minor);
228
229         if (backend_module_major > tbm_backend_major) {
230                 TBM_ERR("TBM module ABI major ver(%d) is newer than the TBM's ver(%d)\n",
231                         backend_module_major, tbm_backend_major);
232                 goto err;
233         } else if (backend_module_minor > tbm_backend_minor) {
234                 TBM_ERR("TBM module ABI minor ver(%d) is newer than the TBM's ver(%d)\n",
235                         backend_module_minor, tbm_backend_minor);
236                 goto err;
237         }
238
239         if (!backend_module_data->init) {
240                 TBM_ERR("Error: module does not supply init symbol.\n");
241                 goto err;
242         }
243
244         if (!backend_module_data->deinit)       {
245                 TBM_ERR("Error: module does not supply deinit symbol.\n");
246                 goto err;
247         }
248
249         bufmgr_data = backend_module_data->init((tbm_bufmgr)module, &error);
250         if (!bufmgr_data) {
251                 TBM_ERR("Fail to init module(%s)\n", file);
252                 goto err;
253         }
254
255         /* check the mandatory symbols of the backend module */
256         if (!_tbm_backend_check_bufmgr_func(module->bufmgr_func)) {
257                 TBM_ERR("Fail to check the bufmgr_func symboles.");
258                 goto err;
259         }
260
261         if (!_tbm_backend_check_bufmgr_bo(module->bo_func)) {
262                 TBM_ERR("Fail to check the bufmgr_bo symboles.");
263                 goto err;
264         }
265
266         module->module_data = module_data;
267         module->backend_module_data = backend_module_data;
268         module->bufmgr_data = bufmgr_data;
269
270         TBM_INFO("Success to load module(%s)\n", file);
271
272         return 1;
273
274 err:
275         if (bufmgr_data)
276                 module->backend_module_data->deinit(bufmgr_data);
277         if (module_data)
278                 dlclose(module_data);
279
280         return 0;
281 }
282
283 static int
284 _tbm_backend_load_bufmgr_module(tbm_module *module, int fd, const char *file)
285 {
286         char path[PATH_MAX] = {0, };
287         TBMModuleVersionInfo *vers;
288         TBMModuleData *initdata;
289         ModuleInitProc init;
290         void *module_data;
291
292         snprintf(path, sizeof(path), BUFMGR_MODULE_DIR "/%s", file);
293
294         module_data = dlopen(path, RTLD_LAZY);
295         if (!module_data) {
296                 TBM_ERR("failed to load module: %s(%s)\n", dlerror(), file);
297                 return 0;
298         }
299
300         initdata = dlsym(module_data, "tbmModuleData");
301         if (!initdata) {
302                 TBM_ERR("Error: module does not have data object.\n");
303                 goto err;
304         }
305
306         vers = initdata->vers;
307         if (!vers) {
308                 TBM_ERR("Error: module does not supply version information.\n");
309                 goto err;
310         }
311
312         init = initdata->init;
313         if (!init) {
314                 TBM_ERR("Error: module does not supply init symbol.\n");
315                 goto err;
316         }
317
318         if (!_check_version(vers)) {
319                 TBM_ERR("Fail to check version.\n");
320                 goto err;
321         }
322
323         if (!init((tbm_bufmgr)module, fd)) {
324                 TBM_ERR("Fail to init module(%s)\n", file);
325                 goto err;
326         }
327
328         if (!module->backend || !module->backend->priv) {
329                 TBM_ERR("Error: module(%s) wrong operation. Check backend or backend's priv.\n", file);
330                 goto err;
331         }
332
333         module->module_data = module_data;
334
335         TBM_DBG("Success to load module(%s)\n", file);
336
337         return 1;
338
339 err:
340         dlclose(module_data);
341         return 0;
342 }
343 /* LCOV_EXCL_STOP */
344
345 tbm_module *
346 tbm_module_load(int fd)
347 {
348         tbm_module *module;
349         struct dirent **namelist;
350         int ret = 0, n;
351
352         module = calloc(1, sizeof(struct _tbm_module));
353         if (!module) {
354                 TBM_ERR("fail to allocate the memory");
355                 return NULL;
356         }
357
358         /* try to load the hal-tbm backend module */
359         ret = _tbm_backend_load_hal_tbm(module);
360         if (ret) {
361                 module->type = TBM_MODULE_TYPE_HAL_TBM;
362                 goto done;
363         }
364
365 /* LCOV_EXCL_START */
366         /* try to load the new backend module */
367         ret = _tbm_backend_load_module(module, DEFAULT_LIB);
368         if (ret) {
369                 module->type = TBM_MODULE_TYPE_TBM_BACKEND;
370                 goto done;
371         }
372
373         /* try to load the old(deprecated) backend mdoule */
374         ret = _tbm_backend_load_bufmgr_module(module, fd, DEFAULT_LIB);
375         if (ret) {
376                 module->type = TBM_MODULE_TYPE_BUFMGR_BACKEND;
377                 return module;
378         }
379
380         /* load backend_module from configured path */
381         n = scandir(BUFMGR_MODULE_DIR, &namelist, 0, alphasort);
382         if (n < 0) {
383                 TBM_ERR("no files : %s\n", BUFMGR_MODULE_DIR);
384                 tbm_module_unload(module);
385                 return NULL;
386         }
387
388         while (n--) {
389                 if (!ret && strstr(namelist[n]->d_name, PREFIX_LIB)) {
390                         const char *p = strstr(namelist[n]->d_name, SUFFIX_LIB);
391
392                         if (p && !strcmp(p, SUFFIX_LIB)) {
393                                 ret = _tbm_backend_load_module(module, namelist[n]->d_name);
394                                 if (ret)
395                                         module->type = TBM_MODULE_TYPE_TBM_BACKEND;
396                                 else {
397                                         ret = _tbm_backend_load_bufmgr_module(module, fd, namelist[n]->d_name);
398                                         module->type = TBM_MODULE_TYPE_BUFMGR_BACKEND;
399                                 }
400                         }
401                 }
402
403                 free(namelist[n]);
404         }
405
406         free(namelist);
407
408         if (!ret) {
409                 free(module);
410                 module = NULL;
411         }
412 /* LCOV_EXCL_STOP */
413
414 done:
415         return module;
416 }
417
418 void
419 tbm_module_unload(tbm_module *module)
420 {
421         switch (module->type) {
422         case TBM_MODULE_TYPE_HAL_TBM:
423                 if (module->auth_wl_socket_created) {
424                         tbm_drm_helper_wl_auth_server_deinit();
425                         close(module->auth_fd);
426                 }
427                 tbm_drm_helper_unset_tbm_master_fd();
428                 tbm_drm_helper_unset_fd();
429
430                 hal_tbm_put_backend(module->hal_backend);
431                 module->hal_backend = NULL;
432                 module->hal_bufmgr = NULL;
433                 module->use_hal_tbm = 0;
434                 break;
435 /* LCOV_EXCL_START */
436         case TBM_MODULE_TYPE_TBM_BACKEND:
437                 module->backend_module_data->deinit(module->bufmgr_data);
438                 module->bo_func = NULL;
439                 module->bufmgr_func = NULL;
440                 module->bufmgr_data = NULL;
441                 module->backend_module_data = NULL;
442
443                 dlclose(module->module_data);
444                 break;
445         case TBM_MODULE_TYPE_BUFMGR_BACKEND:
446                 module->backend->bufmgr_deinit(module->backend->priv);
447                 module->backend->priv = NULL;
448                 tbm_backend_free(module->backend);
449                 module->backend = NULL;
450
451                 dlclose(module->module_data);
452                 break;
453         default:
454                 TBM_ERR("Wrong module type:%d", module->type);
455                 break;
456 /* LCOV_EXCL_STOP */
457         }
458
459         free(module);
460 }
461
462 int
463 tbm_module_bufmgr_get_capabilities(tbm_module *module, tbm_error_e *error)
464 {
465         int capabilities = 0;
466         tbm_backend_bufmgr_func *bufmgr_func = NULL;
467
468         TBM_RETURN_VAL_SET_ERR_IF_FAIL(module, TBM_BUFMGR_CAPABILITY_NONE, *error, TBM_ERROR_INVALID_PARAMETER);
469
470         switch (module->type) {
471         case TBM_MODULE_TYPE_HAL_TBM:
472                 capabilities = hal_tbm_bufmgr_get_capabilities(module->hal_bufmgr, (hal_tbm_error *)error);
473                 break;
474 /* LCOV_EXCL_START */
475         case TBM_MODULE_TYPE_TBM_BACKEND:
476                 bufmgr_func = module->bufmgr_func;
477                 TBM_RETURN_VAL_SET_ERR_IF_FAIL(bufmgr_func, 0, *error, TBM_ERROR_INVALID_OPERATION);
478                 TBM_RETURN_VAL_SET_ERR_IF_FAIL(bufmgr_func->bufmgr_get_capabilities, 0, *error, TBM_ERROR_NOT_SUPPORTED);
479
480                 capabilities = module->bufmgr_func->bufmgr_get_capabilities(module->bufmgr_data, error);
481                 break;
482         case TBM_MODULE_TYPE_BUFMGR_BACKEND:
483                 TBM_WRN("!!WARNING: This backend interface will be DEPRECATED after Tizen 6.5.");
484                 TBM_ERR("Do not support at tbm_bufmgr_backend.");
485
486                 *error = TBM_ERROR_NOT_SUPPORTED;
487                 break;
488         default:
489                 TBM_ERR("Wrong module type:%d", module->type);
490                 *error = TBM_ERROR_INVALID_OPERATION;
491                 break;
492 /* LCOV_EXCL_STOP */
493         }
494
495         return capabilities;
496 }
497
498 tbm_error_e
499 tbm_module_bufmgr_bind_native_display(tbm_module *module, void *native_display)
500 {
501         tbm_error_e error = TBM_ERROR_NONE;
502         tbm_backend_bufmgr_func *bufmgr_func = NULL;
503         tbm_bufmgr_backend backend = NULL;
504         int ret = 0;
505
506         TBM_RETURN_VAL_IF_FAIL(module, TBM_ERROR_INVALID_PARAMETER);
507
508         switch (module->type) {
509         case TBM_MODULE_TYPE_HAL_TBM:
510                 if (hal_tbm_backend_has_drm_device(module->hal_backend, &ret)) {
511                         int fd = tbm_drm_helper_get_fd(); // this must be the auth drm_fd.(master drm_fd);
512                         if (fd < 0) {
513                                 TBM_ERR("error: module(%p) native_display(%p)\n", module, native_display);
514                                 return TBM_ERROR_INVALID_OPERATION;
515                         }
516
517                         // make the wayland server socket for sending the authenticated drm_fd to wayland clients.
518                         if (!tbm_drm_helper_wl_auth_server_init(native_display, fd, NULL, 0)) {
519                                 TBM_ERR("error: tbm_drm_helper_wl_auth_server_init failed\n", module, native_display);
520                                 close(fd);
521                                 return TBM_ERROR_INVALID_OPERATION;
522                         }
523                         TBM_INFO("tbm creates a wayland socket for authentication of drm_fd.");
524
525                         module->auth_wl_socket_created = 1;
526                         module->auth_fd = fd;
527                 } else {
528                         TBM_INFO("tbm_module has no drm device.");
529                         error = TBM_ERROR_NONE;
530                 }
531                 break;
532 /* LCOV_EXCL_START */
533         case TBM_MODULE_TYPE_TBM_BACKEND:
534                 bufmgr_func = module->bufmgr_func;
535                 TBM_RETURN_VAL_IF_FAIL(bufmgr_func, TBM_ERROR_INVALID_OPERATION);
536                 TBM_RETURN_VAL_IF_FAIL(bufmgr_func->bufmgr_bind_native_display, TBM_ERROR_NOT_SUPPORTED);
537
538                 error = bufmgr_func->bufmgr_bind_native_display(module->bufmgr_data, (tbm_native_display *)native_display);
539                 break;
540         case TBM_MODULE_TYPE_BUFMGR_BACKEND:
541                 TBM_WRN("!!WARNING: This backend interface will be DEPRECATED after Tizen 6.5.");
542                 backend = module->backend;
543                 TBM_RETURN_VAL_IF_FAIL(backend, TBM_ERROR_INVALID_OPERATION);
544                 TBM_RETURN_VAL_IF_FAIL(backend->bufmgr_bind_native_display, TBM_ERROR_NOT_SUPPORTED);
545
546                 ret = backend->bufmgr_bind_native_display((tbm_bufmgr)module, native_display);
547                 if (!ret)
548                         error = TBM_ERROR_INVALID_OPERATION;
549
550                 break;
551         default:
552                 TBM_ERR("Wrong module type:%d", module->type);
553                 error = TBM_ERROR_INVALID_OPERATION;
554                 break;
555 /* LCOV_EXCL_STOP */
556         }
557
558         return error;
559 }
560
561 tbm_error_e
562 tbm_module_bufmgr_get_supported_formats(tbm_module *module, uint32_t **formats, uint32_t *num)
563 {
564         tbm_error_e error = TBM_ERROR_NONE;
565         tbm_backend_bufmgr_func *bufmgr_func = NULL;
566         tbm_bufmgr_backend backend = NULL;
567         int ret = 0;
568
569         TBM_RETURN_VAL_IF_FAIL(module, TBM_ERROR_INVALID_PARAMETER);
570
571         switch (module->type) {
572         case TBM_MODULE_TYPE_HAL_TBM:
573                 error = (tbm_error_e)hal_tbm_bufmgr_get_supported_formats(module->hal_bufmgr, formats, num);
574                 break;
575 /* LCOV_EXCL_START */
576         case TBM_MODULE_TYPE_TBM_BACKEND:
577                 bufmgr_func = module->bufmgr_func;
578                 TBM_RETURN_VAL_IF_FAIL(bufmgr_func, TBM_ERROR_INVALID_OPERATION);
579                 TBM_RETURN_VAL_IF_FAIL(bufmgr_func->bufmgr_get_supported_formats, TBM_ERROR_NOT_SUPPORTED);
580
581                 error = bufmgr_func->bufmgr_get_supported_formats(module->bufmgr_data, formats, num);
582                 break;
583         case TBM_MODULE_TYPE_BUFMGR_BACKEND:
584                 TBM_WRN("!!WARNING: This backend interface will be DEPRECATED after Tizen 6.5.");
585                 backend = module->backend;
586                 TBM_RETURN_VAL_IF_FAIL(backend, TBM_ERROR_INVALID_OPERATION);
587                 TBM_RETURN_VAL_IF_FAIL(backend->surface_supported_format, TBM_ERROR_NOT_SUPPORTED);
588
589                 ret = backend->surface_supported_format(formats, num);
590                 if (!ret)
591                         error = TBM_ERROR_INVALID_OPERATION;
592
593                 break;
594         default:
595                 TBM_ERR("Wrong module type:%d", module->type);
596                 error = TBM_ERROR_INVALID_OPERATION;
597                 break;
598 /* LCOV_EXCL_STOP */
599         }
600
601         return error;
602 }
603
604 tbm_error_e
605 tbm_module_bufmgr_get_plane_data(tbm_module *module, int format, int plane_idx, uint32_t w, uint32_t h,
606                                         uint32_t *size, uint32_t *offset, uint32_t *pitch, int *bo_idx)
607 {
608         tbm_error_e error = TBM_ERROR_NONE;
609         tbm_backend_bufmgr_func *bufmgr_func = NULL;
610         tbm_bufmgr_backend backend = NULL;
611         int ret = 0;
612
613         TBM_RETURN_VAL_IF_FAIL(module, TBM_ERROR_INVALID_PARAMETER);
614
615         switch (module->type) {
616         case TBM_MODULE_TYPE_HAL_TBM:
617                 error = (tbm_error_e)hal_tbm_bufmgr_get_plane_data(module->hal_bufmgr, format, plane_idx, w, h, size, offset, pitch, bo_idx);
618                 break;
619 /* LCOV_EXCL_START */
620         case TBM_MODULE_TYPE_TBM_BACKEND:
621                 bufmgr_func = module->bufmgr_func;
622                 TBM_RETURN_VAL_IF_FAIL(bufmgr_func, TBM_ERROR_INVALID_OPERATION);
623                 TBM_RETURN_VAL_IF_FAIL(bufmgr_func->bufmgr_get_plane_data, TBM_ERROR_NOT_SUPPORTED);
624
625                 error = bufmgr_func->bufmgr_get_plane_data(module->bufmgr_data, format, plane_idx, w, h, size, offset, pitch, bo_idx);
626                 break;
627         case TBM_MODULE_TYPE_BUFMGR_BACKEND:
628                 TBM_WRN("!!WARNING: This backend interface will be DEPRECATED after Tizen 6.5.");
629                 backend = module->backend;
630                 TBM_RETURN_VAL_IF_FAIL(backend, TBM_ERROR_INVALID_OPERATION);
631                 TBM_RETURN_VAL_IF_FAIL(backend->surface_get_plane_data, TBM_ERROR_NOT_SUPPORTED);
632
633                 ret = backend->surface_get_plane_data(w, h, format, plane_idx, size, offset, pitch, bo_idx);
634                 if (!ret)
635                         error = TBM_ERROR_INVALID_OPERATION;
636                 break;
637         default:
638                 TBM_ERR("Wrong module type:%d", module->type);
639                 error = TBM_ERROR_INVALID_OPERATION;
640                 break;
641 /* LCOV_EXCL_STOP */
642         }
643
644         return error;
645 }
646
647 tbm_backend_bo_data *
648 tbm_module_bufmgr_bo_alloc(tbm_module *module, tbm_bo bo, int size, int flags, tbm_error_e *error)
649 {
650         tbm_backend_bo_data *bo_data = NULL;
651         tbm_backend_bufmgr_func *bufmgr_func = NULL;
652         tbm_bufmgr_backend backend = NULL;
653
654         TBM_RETURN_VAL_SET_ERR_IF_FAIL(module, NULL, *error, TBM_ERROR_INVALID_PARAMETER);
655
656         switch (module->type) {
657         case TBM_MODULE_TYPE_HAL_TBM:
658                 bo_data = (tbm_backend_bo_data *)hal_tbm_bufmgr_alloc_bo(module->hal_bufmgr, size, flags, (hal_tbm_error *)error);
659                 break;
660 /* LCOV_EXCL_START */
661         case TBM_MODULE_TYPE_TBM_BACKEND:
662                 bufmgr_func = module->bufmgr_func;
663                 TBM_RETURN_VAL_SET_ERR_IF_FAIL(bufmgr_func, NULL, *error, TBM_ERROR_INVALID_OPERATION);
664                 TBM_RETURN_VAL_SET_ERR_IF_FAIL(bufmgr_func->bufmgr_alloc_bo, NULL, *error, TBM_ERROR_NOT_SUPPORTED);
665
666                 bo_data = module->bufmgr_func->bufmgr_alloc_bo(module->bufmgr_data, (unsigned int)size, flags, error);
667                 break;
668         case TBM_MODULE_TYPE_BUFMGR_BACKEND:
669                 TBM_WRN("!!WARNING: This backend interface will be DEPRECATED after Tizen 6.5.");
670                 backend = module->backend;
671                 TBM_RETURN_VAL_SET_ERR_IF_FAIL(backend, NULL, *error, TBM_ERROR_INVALID_OPERATION);
672                 TBM_RETURN_VAL_SET_ERR_IF_FAIL(backend->bo_alloc, NULL, *error, TBM_ERROR_NOT_SUPPORTED);
673
674                 bo_data = (void *)module->backend->bo_alloc(bo, size, flags);
675                 *error = TBM_ERROR_NONE;
676                 break;
677         default:
678                 TBM_ERR("Wrong module type:%d", module->type);
679                 *error = TBM_ERROR_INVALID_OPERATION;
680                 break;
681 /* LCOV_EXCL_STOP */
682         }
683
684         return bo_data;
685 }
686
687 tbm_backend_bo_data *
688 tbm_module_bufmgr_bo_alloc_with_format(tbm_module *module, int format, int bo_idx, int width,
689                                                 int height, int bpp, tbm_bo_memory_type flags, tbm_error_e *error)
690 {
691         tbm_backend_bo_data *bo_data = NULL;
692         tbm_backend_bufmgr_func *bufmgr_func = NULL;
693
694         TBM_RETURN_VAL_SET_ERR_IF_FAIL(module, NULL, *error, TBM_ERROR_INVALID_PARAMETER);
695
696         switch (module->type) {
697         case TBM_MODULE_TYPE_HAL_TBM:
698                 bo_data = (tbm_backend_bo_data *)hal_tbm_bufmgr_alloc_bo_with_format(module->hal_bufmgr,
699                                                                                         format, bo_idx, width, height, bpp,
700                                                                                         (hal_tbm_bo_memory_type)flags, (hal_tbm_error *)error);
701                 break;
702 /* LCOV_EXCL_START */
703         case TBM_MODULE_TYPE_TBM_BACKEND:
704                 bufmgr_func = module->bufmgr_func;
705                 TBM_RETURN_VAL_SET_ERR_IF_FAIL(bufmgr_func, NULL, *error, TBM_ERROR_INVALID_OPERATION);
706                 TBM_RETURN_VAL_SET_ERR_IF_FAIL(bufmgr_func->bufmgr_alloc_bo_with_format, NULL, *error, TBM_ERROR_NOT_SUPPORTED);
707
708                 bo_data = bufmgr_func->bufmgr_alloc_bo_with_format(module->bufmgr_data, format, bo_idx, width, height, flags, error);
709                 break;
710         case TBM_MODULE_TYPE_BUFMGR_BACKEND:
711                 TBM_WRN("!!WARNING: This backend interface will be DEPRECATED after Tizen 6.5.");
712                 TBM_ERR("error: not supported tbm_bufmgr_internal_alloc_bo_with_format.");
713
714                 *error = TBM_ERROR_NOT_SUPPORTED;
715                 break;
716         default:
717                 TBM_ERR("Wrong module type:%d", module->type);
718                 *error = TBM_ERROR_INVALID_OPERATION;
719                 break;
720 /* LCOV_EXCL_STOP */
721         }
722
723         return bo_data;
724 }
725
726
727 tbm_backend_bo_data *
728 tbm_module_bufmgr_bo_import_fd(tbm_module *module, tbm_bo bo, tbm_fd fd, tbm_error_e *error)
729 {
730         tbm_backend_bo_data *bo_data = NULL;
731         tbm_backend_bufmgr_func *bufmgr_func = NULL;
732         tbm_bufmgr_backend backend = NULL;
733
734         TBM_RETURN_VAL_SET_ERR_IF_FAIL(module, NULL, *error, TBM_ERROR_INVALID_PARAMETER);
735
736         switch (module->type) {
737         case TBM_MODULE_TYPE_HAL_TBM:
738                 bo_data = (tbm_backend_bo_data *)hal_tbm_bufmgr_import_fd(module->hal_bufmgr, (hal_tbm_fd)fd, (hal_tbm_error *)error);
739                 break;
740 /* LCOV_EXCL_START */
741         case TBM_MODULE_TYPE_TBM_BACKEND:
742                 bufmgr_func = module->bufmgr_func;
743                 TBM_RETURN_VAL_SET_ERR_IF_FAIL(bufmgr_func, NULL, *error, TBM_ERROR_INVALID_OPERATION);
744                 TBM_RETURN_VAL_SET_ERR_IF_FAIL(bufmgr_func->bufmgr_import_fd, NULL, *error, TBM_ERROR_NOT_SUPPORTED);
745
746                 bo_data = bufmgr_func->bufmgr_import_fd(module->bufmgr_data, fd, error);
747                 break;
748         case TBM_MODULE_TYPE_BUFMGR_BACKEND:
749                 TBM_WRN("!!WARNING: This backend interface will be DEPRECATED after Tizen 6.5.");
750                 backend = module->backend;
751                 TBM_RETURN_VAL_SET_ERR_IF_FAIL(backend, NULL, *error, TBM_ERROR_INVALID_OPERATION);
752                 TBM_RETURN_VAL_SET_ERR_IF_FAIL(backend->bo_import_fd, NULL, *error, TBM_ERROR_NOT_SUPPORTED);
753
754                 bo_data = (void *)backend->bo_import_fd(bo, fd);
755                 if (!bo_data)
756                         *error = TBM_ERROR_INVALID_OPERATION;
757                 else
758                         *error = TBM_ERROR_NONE;
759                 break;
760         default:
761                 TBM_ERR("Wrong module type:%d", module->type);
762                 *error = TBM_ERROR_INVALID_OPERATION;
763                 break;
764 /* LCOV_EXCL_STOP */
765         }
766
767         return bo_data;
768 }
769
770 tbm_backend_bo_data *
771 tbm_module_bufmgr_bo_import_key(tbm_module *module, tbm_bo bo, tbm_key key, tbm_error_e *error)
772 {
773         tbm_backend_bo_data *bo_data = NULL;
774         tbm_backend_bufmgr_func *bufmgr_func = NULL;
775         tbm_bufmgr_backend backend = NULL;
776
777         TBM_RETURN_VAL_SET_ERR_IF_FAIL(module, NULL, *error, TBM_ERROR_INVALID_PARAMETER);
778
779         switch (module->type) {
780         case TBM_MODULE_TYPE_HAL_TBM:
781                 bo_data = (tbm_backend_bo_data *)hal_tbm_bufmgr_import_key(module->hal_bufmgr, key, (hal_tbm_error *)error);
782                 break;
783 /* LCOV_EXCL_START */
784         case TBM_MODULE_TYPE_TBM_BACKEND:
785                 bufmgr_func = module->bufmgr_func;
786                 TBM_RETURN_VAL_SET_ERR_IF_FAIL(bufmgr_func, NULL, *error, TBM_ERROR_INVALID_OPERATION);
787                 TBM_RETURN_VAL_SET_ERR_IF_FAIL(bufmgr_func->bufmgr_import_key, NULL, *error, TBM_ERROR_NOT_SUPPORTED);
788
789                 bo_data = bufmgr_func->bufmgr_import_key(module->bufmgr_data, key, error);
790                 break;
791         case TBM_MODULE_TYPE_BUFMGR_BACKEND:
792                 TBM_WRN("!!WARNING: This backend interface will be DEPRECATED after Tizen 6.5.");
793                 backend = module->backend;
794                 TBM_RETURN_VAL_SET_ERR_IF_FAIL(backend, NULL, *error, TBM_ERROR_INVALID_OPERATION);
795                 TBM_RETURN_VAL_SET_ERR_IF_FAIL(backend->bo_import, NULL, *error, TBM_ERROR_NOT_SUPPORTED);
796
797                 bo_data = (void *)backend->bo_import(bo, key);
798                 if (!bo_data)
799                         *error = TBM_ERROR_INVALID_OPERATION;
800                 else
801                         *error = TBM_ERROR_NONE;
802                 break;
803         default:
804                 TBM_ERR("Wrong module type:%d", module->type);
805                 *error = TBM_ERROR_INVALID_OPERATION;
806                 break;
807 /* LCOV_EXCL_STOP */
808         }
809
810         return bo_data;
811 }
812
813 void
814 tbm_module_bo_free(tbm_module *module, tbm_bo bo, tbm_backend_bo_data *bo_data, int get_from_hal_surface)
815 {
816         tbm_backend_bo_func *bo_func = NULL;
817         tbm_bufmgr_backend backend = NULL;
818
819         TBM_RETURN_IF_FAIL(module);
820         TBM_RETURN_IF_FAIL(bo);
821         TBM_RETURN_IF_FAIL(bo_data);
822
823         switch (module->type) {
824         case TBM_MODULE_TYPE_HAL_TBM:
825                 // call hal_tbm_bo_free when bo is created by tbm_bo_alloc api.
826                 if (get_from_hal_surface)
827                         hal_tbm_bo_free(bo_data);
828                 break;
829 /* LCOV_EXCL_START */
830         case TBM_MODULE_TYPE_TBM_BACKEND:
831                 bo_func = module->bo_func;
832                 TBM_RETURN_IF_FAIL(bo_func);
833                 TBM_RETURN_IF_FAIL(bo_func->bo_free);
834
835                 bo_func->bo_free(bo_data);
836                 break;
837         case TBM_MODULE_TYPE_BUFMGR_BACKEND:
838                 TBM_WRN("!!WARNING: This backend interface will be DEPRECATED after Tizen 6.5.");
839                 backend = module->backend;
840                 TBM_RETURN_IF_FAIL(backend);
841                 TBM_RETURN_IF_FAIL(backend->bo_free);
842
843                 backend->bo_free(bo);
844                 break;
845         default:
846                 TBM_ERR("Wrong module type:%d", module->type);
847                 break;
848 /* LCOV_EXCL_STOP */
849         }
850 }
851
852 int
853 tbm_module_bo_get_size(tbm_module *module, tbm_bo bo, tbm_backend_bo_data *bo_data, tbm_error_e *error)
854 {
855         tbm_backend_bo_func *bo_func = NULL;
856         tbm_bufmgr_backend backend = NULL;
857         int size = 0;
858
859         TBM_RETURN_VAL_SET_ERR_IF_FAIL(module, 0, *error, TBM_ERROR_INVALID_PARAMETER);
860
861         switch (module->type) {
862         case TBM_MODULE_TYPE_HAL_TBM:
863                 size = hal_tbm_bo_get_size((hal_tbm_bo *)bo_data, (hal_tbm_error *)error);
864                 break;
865 /* LCOV_EXCL_START */
866         case TBM_MODULE_TYPE_TBM_BACKEND:
867                 bo_func = module->bo_func;
868                 TBM_RETURN_VAL_SET_ERR_IF_FAIL(bo_func, 0, *error, TBM_ERROR_INVALID_OPERATION);
869                 TBM_RETURN_VAL_SET_ERR_IF_FAIL(bo_func->bo_get_size, 0, *error, TBM_ERROR_NOT_SUPPORTED);
870
871                 size = bo_func->bo_get_size(bo_data, error);
872                 break;
873         case TBM_MODULE_TYPE_BUFMGR_BACKEND:
874                 TBM_WRN("!!WARNING: This backend interface will be DEPRECATED after Tizen 6.5.");
875                 backend = module->backend;
876                 TBM_RETURN_VAL_SET_ERR_IF_FAIL(backend, 0, *error, TBM_ERROR_INVALID_OPERATION);
877                 TBM_RETURN_VAL_SET_ERR_IF_FAIL(backend->bo_size, 0, *error, TBM_ERROR_NOT_SUPPORTED);
878
879                 size = backend->bo_size(bo);
880                 if (size == 0)
881                         *error = TBM_ERROR_INVALID_OPERATION;
882                 else
883                         *error = TBM_ERROR_NONE;
884                 break;
885         default:
886                 TBM_ERR("Wrong module type:%d", module->type);
887                 *error = TBM_ERROR_INVALID_OPERATION;
888                 break;
889 /* LCOV_EXCL_STOP */
890         }
891
892         return size;
893 }
894
895 int
896 tbm_module_bo_get_memory_types(tbm_module *module, tbm_bo bo, tbm_backend_bo_data *bo_data, tbm_error_e *error)
897 {
898         tbm_backend_bo_func *bo_func = NULL;
899         tbm_bufmgr_backend backend = NULL;
900         int memory_types = TBM_BO_DEFAULT;
901
902         TBM_RETURN_VAL_SET_ERR_IF_FAIL(module, 0, *error, TBM_ERROR_INVALID_PARAMETER);
903
904         switch (module->type) {
905         case TBM_MODULE_TYPE_HAL_TBM:
906                 memory_types = (tbm_bo_memory_type)hal_tbm_bo_get_memory_types((hal_tbm_bo *)bo_data, (hal_tbm_error *)error);
907                 break;
908 /* LCOV_EXCL_START */
909         case TBM_MODULE_TYPE_TBM_BACKEND:
910                 bo_func = module->bo_func;
911                 TBM_RETURN_VAL_SET_ERR_IF_FAIL(bo_func, 0, *error, TBM_ERROR_INVALID_OPERATION);
912                 TBM_RETURN_VAL_SET_ERR_IF_FAIL(bo_func->bo_get_memory_types, 0, *error, TBM_ERROR_NOT_SUPPORTED);
913
914                 memory_types = bo_func->bo_get_memory_types(bo_data, error);
915                 break;
916         case TBM_MODULE_TYPE_BUFMGR_BACKEND:
917                 TBM_WRN("!!WARNING: This backend interface will be DEPRECATED after Tizen 6.5.");
918                 backend = module->backend;
919                 TBM_RETURN_VAL_SET_ERR_IF_FAIL(backend, 0, *error, TBM_ERROR_INVALID_OPERATION);
920                 TBM_RETURN_VAL_SET_ERR_IF_FAIL(backend->bo_get_flags, 0, *error, TBM_ERROR_NOT_SUPPORTED);
921
922                 memory_types = backend->bo_get_flags(bo);
923                 *error = TBM_ERROR_NONE;
924                 break;
925         default:
926                 TBM_ERR("Wrong module type:%d", module->type);
927                 *error = TBM_ERROR_INVALID_OPERATION;
928                 break;
929 /* LCOV_EXCL_STOP */
930         }
931
932         return memory_types;
933 }
934
935 tbm_bo_handle
936 tbm_module_bo_get_handle(tbm_module *module, tbm_bo bo, tbm_backend_bo_data *bo_data, int device, tbm_error_e *error)
937 {
938         tbm_backend_bo_func *bo_func = NULL;
939         tbm_bufmgr_backend backend = NULL;
940         tbm_bo_handle bo_handle;
941         hal_tbm_bo_handle hbo_handle;
942
943         TBM_RETURN_VAL_SET_ERR_IF_FAIL(module, (tbm_bo_handle)NULL, *error, TBM_ERROR_INVALID_PARAMETER);
944
945         switch (module->type) {
946         case TBM_MODULE_TYPE_HAL_TBM:
947                 hbo_handle = hal_tbm_bo_get_handle((hal_tbm_bo *)bo_data, device, (hal_tbm_error *)error);
948                 if (hbo_handle.ptr != NULL)
949                         memcpy(&bo_handle.ptr, &hbo_handle.ptr, sizeof(tbm_bo_handle));
950                 break;
951 /* LCOV_EXCL_START */
952         case TBM_MODULE_TYPE_TBM_BACKEND:
953                 bo_func = module->bo_func;
954                 TBM_RETURN_VAL_SET_ERR_IF_FAIL(bo_func, (tbm_bo_handle)NULL, *error, TBM_ERROR_INVALID_OPERATION);
955                 TBM_RETURN_VAL_SET_ERR_IF_FAIL(bo_func->bo_get_handle, (tbm_bo_handle)NULL, *error, TBM_ERROR_NOT_SUPPORTED);
956
957                 bo_handle = bo_func->bo_get_handle(bo_data, device, error);
958                 break;
959         case TBM_MODULE_TYPE_BUFMGR_BACKEND:
960                 TBM_WRN("!!WARNING: This backend interface will be DEPRECATED after Tizen 6.5.");
961                 backend = module->backend;
962                 TBM_RETURN_VAL_SET_ERR_IF_FAIL(backend, (tbm_bo_handle)NULL, *error, TBM_ERROR_INVALID_OPERATION);
963                 TBM_RETURN_VAL_SET_ERR_IF_FAIL(backend->bo_get_handle, (tbm_bo_handle)NULL, *error, TBM_ERROR_NOT_SUPPORTED);
964
965                 bo_handle = backend->bo_get_handle(bo, device);
966                 if (!bo_handle.ptr)
967                         *error = TBM_ERROR_INVALID_OPERATION;
968                 else
969                         *error = TBM_ERROR_NONE;
970                 break;
971         default:
972                 TBM_ERR("Wrong module type:%d", module->type);
973                 bo_handle.ptr = NULL;
974                 *error = TBM_ERROR_INVALID_OPERATION;
975                 break;
976 /* LCOV_EXCL_STOP */
977         }
978
979         return bo_handle;
980 }
981
982 tbm_bo_handle
983 tbm_module_bo_map(tbm_module *module, tbm_bo bo, tbm_backend_bo_data *bo_data, int device, int opt, tbm_error_e *error)
984 {
985         tbm_backend_bo_func *bo_func = NULL;
986         tbm_bufmgr_backend backend = NULL;
987         tbm_bo_handle bo_handle;
988         hal_tbm_bo_handle hbo_handle;
989
990         TBM_RETURN_VAL_SET_ERR_IF_FAIL(module, (tbm_bo_handle)NULL, *error, TBM_ERROR_INVALID_PARAMETER);
991
992         switch (module->type) {
993         case TBM_MODULE_TYPE_HAL_TBM:
994                 hbo_handle = hal_tbm_bo_map((hal_tbm_bo *)bo_data, device, opt, (hal_tbm_error *)error);
995                 if (hbo_handle.ptr != NULL)
996                         memcpy(&bo_handle.ptr, &hbo_handle.ptr, sizeof(tbm_bo_handle));
997                 break;
998 /* LCOV_EXCL_START */
999         case TBM_MODULE_TYPE_TBM_BACKEND:
1000                 bo_func = module->bo_func;
1001                 TBM_RETURN_VAL_SET_ERR_IF_FAIL(bo_func, (tbm_bo_handle)NULL, *error, TBM_ERROR_INVALID_OPERATION);
1002                 TBM_RETURN_VAL_SET_ERR_IF_FAIL(bo_func->bo_map, (tbm_bo_handle)NULL, *error, TBM_ERROR_NOT_SUPPORTED);
1003
1004                 bo_handle = bo_func->bo_map(bo_data, device, opt, error);
1005                 break;
1006         case TBM_MODULE_TYPE_BUFMGR_BACKEND:
1007                 TBM_WRN("!!WARNING: This backend interface will be DEPRECATED after Tizen 6.5.");
1008                 backend = module->backend;
1009                 TBM_RETURN_VAL_SET_ERR_IF_FAIL(backend, (tbm_bo_handle)NULL, *error, TBM_ERROR_INVALID_OPERATION);
1010                 TBM_RETURN_VAL_SET_ERR_IF_FAIL(backend->bo_map, (tbm_bo_handle)NULL, *error, TBM_ERROR_NOT_SUPPORTED);
1011
1012                 bo_handle = backend->bo_map(bo, device, opt);
1013                 if (!bo_handle.ptr)
1014                         *error = TBM_ERROR_INVALID_OPERATION;
1015                 else
1016                         *error = TBM_ERROR_NONE;
1017                 break;
1018         default:
1019                 TBM_ERR("Wrong module type:%d", module->type);
1020                 bo_handle.ptr = NULL;
1021                 *error = TBM_ERROR_INVALID_OPERATION;
1022                 break;
1023 /* LCOV_EXCL_STOP */
1024         }
1025
1026         return bo_handle;
1027 }
1028
1029 tbm_error_e
1030 tbm_module_bo_unmap(tbm_module *module, tbm_bo bo, tbm_backend_bo_data *bo_data)
1031 {
1032         tbm_backend_bo_func *bo_func = NULL;
1033         tbm_bufmgr_backend backend = NULL;
1034         tbm_error_e error;
1035         int ret = 0;
1036
1037         TBM_RETURN_VAL_IF_FAIL(module, TBM_ERROR_INVALID_PARAMETER);
1038
1039         switch (module->type) {
1040         case TBM_MODULE_TYPE_HAL_TBM:
1041                 error = (hal_tbm_error)hal_tbm_bo_unmap((hal_tbm_bo *)bo_data);
1042                 break;
1043 /* LCOV_EXCL_START */
1044         case TBM_MODULE_TYPE_TBM_BACKEND:
1045                 bo_func = module->bo_func;
1046                 TBM_RETURN_VAL_IF_FAIL(bo_func, TBM_ERROR_INVALID_OPERATION);
1047                 TBM_RETURN_VAL_IF_FAIL(bo_func->bo_unmap, TBM_ERROR_NOT_SUPPORTED);
1048
1049                 error = bo_func->bo_unmap(bo->bo_data);
1050                 break;
1051         case TBM_MODULE_TYPE_BUFMGR_BACKEND:
1052                 TBM_WRN("!!WARNING: This backend interface will be DEPRECATED after Tizen 6.5.");
1053                 backend = module->backend;
1054                 TBM_RETURN_VAL_IF_FAIL(backend, TBM_ERROR_INVALID_OPERATION);
1055                 TBM_RETURN_VAL_IF_FAIL(backend->bo_unmap, TBM_ERROR_NOT_SUPPORTED);
1056
1057                 ret = bo->bufmgr->backend->bo_unmap(bo);
1058                 if (!ret)
1059                         error = TBM_ERROR_INVALID_OPERATION;
1060                 else
1061                         error = TBM_ERROR_NONE;
1062                 break;
1063         default:
1064                 TBM_ERR("Wrong module type:%d", module->type);
1065                 error = TBM_ERROR_INVALID_OPERATION;
1066                 break;
1067 /* LCOV_EXCL_STOP */
1068         }
1069
1070         return error;
1071 }
1072
1073 tbm_error_e
1074 tbm_module_bo_lock(tbm_module *module, tbm_bo bo, tbm_backend_bo_data *bo_data, int device, int opt)
1075 {
1076         tbm_backend_bo_func *bo_func = NULL;
1077         tbm_bufmgr_backend backend = NULL;
1078         tbm_error_e error;
1079         int ret = 0;
1080
1081         TBM_RETURN_VAL_IF_FAIL(module, TBM_ERROR_INVALID_PARAMETER);
1082
1083         switch (module->type) {
1084         case TBM_MODULE_TYPE_HAL_TBM:
1085                 error = (tbm_error_e)hal_tbm_bo_lock((hal_tbm_bo *)bo_data, device, opt);
1086                 break;
1087 /* LCOV_EXCL_START */
1088         case TBM_MODULE_TYPE_TBM_BACKEND:
1089                 bo_func = module->bo_func;
1090                 TBM_RETURN_VAL_IF_FAIL(bo_func, TBM_ERROR_INVALID_OPERATION);
1091                 if (!bo_func->bo_lock)
1092                         return TBM_ERROR_NOT_SUPPORTED;
1093
1094                 error = bo_func->bo_lock(bo_data, device, opt);
1095                 break;
1096         case TBM_MODULE_TYPE_BUFMGR_BACKEND:
1097                 TBM_WRN("!!WARNING: This backend interface will be DEPRECATED after Tizen 6.5.");
1098                 backend = module->backend;
1099                 TBM_RETURN_VAL_IF_FAIL(backend, TBM_ERROR_INVALID_OPERATION);
1100                 if (!backend->bo_unmap)
1101                         return TBM_ERROR_NOT_SUPPORTED;
1102
1103                 ret = backend->bo_lock(bo, device, opt);
1104                 if (!ret)
1105                         error = TBM_ERROR_INVALID_OPERATION;
1106                 else
1107                         error = TBM_ERROR_NONE;
1108                 break;
1109         default:
1110                 TBM_ERR("Wrong module type:%d", module->type);
1111                 error = TBM_ERROR_INVALID_OPERATION;
1112                 break;
1113 /* LCOV_EXCL_STOP */
1114         }
1115
1116         return error;
1117 }
1118
1119 tbm_error_e
1120 tbm_module_bo_unlock(tbm_module *module, tbm_bo bo, tbm_backend_bo_data *bo_data)
1121 {
1122         tbm_backend_bo_func *bo_func = NULL;
1123         tbm_bufmgr_backend backend = NULL;
1124         tbm_error_e error;
1125
1126         TBM_RETURN_VAL_IF_FAIL(module, TBM_ERROR_INVALID_PARAMETER);
1127
1128         switch (module->type) {
1129         case TBM_MODULE_TYPE_HAL_TBM:
1130                 error = (tbm_error_e)hal_tbm_bo_unlock((hal_tbm_bo *)bo_data);
1131                 break;
1132 /* LCOV_EXCL_START */
1133         case TBM_MODULE_TYPE_TBM_BACKEND:
1134                 bo_func = module->bo_func;
1135                 TBM_RETURN_VAL_IF_FAIL(bo_func, TBM_ERROR_INVALID_OPERATION);
1136                 if (!bo_func->bo_unlock)
1137                         return TBM_ERROR_NOT_SUPPORTED;
1138
1139                 error = bo_func->bo_unlock(bo->bo_data);
1140                 break;
1141         case TBM_MODULE_TYPE_BUFMGR_BACKEND:
1142                 TBM_WRN("!!WARNING: This backend interface will be DEPRECATED after Tizen 6.5.");
1143                 backend = module->backend;
1144                 TBM_RETURN_VAL_IF_FAIL(backend, TBM_ERROR_INVALID_OPERATION);
1145                 if (!backend->bo_unlock)
1146                         return TBM_ERROR_NOT_SUPPORTED;
1147
1148                 backend->bo_unlock(bo);
1149                 error = TBM_ERROR_NONE;
1150                 break;
1151         default:
1152                 TBM_ERR("Wrong module type:%d", module->type);
1153                 error = TBM_ERROR_INVALID_OPERATION;
1154                 break;
1155 /* LCOV_EXCL_STOP */
1156         }
1157
1158         return error;
1159 }
1160
1161 tbm_fd
1162 tbm_module_bo_export_fd(tbm_module *module, tbm_bo bo, tbm_backend_bo_data *bo_data, tbm_error_e *error)
1163 {
1164         tbm_backend_bo_func *bo_func = NULL;
1165         tbm_bufmgr_backend backend = NULL;
1166         tbm_fd fd;
1167
1168         TBM_RETURN_VAL_SET_ERR_IF_FAIL(module, -1, *error, TBM_ERROR_INVALID_PARAMETER);
1169
1170         switch (module->type) {
1171         case TBM_MODULE_TYPE_HAL_TBM:
1172                 fd = (hal_tbm_fd)hal_tbm_bo_export_fd((hal_tbm_bo *)bo_data, (hal_tbm_error *)error);
1173                 break;
1174 /* LCOV_EXCL_START */
1175         case TBM_MODULE_TYPE_TBM_BACKEND:
1176                 bo_func = module->bo_func;
1177                 TBM_RETURN_VAL_SET_ERR_IF_FAIL(bo_func, -1, *error, TBM_ERROR_INVALID_OPERATION);
1178                 TBM_RETURN_VAL_SET_ERR_IF_FAIL(bo_func->bo_export_fd, -1, *error, TBM_ERROR_NOT_SUPPORTED);
1179
1180                 fd = bo_func->bo_export_fd(bo_data, error);
1181                 break;
1182         case TBM_MODULE_TYPE_BUFMGR_BACKEND:
1183                 TBM_WRN("!!WARNING: This backend interface will be DEPRECATED after Tizen 6.5.");
1184                 backend = module->backend;
1185                 TBM_RETURN_VAL_SET_ERR_IF_FAIL(backend, -1, *error, TBM_ERROR_INVALID_OPERATION);
1186                 TBM_RETURN_VAL_SET_ERR_IF_FAIL(backend->bo_export_fd, -1, *error, TBM_ERROR_NOT_SUPPORTED);
1187
1188                 fd = backend->bo_export_fd(bo);
1189                 if (fd < 0)
1190                         *error = TBM_ERROR_INVALID_OPERATION;
1191                 else
1192                         *error = TBM_ERROR_NONE;
1193                 break;
1194         default:
1195                 TBM_ERR("Wrong module type:%d", module->type);
1196                 fd = -1;
1197                 *error = TBM_ERROR_INVALID_OPERATION;
1198                 break;
1199 /* LCOV_EXCL_STOP */
1200         }
1201
1202         return fd;
1203 }
1204
1205 tbm_key
1206 tbm_module_bo_export_key(tbm_module *module, tbm_bo bo, tbm_backend_bo_data *bo_data, tbm_error_e *error)
1207 {
1208         tbm_backend_bo_func *bo_func = NULL;
1209         tbm_bufmgr_backend backend = NULL;
1210         tbm_key ret;
1211
1212         TBM_RETURN_VAL_SET_ERR_IF_FAIL(module, 0, *error, TBM_ERROR_INVALID_PARAMETER);
1213
1214         switch (module->type) {
1215         case TBM_MODULE_TYPE_HAL_TBM:
1216                 ret = (hal_tbm_fd)hal_tbm_bo_export_key((hal_tbm_bo *)bo_data, (hal_tbm_error *)error);
1217                 break;
1218 /* LCOV_EXCL_START */
1219         case TBM_MODULE_TYPE_TBM_BACKEND:
1220                 bo_func = module->bo_func;
1221                 TBM_RETURN_VAL_SET_ERR_IF_FAIL(bo_func, 0, *error, TBM_ERROR_INVALID_OPERATION);
1222                 TBM_RETURN_VAL_SET_ERR_IF_FAIL(bo_func->bo_export_key, 0, *error, TBM_ERROR_NOT_SUPPORTED);
1223
1224                 ret = bo_func->bo_export_key(bo_data, error);
1225                 break;
1226         case TBM_MODULE_TYPE_BUFMGR_BACKEND:
1227                 TBM_WRN("!!WARNING: This backend interface will be DEPRECATED after Tizen 6.5.");
1228                 backend = module->backend;
1229                 TBM_RETURN_VAL_SET_ERR_IF_FAIL(backend, 0, *error, TBM_ERROR_INVALID_OPERATION);
1230                 TBM_RETURN_VAL_SET_ERR_IF_FAIL(backend->bo_export, 0, *error, TBM_ERROR_NOT_SUPPORTED);
1231
1232                 ret = backend->bo_export(bo);
1233                 if (!ret)
1234                         *error = TBM_ERROR_INVALID_OPERATION;
1235                 else
1236                         *error = TBM_ERROR_NONE;
1237                 break;
1238         default:
1239                 TBM_ERR("Wrong module type:%d", module->type);
1240                 ret = -1;
1241                 *error = TBM_ERROR_INVALID_OPERATION;
1242                 break;
1243 /* LCOV_EXCL_STOP */
1244         }
1245
1246         return ret;
1247 }