git: e2a08ac9ce42 - main - riscv: enable EFI framebuffer

From: Mitchell Horne <mhorne_at_FreeBSD.org>
Date: Mon, 03 Mar 2025 16:12:29 UTC
The branch main has been updated by mhorne:

URL: https://cgit.FreeBSD.org/src/commit/?id=e2a08ac9ce424f543a2f03c67fb882fdabbdd32a

commit e2a08ac9ce424f543a2f03c67fb882fdabbdd32a
Author:     Mitchell Horne <mhorne@FreeBSD.org>
AuthorDate: 2025-03-03 15:46:39 +0000
Commit:     Mitchell Horne <mhorne@FreeBSD.org>
CommitDate: 2025-03-03 16:12:15 +0000

    riscv: enable EFI framebuffer
    
    Pass framebuffer information from loader(8) to the kernel via the
    MODINFOMD_EFI_FB metadata field.
    
    Enable the vt_efifb driver. A small tweak is required to work around the
    lack of VM_MEMATTR_WRITE_COMBINING on this platform; we use
    VM_MEMATTR_UNCACHEABLE instead.
    
    Sponsored by:   The FreeBSD Foundation
    MFC after:      1 week
    Differential Revision:  https://reviews.freebsd.org/D48884
---
 stand/efi/loader/bootinfo.c  | 2 +-
 sys/dev/vt/hw/efifb/efifb.c  | 9 +++++++--
 sys/riscv/conf/GENERIC       | 1 +
 sys/riscv/include/metadata.h | 1 +
 4 files changed, 10 insertions(+), 3 deletions(-)

diff --git a/stand/efi/loader/bootinfo.c b/stand/efi/loader/bootinfo.c
index 3e74a9228b5e..ca86a319613f 100644
--- a/stand/efi/loader/bootinfo.c
+++ b/stand/efi/loader/bootinfo.c
@@ -182,7 +182,7 @@ bi_load_efi_data(struct preloaded_file *kfp, bool exit_bs)
 	struct efi_map_header *efihdr;
 	bool do_vmap;
 
-#if defined(__amd64__) || defined(__aarch64__) || defined(__i386__)
+#ifdef MODINFOMD_EFI_FB
 	struct efi_fb efifb;
 
 	efifb.fb_addr = gfx_state.tg_fb.fb_addr;
diff --git a/sys/dev/vt/hw/efifb/efifb.c b/sys/dev/vt/hw/efifb/efifb.c
index eda05ec3d203..ad49b6735998 100644
--- a/sys/dev/vt/hw/efifb/efifb.c
+++ b/sys/dev/vt/hw/efifb/efifb.c
@@ -96,9 +96,11 @@ vt_efifb_init(struct vt_device *vd)
 {
 	struct fb_info	*info;
 	struct efi_fb	*efifb;
-	int		memattr;
+	vm_memattr_t	memattr;
 	int		roff, goff, boff;
-	char		attr[16];
+
+#ifdef VM_MEMATTR_WRITE_COMBINING
+	char attr[16];
 
 	/*
 	 * XXX TODO: I think there's more nuance here than we're acknowledging,
@@ -122,6 +124,9 @@ vt_efifb_init(struct vt_device *vd)
 			memattr = VM_MEMATTR_UNCACHEABLE;
 		}
 	}
+#else
+	memattr = VM_MEMATTR_UNCACHEABLE;
+#endif
 
 	info = vd->vd_softc;
 	if (info == NULL)
diff --git a/sys/riscv/conf/GENERIC b/sys/riscv/conf/GENERIC
index 34426f167963..8dca3bdb3369 100644
--- a/sys/riscv/conf/GENERIC
+++ b/sys/riscv/conf/GENERIC
@@ -140,6 +140,7 @@ device		uart_ns8250	# ns8250-type UART driver
 
 # Console
 device		vt
+device		vt_efifb
 device		kbdmux
 
 # RTC
diff --git a/sys/riscv/include/metadata.h b/sys/riscv/include/metadata.h
index fbc0afce5c10..6ade03e15ea3 100644
--- a/sys/riscv/include/metadata.h
+++ b/sys/riscv/include/metadata.h
@@ -30,6 +30,7 @@
 
 #define	MODINFOMD_DTBP		0x1001
 #define	MODINFOMD_EFI_MAP	0x1002
+#define	MODINFOMD_EFI_FB	0x1003
 
 struct efi_map_header {
 	size_t		memory_size;