[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [PATCH RFC 2/3] xen/arm: efi: Introduce and fill the vga_console_info
On Sun, 6 Feb 2022, Julien Grall wrote: > 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. Yes, I think we should enable Dom0 to use the EFI framebuffer even if Xen is built with CONFIG_VIDEO=n. I think CONFIG_VIDEO should be about Xen's support for video output, not the guest's support for video (including dom0's). If we want to enable a super-minimal build of Xen with EFI support but without VIDEO support even for Dom0, we could introduce a separate Kconfig option for it. Probably not worth it. > --- > 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 |