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 <s...@chromium.org>
---

(no changes since v1)

 drivers/video/video-uclass.c | 32 ++++++++++++++++++++++++--------
 include/video.h              |  2 ++
 2 files changed, 26 insertions(+), 8 deletions(-)

diff --git a/drivers/video/video-uclass.c b/drivers/video/video-uclass.c
index ab482f11e5d..da89f431441 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;
 }
diff --git a/include/video.h b/include/video.h
index 3f67a93bc93..4d99e5dc27f 100644
--- a/include/video.h
+++ b/include/video.h
@@ -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;
 };
 
-- 
2.39.2.637.g21b0678d19-goog

Reply via email to