aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--drivers/video/video-uclass.c32
-rw-r--r--include/video.h2
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;
};