aboutsummaryrefslogtreecommitdiff
path: root/drivers/video
diff options
context:
space:
mode:
authorSimon Glass <sjg@chromium.org>2023-03-10 12:47:17 -0800
committerHeinrich Schuchardt <heinrich.schuchardt@canonical.com>2023-03-13 13:53:01 +0100
commit315e36797723e8a191a1ae0ceac448f5c4f00aff (patch)
tree16268faa2699f1fe4db6fb818cb4436da2a9e3ee /drivers/video
parentf62229227ca24c0f491d02cf2ae69da7136abe18 (diff)
downloadu-boot-315e36797723e8a191a1ae0ceac448f5c4f00aff.zip
u-boot-315e36797723e8a191a1ae0ceac448f5c4f00aff.tar.gz
u-boot-315e36797723e8a191a1ae0ceac448f5c4f00aff.tar.bz2
video: Allow a copy framebuffer with pre-allocated fb
At present it is not possible for the video driver to use a pre-allocated frame buffer (such as is done with EFI) with the copy framebuffer. This can be useful to speed up the display. Adjust the implementation so that copy_size can be set to the required size, with this being allocated if the normal framebuffer size is 0. Signed-off-by: Simon Glass <sjg@chromium.org>
Diffstat (limited to 'drivers/video')
-rw-r--r--drivers/video/video-uclass.c32
1 files changed, 24 insertions, 8 deletions
diff --git a/drivers/video/video-uclass.c b/drivers/video/video-uclass.c
index ab482f1..da89f43 100644
--- a/drivers/video/video-uclass.c
+++ b/drivers/video/video-uclass.c
@@ -78,24 +78,40 @@ void video_set_flush_dcache(struct udevice *dev, bool flush)
priv->flush_dcache = flush;
}
+static ulong alloc_fb_(ulong align, ulong size, ulong *addrp)
+{
+ ulong base;
+
+ align = align ? align : 1 << 20;
+ base = *addrp - size;
+ base &= ~(align - 1);
+ size = *addrp - base;
+ *addrp = base;
+
+ return size;
+}
+
static ulong alloc_fb(struct udevice *dev, ulong *addrp)
{
struct video_uc_plat *plat = dev_get_uclass_plat(dev);
- ulong base, align, size;
+ ulong size;
+
+ if (!plat->size) {
+ if (IS_ENABLED(CONFIG_VIDEO_COPY) && plat->copy_size) {
+ size = alloc_fb_(plat->align, plat->copy_size, addrp);
+ plat->copy_base = *addrp;
+ return size;
+ }
- if (!plat->size)
return 0;
+ }
/* Allow drivers to allocate the frame buffer themselves */
if (plat->base)
return 0;
- align = plat->align ? plat->align : 1 << 20;
- base = *addrp - plat->size;
- base &= ~(align - 1);
- plat->base = base;
- size = *addrp - base;
- *addrp = base;
+ size = alloc_fb_(plat->align, plat->size, addrp);
+ plat->base = *addrp;
return size;
}