diff options
-rw-r--r-- | src/device/oprom/realmode/x86.c | 25 | ||||
-rw-r--r-- | src/device/oprom/yabel/vbe.c | 43 | ||||
-rw-r--r-- | src/device/pci_device.c | 7 | ||||
-rw-r--r-- | src/include/bootsplash.h | 36 | ||||
-rw-r--r-- | src/include/vbe.h | 6 | ||||
-rw-r--r-- | src/lib/Makefile.inc | 1 | ||||
-rw-r--r-- | src/lib/bootsplash.c | 62 |
7 files changed, 129 insertions, 51 deletions
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 <arch/interrupt.h> #include <arch/registers.h> #include <boot/coreboot_tables.h> -#include <cbfs.h> #include <console/console.h> #include <cpu/amd/lxdef.h> #include <cpu/amd/vr.h> #include <delay.h> #include <device/pci.h> #include <device/pci_ids.h> -#include <lib/jpeg.h> #include <pc80/i8259.h> #include <pc80/i8254.h> #include <string.h> @@ -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 <string.h> #include <types.h> -#if CONFIG(FRAMEBUFFER_SET_VESA_MODE) -#include <boot/coreboot_tables.h> -#endif #include <endian.h> @@ -52,10 +49,7 @@ #include "interrupt.h" #include "device.h" -#include <cbfs.h> - #include <delay.h> -#include "../../src/lib/jpeg.h" #include <vbe.h> @@ -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) diff --git a/src/device/pci_device.c b/src/device/pci_device.c index 9c47085152..7786043a6c 100644 --- a/src/device/pci_device.c +++ b/src/device/pci_device.c @@ -34,6 +34,7 @@ #include <arch/acpi.h> #include <device/pci_ops.h> #include <bootmode.h> +#include <bootsplash.h> #include <console/console.h> #include <stdlib.h> #include <stdint.h> @@ -49,6 +50,8 @@ #include <pc80/i8259.h> #include <security/vboot/vbnv.h> #include <timestamp.h> +#include <types.h> + u8 pci_moving_config8(struct device *dev, unsigned int reg) { @@ -764,9 +767,13 @@ void pci_dev_init(struct device *dev) return; run_bios(dev, (unsigned long)ram); + gfx_set_init_done(1); printk(BIOS_DEBUG, "VGA Option ROM was run\n"); timestamp_add_now(TS_OPROM_END); + + if (CONFIG(BOOTSPLASH)) + set_vesa_bootsplash(); } /** Default device operation for PCI devices */ diff --git a/src/include/bootsplash.h b/src/include/bootsplash.h new file mode 100644 index 0000000000..84ba34cc90 --- /dev/null +++ b/src/include/bootsplash.h @@ -0,0 +1,36 @@ +/* + * This file is part of the coreboot project. + * + * Copyright (C) 2019 Johanna Schander <coreboot@mimoja.de> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + */ + +#ifndef __BOOTSPLASH_H__ +#define __BOOTSPLASH_H__ + +#include <types.h> + +/** + * Wraps bootsplash setup for vesa + */ +void set_vesa_bootsplash(void); + + +/** + * Sets up the framebuffer with the bootsplash.jpg from cbfs. + * Returns 0 on success + * CB_ERR on cbfs errors + * and >0 on jpeg errors. + */ +void set_bootsplash(unsigned char *framebuffer, unsigned int x_resolution, + unsigned int y_resolution, unsigned int fb_resolution); + +#endif diff --git a/src/include/vbe.h b/src/include/vbe.h index 67049be613..cfae7e4025 100644 --- a/src/include/vbe.h +++ b/src/include/vbe.h @@ -102,4 +102,10 @@ typedef struct { void vbe_set_graphics(void); void vbe_textmode_console(void); +/** + * Returns the mode_info struct from the vbe context, + * if initialized. NULL on invalid mode_infos. + */ +const vbe_mode_info_t *vbe_mode_info(void); + #endif // VBE_H diff --git a/src/lib/Makefile.inc b/src/lib/Makefile.inc index 3fad0b8fb6..89ed4b0edd 100644 --- a/src/lib/Makefile.inc +++ b/src/lib/Makefile.inc @@ -124,6 +124,7 @@ ramstage-y += stack.c ramstage-y += hexstrtobin.c ramstage-y += wrdd.c ramstage-$(CONFIG_CONSOLE_CBMEM) += cbmem_console.c +ramstage-$(CONFIG_BOOTSPLASH) += bootsplash.c ramstage-$(CONFIG_BOOTSPLASH) += jpeg.c ramstage-$(CONFIG_TRACE) += trace.c postcar-$(CONFIG_TRACE) += trace.c diff --git a/src/lib/bootsplash.c b/src/lib/bootsplash.c new file mode 100644 index 0000000000..5527b233f5 --- /dev/null +++ b/src/lib/bootsplash.c @@ -0,0 +1,62 @@ +/* + * This file is part of the coreboot project. + * + * Copyright (C) 2019 Johanna Schander <coreboot@mimoja.de> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + */ + +#include <cbfs.h> +#include <vbe.h> +#include <console/console.h> +#include <endian.h> +#include <bootsplash.h> + +#include "jpeg.h" + +void set_vesa_bootsplash(void) +{ + const vbe_mode_info_t *mode_info = vbe_mode_info(); + if (mode_info != NULL) { + printk(BIOS_INFO, "Setting up bootsplash\n"); + unsigned int x_resolution = le16_to_cpu(mode_info->vesa.x_resolution); + unsigned int y_resolution = le16_to_cpu(mode_info->vesa.y_resolution); + unsigned int fb_resolution = mode_info->vesa.bits_per_pixel; + unsigned char *framebuffer = + (unsigned char *)le32_to_cpu(mode_info->vesa.phys_base_ptr); + + set_bootsplash(framebuffer, x_resolution, y_resolution, fb_resolution); + } else { + printk(BIOS_ERR, "VBE modeinfo invalid\n"); + } +} + + +void set_bootsplash(unsigned char *framebuffer, unsigned int x_resolution, + unsigned int y_resolution, unsigned int fb_resolution) +{ + struct jpeg_decdata *decdata; + unsigned char *jpeg = + cbfs_boot_map_with_leak("bootsplash.jpg", CBFS_TYPE_BOOTSPLASH, NULL); + if (!jpeg) { + printk(BIOS_ERR, "Could not find bootsplash.jpg\n"); + return; + } + + decdata = malloc(sizeof(*decdata)); + int ret = jpeg_decode(jpeg, framebuffer, x_resolution, y_resolution, fb_resolution, + decdata); + if (ret != 0) { + printk(BIOS_ERR, "Bootsplash could not be decoded. jpeg_decode returned %d.\n", + ret); + return; + } + printk(BIOS_INFO, "Bootsplash loaded\n"); +} |