x86: Configure VESA parameters before loading Linux kernel
authorBin Meng <bmeng.cn@gmail.com>
Mon, 6 Jul 2015 08:31:36 +0000 (16:31 +0800)
committerSimon Glass <sjg@chromium.org>
Wed, 15 Jul 2015 00:03:19 +0000 (18:03 -0600)
Store VESA parameters to Linux setup header so that vesafb driver
in the kernel could work.

Signed-off-by: Bin Meng <bmeng.cn@gmail.com>
Acked-by: Simon Glass <sjg@chromium.org>
Tested-by: Jian Luo <jian.luo4@boschrexroth.de>
arch/x86/include/asm/zimage.h
arch/x86/lib/zimage.c
drivers/pci/pci_rom.c
include/vbe.h

index 8e7dd424ca5fdcff015ac2e305ab5ff63e7afa3e..bf351ed3b6306e64f171e582c1b98c435efe5e0d 100644 (file)
@@ -38,5 +38,6 @@ struct boot_params *load_zimage(char *image, unsigned long kernel_size,
                                ulong *load_addressp);
 int setup_zimage(struct boot_params *setup_base, char *cmd_line, int auto_boot,
                 unsigned long initrd_addr, unsigned long initrd_size);
+void setup_video(struct screen_info *screen_info);
 
 #endif
index c3f8a7308faaa2e84198083533a9a6b60ff9725a..144471c5bb7c49458382803c260c31f0938358f8 100644 (file)
@@ -273,6 +273,8 @@ int setup_zimage(struct boot_params *setup_base, char *cmd_line, int auto_boot,
                build_command_line(cmd_line, auto_boot);
        }
 
+       setup_video(&setup_base->screen_info);
+
        return 0;
 }
 
index dd7fd953caf70cdb1164d079a62a091c5ebdd4ca..e7f995971cebb1b003b3198abaa118fb997bf7d3 100644 (file)
@@ -31,6 +31,7 @@
 #include <pci_rom.h>
 #include <vbe.h>
 #include <video_fb.h>
+#include <linux/screen_info.h>
 
 #ifdef CONFIG_HAVE_ACPI_RESUME
 #include <asm/acpi.h>
@@ -230,6 +231,33 @@ int vbe_get_video_info(struct graphic_device *gdev)
 #endif
 }
 
+void setup_video(struct screen_info *screen_info)
+{
+#ifdef CONFIG_FRAMEBUFFER_SET_VESA_MODE
+       struct vesa_mode_info *vesa = &mode_info.vesa;
+
+       screen_info->orig_video_isVGA = VIDEO_TYPE_VLFB;
+
+       screen_info->lfb_width = vesa->x_resolution;
+       screen_info->lfb_height = vesa->y_resolution;
+       screen_info->lfb_depth = vesa->bits_per_pixel;
+       screen_info->lfb_linelength = vesa->bytes_per_scanline;
+       screen_info->lfb_base = vesa->phys_base_ptr;
+       screen_info->lfb_size =
+               ALIGN(screen_info->lfb_linelength * screen_info->lfb_height,
+                     65536);
+       screen_info->lfb_size >>= 16;
+       screen_info->red_size = vesa->red_mask_size;
+       screen_info->red_pos = vesa->red_mask_pos;
+       screen_info->green_size = vesa->green_mask_size;
+       screen_info->green_pos = vesa->green_mask_pos;
+       screen_info->blue_size = vesa->blue_mask_size;
+       screen_info->blue_pos = vesa->blue_mask_pos;
+       screen_info->rsvd_size = vesa->reserved_mask_size;
+       screen_info->rsvd_pos = vesa->reserved_mask_pos;
+#endif
+}
+
 int pci_run_vga_bios(pci_dev_t dev, int (*int15_handler)(void), int exec_method)
 {
        struct pci_rom_header *rom, *ram;
index c5deee9eca9d6e4c6997e6422c6d8cff802a3033..1a86db886adc7a0aed887017ba174cf70dbf3df7 100644 (file)
@@ -12,7 +12,7 @@
 #define _VBE_H
 
 /* these structs are for input from and output to OF */
-struct __packed screen_info {
+struct __packed vbe_screen_info {
        u8 display_type;        /* 0=NONE, 1= analog, 2=digital */
        u16 screen_width;
        u16 screen_height;
@@ -23,7 +23,7 @@ struct __packed screen_info {
        u8 edid_block_zero[128];
 };
 
-struct __packed screen_info_input {
+struct __packed vbe_screen_info_input {
        u8 signature[4];
        u16 size_reserved;
        u8 monitor_number;