From df040e455bb600565bc0933196c21c46bc477917 Mon Sep 17 00:00:00 2001 From: Patrick Lerda Date: Fri, 19 Apr 2024 16:01:12 +0200 Subject: [PATCH] modesetting: find the first compatible dri device as default This change replaces the default "/dev/dri/card0" by a loop which searches for the first compatible device. This change avoids the error below which happens on some ARM boards: (EE) No devices detected. (EE) Fatal server error: (EE) no screens found(EE) (EE) Signed-off-by: Patrick Lerda --- hw/xfree86/drivers/modesetting/driver.c | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) diff --git a/hw/xfree86/drivers/modesetting/driver.c b/hw/xfree86/drivers/modesetting/driver.c index f3400a1cd..3dc736900 100644 --- a/hw/xfree86/drivers/modesetting/driver.c +++ b/hw/xfree86/drivers/modesetting/driver.c @@ -227,6 +227,7 @@ get_passed_fd(void) static int open_hw(const char *dev) { + char drm_name[] = "/dev/dri/card0"; int fd; if ((fd = get_passed_fd()) != -1) @@ -237,8 +238,22 @@ open_hw(const char *dev) else { dev = getenv("KMSDEVICE"); if ((NULL == dev) || ((fd = open(dev, O_RDWR | O_CLOEXEC, 0)) == -1)) { - dev = "/dev/dri/card0"; - fd = open(dev, O_RDWR | O_CLOEXEC, 0); + int i; + + for (i = 0, dev=drm_name; i < 8; i++) { + drm_name[13] = '0' + i; + + if ((fd = open(drm_name, O_RDWR | O_CLOEXEC, 0)) >= 0) { + uint64_t check_dumb = 0; + + if (drmGetCap(fd, DRM_CAP_DUMB_BUFFER, &check_dumb) >= 0 && check_dumb) + break; + + close(fd); + + fd = -1; + } + } } } if (fd == -1)