|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [PATCH RFC 2/3] xen/arm: efi: Introduce and fill the vga_console_info
From: Julien Grall <jgrall@xxxxxxxxxx>
In a follow-up patch will we want to add support for EFI framebuffer
in dom0. Yet, Xen may not use the framebuffer, so it would be ideal
to not have to enable CONFIG_VIDEO/CONFIG_VGA.
Introduce vga_console_info in a hacky way and move the code
to fill it up from x86 to common.
Signed-off-by: Julien Grall <jgrall@xxxxxxxxxx>
----
This is a bit of a hack. Sent early to gather opinion on whether
we should enable allow Dom0 to use the EFI Framebuffer even
if Xen is built with CONFIG_VIDEO=n on Arm.
---
xen/arch/arm/efi/efi-boot.h | 6 ---
xen/arch/arm/setup.c | 4 ++
xen/arch/x86/efi/efi-boot.h | 72 ------------------------------------
xen/common/efi/boot.c | 74 ++++++++++++++++++++++++++++++++++++-
xen/include/xen/vga.h | 2 +-
5 files changed, 78 insertions(+), 80 deletions(-)
diff --git a/xen/arch/arm/efi/efi-boot.h b/xen/arch/arm/efi/efi-boot.h
index ae8627134e5a..17a3d46c59ae 100644
--- a/xen/arch/arm/efi/efi-boot.h
+++ b/xen/arch/arm/efi/efi-boot.h
@@ -1000,12 +1000,6 @@ static void __init efi_arch_console_init(UINTN cols,
UINTN rows)
{
}
-static void __init efi_arch_video_init(EFI_GRAPHICS_OUTPUT_PROTOCOL *gop,
- UINTN info_size,
- EFI_GRAPHICS_OUTPUT_MODE_INFORMATION
*mode_info)
-{
-}
-
static void __init efi_arch_flush_dcache_area(const void *vaddr, UINTN size)
{
__flush_dcache_area(vaddr, size);
diff --git a/xen/arch/arm/setup.c b/xen/arch/arm/setup.c
index d5d0792ed48a..a336ee58179c 100644
--- a/xen/arch/arm/setup.c
+++ b/xen/arch/arm/setup.c
@@ -71,6 +71,10 @@ static unsigned long opt_xenheap_megabytes __initdata;
integer_param("xenheap_megabytes", opt_xenheap_megabytes);
#endif
+#ifndef CONFIG_VIDEO
+struct xen_vga_console_info vga_console_info;
+#endif
+
domid_t __read_mostly max_init_domid;
static __used void init_done(void)
diff --git a/xen/arch/x86/efi/efi-boot.h b/xen/arch/x86/efi/efi-boot.h
index f69509a2103a..cba3fa75a475 100644
--- a/xen/arch/x86/efi/efi-boot.h
+++ b/xen/arch/x86/efi/efi-boot.h
@@ -3,7 +3,6 @@
* is intended to be included by common/efi/boot.c _only_, and
* therefore can define arch specific global variables.
*/
-#include <xen/vga.h>
#include <asm/e820.h>
#include <asm/edd.h>
#include <asm/microcode.h>
@@ -497,77 +496,6 @@ static void __init efi_arch_console_init(UINTN cols, UINTN
rows)
#endif
}
-static void __init efi_arch_video_init(EFI_GRAPHICS_OUTPUT_PROTOCOL *gop,
- UINTN info_size,
- EFI_GRAPHICS_OUTPUT_MODE_INFORMATION
*mode_info)
-{
-#ifdef CONFIG_VIDEO
- int bpp = 0;
-
- switch ( mode_info->PixelFormat )
- {
- case PixelRedGreenBlueReserved8BitPerColor:
- vga_console_info.u.vesa_lfb.red_pos = 0;
- vga_console_info.u.vesa_lfb.red_size = 8;
- vga_console_info.u.vesa_lfb.green_pos = 8;
- vga_console_info.u.vesa_lfb.green_size = 8;
- vga_console_info.u.vesa_lfb.blue_pos = 16;
- vga_console_info.u.vesa_lfb.blue_size = 8;
- vga_console_info.u.vesa_lfb.rsvd_pos = 24;
- vga_console_info.u.vesa_lfb.rsvd_size = 8;
- bpp = 32;
- break;
- case PixelBlueGreenRedReserved8BitPerColor:
- vga_console_info.u.vesa_lfb.red_pos = 16;
- vga_console_info.u.vesa_lfb.red_size = 8;
- vga_console_info.u.vesa_lfb.green_pos = 8;
- vga_console_info.u.vesa_lfb.green_size = 8;
- vga_console_info.u.vesa_lfb.blue_pos = 0;
- vga_console_info.u.vesa_lfb.blue_size = 8;
- vga_console_info.u.vesa_lfb.rsvd_pos = 24;
- vga_console_info.u.vesa_lfb.rsvd_size = 8;
- bpp = 32;
- break;
- case PixelBitMask:
- bpp = set_color(mode_info->PixelInformation.RedMask, bpp,
- &vga_console_info.u.vesa_lfb.red_pos,
- &vga_console_info.u.vesa_lfb.red_size);
- bpp = set_color(mode_info->PixelInformation.GreenMask, bpp,
- &vga_console_info.u.vesa_lfb.green_pos,
- &vga_console_info.u.vesa_lfb.green_size);
- bpp = set_color(mode_info->PixelInformation.BlueMask, bpp,
- &vga_console_info.u.vesa_lfb.blue_pos,
- &vga_console_info.u.vesa_lfb.blue_size);
- if ( mode_info->PixelInformation.ReservedMask )
- bpp = set_color(mode_info->PixelInformation.ReservedMask, bpp,
- &vga_console_info.u.vesa_lfb.rsvd_pos,
- &vga_console_info.u.vesa_lfb.rsvd_size);
- if ( bpp > 0 )
- break;
- /* fall through */
- default:
- PrintErr(L"Current graphics mode is unsupported!\r\n");
- bpp = 0;
- break;
- }
- if ( bpp > 0 )
- {
- vga_console_info.video_type = XEN_VGATYPE_EFI_LFB;
- vga_console_info.u.vesa_lfb.gbl_caps = 2; /* possibly non-VGA */
- vga_console_info.u.vesa_lfb.width =
- mode_info->HorizontalResolution;
- vga_console_info.u.vesa_lfb.height = mode_info->VerticalResolution;
- vga_console_info.u.vesa_lfb.bits_per_pixel = bpp;
- vga_console_info.u.vesa_lfb.bytes_per_line =
- (mode_info->PixelsPerScanLine * bpp + 7) >> 3;
- vga_console_info.u.vesa_lfb.lfb_base = gop->Mode->FrameBufferBase;
- vga_console_info.u.vesa_lfb.ext_lfb_base = gop->Mode->FrameBufferBase
>> 32;
- vga_console_info.u.vesa_lfb.lfb_size =
- (gop->Mode->FrameBufferSize + 0xffff) >> 16;
- }
-#endif
-}
-
static void __init efi_arch_memory_setup(void)
{
unsigned int i;
diff --git a/xen/common/efi/boot.c b/xen/common/efi/boot.c
index 80e4e32623c4..2bc38ae40fff 100644
--- a/xen/common/efi/boot.c
+++ b/xen/common/efi/boot.c
@@ -20,6 +20,7 @@
#endif
#include <xen/string.h>
#include <xen/stringify.h>
+#include <xen/vga.h>
#ifdef CONFIG_X86
/*
* Keep this arch-specific modified include in the common file, as moving
@@ -1025,6 +1026,77 @@ static void __init efi_get_apple_properties(void)
}
}
+static void __init efi_video_init(EFI_GRAPHICS_OUTPUT_PROTOCOL *gop,
+ UINTN info_size,
+ EFI_GRAPHICS_OUTPUT_MODE_INFORMATION
*mode_info)
+{
+#if defined(CONFIG_VIDEO) || defined(CONFIG_ARM)
+ int bpp = 0;
+
+ switch ( mode_info->PixelFormat )
+ {
+ case PixelRedGreenBlueReserved8BitPerColor:
+ vga_console_info.u.vesa_lfb.red_pos = 0;
+ vga_console_info.u.vesa_lfb.red_size = 8;
+ vga_console_info.u.vesa_lfb.green_pos = 8;
+ vga_console_info.u.vesa_lfb.green_size = 8;
+ vga_console_info.u.vesa_lfb.blue_pos = 16;
+ vga_console_info.u.vesa_lfb.blue_size = 8;
+ vga_console_info.u.vesa_lfb.rsvd_pos = 24;
+ vga_console_info.u.vesa_lfb.rsvd_size = 8;
+ bpp = 32;
+ break;
+ case PixelBlueGreenRedReserved8BitPerColor:
+ vga_console_info.u.vesa_lfb.red_pos = 16;
+ vga_console_info.u.vesa_lfb.red_size = 8;
+ vga_console_info.u.vesa_lfb.green_pos = 8;
+ vga_console_info.u.vesa_lfb.green_size = 8;
+ vga_console_info.u.vesa_lfb.blue_pos = 0;
+ vga_console_info.u.vesa_lfb.blue_size = 8;
+ vga_console_info.u.vesa_lfb.rsvd_pos = 24;
+ vga_console_info.u.vesa_lfb.rsvd_size = 8;
+ bpp = 32;
+ break;
+ case PixelBitMask:
+ bpp = set_color(mode_info->PixelInformation.RedMask, bpp,
+ &vga_console_info.u.vesa_lfb.red_pos,
+ &vga_console_info.u.vesa_lfb.red_size);
+ bpp = set_color(mode_info->PixelInformation.GreenMask, bpp,
+ &vga_console_info.u.vesa_lfb.green_pos,
+ &vga_console_info.u.vesa_lfb.green_size);
+ bpp = set_color(mode_info->PixelInformation.BlueMask, bpp,
+ &vga_console_info.u.vesa_lfb.blue_pos,
+ &vga_console_info.u.vesa_lfb.blue_size);
+ if ( mode_info->PixelInformation.ReservedMask )
+ bpp = set_color(mode_info->PixelInformation.ReservedMask, bpp,
+ &vga_console_info.u.vesa_lfb.rsvd_pos,
+ &vga_console_info.u.vesa_lfb.rsvd_size);
+ if ( bpp > 0 )
+ break;
+ /* fall through */
+ default:
+ PrintErr(L"Current graphics mode is unsupported!\r\n");
+ bpp = 0;
+ break;
+ }
+ if ( bpp > 0 )
+ {
+ vga_console_info.video_type = XEN_VGATYPE_EFI_LFB;
+ vga_console_info.u.vesa_lfb.gbl_caps = 2; /* possibly non-VGA */
+ vga_console_info.u.vesa_lfb.width =
+ mode_info->HorizontalResolution;
+ vga_console_info.u.vesa_lfb.height = mode_info->VerticalResolution;
+ vga_console_info.u.vesa_lfb.bits_per_pixel = bpp;
+ vga_console_info.u.vesa_lfb.bytes_per_line =
+ (mode_info->PixelsPerScanLine * bpp + 7) >> 3;
+ vga_console_info.u.vesa_lfb.lfb_base = gop->Mode->FrameBufferBase;
+ vga_console_info.u.vesa_lfb.ext_lfb_base = gop->Mode->FrameBufferBase
>> 32;
+ vga_console_info.u.vesa_lfb.lfb_size =
+ (gop->Mode->FrameBufferSize + 0xffff) >> 16;
+ }
+#endif
+}
+
static void __init efi_set_gop_mode(EFI_GRAPHICS_OUTPUT_PROTOCOL *gop, UINTN
gop_mode)
{
EFI_GRAPHICS_OUTPUT_MODE_INFORMATION *mode_info;
@@ -1042,7 +1114,7 @@ static void __init
efi_set_gop_mode(EFI_GRAPHICS_OUTPUT_PROTOCOL *gop, UINTN gop
/* Get graphics and frame buffer info. */
status = gop->QueryMode(gop, gop->Mode->Mode, &info_size, &mode_info);
if ( !EFI_ERROR(status) )
- efi_arch_video_init(gop, info_size, mode_info);
+ efi_video_init(gop, info_size, mode_info);
}
#define INVALID_VIRTUAL_ADDRESS (0xBAAADUL << \
diff --git a/xen/include/xen/vga.h b/xen/include/xen/vga.h
index f72b63d446b1..39b4c2eae198 100644
--- a/xen/include/xen/vga.h
+++ b/xen/include/xen/vga.h
@@ -11,7 +11,7 @@
#include <xen/video.h>
-#ifdef CONFIG_VGA
+#if defined(CONFIG_VGA) || defined(CONFIG_ARM)
extern struct xen_vga_console_info vga_console_info;
#endif
--
2.32.0
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |