x86: video: Support copy framebuffer with probed devices

For PCI video devices that are not mentioned in the devicetree, U-Boot
does not bind a driver before relocation, since PCI is not fully probed
at that point. Furthermore it is possible for the video device to be on
a secondary bus which is not even scanned.

This is fine if the framebuffer is allocated in fixed memory, as it
normally is on x86. But when using this as a copy framebuffer, we also
need U-Boot to allocate its own cached framebuffer for working in. Since
the video driver is never bound before relocation, the framebuffer size
is never set and U-Boot does no allocation.

Add a new CONFIG option to reserve 16MB of memory for this eventuality.
This allows vesa devices to use the copy framebuffer.

Signed-off-by: Simon Glass <sjg@chromium.org>
Reviewed-by: Anatolij Gustschin <agust@denx.de>
Tested-by: Bin Meng <bmeng.cn@gmail.com>
This commit is contained in:
Simon Glass 2020-07-02 21:12:33 -06:00 committed by Bin Meng
parent 7812bbdc37
commit 551ca0e647
2 changed files with 24 additions and 0 deletions

View file

@ -22,6 +22,25 @@ config BACKLIGHT
This provides backlight uclass driver that enables basic panel This provides backlight uclass driver that enables basic panel
backlight support. backlight support.
config VIDEO_PCI_DEFAULT_FB_SIZE
hex "Default framebuffer size to use if no drivers request it"
depends on DM_VIDEO
default 0x1000000 if X86 && PCI
default 0 if !(X86 && PCI)
help
Generally, video drivers request the amount of memory they need for
the frame buffer when they are bound, by setting the size field in
struct video_uc_platdata. That memory is then reserved for use after
relocation. But PCI drivers cannot be bound before relocation unless
they are mentioned in the devicetree.
With this value set appropriately, it is possible for PCI video
devices to have a framebuffer allocated by U-Boot.
Note: the framebuffer needs to be large enough to store all pixels at
maximum resolution. For example, at 1920 x 1200 with 32 bits per
pixel, 2560 * 1600 * 32 / 8 = 0xfa0000 bytes are needed.
config VIDEO_COPY config VIDEO_COPY
bool "Enable copying the frame buffer to a hardware copy" bool "Enable copying the frame buffer to a hardware copy"
depends on DM_VIDEO depends on DM_VIDEO

View file

@ -97,6 +97,11 @@ int video_reserve(ulong *addrp)
debug("%s: Reserving %lx bytes at %lx for video device '%s'\n", debug("%s: Reserving %lx bytes at %lx for video device '%s'\n",
__func__, size, *addrp, dev->name); __func__, size, *addrp, dev->name);
} }
/* Allocate space for PCI video devices in case there were not bound */
if (*addrp == gd->video_top)
*addrp -= CONFIG_VIDEO_PCI_DEFAULT_FB_SIZE;
gd->video_bottom = *addrp; gd->video_bottom = *addrp;
gd->fb_base = *addrp; gd->fb_base = *addrp;
debug("Video frame buffers from %lx to %lx\n", gd->video_bottom, debug("Video frame buffers from %lx to %lx\n", gd->video_bottom,