From: Fabian Vogt Subject: force fb for cirrus and bochs, force drm otherwise References: bsc#888590, bsc#980750 DRM does not work well with cirrus and bochs (no display) but the framebuffer driver prevents DRM drivers from loading. As we need to support cirrus for libvirt and bochs for QEMU, we cannot just remove support for frame-buffer. Index: plymouth-0.9.2+git20161215.18dd755/src/libply-splash-core/ply-device-manager.c =================================================================== --- plymouth-0.9.2+git20161215.18dd755.orig/src/libply-splash-core/ply-device-manager.c +++ plymouth-0.9.2+git20161215.18dd755/src/libply-splash-core/ply-device-manager.c @@ -227,13 +227,33 @@ create_devices_for_udev_device (ply_devi subsystem = udev_device_get_subsystem (device); ply_trace ("device subsystem is %s", subsystem); + const char *card_vendor = udev_device_get_sysattr_value (device, "device/vendor"); + const char *card_device = udev_device_get_sysattr_value (device, "device/device"); + bool use_fb = false; + if (card_vendor) { + /* Cirrus */ + if (strcmp ("0x1013", card_vendor) == 0) + use_fb = true; + /* "Technical Corp", also used by bochs */ + else if (strcmp ("0x1234", card_vendor) == 0) + use_fb = strcmp("0x1111", card_device) == 0; + } + if (subsystem != NULL && strcmp (subsystem, SUBSYSTEM_DRM) == 0) { ply_trace ("found DRM device %s", device_path); renderer_type = PLY_RENDERER_TYPE_DRM; + if (use_fb) { + ply_trace ("forcing use of framebuffer for cirrusdrmfb"); + renderer_type = PLY_RENDERER_TYPE_NONE; + } } else if (strcmp (subsystem, SUBSYSTEM_FRAME_BUFFER) == 0) { ply_trace ("found frame buffer device %s", device_path); - if (!fb_device_has_drm_device (manager, device)) + if (use_fb) { renderer_type = PLY_RENDERER_TYPE_FRAME_BUFFER; + } + else if (!fb_device_has_drm_device (manager, device)) { + ply_trace ("avoiding use of framebuffer to not block DRM drivers from working"); + } else ply_trace ("ignoring, since there's a DRM device associated with it"); }