summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/device/oprom/realmode/x86.c25
-rw-r--r--src/device/oprom/yabel/vbe.c43
-rw-r--r--src/device/pci_device.c7
-rw-r--r--src/include/bootsplash.h36
-rw-r--r--src/include/vbe.h6
-rw-r--r--src/lib/Makefile.inc1
-rw-r--r--src/lib/bootsplash.c62
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");
+}