summaryrefslogtreecommitdiff
path: root/drivers/video
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/video')
-rw-r--r--drivers/video/Kconfig20
-rw-r--r--drivers/video/Makefile1
-rw-r--r--drivers/video/bmp.c142
-rw-r--r--drivers/video/coreboot.c12
-rw-r--r--drivers/video/meson/meson_dw_hdmi.c1
-rw-r--r--drivers/video/meson/meson_vclk.c1
-rw-r--r--drivers/video/rockchip/dw_mipi_dsi_rockchip.c6
-rw-r--r--drivers/video/stm32/stm32_dsi.c1
-rw-r--r--drivers/video/stm32/stm32_ltdc.c1
-rw-r--r--drivers/video/tegra124/sor.c1
10 files changed, 181 insertions, 5 deletions
diff --git a/drivers/video/Kconfig b/drivers/video/Kconfig
index 69f4809cf4a..ab927641bb7 100644
--- a/drivers/video/Kconfig
+++ b/drivers/video/Kconfig
@@ -66,7 +66,7 @@ config VIDEO_PCI_DEFAULT_FB_SIZE
hex "Default framebuffer size to use if no drivers request it"
default 0x1000000 if X86
default 0x800000 if !X86 && VIDEO_BOCHS
- default 0 if !X86 && !VIDEO_BOCHS
+ default 0x0 if !X86 && !VIDEO_BOCHS
help
Generally, video drivers request the amount of memory they need for
the frame buffer when they are bound, by setting the size field in
@@ -959,6 +959,14 @@ config SPLASH_SOURCE
endif # SPLASH_SCREEN
+config BMP
+ bool "Enable bmp image display"
+ help
+ Enable bmp functions to display bmp image and get bmp info.
+
+ BMP is a simple graphics-image file format designed to store bitmap
+ images. It is primarily used on Windows devices.
+
config VIDEO_BMP_GZIP
bool "Gzip compressed BMP image support"
depends on BMP || SPLASH_SCREEN
@@ -1049,7 +1057,7 @@ config SPL_VIDEO_PCI_DEFAULT_FB_SIZE
hex "Default framebuffer size to use if no drivers request it at SPL"
default 0x1000000 if X86
default 0x800000 if !X86 && VIDEO_BOCHS
- default 0 if !X86 && !VIDEO_BOCHS
+ default 0x0 if !X86 && !VIDEO_BOCHS
help
Generally, video drivers request the amount of memory they need for
the frame buffer when they are bound, by setting the size field in
@@ -1162,6 +1170,14 @@ config SPL_SPLASH_SOURCE
endif # SPL_SPLASH_SCREEN
+config SPL_BMP
+ bool "Enable bmp image display at SPL"
+ help
+ Enable bmp functions to display bmp image and get bmp info in SPL.
+
+ BMP is a simple graphics-image file format designed to store bitmap
+ images. It is primarily used on Windows devices.
+
config SPL_VIDEO_BMP_GZIP
bool "Gzip compressed BMP image support at SPL"
depends on SPL_SPLASH_SCREEN || SPL_BMP
diff --git a/drivers/video/Makefile b/drivers/video/Makefile
index d13af9f3b19..fdc29376324 100644
--- a/drivers/video/Makefile
+++ b/drivers/video/Makefile
@@ -25,6 +25,7 @@ obj-$(CONFIG_PANEL_HX8238D) += hx8238d.o
obj-$(CONFIG_$(SPL_TPL_)SIMPLE_PANEL) += simple_panel.o
obj-$(CONFIG_VIDEO_LOGO) += u_boot_logo.o
+obj-$(CONFIG_$(SPL_TPL_)BMP) += bmp.o
endif
diff --git a/drivers/video/bmp.c b/drivers/video/bmp.c
new file mode 100644
index 00000000000..bab6fa7265a
--- /dev/null
+++ b/drivers/video/bmp.c
@@ -0,0 +1,142 @@
+// SPDX-License-Identifier: GPL-2.0+
+/*
+ * (C) Copyright 2002
+ * Detlev Zundel, DENX Software Engineering, [email protected].
+ */
+
+/*
+ * BMP handling routines
+ */
+
+#include <common.h>
+#include <bmp_layout.h>
+#include <command.h>
+#include <dm.h>
+#include <gzip.h>
+#include <log.h>
+#include <malloc.h>
+#include <mapmem.h>
+#include <splash.h>
+#include <video.h>
+#include <asm/byteorder.h>
+
+/*
+ * Allocate and decompress a BMP image using gunzip().
+ *
+ * Returns a pointer to the decompressed image data. This pointer is
+ * aligned to 32-bit-aligned-address + 2.
+ * See doc/README.displaying-bmps for explanation.
+ *
+ * The allocation address is passed to 'alloc_addr' and must be freed
+ * by the caller after use.
+ *
+ * Returns NULL if decompression failed, or if the decompressed data
+ * didn't contain a valid BMP signature or decompression is not enabled in
+ * Kconfig.
+ */
+struct bmp_image *gunzip_bmp(unsigned long addr, unsigned long *lenp,
+ void **alloc_addr)
+{
+ void *dst;
+ unsigned long len;
+ struct bmp_image *bmp;
+
+ if (!CONFIG_IS_ENABLED(VIDEO_BMP_GZIP))
+ return NULL;
+
+ /*
+ * Decompress bmp image
+ */
+ len = CONFIG_VAL(VIDEO_LOGO_MAX_SIZE);
+ /* allocate extra 3 bytes for 32-bit-aligned-address + 2 alignment */
+ dst = malloc(CONFIG_VAL(VIDEO_LOGO_MAX_SIZE) + 3);
+ if (!dst) {
+ puts("Error: malloc in gunzip failed!\n");
+ return NULL;
+ }
+
+ /* align to 32-bit-aligned-address + 2 */
+ bmp = dst + 2;
+
+ if (gunzip(bmp, CONFIG_VAL(VIDEO_LOGO_MAX_SIZE), map_sysmem(addr, 0),
+ &len)) {
+ free(dst);
+ return NULL;
+ }
+ if (len == CONFIG_VAL(VIDEO_LOGO_MAX_SIZE))
+ puts("Image could be truncated (increase CONFIG_VIDEO_LOGO_MAX_SIZE)!\n");
+
+ /*
+ * Check for bmp mark 'BM'
+ */
+ if (!((bmp->header.signature[0] == 'B') &&
+ (bmp->header.signature[1] == 'M'))) {
+ free(dst);
+ return NULL;
+ }
+
+ debug("Gzipped BMP image detected!\n");
+
+ *alloc_addr = dst;
+ return bmp;
+}
+
+int bmp_info(ulong addr)
+{
+ struct bmp_image *bmp = (struct bmp_image *)map_sysmem(addr, 0);
+ void *bmp_alloc_addr = NULL;
+ unsigned long len;
+
+ if (!((bmp->header.signature[0] == 'B') &&
+ (bmp->header.signature[1] == 'M')))
+ bmp = gunzip_bmp(addr, &len, &bmp_alloc_addr);
+
+ if (!bmp) {
+ printf("There is no valid bmp file at the given address\n");
+ return 1;
+ }
+
+ printf("Image size : %d x %d\n", le32_to_cpu(bmp->header.width),
+ le32_to_cpu(bmp->header.height));
+ printf("Bits per pixel: %d\n", le16_to_cpu(bmp->header.bit_count));
+ printf("Compression : %d\n", le32_to_cpu(bmp->header.compression));
+
+ if (bmp_alloc_addr)
+ free(bmp_alloc_addr);
+
+ return 0;
+}
+
+int bmp_display(ulong addr, int x, int y)
+{
+ struct udevice *dev;
+ int ret;
+ struct bmp_image *bmp = map_sysmem(addr, 0);
+ void *bmp_alloc_addr = NULL;
+ unsigned long len;
+
+ if (!((bmp->header.signature[0] == 'B') &&
+ (bmp->header.signature[1] == 'M')))
+ bmp = gunzip_bmp(addr, &len, &bmp_alloc_addr);
+
+ if (!bmp) {
+ printf("There is no valid bmp file at the given address\n");
+ return 1;
+ }
+ addr = map_to_sysmem(bmp);
+
+ ret = uclass_first_device_err(UCLASS_VIDEO, &dev);
+ if (!ret) {
+ bool align = false;
+
+ if (x == BMP_ALIGN_CENTER || y == BMP_ALIGN_CENTER)
+ align = true;
+
+ ret = video_bmp_display(dev, addr, x, y, align);
+ }
+
+ if (bmp_alloc_addr)
+ free(bmp_alloc_addr);
+
+ return ret ? CMD_RET_FAILURE : 0;
+}
diff --git a/drivers/video/coreboot.c b/drivers/video/coreboot.c
index c586475e41e..5b718ae3e5a 100644
--- a/drivers/video/coreboot.c
+++ b/drivers/video/coreboot.c
@@ -73,6 +73,17 @@ err:
return ret;
}
+static int coreboot_video_bind(struct udevice *dev)
+{
+ struct video_uc_plat *uc_plat = dev_get_uclass_plat(dev);
+
+ /* Set the maximum supported resolution */
+ uc_plat->size = 4096 * 2160 * 4;
+ log_debug("%s: Frame buffer size %x\n", __func__, uc_plat->size);
+
+ return 0;
+}
+
static const struct udevice_id coreboot_video_ids[] = {
{ .compatible = "coreboot-fb" },
{ }
@@ -82,5 +93,6 @@ U_BOOT_DRIVER(coreboot_video) = {
.name = "coreboot_video",
.id = UCLASS_VIDEO,
.of_match = coreboot_video_ids,
+ .bind = coreboot_video_bind,
.probe = coreboot_video_probe,
};
diff --git a/drivers/video/meson/meson_dw_hdmi.c b/drivers/video/meson/meson_dw_hdmi.c
index e5f28132053..5db01904b53 100644
--- a/drivers/video/meson/meson_dw_hdmi.c
+++ b/drivers/video/meson/meson_dw_hdmi.c
@@ -14,6 +14,7 @@
#include <dm/device-internal.h>
#include <dm/uclass-internal.h>
#include <linux/bitops.h>
+#include <linux/printk.h>
#include <power/regulator.h>
#include <clk.h>
#include <linux/delay.h>
diff --git a/drivers/video/meson/meson_vclk.c b/drivers/video/meson/meson_vclk.c
index cd1e69040f7..e718a0074ed 100644
--- a/drivers/video/meson/meson_vclk.c
+++ b/drivers/video/meson/meson_vclk.c
@@ -10,6 +10,7 @@
#include <dm.h>
#include <edid.h>
#include <linux/bitops.h>
+#include <linux/printk.h>
#include "meson_vpu.h"
#include <log.h>
#include <linux/iopoll.h>
diff --git a/drivers/video/rockchip/dw_mipi_dsi_rockchip.c b/drivers/video/rockchip/dw_mipi_dsi_rockchip.c
index 0852b53ebed..1a5ab781e3f 100644
--- a/drivers/video/rockchip/dw_mipi_dsi_rockchip.c
+++ b/drivers/video/rockchip/dw_mipi_dsi_rockchip.c
@@ -377,7 +377,7 @@ static int dsi_phy_init(void *priv_data)
struct dw_rockchip_dsi_priv *dsi = dev_get_priv(dev);
int ret, i, vco;
- if (dsi->phy.dev) {
+ if (generic_phy_valid(&dsi->phy)) {
ret = generic_phy_configure(&dsi->phy, &dsi->phy_opts);
if (ret) {
dev_err(dsi->dsi_host,
@@ -559,7 +559,7 @@ dw_mipi_dsi_get_lane_mbps(void *priv_data, struct display_timing *timings,
}
/* for external phy only the mipi_dphy_config is necessary */
- if (dsi->phy.dev) {
+ if (generic_phy_valid(&dsi->phy)) {
phy_mipi_dphy_get_default_config(timings->pixelclock.typ * 10 / 8,
bpp, lanes,
&dsi->phy_opts);
@@ -859,7 +859,7 @@ static int dw_mipi_dsi_rockchip_probe(struct udevice *dev)
}
/* Get a ref clock only if not using an external phy. */
- if (priv->phy.dev) {
+ if (generic_phy_valid(&priv->phy)) {
dev_dbg(dev, "setting priv->ref to NULL\n");
priv->ref = NULL;
diff --git a/drivers/video/stm32/stm32_dsi.c b/drivers/video/stm32/stm32_dsi.c
index a7420fb2ee7..a18c1e027a8 100644
--- a/drivers/video/stm32/stm32_dsi.c
+++ b/drivers/video/stm32/stm32_dsi.c
@@ -26,6 +26,7 @@
#include <dm/lists.h>
#include <linux/bitops.h>
#include <linux/iopoll.h>
+#include <linux/printk.h>
#include <power/regulator.h>
#define HWVER_130 0x31333000 /* IP version 1.30 */
diff --git a/drivers/video/stm32/stm32_ltdc.c b/drivers/video/stm32/stm32_ltdc.c
index f48badc517a..6fd90e33919 100644
--- a/drivers/video/stm32/stm32_ltdc.c
+++ b/drivers/video/stm32/stm32_ltdc.c
@@ -20,6 +20,7 @@
#include <dm/device-internal.h>
#include <dm/device_compat.h>
#include <linux/bitops.h>
+#include <linux/printk.h>
struct stm32_ltdc_priv {
void __iomem *regs;
diff --git a/drivers/video/tegra124/sor.c b/drivers/video/tegra124/sor.c
index f291db3dc76..258685182c7 100644
--- a/drivers/video/tegra124/sor.c
+++ b/drivers/video/tegra124/sor.c
@@ -15,6 +15,7 @@
#include <asm/arch/clock.h>
#include <asm/arch-tegra/dc.h>
#include <linux/delay.h>
+#include <linux/printk.h>
#include "displayport.h"
#include "sor.h"
#include <linux/err.h>