Reduce the duplicate code 86/208286/2
authorlsj119 <lsj119@samsung.com>
Fri, 21 Jun 2019 06:02:56 +0000 (15:02 +0900)
committerlsj119 <lsj119@samsung.com>
Fri, 21 Jun 2019 06:32:43 +0000 (15:32 +0900)
Change-Id: I5577289803397d3174803e574e2aca962d814a94

src/tbm_bufmgr_exynos.c

index 004088e..beead0b 100644 (file)
@@ -200,6 +200,7 @@ const static char *STR_OPT[] = {
        "RDWR"
 };
 
+static int _get_render_node(int is_master);
 
 #ifdef TGL_GET_VERSION
 static inline int
@@ -610,134 +611,17 @@ _tbm_exynos_open_drm()
        }
 
        if (fd < 0) {
-               struct udev *udev = NULL;
-               struct udev_enumerate *e = NULL;
-               struct udev_list_entry *entry = NULL;
-               struct udev_device *device = NULL, *drm_device = NULL, *device_parent = NULL;
-               const char *filepath;
-               struct stat s;
-               int ret;
-
-               TBM_DBG("search drm-device by udev\n");
-
-               udev = udev_new();
-               if (!udev) {
-                       TBM_ERR("udev_new() failed.\n");
-                       return -1;
-               }
-
-               e = udev_enumerate_new(udev);
-               udev_enumerate_add_match_subsystem(e, "drm");
-               udev_enumerate_add_match_sysname(e, "card[0-9]*");
-               udev_enumerate_scan_devices(e);
-
-               udev_list_entry_foreach(entry, udev_enumerate_get_list_entry(e)) {
-                       device = udev_device_new_from_syspath(udev_enumerate_get_udev(e),
-                                                             udev_list_entry_get_name(entry));
-                       device_parent = udev_device_get_parent(device);
-                       /* Not need unref device_parent. device_parent and device have same refcnt */
-                       if (device_parent) {
-                               if (strcmp(udev_device_get_sysname(device_parent), "exynos-drm") == 0) {
-                                       drm_device = device;
-                                       TBM_DBG("Found render device: '%s' (%s)\n",
-                                           udev_device_get_syspath(drm_device),
-                                           udev_device_get_sysname(device_parent));
-                                       break;
-                               }
-                       }
-                       udev_device_unref(device);
-               }
-
-               udev_enumerate_unref(e);
-
-               /* Get device file path. */
-               filepath = udev_device_get_devnode(drm_device);
-               if (!filepath) {
-                       TBM_ERR("udev_device_get_devnode() failed.\n");
-                       udev_device_unref(drm_device);
-                       udev_unref(udev);
-                       return -1;
-               }
-
-               /* Open DRM device file and check validity. */
-               fd = open(filepath, O_RDWR | O_CLOEXEC);
+               fd = _get_render_node(1);
                if (fd < 0) {
-                       TBM_ERR("open(%s, O_RDWR | O_CLOEXEC) failed.\n");
-                       udev_device_unref(drm_device);
-                       udev_unref(udev);
-                       return -1;
+                       TBM_ERR("cannot find render_node\n");
                }
-
-               ret = fstat(fd, &s);
-               if (ret) {
-                       TBM_ERR("fstat() failed %s.\n");
-                       close(fd);
-                       udev_device_unref(drm_device);
-                       udev_unref(udev);
-                       return -1;
-               }
-
-               udev_device_unref(drm_device);
-               udev_unref(udev);
        }
 
        return fd;
 }
 
 static int
-_check_render_node(void)
-{
-#ifndef USE_RENDER_NODE
-       return 0;
-#else
-       struct udev *udev = NULL;
-       struct udev_enumerate *e = NULL;
-       struct udev_list_entry *entry = NULL;
-       struct udev_device *device = NULL, *drm_device = NULL, *device_parent = NULL;
-
-       udev = udev_new();
-       if (!udev) {
-               TBM_ERR("udev_new() failed.\n");
-               return -1;
-       }
-
-       e = udev_enumerate_new(udev);
-       udev_enumerate_add_match_subsystem(e, "drm");
-       udev_enumerate_add_match_sysname(e, "renderD[0-9]*");
-       udev_enumerate_scan_devices(e);
-
-       udev_list_entry_foreach(entry, udev_enumerate_get_list_entry(e)) {
-               device = udev_device_new_from_syspath(udev_enumerate_get_udev(e),
-                                                     udev_list_entry_get_name(entry));
-               device_parent = udev_device_get_parent(device);
-               /* Not need unref device_parent. device_parent and device have same refcnt */
-               if (device_parent) {
-                       if (strcmp(udev_device_get_sysname(device_parent), "exynos-drm") == 0) {
-                               drm_device = device;
-                               TBM_DBG("Found render device: '%s' (%s)\n",
-                                   udev_device_get_syspath(drm_device),
-                                   udev_device_get_sysname(device_parent));
-                               break;
-                       }
-               }
-               udev_device_unref(device);
-       }
-
-       udev_enumerate_unref(e);
-       udev_unref(udev);
-
-       if (!drm_device) {
-               udev_device_unref(drm_device);
-               return 0;
-       }
-
-       udev_device_unref(drm_device);
-       return 1;
-#endif
-}
-
-static int
-_get_render_node(void)
+_get_render_node(int is_master)
 {
        struct udev *udev = NULL;
        struct udev_enumerate *e = NULL;
@@ -748,6 +632,8 @@ _get_render_node(void)
        int fd = -1;
        int ret;
 
+       TBM_DBG("search drm-device by udev(is_master:%d)\n", is_master);
+
        udev = udev_new();
        if (!udev) {
                TBM_ERR("udev_new() failed.\n");
@@ -756,7 +642,10 @@ _get_render_node(void)
 
        e = udev_enumerate_new(udev);
        udev_enumerate_add_match_subsystem(e, "drm");
-       udev_enumerate_add_match_sysname(e, "renderD[0-9]*");
+       if (is_master)
+               udev_enumerate_add_match_sysname(e, "card[0-9]*");
+       else
+               udev_enumerate_add_match_sysname(e, "renderD[0-9]*");
        udev_enumerate_scan_devices(e);
 
        udev_list_entry_foreach(entry, udev_enumerate_get_list_entry(e)) {
@@ -778,6 +667,12 @@ _get_render_node(void)
 
        udev_enumerate_unref(e);
 
+       if (!drm_device) {
+               TBM_ERR("failed to find device\n");
+               udev_unref(udev);
+               return -1;
+       }
+
        /* Get device file path. */
        filepath = udev_device_get_devnode(drm_device);
        if (!filepath) {
@@ -2188,16 +2083,8 @@ tbm_exynos_init(tbm_bufmgr bufmgr, tbm_error_e *error)
                        goto fail_get_device_name;
                }
        } else {
-               if (_check_render_node()) {
-                       bufmgr_exynos->fd = _get_render_node();
-                       if (bufmgr_exynos->fd < 0) {
-                               TBM_ERR("fail to get render node\n");
-                               if (error)
-                                       *error = TBM_ERROR_INVALID_OPERATION;
-                               goto fail_get_render_node;
-                       }
-                       TBM_DBG("Use render node:%d\n", bufmgr_exynos->fd);
-               } else {
+               bufmgr_exynos->fd = _get_render_node(0);
+               if (bufmgr_exynos->fd < 0) {
                        if (!tbm_drm_helper_get_auth_info(&(bufmgr_exynos->fd), &(bufmgr_exynos->device_name), NULL)) {
                                TBM_ERR("fail to get auth drm info!\n");
                                if (error)
@@ -2334,7 +2221,6 @@ fail_init_cache_state:
 fail_get_device_name:
        close(bufmgr_exynos->fd);
 fail_get_auth_info:
-fail_get_render_node:
 fail_open_drm:
        free(bufmgr_exynos);
        return NULL;