alder_lake_bios/Intel/AlderLake/AlderLakeChipsetPkg/HybridGraphicsAcpi/N17/NvidiaUltOptimus/NvGps.asl

271 lines
11 KiB
Plaintext

/** @file
;******************************************************************************
;* Copyright (c) 2019, Insyde Software Corp. All Rights Reserved.
;*
;* You may not reproduce, distribute, publish, display, perform, modify, adapt,
;* transmit, broadcast, present, recite, release, license or otherwise exploit
;* any part of this publication in any form, by any means, without the prior
;* written permission of Insyde Software Corporation.
;*
;******************************************************************************
*/
/*
== Readme ==
For GPS support, SBIOS has to adjust below code to meet platform:
- \_ SB.PCI0.LPCB.EC.GPUP -> EC flag to release GPIO 12
Based on debug experience, if you want Function-42 of NV-GPS to support "Adjust GPU temperature dynamically", please refer following step:
- Set NLIM as 1 to let Power Steering call GPS_FUNC_PSHAREPARAMS (Func#42).
- Support sub-func#33,34,35.
- When GPUT is set as 1, store self-defined GPU temperature to TGPU in Query Type 2 of Func#42.
*/
Scope (DGPU_SCOPE)
{
Name (NLIM, Zero) // System parameter limit update
// 0: No new limits
// 1: System requesting new limits (GPU Boost will call GPS_FUNC_PSHAREPARAMS)
Name (PSAP, 0)
Name (SPSL, Zero) // Power supply limit support
// 0: Basic AC/battery mode control only (default)
// 1: System uses both a GPIO and ACPI notification codes to set multiple GPU power limits (to support handling power supply overdraw events)
Name (TGPM, Zero) // OEM_customize // Current GPU user opt-in configurable TGP mode status
// 0: GPU user opt-in configurable TGP mode disabled
// 1: GPU user opt-in configurable TGP mode enabled
Name (VPSC, One) // Sample flag for GPS_FUNC_PCONTROL, IBV_customize/OEM_customize can change the mechanism per design
Method (GPS, 4, Serialized)
{
// Only Interface Revision 0x0100 is supported
If (LNotEqual (Arg1, 0x100))
{
Return (STATUS_ERROR_UNSUPPORTED)
}
// (Arg2) Sub-Function
Switch (ToInteger (Arg2))
{
//
// Function 0: GPS_FUNC_SUPPORT - Bit list of supported functions.
//
Case (GPS_FUNC_SUPPORT)
{
// Sub-Functions 0, 19, 32, 33, 34, 35, 42 support
Return (Buffer(0x08) {0x01, 0x00, 0x08, 0x00, 0x0F, 0x04, 0x00, 0x00})
}
//
// Function 19: Get system callbacks.
//
Case (GPS_FUNC_GETCALLBACKS)
{
CreateByteField (Arg3, Zero, TEMP)
If (LEqual (TEMP, Zero)) // First call , SBIOS need to set which event had callback.
{
Return (0x4)
}
And (TEMP, 0x0F, TEMP) // Just mask bit 0-3.
If (LEqual (TEMP, 0x04)) // Bit 2 just for power state transition.
{
// Store (0x2, \_ SB.PCI0.LPCB.EC.GPUP) // IBV_customize: This is EC flag, need to release GPIO 12.
Return (Arg3)
}
}
//
// Function 28: GPU power control.
//
// Case (GPS_FUNC_PCONTROL)
// {
// CreateField (Arg3, Zero, 0x04, RTFS)
// CreateField (Arg3, 0x08, 0x08, VPS0)
// CreateField (Arg3, 0x18, 0x08, VPS1)
// If (LEqual (ToInteger (RTFS), Zero)) // Responding to SBIOS event (GPS_NOTIFY_PCONTROL)
// {
// Store (0x02, Local0) // Request type=2; SBIOS request to set new vP-state
// If (LEqual (VPSC, Zero)) // IBV_customize/OEM_customize, customer can change the mechanism per design
// {
// Or (0x0600, Local0, Local0) // example to set max vP-state=6
// }
// Else
// {
// Or (Zero, Local0, Local0) // example to set max vP-state=0
// }
// Return (Local0)
// }
// Else
// {
// If (LEqual (ToInteger (RTFS), 0x02)) // Responding to SBIOS request to set new vP-state
// {
// Return (Zero) // After new vP-state set, driver will callback here
// }
// }
// }
//
// Function 32: GPS_FUNC_PSHARESTATUS - Get system requested Power Steering settings.
//
Case (GPS_FUNC_PSHARESTATUS)
{
CreateBitField (Arg3, 24, NRIT) // New Requested IGP turbo state (vaild if bits 25 is set)
CreateBitField (Arg3, 25, NRIS) // Request new IGP turbo state (bit 24 is valid)
CreateField (Arg3, 26, 3, PSTS) // Power Steering status (vaild if bits 29 is set)
CreateBitField (Arg3, 29, NPSS) // Notify Power Steering status (bits 28:26 vaild)
CreateBitField (Arg3, 30, PSES) // Power Steering enable status
Name (GB32, Buffer(4) {0x00})
CreateBitField (GB32, 0, SPLU) // system parameter limit update
CreateBitField (GB32, 1, PSLS) // Power supply limit support
CreateBitField (GB32, 22, CTGP) // GPU user opt-in configurable TGP mode enabled.
CreateBitField (GB32, 23, RT23)
CreateBitField (GB32, 24, CITS) // Current IGP turbo state
CreateBitField (GB32, 30, PSER) // Power Steering enable request
//
// Request new IGP turbo state
//
If (NRIS)
{
If (NRIT)
{
Store (1, CITS)
}
else
{
Store (0, CITS) // disable IGP turbo boost
}
}
//
// Workaround: Always return IGP turbo boost enabled,
// it because can't enable/disable or get IGP turbo boost state.
//
// Store (1, CITS)
Store (1, PSER) // if this machine support GPS
If (NLIM)
{
//
// system requesting new limits (Power Steering will call GPS_FUNC_PSHAREPARAMS)
//
Store (1, SPLU)
}
IF (LEqual (\_SB.HWPV, 0x2))
{
Store (1, RT23)
}
If (SPSL)
{
Store (1, PSLS) // System uses both a GPIO and ACPI notification codes to set multiple GPU power limit.
}
If (TGPM)
{
Store (1, CTGP) // GPU user opt-in configurable TGP mode enabled.
}
Return (GB32)
}
//
// Function 33: GPS_FUNC_GETPSS - Get _PPS object.
//
Case (GPS_FUNC_GETPSS)
{
Return (CPU0_SCOPE._PSS)
}
//
// Function 34: GPS_FUNC_SETPPC - Set _PPC object.
//
Case (GPS_FUNC_SETPPC)
{
CreateDwordField (Arg3, 0, PCAP) // New GPS _PPC limit
Store (PCAP, \_SB.CPPC)
PNOT ()
Store (PCAP, PSAP)
Return (PCAP)
}
//
// Function 35: GPS_FUNC_GETPPC - Get _PPC object.
//
Case (GPS_FUNC_GETPPC)
{
Return (PSAP) // Current GPS _PPC limit
}
//
// Function 42: GPS_FUNC_PSHAREPARAMS - Get sensor information and capabilities.
//
Case (GPS_FUNC_PSHAREPARAMS)
{
CreateByteField (Arg3, 0, PSH0)
CreateByteField (Arg3, 1, PSH1)
CreateBitField (Arg3, 8, GPUT)
CreateBitField (Arg3, 9, CPUT)
CreateBitField (Arg3, 10, FANS)
CreateBitField (Arg3, 11, SKIN)
CreateBitField (Arg3, 12, ENGR)
CreateBitField (Arg3, 13, SEN1)
CreateBitField (Arg3, 14, SEN2)
Name (GPSP, Buffer(0x24) {})
CreateDWordField (GPSP, 0, RETN)
CreateDWordField (GPSP, 4, VRV1)
CreateDWordField (GPSP, 8, TGPU)
CreateDWordField (GPSP, 12, PDTS)
CreateDWordField (GPSP, 16, SFAN)
CreateDWordField (GPSP, 20, SKNT)
CreateDWordField (GPSP, 24, CPUE)
CreateDWordField (GPSP, 28, TMP1)
CreateDWordField (GPSP, 32, TMP2)
Store (0x00010000, VRV1)
Switch (ToInteger (PSH0))
{
Case (0) // Query Type 0: Get current status
{
If (CPUT)
{
Store (0x00000200, RETN)
Or (RETN, ToInteger (PSH0), RETN)
Store (\_TZ.TZ01._TMP, PDTS) // IBV_customize/OEM_customize: Please return CPU or EC tempture to PDTS
}
Return (GPSP)
}
Case (1) // Query Type 1: Get supported fields
{
// if GPU temperature is set by SBIOS, then store 0x300 to RETN
Store (0x00000300, RETN)
Or (RETN, ToInteger (PSH0), RETN)
Store (1000, PDTS) // minimum supported sample interval: 1000ms
Return (GPSP)
}
Case (2) // Query Type 2: Get Current opreting limits
{
Store (0x102, RETN) // bit 0-3 need the same input value and set bit 8 for GPU temp
Store (0x0000005C, TGPU)
Store (0x00000000, PDTS)
Store (0x00000000, SFAN)
Store (0x00000000, CPUE)
Store (0x00000000, SKNT)
Store (0x00000000, TMP1)
Store (0x00000000, TMP2)
//
// If Return bit is cleared, the system doesn't wish to control this parameter currently,
// Power Steering will use its default behavior for this parameter
//
Return(GPSP)
}
}
}
default
{
//
// FunctionCode or SubFunctionCode not supported
//
Return (STATUS_ERROR_UNSUPPORTED)
}
}
Return (STATUS_ERROR_UNSUPPORTED)
}
}