]> git.ipfire.org Git - thirdparty/grub.git/commitdiff
i386/linux: Add support for ext_lfb_base
authorArindam Nath <arindam.nath@amd.com>
Thu, 12 Jul 2018 13:32:49 +0000 (19:02 +0530)
committerDaniel Kiper <daniel.kiper@oracle.com>
Wed, 25 Jul 2018 12:18:05 +0000 (14:18 +0200)
The EFI Graphics Output Protocol can return a 64-bit
linear frame buffer address in some firmware/BIOS
implementations. We currently only store the lower
32-bits in the lfb_base. This will eventually be
passed to Linux kernel and the efifb driver will
incorrectly interpret the framebuffer address as
32-bit address.

The Linux kernel has already added support to handle
64-bit linear framebuffer address in the efifb driver
since quite some time now.

This patch adds the support for 64-bit linear frame
buffer address in GRUB to address the above mentioned
scenario.

Signed-off-by: Arindam Nath <arindam.nath@amd.com>
Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com>
grub-core/loader/i386/linux.c
include/grub/i386/linux.h

index 44301e12659ddb2ae3ece6de57fd448c1d7e7a7d..9b53d3168f9bb78eab7a124518e83915183912b9 100644 (file)
@@ -306,6 +306,12 @@ grub_linux_setup_video (struct linux_kernel_params *params)
   params->lfb_line_len = mode_info.pitch;
 
   params->lfb_base = (grub_size_t) framebuffer;
+
+#if defined (GRUB_MACHINE_EFI) && defined (__x86_64__)
+  params->ext_lfb_base = (grub_size_t) (((grub_uint64_t)(grub_size_t) framebuffer) >> 32);
+  params->capabilities |= VIDEO_CAPABILITY_64BIT_BASE;
+#endif
+
   params->lfb_size = ALIGN_UP (params->lfb_line_len * params->lfb_height, 65536);
 
   params->red_mask_size = mode_info.red_mask_size;
index 0bd75881708230183df7a14756df80d2e1703155..60c7c3b5e660276dc11d23f4a53ccc2f1e5536a5 100644 (file)
@@ -43,6 +43,9 @@
 
 #define GRUB_LINUX_CL_MAGIC            0xA33F
 
+#define VIDEO_CAPABILITY_SKIP_QUIRKS   (1 << 0)
+#define VIDEO_CAPABILITY_64BIT_BASE    (1 << 1)        /* Frame buffer base is 64-bit. */
+
 #ifdef __x86_64__
 
 #define GRUB_LINUX_EFI_SIGNATURE       \
@@ -188,8 +191,9 @@ struct linux_kernel_params
   grub_uint16_t lfb_pages;             /* 32 */
   grub_uint16_t vesa_attrib;           /* 34 */
   grub_uint32_t capabilities;          /* 36 */
+  grub_uint32_t ext_lfb_base;          /* 3a */
 
-  grub_uint8_t padding3[0x40 - 0x3a];
+  grub_uint8_t padding3[0x40 - 0x3e];
 
   grub_uint16_t apm_version;           /* 40 */
   grub_uint16_t apm_code_segment;      /* 42 */