On Tue, Feb 03, 2026 at 01:52:00AM +0000, Adrian Chadd wrote:
> The branch main has been updated by adrian:
>
> URL:
> https://cgit.FreeBSD.org/src/commit/?id=052a791b00555805f19ccc38a04d42d48b54104b
>
> commit 052a791b00555805f19ccc38a04d42d48b54104b
> Author: Abdelkader Boudih <[email protected]>
> AuthorDate: 2026-02-03 01:43:00 +0000
> Commit: Adrian Chadd <[email protected]>
> CommitDate: 2026-02-03 01:51:37 +0000
>
> acpi: add Darwin OSI quirk for Apple Mac hardware
>
> Mac firmware hides the Intel integrated GPU (iGPU) on dual GPU x86
> systems, i.e., with AMD/NVIDIA dGPUs, when the Darwin OSI is not
> installed via ACPI.
>
> Prior to this change, FreeBSD always used the dGPU. This is fine in
> practice, but consumed more power than when the iGPU is used,
> resulting in reduced battery life.
>
> Linux handles this in `drivers/acpi/osi.c` by detecting Apple
> hardware via DMI, disabling all Windows OSI strings, and
> by explicitly installing the Darwin OSI ACPI handler. This change
> applies equivalent logic to the acpi(4) driver on FreeBSD.
>
> This feature can be enabled/disabled using the
> `hw.acpi.apple_darwin_osi` tunable. Setting this tunable to `0`
> restores the previous behavior by explicitly disabling the added
> support.
>
> Reviewed by: obiwac, ngie, adrian
> Differential Revision: https://reviews.freebsd.org/D54762
> ---
> sys/dev/acpica/acpi.c | 72
> +++++++++++++++++++++++++++++++++++++++++++++++++++
> 1 file changed, 72 insertions(+)
>
> diff --git a/sys/dev/acpica/acpi.c b/sys/dev/acpica/acpi.c
> index 60a2dba91b05..8cdb73333462 100644
> --- a/sys/dev/acpica/acpi.c
> +++ b/sys/dev/acpica/acpi.c
> @@ -293,6 +293,17 @@ static char acpi_remove_interface[256];
> TUNABLE_STR("hw.acpi.remove_interface", acpi_remove_interface,
> sizeof(acpi_remove_interface));
>
> +/*
> + * Automatically apply the Darwin OSI on Apple Mac hardware to obtain
> + * access to full ACPI hardware support on supported platforms.
> + *
> + * This flag automatically overrides any values set by
> + * `hw.acpi.acpi_install_interface` and unset by
> + * `hw.acpi.acpi_remove_interface`.
> + */
> +static int acpi_apple_darwin_osi = 1;
> +TUNABLE_INT("hw.acpi.apple_darwin_osi", &acpi_apple_darwin_osi);
> +
> /* Allow users to dump Debug objects without ACPI debugger. */
> static int acpi_debug_objects;
> TUNABLE_INT("debug.acpi.enable_debug_objects", &acpi_debug_objects);
> @@ -4903,6 +4914,67 @@ acpi_reset_interfaces(device_t dev)
> }
> acpi_free_interfaces(&list);
> }
> +
> + /*
> + * Apple Mac hardware quirk: install Darwin OSI.
> + *
> + * On Apple hardware, install the Darwin OSI and remove the Windows OSI
> + * to match Linux behavior.
> + *
> + * This is required for dual-GPU MacBook Pro systems
> + * (Intel iGPU + AMD/NVIDIA dGPU) where the iGPU is hidden when the
> + * firmware doesn't see Darwin OSI, but it also unlocks additional ACPI
> + * support on non-MacBook Pro Apple platforms.
> + *
> + * Apple's ACPI firmware checks _OSI("Darwin") and sets OSYS=10000
> + * for macOS. Many device methods use OSDW() which checks OSYS==10000
> + * for macOS-specific behavior including GPU visibility and power
> + * management.
> + *
> + * Linux enables Darwin OSI by default on Apple hardware and disables
> + * all Windows OSI strings (drivers/acpi/osi.c). Users can override
> + * this behavior with acpi_osi=!Darwin to get Windows-like behavior,
> + * in general, but this logic makes that process unnecessary.
> + *
> + * Detect Apple via SMBIOS and enable Darwin while disabling Windows
> + * vendor strings. This makes both GPUs visible on dual-GPU MacBook Pro
> + * systems (Intel iGPU + AMD dGPU) and unlocks full platform
> + * ACPI support.
> + */
> + if (acpi_apple_darwin_osi) {
> + char *vendor = kern_getenv("smbios.system.maker");
> + if (vendor != NULL) {
> + if (strcmp(vendor, "Apple Inc.") == 0 ||
> + strcmp(vendor, "Apple Computer, Inc.") == 0) {
> + /* Disable all other OSI vendor strings. */
> + status = AcpiUpdateInterfaces(
> + ACPI_DISABLE_ALL_VENDOR_STRINGS);
> + /* Install Darwin */
> + if (ACPI_SUCCESS(status)) {
> + status = AcpiInstallInterface("Darwin");
> + }
> + if (bootverbose) {
> + if (ACPI_SUCCESS(status)) {
> + device_printf(dev,
> + "Apple hardware: installed
> Darwin "
> + "OSI and removed other
> vendor OSI "
> + "(Windows, etc)\n");
Why this verbosity is needed?
I see no benefit from it, other then consuming kernel memory.
> + } else {
> + device_printf(dev,
> + "Apple hardware: failed to
> install "
> + "Darwin OSI: %s\n",
> + AcpiFormatException(
> + status));
> + }
> + }
> + } else if (bootverbose) {
> + device_printf(dev,
> + "Not installing Darwin OSI on unsupported
> platform: %s\n",
> + vendor);
> + }
> + freeenv(vendor);
> + }
> + }
> }
>
> static int