src/device/oprom: Fix bootsplash display code for optionroms
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 <coreboot@mimoja.de> Reviewed-on: https://review.coreboot.org/c/coreboot/+/34537 Reviewed-by: Kyösti Mälkki <kyosti.malkki@gmail.com> Reviewed-by: Patrick Georgi <pgeorgi@google.com> Reviewed-by: Paul Menzel <paulepanter@users.sourceforge.net> Tested-by: build bot (Jenkins) <no-reply@coreboot.org>
This commit is contained in:
parent
a31cd21c3a
commit
db7a3ae863
|
@ -18,14 +18,12 @@
|
||||||
#include <arch/interrupt.h>
|
#include <arch/interrupt.h>
|
||||||
#include <arch/registers.h>
|
#include <arch/registers.h>
|
||||||
#include <boot/coreboot_tables.h>
|
#include <boot/coreboot_tables.h>
|
||||||
#include <cbfs.h>
|
|
||||||
#include <console/console.h>
|
#include <console/console.h>
|
||||||
#include <cpu/amd/lxdef.h>
|
#include <cpu/amd/lxdef.h>
|
||||||
#include <cpu/amd/vr.h>
|
#include <cpu/amd/vr.h>
|
||||||
#include <delay.h>
|
#include <delay.h>
|
||||||
#include <device/pci.h>
|
#include <device/pci.h>
|
||||||
#include <device/pci_ids.h>
|
#include <device/pci_ids.h>
|
||||||
#include <lib/jpeg.h>
|
|
||||||
#include <pc80/i8259.h>
|
#include <pc80/i8259.h>
|
||||||
#include <pc80/i8254.h>
|
#include <pc80/i8254.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
@ -223,7 +221,7 @@ static void setup_realmode_idt(void)
|
||||||
}
|
}
|
||||||
|
|
||||||
#if CONFIG(FRAMEBUFFER_SET_VESA_MODE)
|
#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 mode_info_valid;
|
||||||
|
|
||||||
static int vbe_mode_info_valid(void)
|
static int vbe_mode_info_valid(void)
|
||||||
|
@ -231,6 +229,13 @@ static int vbe_mode_info_valid(void)
|
||||||
return mode_info_valid;
|
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 int vbe_check_for_failure(int ah);
|
||||||
|
|
||||||
static void vbe_get_ctrl_info(vbe_info_block *info)
|
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.x_resolution),
|
||||||
le16_to_cpu(mode_info.vesa.y_resolution),
|
le16_to_cpu(mode_info.vesa.y_resolution),
|
||||||
mode_info.vesa.bits_per_pixel);
|
mode_info.vesa.bits_per_pixel);
|
||||||
|
|
||||||
printk(BIOS_DEBUG, "VBE: framebuffer: %p\n", framebuffer);
|
printk(BIOS_DEBUG, "VBE: framebuffer: %p\n", framebuffer);
|
||||||
if (!framebuffer) {
|
if (!framebuffer) {
|
||||||
printk(BIOS_DEBUG, "VBE: Mode does not support linear "
|
printk(BIOS_DEBUG, "VBE: Mode does not support linear "
|
||||||
|
@ -361,19 +367,6 @@ void vbe_set_graphics(void)
|
||||||
}
|
}
|
||||||
|
|
||||||
vbe_set_mode(&mode_info);
|
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)
|
void vbe_textmode_console(void)
|
||||||
|
|
|
@ -34,9 +34,6 @@
|
||||||
|
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <types.h>
|
#include <types.h>
|
||||||
#if CONFIG(FRAMEBUFFER_SET_VESA_MODE)
|
|
||||||
#include <boot/coreboot_tables.h>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include <endian.h>
|
#include <endian.h>
|
||||||
|
|
||||||
|
@ -52,10 +49,7 @@
|
||||||
#include "interrupt.h"
|
#include "interrupt.h"
|
||||||
#include "device.h"
|
#include "device.h"
|
||||||
|
|
||||||
#include <cbfs.h>
|
|
||||||
|
|
||||||
#include <delay.h>
|
#include <delay.h>
|
||||||
#include "../../src/lib/jpeg.h"
|
|
||||||
|
|
||||||
#include <vbe.h>
|
#include <vbe.h>
|
||||||
|
|
||||||
|
@ -717,7 +711,14 @@ vbe_get_info(void)
|
||||||
}
|
}
|
||||||
#endif
|
#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)
|
void vbe_set_graphics(void)
|
||||||
{
|
{
|
||||||
|
@ -745,34 +746,6 @@ void vbe_set_graphics(void)
|
||||||
mode_info.video_mode = (1 << 14) | CONFIG_FRAMEBUFFER_VESA_MODE;
|
mode_info.video_mode = (1 << 14) | CONFIG_FRAMEBUFFER_VESA_MODE;
|
||||||
vbe_get_mode_info(&mode_info);
|
vbe_get_mode_info(&mode_info);
|
||||||
vbe_set_mode(&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)
|
int fill_lb_framebuffer(struct lb_framebuffer *framebuffer)
|
||||||
|
|
|
@ -34,6 +34,7 @@
|
||||||
#include <arch/acpi.h>
|
#include <arch/acpi.h>
|
||||||
#include <device/pci_ops.h>
|
#include <device/pci_ops.h>
|
||||||
#include <bootmode.h>
|
#include <bootmode.h>
|
||||||
|
#include <bootsplash.h>
|
||||||
#include <console/console.h>
|
#include <console/console.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
|
@ -49,6 +50,8 @@
|
||||||
#include <pc80/i8259.h>
|
#include <pc80/i8259.h>
|
||||||
#include <security/vboot/vbnv.h>
|
#include <security/vboot/vbnv.h>
|
||||||
#include <timestamp.h>
|
#include <timestamp.h>
|
||||||
|
#include <types.h>
|
||||||
|
|
||||||
|
|
||||||
u8 pci_moving_config8(struct device *dev, unsigned int reg)
|
u8 pci_moving_config8(struct device *dev, unsigned int reg)
|
||||||
{
|
{
|
||||||
|
@ -764,9 +767,13 @@ void pci_dev_init(struct device *dev)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
run_bios(dev, (unsigned long)ram);
|
run_bios(dev, (unsigned long)ram);
|
||||||
|
|
||||||
gfx_set_init_done(1);
|
gfx_set_init_done(1);
|
||||||
printk(BIOS_DEBUG, "VGA Option ROM was run\n");
|
printk(BIOS_DEBUG, "VGA Option ROM was run\n");
|
||||||
timestamp_add_now(TS_OPROM_END);
|
timestamp_add_now(TS_OPROM_END);
|
||||||
|
|
||||||
|
if (CONFIG(BOOTSPLASH))
|
||||||
|
set_vesa_bootsplash();
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Default device operation for PCI devices */
|
/** Default device operation for PCI devices */
|
||||||
|
|
|
@ -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
|
|
@ -102,4 +102,10 @@ typedef struct {
|
||||||
void vbe_set_graphics(void);
|
void vbe_set_graphics(void);
|
||||||
void vbe_textmode_console(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
|
#endif // VBE_H
|
||||||
|
|
|
@ -124,6 +124,7 @@ ramstage-y += stack.c
|
||||||
ramstage-y += hexstrtobin.c
|
ramstage-y += hexstrtobin.c
|
||||||
ramstage-y += wrdd.c
|
ramstage-y += wrdd.c
|
||||||
ramstage-$(CONFIG_CONSOLE_CBMEM) += cbmem_console.c
|
ramstage-$(CONFIG_CONSOLE_CBMEM) += cbmem_console.c
|
||||||
|
ramstage-$(CONFIG_BOOTSPLASH) += bootsplash.c
|
||||||
ramstage-$(CONFIG_BOOTSPLASH) += jpeg.c
|
ramstage-$(CONFIG_BOOTSPLASH) += jpeg.c
|
||||||
ramstage-$(CONFIG_TRACE) += trace.c
|
ramstage-$(CONFIG_TRACE) += trace.c
|
||||||
postcar-$(CONFIG_TRACE) += trace.c
|
postcar-$(CONFIG_TRACE) += trace.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");
|
||||||
|
}
|
Loading…
Reference in New Issue