Page MenuHomeFreeBSD

D54762.id171039.diff
No OneTemporary

D54762.id171039.diff

diff --git a/sys/dev/acpica/acpi.c b/sys/dev/acpica/acpi.c
--- a/sys/dev/acpica/acpi.c
+++ b/sys/dev/acpica/acpi.c
@@ -293,6 +293,17 @@
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_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");
+ } 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

File Metadata

Mime Type
text/plain
Expires
Sun, Apr 26, 10:02 AM (7 h, 15 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
28429135
Default Alt Text
D54762.id171039.diff (3 KB)

Event Timeline