Message ID | 20250319083021.6472-1-tzimmermann@suse.de (mailing list archive) |
---|---|
Headers | show |
Series | drm: Provide helpers for system framebuffers and add efidrm/vesadrm | expand |
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. I am willing to open a merge request, but freedesktop is readonly for now during their migration.
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 > > >