blob: 5dcfccebe498f09b4d4f35d42c227baf93c0d0af [file] [log] [blame]
/**
* @file
*
* ALIB PSPP ASL library
*
*
*
* @xrefitem bom "File Content Label" "Release Content"
* @e project: AGESA
* @e sub-project: GNB
* @e \$Revision: 49911 $ @e \$Date: 2011-03-30 17:43:29 +0800 (Wed, 30 Mar 2011) $
*
*/
/*
*****************************************************************************
*
* Copyright (c) 2011, Advanced Micro Devices, Inc.
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
* * Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* * Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* * Neither the name of Advanced Micro Devices, Inc. nor the names of
* its contributors may be used to endorse or promote products derived
* from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL ADVANCED MICRO DEVICES, INC. BE LIABLE FOR ANY
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
* ***************************************************************************
*
*/
/*----------------------------------------------------------------------------------------*/
/**
* PCIe Performance Policy
*
* varPsppPolicy - 0 Disabled
* 1 Performance
* 2 Balance Hight
* 3 Balance Low
* 4 Power Saving
*/
Name (
AD02,
0x0
)
Alias (
AD02,
varPsppPolicy
)
/*----------------------------------------------------------------------------------------*/
/**
* GEN2 VID
*
*/
Name (
AD03,
0x0
)
Alias (
AD03,
varGen2Vid
)
/*----------------------------------------------------------------------------------------*/
/**
* GEN1 VID
*
*/
Name (
AD04,
0x0
)
Alias (
AD04,
varGen1Vid
)
/*----------------------------------------------------------------------------------------*/
/**
* Boot VID
*
*/
Name (
AD05,
0x0
)
Alias (
AD05,
varBootVid
)
/*----------------------------------------------------------------------------------------*/
/**
* Max Port link speed
*
*/
Name (AD06, Package () {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00})
Alias (AD06, varMaxLinkSpeed)
/*----------------------------------------------------------------------------------------*/
/**
* Max link speed that was changed during runtime (hotplug for instance)
*
*/
Name (AD08, Package () {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00})
Alias (AD08, varOverrideLinkSpeed)
/*----------------------------------------------------------------------------------------*/
/**
* Policy service status
*
* varPsppPolicyService - 0 (Stopped)
* 1 (Started)
*/
Name (varPsppPolicyService, 0x0 )
/*----------------------------------------------------------------------------------------*/
/**
* AC DC state
*
* varPsppAcDcState - 0 (AC)
* 1 (DC)
*/
Name (varPsppAcDcState, 0x0)
Name (varPsppAcDcOverride, 0x1)
/*----------------------------------------------------------------------------------------*/
/**
* Client ID array
*
*/
Name (varPsppClientIdArray,
Package () {0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000}
)
Name (varDefaultPsppClientIdArray,
Package () {0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000}
)
/*----------------------------------------------------------------------------------------*/
/**
* LInk speed requested by device driver
*
*/
Name (varRequestedLinkSpeed, Package () {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00})
/*----------------------------------------------------------------------------------------*/
/**
* Current link speed
*
*/
Name (AD09, Package () {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 })
Alias (AD09, varCurrentLinkSpeed)
/*----------------------------------------------------------------------------------------*/
/**
* Template link speed
*
*/
Name (
varGen1LinkSpeedTemplate,
Package () {
DEF_LINK_SPEED_GEN1,
DEF_LINK_SPEED_GEN1,
DEF_LINK_SPEED_GEN1,
DEF_LINK_SPEED_GEN1,
DEF_LINK_SPEED_GEN1,
DEF_LINK_SPEED_GEN1,
DEF_LINK_SPEED_GEN1,
DEF_LINK_SPEED_GEN1
})
/*----------------------------------------------------------------------------------------*/
/**
* Template link speed
*
*/
Name (varLowVoltageRequest, Package () {0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 })
/*----------------------------------------------------------------------------------------*/
/**
* Global varuable
*
*/
Name (varPortIndex, 0)
/*----------------------------------------------------------------------------------------*/
/**
* Sclk VID that was changed during runtime
*
*/
Name (AD10, Package () {0x00, 0x00, 0x00, 0x00})
Alias (AD10, varSclkVid)
/*----------------------------------------------------------------------------------------*/
/**
* Report AC/DC state
*
* Arg0 - Data Buffer
*/
Method (procPsppReportAcDsState, 1, Serialized) {
Store ("PsppReportAcDsState Enter", Debug)
Store (DeRefOf (Index (Arg0, 0x2)), varArgAcDcStateLocal1)
Store (Concatenate (" AC/DC state: ", ToHexString (varArgAcDcStateLocal1), varStringBuffer), Debug)
Store (procPsppGetAcDcState(), varCurrentAcDcStateLocal0)
Store (varArgAcDcStateLocal1, varPsppAcDcState)
Or (ShiftLeft (1, DEF_SCARTCH_PSPP_ACDC_OFFSET), ShiftLeft (1, DEF_SCARTCH_PSPP_ACDC_OVR_OFFSET), Local2)
Or (ShiftLeft (varPsppAcDcState, DEF_SCARTCH_PSPP_ACDC_OFFSET), ShiftLeft (varPsppAcDcOverride, DEF_SCARTCH_PSPP_ACDC_OVR_OFFSET), Local3)
procIndirectRegisterRMW (0x0, 0x60, 0xF4, Not (Local2), And (Local2, Local3))
if (LEqual (varArgAcDcStateLocal1, varCurrentAcDcStateLocal0)) {
Store (" No action. [AC/DC state not changed]", Debug)
Store ("PsppReportAcDsState Exit", Debug)
return (0)
}
// Disable both APM (boost) and PDM flow on DC event enable it on AC.
procApmPdmActivate(varPsppAcDcState)
// Set DPM state for Power Saving, due to this policy will not attend ApplyPsppState service.
if (LEqual (varPsppPolicy, DEF_PSPP_POLICY_POWERSAVING)) {
procNbLclkDpmActivate(DEF_LINK_SPEED_GEN1)
#ifdef ALTVDDNB_SUPPORT
procNbAltVddNb (DEF_LINK_SPEED_GEN1)
#endif
}
if (LOr (LLessEqual (varPsppPolicy, DEF_PSPP_POLICY_PERFORMANCE), LGreaterEqual (varPsppPolicy, DEF_PSPP_POLICY_POWERSAVING))) {
Store (" No action. [Policy type]", Debug)
Store ("PsppReportAcDsState Exit", Debug)
return (0)
}
if (LEqual (varPsppPolicyService, DEF_PSPP_POLICY_STOP)) {
Store (" No action. [Policy not started]", Debug)
Store ("PsppReportAcDsState Exit", Debug)
return (0)
}
procApplyPsppState ()
Store ("PsppReportAcDsState Exit", Debug)
return (0)
}
/*----------------------------------------------------------------------------------------*/
/**
* PCIe Performance Request
*
* Arg0 - Data Buffer
*/
Method (procPsppPerformanceRequest, 1, NotSerialized) {
Store (procPsppProcessPerformanceRequest (Arg0), Local7)
Store (DeRefOf (Index (Local7, 2)), varReturnStatusLocal0)
if (LNotEqual (varReturnStatusLocal0, 2)) {
return (Local7)
}
procApplyPsppState ()
return (Local7)
}
/*----------------------------------------------------------------------------------------*/
/**
* PCIe Performance Request
*
* Arg0 - Data Buffer
*/
Method (procPsppProcessPerformanceRequest, 1, NotSerialized) {
Store ("PsppProcessPerformanceRequest Enter", Debug)
Name (varClientBus, 0)
Store (0, varPortIndex)
Store (Buffer (10) {}, Local7)
CreateWordField (Local7, 0x0, varReturnBufferLength)
Store (3, varReturnBufferLength)
CreateByteField (Local7, 0x2, varReturnStatus)
Store (1, varReturnStatus)
if (LOr (LLessEqual (varPsppPolicy, DEF_PSPP_POLICY_PERFORMANCE), LGreaterEqual (varPsppPolicy, DEF_PSPP_POLICY_POWERSAVING))) {
Store (" No action. [Policy type]", Debug)
Store ("PsppPerformanceRequest Exit", Debug)
return (Local7)
}
if (LEqual (varPsppPolicyService, DEF_PSPP_POLICY_STOP)) {
Store (" No action. [Policy not started]", Debug)
Store ("PsppPerformanceRequest Exit", Debug)
return (Local7)
}
CreateWordField (Arg0, 0x2, varClientId)
CreateWordField (Arg0, 0x4, varValidFlag)
CreateWordField (Arg0, 0x6, varFlag)
CreateByteField (Arg0, 0x8, varRequestType)
CreateByteField (Arg0, 0x9, varRequestData)
Store (Concatenate (" Client ID : ", ToHexString (varClientId), varStringBuffer), Debug)
Store (Concatenate (" Valid Flags : ", ToHexString (varValidFlag), varStringBuffer), Debug)
Store (Concatenate (" Flags : ", ToHexString (varFlag), varStringBuffer), Debug)
Store (Concatenate (" Request Type: ", ToHexString (varRequestType), varStringBuffer), Debug)
Store (Concatenate (" Request Data: ", ToHexString (varRequestData), varStringBuffer), Debug)
And (ShiftRight (varClientId, 8), 0xff, varClientBus)
while (LLessEqual (varPortIndex, varMaxPortIndexNumber)) {
if (LEqual (procChecPortAllocated (varPortIndex), DEF_PORT_ALLOCATED)) {
Store (procPciDwordRead (ShiftLeft (Add( varPortIndex, 2), 3), 0x18), Local1)
And (ShiftRight (Local1, 16), 0xff, varSubordinateBusLocal2) //Local2 Port Subordinate Bus number
And (ShiftRight (Local1, 8), 0xff, varSecondaryBusLocal1) //Local1 Port Secondary Bus number
if (LAnd (LGreaterEqual (varClientBus, Local1), LLessEqual(varClientBus, Local2))) {
break
}
}
Increment (varPortIndex)
}
if (LGreater (varPortIndex, varMaxPortIndexNumber)) {
Store ("PsppPerformanceRequest Exit", Debug)
return (Local7)
}
Store (Concatenate (" Performance request for port index : ", ToHexString (varPortIndex), Local6), Debug)
if (LEqual (DeRefOf (Index (varPsppClientIdArray, varPortIndex)), 0x0000)) {
Store (varClientId, Index (varPsppClientIdArray, varPortIndex))
} ElseIf (LNotEqual (DeRefOf (Index (varPsppClientIdArray, varPortIndex)), varClientId)) {
// We already have registered client
Store (" No action. [Unsupported request]", Debug)
Store ("PsppPerformanceRequest Exit", Debug)
return (Local7)
}
Store (0, Index (varLowVoltageRequest, varPortIndex))
if (LEqual (varRequestData, 0)) {
Store (0x0000, Index (varPsppClientIdArray, varPortIndex))
}
if (LEqual (varRequestData, 1)) {
Store (1, Index (varLowVoltageRequest, varPortIndex))
}
if (LEqual (varRequestData, 2)) {
Store (DEF_LINK_SPEED_GEN1, Index (varRequestedLinkSpeed, varPortIndex))
}
if (LEqual (varRequestData, 3)) {
Store (DEF_LINK_SPEED_GEN2, Index (varRequestedLinkSpeed, varPortIndex))
}
if (LEqual (And (varValidFlag, varFlag), 0x1)) {
Store (DerefOf (Index (varMaxLinkSpeed, varPortIndex)), Index (varRequestedLinkSpeed, varPortIndex))
}
Store (2, varReturnStatus)
Store ("PsppProcessPerformanceRequest Exit", Debug)
return (Local7)
}
/*----------------------------------------------------------------------------------------*/
/**
* PSPP Start/Stop Management Request
*
* Arg0 - Data Buffer
*/
Method (procChecPortAllocated, 1, Serialized) {
if (LEqual (DeRefOf (Index (varMaxLinkSpeed, Arg0)), 0)) {
return (DEF_PORT_NOT_ALLOCATED)
}
return (DEF_PORT_ALLOCATED)
}
/*----------------------------------------------------------------------------------------*/
/**
* PSPP Start/Stop Management Request
*
* Arg0 - Data Buffer
*/
Method (procPsppControl, 1, Serialized) {
Store ("PsppControl Enter", Debug)
Store (Buffer (256) {}, Local7)
Store (3, Index (Local7, 0x0)) // Return Buffer Length
Store (0, Index (Local7, 0x1)) // Return Buffer Length
Store (0, Index (Local7, 0x2)) // Return Status
Store (DerefOf (Index (Arg0, 0x2)), varPsppPolicyService)
Store (procIndirectRegisterRead (0x0, 0x60, 0xF4), varPsppScratchLocal0)
if (LEqual (varPsppPolicyService, DEF_PSPP_POLICY_START)) {
if (LEqual (And (varPsppScratchLocal0, 1), DEF_PSPP_POLICY_START)) {
// Policy already started
Store (" No action. [Policy already started]", Debug)
Store ("PsppControl Exit", Debug)
return (Local7)
}
Or (varPsppScratchLocal0, DEF_PSPP_POLICY_START, varPsppScratchLocal0)
}
if (LEqual (varPsppPolicyService, DEF_PSPP_POLICY_STOP)) {
if (LEqual (And (varPsppScratchLocal0, 1), DEF_PSPP_POLICY_STOP)) {
// Policy already stopped
Store (" No action. [Policy already stopped]", Debug)
Store ("PsppControl Exit", Debug)
return (Local7)
}
And (varPsppScratchLocal0, Not (DEF_PSPP_POLICY_START), varPsppScratchLocal0)
}
Or (varPsppScratchLocal0, Shiftleft (varPsppPolicy, DEF_SCARTCH_PSPP_POLICY_OFFSET), varPsppScratchLocal0)
procIndirectRegisterWrite (0x0, 0x60, 0xF4, varPsppScratchLocal0)
procCopyPackage (RefOf (varDefaultPsppClientIdArray), RefOf (varPsppClientIdArray))
// Reevaluate APM/PDM state here on S3 resume while staying on DC.
procApmPdmActivate(varPsppAcDcState)
// Set DPM state for PSPP Power Saving, due to this policy will not attend ApplyPsppState service.
if (LEqual (varPsppPolicy, DEF_PSPP_POLICY_POWERSAVING)) {
procNbLclkDpmActivate(DEF_LINK_SPEED_GEN1)
#ifdef ALTVDDNB_SUPPORT
procNbAltVddNb (DEF_LINK_SPEED_GEN1)
#endif
}
//Reevaluate PCIe speed for all devices base on PSPP state switch to boot up voltage
if (LAnd (LGreater (varPsppPolicy, DEF_PSPP_POLICY_PERFORMANCE), LLess (varPsppPolicy, DEF_PSPP_POLICY_POWERSAVING))) {
// Load default speed capability state
if (LEqual (varPsppPolicy, DEF_PSPP_POLICY_BALANCEHIGH)) {
procCopyPackage (RefOf (varMaxLinkSpeed), RefOf (varCurrentLinkSpeed))
Store (0, varPortIndex)
while (LLessEqual (varPortIndex, varMaxPortIndexNumber)) {
if (LNotEqual (DeRefOf (Index (varOverrideLinkSpeed, varPortIndex)), 0)) {
Store (DeRefOf (Index (varOverrideLinkSpeed, varPortIndex)), Index (varCurrentLinkSpeed, varPortIndex))
}
Increment (varPortIndex)
}
} else {
procCopyPackage (RefOf (varGen1LinkSpeedTemplate), RefOf (varCurrentLinkSpeed))
}
procApplyPsppState ()
}
Store ("PsppControl Exit", Debug)
return (Local7)
}
Name (varNewLinkSpeed, Package () {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00})
/*----------------------------------------------------------------------------------------*/
/**
* Evaluate PCIe speed on all links according to PSPP state and client requests
*
*
*
*/
Method (procApplyPsppState, 0, Serialized) {
Store ("ApplyPsppState Enter", Debug)
Store (0, varPortIndex)
procCopyPackage (RefOf (varGen1LinkSpeedTemplate), RefOf (varNewLinkSpeed))
while (LLessEqual (varPortIndex, varMaxPortIndexNumber)) {
if (LEqual (procChecPortAllocated(varPortIndex), DEF_PORT_ALLOCATED)) {
Store (procGetPortRequestedCapability (varPortIndex), Index (varNewLinkSpeed, varPortIndex))
}
Increment (varPortIndex)
}
if (LNotEqual(Match (varLowVoltageRequest, MEQ, 0x01, MTR, 0, 0), ONES)) {
procCopyPackage (RefOf (varGen1LinkSpeedTemplate), RefOf (varNewLinkSpeed))
}
if (LNotEqual(Match (varNewLinkSpeed, MEQ, DEF_LINK_SPEED_GEN2, MTR, 0, 0), ONES)) {
// Set GEN2 voltage
Store ("Set GEN2 VID", Debug)
#ifdef ALTVDDNB_SUPPORT
procNbAltVddNb (DEF_LINK_SPEED_GEN2)
#endif
procPcieSetVoltage (varGen2Vid, 1)
// procPcieAdjustPll (DEF_LINK_SPEED_GEN2)
procNbLclkDpmActivate(DEF_LINK_SPEED_GEN2)
}
Store (0, varPortIndex)
while (LLessEqual (varPortIndex, varMaxPortIndexNumber)) {
if (LEqual (procChecPortAllocated(varPortIndex), DEF_PORT_NOT_ALLOCATED)) {
Increment (varPortIndex)
continue
}
Store (DerefOf (Index (varCurrentLinkSpeed, varPortIndex)), varCurrentLinkSpeedLocal0)
Store (DerefOf (Index (varNewLinkSpeed, varPortIndex)), varNewLinkSpeedLocal2)
if (LEqual (varCurrentLinkSpeedLocal0, varNewLinkSpeedLocal2)) {
Increment (varPortIndex)
continue
}
Store (varNewLinkSpeedLocal2, Index (varCurrentLinkSpeed, varPortIndex))
procSetPortCapabilityAndSpeed (varPortIndex, varNewLinkSpeedLocal2)
Increment (varPortIndex)
}
if (LEqual(Match (varNewLinkSpeed, MEQ, DEF_LINK_SPEED_GEN2, MTR, 0, 0), ONES)) {
// Set GEN1 voltage
Store ("Set GEN1 VID", Debug)
procNbLclkDpmActivate(DEF_LINK_SPEED_GEN1)
// procPcieAdjustPll (DEF_LINK_SPEED_GEN1)
procPcieSetVoltage (varGen1Vid, 0)
#ifdef ALTVDDNB_SUPPORT
procNbAltVddNb (DEF_LINK_SPEED_GEN1)
#endif
}
#ifdef PHY_SPEED_REPORT_SUPPORT
procReportPhySpeedCap ()
#endif
Store ("ApplyPsppState Exit", Debug)
}
/*----------------------------------------------------------------------------------------*/
/**
* Read PCI config register
*
* Arg0 - Port Index
*
*/
Method (procGetPortRequestedCapability, 1) {
Store (DEF_LINK_SPEED_GEN2, Local0)
if (LEqual (DerefOf (Index (varPsppClientIdArray, Arg0)), 0x0000)) {
if (LOr (LEqual (procPsppGetAcDcState(), DEF_PSPP_STATE_DC), LEqual (varPsppPolicy, DEF_PSPP_POLICY_BALANCELOW))) {
// Default policy cap to GEN1
Store (DEF_LINK_SPEED_GEN1, Local0)
}
if (LNotEqual (DerefOf (Index (varOverrideLinkSpeed, Arg0)), 0)) {
Store (DerefOf (Index (varOverrideLinkSpeed, Arg0)), Local0)
}
} else {
Store (DerefOf (Index (varRequestedLinkSpeed, Arg0)), Local0)
}
return (Local0)
}
/*----------------------------------------------------------------------------------------*/
/**
* Set capability and speed
*
* Arg0 - Port Index
* Arg1 - Link speed
*/
Method (procSetPortCapabilityAndSpeed, 2, NotSerialized) {
Store ("SetPortCapabilityAndSpeed Enter", Debug)
Store (Concatenate (" Port Index : ", ToHexString (Arg0), varStringBuffer), Debug)
Store (Concatenate (" Speed : ", ToHexString (Arg1), varStringBuffer), Debug)
//UnHide UMI port
if (LEqual (Arg0, 6)) {
procIndirectRegisterRMW (0x0, 0x60, 0x80, Not (0x40), 0x40);
}
procPcieSetLinkSpeed (Arg0, Arg1)
// Programming for LcInitSpdChgWithCsrEn
if (LNotEqual (DeRefOf (Index (varPsppClientIdArray, Arg0)), 0x0000)) {
// Registered port, LcInitSpdChgWithCsrEn = 0.
procPciePortIndirectRegisterRMW (Arg0, 0xA1, Not (0x00001000), 0x0)
} else {
procPciePortIndirectRegisterRMW (Arg0, 0xA1, Not (0x00001000), 0x00001000)
}
// Determine port PCI address and check port present
Store (ShiftLeft (Add( Arg0, 2), 3), varPortBdfLocal1)
And (procPciDwordRead (varPortBdfLocal1, 0x70), 0x400000, varPortPresentLocal3)
if (LNotEqual (varPortPresentLocal3, 0)) {
procDisableAndSaveAspm (Arg0)
Store (1, Local2)
while (Local2) {
//retrain port
procPciDwordRMW (varPortBdfLocal1, 0x68, Not (0x00000000), 0x20)
Sleep (30)
while (And (procPciDwordRead (varPortBdfLocal1, 0x68), 0x08000000)) {
Sleep (10)
}
Store (0, Local2)
if (LEqual (Arg1, DEF_LINK_SPEED_GEN1)) {
Store (procPciePortIndirectRegisterRead (Arg0, 0xA4), varLcCurrentDataRateLocal4)
if (LNotEqual (And (varLcCurrentDataRateLocal4, 0x800), 0)) {
Store (1, Local2)
}
}
}
procRestoreAspm (Arg0)
} else {
Store (" Device not present. Set capability and speed only", Debug)
}
//Hide UMI port
if (LEqual (Arg0, 6)) {
procIndirectRegisterRMW (0x0, 0x60, 0x80, Not (0x40), 0x00);
}
Store ("SetPortCapabilityAndSpeed Exit", Debug)
}
Name (varPcieLinkControlArray, Package () {0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0})
Name (varPcieLinkControlOffset, 0)
Name (varPcieLinkControlData, 0)
/*----------------------------------------------------------------------------------------*/
/**
* Disable and save ASPM state
*
* Arg0 - Port Index
*/
Method (procDisableAndSaveAspm, 1, Serialized) {
Store (0, varPcieLinkControlOffset)
Store (0, varPcieLinkControlData)
Store (ShiftLeft (Add( Arg0, 2), 3), varPortBdfLocal1)
if (LEqual (Arg0, 6)) {
Store (" Disable SB ASPM", Debug)
Store (procPcieSbAspmControl (0, 0), Index (varPcieLinkControlArray, 0))
Store (Concatenate (" PcieLinkControl Data : ", ToHexString (DerefOf(Index (varPcieLinkControlArray, 0))), varStringBuffer), Debug)
procPcieSbAspmControl (0, 1)
return (0)
}
Store (procPciDwordRead (varPortBdfLocal1, 0x18), varTempLocal3)
Store (And (ShiftRight (varTempLocal3, 8), 0xFF), varTempLocal3)
Store (Concatenate (" Disable EP ASPM on Secondary Bus : ", ToHexString (varTempLocal3), varStringBuffer), Debug)
Store (ShiftLeft (varTempLocal3, 8), varEndpointBdfLocal2)
Store (procPciDwordRead (varEndpointBdfLocal2, 0xC), varTempLocal3)
Store (And (ShiftRight (varTempLocal3, 16), 0xFF), varTempLocal3)
Store (Concatenate (" EP Header type : ", ToHexString (varTempLocal3), varStringBuffer), Debug)
if (LNotEqual (And (varTempLocal3, 0x80), 0)) {
Store (0x7, varMaxFunctionLocal0)
} else {
Store (0x0, varMaxFunctionLocal0)
}
Store (0, varFunctionLocal4)
while (LLessEqual (varFunctionLocal4, varMaxFunctionLocal0)) {
//Find PcieLinkControl register offset = PcieCapPtr + 0x10
Store (procFindPciCapability (Add (varEndpointBdfLocal2, varFunctionLocal4), 0x10), varPcieLinkControlOffset)
if (LEqual (varPcieLinkControlOffset, 0)) {
Increment (varFunctionLocal4)
continue
}
Add (varPcieLinkControlOffset, 0x10, varPcieLinkControlOffset)
Store (Concatenate (" Function number of Secondary Bus : ", ToHexString (varFunctionLocal4), varStringBuffer), Debug)
Store (Concatenate (" PcieLinkControl register offset : ", ToHexString (varPcieLinkControlOffset), varStringBuffer), Debug)
// Save ASPM on EP
Store (procPciDwordRead (Add (varEndpointBdfLocal2, varFunctionLocal4) , varPcieLinkControlOffset), varPcieLinkControlData)
Store (And (varPcieLinkControlData, 0x3), Index (varPcieLinkControlArray, varFunctionLocal4))
Store (Concatenate (" PcieLinkControl Data : ", ToHexString (varPcieLinkControlData), varStringBuffer), Debug)
procPciDwordRMW (Add (varEndpointBdfLocal2, varFunctionLocal4), varPcieLinkControlOffset, Not (0x00000003), 0x00)
Store ("Disable ASPM on EP Complete!!", Debug)
Increment (varFunctionLocal4)
}
}
/*----------------------------------------------------------------------------------------*/
/**
* Restore ASPM
*
* Arg0 - Port Index
*/
Method (procRestoreAspm, 1, Serialized) {
Store (0, varPcieLinkControlOffset)
Store (0, varPcieLinkControlData)
// Restore SB ASPM
if (LEqual (Arg0, 6)) {
Store (" Restore SB ASPM", Debug)
Store (Concatenate (" PcieLinkControl Data : ", ToHexString (DerefOf(Index (varPcieLinkControlArray, 0))), varStringBuffer), Debug)
procPcieSbAspmControl (DerefOf(Index (varPcieLinkControlArray, 0)), 1)
return (0)
}
Store (ShiftLeft (Add( Arg0, 2), 3), varPortBdfLocal1)
// Restore EP ASPM
Store (procPciDwordRead (varPortBdfLocal1, 0x18), varTempLocal3)
Store (And (ShiftRight (varTempLocal3, 8), 0xFF), varTempLocal3)
Store (Concatenate (" Disable EP ASPM on SecondaryBus : ", ToHexString (varTempLocal3), varStringBuffer), Debug)
Store (ShiftLeft (varTempLocal3, 8), varEndpointBdfLocal2)
Store (procPciDwordRead (varEndpointBdfLocal2, 0xC), varTempLocal3)
Store (And (ShiftRight (varTempLocal3, 16), 0xFF), varTempLocal3)
Store (Concatenate (" EP Header type : ", ToHexString (varTempLocal3), varStringBuffer), Debug)
if (LNotEqual (And (varTempLocal3, 0x80), 0)) {
Store (0x7, varMaxFunctionLocal0)
} else {
Store (0x0, varMaxFunctionLocal0)
}
Store (0, varFunctionLocal4)
while (LLessEqual (varFunctionLocal4, varMaxFunctionLocal0)) {
//Find PcieLinkControl register offset = PcieCapPtr + 0x10
Store (procFindPciCapability (Add (varEndpointBdfLocal2, varFunctionLocal4), 0x10), varPcieLinkControlOffset)
if (LEqual (varPcieLinkControlOffset, 0)) {
Increment (varFunctionLocal4)
continue
}
Add (varPcieLinkControlOffset, 0x10, varPcieLinkControlOffset)
Store (Concatenate (" Restore Function number of SecondaryBus : ", ToHexString (varFunctionLocal4), varStringBuffer), Debug)
Store (Concatenate (" Restore PcieLinkControl register offset : ", ToHexString (varPcieLinkControlOffset), varStringBuffer), Debug)
Store (Concatenate (" PcieLinkControl Data : ", ToHexString (DerefOf (Index (varPcieLinkControlArray, varFunctionLocal4))), varStringBuffer), Debug)
procPciDwordWrite (Add (varEndpointBdfLocal2, varFunctionLocal4), varPcieLinkControlOffset, DerefOf (Index (varPcieLinkControlArray, varFunctionLocal4)))
Increment (varFunctionLocal4)
}
}
/*----------------------------------------------------------------------------------------*/
/**
* Request VID
*
* Arg0 - Port Index
* Arg1 - PCIe speed
*/
Method (procPcieSetLinkSpeed, 2) {
Store (ShiftLeft (Add( Arg0, 2), 3), Local0)
if (LEqual (Arg1, DEF_LINK_SPEED_GEN1)) {
procPciDwordRMW (Local0, 0x88, Not (0x0000002f), 0x21)
procPciePortIndirectRegisterRMW (Arg0, 0xA4, Not (0x20000001), 0x0)
} else {
procPciePortIndirectRegisterRMW (Arg0, 0xA4, Not (0x20000001), 0x20000001)
procPciDwordRMW (Local0, 0x88, Not (0x0000002f), 0x2)
}
}
/*----------------------------------------------------------------------------------------*/
/**
* Read PCIe port indirect register
*
* Arg0 - Ref Source Pckage
* Arg1 - Ref to Destination Package
*
*/
Method (procCopyPackage, 2, NotSerialized) {
Store (SizeOf (Arg0), Local1)
Store (0, Local0)
While (LLess (Local0, Local1)) {
Store (DerefOf(Index(DerefOf (Arg0), Local0)), Index(DerefOf (Arg1), Local0))
Increment (Local0)
}
}
/*----------------------------------------------------------------------------------------*/
/**
* Read PCIe port indirect register
*
* Arg0 - Ref Source Pckage
* Arg1 - Ref to Destination Package
*
*/
Method (procPsppGetAcDcState, 0 , NotSerialized) {
Return (And (varPsppAcDcState, varPsppAcDcOverride))
}