"RDWR"
};
+static int _get_render_node(int is_master);
#ifdef TGL_GET_VERSION
static inline int
}
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;
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");
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)) {
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) {
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)
fail_get_device_name:
close(bufmgr_exynos->fd);
fail_get_auth_info:
-fail_get_render_node:
fail_open_drm:
free(bufmgr_exynos);
return NULL;