You've already forked linux-t2-patches
mirror of
https://github.com/t2linux/linux-t2-patches.git
synced 2026-04-30 13:52:11 -07:00
135 lines
4.8 KiB
Diff
135 lines
4.8 KiB
Diff
From d68cc8abc357c05ca1567458965f009add8bab69 Mon Sep 17 00:00:00 2001
|
|
From: Aditya Garg <gargaditya08@live.com>
|
|
Date: Sun, 30 Jun 2024 19:24:54 +0000
|
|
Subject: x86/efistub: Call Apple set_os protocol on dual GPU Intel Macs
|
|
|
|
0c18184de990 ("platform/x86: apple-gmux: support MMIO gmux on T2 Macs")
|
|
brought support for T2 Macs in apple-gmux. But in order to use dual GPU,
|
|
the integrated GPU has to be enabled. On such dual GPU EFI Macs, the EFI
|
|
stub needs to report that it is booting macOS in order to prevent the
|
|
firmware from disabling the iGPU.
|
|
|
|
This patch is also applicable for some non T2 Intel Macs.
|
|
|
|
Based on this patch for GRUB by Andreas Heider <andreas@heider.io>:
|
|
https://lists.gnu.org/archive/html/grub-devel/2013-12/msg00442.html
|
|
|
|
Credits also goto Kerem Karabay <kekrby@gmail.com> for helping porting
|
|
the patch to the Linux kernel.
|
|
|
|
Cc: Orlando Chamberlain <orlandoch.dev@gmail.com>
|
|
Signed-off-by: Aditya Garg <gargaditya08@live.com>
|
|
[ardb: limit scope using list of DMI matches provided by Lukas and Orlando]
|
|
Reviewed-by: Lukas Wunner <lukas@wunner.de>
|
|
Tested-by: Aditya Garg <gargaditya08@live.com>
|
|
Signed-off-by: Ard Biesheuvel <ardb@kernel.org>
|
|
---
|
|
drivers/firmware/efi/libstub/x86-stub.c | 71 +++++++++++++++++++++++++++++++--
|
|
include/linux/efi.h | 1 +
|
|
2 files changed, 69 insertions(+), 3 deletions(-)
|
|
|
|
diff --git a/drivers/firmware/efi/libstub/x86-stub.c b/drivers/firmware/efi/libstub/x86-stub.c
|
|
index 68df27bd71c9b4..51b7185f8707ff 100644
|
|
--- a/drivers/firmware/efi/libstub/x86-stub.c
|
|
+++ b/drivers/firmware/efi/libstub/x86-stub.c
|
|
@@ -225,6 +225,68 @@ static void retrieve_apple_device_properties(struct boot_params *boot_params)
|
|
}
|
|
}
|
|
|
|
+static bool apple_match_product_name(void)
|
|
+{
|
|
+ static const char type1_product_matches[][15] = {
|
|
+ "MacBookPro11,3",
|
|
+ "MacBookPro11,5",
|
|
+ "MacBookPro13,3",
|
|
+ "MacBookPro14,3",
|
|
+ "MacBookPro15,1",
|
|
+ "MacBookPro15,3",
|
|
+ "MacBookPro16,1",
|
|
+ "MacBookPro16,4",
|
|
+ };
|
|
+ const struct efi_smbios_type1_record *record;
|
|
+ const u8 *product;
|
|
+
|
|
+ record = (struct efi_smbios_type1_record *)efi_get_smbios_record(1);
|
|
+ if (!record)
|
|
+ return false;
|
|
+
|
|
+ product = efi_get_smbios_string(record, product_name);
|
|
+ if (!product)
|
|
+ return false;
|
|
+
|
|
+ for (int i = 0; i < ARRAY_SIZE(type1_product_matches); i++) {
|
|
+ if (!strcmp(product, type1_product_matches[i]))
|
|
+ return true;
|
|
+ }
|
|
+
|
|
+ return false;
|
|
+}
|
|
+
|
|
+static void apple_set_os(void)
|
|
+{
|
|
+ struct {
|
|
+ unsigned long version;
|
|
+ efi_status_t (__efiapi *set_os_version)(const char *);
|
|
+ efi_status_t (__efiapi *set_os_vendor)(const char *);
|
|
+ } *set_os;
|
|
+ efi_status_t status;
|
|
+
|
|
+ if (!efi_is_64bit() || !apple_match_product_name())
|
|
+ return;
|
|
+
|
|
+ status = efi_bs_call(locate_protocol, &APPLE_SET_OS_PROTOCOL_GUID, NULL,
|
|
+ (void **)&set_os);
|
|
+ if (status != EFI_SUCCESS)
|
|
+ return;
|
|
+
|
|
+ if (set_os->version >= 2) {
|
|
+ status = set_os->set_os_vendor("Apple Inc.");
|
|
+ if (status != EFI_SUCCESS)
|
|
+ efi_err("Failed to set OS vendor via apple_set_os\n");
|
|
+ }
|
|
+
|
|
+ if (set_os->version > 0) {
|
|
+ /* The version being set doesn't seem to matter */
|
|
+ status = set_os->set_os_version("Mac OS X 10.9");
|
|
+ if (status != EFI_SUCCESS)
|
|
+ efi_err("Failed to set OS version via apple_set_os\n");
|
|
+ }
|
|
+}
|
|
+
|
|
efi_status_t efi_adjust_memory_range_protection(unsigned long start,
|
|
unsigned long size)
|
|
{
|
|
@@ -335,9 +397,12 @@ static const efi_char16_t apple[] = L"Apple";
|
|
|
|
static void setup_quirks(struct boot_params *boot_params)
|
|
{
|
|
- if (IS_ENABLED(CONFIG_APPLE_PROPERTIES) &&
|
|
- !memcmp(efistub_fw_vendor(), apple, sizeof(apple)))
|
|
- retrieve_apple_device_properties(boot_params);
|
|
+ if (!memcmp(efistub_fw_vendor(), apple, sizeof(apple))) {
|
|
+ if (IS_ENABLED(CONFIG_APPLE_PROPERTIES))
|
|
+ retrieve_apple_device_properties(boot_params);
|
|
+
|
|
+ apple_set_os();
|
|
+ }
|
|
}
|
|
|
|
/*
|
|
diff --git a/include/linux/efi.h b/include/linux/efi.h
|
|
index 2a539816a4362d..3a6c04a9f9aadc 100644
|
|
--- a/include/linux/efi.h
|
|
+++ b/include/linux/efi.h
|
|
@@ -385,6 +385,7 @@ void efi_native_runtime_setup(void);
|
|
#define EFI_MEMORY_ATTRIBUTES_TABLE_GUID EFI_GUID(0xdcfa911d, 0x26eb, 0x469f, 0xa2, 0x20, 0x38, 0xb7, 0xdc, 0x46, 0x12, 0x20)
|
|
#define EFI_CONSOLE_OUT_DEVICE_GUID EFI_GUID(0xd3b36f2c, 0xd551, 0x11d4, 0x9a, 0x46, 0x00, 0x90, 0x27, 0x3f, 0xc1, 0x4d)
|
|
#define APPLE_PROPERTIES_PROTOCOL_GUID EFI_GUID(0x91bd12fe, 0xf6c3, 0x44fb, 0xa5, 0xb7, 0x51, 0x22, 0xab, 0x30, 0x3a, 0xe0)
|
|
+#define APPLE_SET_OS_PROTOCOL_GUID EFI_GUID(0xc5c5da95, 0x7d5c, 0x45e6, 0xb2, 0xf1, 0x3f, 0xd5, 0x2b, 0xb1, 0x00, 0x77)
|
|
#define EFI_TCG2_PROTOCOL_GUID EFI_GUID(0x607f766c, 0x7455, 0x42be, 0x93, 0x0b, 0xe4, 0xd7, 0x6d, 0xb2, 0x72, 0x0f)
|
|
#define EFI_TCG2_FINAL_EVENTS_TABLE_GUID EFI_GUID(0x1e2ed096, 0x30e2, 0x4254, 0xbd, 0x89, 0x86, 0x3b, 0xbe, 0xf8, 0x23, 0x25)
|
|
#define EFI_LOAD_FILE_PROTOCOL_GUID EFI_GUID(0x56ec3091, 0x954c, 0x11d2, 0x8e, 0x3f, 0x00, 0xa0, 0xc9, 0x69, 0x72, 0x3b)
|
|
--
|
|
cgit 1.2.3-korg
|
|
|