bartl Posted August 9, 2017 Share Posted August 9, 2017 Hi I am currently working on a dsdt for my e6510 (pretty similar to a e6410 as stated in other posts) After successfully installing Sierra following available El Capitan guides (mostly for the e6410) I figured out that shutdown and sleep is not working. This is my primary goal to get this to work. Up to know I am not successful yet. I have carefully read RehabMan guide for dsdt patching and at first figured out, that applelpc is not working on my machine: MY MAC:~ bartl$ kextstat|grep -y applelpc 104 0 0xffffff7f82971000 0x3000 0x3000 com.apple.driver.AppleLPC (3.1) F51595F0-F9B1-3B85-A1C3-F984DAD4107E <92 12 5 4 3> Here I found out that for the series 5 chipset a compatibility tag is needed in the DSDT's LPS definition So by adding the following lines to the dsdt brings applelpc up: ... Device (LPCB) { Name (_ADR, 0x001F0000) // _ADR: Address // start here Method (_DSM, 4, NotSerialized) // LPC compatible patch entry { If (!Arg2) { Return ( Buffer() { 0x03 } ) } Return ( Package () { "compatible", "pci8086,3b09" } ) } // end here Scope (\_SB) ... Further I noticed that USB is not being loaded in the new El Capitan/Sierra way. So I started with renaming EHCI and EHC2 to EH01 and EH02. Unfortunately this leads into kernel panic telling me that _UPC can not be parsed correctly. Further inspection of my dsdt showed me that the _UPC method has been implemented only as name. So here I did some copy and paste work: Device (EH02) { Name (_ADR, 0x001A0000) // _ADR: Address Name (_S1D, 0x02) // _S1D: S1 Device State Name (_S3D, 0x02) // _S3D: S3 Device State Method (_DSM, 4, NotSerialized) // _DSM: Device-Specific Method { Store (Package (0x09) { "AAPL,current-available", 0x05DC, "AAPL,current-extra", 0x03E8, "AAPL,current-in-sleep", 0x05DC, "AAPL,device-internal", 0x02, Buffer (One) { 0x00 } }, Local0) DTGP (Arg0, Arg1, Arg2, Arg3, RefOf (Local0)) Return (Local0) } Method (_PRW, 0, NotSerialized) // _PRW: Power Resources for Wake { Store (UPRW (), Local0) If (LEqual (Local0, 0x03)) { Return (Package (0x02) { 0x0D, 0x03 }) } If (LEqual (Local0, 0x01)) { Return (Package (0x02) { 0x0D, 0x01 }) } Return (Package (0x02) { 0x0D, 0x00 }) } Device (RHUB) { Name (_ADR, 0x00) // _ADR: Address Device (PRT1) { Name (_ADR, 0x01) // _ADR: Address Method (_UPC, 0, Serialized) // _UPC: USB Port Capabilities { Name (UPCA, Package (0x04) // _UPC: USB Port Capabilities { 0x00, 0xFF, 0x00, 0x00 }) Return (UPCA) } Device (PRT1) { Name (_ADR, 0x01) // _ADR: Address Method (_UPC, 0, Serialized) // _UPC: USB Port Capabilities { Name (UPCA, Package (0x04) { 0xFF, 0xFF, 0x00, 0x00 }) Return (UPCA) } Method (_PLD, 0, Serialized) // _PLD: Physical Location of Device { Name (PLDA, Package() { Buffer (0x10) { /* 0000 */ 0x81, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0008 */ 0x30, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } }) Return (PLDA) } } Device (PRT2) { Name (_ADR, 0x02) // _ADR: Address Method (_UPC, 0, Serialized) // _UPC: USB Port Capabilities { Name (UPCA, Package (0x04) { 0xFF, 0xFF, 0x00, 0x00 }) Return (UPCA) } Method (_PLD, 0, Serialized) // _PLD: Physical Location of Device { Name (PLDA, Package() { Buffer (0x10) { /* 0000 */ 0x81, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0008 */ 0x30, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } }) Return (PLDA) } } Device (PRT3) { Name (_ADR, 0x03) // _ADR: Address Method (_UPC, 0, Serialized) // _UPC: USB Port Capabilities { Name (UPCA, Package (0x04) { 0xFF, 0xFF, 0x00, 0x00 }) Return (UPCA) } Method (_PLD, 0, Serialized) // _PLD: Physical Location of Device { Name (PLDA, Package() { Buffer (0x10) { /* 0000 */ 0x81, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0008 */ 0x30, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } }) Return (PLDA) } Name (_EJD, "\\_SB.PCI0.RP04.PXSX") // _EJD: Ejection Dependent Device } Device (PRT4) { Name (_ADR, 0x04) // _ADR: Address Method (_UPC, 0, Serialized) // _UPC: USB Port Capabilities { Name (UPCA, Package (0x04) { 0xFF, 0xFF, 0x00, 0x00 }) Return (UPCA) } Method (_PLD, 0, Serialized) // _PLD: Physical Location of Device { Name (PLDA, Package() { Buffer (0x10) { /* 0000 */ 0x81, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0008 */ 0x30, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } }) Return (PLDA) } } Device (PRT5) { Name (_ADR, 0x05) // _ADR: Address Method (_UPC, 0, Serialized) // _UPC: USB Port Capabilities { Name (UPCA, Package (0x04) { 0xFF, 0xFF, 0x00, 0x00 }) Return (UPCA) } Method (_PLD, 0, Serialized) // _PLD: Physical Location of Device { Name (PLDA, Package() { Buffer (0x10) { /* 0000 */ 0x81, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0008 */ 0x30, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } }) Return (PLDA) } } Device (PRT6) { Name (_ADR, 0x06) // _ADR: Address Method (_UPC, 0, Serialized) // _UPC: USB Port Capabilities { Name (UPCA, Package (0x04) { 0xFF, 0xFF, 0x00, 0x00 }) Return (UPCA) } Method (_PLD, 0, Serialized) // _PLD: Physical Location of Device { Name (PLDA, Package() { Buffer (0x10) { /* 0000 */ 0x81, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0008 */ 0x30, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } }) Return (PLDA) } } } Device (PRT2) { Name (_ADR, 0x02) // _ADR: Address Method (_UPC, 0, Serialized) // _UPC: USB Port Capabilities { Name (UPCA, Package (0x04) { 0x00, 0xFF, 0x00, 0x00 }) Return (UPCA) } } } } Device (EH01) { Name (_ADR, 0x001D0000) // _ADR: Address Name (_S1D, 0x02) // _S1D: S1 Device State Name (_S3D, 0x02) // _S3D: S3 Device State Method (_DSM, 4, NotSerialized) // _DSM: Device-Specific Method { Store (Package (0x09) { "AAPL,current-available", 0x05DC, "AAPL,current-extra", 0x03E8, "AAPL,current-in-sleep", 0x05DC, "AAPL,device-internal", 0x02, Buffer (One) { 0x00 } }, Local0) DTGP (Arg0, Arg1, Arg2, Arg3, RefOf (Local0)) Return (Local0) } Method (_PRW, 0, NotSerialized) // _PRW: Power Resources for Wake { Store (UPRW (), Local0) If (LEqual (Local0, 0x03)) { Return (Package (0x02) { 0x0D, 0x03 }) } If (LEqual (Local0, 0x01)) { Return (Package (0x02) { 0x0D, 0x01 }) } Return (Package (0x02) { 0x0D, 0x00 }) } Device (RHUB) { Name (_ADR, 0x00) // _ADR: Address Device (PRT1) { Name (_ADR, 0x01) // _ADR: Address Method (_UPC, 0, Serialized) // _UPC: USB Port Capabilities { Name (UPCA, Package (0x04) { 0x00, 0xFF, 0x00, 0x00 }) Return (UPCA) } Device (PRT1) { Name (_ADR, 0x01) // _ADR: Address Method (_UPC, 0, Serialized) // _UPC: USB Port Capabilities { Name (UPCA, Package (0x04) { 0xFF, 0x00, 0x00, 0x00 }) Return (UPCA) } Method (_PLD, 0, Serialized) // _PLD: Physical Location of Device { Name (PLDA, Package() { Buffer (0x10) { /* 0000 */ 0x81, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0008 */ 0x19, 0x12, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00 } }) Return (PLDA) } } Device (PRT2) { Name (_ADR, 0x02) // _ADR: Address Method (_UPC, 0, Serialized) // _UPC: USB Port Capabilities { Name (UPCA, Package (0x04) { 0xFF, 0x00, 0x00, 0x00 }) Return (UPCA) } Method (_PLD, 0, Serialized) // _PLD: Physical Location of Device { Name (PLDA, Package() { Buffer (0x10) { /* 0000 */ 0x81, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0008 */ 0x11, 0x11, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00 } }) Return (PLDA) } } Device (PRT3) { Name (_ADR, 0x03) // _ADR: Address Method (_UPC, 0, Serialized) // _UPC: USB Port Capabilities { Name (UPCA, Package (0x04) { 0xFF, 0x00, 0x00, 0x00 }) Return (UPCA) } Method (_PLD, 0, Serialized) // _PLD: Physical Location of Device { Name (PLDA, Package() { Buffer (0x10) { /* 0000 */ 0x81, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0008 */ 0x91, 0x11, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00 } }) Return (PLDA) } } Device (PRT4) { Name (_ADR, 0x04) // _ADR: Address Method (_UPC, 0, Serialized) // _UPC: USB Port Capabilities { Name (UPCA, Package (0x04) { 0xFF, 0x00, 0x00, 0x00 }) Return (UPCA) } Method (_PLD, 0, Serialized) // _PLD: Physical Location of Device { Name (PLDA, Package() { Buffer (0x10) { /* 0000 */ 0x81, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0008 */ 0x99, 0x12, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00 } }) Return (PLDA) } } Device (PRT5) { Name (_ADR, 0x05) // _ADR: Address Method (_UPC, 0, Serialized) // _UPC: USB Port Capabilities { Name (UPCA, Package (0x04) { 0xFF, 0xFF, 0x00, 0x00 }) Return (UPCA) } Method (_PLD, 0, Serialized) // _PLD: Physical Location of Device { Name (PLDA, Package() { Buffer (0x10) { /* 0000 */ 0x81, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0008 */ 0x3A, 0x1C, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00 } }) Return (PLDA) } } Device (PRT6) { Name (_ADR, 0x06) // _ADR: Address Method (_UPC, 0, Serialized) // _UPC: USB Port Capabilities { Name (UPCA, Package (0x04) { 0xFF, 0xFF, 0x00, 0x00 }) Return (UPCA) } Method (_PLD, 0, Serialized) // _PLD: Physical Location of Device { Name (PLDA, Package() { Buffer (0x10) { /* 0000 */ 0x81, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0008 */ 0x3A, 0x1C, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00 } }) Return (PLDA) } } Device (PRT7) { Name (_ADR, 0x07) // _ADR: Address Method (_UPC, 0, Serialized) // _UPC: USB Port Capabilities { Name (UPCA, Package (0x04) { 0xFF, 0x02, 0x00, 0x00 }) Return (UPCA) } Method (_PLD, 0, Serialized) // _PLD: Physical Location of Device { Name (PLDA, Package() { Buffer (0x10) { /* 0000 */ 0x81, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0008 */ 0x59, 0x11, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00 } }) Return (PLDA) } } Device (PRT8) { Name (_ADR, 0x08) // _ADR: Address Method (_UPC, 0, Serialized) // _UPC: USB Port Capabilities { Name (UPCA, Package (0x04) { 0xFF, 0xFF, 0x00, 0x00 }) Return (UPCA) } Method (_PLD, 0, Serialized) { Name (PLDA, Package() { Buffer (0x10) { /* 0000 */ 0x81, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0008 */ 0x30, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } }) Return (PLDA) } } } Device (PRT2) { Name (_ADR, 0x02) // _ADR: Address Method (_UPC, 0, Serialized) // _UPC: USB Port Capabilities { Name (UPCA, Package (0x04) { 0x00, 0xFF, 0x00, 0x00 }) Return (UPCA) } } } } Now after reboot my USB ports have not been available. So I have to inject them with USBInjectAll.kext. After placing it in efi/clover/kexts/10.12 a huge amount of ports are available so I created a custom ssdt which shrinks down the port number after placing it in refi/clover/acpi/patched: // SSDT-UIAC-ALL.dsl // // This SSDT can be used as a template to build your own // customization for USBInjectAll.kext. // // This SSDT contains all ports, so using it is the same as without // a custom SSDT. Delete ports that are not connected or ports you // do not need. // // Change the UsbConnector or portType as needed to match your // actual USB configuration. // // Note: // portType=0 seems to indicate normal external USB2 port (as seen in MacBookPro8,1) // portType=2 seems to indicate "internal device" (as seen in MacBookPro8,1) // portType=4 is used by MacBookPro8,3 (reason/purpose unknown) // DefinitionBlock ("", "SSDT", 2, "hack", "UIAC-ALL", 0) { Device(UIAC) { Name(_HID, "UIA00000") Name(RMCF, Package() { "HUB1", Package() { "port-count", Buffer() { 8, 0, 0, 0 }, "ports", Package() { "HP11", Package() { //"UsbConnector", 0, "portType", 0, "port", Buffer() { 1, 0, 0, 0 }, }, "HP12", Package() { //"UsbConnector", 0, "portType", 0, "port", Buffer() { 2, 0, 0, 0 }, }, "HP13", Package() { //"UsbConnector", 0, "portType", 0, "port", Buffer() { 3, 0, 0, 0 }, }, "HP14", Package() { //"UsbConnector", 0, "portType", 0, "port", Buffer() { 4, 0, 0, 0 }, }, "HP15", Package() { //"UsbConnector", 0, "portType", 0, "port", Buffer() { 5, 0, 0, 0 }, }, "HP16", Package() { //"UsbConnector", 0, "portType", 0, "port", Buffer() { 6, 0, 0, 0 }, }, "HP17", Package() { //"UsbConnector", 0, "portType", 2, "port", Buffer() { 7, 0, 0, 0 }, }, "HP18", Package() { //"UsbConnector", 0, "portType", 2, "port", Buffer() { 8, 0, 0, 0 }, }, }, }, "HUB2", Package() { "port-count", Buffer() { 6, 0, 0, 0 }, "ports", Package() { "HP21", Package() { //"UsbConnector", 0, "portType", 0, "port", Buffer() { 1, 0, 0, 0 }, }, "HP22", Package() { //"UsbConnector", 0, "portType", 0, "port", Buffer() { 2, 0, 0, 0 }, }, "HP23", Package() { //"UsbConnector", 0, "portType", 0, "port", Buffer() { 3, 0, 0, 0 }, }, "HP24", Package() { //"UsbConnector", 0, "portType", 2, "port", Buffer() { 4, 0, 0, 0 }, }, "HP25", Package() { //"UsbConnector", 0, "portType", 0, "port", Buffer() { 5, 0, 0, 0 }, }, "HP26", Package() { //"UsbConnector", 0, "portType", 0, "port", Buffer() { 6, 0, 0, 0 }, }, }, }, "EH01", Package() { "port-count", Buffer() { 1, 0, 0, 0 }, "ports", Package() { "PR11", Package() { "UsbConnector", 255, "port", Buffer() { 1, 0, 0, 0 }, }, }, }, "EH02", Package() { "port-count", Buffer() { 1, 0, 0, 0 }, "ports", Package() { "PR21", Package() { "UsbConnector", 255, "port", Buffer() { 1, 0, 0, 0 }, }, }, }, }) } } So far my current research. Link to comment Share on other sites More sharing options...
bartl Posted August 9, 2017 Author Share Posted August 9, 2017 Have now shutdown working correctly (by accident figured out by my wife ) Here the short story: While doing trial and error research with my new created DSDT I always kept my "original" DSDT as default in clover. My wife want's to lookup something quickly before lunch and I just told her to switch on the machine. So it loaded my "original" DSDT in combination with USBInjectAll and my SSDT-UIAC-ALL. Then she just asked me to shut down the machine as the lunch was ready. And voilà - shutdown is working. So now I have to examine the difference between my DSDT and the "original" one. As far as I know there were no USB corrections made like above. But IORegistryExplorer is showing them as EHC1 and EHC2. My clover configuration is only to generate C and P states and FixIPIC in the ACPI section - SMBIOS set to 6.2. Before you ask - sleep is still not working - already checked it. Link to comment Share on other sites More sharing options...
Recommended Posts