mirror of
https://github.com/AsahiLinux/u-boot
synced 2024-11-24 21:54:01 +00:00
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:
parent
7812bbdc37
commit
551ca0e647
2 changed files with 24 additions and 0 deletions
|
@ -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
|
||||||
|
|
|
@ -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,
|
||||||
|
|
Loading…
Reference in a new issue