Coreboot implements framebuffer support via simplefb. Provide a
native DRM driver. Keep the simplefb code for now.

For each firmware's provided framebuffer, we want a dedicated DRM
driver tailored towards the platform's feature set. The coreboot
framebuffer device creates a simplefb device for the provided
framebuffer. When the native graphics driver unloads the simplefb
device, it leaves behind a dangling pointer in the coreboot framebuffer
device. [1] This only works because the coreboot framebuffer device
never runs this code; even after the native driver took over the
hardware. At that point the underlying coreboot framebuffer is gone,
which is inconsistent with kernel state.

Additionally, the simplefb drivers handle simple-framebuffer nodes in
the DeviceTree, but were not meant for supporting arbitrary framebuffers.
The simplefb infrastructure should be phased out for non-DT use cases.
Coreboot is one of the final users of the code (besides n64).

Patches 1 to 4 of this series prepare the kernel's coreboot support for
the DRM driver. With patch 1, the coreboot framebuffer device will only
be created if it really handles the framebuffer. Some systems emulate
UEFI instead. The other 3 patches make coreboot drivers available to
other subsystems. A DRM driver will then be able to bind directly to a
coreboot device.

Patch 5 prepares the kernel's aperture helpers for coreboot devices.
This is required to handover hardware to the native graphics driver.

Patches 6 to 8 prepare DRM and add a new driver for the coreboot
framebuffer. The corebootdrm driver follows the pattern established by
similar drivers. It also uses the same sysfb helpers. It's fairly small
therefore.

Tested on an HP Chromebook with MrChromebox 4.16. Runs with Weston and
fbcon. Xorg requires an additional patch available at [2].

[1] 
https://elixir.bootlin.com/linux/v6.18/source/drivers/firmware/google/framebuffer-coreboot.c#L92
[2] 
https://gitlab.freedesktop.org/tzimmermann/xserver/-/commit/0b326aad28549762ed2b0e2bedf8f8a42f1f6b3b

Thomas Zimmermann (8):
  firmware: google: Do sysfb test before creating coreboot framebuffer
  firmware: google: Init coreboot bus with subsys_initcall()
  firmware: google: Clean up include statements in coreboot_table.h
  firmware: google: Export coreboot driver and device interfaces
  video/aperture: Support coreboot devices
  drm/sysfb: Remove duplicate declarations
  drm/sysfb: Generalize pixel-format matching
  drm/sysfb: corebootdrm: Add DRM driver for coreboot framebuffers

 drivers/firmware/google/Kconfig               |   1 +
 drivers/firmware/google/cbmem.c               |   4 +-
 drivers/firmware/google/coreboot_table.c      |  33 +-
 .../firmware/google/framebuffer-coreboot.c    |  20 +-
 drivers/firmware/google/memconsole-coreboot.c |   3 +-
 drivers/firmware/google/vpd.c                 |   3 +-
 drivers/gpu/drm/sysfb/Kconfig                 |  16 +
 drivers/gpu/drm/sysfb/Makefile                |   1 +
 drivers/gpu/drm/sysfb/corebootdrm.c           | 402 ++++++++++++++++++
 drivers/gpu/drm/sysfb/drm_sysfb.c             |  24 ++
 drivers/gpu/drm/sysfb/drm_sysfb_helper.h      |  17 +-
 drivers/gpu/drm/sysfb/drm_sysfb_screen_info.c |  30 --
 drivers/gpu/drm/sysfb/efidrm.c                |   8 +-
 drivers/gpu/drm/sysfb/vesadrm.c               |   8 +-
 drivers/video/aperture.c                      |  60 ++-
 include/linux/aperture.h                      |  16 +
 .../linux/coreboot.h                          |  29 +-
 17 files changed, 575 insertions(+), 100 deletions(-)
 create mode 100644 drivers/gpu/drm/sysfb/corebootdrm.c
 rename drivers/firmware/google/coreboot_table.h => include/linux/coreboot.h 
(86%)

-- 
2.52.0

Reply via email to