diff mbox series

[v2,19/26] video: pci: Set up the copy framebuffer

Message ID 20200524194852.v2.19.I6830e2259b28645c0ed29b68bbadf67598c0ed70@changeid
State Accepted
Commit 0938767da1782d2c5c5d1f003b8835a59271b622
Headers show
Series x86: video: Speed up the framebuffer | expand

Commit Message

Simon Glass May 25, 2020, 1:48 a.m. UTC
When using a copy framebuffer we need to tell the video subsystem its
address. U-Boot's normally allocated framebuffer is used as the working
buffer, but nothing is displayed until it is copied to the copy
framebuffer.

For this to work the video driver must request that a framebuffer be
allocated separately from the hardware framebuffer, so add a check for
that.

Also add a log category so that logging appears correctly.

Signed-off-by: Simon Glass <sjg at chromium.org>
Reviewed-by: Anatolij Gustschin <agust at denx.de>
---

Changes in v2: None

 drivers/pci/pci_rom.c | 22 +++++++++++++++++++++-
 1 file changed, 21 insertions(+), 1 deletion(-)
diff mbox series

Patch

diff --git a/drivers/pci/pci_rom.c b/drivers/pci/pci_rom.c
index 6a9bc49978..fa29d69e85 100644
--- a/drivers/pci/pci_rom.c
+++ b/drivers/pci/pci_rom.c
@@ -22,6 +22,8 @@ 
  * Copyright 1997 -- 1999 Martin Mares <mj at atrey.karlin.mff.cuni.cz>
  */
 
+#define LOG_CATEGORY UCLASS_PCI
+
 #include <common.h>
 #include <bios_emul.h>
 #include <bootstage.h>
@@ -344,7 +346,16 @@  int vbe_setup_video_priv(struct vesa_mode_info *vesa,
 	default:
 		return -EPROTONOSUPPORT;
 	}
-	plat->base = vesa->phys_base_ptr;
+
+	/* Use double buffering if enabled */
+	if (IS_ENABLED(CONFIG_VIDEO_COPY)) {
+		if (!plat->base)
+			return log_msg_ret("copy", -ENFILE);
+		plat->copy_base = vesa->phys_base_ptr;
+	} else {
+		plat->base = vesa->phys_base_ptr;
+	}
+	log_debug("base = %lx, copy_base = %lx\n", plat->base, plat->copy_base);
 	plat->size = vesa->bytes_per_scanline * vesa->y_resolution;
 
 	return 0;
@@ -372,6 +383,15 @@  int vbe_setup_video(struct udevice *dev, int (*int15_handler)(void))
 
 	ret = vbe_setup_video_priv(&mode_info.vesa, uc_priv, plat);
 	if (ret) {
+		if (ret == -ENFILE) {
+			/*
+			 * See video-uclass.c for how to set up reserved memory
+			 * in your video driver
+			 */
+			log_err("CONFIG_VIDEO_COPY enabled but driver '%s' set up no reserved memory\n",
+				dev->driver->name);
+		}
+
 		debug("No video mode configured\n");
 		return ret;
 	}