]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
vgacon: remove screen_info dependency
authorArnd Bergmann <arnd@arndb.de>
Mon, 9 Oct 2023 21:18:41 +0000 (23:18 +0200)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Tue, 17 Oct 2023 08:17:02 +0000 (10:17 +0200)
The vga console driver is fairly self-contained, and only used by
architectures that explicitly initialize the screen_info settings.

Chance every instance that picks the vga console by setting conswitchp
to call a function instead, and pass a reference to the screen_info
there.

Reviewed-by: Javier Martinez Canillas <javierm@redhat.com>
Acked-by: Khalid Azzi <khalid@gonehiking.org>
Acked-by: Helge Deller <deller@gmx.de>
Signed-off-by: Arnd Bergmann <arnd@arndb.de>
Link: https://lore.kernel.org/r/20231009211845.3136536-6-arnd@kernel.org
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
arch/alpha/kernel/setup.c
arch/arm/kernel/setup.c
arch/ia64/kernel/setup.c
arch/mips/kernel/setup.c
arch/x86/kernel/setup.c
drivers/firmware/pcdp.c
drivers/video/console/vgacon.c
include/linux/console.h

index 85a679ce061c258bc2788ad184987feb25835dc2..c004933468606a97ac3da7c709be9b93f69af541 100644 (file)
@@ -654,7 +654,7 @@ setup_arch(char **cmdline_p)
 
 #ifdef CONFIG_VT
 #if defined(CONFIG_VGA_CONSOLE)
-       conswitchp = &vga_con;
+       vgacon_register_screen(&screen_info);
 #endif
 #endif
 
index 40326a35a179bc6fd91bf82fb2d1fbf895e6a1a6..5d8a7fb3eba451709c630e5def3c7212922a3a0a 100644 (file)
@@ -1192,7 +1192,7 @@ void __init setup_arch(char **cmdline_p)
 
 #ifdef CONFIG_VT
 #if defined(CONFIG_VGA_CONSOLE)
-       conswitchp = &vga_con;
+       vgacon_register_screen(&screen_info);
 #endif
 #endif
 
index d2c66efdde560e6563c5c6d0f9031aba9ccc5b8f..2c9283fcd3759eb7fe42a64d6976a13d4f92f7c9 100644 (file)
@@ -619,7 +619,7 @@ setup_arch (char **cmdline_p)
                 * memory so we can avoid this problem.
                 */
                if (efi_mem_type(0xA0000) != EFI_CONVENTIONAL_MEMORY)
-                       conswitchp = &vga_con;
+                       vgacon_register_screen(&screen_info);
 # endif
        }
 #endif
index 1aba7dc95132c319ff8c875c4c57718f8021095d..6c3fae62a9f6bc881b70bce12affdf92247e7829 100644 (file)
@@ -794,7 +794,7 @@ void __init setup_arch(char **cmdline_p)
 
 #if defined(CONFIG_VT)
 #if defined(CONFIG_VGA_CONSOLE)
-       conswitchp = &vga_con;
+       vgacon_register_screen(&screen_info);
 #endif
 #endif
 
index b098b1fa2470816a35d7784d93c0e7ae0fc83f6d..d626e13c921a65ff27868fab5795279171131d59 100644 (file)
@@ -1290,7 +1290,7 @@ void __init setup_arch(char **cmdline_p)
 #ifdef CONFIG_VT
 #if defined(CONFIG_VGA_CONSOLE)
        if (!efi_enabled(EFI_BOOT) || (efi_mem_type(0xa0000) != EFI_CONVENTIONAL_MEMORY))
-               conswitchp = &vga_con;
+               vgacon_register_screen(&screen_info);
 #endif
 #endif
        x86_init.oem.banner();
index 715a45442d1cfe64378e1fa631d42ab64d1426a3..667a595373b2db002f35801f3cea824ac4513d36 100644 (file)
@@ -72,7 +72,7 @@ setup_vga_console(struct pcdp_device *dev)
                return -ENODEV;
        }
 
-       conswitchp = &vga_con;
+       vgacon_register_screen(&screen_info);
        printk(KERN_INFO "PCDP: VGA console\n");
        return 0;
 #else
index 7ad047bcae1711fb43476a86b099ce4cfe59b20c..8ef1579fa57fdda1b079a17247286d0c809018d9 100644 (file)
@@ -89,6 +89,8 @@ static int            vga_video_font_height;
 static int             vga_scan_lines          __read_mostly;
 static unsigned int    vga_rolled_over; /* last vc_origin offset before wrap */
 
+static struct screen_info *vga_si;
+
 static bool vga_hardscroll_enabled;
 static bool vga_hardscroll_user_enable = true;
 
@@ -153,8 +155,9 @@ static const char *vgacon_startup(void)
        u16 saved1, saved2;
        volatile u16 *p;
 
-       if (screen_info.orig_video_isVGA == VIDEO_TYPE_VLFB ||
-           screen_info.orig_video_isVGA == VIDEO_TYPE_EFI) {
+       if (!vga_si ||
+           vga_si->orig_video_isVGA == VIDEO_TYPE_VLFB ||
+           vga_si->orig_video_isVGA == VIDEO_TYPE_EFI) {
              no_vga:
 #ifdef CONFIG_DUMMY_CONSOLE
                conswitchp = &dummy_con;
@@ -164,29 +167,29 @@ static const char *vgacon_startup(void)
 #endif
        }
 
-       /* boot_params.screen_info reasonably initialized? */
-       if ((screen_info.orig_video_lines == 0) ||
-           (screen_info.orig_video_cols  == 0))
+       /* vga_si reasonably initialized? */
+       if ((vga_si->orig_video_lines == 0) ||
+           (vga_si->orig_video_cols  == 0))
                goto no_vga;
 
        /* VGA16 modes are not handled by VGACON */
-       if ((screen_info.orig_video_mode == 0x0D) ||    /* 320x200/4 */
-           (screen_info.orig_video_mode == 0x0E) ||    /* 640x200/4 */
-           (screen_info.orig_video_mode == 0x10) ||    /* 640x350/4 */
-           (screen_info.orig_video_mode == 0x12) ||    /* 640x480/4 */
-           (screen_info.orig_video_mode == 0x6A))      /* 800x600/4 (VESA) */
+       if ((vga_si->orig_video_mode == 0x0D) ||        /* 320x200/4 */
+           (vga_si->orig_video_mode == 0x0E) ||        /* 640x200/4 */
+           (vga_si->orig_video_mode == 0x10) ||        /* 640x350/4 */
+           (vga_si->orig_video_mode == 0x12) ||        /* 640x480/4 */
+           (vga_si->orig_video_mode == 0x6A))  /* 800x600/4 (VESA) */
                goto no_vga;
 
-       vga_video_num_lines = screen_info.orig_video_lines;
-       vga_video_num_columns = screen_info.orig_video_cols;
+       vga_video_num_lines = vga_si->orig_video_lines;
+       vga_video_num_columns = vga_si->orig_video_cols;
        vgastate.vgabase = NULL;
 
-       if (screen_info.orig_video_mode == 7) {
+       if (vga_si->orig_video_mode == 7) {
                /* Monochrome display */
                vga_vram_base = 0xb0000;
                vga_video_port_reg = VGA_CRT_IM;
                vga_video_port_val = VGA_CRT_DM;
-               if ((screen_info.orig_video_ega_bx & 0xff) != 0x10) {
+               if ((vga_si->orig_video_ega_bx & 0xff) != 0x10) {
                        static struct resource ega_console_resource =
                            { .name     = "ega",
                              .flags    = IORESOURCE_IO,
@@ -223,12 +226,12 @@ static const char *vgacon_startup(void)
                vga_vram_base = 0xb8000;
                vga_video_port_reg = VGA_CRT_IC;
                vga_video_port_val = VGA_CRT_DC;
-               if ((screen_info.orig_video_ega_bx & 0xff) != 0x10) {
+               if ((vga_si->orig_video_ega_bx & 0xff) != 0x10) {
                        int i;
 
                        vga_vram_size = 0x8000;
 
-                       if (!screen_info.orig_video_isVGA) {
+                       if (!vga_si->orig_video_isVGA) {
                                static struct resource ega_console_resource =
                                    { .name     = "ega",
                                      .flags    = IORESOURCE_IO,
@@ -319,14 +322,14 @@ static const char *vgacon_startup(void)
            || vga_video_type == VIDEO_TYPE_VGAC
            || vga_video_type == VIDEO_TYPE_EGAM) {
                vga_hardscroll_enabled = vga_hardscroll_user_enable;
-               vga_default_font_height = screen_info.orig_video_points;
-               vga_video_font_height = screen_info.orig_video_points;
+               vga_default_font_height = vga_si->orig_video_points;
+               vga_video_font_height = vga_si->orig_video_points;
                /* This may be suboptimal but is a safe bet - go with it */
                vga_scan_lines =
                    vga_video_font_height * vga_video_num_lines;
        }
 
-       vgacon_xres = screen_info.orig_video_cols * VGA_FONTWIDTH;
+       vgacon_xres = vga_si->orig_video_cols * VGA_FONTWIDTH;
        vgacon_yres = vga_scan_lines;
 
        return display_desc;
@@ -371,7 +374,7 @@ static void vgacon_init(struct vc_data *c, int init)
        /* Only set the default if the user didn't deliberately override it */
        if (global_cursor_default == -1)
                global_cursor_default =
-                       !(screen_info.flags & VIDEO_FLAGS_NOCURSOR);
+                       !(vga_si->flags & VIDEO_FLAGS_NOCURSOR);
 }
 
 static void vgacon_deinit(struct vc_data *c)
@@ -589,7 +592,7 @@ static int vgacon_switch(struct vc_data *c)
 {
        int x = c->vc_cols * VGA_FONTWIDTH;
        int y = c->vc_rows * c->vc_cell_height;
-       int rows = screen_info.orig_video_lines * vga_default_font_height/
+       int rows = vga_si->orig_video_lines * vga_default_font_height/
                c->vc_cell_height;
        /*
         * We need to save screen size here as it's the only way
@@ -609,7 +612,7 @@ static int vgacon_switch(struct vc_data *c)
 
                if ((vgacon_xres != x || vgacon_yres != y) &&
                    (!(vga_video_num_columns % 2) &&
-                    vga_video_num_columns <= screen_info.orig_video_cols &&
+                    vga_video_num_columns <= vga_si->orig_video_cols &&
                     vga_video_num_lines <= rows))
                        vgacon_doresize(c, c->vc_cols, c->vc_rows);
        }
@@ -1056,13 +1059,13 @@ static int vgacon_resize(struct vc_data *c, unsigned int width,
                 * Ho ho!  Someone (svgatextmode, eh?) may have reprogrammed
                 * the video mode!  Set the new defaults then and go away.
                 */
-               screen_info.orig_video_cols = width;
-               screen_info.orig_video_lines = height;
+               vga_si->orig_video_cols = width;
+               vga_si->orig_video_lines = height;
                vga_default_font_height = c->vc_cell_height;
                return 0;
        }
-       if (width % 2 || width > screen_info.orig_video_cols ||
-           height > (screen_info.orig_video_lines * vga_default_font_height)/
+       if (width % 2 || width > vga_si->orig_video_cols ||
+           height > (vga_si->orig_video_lines * vga_default_font_height)/
            c->vc_cell_height)
                return -EINVAL;
 
@@ -1092,8 +1095,8 @@ static void vgacon_save_screen(struct vc_data *c)
                 * console initialization routines.
                 */
                vga_bootup_console = 1;
-               c->state.x = screen_info.orig_x;
-               c->state.y = screen_info.orig_y;
+               c->state.x = vga_si->orig_x;
+               c->state.y = vga_si->orig_y;
        }
 
        /* We can't copy in more than the size of the video buffer,
@@ -1186,4 +1189,13 @@ const struct consw vga_con = {
 };
 EXPORT_SYMBOL(vga_con);
 
+void vgacon_register_screen(struct screen_info *si)
+{
+       if (!si || vga_si)
+               return;
+
+       conswitchp = &vga_con;
+       vga_si = si;
+}
+
 MODULE_LICENSE("GPL");
index 7de11c763eb35deed528272727bf2f2bf4d18701..5ff6f11c47b18413ace14390037c518a70e5d68b 100644 (file)
@@ -101,6 +101,13 @@ extern const struct consw dummy_con;       /* dummy console buffer */
 extern const struct consw vga_con;     /* VGA text console */
 extern const struct consw newport_con; /* SGI Newport console  */
 
+struct screen_info;
+#ifdef CONFIG_VGA_CONSOLE
+void vgacon_register_screen(struct screen_info *si);
+#else
+static inline void vgacon_register_screen(struct screen_info *si) { }
+#endif
+
 int con_is_bound(const struct consw *csw);
 int do_unregister_con_driver(const struct consw *csw);
 int do_take_over_console(const struct consw *sw, int first, int last, int deflt);