The simplefb and simpledrm drivers match against a "simple-framebuffer" device, but for aarch64 this is only registered when using Device Trees and there's a node with a "simple-framebuffer" compatible string.
There is no code to register a "simple-framebuffer" platform device when using EFI instead. In fact, the only platform device that's registered in this case is an "efi-framebuffer", which means that the efifb driver is the only driver supported to have an early console with EFI on aarch64.
The x86 architecture platform has a Generic System Framebuffers (sysfb) support, that register a system frambuffer platform device. It either registers a "simple-framebuffer" for the simple{fb,drm} drivers or legacy VGA/EFI FB devices for the vgafb/efifb drivers.
The sysfb is generic enough to be reused by other architectures and can be moved out of the arch/x86 directory to drivers/firmware, allowing the EFI logic used by non-x86 architectures to be folded into sysfb as well.
Patch #1 in this series do the former while patch #2 do the latter. It has been tested on x86_64 and aarch64 machines using the efifb, simplefb and simpledrm drivers. But more testing will be highly appreciated, to make sure that no regressions are being introduced by these changes.
The series touches different subystems and will need coordination between maintainers. Ard Biesheuvel said that can be merged through the EFI tree.
Best regards, Javier
Changes in v2: - Use default y and depends on X86 instead doing a select in arch/x86/Kconfig. - Also enable the SYSFB Kconfig option when COMPILE_TEST. - Improve commit message to explain why is useful for other arches to use this. - Use "depends on" for the supported architectures instead of selecting it. - Improve commit message to explain the benefits of reusing sysfb for !X86.
Javier Martinez Canillas (2): drivers/firmware: move x86 Generic System Framebuffers support drivers/firmware: consolidate EFI framebuffer setup for all arches
arch/arm/include/asm/efi.h | 5 +- arch/arm64/include/asm/efi.h | 5 +- arch/riscv/include/asm/efi.h | 5 +- arch/x86/Kconfig | 26 ------ arch/x86/kernel/Makefile | 3 - drivers/firmware/Kconfig | 32 +++++++ drivers/firmware/Makefile | 2 + drivers/firmware/efi/Makefile | 2 + drivers/firmware/efi/efi-init.c | 90 ------------------- .../firmware/efi}/sysfb_efi.c | 79 +++++++++++++++- {arch/x86/kernel => drivers/firmware}/sysfb.c | 42 +++++---- .../firmware}/sysfb_simplefb.c | 31 ++++--- .../x86/include/asm => include/linux}/sysfb.h | 34 +++---- 13 files changed, 180 insertions(+), 176 deletions(-) rename {arch/x86/kernel => drivers/firmware/efi}/sysfb_efi.c (84%) rename {arch/x86/kernel => drivers/firmware}/sysfb.c (70%) rename {arch/x86/kernel => drivers/firmware}/sysfb_simplefb.c (82%) rename {arch/x86/include/asm => include/linux}/sysfb.h (68%)
The x86 architecture has generic support to register a system framebuffer platform device. It either registers a "simple-framebuffer" if the config option CONFIG_X86_SYSFB is enabled, or a legacy VGA/VBE/EFI FB device.
But the code is generic enough to be reused by other architectures and can be moved out of the arch/x86 directory.
This will allow to also support the simple{fb,drm} drivers on non-x86 EFI platforms, such as aarch64 where these drivers are only supported with DT.
Signed-off-by: Javier Martinez Canillas javierm@redhat.com ---
Changes in v2: - Use default y and depends on X86 instead doing a select in arch/x86/Kconfig. - Also enable the SYSFB Kconfig option when COMPILE_TEST. - Improve commit message to explain why is useful for other arches to use this.
arch/x86/Kconfig | 26 --------------- arch/x86/kernel/Makefile | 3 -- drivers/firmware/Kconfig | 32 +++++++++++++++++++ drivers/firmware/Makefile | 2 ++ drivers/firmware/efi/Makefile | 2 ++ .../firmware/efi}/sysfb_efi.c | 2 +- {arch/x86/kernel => drivers/firmware}/sysfb.c | 2 +- .../firmware}/sysfb_simplefb.c | 2 +- .../x86/include/asm => include/linux}/sysfb.h | 6 ++-- 9 files changed, 42 insertions(+), 35 deletions(-) rename {arch/x86/kernel => drivers/firmware/efi}/sysfb_efi.c (99%) rename {arch/x86/kernel => drivers/firmware}/sysfb.c (98%) rename {arch/x86/kernel => drivers/firmware}/sysfb_simplefb.c (99%) rename {arch/x86/include/asm => include/linux}/sysfb.h (95%)
diff --git a/arch/x86/Kconfig b/arch/x86/Kconfig index 39175aa072e..9907d4bed70 100644 --- a/arch/x86/Kconfig +++ b/arch/x86/Kconfig @@ -2796,32 +2796,6 @@ config AMD_NB def_bool y depends on CPU_SUP_AMD && PCI
-config X86_SYSFB - bool "Mark VGA/VBE/EFI FB as generic system framebuffer" - help - Firmwares often provide initial graphics framebuffers so the BIOS, - bootloader or kernel can show basic video-output during boot for - user-guidance and debugging. Historically, x86 used the VESA BIOS - Extensions and EFI-framebuffers for this, which are mostly limited - to x86. - This option, if enabled, marks VGA/VBE/EFI framebuffers as generic - framebuffers so the new generic system-framebuffer drivers can be - used on x86. If the framebuffer is not compatible with the generic - modes, it is advertised as fallback platform framebuffer so legacy - drivers like efifb, vesafb and uvesafb can pick it up. - If this option is not selected, all system framebuffers are always - marked as fallback platform framebuffers as usual. - - Note: Legacy fbdev drivers, including vesafb, efifb, uvesafb, will - not be able to pick up generic system framebuffers if this option - is selected. You are highly encouraged to enable simplefb as - replacement if you select this option. simplefb can correctly deal - with generic system framebuffers. But you should still keep vesafb - and others enabled as fallback if a system framebuffer is - incompatible with simplefb. - - If unsure, say Y. - endmenu
diff --git a/arch/x86/kernel/Makefile b/arch/x86/kernel/Makefile index 0f66682ac02..4114ea47def 100644 --- a/arch/x86/kernel/Makefile +++ b/arch/x86/kernel/Makefile @@ -135,9 +135,6 @@ obj-$(CONFIG_X86_CHECK_BIOS_CORRUPTION) += check.o obj-$(CONFIG_SWIOTLB) += pci-swiotlb.o obj-$(CONFIG_OF) += devicetree.o obj-$(CONFIG_UPROBES) += uprobes.o -obj-y += sysfb.o -obj-$(CONFIG_X86_SYSFB) += sysfb_simplefb.o -obj-$(CONFIG_EFI) += sysfb_efi.o
obj-$(CONFIG_PERF_EVENTS) += perf_regs.o obj-$(CONFIG_TRACING) += tracepoint.o diff --git a/drivers/firmware/Kconfig b/drivers/firmware/Kconfig index b53ac9fc770..4392fc57cf3 100644 --- a/drivers/firmware/Kconfig +++ b/drivers/firmware/Kconfig @@ -251,6 +251,38 @@ config QCOM_SCM_DOWNLOAD_MODE_DEFAULT
Say Y here to enable "download mode" by default.
+config SYSFB + bool + default y + depends on X86 || COMPILE_TEST + +config X86_SYSFB + bool "Mark VGA/VBE/EFI FB as generic system framebuffer" + depends on SYSFB + help + Firmwares often provide initial graphics framebuffers so the BIOS, + bootloader or kernel can show basic video-output during boot for + user-guidance and debugging. Historically, x86 used the VESA BIOS + Extensions and EFI-framebuffers for this, which are mostly limited + to x86. + This option, if enabled, marks VGA/VBE/EFI framebuffers as generic + framebuffers so the new generic system-framebuffer drivers can be + used on x86. If the framebuffer is not compatible with the generic + modes, it is advertised as fallback platform framebuffer so legacy + drivers like efifb, vesafb and uvesafb can pick it up. + If this option is not selected, all system framebuffers are always + marked as fallback platform framebuffers as usual. + + Note: Legacy fbdev drivers, including vesafb, efifb, uvesafb, will + not be able to pick up generic system framebuffers if this option + is selected. You are highly encouraged to enable simplefb as + replacement if you select this option. simplefb can correctly deal + with generic system framebuffers. But you should still keep vesafb + and others enabled as fallback if a system framebuffer is + incompatible with simplefb. + + If unsure, say Y. + config TI_SCI_PROTOCOL tristate "TI System Control Interface (TISCI) Message Protocol" depends on TI_MESSAGE_MANAGER diff --git a/drivers/firmware/Makefile b/drivers/firmware/Makefile index 546ac8e7f6d..946dda07443 100644 --- a/drivers/firmware/Makefile +++ b/drivers/firmware/Makefile @@ -18,6 +18,8 @@ obj-$(CONFIG_FIRMWARE_MEMMAP) += memmap.o obj-$(CONFIG_RASPBERRYPI_FIRMWARE) += raspberrypi.o obj-$(CONFIG_FW_CFG_SYSFS) += qemu_fw_cfg.o obj-$(CONFIG_QCOM_SCM) += qcom_scm.o qcom_scm-smc.o qcom_scm-legacy.o +obj-$(CONFIG_SYSFB) += sysfb.o +obj-$(CONFIG_X86_SYSFB) += sysfb_simplefb.o obj-$(CONFIG_TI_SCI_PROTOCOL) += ti_sci.o obj-$(CONFIG_TRUSTED_FOUNDATIONS) += trusted_foundations.o obj-$(CONFIG_TURRIS_MOX_RWTM) += turris-mox-rwtm.o diff --git a/drivers/firmware/efi/Makefile b/drivers/firmware/efi/Makefile index 467e9425967..c02ff25dd47 100644 --- a/drivers/firmware/efi/Makefile +++ b/drivers/firmware/efi/Makefile @@ -36,6 +36,8 @@ obj-$(CONFIG_LOAD_UEFI_KEYS) += mokvar-table.o fake_map-y += fake_mem.o fake_map-$(CONFIG_X86) += x86_fake_mem.o
+obj-$(CONFIG_SYSFB) += sysfb_efi.o + arm-obj-$(CONFIG_EFI) := efi-init.o arm-runtime.o obj-$(CONFIG_ARM) += $(arm-obj-y) obj-$(CONFIG_ARM64) += $(arm-obj-y) diff --git a/arch/x86/kernel/sysfb_efi.c b/drivers/firmware/efi/sysfb_efi.c similarity index 99% rename from arch/x86/kernel/sysfb_efi.c rename to drivers/firmware/efi/sysfb_efi.c index 8a56a6d8009..9f035b15501 100644 --- a/arch/x86/kernel/sysfb_efi.c +++ b/drivers/firmware/efi/sysfb_efi.c @@ -21,10 +21,10 @@ #include <linux/mm.h> #include <linux/pci.h> #include <linux/screen_info.h> +#include <linux/sysfb.h> #include <video/vga.h>
#include <asm/efi.h> -#include <asm/sysfb.h>
enum { OVERRIDE_NONE = 0x0, diff --git a/arch/x86/kernel/sysfb.c b/drivers/firmware/sysfb.c similarity index 98% rename from arch/x86/kernel/sysfb.c rename to drivers/firmware/sysfb.c index 014ebd8ca86..1337515963d 100644 --- a/arch/x86/kernel/sysfb.c +++ b/drivers/firmware/sysfb.c @@ -32,7 +32,7 @@ #include <linux/platform_data/simplefb.h> #include <linux/platform_device.h> #include <linux/screen_info.h> -#include <asm/sysfb.h> +#include <linux/sysfb.h>
static __init int sysfb_init(void) { diff --git a/arch/x86/kernel/sysfb_simplefb.c b/drivers/firmware/sysfb_simplefb.c similarity index 99% rename from arch/x86/kernel/sysfb_simplefb.c rename to drivers/firmware/sysfb_simplefb.c index 298fc1edd9c..df892444ea1 100644 --- a/arch/x86/kernel/sysfb_simplefb.c +++ b/drivers/firmware/sysfb_simplefb.c @@ -18,7 +18,7 @@ #include <linux/platform_data/simplefb.h> #include <linux/platform_device.h> #include <linux/screen_info.h> -#include <asm/sysfb.h> +#include <linux/sysfb.h>
static const char simplefb_resname[] = "BOOTFB"; static const struct simplefb_format formats[] = SIMPLEFB_FORMATS; diff --git a/arch/x86/include/asm/sysfb.h b/include/linux/sysfb.h similarity index 95% rename from arch/x86/include/asm/sysfb.h rename to include/linux/sysfb.h index 9834eef7f03..3e5355769dc 100644 --- a/arch/x86/include/asm/sysfb.h +++ b/include/linux/sysfb.h @@ -1,6 +1,6 @@ /* SPDX-License-Identifier: GPL-2.0-or-later */ -#ifndef _ARCH_X86_KERNEL_SYSFB_H -#define _ARCH_X86_KERNEL_SYSFB_H +#ifndef _LINUX_SYSFB_H +#define _LINUX_SYSFB_H
/* * Generic System Framebuffers on x86 @@ -91,4 +91,4 @@ static inline int create_simplefb(const struct screen_info *si,
#endif /* CONFIG_X86_SYSFB */
-#endif /* _ARCH_X86_KERNEL_SYSFB_H */ +#endif /* _LINUX_SYSFB_H */
On Tue, Jun 01, 2021 at 04:59:11PM +0200, Javier Martinez Canillas wrote:
The x86 architecture has generic support to register a system framebuffer platform device. It either registers a "simple-framebuffer" if the config option CONFIG_X86_SYSFB is enabled, or a legacy VGA/VBE/EFI FB device.
But the code is generic enough to be reused by other architectures and can be moved out of the arch/x86 directory.
This will allow to also support the simple{fb,drm} drivers on non-x86 EFI platforms, such as aarch64 where these drivers are only supported with DT.
Signed-off-by: Javier Martinez Canillas javierm@redhat.com
Acked-by: Greg Kroah-Hartman gregkh@linuxfoundation.org
On Tue, Jun 01, 2021 at 04:59:10PM +0200, Javier Martinez Canillas wrote:
The series touches different subystems and will need coordination between maintainers. Ard Biesheuvel said that can be merged through the EFI tree.
I'm always happy when code from arch/x86/ moves away so
Acked-by: Borislav Petkov bp@suse.de
Btw, for the future, please CC everyone on the whole patchset - I had to go look at your 2/2 on lore to see what it does because I had only 1/2 in my mbox.
Thx.
Hello Borislav,
On 6/3/21 10:27 PM, Borislav Petkov wrote:
On Tue, Jun 01, 2021 at 04:59:10PM +0200, Javier Martinez Canillas wrote:
The series touches different subystems and will need coordination between maintainers. Ard Biesheuvel said that can be merged through the EFI tree.
I'm always happy when code from arch/x86/ moves away so
Acked-by: Borislav Petkov bp@suse.de
Thanks for the ack.
Btw, for the future, please CC everyone on the whole patchset - I had to go look at your 2/2 on lore to see what it does because I had only 1/2 in my mbox.
Yes, sorry about that. I just used what get_maintainer.pl --git-fallback suggested me, I'll make sure to include all people in Cc the next time.
Thx.
Best regards,
On Fri, Jun 04, 2021 at 11:41:29AM +0200, Javier Martinez Canillas wrote:
On 6/3/21 10:27 PM, Borislav Petkov wrote:
On Tue, Jun 01, 2021 at 04:59:10PM +0200, Javier Martinez Canillas wrote:
...
Btw, for the future, please CC everyone on the whole patchset - I had to go look at your 2/2 on lore to see what it does because I had only 1/2 in my mbox.
Yes, sorry about that. I just used what get_maintainer.pl --git-fallback suggested me, I'll make sure to include all people in Cc the next time.
For myself I wrote a script to try being smart [1]. At least it works for me in 99% of the cases. Otherwise I add manually --cc or other related options.
[1]: https://github.com/andy-shev/home-bin-tools/blob/master/ge2maintainer.sh
Feel free to modify (patches also are warmly welcome!).
On 6/4/21 2:20 PM, Andy Shevchenko wrote:
On Fri, Jun 04, 2021 at 11:41:29AM +0200, Javier Martinez Canillas wrote:
On 6/3/21 10:27 PM, Borislav Petkov wrote:
On Tue, Jun 01, 2021 at 04:59:10PM +0200, Javier Martinez Canillas wrote:
[snip]
For myself I wrote a script to try being smart [1]. At least it works for me in 99% of the cases. Otherwise I add manually --cc or other related options.
Thanks a lot for the pointer. I'll take a look!
Feel free to modify (patches also are warmly welcome!).
Best regards,
dri-devel@lists.freedesktop.org