mbox series

[RESEND,v3,00/26] x86: video: Speed up the framebuffer

Message ID 20200703031237.1546362-1-sjg@chromium.org
Headers show
Series x86: video: Speed up the framebuffer | expand

Message

Simon Glass July 3, 2020, 3:12 a.m. UTC
(resent for Bin, rebased to u-boot/next)

Some architectures use a cached framebuffer and flush the cache as needed
so that changes are visible. This is supported by U-Boot.

However x86 uses an uncached framebuffer with a 'write-combining' feature
to speed up writes. Reads are permitted but they are extremely expensive.

Unfortunately, reading from the frame buffer is quite common, e.g. to
scroll it. This makes scrolling very slow.

This series adds a new feature which supports copying modified parts of
the frame buffer to the uncached hardware buffer. This speeds up scrolling
dramatically on x86 so the extra complexity cost seems worth it.

In an extreme case, the time to print the environment on minnowboard with
1280x1024 and CONFIG_CONSOLE_SCROLL_LINES disabled is reduced
significantly, from 13 seconds to 300ms.

Changes in v3:
- Drop unnecessary variable

Changes in v2:
- Simplify return sequence in vidconsole_memmove() since there is no logging

Simon Glass (26):
  x86: fsp: Reinit the FPU after FSP meminit
  console: Add a way to output to serial only
  video: Show an error when a vidconsole function fails
  sandbox: video: Allow selection of rotated console
  video: Split out expression parts into variables
  video: Adjust rotated console to start at right edge
  video: Drop unnecessary #ifdef around vid_console_color()
  video: Add a comment for struct video_uc_platdata
  video: Add support for copying to a hardware framebuffer
  video: Set up the copy framebuffer when enabled
  video: Clear the copy framebuffer when clearing the screen
  video: Add helpers for vidconsole for the copy framebuffer
  video: Update normal console to support copy buffer
  video: Update truetype console to support copy buffer
  video: Update rotated console to support copy buffer
  video: Update the copy framebuffer when writing bitmaps
  video: Add comments to struct sandbox_sdl_plat
  video: sandbox: Add support for the copy framebuffer
  video: pci: Set up the copy framebuffer
  x86: fsp: video: Allocate a frame buffer when needed
  video: Correctly handle multiple framebuffers
  x86: video: Support copy framebuffer with probed devices
  chromebook_samus: Enable the copy framebuffer
  chromebook_link: Enable the copy framebuffer
  minnowmax: Enable the copy framebuffer
  x86: minnowmax: Drop screen resolution to 1024x768

 arch/x86/cpu/i386/cpu.c            |   5 ++
 arch/x86/include/asm/u-boot-x86.h  |   8 +++
 arch/x86/lib/fsp/fsp_graphics.c    |  12 ++++
 arch/x86/lib/fsp2/fsp_meminit.c    |   1 +
 common/console.c                   |  28 ++++++--
 configs/chromebook_link_defconfig  |   2 +-
 configs/chromebook_samus_defconfig |   2 +-
 configs/minnowmax_defconfig        |   4 +-
 configs/sandbox_defconfig          |   1 +
 drivers/pci/pci_rom.c              |  22 +++++-
 drivers/video/Kconfig              |  31 +++++++++
 drivers/video/broadwell_igd.c      |  16 ++++-
 drivers/video/console_normal.c     |  26 +++++++-
 drivers/video/console_rotate.c     | 103 ++++++++++++++++++++---------
 drivers/video/console_truetype.c   |  43 ++++++++----
 drivers/video/ivybridge_igd.c      |  26 ++++++--
 drivers/video/sandbox_sdl.c        |  10 ++-
 drivers/video/vesa.c               |  30 ++++++++-
 drivers/video/vidconsole-uclass.c  |  38 ++++++++++-
 drivers/video/video-uclass.c       |  93 +++++++++++++++++++++++++-
 drivers/video/video_bmp.c          |  16 ++++-
 include/console.h                  |  13 ++++
 include/dm/test.h                  |  14 +++-
 include/video.h                    |  41 ++++++++++++
 include/video_console.h            |  51 +++++++++++++-
 test/dm/video.c                    |  60 ++++++++++-------
 26 files changed, 594 insertions(+), 102 deletions(-)

Comments

Bin Meng July 7, 2020, 6:43 a.m. UTC | #1
On Fri, Jul 3, 2020 at 11:12 AM Simon Glass <sjg at chromium.org> wrote:
>
> (resent for Bin, rebased to u-boot/next)
>
> Some architectures use a cached framebuffer and flush the cache as needed
> so that changes are visible. This is supported by U-Boot.
>
> However x86 uses an uncached framebuffer with a 'write-combining' feature
> to speed up writes. Reads are permitted but they are extremely expensive.
>
> Unfortunately, reading from the frame buffer is quite common, e.g. to
> scroll it. This makes scrolling very slow.
>
> This series adds a new feature which supports copying modified parts of
> the frame buffer to the uncached hardware buffer. This speeds up scrolling
> dramatically on x86 so the extra complexity cost seems worth it.
>
> In an extreme case, the time to print the environment on minnowboard with
> 1280x1024 and CONFIG_CONSOLE_SCROLL_LINES disabled is reduced
> significantly, from 13 seconds to 300ms.
>
> Changes in v3:
> - Drop unnecessary variable
>
> Changes in v2:
> - Simplify return sequence in vidconsole_memmove() since there is no logging
>
> Simon Glass (26):
>   x86: fsp: Reinit the FPU after FSP meminit
>   console: Add a way to output to serial only
>   video: Show an error when a vidconsole function fails
>   sandbox: video: Allow selection of rotated console
>   video: Split out expression parts into variables
>   video: Adjust rotated console to start at right edge
>   video: Drop unnecessary #ifdef around vid_console_color()
>   video: Add a comment for struct video_uc_platdata
>   video: Add support for copying to a hardware framebuffer
>   video: Set up the copy framebuffer when enabled
>   video: Clear the copy framebuffer when clearing the screen
>   video: Add helpers for vidconsole for the copy framebuffer
>   video: Update normal console to support copy buffer
>   video: Update truetype console to support copy buffer
>   video: Update rotated console to support copy buffer
>   video: Update the copy framebuffer when writing bitmaps
>   video: Add comments to struct sandbox_sdl_plat
>   video: sandbox: Add support for the copy framebuffer
>   video: pci: Set up the copy framebuffer
>   x86: fsp: video: Allocate a frame buffer when needed
>   video: Correctly handle multiple framebuffers
>   x86: video: Support copy framebuffer with probed devices
>   chromebook_samus: Enable the copy framebuffer
>   chromebook_link: Enable the copy framebuffer
>   minnowmax: Enable the copy framebuffer
>   x86: minnowmax: Drop screen resolution to 1024x768
>
>  arch/x86/cpu/i386/cpu.c            |   5 ++
>  arch/x86/include/asm/u-boot-x86.h  |   8 +++
>  arch/x86/lib/fsp/fsp_graphics.c    |  12 ++++
>  arch/x86/lib/fsp2/fsp_meminit.c    |   1 +
>  common/console.c                   |  28 ++++++--
>  configs/chromebook_link_defconfig  |   2 +-
>  configs/chromebook_samus_defconfig |   2 +-
>  configs/minnowmax_defconfig        |   4 +-
>  configs/sandbox_defconfig          |   1 +
>  drivers/pci/pci_rom.c              |  22 +++++-
>  drivers/video/Kconfig              |  31 +++++++++
>  drivers/video/broadwell_igd.c      |  16 ++++-
>  drivers/video/console_normal.c     |  26 +++++++-
>  drivers/video/console_rotate.c     | 103 ++++++++++++++++++++---------
>  drivers/video/console_truetype.c   |  43 ++++++++----
>  drivers/video/ivybridge_igd.c      |  26 ++++++--
>  drivers/video/sandbox_sdl.c        |  10 ++-
>  drivers/video/vesa.c               |  30 ++++++++-
>  drivers/video/vidconsole-uclass.c  |  38 ++++++++++-
>  drivers/video/video-uclass.c       |  93 +++++++++++++++++++++++++-
>  drivers/video/video_bmp.c          |  16 ++++-
>  include/console.h                  |  13 ++++
>  include/dm/test.h                  |  14 +++-
>  include/video.h                    |  41 ++++++++++++
>  include/video_console.h            |  51 +++++++++++++-
>  test/dm/video.c                    |  60 ++++++++++-------
>  26 files changed, 594 insertions(+), 102 deletions(-)
>
> --

series applied to u-boot-x86, thanks!