832 lines
30 KiB
Plaintext
832 lines
30 KiB
Plaintext
//
|
|
// FILENAME.
|
|
// Atm.asi - Describes Advanced Thermal Management function.
|
|
//
|
|
//
|
|
//
|
|
//
|
|
// FUNCTIONAL DESCRIPTION.
|
|
// This file describes Advanced Thermal Management function related code.
|
|
// This file also has Intelligent Cooling support function code (DYTC) and
|
|
// ITS (Intelligent Thermal Solution) vertual device node definition.
|
|
//
|
|
//
|
|
// MODIFICATION HISTORY.
|
|
// H. Uchida 10/04/12. #1.000, initial version.
|
|
// N. Araki 10/10/05. #1.000, preparation for scramble mode and Turbo disable.
|
|
// N. Araki 10/11/26. #1.000, enable scramble mode
|
|
// N. Araki 10/12/14. #1.000, enable extended tau.
|
|
// N. Araki 11/01/04. #1.000, add not-turbo CPU support.
|
|
// N. Araki 11/01/19. #1.000, add an interface for extended tau.
|
|
// H. Uchida 11/08/25. #1.000, removed interface for "reduce fan noise" feature.
|
|
// N. Araki 11/12/13. #1.000, initial code for DPTF cTDP support.
|
|
// N. Araki 12/01/27. #1.000, added cTDP down support.
|
|
// N. Araki 12/01/27. #1.000, Updated cTDP down support.
|
|
// N. Araki 12/03/02. #1.000, Support IVB ULV CPU.
|
|
// N. Araki 13/03/18. #1.000, Support ULV CPU.
|
|
// N. Araki 13/08/05. #1.000, Update P-State limit method for CPPC.
|
|
// N. Araki 13/10/03. #1.000, Change PPM flag usage.
|
|
// N. Araki 13/10/22. #1.000, Remove unused code.
|
|
// N. Araki 13/10/31. #1.000, Remove unused code.
|
|
// N. Araki 13/11/14. #1.000, Change variable name.
|
|
// M. Itoh 14/02/05. #1.000, Added DYTC support //@DYTC001
|
|
// N. Ishida 15/03/24. #1.000, Added Intelligent Cooling NVIDIA support in DYTC.
|
|
// N. Ishida 15/09/17. #1.000, Added W/A to supress power consumption in DYTC.
|
|
// N. Ishida 15/09/24. #1.000, Added W/A to supress Notify() to NVIDIA driver in DYTC until the driver becomes ready.
|
|
// M. Itoh 15/11/16. #1.000, Update PL1 value of STD&DMC for PL1 15W->25.
|
|
// M. Itoh 15/11/16. #1.000, PT1S code cleanup.
|
|
// M. Itoh 15/11/16. #1.000, Use _PR.CLVL to check supporting cTDP levels instead of _SB.PCI0.CTNL.
|
|
// Y. Katayama 16/04/07. #1.000, Replace OPTION_LENOVO_SUPPORT_IVB_ULV with OPTION_LENOVO_SUPPORT_CTDP.
|
|
// M. Itoh 16/12/21. #1.000, Add DCPL for DC mode PL1 handling.
|
|
// Y. Katayama 17/01/27. #1.000, Replace the rest of OPTION_LENOVO_SUPPORT_IVB_ULV with OPTION_LENOVO_SUPPORT_CTDP.
|
|
// M. Itoh 17/08/01. #1.000, Add ITSD (Intelligent Thermal Solution) vertual device.
|
|
// Ru.Xu 19/01/31 #1.000, Added DYTC support for LNB on Intel Platform
|
|
// Ru Xu 20/05/06 #1.000, DYTC (Dynamic Thermal Control) Method Rev5 for Intelligent Cooling
|
|
// NOTICE.
|
|
// Lenovo Confidential
|
|
// Microcode Source Materials
|
|
// COPYRIGHT LENOVO 2010-2011 All RIGHTS RESERVED
|
|
//
|
|
|
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
// //
|
|
// //
|
|
// ATM - Advanced Thermal Management functions //
|
|
// //
|
|
// //
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
|
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
// //
|
|
// //
|
|
// DYTC - External Method (IdeaPad Intelligent Thermal control) //
|
|
// //
|
|
// //
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
|
|
#include <Lfc.h>
|
|
|
|
/////////////////// Input Parameter Definition ///////////////////
|
|
|
|
//////// For DYTC_CMD_QUERY ////////
|
|
// DYTC Supprot
|
|
#define DYTC_SPT_SHFT 0x00000008 // Bit8
|
|
|
|
#define DYTC_SPT_DIS 0x00000000
|
|
#define DYTC_SPT_ENA 0x00000001
|
|
|
|
// DYTC Revision
|
|
#define DYTC_SUBREV_SHFT 0x00000010 // Bit16-27
|
|
#define DYTC_REV_SHFT 0x0000001C // Bit28-31
|
|
|
|
#define DYTC_REV_3 0x00000003
|
|
#define DYTC_REV_4 0x00000004
|
|
#define DYTC_REV_5 0x00000005
|
|
|
|
#define DYTC_SUBREV_0 0x00000000
|
|
#define DYTC_SUBREV_1 0x00000001
|
|
#define DYTC_SUBREV_2 0x00000002
|
|
|
|
//////// For DYTC_CMD_QUERY_CNT ////////
|
|
// Thermal Control Version
|
|
#define DYTC_TCV_SHFT 0x00000010 // Bit16-31
|
|
#define DYTC_TCV_CLAMSHELL 0x00001001 // version1 & Clamshell
|
|
#define DYTC_TCV_TABLET 0x00002001 // version1 & Tablet
|
|
#define OPTION_DYTC_CLAMSHELL 1
|
|
|
|
// Command Definition
|
|
#define DYTC_CMD_MASK 0x000001FF // Bit0-8
|
|
|
|
#define DYTC_CMD_QUERY 0x00000000
|
|
#define DYTC_CMD_SET 0x00000001
|
|
#define DYTC_CMD_GET 0x00000002
|
|
#define DYTC_CMD_FUNC_CAP 0x00000003
|
|
#define DYTC_CMD_MODE_MYH_CAP 0x00000004
|
|
#define DYTC_CMD_MODE_MMC_CAP 0x00000006
|
|
#define DYTC_CMD_MODE_MMC_GET 0x00000007
|
|
#define DYTC_CMD_MODE_AAA_GET 0x00000008
|
|
#define DYTC_CMD_MODE_NIT_GET 0x00000009
|
|
#define DYTC_CMD_FUNC_CAP_EXT 0x0000000A
|
|
#define DYTC_CMD_QUERY_CNT 0x00000100
|
|
#define DYTC_CMD_RESET 0x000001FF
|
|
|
|
//////// For DYTC_CMD_SET/DYTC_CMD_GET ////////
|
|
// IC Function
|
|
#define DYTC_ICFUNC_SHFT 0x0000000C // Bit12-15
|
|
#define DYTC_ICFUNC_MASK 0x0000000F
|
|
|
|
// IC Mode
|
|
#define DYTC_ICMODE_SHFT 0x00000010 // Bit16-19
|
|
#define DYTC_ICMODE_MASK 0x0000000F
|
|
|
|
// Valid Flag
|
|
#define DYTC_VLDFLG_SHFT 0x00000014 // Bit20
|
|
#define DYTC_VLDFLG_MASK 0x00000001
|
|
|
|
// Current Function/Mode
|
|
#define DYTC_CRNTFUNC_SHFT 0x00000008 // Bit8
|
|
#define DYTC_CRNTMODE_SHFT 0x0000000C // Bit12
|
|
|
|
// Current Function/Mode
|
|
#define DYTC_FLAGCAP_SHFT 0x00000010 // Bit16
|
|
|
|
//////// For DYTC_CMD_FUNC_CAP ////////
|
|
// Function/Mode Capability
|
|
#define DYTC_FCAP_SHFT 0x00000010 // Bit16
|
|
#define DYTC_MCAP_SHFT 0x00000010 // Bit16
|
|
|
|
//////// For DYTC_CMD_MODE_NIT_GET ////////
|
|
#define DYTC_MNIT_SHFT 0x00000010 // Bit16
|
|
//LCFCTODO:Brightness will change to 60nit when user choose BSM mode,due to different panels, this value need tune by BIOS
|
|
#define DYTC_NITS_60 0x00000043 // 60 nits , 0x43(67%) means Windows display brightness value
|
|
|
|
//////// For DYTC_CMD_FUNC_CAP_EXT////////
|
|
#define DYTC_CAPE_SHFT 0x00000010 // Bit16
|
|
#define DYTC_CRETOR_APP_SUPPORT 0x1 // 1 mean Creator App supported
|
|
|
|
/////////////////// Output Parameter Definition //////////////////
|
|
|
|
// Status Definition
|
|
#define DYTC_STS_SUCCESS 0x00000001
|
|
#define DYTC_STS_FAIL 0x00000000
|
|
|
|
// Error Code Definition
|
|
#define DYTC_ERR_SHFT 0x00000001 // Bit1-3
|
|
|
|
#define DYTC_ERR_INVALID_FUNC 0x00000001 // Unsupported or Undefined IC Function
|
|
#define DYTC_ERR_INVALID_CMD 0x00000002
|
|
#define DYTC_ERR_NOT_READY 0x00000003
|
|
#define DYTC_ERR_UNSUPPORTED 0x00000004
|
|
#define DYTC_ERR_INVALID_MODE 0x00000005
|
|
#define DYTC_ERR_RSV2 0x00000006
|
|
#define DYTC_ERR_RSV3 0x00000007
|
|
|
|
|
|
#if ( OPTION_DYTC_ENABLE )
|
|
|
|
Method( DYTC , 1) {
|
|
|
|
Store( Arg0, Local0 ) // Save Input Parameter
|
|
Store( Local0, DYTP ) // DYTC commond parameter,for debug
|
|
Store( 0, Local1 ) // Initialize Output Parameter
|
|
|
|
|
|
// DYTC Command
|
|
Switch ( ToInteger( And( Local0, DYTC_CMD_MASK ) ) ) {
|
|
|
|
Case ( DYTC_CMD_QUERY ) {
|
|
#if ( OPTION_DYTC_ENABLE )
|
|
Store( ShiftLeft( DYTC_SPT_ENA, DYTC_SPT_SHFT ), Local1 )
|
|
#else // ( OPTION_DYTC_ENABLE )
|
|
Store( ShiftLeft( DYTC_SPT_DIS, DYTC_SPT_SHFT ), Local1 )
|
|
#endif // ( OPTION_DYTC_ENABLE )
|
|
Or( Local1, ShiftLeft( DYTC_REV_5, DYTC_REV_SHFT ), Local1 )
|
|
|
|
Or( Local1, ShiftLeft( DYTC_SUBREV_0, DYTC_SUBREV_SHFT ), Local1 )
|
|
|
|
// Success
|
|
Or( Local1, DYTC_STS_SUCCESS, Local1 )
|
|
}
|
|
|
|
Case ( DYTC_CMD_SET ) {
|
|
|
|
And( ShiftRight( Local0, DYTC_ICFUNC_SHFT ), DYTC_ICFUNC_MASK , Local2 ) // IC Function
|
|
And( ShiftRight( Local0, DYTC_ICMODE_SHFT ), DYTC_ICMODE_MASK , Local3 ) // IC Mode
|
|
And( ShiftRight( Local0, DYTC_VLDFLG_SHFT ), DYTC_VLDFLG_MASK , Local4 ) // Valid Flag
|
|
|
|
// Requested Intelligent Cooling Function
|
|
Switch ( Local2 ) {
|
|
#if ( OPTION_DYTC_SUPPORT_ICFUNC_FBC )
|
|
Case ( DYTC_ICFUNC_FBC ) {
|
|
|
|
// Expect IC mode = No mode
|
|
If( LNotEqual( Local3, DYTC_ICMODE_MASK )) {
|
|
// Fail
|
|
ShiftLeft( DYTC_ERR_INVALID_MODE, DYTC_ERR_SHFT, Local1 )
|
|
Return ( Local1 )
|
|
}
|
|
|
|
// Off Request
|
|
If( LEqual( Local4, 0 ) ) {
|
|
Store( 0, \VFBC )
|
|
} Else {
|
|
Store( 1, \VFBC )
|
|
}
|
|
}
|
|
#endif // ( OPTION_DYTC_SUPPORT_ICFUNC_FBC )
|
|
|
|
|
|
#if ( OPTION_DYTC_SUPPORT_ICFUNC_MYH )
|
|
Case ( DYTC_ICFUNC_MYH ) {
|
|
|
|
Switch ( Local3 ) {
|
|
|
|
#if ( OPTION_DYTC_SUPPORT_ICMODE_TBL )
|
|
Case ( DYTC_ICMODE_TBL ) {
|
|
|
|
If( LNotEqual( Local4, 1)) {
|
|
// Fail
|
|
ShiftLeft( DYTC_ERR_INVALID_MODE, DYTC_ERR_SHFT, Local1 )
|
|
Return ( Local1 )
|
|
}
|
|
}
|
|
#endif // ( OPTION_DYTC_SUPPORT_ICMODE_TBL )
|
|
|
|
#if ( OPTION_DYTC_SUPPORT_ICMODE_TNT )
|
|
Case ( DYTC_ICMODE_TNT ) {
|
|
|
|
If( LNotEqual( Local4, 1)) {
|
|
// Fail
|
|
ShiftLeft( DYTC_ERR_INVALID_MODE, DYTC_ERR_SHFT, Local1 )
|
|
Return ( Local1 )
|
|
}
|
|
}
|
|
#endif // ( OPTION_DYTC_SUPPORT_ICMODE_TNT )
|
|
|
|
#if ( OPTION_DYTC_SUPPORT_ICMODE_LFT )
|
|
Case ( DYTC_ICMODE_LFT ) {
|
|
|
|
If( LNotEqual( Local4, 1)) {
|
|
// Fail
|
|
ShiftLeft( DYTC_ERR_INVALID_MODE, DYTC_ERR_SHFT, Local1 )
|
|
Return ( Local1 )
|
|
}
|
|
}
|
|
#endif // ( OPTION_DYTC_SUPPORT_ICMODE_LFT )
|
|
|
|
Case ( DYTC_ICMODE_MASK ) {
|
|
If( LNotEqual( Local4, 0)) {
|
|
// Fail
|
|
ShiftLeft( DYTC_ERR_INVALID_MODE, DYTC_ERR_SHFT, Local1 )
|
|
Return ( Local1 )
|
|
}
|
|
}
|
|
|
|
Default { // Unsupported or Undefined IC Function
|
|
// Fail
|
|
ShiftLeft( DYTC_ERR_INVALID_MODE, DYTC_ERR_SHFT, Local1 )
|
|
Return ( Local1 )
|
|
}
|
|
}
|
|
|
|
// Off Request
|
|
If( LEqual( Local4, 0 ) ) {
|
|
Store( 0, \VMYH )
|
|
Store( 0, \SMYH )
|
|
} Else {
|
|
Store( 1, \VMYH )
|
|
Store( Local3, \SMYH )
|
|
}
|
|
}
|
|
#endif // ( OPTION_DYTC_SUPPORT_ICFUNC_MYH )
|
|
|
|
#if ( OPTION_DYTC_SUPPORT_ICFUNC_STP )
|
|
Case ( DYTC_ICFUNC_STP ) {
|
|
|
|
// Expect IC mode = No mode
|
|
If( LNotEqual( Local3, DYTC_ICMODE_MASK )) {
|
|
// Fail
|
|
ShiftLeft( DYTC_ERR_INVALID_MODE, DYTC_ERR_SHFT, Local1 )
|
|
Return ( Local1 )
|
|
}
|
|
|
|
// Off Request
|
|
If( LEqual( Local4, 0 ) ) {
|
|
Store( 0, \VSTP )
|
|
} Else {
|
|
Store( 1, \VSTP )
|
|
}
|
|
}
|
|
#endif // ( OPTION_DYTC_SUPPORT_ICFUNC_STP )
|
|
|
|
#if ( OPTION_DYTC_SUPPORT_ICFUNC_APM )
|
|
Case ( DYTC_ICFUNC_APM ) {
|
|
|
|
// Expect IC mode = No mode
|
|
If( LNotEqual( Local3, DYTC_ICMODE_MASK )) {
|
|
// Fail
|
|
ShiftLeft( DYTC_ERR_INVALID_MODE, DYTC_ERR_SHFT, Local1 )
|
|
Return ( Local1 )
|
|
}
|
|
|
|
// Off Request
|
|
If( LEqual( Local4, 0 ) ) {
|
|
Store( 0, \VAPM )
|
|
} Else {
|
|
Store( 1, \VAPM )
|
|
}
|
|
}
|
|
#endif // ( OPTION_DYTC_SUPPORT_ICFUNC_APM )
|
|
|
|
#if ( OPTION_DYTC_SUPPORT_ICFUNC_AQM )
|
|
Case ( DYTC_ICFUNC_AQM ) {
|
|
|
|
// Expect IC mode = No mode
|
|
If( LNotEqual( Local3, DYTC_ICMODE_MASK )) {
|
|
// Fail
|
|
ShiftLeft( DYTC_ERR_INVALID_MODE, DYTC_ERR_SHFT, Local1 )
|
|
Return ( Local1 )
|
|
}
|
|
|
|
// Off Request
|
|
If( LEqual( Local4, 0 ) ) {
|
|
Store( 0, \VAQM )
|
|
} Else {
|
|
Store( 1, \VAQM )
|
|
}
|
|
}
|
|
#endif // ( OPTION_DYTC_SUPPORT_ICFUNC_AQM )
|
|
|
|
#if ( OPTION_DYTC_SUPPORT_ICFUNC_IEPM )
|
|
Case ( DYTC_ICFUNC_IEPM ) {
|
|
|
|
// Expect IC mode = No mode
|
|
If( LNotEqual( Local3, DYTC_ICMODE_MASK )) {
|
|
// Fail
|
|
ShiftLeft( DYTC_ERR_INVALID_MODE, DYTC_ERR_SHFT, Local1 )
|
|
Return ( Local1 )
|
|
}
|
|
|
|
// Off Request
|
|
If( LEqual( Local4, 0 ) ) {
|
|
Store( 0, \VIEP )
|
|
} Else {
|
|
Store( 1, \VIEP )
|
|
}
|
|
}
|
|
#endif // ( OPTION_DYTC_SUPPORT_ICFUNC_IEPM )
|
|
|
|
#if ( OPTION_DYTC_SUPPORT_ICFUNC_IBSM )
|
|
Case ( DYTC_ICFUNC_IBSM ) {
|
|
|
|
// Expect IC mode = No mode
|
|
If( LNotEqual( Local3, DYTC_ICMODE_MASK )) {
|
|
// Fail
|
|
ShiftLeft( DYTC_ERR_INVALID_MODE, DYTC_ERR_SHFT, Local1 )
|
|
Return ( Local1 )
|
|
}
|
|
|
|
// Off Request
|
|
If( LEqual( Local4, 0 ) ) {
|
|
Store( 0, \VIBS )
|
|
} Else {
|
|
Store( 1, \VIBS )
|
|
}
|
|
}
|
|
#endif // ( OPTION_DYTC_SUPPORT_ICFUNC_IBSM )
|
|
|
|
#if ( OPTION_DYTC_SUPPORT_ICFUNC_AAA )
|
|
Case ( DYTC_ICFUNC_AAA ) {
|
|
|
|
// Expect IC mode = No mode
|
|
If( LNotEqual( Local3, DYTC_ICMODE_MASK )) {
|
|
// Fail
|
|
ShiftLeft( DYTC_ERR_INVALID_MODE, DYTC_ERR_SHFT, Local1 )
|
|
Return ( Local1 )
|
|
}
|
|
|
|
// Off Request ?
|
|
If( LEqual( Local4, 0 ) ) {
|
|
Store( 0, \VAAA )
|
|
} Else {
|
|
Store( 1, \VAAA )
|
|
}
|
|
}
|
|
#endif // ( OPTION_DYTC_SUPPORT_ICFUNC_AAA )
|
|
|
|
#if ( OPTION_DYTC_SUPPORT_ICFUNC_MMC )
|
|
Case ( DYTC_ICFUNC_MMC ) {
|
|
|
|
Switch ( Local3 ) {
|
|
|
|
#if ( OPTION_DYTC_SUPPORT_ICMODE_EPM )
|
|
|
|
Case ( DYTC_ICMODE_EPM ) {
|
|
|
|
If( LNotEqual( Local4, 1)) {
|
|
// Fail
|
|
ShiftLeft( DYTC_ERR_INVALID_MODE, DYTC_ERR_SHFT, Local1 )
|
|
Return ( Local1 )
|
|
}
|
|
}
|
|
|
|
#endif // ( OPTION_DYTC_SUPPORT_ICMODE_PFM )
|
|
|
|
#if ( OPTION_DYTC_SUPPORT_ICMODE_BSM )
|
|
|
|
Case ( DYTC_ICMODE_BSM ) {
|
|
|
|
If( LNotEqual( Local4, 1)) {
|
|
// Fail
|
|
ShiftLeft( DYTC_ERR_INVALID_MODE, DYTC_ERR_SHFT, Local1 )
|
|
Return ( Local1 )
|
|
}
|
|
}
|
|
|
|
#endif // ( OPTION_DYTC_SUPPORT_ICMODE_BSM )
|
|
|
|
Case ( DYTC_ICMODE_MASK ) {
|
|
If( LNotEqual( Local4, 0)) {
|
|
// Fail
|
|
ShiftLeft( DYTC_ERR_INVALID_MODE, DYTC_ERR_SHFT, Local1 )
|
|
Return ( Local1 )
|
|
}
|
|
}
|
|
|
|
Default { // Unsupported or Undefined IC Mode
|
|
// Fail
|
|
ShiftLeft( DYTC_ERR_INVALID_MODE, DYTC_ERR_SHFT, Local1 )
|
|
Return ( Local1 )
|
|
}
|
|
}
|
|
|
|
// Off Request
|
|
If( LEqual( Local4, 0 ) ) {
|
|
If( LEqual( Local3, DYTC_ICMODE_MASK ) ) {
|
|
Store( 0, \VMMC )
|
|
Store( 0xF, \SMMC )
|
|
}
|
|
Else
|
|
{
|
|
Store( 0, \VMMC )
|
|
Store( 0, \SMMC )
|
|
}
|
|
} Else {
|
|
Store( 1, \VMMC )
|
|
Store( Local3, \SMMC )
|
|
}
|
|
}
|
|
#endif // ( OPTION_DYTC_SUPPORT_ICFUNC_MMC )
|
|
|
|
Case ( DYTC_ICFUNC_STD ) {
|
|
|
|
// Expect IC mode = No mode
|
|
If( LNotEqual( Local3, DYTC_ICMODE_MASK )) {
|
|
// Fail
|
|
ShiftLeft( DYTC_ERR_INVALID_MODE, DYTC_ERR_SHFT, Local1 )
|
|
Return ( Local1 )
|
|
}
|
|
// No action for initializing DYTC
|
|
}
|
|
|
|
Default { // Unsupported or Undefined IC Function
|
|
// Fail
|
|
ShiftLeft( DYTC_ERR_INVALID_FUNC, DYTC_ERR_SHFT, Local1 )
|
|
Return ( Local1 )
|
|
}
|
|
}
|
|
|
|
////////////// Start : Need to customize by Product
|
|
//LCFCTODO:If you eanble DPTF and add ODV0 ~ ODVK variable in your porject, you can remove "//" before ODV0 ~ ODVK variable
|
|
//Standard Mode (Default Mode)
|
|
Store( DYTC_ICFUNC_STD, \CICF)
|
|
Store(1,\ODV0) //STD always enable
|
|
Store(0,EC0_SCOPE.EC0.SPMO)
|
|
Store(0,EC0_SCOPE.EC0.FCMO)
|
|
|
|
//AQM
|
|
If(LEqual (\VAQM, 1)) {
|
|
Store( DYTC_ICFUNC_AQM, \CICF)
|
|
// Store(1,\ODVH) //ODV17
|
|
Store(4,EC0_SCOPE.EC0.FCMO)
|
|
}Else{
|
|
// Store(0,\ODVH)
|
|
}
|
|
|
|
//APM
|
|
If(LEqual (\VAPM, 1)) {
|
|
Store( DYTC_ICFUNC_APM, \CICF)
|
|
// Store(1,\ODVG) //ODV16
|
|
Store(3,EC0_SCOPE.EC0.FCMO)
|
|
}Else{
|
|
// Store(0,\ODVG)
|
|
}
|
|
#if ( OPTION_DYTC_SUPPORT_ICFUNC_MYH )
|
|
//MYH
|
|
If(LEqual (\VMYH, 1)) {
|
|
Store( DYTC_ICFUNC_MYH, \CICF)
|
|
Store(\SMYH, Local6)
|
|
Switch(Local6) {
|
|
Case(DYTC_ICMODE_TBL) {//Tablet
|
|
Store(1,\ODV1)
|
|
Store(0,\ODV2)
|
|
Store(0,\ODV3)
|
|
}
|
|
Case(DYTC_ICMODE_TNT) {//Tent
|
|
Store(0,\ODV1)
|
|
Store(1,\ODV2)
|
|
Store(0,\ODV3)
|
|
}
|
|
Case(DYTC_ICMODE_LFT) {//Flat
|
|
Store(0,\ODV1)
|
|
Store(0,\ODV2)
|
|
Store(1,\ODV3)
|
|
}
|
|
Default {
|
|
Store(0,\ODV1)
|
|
Store(0,\ODV2)
|
|
Store(0,\ODV3)
|
|
}
|
|
}
|
|
}Else{ //Exit MYH Mode
|
|
Store(0,\ODV1)
|
|
Store(0,\ODV2)
|
|
Store(0,\ODV3)
|
|
}
|
|
#endif
|
|
|
|
//IBSM
|
|
If(LEqual (\VIBS, 1)) {
|
|
Store( DYTC_ICFUNC_IBSM, \CICF)
|
|
// Store(1,\ODVK) //ODV20
|
|
Store(7,EC0_SCOPE.EC0.FCMO)
|
|
}Else{
|
|
// Store(0,\ODVK)
|
|
}
|
|
|
|
//IEPM
|
|
If(LEqual (\VIEP, 1)) {
|
|
Store( DYTC_ICFUNC_IEPM, \CICF)
|
|
// Store(1,\ODVJ) //ODV19
|
|
Store(6,EC0_SCOPE.EC0.FCMO)
|
|
}Else{
|
|
// Store(0,\ODVJ)
|
|
}
|
|
|
|
|
|
//MMC
|
|
If (LEqual (\VMMC, 1)) {
|
|
Store( DYTC_ICFUNC_MMC, \CICF)
|
|
Store(\SMMC, Local6)
|
|
Switch(Local6) {
|
|
Case(DYTC_ICMODE_EPM) { //Extreme Performance Mode
|
|
// Store(1,\ODV8)
|
|
// Store(0,\ODV9)
|
|
Store(1,EC0_SCOPE.EC0.SPMO)
|
|
Store(1,EC0_SCOPE.EC0.FCMO)
|
|
}
|
|
Case(DYTC_ICMODE_BSM) { //Battery Saving Mode
|
|
// Store(0,\ODV8)
|
|
// Store(1,\ODV9)
|
|
Store(2,EC0_SCOPE.EC0.SPMO)
|
|
Store(2,EC0_SCOPE.EC0.FCMO)
|
|
}
|
|
Default { //Invalid Mode
|
|
// Store(0,\ODV8)
|
|
// Store(0,\ODV9)
|
|
Store(0,EC0_SCOPE.EC0.SPMO)
|
|
Store(0,EC0_SCOPE.EC0.FCMO)
|
|
}
|
|
}
|
|
}Else{ //Exit MMC Mode
|
|
// Store(0,\ODV8)
|
|
// Store(0,\ODV9)
|
|
Store(0,EC0_SCOPE.EC0.SPMO)
|
|
Store(0,EC0_SCOPE.EC0.FCMO)
|
|
}
|
|
|
|
#if ( OPTION_DYTC_SUPPORT_ICFUNC_STP )
|
|
//STP
|
|
If(LEqual (\VSTP, 1)) {
|
|
Store( DYTC_ICFUNC_STP, \CICF)
|
|
Store(1,\ODV4)
|
|
}Else{
|
|
Store(0,\ODV4)
|
|
}
|
|
#endif
|
|
Sleep(5)
|
|
|
|
//Notify DPTF driver OEM variable value has changed
|
|
Notify(\_SB.IETM, 0x88)
|
|
|
|
////////////// End : Need to customize by Product
|
|
|
|
// Organize Valid Flag Status
|
|
Store( \VSTD, Local5 )
|
|
Or( ShiftLeft( \VFBC, DYTC_ICFUNC_FBC ), Local5, Local5 )
|
|
Or( ShiftLeft( \VMYH, DYTC_ICFUNC_MYH ), Local5, Local5 )
|
|
Or( ShiftLeft( \VSTP, DYTC_ICFUNC_STP ), Local5, Local5 )
|
|
Or( ShiftLeft( \VAPM, DYTC_ICFUNC_APM ), Local5, Local5 )
|
|
Or( ShiftLeft( \VAQM, DYTC_ICFUNC_AQM ), Local5, Local5 )
|
|
Or( ShiftLeft( \VIEP, DYTC_ICFUNC_IEPM ), Local5, Local5 )
|
|
Or( ShiftLeft( \VIBS, DYTC_ICFUNC_IBSM ), Local5, Local5 )
|
|
Or( ShiftLeft( \VAAA, DYTC_ICFUNC_AAA ), Local5, Local5 )
|
|
Or( ShiftLeft( \VMMC, DYTC_ICFUNC_MMC ), Local5, Local5 )
|
|
|
|
Store( ShiftLeft( \CICF, DYTC_CRNTFUNC_SHFT ), Local1 )
|
|
|
|
If( LEqual( \CICF, DYTC_ICFUNC_MYH ) ){
|
|
Store( \SMYH, \CICM ) //
|
|
} ElseIf( LEqual( \CICF, DYTC_ICFUNC_MMC ) ){
|
|
Store( \SMMC, \CICM ) //
|
|
} Else {
|
|
Store( DYTC_ICMODE_MASK, \CICM ) // Save Current IC Mode as NO Mode
|
|
}
|
|
Or( ShiftLeft( \CICM, DYTC_CRNTMODE_SHFT ), Local1, Local1 )
|
|
Or( ShiftLeft( Local5, DYTC_FLAGCAP_SHFT ), Local1, Local1 )
|
|
|
|
// Success
|
|
Or( Local1, DYTC_STS_SUCCESS, Local1 )
|
|
|
|
}
|
|
|
|
Case ( DYTC_CMD_GET ) {
|
|
// Organize Valid Flag Status
|
|
Store( \VSTD, Local5 )
|
|
Or( ShiftLeft( \VFBC, DYTC_ICFUNC_FBC ), Local5, Local5 )
|
|
Or( ShiftLeft( \VMYH, DYTC_ICFUNC_MYH ), Local5, Local5 )
|
|
Or( ShiftLeft( \VSTP, DYTC_ICFUNC_STP ), Local5, Local5 )
|
|
Or( ShiftLeft( \VAPM, DYTC_ICFUNC_APM ), Local5, Local5 )
|
|
Or( ShiftLeft( \VAQM, DYTC_ICFUNC_AQM ), Local5, Local5 )
|
|
Or( ShiftLeft( \VIEP, DYTC_ICFUNC_IEPM ), Local5, Local5 )
|
|
Or( ShiftLeft( \VIBS, DYTC_ICFUNC_IBSM ), Local5, Local5 )
|
|
Or( ShiftLeft( \VAAA, DYTC_ICFUNC_AAA ), Local5, Local5 )
|
|
Or( ShiftLeft( \VMMC, DYTC_ICFUNC_MMC ), Local5, Local5 )
|
|
|
|
Store( ShiftLeft( \CICF, DYTC_CRNTFUNC_SHFT ), Local1 )
|
|
|
|
If( LEqual( \CICF, DYTC_ICFUNC_MYH ) ){
|
|
Store( \SMYH, \CICM ) //
|
|
} ElseIf( LEqual( \CICF, DYTC_ICFUNC_MMC ) ){
|
|
Store( \SMMC, \CICM ) //
|
|
} Else {
|
|
Store( DYTC_ICMODE_MASK, \CICM ) // Save Current IC Mode as NO Mode
|
|
}
|
|
|
|
Or( ShiftLeft( \CICM, DYTC_CRNTMODE_SHFT ), Local1, Local1 )
|
|
Or( ShiftLeft( Local5, DYTC_FLAGCAP_SHFT ), Local1, Local1 )
|
|
|
|
// Success
|
|
Or( Local1, DYTC_STS_SUCCESS, Local1 )
|
|
}
|
|
|
|
Case ( DYTC_CMD_FUNC_CAP ) {
|
|
Store( ShiftLeft( FCAP, DYTC_FCAP_SHFT ), Local1 )
|
|
|
|
// Success
|
|
Or( Local1, DYTC_STS_SUCCESS, Local1 )
|
|
}
|
|
|
|
Case ( DYTC_CMD_MODE_MYH_CAP ) {
|
|
Store( ShiftLeft( MYHC, DYTC_MCAP_SHFT ), Local1 )
|
|
|
|
// Success
|
|
Or( Local1, DYTC_STS_SUCCESS, Local1 )
|
|
}
|
|
|
|
Case ( DYTC_CMD_MODE_MMC_CAP ) {
|
|
And( ShiftRight( Local0, 9 ), 0xF , Local2 ) // Valid Flag
|
|
|
|
If( LNotEqual( Local2, 1 )) {
|
|
Store( ShiftLeft( MMCC, DYTC_MCAP_SHFT ), Local1 )
|
|
} Else {
|
|
Store( ShiftLeft( CONFIG_DYTC_IC_MMC_DEFAULT, 8 ), Local1 )
|
|
}
|
|
// Success
|
|
Or( Local1, DYTC_STS_SUCCESS, Local1 )
|
|
}
|
|
|
|
Case ( DYTC_CMD_MODE_MMC_GET ) {
|
|
Store( ShiftLeft( SMMC, DYTC_MCAP_SHFT ), Local1 )
|
|
|
|
// Success
|
|
Or( Local1, DYTC_STS_SUCCESS, Local1 )
|
|
}
|
|
|
|
// Case ( DYTC_CMD_MODE_AAA_GET ) {
|
|
// Store( ShiftLeft( SAAA, DYTC_MCAP_SHFT ), Local1 )
|
|
|
|
// // Success
|
|
// Or( Local1, DYTC_STS_SUCCESS, Local1 )
|
|
// }
|
|
|
|
Case ( DYTC_CMD_QUERY_CNT ) {
|
|
#if ( OPTION_DYTC_CLAMSHELL )
|
|
Store( ShiftLeft( DYTC_TCV_CLAMSHELL, DYTC_TCV_SHFT ), Local1 )
|
|
#else // ( OPTION_DYTC_CLAMSHELL )
|
|
Store( ShiftLeft( DYTC_TCV_TABLET, DYTC_TCV_SHFT ), Local1 )
|
|
#endif // ( OPTION_DYTC_CLAMSHELL )
|
|
|
|
// Success
|
|
Or( Local1, DYTC_STS_SUCCESS, Local1 )
|
|
}
|
|
|
|
Case ( DYTC_CMD_MODE_NIT_GET ) {
|
|
Store( ShiftLeft(DYTC_NITS_60, DYTC_MNIT_SHFT ), Local1 )
|
|
// Success
|
|
Or( Local1, DYTC_STS_SUCCESS, Local1 )
|
|
}
|
|
|
|
Case ( DYTC_CMD_FUNC_CAP_EXT ) {
|
|
Store( ShiftLeft(DYTC_CRETOR_APP_SUPPORT, DYTC_CAPE_SHFT ), Local1 )
|
|
// Success
|
|
Or( Local1, DYTC_STS_SUCCESS, Local1 )
|
|
}
|
|
|
|
Case ( DYTC_CMD_RESET ) {
|
|
////////////// Start : Need to customize by Product
|
|
//LCFCTODO:If you eanble DPTF and add ODV0 ~ ODVK variable in your porject, you can remove "//" before ODV0 ~ ODVK variable
|
|
Store(0,EC0_SCOPE.EC0.SPMO) //Intelligent/STD Mode
|
|
Store(0,EC0_SCOPE.EC0.FCMO) //Intelligent/STD Mode
|
|
Store(1,\ODV0)
|
|
Store(0,\ODV1)
|
|
Store(0,\ODV2)
|
|
Store(0,\ODV3)
|
|
Store(0,\ODV4)
|
|
// Store(0,\ODV8)
|
|
// Store(0,\ODV9)
|
|
// Store(0,\ODVG)
|
|
// Store(0,\ODVH)
|
|
// Store(0,\ODVJ)
|
|
// Store(0,\ODVK)
|
|
Sleep(5)
|
|
Notify(\_SB.IETM, 0x88) //Notify DPTF driver OEM variable value has changed
|
|
////////////// End : Need to customize by Product
|
|
|
|
Store( 0, \VFBC )
|
|
Store( 0, \VMYH )
|
|
Store( 0, \VSTP )
|
|
Store( 0, \VAPM )
|
|
Store( 0, \VAQM )
|
|
Store( 0, \VIEP )
|
|
Store( 0, \VIBS )
|
|
Store( 0, \VAAA )
|
|
Store( 0, \VMMC )
|
|
Store( 0, \SMYH )
|
|
Store( 0xF, \SMMC )
|
|
|
|
// STD Set
|
|
Store( DYTC_ICFUNC_STD, \CICF ) // Save Current IC Function
|
|
|
|
Store( DYTC_ICMODE_MASK, \CICM ) // Save Current IC Mode as NO Mode
|
|
|
|
// Organize Valid Flag Status
|
|
Store( \VSTD, Local5 )
|
|
Or( ShiftLeft( \VFBC, DYTC_ICFUNC_FBC ), Local5, Local5 )
|
|
Or( ShiftLeft( \VMYH, DYTC_ICFUNC_MYH ), Local5, Local5 )
|
|
Or( ShiftLeft( \VSTP, DYTC_ICFUNC_STP ), Local5, Local5 )
|
|
Or( ShiftLeft( \VAPM, DYTC_ICFUNC_APM ), Local5, Local5 )
|
|
Or( ShiftLeft( \VAQM, DYTC_ICFUNC_AQM ), Local5, Local5 )
|
|
Or( ShiftLeft( \VIEP, DYTC_ICFUNC_IEPM ), Local5, Local5 )
|
|
Or( ShiftLeft( \VIBS, DYTC_ICFUNC_IBSM ), Local5, Local5 )
|
|
Or( ShiftLeft( \VAAA, DYTC_ICFUNC_AAA ), Local5, Local5 )
|
|
Or( ShiftLeft( \VMMC, DYTC_ICFUNC_MMC ), Local5, Local5 )
|
|
|
|
Store( ShiftLeft( \CICF, DYTC_CRNTFUNC_SHFT ), Local1 )
|
|
Or( ShiftLeft( \CICM, DYTC_CRNTMODE_SHFT ), Local1, Local1 )
|
|
Or( ShiftLeft( Local5, DYTC_FLAGCAP_SHFT ), Local1, Local1 )
|
|
|
|
// Success
|
|
Or( Local1, DYTC_STS_SUCCESS, Local1 )
|
|
}
|
|
|
|
Default {
|
|
// Fail
|
|
ShiftLeft( DYTC_ERR_INVALID_CMD, DYTC_ERR_SHFT, Local1 )
|
|
}
|
|
}
|
|
|
|
Return ( Local1 )
|
|
}
|
|
#endif // ( OPTION_DYTC_ENABLE )
|
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
// //
|
|
// //
|
|
// ITS - Lenovo Intelligent Thermal Solution device driver support //
|
|
// //
|
|
// //
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
|
|
//
|
|
// ITSD : Vertual device for Intelligent Thermal Solution (ITS) driver
|
|
// Device Node : ITSD
|
|
// Propaties : _HID : IDEA2004
|
|
// Method : _STA : 0x0F (Always present, enabled, visible for UI, functional)
|
|
//
|
|
#if ( OPTION_DYTC_ENABLE )
|
|
Scope (EC0_SCOPE.EC0) {
|
|
|
|
Device( ITSD ) {
|
|
|
|
//
|
|
// PnP ID for ITS (Lenovo Intelligent Thermal Solution device
|
|
//
|
|
|
|
Name(_HID, "IDEA2008" ) // PnP ID for Virtual ITS Device
|
|
|
|
//
|
|
// Status (Always enabled)
|
|
//
|
|
|
|
Method( _STA ){
|
|
Return( 0x0F ) // Always present, enable, UI, functional
|
|
}
|
|
}
|
|
}
|
|
#endif // ( OPTION_DYTC_ENABLE )
|
|
|
|
|