Re: [PATCH v2] efi: libstub: add support for the apple_set_os protocol

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



I've checked that this patch works for me when applied to 6.10-rc6.
I can also use https://github.com/0xbb/gpu-switch to make the boot gpu
the iGPU now.

Tested-By: Orlando Chamberlain <orlandoch.dev@xxxxxxxxx> (MacBookPro16,1)


On Mon, 1 Jul 2024 at 05:24, Aditya Garg <gargaditya08@xxxxxxxx> wrote:
>
> From: Aditya Garg <gargaditya08@xxxxxxxx>
>
> 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@xxxxxxxxx>:
> https://lists.gnu.org/archive/html/grub-devel/2013-12/msg00442.html
>
> Credits also goto Kerem Karabay <kekrby@xxxxxxxxx> for helping porting
> the patch to the Linux kernel.
>
> Signed-off-by: Aditya Garg <gargaditya08@xxxxxxxx>
> ---
>  drivers/firmware/efi/libstub/efistub.h  | 15 +++++++++++
>  drivers/firmware/efi/libstub/x86-stub.c | 33 ++++++++++++++++++++++---
>  include/linux/efi.h                     |  1 +
>  3 files changed, 46 insertions(+), 3 deletions(-)
>
> diff --git a/drivers/firmware/efi/libstub/efistub.h b/drivers/firmware/efi/libstub/efistub.h
> index 27abb4ce0..4257a8b7c 100644
> --- a/drivers/firmware/efi/libstub/efistub.h
> +++ b/drivers/firmware/efi/libstub/efistub.h
> @@ -825,6 +825,21 @@ union apple_properties_protocol {
>         } mixed_mode;
>  };
>
> +typedef union apple_set_os_protocol apple_set_os_protocol_t;
> +
> +union apple_set_os_protocol {
> +       struct {
> +               unsigned long version;
> +               efi_status_t (__efiapi *set_os_version) (const char *);
> +               efi_status_t (__efiapi *set_os_vendor) (const char *);
> +       };
> +       struct {
> +               u32 version;
> +               u32 set_os_version;
> +               u32 set_os_vendor;
> +       } mixed_mode;
> +};
> +
>  typedef u32 efi_tcg2_event_log_format;
>
>  #define INITRD_EVENT_TAG_ID 0x8F3B22ECU
> diff --git a/drivers/firmware/efi/libstub/x86-stub.c b/drivers/firmware/efi/libstub/x86-stub.c
> index 1983fd3bf..1eea4f7ba 100644
> --- a/drivers/firmware/efi/libstub/x86-stub.c
> +++ b/drivers/firmware/efi/libstub/x86-stub.c
> @@ -225,6 +225,30 @@ static void retrieve_apple_device_properties(struct boot_params *boot_params)
>         }
>  }
>
> +static void apple_set_os(void)
> +{
> +       efi_guid_t guid = APPLE_SET_OS_PROTOCOL_GUID;
> +       apple_set_os_protocol_t *set_os;
> +       efi_status_t status;
> +
> +       status = efi_bs_call(locate_protocol, &guid, NULL, (void **)&set_os);
> +       if (status != EFI_SUCCESS)
> +               return;
> +
> +       if (efi_table_attr(set_os, version) >= 2) {
> +               status = efi_fn_call(set_os, set_os_vendor, "Apple Inc.");
> +               if (status != EFI_SUCCESS)
> +                       efi_err("Failed to set OS vendor via apple_set_os\n");
> +       }
> +
> +       /* The version being set doesn't seem to matter */
> +       if (efi_table_attr(set_os, version) > 0) {
> +               status = efi_fn_call(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 +359,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 418e55545..e28873eb1 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)
> --
> 2.39.3 (Apple Git-146)
>




[Index of Archives]     [Linux ARM Kernel]     [Linux ARM]     [Linux Omap]     [Fedora ARM]     [IETF Annouce]     [Security]     [Bugtraq]     [Linux OMAP]     [Linux MIPS]     [ECOS]     [Asterisk Internet PBX]     [Linux API]

  Powered by Linux