diff options
Diffstat (limited to 'ReferenceCode/AcpiTables/Dsdt/Platform.asl')
-rw-r--r-- | ReferenceCode/AcpiTables/Dsdt/Platform.asl | 1880 |
1 files changed, 1880 insertions, 0 deletions
diff --git a/ReferenceCode/AcpiTables/Dsdt/Platform.asl b/ReferenceCode/AcpiTables/Dsdt/Platform.asl new file mode 100644 index 0000000..401f94a --- /dev/null +++ b/ReferenceCode/AcpiTables/Dsdt/Platform.asl @@ -0,0 +1,1880 @@ +/**************************************************************************; +;* *; +;* Intel Confidential *; +;* *; +;* Intel Corporation - ACPI Reference Code for the Haswell *; +;* Family of Customer Reference Boards. *; +;* *; +;* *; +;* Copyright (c) 1999 - 2013 Intel Corporation. All rights reserved *; +;* This software and associated documentation (if any) is furnished *; +;* under a license and may only be used or copied in accordance *; +;* with the terms of the license. Except as permitted by such *; +;* license, no part of this software or documentation may be *; +;* reproduced, stored in a retrieval system, or transmitted in any *; +;* form or by any means without the express written consent of *; +;* Intel Corporation. *; +;* *; +;* *; +;**************************************************************************/ +/*++ + This file contains a 'Sample Driver' and is licensed as such + under the terms of your license agreement with Intel or your + vendor. This file may be modified by the user, subject to + the additional terms of the license agreement +--*/ + + +// Define the following External variables to prevent a WARNING when +// using ASL.EXE and an ERROR when using IASL.EXE. + +External(PDC0) +External(PDC1) +External(PDC2) +External(PDC3) +External(PDC4) +External(PDC5) +External(PDC6) +External(PDC7) +External(\_PR.CFGD) + +External(\_SB.IAOE.PTSL) +External(\_SB.IAOE.ECTM) +External(\_SB.IAOE.RCTM) +External(\_SB.IAOE.ITMR) +External(\_SB.IAOE.FFSE) +External(\_SB.IFFS.FFSS) +External(\_SB.IAOE.PCIS) + +External(\_SB.IAOE.IBT1) // Isct Byte1 for EC +External(\_SB.IAOE.WKRS) // ISCT Wake Reason +#if !defined(ASL_Remove_SaSsdt_Data_To_Dsdt) || (ASL_Remove_SaSsdt_Data_To_Dsdt == 0) +External(\_SB.PCI0.GFX0.TCHE) // Technology enabled indicator +External(\_SB.PCI0.GFX0.STAT) // State Indicator +External(\_SB.PCI0.B0D3.ABAR) +External(\_SB.PCI0.B0D3.BARA) +External(\SGMD) +#endif + +External(\_SB.TPM.PTS, MethodObj) +External(\_SB.PCI0.I2C0.SHUB.PI2C.PUAM, MethodObj) //DUAM - Device User Absent Mode +External(\_SB.PCI0.PAUD.PUAM, MethodObj) //PUAM - PowerResource User Absent Mode +External(\_SB.PCI0.XHC.DUAM, MethodObj) //DUAM - Device User Absent Mode for XHCI controller +#ifndef AMI_OVERRIDE_FOR_ACPI_DEBUG +External(\MDBG, MethodObj) +#endif // AMI_OVERRIDE_FOR_ACPI_DEBUG + +External(\_SB.PCI0.PEG0.PEGP.EPON, MethodObj) +External(\_SB.PCI0.RP05.PEGP.EPON, MethodObj) + +#define CONVERTIBLE_BUTTON 6 +#define DOCK_INDICATOR 7 + +Name(ECUP, 1) // EC State indicator: 1- Normal Mode 0- Low Power Mode +Mutex(EHLD, 0) // EC Hold indicator: 0- No one accessing the EC Power State 1- Someone else is accessing the EC Power State + +// NFC module support +include("Nfc.asl") + +// Create a Global MUTEX. + +Mutex(MUTX,0) + +//AMI_OVERRIDE --- Debug output registers. >> +//------------------------------------------------------------------------ +// Procedure: DBG8 +// Procedure: DBG9 +// Description: Logical names for Debug ports 0x80(byte) and 0x90(word). +// If such debug ports exist in the System, the value, stored +// into the Port will be displayed to LED +// Input: Nothing +// Output: Nothing +//------------------------------------------------------------------------- + +OperationRegion (DEB0, SystemIO, 0x80, 1) +Field (DEB0, ByteAcc, NoLock, Preserve) +{ DBG8, 8 } + +OperationRegion (DEB1, SystemIO, 0x90, 2) +Field (DEB1, WordAcc, NoLock, Preserve) +{ DBG9, 16 } +//AMI_OVERRIDE --- Debug output registers. << + +#if 0 //AMI_OVERRIDE --- Below ASL code is for Thunderbolt, AMI thunderbolt module has taken care it already.>> +// OS Up mutex +Mutex(OSUM, 0) +// WAK Finished mutex +Mutex(WFDM, 0) +#endif //AMI_OVERRIDE --- it is for Thunderbolt, AMI thunderbolt module has taken care it already. << + +// Define Port 80 as an ACPI Operating Region to use for debugging. Please +// note that the Intel CRBs have the ability to ouput an entire DWord to +// Port 80h for debugging purposes, so the model implemented here may not be +// able to be used on OEM Designs. + +OperationRegion(PRT0,SystemIO,0x80,4) +Field(PRT0,DwordAcc,Lock,Preserve) +{ + P80H, 32 +} + + +// Port 80h Update: +// Update 8 bits of the 32-bit Port 80h. +// +// Arguments: +// Arg0: 0 = Write Port 80h, Bits 7:0 Only. +// 1 = Write Port 80h, Bits 15:8 Only. +// 2 = Write Port 80h, Bits 23:16 Only. +// 3 = Write Port 80h, Bits 31:24 Only. +// Arg1: 8-bit Value to write +// +// Return Value: +// None + +Method(P8XH,2,Serialized) +{ + If(LEqual(Arg0,0)) // Write Port 80h, Bits 7:0. + { + Store(Or(And(P80D,0xFFFFFF00),Arg1),P80D) + } + + If(LEqual(Arg0,1)) // Write Port 80h, Bits 15:8. + { + Store(Or(And(P80D,0xFFFF00FF),ShiftLeft(Arg1,8)),P80D) + } + + If(LEqual(Arg0,2)) // Write Port 80h, Bits 23:16. + { + Store(Or(And(P80D,0xFF00FFFF),ShiftLeft(Arg1,16)),P80D) + } + + If(LEqual(Arg0,3)) // Write Port 80h, Bits 31:24. + { + Store(Or(And(P80D,0x00FFFFFF),ShiftLeft(Arg1,24)),P80D) + } + + Store(P80D,P80H) +} + +Method(ADBG,1,Serialized) +{ +#ifndef AMI_OVERRIDE_FOR_ACPI_DEBUG + If(CondRefOf(MDBG)) + { + Return(MDBG(Arg0)) + } + Return(0) +#endif // AMI_OVERRIDE_FOR_ACPI_DEBUG +} + +// +// Define SW SMI port as an ACPI Operating Region to use for generate SW SMI. +// +OperationRegion(SPRT,SystemIO, 0xB2,2) +Field (SPRT, ByteAcc, Lock, Preserve) { + SSMP, 8 +} + +// The _PIC Control Method is optional for ACPI design. It allows the +// OS to inform the ASL code which interrupt controller is being used, +// the 8259 or APIC. The reference code in this document will address +// PCI IRQ Routing and resource allocation for both cases. +// +// The values passed into _PIC are: +// 0 = 8259 +// 1 = IOAPIC + +Method(\_PIC,1) +{ + Store(Arg0,GPIC) + Store(Arg0,PICM) +} + +// Prepare to Sleep. The hook is called when the OS is about to +// enter a sleep state. The argument passed is the numeric value of +// the Sx state. + +Method(_PTS,1) +{ + Store(0,P80D) // Zero out the entire Port 80h DWord. + P8XH(0,Arg0) // Output Sleep State to Port 80h, Byte 0. + + PTS(Arg0) //AMI_OVERRIDE --- Invoke PTS Method PRIOR TO ENTER ANY SLEEP STATE + ADBG(Concatenate("_PTS=",ToHexString(Arg0))) +#if 0 //AMI_OVERRIDE --- Below ASL code is for Thunderbolt, AMI thunderbolt module has taken care it already.>> + If(LOr(LEqual(BID, BICO),LEqual(BID, BICC))) { + Acquire(WFDM, 0xFFFF) + Store(0, WKFN) + Release(WFDM) + } + +#endif //AMI_OVERRIDE --- it is for Thunderbolt, AMI thunderbolt module has taken care it already. << + // + // Save Sleep state if iSCT is present + // + If(And(ICNF, 0x10)) + { + If(CondRefOf(\_SB.IAOE.PTSL)) + { + Store(Arg0, \_SB.IAOE.PTSL) + } + } + + // If code is executed, Wake from RI# via Serial Modem will be + // enabled. If code is not executed, COM Port Debugging throughout + // all Sx states will be enabled. + + If(LEqual(Arg0,3)) + { + // + // Disable update DTS temperature and threshold value in every SMI + // + If(LAnd(DTSE, LGreater(TCNT, 1))) + { + TRAP(\TRTD,30) + } + + // + // Set EC timer if iSCT enabled and EC timer is being used + // +#ifndef AMI_OVERRIDE_FOR_EC_SUPPORT + If(LEqual(\ECON,1)) + { +#endif // AMI_OVERRIDE_FOR_EC_SUPPORT + If(And(ICNF, 0x01)) + { + // + // ISCT SASD - Set EC based timer. + // + If(LAnd(And(ICNF, 0x10), LEqual(\_SB.IAOE.ITMR, 0))) + { + If (LAnd(CondRefOf(\_SB.PCI0.LPCB.H_EC.AWT0), CondRefOf(\_SB.IAOE.ECTM))) + { + If (LGreater(\_SB.IAOE.ECTM, 0)) + { + \_SB.PCI0.LPCB.H_EC.ECWT(And(\_SB.IAOE.ECTM, 0xFF), RefOf(\_SB.PCI0.LPCB.H_EC.AWT0)) + \_SB.PCI0.LPCB.H_EC.ECWT(ShiftRight(And(\_SB.IAOE.ECTM, 0xFF00), 8), RefOf(\_SB.PCI0.LPCB.H_EC.AWT1)) + \_SB.PCI0.LPCB.H_EC.ECWT(ShiftRight(And(\_SB.IAOE.ECTM, 0xFF0000), 16), RefOf(\_SB.PCI0.LPCB.H_EC.AWT2)) + // + // Enable EC timer - BIT7 + // Enable wake from S3 on timer exiry - BIT0 + // + Store(\_SB.PCI0.LPCB.H_EC.ECRD(RefOf(\_SB.PCI0.LPCB.H_EC.WTMS)), Local0) + \_SB.PCI0.LPCB.H_EC.ECWT(Or(0x81,Local0), RefOf(\_SB.PCI0.LPCB.H_EC.WTMS)) + } + } + } + + // + // ISCT - Check if RapidStart service exist or not + // If RapidStart then enable EC timer wake from S4. + // + If(LAnd(And(ICNF, 0x10), CondRefOf(\_SB.IFFS.FFSS))) + { + If (And(\_SB.IFFS.FFSS, 0x01)) + { + Store(1, \_SB.IAOE.FFSE) + If (LAnd(CondRefOf(\_SB.PCI0.LPCB.H_EC.WTMS), LEqual(\_SB.IAOE.PTSL, 0x03))) + { + Store(\_SB.PCI0.LPCB.H_EC.ECRD(RefOf(\_SB.PCI0.LPCB.H_EC.WTMS)), Local0) + // + // Enable wake from S4 on timer exiry - BIT1 + // + \_SB.PCI0.LPCB.H_EC.ECWT(Or(0x02,Local0), RefOf(\_SB.PCI0.LPCB.H_EC.WTMS)) + } + } + Else + { + Store(0, \_SB.IAOE.FFSE) + } + } + } +#ifndef AMI_OVERRIDE_FOR_EC_SUPPORT + } +#endif // AMI_OVERRIDE_FOR_EC_SUPPORT + + } + // + // Save EC 10Sec mode to NVS data PB1E Bit7 at S3/S4 entry + // + If(LOr(LEqual(Arg0,3), LEqual(Arg0,4))) + { + If(LAnd(CondRefOf(\_SB.PCI0.LPCB.H_EC.PB10), \ECON)){ + // + // Check EC 10sec PB mode is enabled.(H_EC.PB10) + // PB10 is cleared at every boot so we need to keep the state before entering S3/S4. + // + If(\_SB.PCI0.LPCB.H_EC.ECRD(RefOf(\_SB.PCI0.LPCB.H_EC.PB10))) + { + // + // EC 10sec PB mode is enabled. Save the state in PB1E bit7 + // + Or(PB1E, 0x80, PB1E) + } + Else + { + // + // EC 10sec PB mode is not enabled. Clear PB1E bit7. + // + And(PB1E, 0x7F, PB1E) + } + } + } + + +#if 0 //AMI_OVERRIDE --- It is for CRB SIO using, OEM doesn't need to it. >> + If(LEqual(DBGS,0)) + { + Store(0,RT10) // Set MAXIM Transceiver = FORCEOFF. + Store(0x20,PME1) // Set SMSC GPI15 = Wake Event. + Store(1,PME0) // Set SMSC PME Enable. + Store(0x20,PMS1) // Clear GPI15 Status. + Store(1,PMS0) // Clear PME Status. + } +#endif //AMI_OVERRIDE --- It is for CRB SIO using, OEM doesn't need to it. << + + // Generate a SW SMI trap to save some NVRAM data back to CMOS. + + // Don't enable IGD OpRegion support yet. + // TRAP(1, 81) + // + // Call TPM.PTS + // + If(CondRefOf(\_SB.TPM.PTS)) + { + // + // Call TPM PTS method + // + \_SB.TPM.PTS (Arg0) + } + + // StandBy LED Drive. Program High for sleep state s3, s4 and s5 only fro desktop. + If(LOr(LOr(LEqual(Arg0,3), LEqual(Arg0,4)), LEqual(Arg0,5))){ + If(LEqual(PFLV,FDTP)){ + Store(1, \GP27) + } + } +} + +#if 0 //AMI_OVERRIDE --- Below ASL code is for Thunderbolt, AMI thunderbolt module has taken care it already.>> +External(\_GPE.OSUP, MethodObj) +External(\_GPE.MMTB, MethodObj) + + Method(MMRP) + { + Store(PEBS, Local0) // MMIO Base address + Add(Local0, 0xE0000, Local0) // RP01 + Subtract(ToInteger(TBSE), 1, Local1) + Multiply(Local1, 0x1000, Local1) + Add(Local0, Local1, Local0) // RP0x + + Return(Local0) + } +#endif //AMI_OVERRIDE --- It is for CRB SIO using, OEM doesn't need to it. << + +// Wake. This hook is called when the OS is about to wake from a +// sleep state. The argument passed is the numeric value of the +// sleep state the system is waking from. + +Method(_WAK,1,Serialized) +{ + P8XH(1,0xAB) // Beginning of _WAK. + + WAK(Arg0) //AMI_OVERRIDE --- Invoke WAK Method WHILE WAKE FROM ANY SLEEP STATE + + ADBG("_WAK") + + If(LOr(LEqual(Arg0,3), LEqual(Arg0,4))) // If S3 or S4 Resume + { + // + // During S3/S4 wake add indicator for 'Switchable/Hybrid Graphics endpoint device is on' + // + If(CondRefOf(\_SB.PCI0.PEG0.PEGP.EPON)) + { + \_SB.PCI0.PEG0.PEGP.EPON() + } + + If(CondRefOf(\_SB.PCI0.RP05.PEGP.EPON)) + { + \_SB.PCI0.RP05.PEGP.EPON() + } + } + + // + // Save a valid Audio BAR for the ABWA W/A + // + If (LAnd (LNotEqual (And(\_SB.PCI0.B0D3.ABAR, 0xFFFFC004), 0xFFFFC004), LNotEqual (And (\_SB.PCI0.B0D3.ABAR, 0xFFFFC000), 0))) { + Store (\_SB.PCI0.B0D3.ABAR, \_SB.PCI0.B0D3.BARA) + } + + // + // Clear iSCT timers and sleep settings if iSCT is present + // + If(And(ICNF, 0x10)) + { + // + // If Graphics Driver supports disable display notification in ISCT mode + // + If (And(\_SB.PCI0.GFX0.TCHE, 0x100)) + { + // + // Notify Gfx driver that the platform is in Isct Mode + // + If (LEqual(\_SB.IAOE.ITMR, 1)) + { + // + // If ISCT Mode and Wake Reason is ISCT wake (RTC Timer or Network PME) + // Then notify graphics driver to turn off display + // + If (LAnd(And(\_SB.IAOE.IBT1, 0x01), LOr(And(\_SB.IAOE.WKRS, 0x02), And(\_SB.IAOE.WKRS, 0x10)))) { + Store(Or(And(\_SB.PCI0.GFX0.STAT, Not(0x03)), 0x01), \_SB.PCI0.GFX0.STAT) // BITS[1:0] = 01, ISCT Resume + } else { + Store(And(\_SB.PCI0.GFX0.STAT, Not(0x03)), \_SB.PCI0.GFX0.STAT) // BITS[1:0] = 00, Normal Resume to S0 + } + } else { + If(LEqual(\ECON,1)) { + If(CondRefOf(\_SB.PCI0.LPCB.H_EC.IBT1)) { + // + // If ISCT Mode and Wake Reason is ISCT wake (EC Timer or Network PME) + // Then notify graphics driver to turn off display + // + If (LAnd(And(\_SB.PCI0.LPCB.H_EC.ECRD(RefOf(\_SB.PCI0.LPCB.H_EC.IBT1)), 0x01), LOr(And(\_SB.IAOE.WKRS, 0x02), And(\_SB.IAOE.WKRS, 0x10)))) { + Store(Or(And(\_SB.PCI0.GFX0.STAT, Not(0x03)), 0x01), \_SB.PCI0.GFX0.STAT) // BITS[1:0] = 01, ISCT Resume + } else { + Store(And(\_SB.PCI0.GFX0.STAT, Not(0x03)), \_SB.PCI0.GFX0.STAT) // BITS[1:0] = 00, Normal Resume to S0 + } + } + } // (LEqual(\ECON,1)) + } + } + + If(CondRefOf(\_SB.IAOE.PTSL)) + { + Store(0, \_SB.IAOE.PTSL) + } + If (LEqual(\_SB.IAOE.ITMR, 0)) { + If(CondRefOf(\_SB.PCI0.LPCB.H_EC.WTMS)) + { + \_SB.PCI0.LPCB.H_EC.ECWT(0, RefOf(\_SB.PCI0.LPCB.H_EC.WTMS)) + } + } + If (CondRefOf(\_SB.IAOE.ECTM)) + { + Store(0, \_SB.IAOE.ECTM) + } + If (CondRefOf(\_SB.IAOE.RCTM)) + { + Store(0, \_SB.IAOE.RCTM) + } + } + + If(NEXP) + { + // Reinitialize the Native PCI Express after resume + + If(And(OSCC,0x02)) + { + \_SB.PCI0.NHPG() + } + If(And(OSCC,0x04)) // PME control granted? + { + \_SB.PCI0.NPME() + } + } + + If(LEqual(Arg0,3)) + { + // Turn off the CPU Fan for all OSes if Active Cooling + // is disabled. + + If(LEqual(0,ACTT)) + { + If(LEqual(\ECON,1)) + { + \_SB.PCI0.LPCB.H_EC.ECWT(0, RefOf(\_SB.PCI0.LPCB.H_EC.CFAN)) + } + } + } + + If(LOr(LEqual(Arg0,3), LEqual(Arg0,4))) // If S3 or S4 Resume + { + + // + // Restore EC 10sec PB override mode + // + If(LAnd(CondRefOf(\_SB.PCI0.LPCB.H_EC.PB10), \ECON)){ + If(And(PB1E, 0x80)) + { + \_SB.PCI0.LPCB.H_EC.ECWT(1, RefOf(\_SB.PCI0.LPCB.H_EC.PB10)) + } + } + + // Check to send Convertible/Dock state changes upon resume from Sx. + + If(And(GBSX,0x40)) + { + \_SB.PCI0.GFX0.IUEH(6) + + // + // Do the same thing for Virtul Button device. + // Toggle Bit3 of PB1E(Slate/Notebook status) + // +#if defined(ASL_CRB_EC_SUPPORT) && (ASL_CRB_EC_SUPPORT == 1) + Xor(PB1E, 0x08, PB1E) + + // + // Update VGBS(V-GPIO Button state) accordingly. + // + If(And(PB1E, 0x08)){ + If(LAnd(CondRefOf(\_SB.PCI0.LPCB.H_EC.VGBI), \ECON)) + { + \_SB.PCI0.LPCB.H_EC.VGBI.UPBT(CONVERTIBLE_BUTTON, One) + } + } + Else + { + If(LAnd(CondRefOf(\_SB.PCI0.LPCB.H_EC.VGBI), \ECON)) + { + \_SB.PCI0.LPCB.H_EC.VGBI.UPBT(CONVERTIBLE_BUTTON, Zero) + } + } +#endif //#ifdef ASL_CRB_EC_SUPPORT + } + + If(And(GBSX,0x80)) + { + \_SB.PCI0.GFX0.IUEH(7) + + // + // Do the same thing for Virtul Button device. + // Toggle Bit4 of PB1E (Dock/Undock status) + // +#if defined(ASL_CRB_EC_SUPPORT) && (ASL_CRB_EC_SUPPORT == 1) + Xor(PB1E, 0x10, PB1E) + + // + // Update VGBS(Virtual Button state) accordingly. + // + If(And(PB1E, 0x10)) + { + If(LAnd(CondRefOf(\_SB.PCI0.LPCB.H_EC.VGBI), \ECON)) + { + \_SB.PCI0.LPCB.H_EC.VGBI.UPBT(DOCK_INDICATOR, One) + } + } + Else + { + If(LAnd(CondRefOf(\_SB.PCI0.LPCB.H_EC.VGBI), \ECON)) + { + \_SB.PCI0.LPCB.H_EC.VGBI.UPBT(DOCK_INDICATOR, Zero) + } + } + +#endif //#ifdef ASL_CRB_EC_SUPPORT + } + + +#if defined(ASL_CRB_EC_SUPPORT) && (ASL_CRB_EC_SUPPORT == 1) + // + // Prevent reinitializing Virtual GPIO Button status + // + If(CondRefOf(\_SB.PCI0.LPCB.H_EC.VGBI.ONTM)) + { + Store(1, \_SB.PCI0.LPCB.H_EC.VGBI.ONTM) + } +#endif //#ifdef ASL_CRB_EC_SUPPORT + If(LAnd(DTSE, LGreater(TCNT, 1))) + { + TRAP(\TRTD, 20) + } + + // Windows XP SP2 does not properly restore the P-State + // upon resume from S4 or S3 with degrade modes enabled. + // Use the existing _PPC methods to cycle the available + // P-States such that the processor ends up running at + // the proper P-State. + // + // Note: For S4, another possible W/A is to always boot + // the system in LFM. + // + + If(LEqual(OSYS,2002)) + { + If(And(\_PR.CFGD,0x01)) + { + If(LGreater(\_PR.CPU0._PPC,0)) + { + Subtract(\_PR.CPU0._PPC,1,\_PR.CPU0._PPC) + PNOT() + Add(\_PR.CPU0._PPC,1,\_PR.CPU0._PPC) + PNOT() + } + Else + { + Add(\_PR.CPU0._PPC,1,\_PR.CPU0._PPC) + PNOT() + Subtract(\_PR.CPU0._PPC,1,\_PR.CPU0._PPC) + PNOT() + } + } + } + + If(LEqual(\ECON,1)) + { + // Update Lid state after S3 or S4 resume + If(LOr(LEqual(Arg0,3), LEqual(Arg0,4))) // If S3 or S4 Resume + { + Store(\_SB.PCI0.LPCB.H_EC.ECRD(RefOf(\_SB.PCI0.LPCB.H_EC.LSTE)), LIDS) + + If(IGDS) + { + If (LEqual(LIDS, 0)) + { + Store(0x80000000,\_SB.PCI0.GFX0.CLID) + } + If (LEqual(LIDS, 1)) + { + Store(0x80000003,\_SB.PCI0.GFX0.CLID) + } + } + Notify(\_SB.LID0,0x80) + } + + // Detect the change of Dock state + If(LNotEqual(\_SB.PCI0.LPCB.H_EC.ECRD(RefOf(\_SB.PCI0.LPCB.H_EC.DOCK)), \DSTS)) + { + Store(\_SB.PCI0.LPCB.H_EC.ECRD(RefOf(\_SB.PCI0.LPCB.H_EC.DOCK)), \DSTS) + If(LAnd(\_SB.PCI0.HDEF.DCKS, 1)) + { + Store(\DSTS, \_SB.PCI0.HDEF.DCKA) + } + If(LEqual(\DSTS, 1)) // Docked. + { + If(LEqual(Arg0,3)) + { + Sleep(1000) // Delay 1 second for hot docking stability + Store(\PDBR, \SSMP) + Sleep(1000) // Delay 1 second for hot docking stability + } + Notify(\_SB.PCI0.DOCK, 0) + } + Else // Undocked. + { + Notify(\_SB.PCI0.DOCK, 1) + } + } + + // Detect the change of Power State. + If(LEqual(BNUM,0)) + { + If(LNotEqual(\_SB.PCI0.LPCB.H_EC.ECRD(RefOf(\_SB.PCI0.LPCB.H_EC.VPWR)),PWRS)) + { + Store(\_SB.PCI0.LPCB.H_EC.ECRD(RefOf(\_SB.PCI0.LPCB.H_EC.VPWR)),PWRS) + // Perform needed ACPI Notifications. + PNOT() + } + } + Else + { + If(LNotEqual(\_SB.PCI0.LPCB.H_EC.ECRD(RefOf(\_SB.PCI0.LPCB.H_EC.RPWR)),PWRS)) + { + Store(\_SB.PCI0.LPCB.H_EC.ECRD(RefOf(\_SB.PCI0.LPCB.H_EC.RPWR)),PWRS) + // Perform needed ACPI Notifications. + PNOT() + } + } + } + +#if 0 //AMI_OVERRIDE --- Below ASL code is for Thunderbolt, AMI thunderbolt module has taken care it already.>> + If(LOr(LEqual(BID, BICO),LEqual(BID, BICC))) { + Acquire(OSUM, 0xFFFF) + Store(MMRP(), Local0) + OperationRegion(RP_X,SystemMemory,Local0,0x20) + Field(RP_X,DWordAcc, NoLock, Preserve) + { + REG0, 32, + REG1, 32, + REG2, 32, + REG3, 32, + REG4, 32, + REG5, 32, + REG6, 32, + REG7, 32 + } + Store(REG6, Local1) + Store(0x00F0F000, REG6) + Store(\_GPE.MMTB(), Local2) + \_GPE.OSUP(Local2) + Store(Local1, REG6) + Release(OSUM) + } +#endif //AMI_OVERRIDE --- it is for Thunderbolt, AMI thunderbolt module has taken care it already. << + + // For PCI Express Express Cards, it is possible a device was + // either inserted or removed during an Sx State. The problem + // is that no wake event will occur for a given warm inseration + // or removal, so the OS will not become aware of any change. + // To get around this, re-enumerate all Express Card slots. + // + // If the Root Port is enabled, it may be assumed to be hot-pluggable. + +#if defined(ASL_RC_PORT_0) && (ASL_RC_PORT_0==1) + If(LEqual(RP1D,0)) + { + Notify (\_SB.PCI0.RP01,0) + } +#endif // ASL_RC_PORT_0 + +#if defined(ASL_RC_PORT_1) && (ASL_RC_PORT_1==1) + If(LEqual(RP2D,0)) + { + Notify (\_SB.PCI0.RP02,0) + } +#endif // ASL_RC_PORT_1 + +#if defined(ASL_RC_PORT_2) && (ASL_RC_PORT_2==1) + If(LEqual(RP3D,0)) + { + Notify (\_SB.PCI0.RP03,0) + } +#endif // ASL_RC_PORT_2 + +#if defined(ASL_RC_PORT_3) && (ASL_RC_PORT_3==1) + If(LEqual(RP4D,0)) + { + Notify (\_SB.PCI0.RP04,0) + } +#endif // ASL_RC_PORT_3 + +#if defined(ASL_RC_PORT_4) && (ASL_RC_PORT_4==1) + If(LEqual(RP5D,0)) + { + Notify (\_SB.PCI0.RP05,0) + } +#endif // ASL_RC_PORT_4 + +#if defined(ASL_RC_PORT_5) && (ASL_RC_PORT_5==1) + If(LEqual(\RP6D,0)) + { + Notify (\_SB.PCI0.RP06,0) + } +#endif // ASL_RC_PORT_5 + +#if defined(ASL_RC_PORT_6) && (ASL_RC_PORT_6==1) + If(LEqual(RP7D,0)) + { + If(LEqual(\DSTS,0)) // UnDocked. + { + Notify (\_SB.PCI0.RP07,0) + } + } +#endif // ASL_RC_PORT_6 + +#if defined(ASL_RC_PORT_7) && (ASL_RC_PORT_7==1) + If(LEqual(RP8D,0)) + { + If(LEqual(\DSTS,0)) // UnDocked. + { + Notify (\_SB.PCI0.RP08,0) + } + } +#endif // ASL_RC_PORT_7 + } + + If(LOr(LEqual(Arg0,3), LEqual(Arg0,4))) // If S3 or S4 Resume + { + // + // To support Win8, RapidStart resume from G3 and resume from DeepSx state + // + \_SB.PCI0.XHC.XWAK() + } +#if 0 //AMI_OVERRIDE --- Below ASL code is for Thunderbolt, AMI thunderbolt module has taken care it already.>> + If(LOr(LEqual(BID, BICO),LEqual(BID, BICC))) { + Acquire(WFDM, 0xFFFF) + Store(1, WKFN) + Release(WFDM) + ADBG(Concatenate("_WAK=", ToHexString(Timer))) + } +#endif //AMI_OVERRIDE --- it is for Thunderbolt, AMI thunderbolt module has taken care it already. << + Return(Package(){0,0}) +} + +// Get Buffer: +// This method will take a buffer passed into the method and +// create then return a smaller buffer based on the pointer +// and size parameters passed in. +// +// Arguments: +// Arg0: Pointer to start of new Buffer in passed in Buffer. +// Arg1: Size of Buffer to create. +// Arg2: Original Buffer +// +// Return Value: +// Newly created buffer. + +Method(GETB,3,Serialized) +{ + Multiply(Arg0,8,Local0) // Convert Index. + Multiply(Arg1,8,Local1) // Convert Size. + CreateField(Arg2,Local0,Local1,TBF3) // Create Buffer. + + Return(TBF3) // Return Buffer. +} + +// Power Notification: +// Perform all needed OS notifications during a +// Power Switch. +// +// Arguments: +// None +// +// Return Value: +// None + +Method(PNOT,0,Serialized) +{ + // + // If MP enabled and driver support is present, notify all + // processors. + // + If(CondRefOf(\_SB.PCCD.PENB)) { // is CPPC enabled in SETUP? + Notify(\_SB.PCCD,0x82) // CPPC notify + } Else { + If(LGreater(TCNT, 1)) + { + If(And(PDC0,0x0008)){ + Notify(\_PR.CPU0,0x80) // Eval CPU0 _PPC. + } + If(And(PDC1,0x0008)){ + Notify(\_PR.CPU1,0x80) // Eval CPU1 _PPC. + } + If(And(PDC2,0x0008)){ + Notify(\_PR.CPU2,0x80) // Eval CPU2 _PPC. + } + If(And(PDC3,0x0008)){ + Notify(\_PR.CPU3,0x80) // Eval CPU3 _PPC. + } + If(And(PDC4,0x0008)){ + Notify(\_PR.CPU4,0x80) // Eval CPU4 _PPC. + } + If(And(PDC5,0x0008)){ + Notify(\_PR.CPU5,0x80) // Eval CPU5 _PPC. + } + If(And(PDC6,0x0008)){ + Notify(\_PR.CPU6,0x80) // Eval CPU6 _PPC. + } + If(And(PDC7,0x0008)){ + Notify(\_PR.CPU7,0x80) // Eval CPU7 _PPC. + } + }Else{ + Notify(\_PR.CPU0,0x80) // Eval _PPC. + } + } + + If(LGreater(TCNT, 1)){ + If(LAnd(And(PDC0,0x0008),And(PDC0,0x0010))){ + Notify(\_PR.CPU0,0x81) // Eval CPU0 _CST. + } + If(LAnd(And(PDC1,0x0008),And(PDC1,0x0010))){ + Notify(\_PR.CPU1,0x81) // Eval CPU1 _CST. + } + If(LAnd(And(PDC2,0x0008),And(PDC2,0x0010))){ + Notify(\_PR.CPU2,0x81) // Eval CPU2 _CST. + } + If(LAnd(And(PDC3,0x0008),And(PDC3,0x0010))){ + Notify(\_PR.CPU3,0x81) // Eval CPU3 _CST. + } + If(LAnd(And(PDC4,0x0008),And(PDC4,0x0010))){ + Notify(\_PR.CPU4,0x81) // Eval CPU4 _CST. + } + If(LAnd(And(PDC5,0x0008),And(PDC5,0x0010))){ + Notify(\_PR.CPU5,0x81) // Eval CPU5 _CST. + } + If(LAnd(And(PDC6,0x0008),And(PDC6,0x0010))){ + Notify(\_PR.CPU6,0x81) // Eval CPU6 _CST. + } + If(LAnd(And(PDC7,0x0008),And(PDC7,0x0010))){ + Notify(\_PR.CPU7,0x81) // Eval CPU7 _CST. + } + }Else{ + Notify(\_PR.CPU0,0x81) // Eval _CST. + } + + // Update the Battery 1 and 2 Stored Capacity and + // Stored Status. Battery 0 information is always accurrate. + + If(LEqual(\ECON,1)) + { + Store(\_SB.PCI0.LPCB.H_EC.ECRD(RefOf(\_SB.PCI0.LPCB.H_EC.B1CC)),B1SC) + Store(\_SB.PCI0.LPCB.H_EC.ECRD(RefOf(\_SB.PCI0.LPCB.H_EC.B1ST)),B1SS) + Store(\_SB.PCI0.LPCB.H_EC.ECRD(RefOf(\_SB.PCI0.LPCB.H_EC.B2CC)),B2SC) + Store(\_SB.PCI0.LPCB.H_EC.ECRD(RefOf(\_SB.PCI0.LPCB.H_EC.B2ST)),B2SS) + + // Perform update to all Batteries in the System. + If(LGreaterEqual(OSYS,2006)) // Vista and Win7 later on OS + { + Notify(\_SB.PCI0.LPCB.H_EC.BAT0,0x81) // Eval BAT0 _BST. + Notify(\_SB.PCI0.LPCB.H_EC.BAT1,0x81) // Eval BAT1 _BST. + Notify(\_SB.PCI0.LPCB.H_EC.BAT2,0x81) // Eval BAT2 _BST. + } + Else + { + Notify(\_SB.PCI0.LPCB.H_EC.BAT0,0x80) // Eval BAT0 _BST. + Notify(\_SB.PCI0.LPCB.H_EC.BAT1,0x80) // Eval BAT1 _BST. + Notify(\_SB.PCI0.LPCB.H_EC.BAT2,0x80) // Eval BAT2 _BST. + } + } + + If (LEqual(DPTF,1)){ + Notify(\_SB.IETM, 0x86) // Notification sent to DPTF driver (Policy) for PDRT reevaluation after AC/DC transtion has occurred. + } +} + +// +// Memory window to the CTDP registers starting at MCHBAR+5000h. +// +OperationRegion (MBAR, SystemMemory, Add(ShiftLeft(\_SB.PCI0.MHBR,15),0x5000), 0x1000) + Field (MBAR, ByteAcc, NoLock, Preserve) + { + Offset (0x938), // PACKAGE_POWER_SKU_UNIT (MCHBAR+0x5938) + PWRU, 4, // Power Units [3:0] unit value is calculated by 1 W / Power(2,PWR_UNIT). The default value of 0011b corresponds to 1/8 W. + Offset (0x9A0), // TURBO_POWER_LIMIT1 (MCHBAR+0x59A0) + PPL1, 15, // PKG_PWR_LIM_1 [14:0] + PL1E,1, // PKG_PWR_LIM1_EN [15] + CLP1,1, // Package Clamping Limitation 1 + } +Name(CLMP, 0) // save the clamp bit +Name(PLEN,0) // save the power limit enable bit +Name(PLSV,0x8000) // save value of PL1 upon entering CS +Name(CSEM, 0) //semaphore to avoid multiple calls to SPL1. SPL1/RPL1 must always be called in pairs, like push/pop off a stack +// +// SPL1 (Set PL1 to 4.5 watts with clamp bit set) +// Per Legacy Thermal management CS requirements, we would like to set the PL1 limit when entering CS to 4.5W with clamp bit set via MMIO. +// This can be done in the ACPI object which gets called by graphics driver during CS Entry. +// Likewise, during CS exit, the BIOS must reset the PL1 value to the previous value prior to CS entry and reset the clamp bit. +// +// Arguments: +// None +// +// Return Value: +// None +Method(SPL1,0,Serialized) +{ + Name(PPUU,0) // units + If (LEqual(CSEM, 1)) + { + Return() // we have already been called, must have CS exit before calling again + } + Store(1, CSEM) // record first call + + Store (PPL1, PLSV) // save PL1 value upon entering CS + Store (PL1E, PLEN) // save PL1 Enable bit upon entering CS + Store (CLP1, CLMP) // save PL1 Clamp bit upon entering CS + + If (LEqual(PWRU,0)) { // use PACKAGE_POWER_SKU_UNIT - Power Units[3:0] + Store(1,PPUU) + } Else { + ShiftLeft(Decrement(PWRU),2,PPUU) // get units + } + + Multiply(PLVL,PPUU,Local0) // convert SETUP value to power units in milli-watts + Divide(Local0,1000,,Local1) // convert SETUP value to power units in watts + Store(Local1, PPL1) // copy value to PL1 + Store(1, PL1E) // set Enable bit + Store(1, CLP1) // set Clamp bit +} +// +// RPL1 (Restore the PL1 register to the values prior to CS entry) +// +// Arguments: +// None +// +// Return Value: +// None +Method(RPL1,0,Serialized) +{ + Store (PLSV, PPL1) // restore value of PL1 upon exiting CS + Store(PLEN, PL1E) // restore the PL1 enable bit + Store(CLMP, CLP1) // restore the PL1 Clamp bit + Store(0, CSEM) // restore semaphore +} + +Name(DDPS, 0) // Current Display Power Status. 0= D0; non-zero = Dx state;. Initial value is zero. +Name(UAMS, 0) // User Absent Mode state, Zero - User Present; non-Zero - User not present +// GUAM - Global User Absent Mode +// Run when a change to User Absent mode is made, e.g. screen/display on/off events. +// Any device that needs notifications of these events includes its own UAMN Control Method. +// +// Arguments: +// Power State: +// 00h = On +// 01h = Standby +// 02h = Suspend +// 04h = Off +// 08h = Reduced On +// +// Return Value: +// None +// +Method(GUAM,1,Serialized) +{ + If(LNotEqual(Arg0, DDPS)){ // Display controller D-State changed? + Store(Arg0, DDPS) //Update DDPS to current state + Store(LAnd(Arg0, Not(PWRS)), UAMS) // UAMS: User Absent Mode state, Zero - User Present; non-Zero - User not present + + //Port 80 code for CS + If(Arg0){ + if(LEqual(ECNO,0x01)){ // Check EC notification enabled in Setup + ADBG("EC Notify") + if(LEqual(ECDB,0x01)){ + ADBG("EC Debug") + \_SB.PCI0.LPCB.H_EC.ECWT(1, RefOf(\_SB.PCI0.LPCB.H_EC.DLED)) //Set EC CS Debug Light (CAPS LOCK) + } + \_SB.PCI0.LPCB.H_EC.ECMD (0x2C) // Notify EC of CS entry + If(LEqual(ECLP, 0x1)) { + Store(Zero,\ECUP) + } + } + P8XH(0, 0xC5) + P8XH(1, 00) + ADBG("Enter CS") + If(PSCP){ + // if P-state Capping is enabled + If (LAnd(CondRefOf(\_PR.CPU0._PSS), CondRefOf(\_PR.CPU0._PPC))) + { + Subtract(SizeOf(\_PR.CPU0._PSS), One, \_PR.CPU0._PPC) + PNOT() + } + } + If(PLCS){ + SPL1() // set PL1 to low value upon CS entry + } + } Else { + if(LEqual(ECNO,0x01)){ // Check EC notification enabled in Setup + ADBG("EC Notify") + Store (Acquire(\EHLD, 0xFFFF), Local0) // Wait for Mutex for telling EC to exit Low Power Mode + if (LEqual(Local0, Zero)) { + \_SB.PCI0.LPCB.H_EC.ECMD (0x2D) // Notify EC of CS exit + If(LEqual(ECLP, 0x1)) { + Store(One,\ECUP) + } + Release(\EHLD) + } + ADBG("EC Debug") + \_SB.PCI0.LPCB.H_EC.ECWT(0, RefOf(\_SB.PCI0.LPCB.H_EC.DLED)) //Clear EC CS Debug Light (CAPS LOCK) + } + P8XH(0, 0xC5) + P8XH(1, 0xAB) + ADBG("Exit CS") + If(PSCP){ + // if P-state Capping s enabled + If (CondRefOf(\_PR.CPU0._PPC)) + { + Store(Zero, \_PR.CPU0._PPC) + PNOT() + } + } + If(PLCS){ + RPL1() // restore PL1 to pre-CS value upon exiting CS + } + } + + P_CS() // Powergating during CS + } +} + +// Power CS Powergated Devices: +// Method to enable/disable power during CS +Method(P_CS,0,Serialized) +{ + // NOTE: Do not turn ON Touch devices from here. Touch does not have PUAM + If(CondRefOf(\_SB.PCI0.PAUD.PUAM)){ // Notify Codec(HD-A/ADSP) + \_SB.PCI0.PAUD.PUAM() + } + // Adding back USB powergating (ONLY for Win8) until RTD3 walkup port setup implementation is complete */ + If(LEqual(OSYS,2012)){ // ONLY for Win8 OS + If(CondRefOf(\_SB.PCI0.XHC.DUAM)){ // Notify USB port- RVP + \_SB.PCI0.XHC.DUAM() + } + } + // TODO: Add calls to UAMN methods for + // * USB controller(s) + // * Embedded Controller + // * Sensor devices + // * Audio DSP? + // * Any other devices dependent on User Absent mode for power controls +} + +// SMI I/O Trap: +// Generate a Mutex protected SMI I/O Trap. +// +// Arguments: +// Arg0: I/O Trap type. +// 2 - For DTS +// 3 - For IGD +// 4 - For Pfat Tools +// Arg1: SMI I/O Trap Function to call. +// +// Return Value: +// SMI I/O Trap Return value. +// 0 = Success. Non-zero = Failure. + +Method(TRAP,2,Serialized) +{ + Store(Arg1,SMIF) // Store SMI Function. + + If(LEqual(Arg0,\TRTD)) // Is DTS IO Trap? + { + Store(Arg1,DTSF) // Store the function number global NVS + Store(0,TRPD) // Generate IO Trap. + Return(DTSF) // Return status from SMI handler + } + + If(LEqual(Arg0,\TRTI)) // Is IGD IO Trap? + { + Store(0,TRPH) // Generate IO Trap. + } + + If(LEqual(Arg0,\PFTI)) // Is PFAT TOOLS IO Trap? + { + Store(0,TRPF) // Generate IO Trap + } + + Return(SMIF) // Return SMIF. 0 = Success. +} + +// Note: Only add the indicator device needed by the platform. + +// +// System Bus +// +Scope(\_SB.PCI0) +{ + + Method(PTMA) + { + Return(PFMA) + } + + Method(PTMS) + { + Return(PFMS) + } + + Method(PTIA) + { + Return(PFIA) + } + + Method(_INI,0) + { + // Determine the OS and store the value, where: + // + // OSYS = 1000 = Linux. + // OSYS = 2000 = WIN2000. + // OSYS = 2001 = WINXP, RTM or SP1. + // OSYS = 2002 = WINXP SP2. + // OSYS = 2006 = Vista. + // OSYS = 2009 = Windows 7 and Windows Server 2008 R2. + // OSYS = 2012 = Windows 8 and Windows Server 2012. + // OSYS = 2013 = Windows Blue. + // + // Assume Windows 2000 at a minimum. + + Store(2000,OSYS) + + // Check for a specific OS which supports _OSI. + + If(CondRefOf(\_OSI,Local0)) + { + If(\_OSI("Linux")) + { + Store(1000,OSYS) + } + + If(\_OSI("Windows 2001")) + { + Store(2001,OSYS) + } + + If(\_OSI("Windows 2001 SP1")) + { + Store(2001,OSYS) + } + + If(\_OSI("Windows 2001 SP2")) + { + Store(2002,OSYS) + } + + If (\_OSI( "Windows 2001.1")) + { + Store (2003, OSYS) + } + + If(\_OSI("Windows 2006")) + { + Store(2006,OSYS) + } + + If(\_OSI("Windows 2009")) + { + Store(2009,OSYS) + } + + If(\_OSI("Windows 2012")) + { + Store(2012,OSYS) + } + + If(\_OSI("Windows 2013")) + { + Store(2013,OSYS) + } + } +#if 0 //AMI_OVERRIDE --- Below ASL code is for Thunderbolt, AMI thunderbolt module has taken care it already.>> + If(LOr(LEqual(BID, BICO),LEqual(BID, BICC))) { + Acquire(OSUM, 0xFFFF) + Store(MMRP(), Local1) + OperationRegion(RP_X,SystemMemory,Local1,0x20) + Field(RP_X,DWordAcc, NoLock, Preserve) + { + REG0, 32, + REG1, 32, + REG2, 32, + REG3, 32, + REG4, 32, + REG5, 32, + REG6, 32, + REG7, 32 + } + Store(REG6, Local2) + Store(0x00F0F000, REG6) + Store(\_GPE.MMTB(), Local3) + \_GPE.OSUP(Local3) + Store(Local2, REG6) + Release(OSUM) + Acquire(WFDM, 0xFFFF) + Store(1, WKFN) + + Release(WFDM) + } +#endif //AMI_OVERRIDE --- it is for Thunderbolt, AMI thunderbolt module has taken care it already. << + PINI() + } + + Method(NHPG,0,Serialized) + { +#if defined(ASL_RC_PORT_0) && (ASL_RC_PORT_0==1) + Store(0,^RP01.HPEX) // clear the hot plug SCI enable bit +#endif // ASL_RC_PORT_0 +#if defined(ASL_RC_PORT_1) && (ASL_RC_PORT_1==1) + Store(0,^RP02.HPEX) // clear the hot plug SCI enable bit +#endif // ASL_RC_PORT_1 +#if defined(ASL_RC_PORT_2) && (ASL_RC_PORT_2==1) + Store(0,^RP03.HPEX) // clear the hot plug SCI enable bit +#endif // ASL_RC_PORT_2 +#if defined(ASL_RC_PORT_3) && (ASL_RC_PORT_3==1) + Store(0,^RP04.HPEX) // clear the hot plug SCI enable bit +#endif // ASL_RC_PORT_3 +#if defined(ASL_RC_PORT_4) && (ASL_RC_PORT_4==1) + Store(0,^RP05.HPEX) // clear the hot plug SCI enable bit +#endif // ASL_RC_PORT_4 +#if defined(ASL_RC_PORT_5) && (ASL_RC_PORT_5==1) + Store(0,^RP06.HPEX) // clear the hot plug SCI enable bit +#endif // ASL_RC_PORT_5 +#if defined(ASL_RC_PORT_6) && (ASL_RC_PORT_6==1) + Store(0,^RP07.HPEX) // clear the hot plug SCI enable bit +#endif // ASL_RC_PORT_6 +#if defined(ASL_RC_PORT_7) && (ASL_RC_PORT_7==1) + Store(0,^RP08.HPEX) // clear the hot plug SCI enable bit +#endif // ASL_RC_PORT_7 +#if defined(ASL_RC_PORT_0) && (ASL_RC_PORT_0==1) + Store(1,^RP01.HPSX) // clear the hot plug SCI status bit +#endif // ASL_RC_PORT_0 +#if defined(ASL_RC_PORT_1) && (ASL_RC_PORT_1==1) + Store(1,^RP02.HPSX) // clear the hot plug SCI status bit +#endif // ASL_RC_PORT_1 +#if defined(ASL_RC_PORT_2) && (ASL_RC_PORT_2==1) + Store(1,^RP03.HPSX) // clear the hot plug SCI status bit +#endif // ASL_RC_PORT_2 +#if defined(ASL_RC_PORT_3) && (ASL_RC_PORT_3==1) + Store(1,^RP04.HPSX) // clear the hot plug SCI status bit +#endif // ASL_RC_PORT_3 +#if defined(ASL_RC_PORT_4) && (ASL_RC_PORT_4==1) + Store(1,^RP05.HPSX) // clear the hot plug SCI status bit +#endif // ASL_RC_PORT_4 +#if defined(ASL_RC_PORT_5) && (ASL_RC_PORT_5==1) + Store(1,^RP06.HPSX) // clear the hot plug SCI status bit +#endif // ASL_RC_PORT_5 +#if defined(ASL_RC_PORT_6) && (ASL_RC_PORT_6==1) + Store(1,^RP07.HPSX) // clear the hot plug SCI status bit +#endif // ASL_RC_PORT_6 +#if defined(ASL_RC_PORT_7) && (ASL_RC_PORT_7==1) + Store(1,^RP08.HPSX) // clear the hot plug SCI status bit +#endif // ASL_RC_PORT_7 + } + + Method(NPME,0,Serialized) + { +#if defined(ASL_RC_PORT_0) && (ASL_RC_PORT_0==1) + Store(0,^RP01.PMEX) // clear the PME SCI enable bit +#endif +#if defined(ASL_RC_PORT_1) && (ASL_RC_PORT_1==1) + Store(0,^RP02.PMEX) // clear the PME SCI enable bit +#endif +#if defined(ASL_RC_PORT_2) && (ASL_RC_PORT_2==1) + Store(0,^RP03.PMEX) // clear the PME SCI enable bit +#endif +#if defined(ASL_RC_PORT_3) && (ASL_RC_PORT_3==1) + Store(0,^RP04.PMEX) // clear the PME SCI enable bit +#endif +#if defined(ASL_RC_PORT_4) && (ASL_RC_PORT_4==1) + Store(0,^RP05.PMEX) // clear the PME SCI enable bit +#endif +#if defined(ASL_RC_PORT_5) && (ASL_RC_PORT_5==1) + Store(0,^RP06.PMEX) // clear the PME SCI enable bit +#endif +#if defined(ASL_RC_PORT_6) && (ASL_RC_PORT_6==1) + Store(0,^RP07.PMEX) // clear the PME SCI enable bit +#endif +#if defined(ASL_RC_PORT_7) && (ASL_RC_PORT_7==1) + Store(0,^RP08.PMEX) // clear the PME SCI enable bit +#endif +#if defined(ASL_RC_PORT_0) && (ASL_RC_PORT_0==1) + Store(1,^RP01.PMSX) // clear the PME SCI status bit +#endif +#if defined(ASL_RC_PORT_1) && (ASL_RC_PORT_1==1) + Store(1,^RP02.PMSX) // clear the PME SCI status bit +#endif +#if defined(ASL_RC_PORT_2) && (ASL_RC_PORT_2==1) + Store(1,^RP03.PMSX) // clear the PME SCI status bit +#endif +#if defined(ASL_RC_PORT_3) && (ASL_RC_PORT_3==1) + Store(1,^RP04.PMSX) // clear the PME SCI status bit +#endif +#if defined(ASL_RC_PORT_4) && (ASL_RC_PORT_4==1) + Store(1,^RP05.PMSX) // clear the PME SCI status bit +#endif +#if defined(ASL_RC_PORT_5) && (ASL_RC_PORT_5==1) + Store(1,^RP06.PMSX) // clear the PME SCI enable bit +#endif +#if defined(ASL_RC_PORT_6) && (ASL_RC_PORT_6==1) + Store(1,^RP07.PMSX) // clear the PME SCI status bit +#endif +#if defined(ASL_RC_PORT_7) && (ASL_RC_PORT_7==1) + Store(1,^RP08.PMSX) // clear the PME SCI status bit +#endif + } +} + +Scope (\) +{ + // + // Global Name, returns current Interrupt controller mode; + // updated from _PIC control method + // + Name(PICM, 0) + + // + // Procedure: GPRW + // + // Description: Generic Wake up Control Method ("Big brother") + // to detect the Max Sleep State available in ASL Name scope + // and Return the Package compatible with _PRW format. + // Input: Arg0 = bit offset within GPE register space device event will be triggered to. + // Arg1 = Max Sleep state, device can resume the System from. + // If Arg1 = 0, Update Arg1 with Max _Sx state enabled in the System. + // Output: _PRW package + // + Name(PRWP, Package(){Zero, Zero}) // _PRW Package + + Method(GPRW, 2) + { + Store(Arg0, Index(PRWP, 0)) // copy GPE# + // + // SS1-SS4 - enabled in BIOS Setup Sleep states + // + Store(ShiftLeft(SS1,1),Local0) // S1 ? + Or(Local0,ShiftLeft(SS2,2),Local0) // S2 ? + Or(Local0,ShiftLeft(SS3,3),Local0) // S3 ? + Or(Local0,ShiftLeft(SS4,4),Local0) // S4 ? + // + // Local0 has a bit mask of enabled Sx(1 based) + // bit mask of enabled in BIOS Setup Sleep states(1 based) + // + If(And(ShiftLeft(1, Arg1), Local0)) + { + // + // Requested wake up value (Arg1) is present in Sx list of available Sleep states + // + Store(Arg1, Index(PRWP, 1)) // copy Sx# + } + Else + { + // + // Not available -> match Wake up value to the higher Sx state + // + ShiftRight(Local0, 1, Local0) + // If(LOr(LEqual(OSFL, 1), LEqual(OSFL, 2))) { // ??? Win9x + // FindSetLeftBit(Local0, Index(PRWP,1)) // Arg1 == Max Sx + // } Else { // ??? Win2k / XP + FindSetLeftBit(Local0, Index(PRWP,1)) // Arg1 == Min Sx + // } + } + + Return(PRWP) + } +} + + +Scope (\_SB) +{ + Name(OSCI, 0) // \_SB._OSC DWORD2 input + Name(OSCO, 0) // \_SB._OSC DWORD2 output + // _OSC (Operating System Capabilities) + // _OSC under \_SB scope is used to convey platform wide OSPM capabilities. + // ACPI 5.0 specification enables OSPM to query for Platform CPPC support + // through _OSC evaluation. Upon _OSC evaluation, platform can indicate + // support/non-support for CPPC through the return buffer. For a complete + // description of _OSC ACPI Control Method, refer to ACPI 5.0 + // specification, section 6.2.10. + // Arguments: (4) + // Arg0 - A Buffer containing the UUID "0811B06E-4A27-44F9-8D60-3CBBC22E7B48" + // Arg1 - An Integer containing the Revision ID of the buffer format + // Arg2 - An Integer containing a count of entries in Arg3 + // Arg3 - A Buffer containing a list of DWORD capabilities + // Return Value: + // A Buffer containing the list of capabilities + // + Method(_OSC,4,Serialized) + { + +//ami override + If(LNotEqual(OSCM(Arg0,Arg1,Arg2,Arg3),0)) + { + Return(Arg3) + } +//ami override + + // + // Point to Status DWORD in the Arg3 buffer (STATUS) + // + CreateDWordField(Arg3, 0, STS0) + // + // Point to Caps DWORDs of the Arg3 buffer (CAPABILITIES) + // + CreateDwordField(Arg3, 4, CAP0) + + // + // Check UUID + // + If(LEqual(Arg0,ToUUID("0811B06E-4A27-44F9-8D60-3CBBC22E7B48"))) + { + // + // Check Revision + // + If(LEqual(Arg1,One)) + { + If(And(CAP0,0x04)) // Check _PR3 Support(BIT2) + { + Store(0x04, OSCO) + If(LNotEqual(And(SGMD,0x0F),2)) // Check Switchable/Hybrid graphics is not enabled in bios setup [SgModeMuxless]? + { + If(LEqual(RTD3,0)) // Is RTD3 support disabled in Bios Setup? + { + // RTD3 is disabled via BIOS Setup. + And(CAP0, 0x3B, CAP0) // Clear _PR3 capability + Or(STS0, 0x10, STS0) // Indicate capability bit is cleared + } + } + } + + // Process command. Regardless of query or control, we do the same thing. + If(And(CAP0,0x20)) // Check CPC Support + { + If(CondRefOf(\_SB.PCCD.PENB)){ + If(LEqual(\_SB.PCCD.PENB, 0)){ + // PENB = 0 => CPPC is disabled via BIOS Setup. + And(CAP0, 0x1F, CAP0) // Clear _CPC capability + Or(STS0, 0x10, STS0) // Indicate capability bit is cleared + } + } Else { + // PENB object not found in namespace => CPPC is disabled via BIOS Setup. + And(CAP0, 0x1F, CAP0) // Clear _CPC capability + Or(STS0, 0x10, STS0) // Indicate capability bit is cleared + } + } + } Else{ + And(STS0,0xFFFFFF00,STS0) + Or(STS0,0xA, STS0) // Unrecognised Revision and report OSC failure + } + } Else { + And(STS0,0xFFFFFF00,STS0) + Or (STS0,0x6, STS0) // Unrecognised UUID and report OSC failure + } + + Return(Arg3) + } // End _OSC + + Device (PEPD) + { + Name (_HID, "INT33A1") + Name (_CID, EISAID ("PNP0D80")) + Name (_UID, 0x1) + + Name(PEPP, Zero) + Name (DEVS, Package() + { + 2, + Package() {"\\_SB.PCI0.GFX0"}, + Package() {"\\_SB.PCI0.SAT0.PRT1"} + }) + + Name (DEVX, Package() + { + Package() {"\\_SB.PCI0.GFX0",0xffffffff}, + Package() {"\\_SB.PCI0.SAT0.PRT1",0xffffffff}, + Package() {"\\_SB.PCI0.UA01", 0xffffffff}, + Package() {"\\_SB.PCI0.SDHC", 0xffffffff }, + Package() {"\\_SB.PCI0.I2C0", 0xffffffff }, + Package() {"\\_SB.PCI0.I2C1", 0xffffffff }, + Package() {"\\_SB.PCI0.XHC", 0xffffffff }, + Package() {"HDAUDIO\\FUNC_01&VEN_10EC&DEV_0282&SUBSYS_00000000&REV_1000\\4&a02b74b&0&0001", 0xffffffff }, + }) + + Name(DEVY, Package() // uPEP Device List + { + // + // 1: ACPI Device Descriptor: Fully Qualified namestring + // 2: Enabled/Disabled Field + // 0 = This device is disabled and applies no constraints + // >0 = This device is enabled and applies constraints + // 3: Constraint Package: entry per LPI state in LPIT + // a. Associated LPI State UID + // ID == 0xFF: same constraints apply to all states in LPIT + // b: minimum Dx state as pre-condition + // c: (optional) OEM specific OEM may provide an additional encoding + // which further defines the D-state Constraint + // 0x0-0x7F - Reserved + // 0x80-0xFF - OEM defined + // + Package() {"\\_PR.CPU0", 0x1, Package() {0, Package(){0xFF, 0}}}, + Package() {"\\_PR.CPU1", 0x1, Package() {0, Package(){0xFF, 0}}}, + Package() {"\\_PR.CPU2", 0x1, Package() {0, Package(){0xFF, 0}}}, + Package() {"\\_PR.CPU3", 0x1, Package() {0, Package(){0xFF, 0}}}, + Package() {"\\_SB.PCI0.GFX0", 0x1, Package() {0, Package(){0xFF, 3}}}, + Package() {"\\_SB.PCI0.SAT0", 0x1, Package() {0, Package(){0xFF, 3}}}, + Package() {"\\_SB.PCI0.SAT0.PRT0", 0x1, Package() {0, Package(){0xFF, 0, 0x81}}}, + Package() {"\\_SB.PCI0.SAT0.PRT1", 0x1, Package() {0, Package(){0xFF, 0, 0x81}}}, + Package() {"\\_SB.PCI0.SAT0.PRT2", 0x1, Package() {0, Package(){0xFF, 0, 0x81}}}, + Package() {"\\_SB.PCI0.SAT0.PRT3", 0x1, Package() {0, Package(){0xFF, 0, 0x81}}}, + Package() {"\\_SB.PCI0.UA00", 0x1, Package() {0, Package(){0xFF, 3}}}, + Package() {"\\_SB.PCI0.UA01", 0x1, Package() {0, Package(){0xFF, 3}}}, + Package() {"\\_SB.PCI0.SDHC", 0x1, Package() {0, Package(){0xFF, 3}}}, + Package() {"\\_SB.PCI0.I2C0", 0x1, Package() {0, Package(){0xFF, 3}}}, + Package() {"\\_SB.PCI0.I2C1", 0x1, Package() {0, Package(){0xFF, 3}}}, + Package() {"\\_SB.PCI0.XHC", 0x1, Package() {0, Package(){0xFF, 3}}}, + Package() {"HDAUDIO\\FUNC_01&VEN_10EC&DEV_0282*", 0x1, Package() {0, Package(){0x0, 0}, Package(){0x1, 3}}}, + Package() {"\\_SB.PCI0.ADSP", 0x1, Package() {0, Package(){0x0, 0}, Package(){0x1, 3}}}, + }) + + Name(BCCD, Package() // Bugcheck Critical Device(s) + { + // + // 1: ACPI Device Descriptor: Fully Qualified name string + // 2: Package of packages: 1 or more specific commands to power up critical device + // 2a: Package: GAS-structure describing location of PEP accessible power control + // Refer to ACPI 5.0 spec section 5.2.3.1 for details + // a: Address Space ID (0 = System Memory) + // NOTE: A GAS Address Space of 0x7F (FFH) indicates remaining package + // elements are Intel defined + // b: Register bit width (32 = DWORD) + // c: Register bit offset + // d: Access size (3 = DWORD Access) + // e: Address (for System Memory = 64-bit physical address) + // 2b: Package containing: + // a: AND mask - not applicable for all Trigger Types + // b: Value (bits required to power up the critical device) + // c: Trigger Type: + // 0 = Read + // 1 = Write + // 2 = Write followed by Read + // 3 = Read Modify Write + // 4 = Read Modify Write followed by Read + // 2c: Power up delay: Time delay before next operation in uSec + // + Package() {"\\_SB.PCI0.SAT0", Package() { + Package() {Package() {1, 8, 0, 1, 0xB2}, // GAS Structure 8-bit IO Port + Package() {0x0, 0xCD, 0x1}, // Write 0xCD + 16000} // Power up delay = 16ms + } + }, + Package() {"\\_SB.PCI0.SAT0.PRT0", Package(){ + Package() {Package() {1, 8, 0, 1, 0xB2}, // GAS Structure 8-bit IO Port + Package() {0x0, 0xCD, 0x1}, // Write 0xCD + 16000} // Power up delay = 16ms + } + }, + Package() {"\\_SB.PCI0.SAT0.PRT1", Package(){ + Package() {Package() {1, 8, 0, 1, 0xB2}, // GAS Structure 8-bit IO Port + Package() {0x0, 0xCD, 0x1}, // Write 0xCD + 16000} // Power up delay = 16ms + } + }, + Package() {"\\_SB.PCI0.SAT0.PRT2", Package(){ + Package() {Package() {1, 8, 0, 1, 0xB2}, // GAS Structure 8-bit IO Port + Package() {0x0, 0xCD, 0x1}, // Write 0xCD + 16000} // Power up delay = 16ms + } + }, + Package() {"\\_SB.PCI0.SAT0.PRT3", Package(){ + Package() {Package() {1, 8, 0, 1, 0xB2}, // GAS Structure 8-bit IO Port + Package() {0x0, 0xCD, 0x1}, // Write 0xCD + 16000} // Power up delay = 16ms + } + }, + }) + + Method(_STA, 0x0, NotSerialized) + { + If(LGreaterEqual(OSYS,2012)) + { + If(LEqual(And(CDID,0xF000), 0x9000)) // LPT-H Chipset DID start with 0x8xxx while LPT-LP start with 0x9xxx + { + If(LEqual(S0ID, 1)) + { + Return(0xf) + } + } + } + Return(0) + } + + Method(_DSM, 0x4, Serialized) + { + If(LEqual(Arg0,ToUUID("B8FEBFE0-BAF8-454b-AECD-49FB91137B21"))) //PEP driver should use same UUID + { + If(LEqual(Arg2, Zero)) + { + Return(Buffer(One) + { + 0x07 + }) + } + If(LEqual(Arg2, One)) + { + Store(0x1, PEPP) + Return(0xf) + } + If(LEqual(Arg2, 2)) + { + If(LEqual(Arg1, Zero)) { // Revision ID is Zero + // TBD Needs to find a better logic here.... + Switch(PEPY){ + Case(1){ // Grpahics alone enabled + Return(Package(){1,Package() {"\\_SB.PCI0.GFX0"}}) + } + Case(2){ // SATA alone enabled + Return(Package(){1,Package() {"\\_SB.PCI0.SAT0.PRT1"}}) + } + Case(3){ // Both SATA and Gfx enabled + Return(DEVS) + } + Default{ // All devices are disabled + Return(Package(){0}) + } + } // End of Switch(PEPY) + } + + If(LEqual(Arg1, One)) { // Revision ID is One + If(LNot(And(PEPY,0x01))){ // Check if PEP GFx disabled in Setup + Store (0x00, Index (DeRefOf(Index (DEVX, 0)), 1)) // Disable Gfx + } + If(LNot(And(PEPY,0x02))){ // Check if PEP Sata disabled in Setup + Store (0x00, Index (DeRefOf(Index (DEVX, 1)), 1)) // Disable Sata + } + If(LNot(And(PEPY,0x04))){ // Check if PEP UART disabled in Setup + Store (0x00, Index (DeRefOf(Index (DEVX, 2)), 1)) // Disable UART + } + If(LNot(And(PEPY,0x08))){ // Check if PEP SDHC disabled in Setup + Store (0x00, Index (DeRefOf(Index (DEVX, 3)), 1)) // Disable SDHC + } + If(LNot(And(PEPY,0x10))){ // Check if PEP I2C0 disabled in Setup + Store (0x00, Index (DeRefOf(Index (DEVX, 4)), 1)) // Disable I2C0 + } + If(LNot(And(PEPY,0x20))){ // Check if PEP I2C1 disabled in Setup + Store (0x00, Index (DeRefOf(Index (DEVX, 5)), 1)) // Disable I2C1 + } + If(LNot(And(PEPY,0x40))){ // Check if PEP XHCI disabled in Setup + Store (0x00, Index (DeRefOf(Index (DEVX, 6)), 1)) // Disable XHCI + } + If(LNot(And(PEPY,0x80))){ // Check if PEP audio disabled in Setup + Store (0x00, Index (DeRefOf(Index (DEVX, 7)), 1)) // Disable Audio + } + Return(DEVX) + } + } //If(LEqual(Arg2, 2)) + }// If(LEqual(Arg0,ToUUID("B8FEBFE0-BAF8-454b-AECD-49FB91137B21"))) + + If(LEqual(Arg0,ToUUID("c4eb40a0-6cd2-11e2-bcfd-0800200c9a66"))) + { + // Number of Functions (including this one) + If(LEqual(Arg2, Zero)) + { + Return(Buffer(One){0x07}) + } + // Device Constraints Enumeration + If(LEqual(Arg2, One)) + { + // Update uPEP device list based on PEPC (Low Power S0 Constraint) + // Bit[1:0] - SATA (0:None, 1:SATA Ports[all], 2:SATA Controller) + // [2] - En/Dis UART 0 + // [3] - UART 1 + // [4] - SDIO + // [5] - I2C 0 + // [6] - I2C 1 + // [7] - XHCI + // [8] - Azalia + // [9] - ADSP + + If(LNotEqual(And(PEPC, 0x0003), 1)) // PEPC Bit[1:0] - SATA (0:None, 1:SATA Ports[all], 2:SATA Controller) + { + // No Constraint for SATA Ports (SAT0.PRT0, PRT1, PRT2, PRT3) + Store (0x00, Index (DeRefOf(Index (DEVY, 6)), 1)) // SAT0.PRT0 + Store (0x00, Index (DeRefOf(Index (DEVY, 7)), 1)) // SAT0.PRT1 + Store (0x00, Index (DeRefOf(Index (DEVY, 8)), 1)) // SAT0.PRT2 + Store (0x00, Index (DeRefOf(Index (DEVY, 9)), 1)) // SAT0.PRT3 + } + + If(LNotEqual(And(PEPC, 0x0003), 2)) // PEPC Bit[1:0] - SATA (0:None, 1:SATA Ports[all], 2:SATA Controller) + { + // No Constraint for SATA Controller (SAT0) + Store (0x00, Index (DeRefOf(Index (DEVY, 5)), 1)) // SAT0 + + // Disable SATA Ports if no drive is connected + If(LNot(And(SPST,1))) + { + // Disable SATA Ports 0 + Store (0x00, Index (DeRefOf(Index (DEVY, 6)), 1)) // SAT0.PRT0 + } + If(LNot(And(SPST, 2))) + { + // Disable SATA Ports 1 + Store (0x00, Index (DeRefOf(Index (DEVY, 7)), 1)) // SAT0.PRT1 + } + If(LNot(And(SPST, 4))) + { + // Disable SATA Ports 2 + Store (0x00, Index (DeRefOf(Index (DEVY, 8)), 1)) // SAT0.PRT2 + } + If(LNot(And(SPST, 8))) + { + // Disable SATA Ports 3 + Store (0x00, Index (DeRefOf(Index (DEVY, 9)), 1)) // SAT0.PRT3 + } + } + + If(LEqual(And(PEPC,0x0004),0)) // PEPC Bit[2] - En/Dis UART 0 + { + // Disabled UA00 + Store (0x00, Index (DeRefOf(Index (DEVY, 10)), 1)) // UA00 + } + + If(LEqual(And(PEPC,0x0008),0)) // PEPC Bit[3] - En/Dis UART 1 + { + // Disabled UA01 + Store (0x00, Index (DeRefOf(Index (DEVY, 11)), 1)) // UA01 + } + + If(LEqual(And(PEPC,0x0010),0)) // PEPC Bit[4] - En/Dis SDIO + { + // Disabled SDHC + Store (0x00, Index (DeRefOf(Index (DEVY, 12)), 1)) // SDHC + } + + If(LEqual(And(PEPC,0x0020),0)) // PEPC Bit[5] - En/Dis I2C 0 + { + // Disabled I2C0 + Store (0x00, Index (DeRefOf(Index (DEVY, 13)), 1)) // I2C0 + } + + If(LEqual(And(PEPC,0x0040),0)) // PEPC Bit[6] - En/Dis I2C 1 + { + // Disabled I2C1 + Store (0x00, Index (DeRefOf(Index (DEVY, 14)), 1)) // I2C1 + } + + If(LEqual(And(PEPC,0x0080),0)) // PEPC Bit[7] - En/Dis XHCI + { + // Disabled XHCI + Store (0x00, Index (DeRefOf(Index (DEVY, 15)), 1)) // XHC + } + + If(LEqual(And(PEPC,0x0100),0)) // PEPC Bit[9] - En/Dis Azalia + { + // Disabled Azalia + Store (0x00, Index (DeRefOf(Index (DEVY, 16)), 1)) // Azalia + } + + If(LEqual(And(PEPC,0x0200),0)) // PEPC Bit[10] - En/Dis ADSP + { + // Disabled ADSP + Store (0x00, Index (DeRefOf(Index (DEVY, 17)), 1)) // ADSP + } + + Return(DEVY) + } + // BCCD + If(LEqual(Arg2, 2)) + { + Return(BCCD) + } + }// If(LEqual(Arg0,ToUUID("c4eb40a0-6cd2-11e2-bcfd-0800200c9a66"))) + Return(One) + } // Method(_DSM) + } //device (PEPD) + +} // End Scope(\_SB) + +Scope (\_SB) +{ + // + // define a BT RF-Kill device. + // + Device (BTKL) + { + Name(_HID, "INT3420") + + Method (_STA, 0x0, NotSerialized) + { + If (\_OSI ("Windows 2012")) { // WIN8? + If (LEqual(BID, BW2C)) { // WTM2? + Return(0x0F) + } + } + Return(0x00) // not support BT RF-Kill, device hide. + } + + // D0 Method for BTKL + Method(_PS0,0,Serialized) + { + // de-assert GPIO87 + And(\GL0A, 0x7F, \GL0A) + } + + // D3 Method for BTKL + Method(_PS3,0,Serialized) + { + // assert GPIO87 + Or(\GL0A, 0x80, \GL0A) + } + + // detect GPIO pin status + Method(PSTS) + { + Return(RDGP(87)) + } + } +} // End Scope(\_SB) |