diff options
Diffstat (limited to '0009-fbcon-Only-defer-console-takeover-if-the-current-con.patch')
-rw-r--r-- | 0009-fbcon-Only-defer-console-takeover-if-the-current-con.patch | 100 |
1 files changed, 100 insertions, 0 deletions
diff --git a/0009-fbcon-Only-defer-console-takeover-if-the-current-con.patch b/0009-fbcon-Only-defer-console-takeover-if-the-current-con.patch new file mode 100644 index 000000000..8735a62eb --- /dev/null +++ b/0009-fbcon-Only-defer-console-takeover-if-the-current-con.patch @@ -0,0 +1,100 @@ +From 317b698406457eb97277d4220126683a59c74fd8 Mon Sep 17 00:00:00 2001 +From: Hans de Goede <hdegoede@redhat.com> +Date: Wed, 1 Aug 2018 15:19:52 +0200 +Subject: [PATCH] fbcon: Only defer console takeover if the current + console driver is the dummycon + +We rely on dummycon's output notifier mechanism to defer the takeover. + +If say vgacon is the current console driver then dummycon will never get +used so its output notifier will also never get called and fbcon never +takes over. This commit fixes this by only deferring the console takeover +if the current console driver is the dummycon driver. + +This commit also moves the entirety of fbcon_start under the console_lock, +since the conswitchp which fbcon_start now checks is protected by it. + +This commit also inlines fbcon_register_output_notifier, since we now +need a #ifdef CONFIG_FRAMEBUFFER_CONSOLE_DEFERRED_TAKEOVER in fbcon_start +anyways because of the write access to the deferred_takeover variable, +this has the added advantage that it puts the +dummycon_register_output_notifier() call directly after the "conswitchp != +&dummy_con" comparison making it clear why that check is there. + +Note the arch setup code will set conswitchp to either dummy_con or +vga_con, in the cases where it gets set to vga_con even though their is +no vga_con present we rely on vga_con_startup() to set conswitchp to +dummy_con. vga_con_startup() is guaranteed to happen before +fb_console_init() as it gets called as a console_initcall where as +fb_console_init() gets called as a subsys_initcall. + +Signed-off-by: Hans de Goede <hdegoede@redhat.com> +--- + drivers/video/fbdev/core/fbcon.c | 24 ++++++++++-------------- + 1 file changed, 10 insertions(+), 14 deletions(-) + +diff --git a/drivers/video/fbdev/core/fbcon.c b/drivers/video/fbdev/core/fbcon.c +index e30d3a138c97..ef8b2d0b7071 100644 +--- a/drivers/video/fbdev/core/fbcon.c ++++ b/drivers/video/fbdev/core/fbcon.c +@@ -3612,38 +3612,34 @@ static int fbcon_output_notifier(struct notifier_block *nb, + + return NOTIFY_OK; + } +- +-static void fbcon_register_output_notifier(void) +-{ +- fbcon_output_nb.notifier_call = fbcon_output_notifier; +- dummycon_register_output_notifier(&fbcon_output_nb); +-} +-#else +-static inline void fbcon_register_output_notifier(void) {} + #endif + + static void fbcon_start(void) + { ++ WARN_CONSOLE_UNLOCKED(); ++ ++#ifdef CONFIG_FRAMEBUFFER_CONSOLE_DEFERRED_TAKEOVER ++ if (conswitchp != &dummy_con) ++ deferred_takeover = false; ++ + if (deferred_takeover) { +- fbcon_register_output_notifier(); ++ fbcon_output_nb.notifier_call = fbcon_output_notifier; ++ dummycon_register_output_notifier(&fbcon_output_nb); + return; + } ++#endif + + if (num_registered_fb) { + int i; + +- console_lock(); +- + for (i = 0; i < FB_MAX; i++) { + if (registered_fb[i] != NULL) { + info_idx = i; + break; + } + } + + do_fbcon_takeover(0); +- console_unlock(); +- + } + } + +@@ -3724,8 +3720,8 @@ void __init fb_console_init(void) + for (i = 0; i < MAX_NR_CONSOLES; i++) + con2fb_map[i] = -1; + +- console_unlock(); + fbcon_start(); ++ console_unlock(); + } + + #ifdef MODULE +-- +2.18.0 + |