From db7a3ae8635a92764d357a93c04f49e9d9bbdca7 Mon Sep 17 00:00:00 2001 From: Johanna Schander Date: Wed, 24 Jul 2019 10:14:26 +0200 Subject: src/device/oprom: Fix bootsplash display code for optionroms MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit So far the bootsplash is only correctly rendered if the framebuffer is set up as 1024x768@16. Different resolutions did not show anything, differnent depth resulted in the distorted images. This commit removes this limit by using the actual framebuffer resolutions and combines the code for x86 and yabel. For the moment the bootsplash is still limited to VGA-OptionROM framebuffer init. It was tested in 1280x1024@32 on the wip razer blade stealth using the intel vgabios. Change-Id: I5ab7b8a0f28badaa16e25dbe807158870d06e26a Signed-off-by: Johanna Schander Reviewed-on: https://review.coreboot.org/c/coreboot/+/34537 Reviewed-by: Kyösti Mälkki Reviewed-by: Patrick Georgi Reviewed-by: Paul Menzel Tested-by: build bot (Jenkins) --- src/device/oprom/realmode/x86.c | 25 +++++++++--------------- src/device/oprom/yabel/vbe.c | 43 ++++++++--------------------------------- 2 files changed, 17 insertions(+), 51 deletions(-) (limited to 'src/device/oprom') diff --git a/src/device/oprom/realmode/x86.c b/src/device/oprom/realmode/x86.c index 67e550cd5e..1a80a000e2 100644 --- a/src/device/oprom/realmode/x86.c +++ b/src/device/oprom/realmode/x86.c @@ -18,14 +18,12 @@ #include #include #include -#include #include #include #include #include #include #include -#include #include #include #include @@ -223,7 +221,7 @@ static void setup_realmode_idt(void) } #if CONFIG(FRAMEBUFFER_SET_VESA_MODE) -vbe_mode_info_t mode_info; +static vbe_mode_info_t mode_info; static int mode_info_valid; static int vbe_mode_info_valid(void) @@ -231,6 +229,13 @@ static int vbe_mode_info_valid(void) return mode_info_valid; } +const vbe_mode_info_t *vbe_mode_info(void) +{ + if (!mode_info_valid || !mode_info.vesa.phys_base_ptr) + return NULL; + return &mode_info; +} + static int vbe_check_for_failure(int ah); static void vbe_get_ctrl_info(vbe_info_block *info) @@ -353,6 +358,7 @@ void vbe_set_graphics(void) le16_to_cpu(mode_info.vesa.x_resolution), le16_to_cpu(mode_info.vesa.y_resolution), mode_info.vesa.bits_per_pixel); + printk(BIOS_DEBUG, "VBE: framebuffer: %p\n", framebuffer); if (!framebuffer) { printk(BIOS_DEBUG, "VBE: Mode does not support linear " @@ -361,19 +367,6 @@ void vbe_set_graphics(void) } vbe_set_mode(&mode_info); -#if CONFIG(BOOTSPLASH) - struct jpeg_decdata *decdata; - unsigned char *jpeg = cbfs_boot_map_with_leak("bootsplash.jpg", - CBFS_TYPE_BOOTSPLASH, - NULL); - if (!jpeg) { - printk(BIOS_DEBUG, "VBE: No bootsplash found.\n"); - return; - } - decdata = malloc(sizeof(*decdata)); - int ret = 0; - ret = jpeg_decode(jpeg, framebuffer, 1024, 768, 16, decdata); -#endif } void vbe_textmode_console(void) diff --git a/src/device/oprom/yabel/vbe.c b/src/device/oprom/yabel/vbe.c index 8116c6b3ed..9a7fa045c7 100644 --- a/src/device/oprom/yabel/vbe.c +++ b/src/device/oprom/yabel/vbe.c @@ -34,9 +34,6 @@ #include #include -#if CONFIG(FRAMEBUFFER_SET_VESA_MODE) -#include -#endif #include @@ -52,10 +49,7 @@ #include "interrupt.h" #include "device.h" -#include - #include -#include "../../src/lib/jpeg.h" #include @@ -717,7 +711,14 @@ vbe_get_info(void) } #endif -vbe_mode_info_t mode_info; +static vbe_mode_info_t mode_info; + +const vbe_mode_info_t *vbe_mode_info(void) +{ + if (!mode_info_valid || !mode_info.vesa.phys_base_ptr) + return NULL; + return &mode_info; +} void vbe_set_graphics(void) { @@ -745,34 +746,6 @@ void vbe_set_graphics(void) mode_info.video_mode = (1 << 14) | CONFIG_FRAMEBUFFER_VESA_MODE; vbe_get_mode_info(&mode_info); vbe_set_mode(&mode_info); - -#if CONFIG(BOOTSPLASH) - unsigned char *framebuffer = - (unsigned char *) le32_to_cpu(mode_info.vesa.phys_base_ptr); - DEBUG_PRINTF_VBE("FRAMEBUFFER: 0x%p\n", framebuffer); - - struct jpeg_decdata *decdata; - - /* Switching Intel IGD to 1MB video memory will break this. Who - * cares. */ - // int imagesize = 1024*768*2; - - unsigned char *jpeg = cbfs_boot_map_with_leak("bootsplash.jpg", - CBFS_TYPE_BOOTSPLASH, - NULL); - if (!jpeg) { - DEBUG_PRINTF_VBE("Could not find bootsplash.jpg\n"); - return; - } - DEBUG_PRINTF_VBE("Splash at %p ...\n", jpeg); - dump(jpeg, 64); - - decdata = malloc(sizeof(*decdata)); - int ret = 0; - DEBUG_PRINTF_VBE("Decompressing boot splash screen...\n"); - ret = jpeg_decode(jpeg, framebuffer, 1024, 768, 16, decdata); - DEBUG_PRINTF_VBE("returns %x\n", ret); -#endif } int fill_lb_framebuffer(struct lb_framebuffer *framebuffer) -- cgit v1.2.3