diff mbox series

[v2,25/26] minnowmax: Enable the copy framebuffer

Message ID 20200524194852.v2.25.I4c7569b67d52db471b3490c7dac21e1dc10dcd97@changeid
State Accepted
Commit 6c74ee30bbd67c2927837b139f5a3186974c198c
Headers show
Series x86: video: Speed up the framebuffer | expand

Commit Message

Simon Glass May 25, 2020, 1:49 a.m. UTC
Update the video driver to support this feature and enable it on
minnowmax to speed up the display.

With this change, the time taken to print the environment to the display
without CONFIG_CONSOLE_SCROLL_LINES is reduced from over 13 seconds to
300ms, at 1280x1024.

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

Changes in v2: None

 configs/minnowmax_defconfig |  2 +-
 drivers/video/vesa.c        | 30 +++++++++++++++++++++++++++++-
 2 files changed, 30 insertions(+), 2 deletions(-)
diff mbox series

Patch

diff --git a/configs/minnowmax_defconfig b/configs/minnowmax_defconfig
index 127fd5d53e..19528c4641 100644
--- a/configs/minnowmax_defconfig
+++ b/configs/minnowmax_defconfig
@@ -59,6 +59,6 @@  CONFIG_RTL8169=y
 CONFIG_SPI=y
 CONFIG_USB_STORAGE=y
 CONFIG_USB_KEYBOARD=y
+CONFIG_VIDEO_COPY=y
 CONFIG_FRAMEBUFFER_SET_VESA_MODE=y
 CONFIG_FRAMEBUFFER_VESA_MODE_11B=y
-CONFIG_CONSOLE_SCROLL_LINES=5
diff --git a/drivers/video/vesa.c b/drivers/video/vesa.c
index 6c03611e80..9656326bdb 100644
--- a/drivers/video/vesa.c
+++ b/drivers/video/vesa.c
@@ -5,12 +5,39 @@ 
 
 #include <common.h>
 #include <dm.h>
+#include <log.h>
 #include <pci.h>
 #include <vbe.h>
+#include <video.h>
+#include <asm/mtrr.h>
 
 static int vesa_video_probe(struct udevice *dev)
 {
-	return vbe_setup_video(dev, NULL);
+	struct video_uc_platdata *plat = dev_get_uclass_platdata(dev);
+	ulong fbbase;
+	int ret;
+
+	ret = vbe_setup_video(dev, NULL);
+	if (ret)
+		return log_ret(ret);
+
+	/* Use write-combining for the graphics memory, 256MB */
+	fbbase = IS_ENABLED(CONFIG_VIDEO_COPY) ? plat->copy_base : plat->base;
+	mtrr_add_request(MTRR_TYPE_WRCOMB, fbbase, 256 << 20);
+	mtrr_commit(true);
+
+	return 0;
+}
+
+static int vesa_video_bind(struct udevice *dev)
+{
+	struct video_uc_platdata *uc_plat = dev_get_uclass_platdata(dev);
+
+	/* Set the maximum supported resolution */
+	uc_plat->size = 2560 * 1600 * 4;
+	log_debug("%s: Frame buffer size %x\n", __func__, uc_plat->size);
+
+	return 0;
 }
 
 static const struct udevice_id vesa_video_ids[] = {
@@ -22,6 +49,7 @@  U_BOOT_DRIVER(vesa_video) = {
 	.name	= "vesa_video",
 	.id	= UCLASS_VIDEO,
 	.of_match = vesa_video_ids,
+	.bind	= vesa_video_bind,
 	.probe	= vesa_video_probe,
 };