[PATCH v5 7/7] libweston: fbdev: Follow the same logic as compositor-drm, and favor the boot_vga device
nerdopolis
bluescreen_avenger at verizon.net
Fri Dec 29 18:31:53 UTC 2017
virtual framebuffer devices that are created by a modesetting driver have the same parent
as the drm card devices.
---
libweston/compositor-fbdev.c | 40 ++++++++++++++++++++++++++++++++++------
1 file changed, 34 insertions(+), 6 deletions(-)
diff --git a/libweston/compositor-fbdev.c b/libweston/compositor-fbdev.c
index 34e6c2f3..139d6624 100644
--- a/libweston/compositor-fbdev.c
+++ b/libweston/compositor-fbdev.c
@@ -717,8 +717,8 @@ find_framebuffer_device(struct fbdev_backend *b, const char *seat)
struct udev_enumerate *e;
struct udev_list_entry *entry;
const char *path, *device_seat;
- char *fb_device;
- struct udev_device *device;
+ char *fb_device, *find_device, *id;
+ struct udev_device *device, *pci;
e = udev_enumerate_new(b->udev);
udev_enumerate_add_match_subsystem(e, "graphics");
@@ -727,20 +727,48 @@ find_framebuffer_device(struct fbdev_backend *b, const char *seat)
udev_enumerate_scan_devices(e);
fb_device = NULL;
udev_list_entry_foreach(entry, udev_enumerate_get_list_entry(e)) {
+ bool is_boot_vga = false;
path = udev_list_entry_get_name(entry);
device = udev_device_new_from_syspath(b->udev, path);
+ find_device = udev_device_get_devnode(device);
if (!device)
continue;
device_seat = udev_device_get_property_value(device, "ID_SEAT");
if (!device_seat)
device_seat = default_seat;
- if (!strcmp(device_seat, seat)) {
- fb_device = udev_device_get_devnode(device);
- udev_enumerate_unref(e);
+ if (strcmp(device_seat, seat)) {
+ udev_device_unref(device);
+ continue;
+ }
+
+ 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"))
+ is_boot_vga = true;
+ }
+
+ /* If a framebuffer device was found, and this device isn't
+ * the boot-VGA device, don't use it. */
+ if (!is_boot_vga && fb_device) {
+ udev_device_unref(device);
+ continue;
+ }
+
+ /* There can only be one boot_vga device. Try to use it
+ * at all costs. */
+ if (is_boot_vga) {
+ fb_device = find_device;
break;
}
- udev_device_unref(device);
+
+ /* Per the (!is_boot_vga && fb_device) test above, only
+ * trump existing saved devices with boot-VGA devices, so if
+ * the test ends up here, this must be the first device seen. */
+ assert(!fb_device);
+ fb_device = find_device;
}
udev_enumerate_unref(e);
--
2.14.1
More information about the wayland-devel
mailing list