summaryrefslogtreecommitdiff
path: root/src/lib
diff options
context:
space:
mode:
authorJohanna Schander <coreboot@mimoja.de>2019-07-24 10:14:26 +0200
committerPatrick Georgi <pgeorgi@google.com>2019-07-26 08:40:23 +0000
commitdb7a3ae8635a92764d357a93c04f49e9d9bbdca7 (patch)
tree3702d5ead582751226efa5deb597d07412c1ae51 /src/lib
parenta31cd21c3ad1ef8029aed733a3f8ab2286b81385 (diff)
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>
Diffstat (limited to 'src/lib')
-rw-r--r--src/lib/Makefile.inc1
-rw-r--r--src/lib/bootsplash.c62
2 files changed, 63 insertions, 0 deletions
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");
+}