61f6bb5
From bdfcf889f8cda47190d98fa8a3e401a1db38074c Mon Sep 17 00:00:00 2001
61f6bb5
From: Ray Strode <rstrode@redhat.com>
61f6bb5
Date: Tue, 7 Nov 2017 13:49:30 -0500
61f6bb5
Subject: [PATCH] device-manager: fall back to text mode if graphical devices
61f6bb5
 fail
61f6bb5
61f6bb5
Right now we assume if we find a /dev/dri/card0 that it will work.
61f6bb5
That may not be true. The proprietary nvidia driver, for instance,
61f6bb5
provides /dev/dri/card0 but disables modesetting by default.
61f6bb5
61f6bb5
This commit makes sure we fall back to text mode if /dev/dri/card0
61f6bb5
is insufficient for our needs.
61f6bb5
61f6bb5
https://bugs.freedesktop.org/show_bug.cgi?id=103612
61f6bb5
---
61f6bb5
 src/libply-splash-core/ply-device-manager.c | 26 ++++++++++++---------
61f6bb5
 1 file changed, 15 insertions(+), 11 deletions(-)
61f6bb5
61f6bb5
diff --git a/src/libply-splash-core/ply-device-manager.c b/src/libply-splash-core/ply-device-manager.c
61f6bb5
index b4c33d4..cf56f4e 100644
61f6bb5
--- a/src/libply-splash-core/ply-device-manager.c
61f6bb5
+++ b/src/libply-splash-core/ply-device-manager.c
61f6bb5
@@ -47,7 +47,7 @@
61f6bb5
 static void create_devices_from_udev (ply_device_manager_t *manager);
61f6bb5
 #endif
61f6bb5
 
61f6bb5
-static void create_devices_for_terminal_and_renderer_type (ply_device_manager_t *manager,
61f6bb5
+static bool create_devices_for_terminal_and_renderer_type (ply_device_manager_t *manager,
61f6bb5
                                                            const char           *device_path,
61f6bb5
                                                            ply_terminal_t       *terminal,
61f6bb5
                                                            ply_renderer_type_t   renderer_type);
61f6bb5
@@ -212,11 +212,12 @@ fb_device_has_drm_device (ply_device_manager_t *manager,
61f6bb5
         return has_drm_device;
61f6bb5
 }
61f6bb5
 
61f6bb5
-static void
61f6bb5
+static bool
61f6bb5
 create_devices_for_udev_device (ply_device_manager_t *manager,
61f6bb5
                                 struct udev_device   *device)
61f6bb5
 {
61f6bb5
         const char *device_path;
61f6bb5
+        bool created = false;
61f6bb5
 
61f6bb5
         device_path = udev_device_get_devnode (device);
61f6bb5
 
61f6bb5
@@ -245,12 +246,14 @@ create_devices_for_udev_device (ply_device_manager_t *manager,
61f6bb5
                                 terminal = manager->local_console_terminal;
61f6bb5
                         }
61f6bb5
 
61f6bb5
-                        create_devices_for_terminal_and_renderer_type (manager,
61f6bb5
-                                                                    device_path,
61f6bb5
-                                                                    terminal,
61f6bb5
-                                                                    renderer_type);
61f6bb5
+                        created = create_devices_for_terminal_and_renderer_type (manager,
61f6bb5
+                                                                                 device_path,
61f6bb5
+                                                                                 terminal,
61f6bb5
+                                                                                 renderer_type);
61f6bb5
                 }
61f6bb5
         }
61f6bb5
+
61f6bb5
+        return created;
61f6bb5
 }
61f6bb5
 
61f6bb5
 static void
61f6bb5
@@ -310,8 +313,7 @@ create_devices_for_subsystem (ply_device_manager_t *manager,
61f6bb5
                                 node = udev_device_get_devnode (device);
61f6bb5
                                 if (node != NULL) {
61f6bb5
                                         ply_trace ("found node %s", node);
61f6bb5
-                                        found_device = true;
61f6bb5
-                                        create_devices_for_udev_device (manager, device);
61f6bb5
+                                        found_device = create_devices_for_udev_device (manager, device);
61f6bb5
                                 }
61f6bb5
                         } else {
61f6bb5
                                 ply_trace ("device doesn't have a devices tag");
61f6bb5
@@ -656,7 +658,7 @@ create_text_displays_for_terminal (ply_device_manager_t *manager,
61f6bb5
           manager->text_display_added_handler (manager->event_handler_data, display);
61f6bb5
 }
61f6bb5
 
61f6bb5
-static void
61f6bb5
+static bool
61f6bb5
 create_devices_for_terminal_and_renderer_type (ply_device_manager_t *manager,
61f6bb5
                                                const char           *device_path,
61f6bb5
                                                ply_terminal_t       *terminal,
61f6bb5
@@ -670,7 +672,7 @@ create_devices_for_terminal_and_renderer_type (ply_device_manager_t *manager,
61f6bb5
 
61f6bb5
         if (renderer != NULL) {
61f6bb5
                 ply_trace ("ignoring device %s since it's already managed", device_path);
61f6bb5
-                return;
61f6bb5
+                return true;
61f6bb5
         }
61f6bb5
 
61f6bb5
         ply_trace ("creating devices for %s (renderer type: %u) (terminal: %s)",
61f6bb5
@@ -686,7 +688,7 @@ create_devices_for_terminal_and_renderer_type (ply_device_manager_t *manager,
61f6bb5
                         renderer = NULL;
61f6bb5
 
61f6bb5
                         if (renderer_type != PLY_RENDERER_TYPE_AUTO)
61f6bb5
-                                return;
61f6bb5
+                                return false;
61f6bb5
                 }
61f6bb5
 
61f6bb5
                 if (renderer != NULL) {
61f6bb5
@@ -743,6 +745,8 @@ create_devices_for_terminal_and_renderer_type (ply_device_manager_t *manager,
61f6bb5
                 ply_trace ("activating keyboards");
61f6bb5
                 ply_keyboard_watch_for_input (keyboard);
61f6bb5
         }
61f6bb5
+
61f6bb5
+        return true;
61f6bb5
 }
61f6bb5
 
61f6bb5
 static void
61f6bb5
-- 
61f6bb5
2.17.1
61f6bb5