summaryrefslogtreecommitdiff
path: root/src/lib
diff options
context:
space:
mode:
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");
+}