[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PATCH v3] i386/linux: add support for ext_lfb_base
From: |
Arindam Nath |
Subject: |
[PATCH v3] i386/linux: add support for ext_lfb_base |
Date: |
Thu, 12 Jul 2018 19:02:49 +0530 |
From: Arindam Nath <address@hidden>
Signed-off-by: Arindam Nath <address@hidden>
---
Cc: Daniel Kiper <address@hidden>
---
v1:
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.
v2: changes suggested by Daniel
- added #if defined (GRUB_MACHINE_EFI) && defined (__x86_64__)
- moved constant definitions to the beginning of header file
v3: changes suggested by Daniel
- moved patch version info below SOB
- added empty lines above and below the modified lines
- removed unnecessary #if and #endif from header file
---
grub-core/loader/i386/linux.c | 6 ++++++
include/grub/i386/linux.h | 6 +++++-
2 files changed, 11 insertions(+), 1 deletion(-)
diff --git a/grub-core/loader/i386/linux.c b/grub-core/loader/i386/linux.c
index 083f9417c..e66164bac 100644
--- a/grub-core/loader/i386/linux.c
+++ b/grub-core/loader/i386/linux.c
@@ -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;
diff --git a/include/grub/i386/linux.h b/include/grub/i386/linux.h
index da0ca3b83..ebac95e41 100644
--- a/include/grub/i386/linux.h
+++ b/include/grub/i386/linux.h
@@ -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 */
--
2.17.1