Hi
Am 19.03.25 um 13:50 schrieb nerdopolis:
On Wednesday, March 19, 2025 3:44:59 AM EDT Thomas Zimmermann wrote:
This series simplifies the existing ofdrm and simepldrm drivers,
and adds new drivers for EFI- and VESA-based framebuffers. Existing
drivers for system framebuffers, ofdrm and simpledrm, share much of
their mode-setting pipeline. The major difference between the two
drivers is in how they retrieve the framebuffer from the systems.
Hence, it makes sense to share some of the pipeline implementation.
With the shared helpers in place, we can then add dedicated drivers
for EFI and VESA easily.
Patches 1 to 3 clean up obsolete artifacts from ofdrm and simpledrm.
Patch 4 moves both drivers from tiny/ into their own subdirectory
sysfb/. The name aligns with the naming in drivers/firmware/sysfb.c
to signal the connection. It's the firmware code that creates most
of the system-framebuffer devices that these drivers operate on. The
patch also adds a separate menu in Kconfig.
Patches 5 to 11 unify the mode-setting pipeline between ofdrm and
simpledrm. Either both drivers already use the same implementation
or they can easily do so. There've been previous attempts to unify
some of the drivers' code, but with little success. This time the
helpers will be shared among 4 drivers, so it's already much more
successful than before.
Patch 12 adds EDID support to ofdrm. The EDID data can be found in
some Macintosh's DeviceTree next to the framebuffer configuration.
EDID support will be useful for EFI and VESA as well.
Patch 13 adds another helper for screen_info that will be required
by EFI and VESA drivers.
Patch 14 and 15 add efidrm, a DRM driver that operates on EFI-provided
framebuffers. It uses the shared sysfb helpers. The immediate benefit
over simpledrm is the support for EFI's various types of memory caching
on the framebuffer. Simpledrm only supported WriteCombine caching.
There's also EDID support if the kernel's edid_info has been initialized.
This feature needs to be implemented in the kernel's efistub library.
Patches 16 to 18 add vesadrm, a DRM driver that operates in VESA-
provided framebuffers. It is very much like efidrm, but tailored
towards VESA features. It has EDID support and there's a patch at [1]
for grub to provide the data as part of the kernel's boot parameters.
Vesadrm also supports gamma ramps. Together with EDID, this allows
for gamma correction and night mode. Gnome already does that.
Future directions: Efidrm requires EDID data that has to be provided
by the efistub library. There is an EFI call to do so. Vesadrm currently
requires a discrete color mode. Support for palette modes can be added
later. There's still a bit of code duplication among palette handling.
We have more drivers that use similar code for palette LUTs, such as
ast and mgag200. We should try to provide generic palette helpers for
all these drivers.
This series has been tested on various devices that require the provided
drivers.
[1] https://build.opensuse.org/projects/home:tdz:branches:Base:System/packages/grub2/files/grub2-provide-edid.patch?expand=1
Thomas Zimmermann (18):
drm/ofdrm: Remove struct ofdrm_device.pdev
drm/ofdrm: Open-code drm_simple_encoder_init()
drm/simpledrm: Remove struct simpledrm_device.nformats
drm: Move sysfb drivers into separate subdirectory
drm/sysfb: Add struct drm_sysfb_device
drm/sysfb: Provide single mode-init helper
drm/sysfb: Merge mode-config functions
drm/sysfb: Merge connector functions
drm/sysfb: Maintain CRTC state in struct drm_sysfb_crtc_state
drm/sysfb: Merge CRTC functions
drm/sysfb: Merge primary-plane functions
drm/sysfb: ofdrm: Add EDID support
firmware: sysfb: Move bpp-depth calculation into screen_info helper
drm/sysfb: Add efidrm for EFI displays
drm/sysfb: efidrm: Add EDID support
drm/sysfb: Add vesadrm for VESA displays
drm/sysfb: vesadrm: Add EDID support
drm/sysfb: vesadrm: Add gamma correction
MAINTAINERS | 3 +-
drivers/firmware/sysfb_simplefb.c | 31 +-
drivers/gpu/drm/Kconfig | 2 +
drivers/gpu/drm/Makefile | 1 +
drivers/gpu/drm/sysfb/Kconfig | 76 +++
drivers/gpu/drm/sysfb/Makefile | 8 +
drivers/gpu/drm/sysfb/drm_sysfb_helper.c | 319 ++++++++++
drivers/gpu/drm/sysfb/drm_sysfb_helper.h | 136 ++++
drivers/gpu/drm/sysfb/efidrm.c | 495 +++++++++++++++
drivers/gpu/drm/{tiny => sysfb}/ofdrm.c | 364 ++---------
drivers/gpu/drm/{tiny => sysfb}/simpledrm.c | 237 +------
drivers/gpu/drm/sysfb/vesadrm.c | 660 ++++++++++++++++++++
drivers/gpu/drm/tiny/Kconfig | 32 -
drivers/gpu/drm/tiny/Makefile | 2 -
drivers/video/screen_info_generic.c | 36 ++
include/linux/screen_info.h | 9 +
include/video/pixel_format.h | 41 ++
17 files changed, 1885 insertions(+), 567 deletions(-)
create mode 100644 drivers/gpu/drm/sysfb/Kconfig
create mode 100644 drivers/gpu/drm/sysfb/Makefile
create mode 100644 drivers/gpu/drm/sysfb/drm_sysfb_helper.c
create mode 100644 drivers/gpu/drm/sysfb/drm_sysfb_helper.h
create mode 100644 drivers/gpu/drm/sysfb/efidrm.c
rename drivers/gpu/drm/{tiny => sysfb}/ofdrm.c (75%)
rename drivers/gpu/drm/{tiny => sysfb}/simpledrm.c (76%)
create mode 100644 drivers/gpu/drm/sysfb/vesadrm.c
create mode 100644 include/video/pixel_format.h
FYI When this gets merged,
https://gitlab.freedesktop.org/xorg/xserver/-/blob/master/hw/xfree86/common/xf86platformBus.c?ref_type=heads#L589
might need to be updated to add exceptions for vesadrm and efidrm like there
is for simpledrm.
Yeah, we need a workaround for each of these drivers unfortunately.
I am willing to open a merge request, but freedesktop is readonly for now
during their migration.
No worries, I'll provide the patches.
Best regards
Thomas
--
--
Thomas Zimmermann
Graphics Driver Developer
SUSE Software Solutions Germany GmbH
Frankenstrasse 146, 90461 Nuernberg, Germany
GF: Ivo Totev, Andrew Myers, Andrew McDonald, Boudien Moerman
HRB 36809 (AG Nuernberg)