// Depends on /patches/OpenCore Patches/ XHC1.plist // // // Native ACPI-setup for the USB2/3-controller on x80-series Thinkpads // // This enables all ports to be as native as possible on OSX and only disables those devices which // have definetly no drivers on OSX. It should be compatible with almost all thinkpad-configs. // // The opinion that things like cardreader, which might not be used, are adding to a significant // power-draw is false - if one has a working USB-setup. Even if it does not hurt. // // This SSDT is developed with compatibility in mind and therefor all devices are enabled by default. // // I'm driving both of my thinkpads with ~0.7W pkg-power draw on idle with all devices enabled. // // Reference: https://www.intel.com/content/dam/www/public/us/en/documents/technical-specifications/extensible-host-controler-interface-usb-xhci.pdf // // Credits @benbender DefinitionBlock ("", "SSDT", 2, "tyler", "_XHC1", 0x00001000) { // External method from SSDT-UTILS.dsl External (OSDW, MethodObj) // 0 Arguments External (DTGP, MethodObj) // 5 Arguments External (_SB.PCI0.XHC_, DeviceObj) External (_SB.PCI0.XHC_.RHUB, DeviceObj) External (_SB.PCI0.XHC_.RHUB.HS01, DeviceObj) External (_SB.PCI0.XHC_.RHUB.HS02, DeviceObj) External (_SB.PCI0.XHC_.RHUB.HS03, DeviceObj) External (_SB.PCI0.XHC_.RHUB.HS04, DeviceObj) External (_SB.PCI0.XHC_.RHUB.HS05, DeviceObj) External (_SB.PCI0.XHC_.RHUB.HS06, DeviceObj) External (_SB.PCI0.XHC_.RHUB.HS07, DeviceObj) External (_SB.PCI0.XHC_.RHUB.HS08, DeviceObj) External (_SB.PCI0.XHC_.RHUB.HS09, DeviceObj) External (_SB.PCI0.XHC_.RHUB.HS10, DeviceObj) External (_SB.PCI0.XHC_.RHUB.SS01, DeviceObj) External (_SB.PCI0.XHC_.RHUB.SS02, DeviceObj) External (_SB.PCI0.XHC_.RHUB.SS03, DeviceObj) External (_SB.PCI0.XHC_.RHUB.SS04, DeviceObj) External (_SB.PCI0.XHC_.RHUB.SS05, DeviceObj) External (_SB.PCI0.XHC_.RHUB.SS06, DeviceObj) External (_SB.PCI0.XHC_.PDBM, FieldUnitObj) External (_SB.PCI0.XHC_.MEMB, FieldUnitObj) External (_SB.PCI0.XHC_.XPS0, MethodObj) External (_SB.PCI0.XHC_.XPS3, MethodObj) External (_SB.PCI0.RP09.UPSB.DSB2.XHC2, DeviceObj) External (_SB.PCI0.RP09.UPSB.DSB2.XHC2.MODU, MethodObj) // 0 Arguments External (_SB.PCI0.RP09.UPN1, IntObj) External (_SB.PCI0.RP09.UPN2, IntObj) External (TBAS, IntObj) External (XLTP, FieldUnitObj) External (MPMC, FieldUnitObj) External (PMFS, FieldUnitObj) External (UWAB, FieldUnitObj) Scope (\_SB) { Device (USBX) { Name (_ADR, Zero) // _ADR: Address Method (_DSM, 4, NotSerialized) // _DSM: Device-Specific Method { Local0 = Package () { "kUSBSleepPortCurrentLimit", 3000, "kUSBWakePortCurrentLimit", 3000, // "kUSBSleepPowerSupply", // 9600, // "kUSBWakePowerSupply", // 9600, } DTGP (Arg0, Arg1, Arg2, Arg3, RefOf (Local0)) Return (Local0) } Method (_STA, 0, NotSerialized) // _STA: Status { If (OSDW ()) { Return (0x0F) } Return (Zero) } } Scope (PCI0.XHC_) { Name (SDPC, Zero) Name (_GPE, 0x6D) // _GPE: General Purpose Events Name (SBAR, Zero) OperationRegion (XPRX, PCI_Config, Zero, 0x0100) Field (XPRX, AnyAcc, NoLock, Preserve) { DVIX, 16, Offset (0x40), , 11, SWAI, 1, Offset (0x44), , 12, SAIP, 2, Offset (0x48), Offset (0x50), , 2, STGX, 1, Offset (0x74), D03X, 2, Offset (0x75), PXEE, 1, , 6, PXES, 1, Offset (0xA2), , 2, D3HX, 1, Offset (0xA8), , 13, MW13, 1, MW14, 1, Offset (0xAC), Offset (0xB0), , 13, MB13, 1, MB14, 1, Offset (0xB4), Offset (0xD0), PR2, 32, PR2M, 32, PR3, 32, PR3M, 32 } Method (RTPC, 1, Serialized) { Debug = Concatenate ("XHC:RTPC called with args: ", Arg0) Return (Zero) } /** * Return: * kUSBTypeCCableTypeNone = 0, * kUSBTypeCCableTypeUSB = 1, */ Method (MODU, 0, Serialized) { // If (CondRefOf (\_SB.PCI0.RP09.UPSB.DSB2.XHC2.MODU, Local0)) // { // Local0 = \_SB.PCI0.RP09.UPSB.DSB2.XHC2.MODU () // } // Local1 = Zero // If ((Local0 == One) || (Local1 == One)) // { // Local0 = One // } // ElseIf ((Local0 == 0xFF) || (Local1 == 0xFF)) // { // Local0 = 0xFF // } // Else // { // Local0 = Zero // } // Debug = Concatenate ("XHC:MODU - Result: ", Local0) // Return (Local0) Local0 = One If (CondRefOf (\_SB.PCI0.RP09.UPSB.DSB2.XHC2.MODU)) { Local0 = (\_SB.PCI0.RP09.UPSB.DSB2.XHC2.MODU ()) } Debug = Concatenate ("XHC:MODU - Result: ", Local0) Return (Local0) } Method (USBM, 0, Serialized) { ^D03X = Zero Local1 = ^PDBM /* \_SB_.PCI0.XHC1.PDBM */ Local2 = ^MEMB /* \_SB_.PCI0.XHC1.MEMB */ ^PDBM = (Local1 | 0x02) Local0 = ^MEMB /* \_SB_.PCI0.XHC1.MEMB */ Local0 &= 0xFFFFFFFFFFFFFFF0 OperationRegion (PSCA, SystemMemory, Local0, 0x0600) Field (PSCA, DWordAcc, NoLock, Preserve) { Offset (0x480), PC01, 32, Offset (0x490), PC02, 32, Offset (0x4A0), PC03, 32, Offset (0x4B0), PC04, 32 } Local6 = PC03 /* \_SB_.PCI0.XHC1.USBM.PC03 */ Local6 = (PC03 & 0xFFFFFFFFFFFFFFFD) PC03 = (Local6 & 0xFFFFFFFFFFFFFDFF) Sleep (0x32) Local6 = PC03 /* \_SB_.PCI0.XHC1.USBM.PC03 */ ^PDBM &= 0xFFFFFFFFFFFFFFF9 ^D03X = 0x03 ^MEMB = Local2 ^PDBM = Local1 Return (Zero) } Method (_PS0, 0, Serialized) // _PS0: Power State 0 { If (OSDW ()) { Local2 = ^MEMB /* \_SB_.PCI0.XHC1.MEMB */ Local1 = ^PDBM /* \_SB_.PCI0.XHC1.PDBM */ ^PDBM &= 0xFFFFFFFFFFFFFFF9 ^D03X = Zero If (SBAR == Zero) { Local7 = ^MEMB /* \_SB_.PCI0.XHC1.MEMB */ Local7 &= 0xFFFFFFFFFFFFFFF0 If ((Local7 == Zero) || (Local7 == 0xFFFFFFFFFFFFFFF0)) { ^MEMB = 0xFEAF0000 } } Else { ^MEMB = SBAR /* \_SB_.PCI0.XHC1.SBAR */ } ^PDBM = (Local1 | 0x02) Local0 = ^MEMB /* \_SB_.PCI0.XHC1.MEMB */ Local0 &= 0xFFFFFFFFFFFFFFF0 OperationRegion (MCA1, SystemMemory, Local0, 0x9000) Field (MCA1, DWordAcc, NoLock, Preserve) { Offset (0x80A4), , 28, AX28, 1, Offset (0x80C0), , 10, S0IX, 1, Offset (0x81C4), , 2, CLK0, 1, , 3, CLK1, 1 } S0IX = Zero AX28 = One Stall (0x33) AX28 = Zero CLK0 = Zero CLK1 = Zero ^PDBM &= 0xFFFFFFFFFFFFFFFD ^MEMB = Local2 ^PDBM = Local1 If (UWAB && (D03X == Zero)) { MPMC = One Local0 = (Timer + 0x00989680) While (Timer <= Local0) { If (PMFS == Zero) { Break } Sleep (0x0A) } } } Else { // NON-OSX \_SB.PCI0.XHC_.XPS0 () } } Method (_PS3, 0, Serialized) // _PS3: Power State 3 { If (OSDW ()) { Local1 = ^PDBM /* \_SB_.PCI0.XHC1.PDBM */ Local2 = ^MEMB /* \_SB_.PCI0.XHC1.MEMB */ ^PDBM &= 0xFFFFFFFFFFFFFFF9 If (XLTP == Zero) { ^D03X = 0x03 Stall (0x1E) } ^D03X = Zero ^PDBM = (Local1 | 0x02) SBAR = ^MEMB /* \_SB_.PCI0.XHC1.MEMB */ If (SBAR == Zero) { Local7 = ^MEMB /* \_SB_.PCI0.XHC1.MEMB */ Local7 &= 0xFFFFFFFFFFFFFFF0 If ((Local7 == Zero) || (Local7 == 0xFFFFFFFFFFFFFFF0)) { ^MEMB = 0xFEAF0000 } } Local0 = ^MEMB /* \_SB_.PCI0.XHC1.MEMB */ Local0 &= 0xFFFFFFFFFFFFFFF0 OperationRegion (MCA1, SystemMemory, Local0, 0x9000) Field (MCA1, DWordAcc, NoLock, Preserve) { Offset (0x80A4), , 28, AX28, 1, Offset (0x80C0), , 10, S0IX, 1, Offset (0x81C4), , 2, CLK0, 1, , 3, CLK1, 1 } If (XLTP == Zero) { S0IX = One Stall (0x14) } CLK0 = Zero CLK1 = One ^PDBM = Local1 ^D03X = 0x03 ^MEMB = Local2 ^PDBM = Local1 If (UWAB && (D03X == 0x03)) { MPMC = 0x03 Local0 = (Timer + 0x00989680) While (Timer <= Local0) { If (PMFS == Zero) { Break } Sleep (0x0A) } } } Else { // NON-OSX \_SB.PCI0.XHC_.XPS3 () } } Scope (RHUB) { Scope (HS01) // Right USB-A-Port, 480 Mbit/s { Name (_UPC, Package () // _UPC: USB Port Capabilities { 0xFF, 0x03, Zero, Zero }) Method (_DSM, 4, NotSerialized) // _DSM: Device-Specific Method { Local0 = Package (0x01) {} DTGP (Arg0, Arg1, Arg2, Arg3, RefOf (Local0)) Return (Local0) } } Scope (HS02) // Left USB-A-Port, 480 Mbit/s { Name (_UPC, Package () // _UPC: USB Port Capabilities { 0xFF, 0x03, Zero, Zero }) Method (_DSM, 4, NotSerialized) // _DSM: Device-Specific Method { Local0 = Package (0x01) {} DTGP (Arg0, Arg1, Arg2, Arg3, RefOf (Local0)) Return (Local0) } } Scope (HS03) // Upper USB-C-Port, weired config, needs investigation { Method (_UPC, 0, NotSerialized) // _UPC: USB Port Capabilities { If (CondRefOf (\_SB_.PCI0.RP09.UPSB.DSB2.XHC2)) { Debug = "XHC:U2OP - companion ports enabled" } Local0 = Package (0x04) { 0xFF, 0x09, Zero, Zero } Return (Local0) } If (CondRefOf (\_SB_.PCI0.RP09.UPSB.DSB2.XHC2)) { Name (SSP, Package (0x02) { "XHC2", 0x03 }) Name (SS, Package (0x02) { "XHC2", 0x03 }) Method (_DSM, 4, NotSerialized) // _DSM: Device-Specific Method { Local0 = Package (0x01) {} If (CondRefOf (\_SB.PCI0.RP09.UPN2)) { Local0 = Package (0x02) { "UsbCPortNumber", \_SB.PCI0.RP09.UPN1 } } DTGP (Arg0, Arg1, Arg2, Arg3, RefOf (Local0)) Return (Local0) } } } Scope (HS04) // Lower USB-C-Port, weired config, needs investigation { Method (_UPC, 0, NotSerialized) // _UPC: USB Port Capabilities { Local0 = Package (0x04) { 0xFF, 0x09, Zero, Zero } Return (Local0) } If (CondRefOf (\_SB_.PCI0.RP09.UPSB.DSB2.XHC2)) { Name (SSP, Package (0x02) { "XHC2", 0x04 }) Name (SS, Package (0x02) { "XHC2", 0x04 }) Method (_DSM, 4, NotSerialized) // _DSM: Device-Specific Method { Local0 = Package (0x01) {} If (CondRefOf (\_SB.PCI0.RP09.UPN2)) { Local0 = Package (0x02) { "UsbCPortNumber", \_SB.PCI0.RP09.UPN2 } } DTGP (Arg0, Arg1, Arg2, Arg3, RefOf (Local0)) Return (Local0) } } } Scope (HS05) // internal, ir-webcam, deactivated { Method (_UPC, 0, NotSerialized) // _UPC: USB Port Capabilities { Return (Package (0x04) { 0xFF, 0xFF, Zero, Zero }) } Method (_STA, 0, NotSerialized) // _STA: Status { If (OSDW ()) { Return (Zero) // disabled on OSX } Return (0xF) // enabled on others } Method (_DSM, 4, NotSerialized) // _DSM: Device-Specific Method { Local0 = Package (0x01) {} DTGP (Arg0, Arg1, Arg2, Arg3, RefOf (Local0)) Return (Local0) } } Scope (HS06) // internal, unused { Method (_UPC, 0, NotSerialized) // _UPC: USB Port Capabilities { Return (Package (0x04) { 0xFF, 0xFF, Zero, Zero }) } Method (_DSM, 4, NotSerialized) // _DSM: Device-Specific Method { Local0 = Package (0x01) {} DTGP (Arg0, Arg1, Arg2, Arg3, RefOf (Local0)) Return (Local0) } } Scope (HS07) // Bluetooth, internal { Method (_UPC, 0, NotSerialized) // _UPC: USB Port Capabilities { Return (Package (0x04) { 0xFF, 0xFF, Zero, Zero }) } Method (_DSM, 4, NotSerialized) // _DSM: Device-Specific Method { Local0 = Package (0x01) {} DTGP (Arg0, Arg1, Arg2, Arg3, RefOf (Local0)) Return (Local0) } } Scope (HS08) // Webcam, internal { Method (_UPC, 0, NotSerialized) // _UPC: USB Port Capabilities { Return (Package (0x04) { 0xFF, 0xFF, Zero, Zero }) } Method (_DSM, 4, NotSerialized) // _DSM: Device-Specific Method { Local0 = Package (0x01) {} DTGP (Arg0, Arg1, Arg2, Arg3, RefOf (Local0)) Return (Local0) } } Scope (HS09) // Fingerprint reader, internal, deactivated { Method (_UPC, 0, NotSerialized) // _UPC: USB Port Capabilities { Return (Package (0x04) { 0xFF, 0xFF, Zero, Zero }) } Method (_STA, 0, NotSerialized) // _STA: Status { If (OSDW ()) { Return (Zero) // disabled on OSX } Return (0xF) // enabled on others } Method (_DSM, 4, NotSerialized) // _DSM: Device-Specific Method { Local0 = Package (0x01) {} DTGP (Arg0, Arg1, Arg2, Arg3, RefOf (Local0)) Return (Local0) } } Scope (HS10) // Touchscreen, internal { Method (_UPC, 0, NotSerialized) // _UPC: USB Port Capabilities { Return (Package (0x04) { 0xFF, 0xFF, Zero, Zero }) } Method (_DSM, 4, NotSerialized) // _DSM: Device-Specific Method { Local0 = Package (0x01) {} DTGP (Arg0, Arg1, Arg2, Arg3, RefOf (Local0)) Return (Local0) } } Scope (SS01) // Right USB-A-Port, 5 Gbit/s { Name (_UPC, Package (0x04) // _UPC: USB Port Capabilities { 0xFF, 0x03, Zero, Zero }) Method (_DSM, 4, NotSerialized) // _DSM: Device-Specific Method { Local0 = Package (0x01) {} DTGP (Arg0, Arg1, Arg2, Arg3, RefOf (Local0)) Return (Local0) } } Scope (SS02) // Left USB-A-Port, 5 Gbit/s { Name (_UPC, Package (0x04) // _UPC: USB Port Capabilities { 0xFF, 0x03, Zero, Zero }) Method (_DSM, 4, NotSerialized) // _DSM: Device-Specific Method { Local0 = Package (0x01) {} DTGP (Arg0, Arg1, Arg2, Arg3, RefOf (Local0)) Return (Local0) } } Scope (SS03) // Cardreader, internal { Name (_UPC, Package (0x04) // _UPC: USB Port Capabilities { 0xFF, 0xFF, Zero, Zero }) Method (_RMV, 0, NotSerialized) // _RMV: Removal Status { Return (0x00) } Name (BERT, 0x0C) Name (IGNR, 0x00) Method (SBHV, 1, Serialized) { If (Arg0) { Store (0x01, IGNR) } Else { Store (0x00, IGNR) } } Method (GBHV, 0, Serialized) { Return (IGNR) } Name (U3SD, 0x0FBE) Name (S104, 0x00) Name (S050, 0x00) Name (S025, 0x00) Name (_GPE, 0x3B) // _GPE: General Purpose Events Method (_DSM, 4, NotSerialized) // _DSM: Device-Specific Method { Local0 = Package (0x02) {} DTGP (Arg0, Arg1, Arg2, Arg3, RefOf (Local0)) Return (Local0) } } Scope (SS04) // Unused, internal { Name (_UPC, Package (0x04) // _UPC: USB Port Capabilities { 0xFF, 0xFF, Zero, Zero }) Method (_DSM, 4, NotSerialized) // _DSM: Device-Specific Method { Local0 = Package (0x01) {} DTGP (Arg0, Arg1, Arg2, Arg3, RefOf (Local0)) Return (Local0) } } Scope (SS05) // Unused, internal { Name (_UPC, Package (0x04) // _UPC: USB Port Capabilities { 0xFF, 0xFF, Zero, Zero }) Method (_DSM, 4, NotSerialized) // _DSM: Device-Specific Method { Local0 = Package (0x01) {} DTGP (Arg0, Arg1, Arg2, Arg3, RefOf (Local0)) Return (Local0) } } Scope (SS06) // Unused, internal { Name (_UPC, Package (0x04) // _UPC: USB Port Capabilities { 0xFF, 0xFF, Zero, Zero }) Method (_DSM, 4, NotSerialized) // _DSM: Device-Specific Method { Local0 = Package (0x01) {} DTGP (Arg0, Arg1, Arg2, Arg3, RefOf (Local0)) Return (Local0) } } } Method (MBSD, 0, NotSerialized) { Return (One) } If (CondRefOf (\_SB_.PCI0.RP09.UPSB.DSB2.XHC2)) { Name (SSP, Package (0x01) { "XHC2" }) Name (SS, Package (0x01) { "XHC2" }) } } } }