Ryzen/AaeonIoPkg/F81866/F81866SmartFan.c
2022-12-26 14:22:55 +08:00

599 lines
24 KiB
C

//*************************************************************************
//*************************************************************************
//** **
//** (C)Copyright 1985-2008, American Megatrends, Inc. **
//** **
//** All Rights Reserved. **
//** **
//** 5555 Oakbrook Parkway, Suite 200, Norcross, GA 30093 **
//** **
//** Phone: (770)-246-8600 **
//** **
//*************************************************************************
//*************************************************************************
//
//*************************************************************************
// $Header: /Alaska/BIN/IO/Fintek/F81866/F81866 Board/F81866SmartFan.c 1 7/20/11 4:23a Kasalinyi $Revision:
//
// $Date:
//*************************************************************************
// Revision History
// ----------------
//
//*************************************************************************
//<AMI_FHDR_START>
//
// Name: <F81866SmartFan.c>
//
// Description: This is related to individual Smart Fan functions.
//
//<AMI_FHDR_END>
//*************************************************************************
#include <Efi.h>
#include <Token.h>
#include <AmiLib.h>
#include <Setup.h>
#include <AmiDxeLib.h>
#include <Protocol\BootScriptSave.h>
#define IDX_FAN_MODE 0
#define IDX_TEMP_HYS 1
#define IDX_FAN_SPEED_MSB 2
#define IDX_FAN_SPEED_LSB 3
#define IDX_TEMP_BOUND1 4
#define IDX_TEMP_BOUND2 5
#define IDX_TEMP_BOUND3 6
#define IDX_TEMP_BOUND4 7
#define IDX_SPEED_SEG1 8
#define IDX_SPEED_SEG2 9
#define IDX_SPEED_SEG3 10
#define IDX_SPEED_SEG4 11
#define IDX_SPEED_SEG5 12
#define IDX_TEMP_SRCSEL 13
typedef struct _DXE_SMF_INIT_DATA{
UINT8 Reg8;
UINT8 AndData8;
UINT8 OrData8;
} DXE_SMF_INIT_DATA;
typedef struct _S3_SAVE_DATA{
UINT8 Bank;
UINT8 Reg8;
} S3_SAVE_DATA;
//----------------------------------------------------------------------------------------------
// smart system fan registers need init AfterActivate. !!!AfterActivate
//----------------------------------------------------------------------------------------------
#if defined(F81866_SMF1_SUPPORT) && (F81866_SMF1_SUPPORT == 1)
DXE_SMF_INIT_DATA DXE_FAN1_INIT_TABLE[] = {
{0x96, 0xFC, 0x00},
{0x98, 0xF0, 0x02},
{0xA2, 0xFF, 0x00},
{0xA3, 0xFF, 0x00},
{0xA6, 0xFF, 0x00},
{0xA7, 0xFF, 0x00},
{0xA8, 0xFF, 0x00},
{0xA9, 0XFF, 0x00},
{0xAA, 0xFF, 0xFF},
{0xAB, 0xFF, 0x00},
{0xAC, 0xFF, 0x00},
{0xAD, 0xFF, 0x00},
{0xAE, 0xFF, 0x00},
{0xAF, 0xFC, 0x00},
};
#endif
#if defined(F81866_SMF2_SUPPORT) && (F81866_SMF2_SUPPORT == 1)
DXE_SMF_INIT_DATA DXE_FAN2_INIT_TABLE[] = {
{0x96, 0xF3, 0x00},
{0x98, 0x0F, 0x20},
{0xB2, 0xFF, 0x00},
{0xB3, 0xFF, 0x00},
{0xB6, 0xFF, 0x00},
{0xB7, 0xFF, 0x00},
{0xB8, 0xFF, 0x00},
{0xB9, 0XFF, 0x00},
{0xBA, 0xFF, 0xFF},
{0xBB, 0xFF, 0x00},
{0xBC, 0xFF, 0x00},
{0xBD, 0xFF, 0x00},
{0xBE, 0xFF, 0x00},
{0xBF, 0xFC, 0x00},
};
#endif
#if defined(F81866_SMF3_SUPPORT) && (F81866_SMF3_SUPPORT == 1)
DXE_SMF_INIT_DATA DXE_FAN3_INIT_TABLE[] = {
{0x96, 0xCF, 0x00},
{0x99, 0xF0, 0x02},
{0xC2, 0xFF, 0x00},
{0xC3, 0xFF, 0x00},
{0xC6, 0xFF, 0x00},
{0xC7, 0xFF, 0x00},
{0xC8, 0xFF, 0x00},
{0xC9, 0XFF, 0x00},
{0xCA, 0xFF, 0xFF},
{0xCB, 0xFF, 0x00},
{0xCC, 0xFF, 0x00},
{0xCD, 0xFF, 0x00},
{0xCE, 0xFF, 0x00},
{0xCF, 0xFC, 0x00},
};
#endif
S3_SAVE_DATA HwmS3SaveRegisterTbl[] = {
// ----------------------
//| Bank | Reg8 |
// ----------------------
{0xFF,0x94},
{0xFF,0x96},
{0xFF,0x98},
#if defined(F81866_SMF1_SUPPORT) && (F81866_SMF1_SUPPORT == 1)
{0xFF,0xA2},
{0xFF,0xA3},
{0xFF,0xA6},
{0xFF,0xA7},
{0xFF,0xA8},
{0xFF,0xA9},
{0xFF,0xAA},
{0xFF,0xAB},
{0xFF,0xAC},
{0xFF,0xAD},
{0xFF,0xAE},
{0xFF,0xAF},
#endif
#if defined(F81866_SMF2_SUPPORT) && (F81866_SMF2_SUPPORT == 1)
{0xFF,0xB2},
{0xFF,0xB3},
{0xFF,0xB6},
{0xFF,0xB7},
{0xFF,0xB8},
{0xFF,0xB9},
{0xFF,0xBA},
{0xFF,0xBB},
{0xFF,0xBC},
{0xFF,0xBD},
{0xFF,0xBE},
{0xFF,0xBF},
#endif
#if defined(F81866_SMF3_SUPPORT) && (F81866_SMF3_SUPPORT == 1)
{0xFF,0xC2},
{0xFF,0xC3},
{0xFF,0xC6},
{0xFF,0xC7},
{0xFF,0xC8},
{0xFF,0xC9},
{0xFF,0xCA},
{0xFF,0xCB},
{0xFF,0xCC},
{0xFF,0xCD},
{0xFF,0xCE},
{0xFF,0xCF},
#endif
};
//--------------------------------------------------------------------------
// Definition of smart fan functions
//--------------------------------------------------------------------------
VOID F81866SmartFunction (VOID);
VOID F81866_FAN_Full();
static VOID SmartFanFuncStart(SETUP_DATA *SetupData);
void F81866_FAN_Full(VOID)
{
// Full Speed
// Manual Duty Mode
#if defined(F81866_SMF_SUPPORT) && (F81866_SMF_SUPPORT == 1)
UINT8 i, temp;
#endif
#if defined(F81866_SMF1_SUPPORT) && (F81866_SMF1_SUPPORT == 1)
DXE_FAN1_INIT_TABLE[ IDX_FAN_MODE ].OrData8 = 0x03;//mode
DXE_FAN1_INIT_TABLE[ IDX_FAN_SPEED_LSB ].OrData8 = 0xFF;
for(i=0; i<( (sizeof(DXE_FAN1_INIT_TABLE))/(sizeof(DXE_SMF_INIT_DATA)) ); i++) {
IoWrite8(F81866_HWM_INDEX_PORT, DXE_FAN1_INIT_TABLE[i].Reg8 );
if(DXE_FAN1_INIT_TABLE[i].AndData8 == 0xFF) {
temp = DXE_FAN1_INIT_TABLE[i].OrData8;
} else {
temp = IoRead8(F81866_HWM_DATA_PORT);
temp &= DXE_FAN1_INIT_TABLE[i].AndData8;
temp |= DXE_FAN1_INIT_TABLE[i].OrData8;
}
IoWrite8(F81866_HWM_DATA_PORT, temp);
}
#endif
#if defined(F81866_SMF2_SUPPORT) && (F81866_SMF2_SUPPORT == 1)
DXE_FAN2_INIT_TABLE[ IDX_FAN_MODE ].OrData8 = 0x0C;//mode
DXE_FAN2_INIT_TABLE[ IDX_FAN_SPEED_LSB ].OrData8 = 0xFF;
for(i=0; i<( (sizeof(DXE_FAN2_INIT_TABLE))/(sizeof(DXE_SMF_INIT_DATA)) ); i++) {
IoWrite8(F81866_HWM_INDEX_PORT, DXE_FAN2_INIT_TABLE[i].Reg8 );
if(DXE_FAN2_INIT_TABLE[i].AndData8 == 0xFF) {
temp = DXE_FAN2_INIT_TABLE[i].OrData8;
} else {
temp = IoRead8(F81866_HWM_DATA_PORT);
temp &= DXE_FAN2_INIT_TABLE[i].AndData8;
temp |= DXE_FAN2_INIT_TABLE[i].OrData8;
}
IoWrite8(F81866_HWM_DATA_PORT, temp);
}
#endif
#if defined(F81866_SMF3_SUPPORT) && (F81866_SMF3_SUPPORT == 1)
DXE_FAN3_INIT_TABLE[ IDX_FAN_MODE ].OrData8 = 0x30;//mode
DXE_FAN3_INIT_TABLE[ IDX_FAN_SPEED_LSB ].OrData8 = 0xFF;
for(i=0; i<( (sizeof(DXE_FAN3_INIT_TABLE))/(sizeof(DXE_SMF_INIT_DATA)) ); i++) {
IoWrite8(F81866_HWM_INDEX_PORT, DXE_FAN3_INIT_TABLE[i].Reg8 );
if(DXE_FAN3_INIT_TABLE[i].AndData8 == 0xFF) {
temp = DXE_FAN3_INIT_TABLE[i].OrData8;
} else {
temp = IoRead8(F81866_HWM_DATA_PORT);
temp &= DXE_FAN3_INIT_TABLE[i].AndData8;
temp |= DXE_FAN3_INIT_TABLE[i].OrData8;
}
IoWrite8(F81866_HWM_DATA_PORT, temp);
}
#endif
}
#if defined(F81866_SMF1_SUPPORT) && (F81866_SMF1_SUPPORT == 1)
//<AMI_PHDR_START>
//---------------------------------------------------------------------------
// Procedure: F81866_SMF1_INIT
//
// Description: This function do smart fan1 config
//
// Input: NULL
//
//
// Output: NULL
//
//---------------------------------------------------------------------------
//<AMI_PHDR_END>
void F81866_SMF1_INIT(SETUP_DATA *SetupData)
{
UINT8 i, temp;
switch (SetupData->Fan1SmartFanMode) {
case 0:
// Manual RPM Mode
DXE_FAN1_INIT_TABLE[ IDX_FAN_MODE ].OrData8 = 0x02;//mode
DXE_FAN1_INIT_TABLE[ IDX_FAN_SPEED_MSB ].OrData8 = (UINT8)(1500000/SetupData->Fan1Mode0FixedSpeed >> 8);//mode
DXE_FAN1_INIT_TABLE[ IDX_FAN_SPEED_LSB ].OrData8 = (UINT8)(1500000/SetupData->Fan1Mode0FixedSpeed & 0xFF);//mode
break;
case 1:
// Manual Duty Mode
DXE_FAN1_INIT_TABLE[ IDX_FAN_MODE ].OrData8 = 0x03;//mode
DXE_FAN1_INIT_TABLE[ IDX_FAN_SPEED_LSB ].OrData8 = (UINT8)SetupData->Fan1Mode1FixedDuty*0xFF/100;//mode
break;
case 2:
// Auto RPM Mode
DXE_FAN1_INIT_TABLE[ IDX_FAN_MODE ].OrData8 = 0x00;//mode
DXE_FAN1_INIT_TABLE[ IDX_TEMP_HYS ].OrData8 = 0x02; // Set hysteresis as 2
DXE_FAN1_INIT_TABLE[ IDX_TEMP_BOUND1 ].OrData8 = SetupData->Fan1Mode2AutoRpmT1;
DXE_FAN1_INIT_TABLE[ IDX_TEMP_BOUND2 ].OrData8 = SetupData->Fan1Mode2AutoRpmT2;
DXE_FAN1_INIT_TABLE[ IDX_TEMP_BOUND3 ].OrData8 = SetupData->Fan1Mode2AutoRpmT3;
DXE_FAN1_INIT_TABLE[ IDX_TEMP_BOUND4 ].OrData8 = SetupData->Fan1Mode2AutoRpmT4;
DXE_FAN1_INIT_TABLE[ IDX_SPEED_SEG1 ].OrData8 = (UINT8)((100-SetupData->Fan1Mode2AutoRpmF1)*32/SetupData->Fan1Mode2AutoRpmF1);
DXE_FAN1_INIT_TABLE[ IDX_SPEED_SEG2 ].OrData8 = (UINT8)((100-SetupData->Fan1Mode2AutoRpmF2)*32/SetupData->Fan1Mode2AutoRpmF2);
DXE_FAN1_INIT_TABLE[ IDX_SPEED_SEG3 ].OrData8 = (UINT8)((100-SetupData->Fan1Mode2AutoRpmF3)*32/SetupData->Fan1Mode2AutoRpmF3);
DXE_FAN1_INIT_TABLE[ IDX_SPEED_SEG4 ].OrData8 = (UINT8)((100-SetupData->Fan1Mode2AutoRpmF4)*32/SetupData->Fan1Mode2AutoRpmF4);
DXE_FAN1_INIT_TABLE[ IDX_SPEED_SEG5 ].OrData8 = (UINT8)((100-SetupData->Fan1Mode2AutoRpmF5)*32/SetupData->Fan1Mode2AutoRpmF5);
DXE_FAN1_INIT_TABLE[ IDX_TEMP_SRCSEL ].OrData8 = SetupData->Fan1TempSrc;
break;
case 3:
// Auto Duty-Cycle Mode
DXE_FAN1_INIT_TABLE[ IDX_FAN_MODE ].OrData8 = 0x01;//mode
DXE_FAN1_INIT_TABLE[ IDX_TEMP_HYS ].OrData8 = 0x02; // Set hysteresis as 2
DXE_FAN1_INIT_TABLE[ IDX_TEMP_BOUND1 ].OrData8 = SetupData->Fan1Mode3AutoDutyT1;
DXE_FAN1_INIT_TABLE[ IDX_TEMP_BOUND2 ].OrData8 = SetupData->Fan1Mode3AutoDutyT2;
DXE_FAN1_INIT_TABLE[ IDX_TEMP_BOUND3 ].OrData8 = SetupData->Fan1Mode3AutoDutyT3;
DXE_FAN1_INIT_TABLE[ IDX_TEMP_BOUND4 ].OrData8 = SetupData->Fan1Mode3AutoDutyT4;
DXE_FAN1_INIT_TABLE[ IDX_SPEED_SEG1 ].OrData8 = (UINT8)(SetupData->Fan1Mode3AutoDutyF1*0xFF/100);
DXE_FAN1_INIT_TABLE[ IDX_SPEED_SEG2 ].OrData8 = (UINT8)(SetupData->Fan1Mode3AutoDutyF2*0xFF/100);
DXE_FAN1_INIT_TABLE[ IDX_SPEED_SEG3 ].OrData8 = (UINT8)(SetupData->Fan1Mode3AutoDutyF3*0xFF/100);
DXE_FAN1_INIT_TABLE[ IDX_SPEED_SEG4 ].OrData8 = (UINT8)(SetupData->Fan1Mode3AutoDutyF4*0xFF/100);
DXE_FAN1_INIT_TABLE[ IDX_SPEED_SEG5 ].OrData8 = (UINT8)(SetupData->Fan1Mode3AutoDutyF5*0xFF/100);
DXE_FAN1_INIT_TABLE[ IDX_TEMP_SRCSEL ].OrData8 = SetupData->Fan1TempSrc;
break;
default:
break;
}
for(i=0; i<( (sizeof(DXE_FAN1_INIT_TABLE))/(sizeof(DXE_SMF_INIT_DATA)) ); i++) {
IoWrite8(F81866_HWM_INDEX_PORT, DXE_FAN1_INIT_TABLE[i].Reg8 );
if(DXE_FAN1_INIT_TABLE[i].AndData8 == 0xFF) {
temp = DXE_FAN1_INIT_TABLE[i].OrData8;
} else {
temp = IoRead8(F81866_HWM_DATA_PORT);
temp &= DXE_FAN1_INIT_TABLE[i].AndData8;
temp |= DXE_FAN1_INIT_TABLE[i].OrData8;
}
IoWrite8(F81866_HWM_DATA_PORT, temp);
}
}
#endif
#if defined(F81866_SMF2_SUPPORT) && (F81866_SMF2_SUPPORT == 1)
//<AMI_PHDR_START>
//---------------------------------------------------------------------------
// Procedure: F81866_SMF2_INIT
//
// Description: This function do smart fan2 config
//
// Input: NULL
//
//
// Output: NULL
//
//---------------------------------------------------------------------------
//<AMI_PHDR_END>
void F81866_SMF2_INIT(SETUP_DATA *SetupData)
{
UINT8 i, temp;
switch (SetupData->Fan2SmartFanMode) {
case 0:
// Manual RPM Mode
DXE_FAN2_INIT_TABLE[ IDX_FAN_MODE ].OrData8 = (0x02 << 2);//mode
DXE_FAN2_INIT_TABLE[ IDX_FAN_SPEED_MSB ].OrData8 = (UINT8)(1500000/SetupData->Fan2Mode0FixedSpeed >> 8);//mode
DXE_FAN2_INIT_TABLE[ IDX_FAN_SPEED_LSB ].OrData8 = (UINT8)(1500000/SetupData->Fan2Mode0FixedSpeed & 0xFF);//mode
break;
case 1:
// Manual Duty Mode
DXE_FAN2_INIT_TABLE[ IDX_FAN_MODE ].OrData8 = (0x03 << 2);//mode
DXE_FAN2_INIT_TABLE[ IDX_FAN_SPEED_LSB ].OrData8 = (UINT8)SetupData->Fan2Mode1FixedDuty*0xFF/100;//mode
break;
case 2:
// Auto RPM Mode
DXE_FAN2_INIT_TABLE[ IDX_FAN_MODE ].OrData8 = 0x00;//mode
DXE_FAN2_INIT_TABLE[ IDX_TEMP_HYS ].OrData8 = (0x02 << 4); // Set hysteresis as 2
DXE_FAN2_INIT_TABLE[ IDX_TEMP_BOUND1 ].OrData8 = SetupData->Fan2Mode2AutoRpmT1;
DXE_FAN2_INIT_TABLE[ IDX_TEMP_BOUND2 ].OrData8 = SetupData->Fan2Mode2AutoRpmT2;
DXE_FAN2_INIT_TABLE[ IDX_TEMP_BOUND3 ].OrData8 = SetupData->Fan2Mode2AutoRpmT3;
DXE_FAN2_INIT_TABLE[ IDX_TEMP_BOUND4 ].OrData8 = SetupData->Fan2Mode2AutoRpmT4;
DXE_FAN2_INIT_TABLE[ IDX_SPEED_SEG1 ].OrData8 = (UINT8)((100-SetupData->Fan2Mode2AutoRpmF1)*32/SetupData->Fan2Mode2AutoRpmF1);
DXE_FAN2_INIT_TABLE[ IDX_SPEED_SEG2 ].OrData8 = (UINT8)((100-SetupData->Fan2Mode2AutoRpmF2)*32/SetupData->Fan2Mode2AutoRpmF2);
DXE_FAN2_INIT_TABLE[ IDX_SPEED_SEG3 ].OrData8 = (UINT8)((100-SetupData->Fan2Mode2AutoRpmF3)*32/SetupData->Fan2Mode2AutoRpmF3);
DXE_FAN2_INIT_TABLE[ IDX_SPEED_SEG4 ].OrData8 = (UINT8)((100-SetupData->Fan2Mode2AutoRpmF4)*32/SetupData->Fan2Mode2AutoRpmF4);
DXE_FAN2_INIT_TABLE[ IDX_SPEED_SEG5 ].OrData8 = (UINT8)((100-SetupData->Fan2Mode2AutoRpmF5)*32/SetupData->Fan2Mode2AutoRpmF5);
DXE_FAN2_INIT_TABLE[ IDX_TEMP_SRCSEL ].OrData8 = SetupData->Fan2TempSrc;
break;
case 3:
// Auto Duty-Cycle Mode
DXE_FAN2_INIT_TABLE[ IDX_FAN_MODE ].OrData8 = (0x01 << 2);//mode
DXE_FAN2_INIT_TABLE[ IDX_TEMP_HYS ].OrData8 = (0x02 << 4); // Set hysteresis as 2
DXE_FAN2_INIT_TABLE[ IDX_TEMP_BOUND1 ].OrData8 = SetupData->Fan2Mode3AutoDutyT1;
DXE_FAN2_INIT_TABLE[ IDX_TEMP_BOUND2 ].OrData8 = SetupData->Fan2Mode3AutoDutyT2;
DXE_FAN2_INIT_TABLE[ IDX_TEMP_BOUND3 ].OrData8 = SetupData->Fan2Mode3AutoDutyT3;
DXE_FAN2_INIT_TABLE[ IDX_TEMP_BOUND4 ].OrData8 = SetupData->Fan2Mode3AutoDutyT4;
DXE_FAN2_INIT_TABLE[ IDX_SPEED_SEG1 ].OrData8 = (UINT8)(SetupData->Fan2Mode3AutoDutyF1*0xFF/100);
DXE_FAN2_INIT_TABLE[ IDX_SPEED_SEG2 ].OrData8 = (UINT8)(SetupData->Fan2Mode3AutoDutyF2*0xFF/100);
DXE_FAN2_INIT_TABLE[ IDX_SPEED_SEG3 ].OrData8 = (UINT8)(SetupData->Fan2Mode3AutoDutyF3*0xFF/100);
DXE_FAN2_INIT_TABLE[ IDX_SPEED_SEG4 ].OrData8 = (UINT8)(SetupData->Fan2Mode3AutoDutyF4*0xFF/100);
DXE_FAN2_INIT_TABLE[ IDX_SPEED_SEG5 ].OrData8 = (UINT8)(SetupData->Fan2Mode3AutoDutyF5*0xFF/100);
DXE_FAN2_INIT_TABLE[ IDX_TEMP_SRCSEL ].OrData8 = SetupData->Fan2TempSrc;
break;
default:
break;
}
for(i=0; i<( (sizeof(DXE_FAN2_INIT_TABLE))/(sizeof(DXE_SMF_INIT_DATA)) ); i++) {
IoWrite8(F81866_HWM_INDEX_PORT, DXE_FAN2_INIT_TABLE[i].Reg8 );
if(DXE_FAN2_INIT_TABLE[i].AndData8 == 0xFF) {
temp = DXE_FAN2_INIT_TABLE[i].OrData8;
} else {
temp = IoRead8(F81866_HWM_DATA_PORT);
temp &= DXE_FAN2_INIT_TABLE[i].AndData8;
temp |= DXE_FAN2_INIT_TABLE[i].OrData8;
}
IoWrite8(F81866_HWM_DATA_PORT, temp);
}
}
#endif
#if defined(F81866_SMF3_SUPPORT) && (F81866_SMF3_SUPPORT == 1)
//<AMI_PHDR_START>
//---------------------------------------------------------------------------
// Procedure: F81866_SMF3_INIT
//
// Description: This function do smart fan2 config
//
// Input: NULL
//
//
// Output: NULL
//
//---------------------------------------------------------------------------
//<AMI_PHDR_END>
void F81866_SMF3_INIT(SETUP_DATA *SetupData)
{
UINT8 i, temp;
switch (SetupData->Fan3SmartFanMode) {
case 0:
// Manual RPM Mode
DXE_FAN3_INIT_TABLE[ IDX_FAN_MODE ].OrData8 = (0x02 << 4);//mode
DXE_FAN3_INIT_TABLE[ IDX_FAN_SPEED_MSB ].OrData8 = (UINT8)(1500000/SetupData->Fan3Mode0FixedSpeed >> 8);//mode
DXE_FAN3_INIT_TABLE[ IDX_FAN_SPEED_LSB ].OrData8 = (UINT8)(1500000/SetupData->Fan3Mode0FixedSpeed & 0xFF);//mode
break;
case 1:
// Manual Duty Mode
DXE_FAN3_INIT_TABLE[ IDX_FAN_MODE ].OrData8 = (0x03 << 4);//mode
DXE_FAN3_INIT_TABLE[ IDX_FAN_SPEED_LSB ].OrData8 = (UINT8)SetupData->Fan3Mode1FixedDuty*0xFF/100;//mode
break;
case 2:
// Auto RPM Mode
DXE_FAN3_INIT_TABLE[ IDX_FAN_MODE ].OrData8 = 0x00;//mode
DXE_FAN3_INIT_TABLE[ IDX_TEMP_HYS ].OrData8 = 0x02; // Set hysteresis as 2
DXE_FAN3_INIT_TABLE[ IDX_TEMP_BOUND1 ].OrData8 = SetupData->Fan3Mode2AutoRpmT1;
DXE_FAN3_INIT_TABLE[ IDX_TEMP_BOUND2 ].OrData8 = SetupData->Fan3Mode2AutoRpmT2;
DXE_FAN3_INIT_TABLE[ IDX_TEMP_BOUND3 ].OrData8 = SetupData->Fan3Mode2AutoRpmT3;
DXE_FAN3_INIT_TABLE[ IDX_TEMP_BOUND4 ].OrData8 = SetupData->Fan3Mode2AutoRpmT4;
DXE_FAN3_INIT_TABLE[ IDX_SPEED_SEG1 ].OrData8 = (UINT8)((100-SetupData->Fan3Mode2AutoRpmF1)*32/SetupData->Fan3Mode2AutoRpmF1);
DXE_FAN3_INIT_TABLE[ IDX_SPEED_SEG2 ].OrData8 = (UINT8)((100-SetupData->Fan3Mode2AutoRpmF2)*32/SetupData->Fan3Mode2AutoRpmF2);
DXE_FAN3_INIT_TABLE[ IDX_SPEED_SEG3 ].OrData8 = (UINT8)((100-SetupData->Fan3Mode2AutoRpmF3)*32/SetupData->Fan3Mode2AutoRpmF3);
DXE_FAN3_INIT_TABLE[ IDX_SPEED_SEG4 ].OrData8 = (UINT8)((100-SetupData->Fan3Mode2AutoRpmF4)*32/SetupData->Fan3Mode2AutoRpmF4);
DXE_FAN3_INIT_TABLE[ IDX_SPEED_SEG5 ].OrData8 = (UINT8)((100-SetupData->Fan3Mode2AutoRpmF5)*32/SetupData->Fan3Mode2AutoRpmF5);
DXE_FAN3_INIT_TABLE[ IDX_TEMP_SRCSEL ].OrData8 = SetupData->Fan3TempSrc;
break;
case 3:
// Auto Duty-Cycle Mode
DXE_FAN3_INIT_TABLE[ IDX_FAN_MODE ].OrData8 = (0x01 << 4);//mode
DXE_FAN3_INIT_TABLE[ IDX_TEMP_HYS ].OrData8 = 0x02; // Set hysteresis as 2
DXE_FAN3_INIT_TABLE[ IDX_TEMP_BOUND1 ].OrData8 = SetupData->Fan3Mode3AutoDutyT1;
DXE_FAN3_INIT_TABLE[ IDX_TEMP_BOUND2 ].OrData8 = SetupData->Fan3Mode3AutoDutyT2;
DXE_FAN3_INIT_TABLE[ IDX_TEMP_BOUND3 ].OrData8 = SetupData->Fan3Mode3AutoDutyT3;
DXE_FAN3_INIT_TABLE[ IDX_TEMP_BOUND4 ].OrData8 = SetupData->Fan3Mode3AutoDutyT4;
DXE_FAN3_INIT_TABLE[ IDX_SPEED_SEG1 ].OrData8 = (UINT8)(SetupData->Fan3Mode3AutoDutyF1*0xFF/100);
DXE_FAN3_INIT_TABLE[ IDX_SPEED_SEG2 ].OrData8 = (UINT8)(SetupData->Fan3Mode3AutoDutyF2*0xFF/100);
DXE_FAN3_INIT_TABLE[ IDX_SPEED_SEG3 ].OrData8 = (UINT8)(SetupData->Fan3Mode3AutoDutyF3*0xFF/100);
DXE_FAN3_INIT_TABLE[ IDX_SPEED_SEG4 ].OrData8 = (UINT8)(SetupData->Fan3Mode3AutoDutyF4*0xFF/100);
DXE_FAN3_INIT_TABLE[ IDX_SPEED_SEG5 ].OrData8 = (UINT8)(SetupData->Fan3Mode3AutoDutyF5*0xFF/100);
DXE_FAN3_INIT_TABLE[ IDX_TEMP_SRCSEL ].OrData8 = SetupData->Fan3TempSrc;
break;
default:
break;
}
for(i=0; i<( (sizeof(DXE_FAN3_INIT_TABLE))/(sizeof(DXE_SMF_INIT_DATA)) ); i++) {
IoWrite8(F81866_HWM_INDEX_PORT, DXE_FAN3_INIT_TABLE[i].Reg8 );
if(DXE_FAN3_INIT_TABLE[i].AndData8 == 0xFF) {
temp = DXE_FAN3_INIT_TABLE[i].OrData8;
} else {
temp = IoRead8(F81866_HWM_DATA_PORT);
temp &= DXE_FAN3_INIT_TABLE[i].AndData8;
temp |= DXE_FAN3_INIT_TABLE[i].OrData8;
}
IoWrite8(F81866_HWM_DATA_PORT, temp);
}
}
#endif
//<AMI_PHDR_START>
//---------------------------------------------------------------------------
// Procedure: SmartFanCallbackReadyToBoot
//
// Description: This function save registers for S3
//
// Input: NULL
//
//
// Output: NULL
//
//---------------------------------------------------------------------------
//<AMI_PHDR_END>
EFI_STATUS SmartFanBootScript(EFI_S3_SAVE_STATE_PROTOCOL *bss)
{
EFI_STATUS Status = EFI_SUCCESS;
UINT8 bank_reg,bank,r,v,i;
// record the register from table into boot script
for (i=0; i < ((sizeof(HwmS3SaveRegisterTbl))/(sizeof(S3_SAVE_DATA))); i++) {
bank = HwmS3SaveRegisterTbl[i].Bank;
r = HwmS3SaveRegisterTbl[i].Reg8;
//select bank
if ( bank != 0xFF ) {
bank_reg = 0x4e;
IoWrite8(F81866_HWM_INDEX_PORT, bank_reg);
IoWrite8(F81866_HWM_DATA_PORT, bank);
}
//select register to read actual data
IoWrite8(F81866_HWM_INDEX_PORT, r);
v = IoRead8(F81866_HWM_DATA_PORT);
//save to s3 bootscrip table
if ( bank != 0xFF ) {
BOOT_SCRIPT_S3_IO_WRITE_MACRO(bss,EfiBootScriptWidthUint8,F81866_HWM_INDEX_PORT, 1, &bank_reg);
BOOT_SCRIPT_S3_IO_WRITE_MACRO(bss,EfiBootScriptWidthUint8,F81866_HWM_DATA_PORT, 1, &bank);
}
BOOT_SCRIPT_S3_IO_WRITE_MACRO(bss,EfiBootScriptWidthUint8,F81866_HWM_INDEX_PORT, 1, &r);
BOOT_SCRIPT_S3_IO_WRITE_MACRO(bss,EfiBootScriptWidthUint8,F81866_HWM_DATA_PORT, 1, &v);
}
return Status;
}
//<AMI_PHDR_START>
//---------------------------------------------------------------------------
// Procedure: SmartFanFuncStart
//
// Description: This function start to initialize the smart fan function
//
// Input: NULL
//
//
// Output: NULL
//
//---------------------------------------------------------------------------
//<AMI_PHDR_END>
static VOID SmartFanFuncStart(SETUP_DATA *SetupData)
{
//--------------------------------------------------------------------------
// Before speed control, program neccessary registers if needed.
//--------------------------------------------------------------------------
//--------------------------------------------------------------------------
// Start to program the smart fan mode
//--------------------------------------------------------------------------
#if defined(F81866_SMF1_SUPPORT) && (F81866_SMF1_SUPPORT == 1)
F81866_SMF1_INIT(SetupData);
#endif
#if defined(F81866_SMF2_SUPPORT) && (F81866_SMF2_SUPPORT == 1)
F81866_SMF2_INIT(SetupData);
#endif
#if defined(F81866_SMF3_SUPPORT) && (F81866_SMF3_SUPPORT == 1)
F81866_SMF3_INIT(SetupData);
#endif
}
//<AMI_PHDR_START>
//---------------------------------------------------------------------------
// Procedure: F81866SmartFunction
//
// Description: This function initializes the IT8783 in BDS phase
//
// Input:
// IN EFI_HANDLE ImageHandle
// IN EFI_SYSTEM_TABLE SystemTable
//
// Output: Status
//
//---------------------------------------------------------------------------
//<AMI_PHDR_END>
VOID F81866SmartFunction (VOID)
{
EFI_STATUS Status = EFI_SUCCESS;
UINTN Size = sizeof(SETUP_DATA);
EFI_GUID SetupGuid = SETUP_GUID;
SETUP_DATA SetupData;
//Get Setup variable
Status=pRS->GetVariable( L"Setup", &SetupGuid, NULL, &Size, &SetupData);
if(Status != EFI_SUCCESS) return;
#if defined(F81866_SMF_SUPPORT) && (F81866_SMF_SUPPORT == 1)
//Init the smart fan function
if(SetupData.SmartFanEnable)
SmartFanFuncStart(&SetupData);
else
#endif
F81866_FAN_Full();
}
//*************************************************************************
//*************************************************************************
//** **
//** (C)Copyright 1985-2008, American Megatrends, Inc. **
//** **
//** All Rights Reserved. **
//** **
//** 5555 Oakbrook Parkway, Suite 200, Norcross, GA 30093 **
//** **
//** Phone: (770)-246-8600 **
//** **
//*************************************************************************
//*************************************************************************