mirror of
https://github.com/AsahiLinux/u-boot
synced 2024-11-24 21:54:01 +00:00
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:
parent
f62229227c
commit
315e367977
2 changed files with 26 additions and 8 deletions
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
};
|
||||
|
||||
|
|
Loading…
Reference in a new issue