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>
This commit is contained in:
Simon Glass 2023-03-10 12:47:17 -08:00 committed by Heinrich Schuchardt
parent f62229227c
commit 315e367977
2 changed files with 26 additions and 8 deletions

View 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;
}

View 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;
};