summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChangyeon Lee <cyeon.lee@samsung.com>2023-07-12 15:24:07 +0900
committerChangyeon Lee <cyeon.lee@samsung.com>2023-07-12 16:35:10 +0900
commit7e49ccd2d2980b82dc5c42902a85f066174b1f19 (patch)
tree4fe6d5853ceb46071d5d90815ca2b0b92224bdf8
parent0e8e19e4259eb6c1e0611bdb39d9f9029d8e6bfe (diff)
downloadlibtbm-dumb-7e49ccd2d2980b82dc5c42902a85f066174b1f19.tar.gz
libtbm-dumb-7e49ccd2d2980b82dc5c42902a85f066174b1f19.tar.bz2
libtbm-dumb-7e49ccd2d2980b82dc5c42902a85f066174b1f19.zip
Check kms device in find primary gpu
Change-Id: I4a8904d4e12062e8fb8f94b2276741230f2ec50a
-rw-r--r--src/tbm_backend_dumb.c151
1 files changed, 104 insertions, 47 deletions
diff --git a/src/tbm_backend_dumb.c b/src/tbm_backend_dumb.c
index b313a90..b3bbd2c 100644
--- a/src/tbm_backend_dumb.c
+++ b/src/tbm_backend_dumb.c
@@ -46,6 +46,7 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
#include <fcntl.h>
#include <errno.h>
#include <xf86drm.h>
+#include <xf86drmMode.h>
#include <pthread.h>
#include <hal-common.h>
#include <hal-tbm-types.h>
@@ -147,83 +148,139 @@ static uint32_t tbm_dumb_color_format_list[TBM_COLOR_FORMAT_COUNT] = {
};
static int
-_tbm_dumb_open_drm()
+_tbm_dumb_is_kms(struct udev_device *device)
{
- struct udev *udev = NULL;
- struct udev_enumerate *e = NULL;
- struct udev_list_entry *entry = NULL;
- struct udev_device *device = NULL, *drm_device = NULL, *pci = NULL;
- const char *filepath, *id;
- struct stat s;
- int fd = -1;
- int ret;
+ drmModeRes *res;
+ int fd = -1, id = -1;
+ const char *file_name;
+ const char *sys_num;
+
+ file_name = udev_device_get_devnode(device);
+ if (!file_name) return 0;
+
+ TBM_BACKEND_INFO("check kms device:%s", file_name);
+
+ sys_num = udev_device_get_sysnum(device);
+ if (!sys_num) return 0;
+
+ id = atoi(sys_num);
+ if (id < 0) return 0;
+
+ fd = open(file_name, O_RDWR | O_CLOEXEC);
+ if (fd < 0) {
+ TBM_BACKEND_ERR("Cannot open drm device(%s)", file_name);
+ return 0;
+ }
+
+ res = drmModeGetResources(fd);
+ if (!res) goto fail;
+
+ if ((res->count_crtcs <= 0) || (res->count_connectors <= 0) ||
+ (res->count_encoders <= 0))
+ goto fail;
+
+ close(fd);
+ drmModeFreeResources(res);
+
+ return 1;
+
+fail:
+ if (fd >= 0) close(fd);
+ if (res) drmModeFreeResources(res);
+
+ return 0;
+}
+
+static struct udev_device *
+_tbm_dumb_find_primary_gpu(void)
+{
+ struct udev *udev;
+ struct udev_enumerate *e;
+ struct udev_list_entry *entry;
+ const char *path, *id;
+ struct udev_device *device, *drm_device, *pci;
udev = udev_new();
if (!udev) {
- TBM_BACKEND_ERR("udev_new() failed.\n");
- return -1;
+ TBM_BACKEND_ERR("fail to initialize udev context\n");
+ return NULL;
}
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_enumerate_scan_devices(e);
drm_device = NULL;
udev_list_entry_foreach(entry, udev_enumerate_get_list_entry(e)) {
- filepath = udev_list_entry_get_name(entry);
- device = udev_device_new_from_syspath(udev, filepath);
+ int is_boot_vga;
+
+ path = udev_list_entry_get_name(entry);
+ device = udev_device_new_from_syspath(udev, path);
if (!device)
continue;
- pci = udev_device_get_parent_with_subsystem_devtype(device, "pci", NULL);
+ pci = udev_device_get_parent_with_subsystem_devtype(device,
+ "pci", NULL);
if (pci) {
id = udev_device_get_sysattr_value(pci, "boot_vga");
- if (id && !strcmp(id, "1")) {
- if (drm_device)
- udev_device_unref(drm_device);
- drm_device = device;
- break;
- }
+ if (id && !strcmp(id, "1"))
+ is_boot_vga = 1;
}
- if (!drm_device)
- drm_device = device;
- else
+ if (!is_boot_vga && drm_device) {
+ udev_device_unref(device);
+ continue;
+ }
+
+ if (!_tbm_dumb_is_kms(device)) {
udev_device_unref(device);
+ continue;
+ }
+
+ if (is_boot_vga) {
+ if (drm_device)
+ udev_device_unref(drm_device);
+ drm_device = device;
+ break;
+ }
+
+ drm_device = device;
}
udev_enumerate_unref(e);
- /* Get device file path. */
- filepath = udev_device_get_devnode(drm_device);
- if (!filepath) {
- TBM_BACKEND_ERR("udev_device_get_devnode() failed.\n");
- udev_device_unref(drm_device);
- udev_unref(udev);
- return -1;
+ return drm_device;
+}
+
+static int
+_tbm_dumb_open_drm(void)
+{
+ int fd = -1;
+ struct udev_device *drm_device = NULL;
+ const char *file_name;
+
+ drm_device = _tbm_dumb_find_primary_gpu();
+ if (!drm_device) {
+ TBM_BACKEND_ERR("fail to find drm device");
+ goto ret;
}
- /* Open DRM device file and check validity. */
- fd = open(filepath, O_RDWR | O_CLOEXEC);
- if (fd < 0) {
- TBM_BACKEND_ERR("open(%s, O_RDWR | O_CLOEXEC) failed.\n");
- udev_device_unref(drm_device);
- udev_unref(udev);
- return -1;
+ file_name = udev_device_get_devnode(drm_device);
+ if (!file_name) {
+ TBM_BACKEND_ERR("fail to get devnode");
+ goto ret;
}
- ret = fstat(fd, &s);
- if (ret) {
- TBM_BACKEND_ERR("fstat() failed %s.\n");
- close(fd);
- udev_device_unref(drm_device);
- udev_unref(udev);
- return -1;
+ fd = open(file_name, O_RDWR | O_CLOEXEC);
+ if (fd < 0) {
+ TBM_BACKEND_ERR("Cannot open drm device(%s)", file_name);
+ goto ret;
}
- udev_device_unref(drm_device);
- udev_unref(udev);
+ TBM_BACKEND_INFO("open drm device (name:%s, fd:%d)", file_name, fd);
+ret:
+ if (drm_device) udev_device_unref(drm_device);
return fd;
}