On Fri, 29 Dec 2017 13:31:53 -0500 nerdopolis <bluescreen_aven...@verizon.net> wrote:
> virtual framebuffer devices that are created by a modesetting driver have the > same parent > as the drm card devices. Hi, is this also true for legacy fbdev drivers that are not DRM drivers? I suppose if not, they would just use the fallback path of not finding any boot-vga and will work ok? Only virtual fb devices? What about normal fb devices created by DRM drivers? The summary should be shorter, usually summaries should be much shorter than a normal line length. In this case, "Follow the same logic as compositor-drm, and " offers nothing more to identify this change. It should be said in the commit message body instead. > --- > 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; Leaks 'device'. That leak fixed, maybe 'fb_device' needs to be strdup'd? > 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); Thanks, pq
pgpQ2uHMw0Llh.pgp
Description: OpenPGP digital signature
_______________________________________________ wayland-devel mailing list wayland-devel@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/wayland-devel