]> git.dujemihanovic.xyz Git - u-boot.git/commitdiff
video: Allow a copy framebuffer with pre-allocated fb
authorSimon Glass <sjg@chromium.org>
Fri, 10 Mar 2023 20:47:17 +0000 (12:47 -0800)
committerHeinrich Schuchardt <heinrich.schuchardt@canonical.com>
Mon, 13 Mar 2023 12:53:01 +0000 (13:53 +0100)
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>
drivers/video/video-uclass.c
include/video.h

index ab482f11e5dc09069f63cdc59e611307ee187059..da89f431441ac371030b616df01bf6a4569c41d4 100644 (file)
@@ -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;
 }
index 3f67a93bc9372310d1321e66a2e48f1164d2a9d2..4d99e5dc27f6b04902b5f65b130c25bdb8174873 100644 (file)
@@ -24,6 +24,7 @@ struct udevice;
  * @base: Base address of frame buffer, 0 if not yet known
  * @copy_base: Base address of a hardware copy of the frame buffer. See
  *     CONFIG_VIDEO_COPY.
+ * @copy_size: Size of copy framebuffer, used if @size is 0
  * @hide_logo: Hide the logo (used for testing)
  */
 struct video_uc_plat {
@@ -31,6 +32,7 @@ struct video_uc_plat {
        uint size;
        ulong base;
        ulong copy_base;
+       ulong copy_size;
        bool hide_logo;
 };