]> git.dujemihanovic.xyz Git - u-boot.git/commitdiff
efi_loader: initialize console size late
authorHeinrich Schuchardt <xypron.glpk@gmx.de>
Tue, 14 Jun 2022 06:02:03 +0000 (08:02 +0200)
committerHeinrich Schuchardt <heinrich.schuchardt@canonical.com>
Sun, 19 Jun 2022 13:53:09 +0000 (15:53 +0200)
If CONFIG_VIDEO_DM=n we query the display size from the serial console.
Especially when using a remote console the response can be so late that
it interferes with autoboot.

Only query the console size when running an EFI binary.

Add debug output showing the determined console size.

Reported-by: Fabio Estevam <festevam@gmail.com>
Fixes: a57ad20d07e8 ("efi_loader: split efi_init_obj_list() into two stages")
Fixes: a9bf024b2933 ("efi_loader: disk: a helper function to create efi_disk objects from udevice")
Signed-off-by: Heinrich Schuchardt <heinrich.schuchardt@canonical.com>
Tested-by: Fabio Estevam <festevam@denx.de>
Tested-by: Heiko Thiery <heiko.thiery@gmail.com>
include/efi_loader.h
lib/efi_loader/efi_console.c
lib/efi_loader/efi_setup.c

index f6651e2c6040506226496dac242bcc162ee0d07d..c1e00ebac398c4372f3b689e5d7347f22c72e03a 100644 (file)
@@ -499,6 +499,8 @@ extern struct list_head efi_register_notify_events;
 int efi_init_early(void);
 /* Initialize efi execution environment */
 efi_status_t efi_init_obj_list(void);
+/* Set up console modes */
+void efi_setup_console_size(void);
 /* Install device tree */
 efi_status_t efi_install_fdt(void *fdt);
 /* Run loaded UEFI image */
index 60a3fc85ac458294b8cced8b5757dc2b1c2f2965..3164fd484e22b60a038d2c41e29ba768122b69db 100644 (file)
@@ -5,6 +5,8 @@
  *  Copyright (c) 2016 Alexander Graf
  */
 
+#define LOG_CATEGORY LOGC_EFI
+
 #include <common.h>
 #include <charset.h>
 #include <malloc.h>
@@ -12,6 +14,7 @@
 #include <dm/device.h>
 #include <efi_loader.h>
 #include <env.h>
+#include <log.h>
 #include <stdio_dev.h>
 #include <video_console.h>
 #include <linux/delay.h>
@@ -58,7 +61,12 @@ const efi_guid_t efi_guid_text_output_protocol =
 #define cESC '\x1b'
 #define ESC "\x1b"
 
-/* Default to mode 0 */
+/*
+ * efi_con_mode - mode information of the Simple Text Output Protocol
+ *
+ * Use safe settings before efi_setup_console_size() is called.
+ * By default enable only the 80x25 mode which must always exist.
+ */
 static struct simple_text_output_mode efi_con_mode = {
        .max_mode = 1,
        .mode = 0,
@@ -333,13 +341,13 @@ static int __maybe_unused query_vidconsole(int *rows, int *cols)
 }
 
 /**
- * query_console_size() - update the mode table.
+ * efi_setup_console_size() - update the mode table.
  *
  * By default the only mode available is 80x25. If the console has at least 50
  * lines, enable mode 80x50. If we can query the console size and it is neither
  * 80x25 nor 80x50, set it as an additional mode.
  */
-static void query_console_size(void)
+void efi_setup_console_size(void)
 {
        int rows = 25, cols = 80;
        int ret = -ENODEV;
@@ -351,6 +359,8 @@ static void query_console_size(void)
        if (ret)
                return;
 
+       log_debug("Console size %dx%d\n", rows, cols);
+
        /* Test if we can have Mode 1 */
        if (cols >= 80 && rows >= 50) {
                efi_cout_modes[1].present = 1;
@@ -371,7 +381,6 @@ static void query_console_size(void)
        }
 }
 
-
 /**
  * efi_cout_query_mode() - get terminal size for a text mode
  *
@@ -1262,9 +1271,6 @@ efi_status_t efi_console_register(void)
        efi_status_t r;
        struct efi_device_path *dp;
 
-       /* Set up mode information */
-       query_console_size();
-
        /* Install protocols on root node */
        r = EFI_CALL(efi_install_multiple_protocol_interfaces
                     (&efi_root,
index 250eeb2fcd6b648269ac5e385022a3160bb0c552..492ecf4cb15c93bc00a8afbf4a3b251a5cabf1b4 100644 (file)
@@ -243,6 +243,10 @@ efi_status_t efi_init_obj_list(void)
                        goto out;
        }
 
+       /* Set up console modes */
+       efi_setup_console_size();
+
+       /* Install EFI_RNG_PROTOCOL */
        if (IS_ENABLED(CONFIG_EFI_RNG_PROTOCOL)) {
                ret = efi_rng_register();
                if (ret != EFI_SUCCESS)