diff options
Diffstat (limited to 'Board/IO/F81866/BSP')
-rw-r--r-- | Board/IO/F81866/BSP/BSP.cif | 13 | ||||
-rw-r--r-- | Board/IO/F81866/BSP/DxeIoTable.h | 165 | ||||
-rw-r--r-- | Board/IO/F81866/BSP/F81866HwmOemHooks.c | 733 | ||||
-rw-r--r-- | Board/IO/F81866/BSP/F81866SmartFan.c | 467 | ||||
-rw-r--r-- | Board/IO/F81866/BSP/OemIoDecode.c | 411 | ||||
-rw-r--r-- | Board/IO/F81866/BSP/PeiIoTable.h | 332 |
6 files changed, 2121 insertions, 0 deletions
diff --git a/Board/IO/F81866/BSP/BSP.cif b/Board/IO/F81866/BSP/BSP.cif new file mode 100644 index 0000000..04b5810 --- /dev/null +++ b/Board/IO/F81866/BSP/BSP.cif @@ -0,0 +1,13 @@ +<component> + name = "F81866 Board" + category = ModulePart + LocalRoot = "Board\IO\F81866\BSP\" + RefName = "F81866Board" +[files] +"OemIoDecode.c" +"PeiIoTable.h" +"DxeIoTable.h" +"F81866HwmOemHooks.c" +"F81866SmartFan.c" +<endComponent> + diff --git a/Board/IO/F81866/BSP/DxeIoTable.h b/Board/IO/F81866/BSP/DxeIoTable.h new file mode 100644 index 0000000..d56f42d --- /dev/null +++ b/Board/IO/F81866/BSP/DxeIoTable.h @@ -0,0 +1,165 @@ +//************************************************************************* +//************************************************************************* +//** ** +//** (C)Copyright 1985-2011, 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/DxeIoTable.h 1 7/20/11 4:22a Kasalinyi $ +// +// $Revision: 1 $ +// +// $Date: 7/20/11 4:22a $ +//************************************************************************* +// Revision History +// ---------------- +// $Log: /Alaska/BIN/IO/Fintek/F81866/F81866 Board/DxeIoTable.h $ +// +// 1 7/20/11 4:22a Kasalinyi +// [Category] Improvement +// [Description] Initial Porting +// [Files] BSP.cif +// OemIoDecode.c +// PeiIoTable.h +// DxeIoTable.h +// F81866HwmOemHooks.c +// F81866SmartFan.c +// +// 4 3/21/11 9:44p Mikes +// Seperate the core and oem job +// +//************************************************************************* +//<AMI_FHDR_START> +// +// Name: DxeIoTable.C +// +// Description: +// SIO init table in DXE phase. Any customers have to review below tables +// for themselves platform and make sure each initialization is necessary. +// +// Notes: +// In all tables, only fill with necessary setting. Don't fill with default +// +//<AMI_FHDR_END> +//************************************************************************* +#ifndef _DXEIoTable_H +#define _DXEIoTable_H +#ifdef __cplusplus +extern "C" { +#endif +//------------------------------------------------------------------------- +// Include Files +//------------------------------------------------------------------------- + +//------------------------------------------------------------------------- +// Constants, Macros and Type Definitions +//------------------------------------------------------------------------- +typedef struct _DXE_DEVICE_INIT_DATA{ + UINT16 Reg16; + UINT8 AndData8; // 0xFF means register don't need AndMask + // only write OrData8 to regisrer. + UINT8 OrData8; +} DXE_DEVICE_INIT_DATA; + +//------------------------------------------------------------------------- +//Variable, Prototype, and External Declarations +//------------------------------------------------------------------------- + +//<AMI_THDR_START> +//------------------------------------------------------------------------- +// +// Name: DXE_XXX_Init_Table +// +// Description: +// Table filled with SIO GPIO,PME,HWM, etc. logical devices' setting +// For example: +// 1. GPIO will define the GPIO pin useage +// 2. PME will power management control +// 3. HWM will set temperature, fan, voltage and start control. +// +// Notes: +// +//------------------------------------------------------------------------- +//<AMI_THDR_END> + +DXE_DEVICE_INIT_DATA DXE_COM_Mode_Init_Table[] = { + // ----------------------------- + //| Reg16 | AndData8 | OrData8 | + // ----------------------------- + // OEM_TODO: Base on OEM board. + // Program COM RS485/RS232 Mode Registers. + {0xF0, 0xCF, (F81866_COM1_RS485_Mode << 4)| (F81866_COM1_RS485_RTS_INV << 5)}, //make no effect when com1 disabled + {0xF0, 0xCF, (F81866_COM2_RS485_Mode << 4)| (F81866_COM2_RS485_RTS_INV << 5)}, //make no effect when com2 disabled + {0xF0, 0xCF, (F81866_COM3_RS485_Mode << 4)| (F81866_COM3_RS485_RTS_INV << 5)}, //make no effect when com3 disabled + {0xF0, 0xCF, (F81866_COM4_RS485_Mode << 4)| (F81866_COM4_RS485_RTS_INV << 5)}, //make no effect when com4 disabled + {0xF0, 0xCF, (F81866_COM5_RS485_Mode << 4)| (F81866_COM5_RS485_RTS_INV << 5)}, //make no effect when com5 disabled + {0xF0, 0xCF, (F81866_COM6_RS485_Mode << 4)| (F81866_COM6_RS485_RTS_INV << 5)}, //make no effect when com6 disabled +}; + +//------------------------------------------------------------------------- +// HWM registers init table. +//------------------------------------------------------------------------- +#if F81866_HWM_PRESENT +DXE_DEVICE_INIT_DATA DXE_HWM_Init_Table_After_Active[] = { + + // ----------------------------- + //| Reg16 | AndData8 | OrData8 | + // ----------------------------- + // Configuration Setting + {0x01, 0xF8, 0x03}, // Configuration Register ? Index 01h + + // PECI/TSI/SMBus Setting +#if (F81866_PECI_SUPPORT) + {0x0A, 0xDE, (F81866_INTEL_SEL << 5) | F81866_PECI_EN }, + {0x09, 0x01, F81866_I2C_ADDR & 0xFE }, +#endif +#if (F81866_IBEX_SUPPORT) + {0x0A, 0xDD, (F81866_INTEL_SEL << 5) | (F81866_IBEX_EN << 1)}, + {0x08, 0x01, F81866_SMBUS_ADDR & 0xFE}, + {0xEE, 0xFF, 0x41}, + {0xED, 0xFF, 0x40}, +#endif + + //PECI 3.0 & Temperture Setting + {0x6B, 0xF9, (F81866_T2_MODE << 2) | (F81866_T1_MODE << 1) }, + + //Fan type Setting +#if F81866_SMF_PRESENT + {0x94, 0xC0, (FAN3_TYPE<<4)|(FAN2_TYPE<<2)|FAN1_TYPE }, +#endif +}; //DXE_HWM_Init_Table + + +// Define a table for BootScriptTable of SIO space +UINT8 DXE_HWM_SIO_BootScript_Table[] = { + 0x01,0x08,0x09,0x0A,0x0D,0x6B,0x94,0xEE,0xED +}; +#endif + +/****** DO NOT WRITE BELOW THIS LINE *******/ +#ifdef __cplusplus +} +#endif +#endif //_DXEIoTable_H +//************************************************************************* +//************************************************************************* +//** ** +//** (C)Copyright 1985-2011, American Megatrends, Inc. ** +//** ** +//** All Rights Reserved. ** +//** ** +//** 5555 Oakbrook Parkway, Suite 200, Norcross, GA 30093 ** +//** ** +//** Phone: (770)-246-8600 ** +//** ** +//************************************************************************* +//************************************************************************* + diff --git a/Board/IO/F81866/BSP/F81866HwmOemHooks.c b/Board/IO/F81866/BSP/F81866HwmOemHooks.c new file mode 100644 index 0000000..0ffa3c6 --- /dev/null +++ b/Board/IO/F81866/BSP/F81866HwmOemHooks.c @@ -0,0 +1,733 @@ +//************************************************************************* +//************************************************************************* +//** ** +//** (C)Copyright 1985-2011, 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/F81866HwmOemHooks.c 1 7/20/11 4:22a Kasalinyi $ +// +// $Revision: 1 $ +// +// $Date: 7/20/11 4:22a $ +//************************************************************************* +// Revision History +// ---------------- +// $Log: /Alaska/BIN/IO/Fintek/F81866/F81866 Board/F81866HwmOemHooks.c $ +// +// 1 7/20/11 4:22a Kasalinyi +// [Category] Improvement +// [Description] Initial Porting +// [Files] BSP.cif +// OemIoDecode.c +// PeiIoTable.h +// DxeIoTable.h +// F81866HwmOemHooks.c +// F81866SmartFan.c +// +// 1 3/21/11 9:44p Mikes +//************************************************************************* +//<AMI_FHDR_START> +// +// Name: <F81866HwmOemHooks.c> +// +// Description: This is related to individual HHM devices. +// +//<AMI_FHDR_END> +//************************************************************************* +//------------------------------------------------------------------------- +// Include Files +//------------------------------------------------------------------------- +#include "..\F81866Setup.H" +#include <AmiLib.h> +#include <AmiDxeLib.h> + +//------------------------------------------------------------------------- +// Constants, Macros and Type Definitions +//------------------------------------------------------------------------- + +//------------------------------------------------------------------------- +//Variable, Prototype, and External Declarations +//------------------------------------------------------------------------- +void +GetValueWithIO ( + IN UINT8 BankNo, + IN UINT8 Register, + OUT UINTN *Value +); + +////////////////////////////////////////////////////////////////////////////// +////////////OEM PORTING REQUIRED/////////////OEM PORTING REQUIRED///////////// +////////////////////////////////////////////////////////////////////////////// +//<AMI_PHDR_START> +//------------------------------------------------------------------------- +// Procedure: GetAndUpdateTemperature1 +// +// Description: +// Get Temperature1 value in HWM space register and update to HII. +// +// Input: +// UINTN IN OUT HWM_DATA * Data +// +// Output: +// None +// +//------------------------------------------------------------------------- +//<AMI_PHDR_END> +void +GetAndUpdateTemperature1( + IN OUT HWM_DATA * Data +) +{ + UINTN T1; + + Data->Token = STRING_TOKEN(STR_F81866_SYSTEM_TEMP1_VALUE); + Data->Type = TEMPERATURE; + Data->OddPos = 0x00; + + //OEM_TODO:Get value with HWM IO interface + GetValueWithIO(0x00,0x72,&T1); // Bank0 Register 0x72. + Data->Value = (UINT16)T1; + + + return; +} + + +//<AMI_PHDR_START> +//------------------------------------------------------------------------- +// Procedure: GetAndUpdateTemperature2 +// +// Description: +// Get the second System temperature value in HWM space register and update +// to HII. +// +// Input: +// UINTN IN OUT HWM_DATA * Data +// +// Output: +// None +// +//------------------------------------------------------------------------- +//<AMI_PHDR_END> +void +GetAndUpdateTemperature2 ( + IN OUT HWM_DATA * Data + ) +{ + UINTN T1; + + Data->Token = STRING_TOKEN(STR_F81866_SYSTEM_TEMP2_VALUE); + Data->Type = TEMPERATURE; + Data->OddPos = 0x00; + + //OEM_TODO:Get value with HWM IO interface + GetValueWithIO(0x00,0x74,&T1); // Bank0 Register 0x74. + Data->Value = (UINT16)T1; + + return; +} + +//<AMI_PHDR_START> +//------------------------------------------------------------------------- +// Procedure: GetAndUpdateTemperature3 +// +// Description: +// Get the second System temperature value in HWM space register and update +// to Hii. +// +// Input: +// UINTN IN OUT HWM_DATA * Data +// +// Output: +// None +// +//------------------------------------------------------------------------- +//<AMI_PHDR_END> +void +GetAndUpdateTemperature3 ( + IN OUT HWM_DATA * Data + ) +{ + UINTN T1; + + Data->Token = STRING_TOKEN(STR_F81866_SYSTEM_TEMP3_VALUE); + Data->Type = TEMPERATURE; + Data->OddPos = 0x00; + + //OEM_TODO:Get value with HWM IO interface + GetValueWithIO(0x00,0x7E,&T1); // Bank0 Register 0x7E. + Data->Value = (UINT16)T1; + + return; +} + +//<AMI_PHDR_START> +//------------------------------------------------------------------------- +// Procedure: GetAndUpdateTemperature4 +// +// Description: +// Get the second System temperature value in HWM space register and update +// to HII. +// +// Input: +// UINTN IN OUT HWM_DATA * Data +// +// Output: +// None + +// +//------------------------------------------------------------------------- +//<AMI_PHDR_END> +void +GetAndUpdateTemperature4 ( + IN OUT HWM_DATA * Data + ) +{ + UINTN T1; + + Data->Token = STRING_TOKEN(STR_F81866_SYSTEM_TEMP4_VALUE); + Data->Type = TEMPERATURE; + Data->OddPos = 0x00; + + //OEM_TODO:Get value with HWM IO interface + GetValueWithIO(0x00,0x7A,&T1); // Bank0 Register 0x7A. + Data->Value = (UINT16)T1; + + return; +} + +//<AMI_PHDR_START> +//------------------------------------------------------------------------- +// Procedure: GetAndUpdateTemperature5 +// +// Description: +// Get the second System temperature value in HWM space register and update +// to HII. +// +// Input: +// UINTN IN OUT HWM_DATA * Data +// +// Output: +// None + +// +//------------------------------------------------------------------------- +//<AMI_PHDR_END> +void +GetAndUpdateTemperature5 ( + IN OUT HWM_DATA * Data + ) +{ + UINTN T1; + + Data->Token = STRING_TOKEN(STR_F81866_SYSTEM_TEMP5_VALUE); + Data->Type = TEMPERATURE; + Data->OddPos = 0x00; + + //OEM_TODO:Get value with HWM IO interface + GetValueWithIO(0x00,0x7B,&T1); // Bank0 Register 0x7B. + Data->Value = (UINT16)T1; + + return; +} + +//<AMI_PHDR_START> +//------------------------------------------------------------------------- +// Procedure: GetAndUpdateTemperature6 +// +// Description: +// Get the second System temperature value in HWM space register and update +// to HII. +// +// Input: +// UINTN IN OUT HWM_DATA * Data +// +// Output: +// None + +// +//------------------------------------------------------------------------- +//<AMI_PHDR_END> +void +GetAndUpdateTemperature6 ( + IN OUT HWM_DATA * Data + ) +{ + UINTN T1; + + Data->Token = STRING_TOKEN(STR_F81866_SYSTEM_TEMP6_VALUE); + Data->Type = TEMPERATURE; + Data->OddPos = 0x00; + + //OEM_TODO:Get value with HWM IO interface + GetValueWithIO(0x00,0x7C,&T1); // Bank0 Register 0x7C. + Data->Value = (UINT16)T1; + + return; +} + + +//<AMI_PHDR_START> +//------------------------------------------------------------------------- +// Procedure: GetAndUpdateFan1Speed +// +// Description: +// Get the First FAN Speed value in HWM space register and update it to HII. +// +// Input: +// UINTN IN OUT HWM_DATA * Data +// +// Output: +// None + +// +//------------------------------------------------------------------------- +//<AMI_PHDR_END> +void +GetAndUpdateFan1Speed ( + IN OUT HWM_DATA * Data + ) +{ + UINTN Speed; + UINTN Divisor; + + Data->Token = STRING_TOKEN(STR_F81866_FAN1_SPEED_VALUE); + Data->Type = FAN_SPEED; + Data->OddPos = 0x00; + + //OEM_TODO:Get value with HWM IO interface + GetValueWithIO(0x00,0xA0,&Speed); // Register 0xA0 + Divisor = (UINT8)Speed << 8; + GetValueWithIO(0x00,0xA1,&Speed); // Register 0xA1 + Divisor |= (UINT8) Speed; + if( (Divisor == 0xFFFF) || (Divisor == 0x0FFF) || (Divisor == 0 )) { + Speed = 0; + } else { + Speed = (UINTN)1500000/Divisor; + } + Data->Value = (UINT16)Speed; + + return; +} + +//<AMI_PHDR_START> +//------------------------------------------------------------------------- +// Procedure: GetAndUpdateFan2Speed +// +// Description: +// Get FAN2 Speed value in HWM space register and update it to HII. +// +// Input: +// UINTN IN OUT HWM_DATA * Data +// +// Output: +// None +// +//------------------------------------------------------------------------- +//<AMI_PHDR_END> +void +GetAndUpdateFan2Speed ( + IN OUT HWM_DATA * Data + ) +{ + UINTN Speed; + UINTN Divisor; + + Data->Token = STRING_TOKEN(STR_F81866_FAN2_SPEED_VALUE); + Data->Type = FAN_SPEED; + Data->OddPos = 0x00; + + //OEM_TODO:Get value with HWM IO interface + GetValueWithIO(0x00,0xB0,&Speed); // Register 0xA0 + Divisor = (UINT8)Speed << 8; + GetValueWithIO(0x00,0xB1,&Speed); // Register 0xA1 + Divisor |= (UINT8) Speed; + + if( (Divisor == 0xFFFF) || (Divisor == 0x0FFF) || (Divisor == 0 )) { + Speed = 0; + } else { + Speed = (UINTN)1500000/Divisor; + } + + Data->Value = (UINT16)Speed; + + return; +} + +//<AMI_PHDR_START> +//------------------------------------------------------------------------- +// Procedure: GetAndUpdateFan3Speed +// +// Description: +// Get FAN2 Speed value in HWM space register. +// +// Input: +// UINTN IN OUT HWM_DATA * Data +// +// Output: +// None +// +//------------------------------------------------------------------------- +//<AMI_PHDR_END> +void +GetAndUpdateFan3Speed ( + IN OUT HWM_DATA * Data + ) +{ + UINTN Speed; + UINTN Divisor; + + Data->Token = STRING_TOKEN(STR_F81866_FAN3_SPEED_VALUE); + Data->Type = FAN_SPEED; + Data->OddPos = 0x00; + + //OEM_TODO:Get value with HWM IO interface + GetValueWithIO(0x00,0xC0,&Speed); // Register 0xA0 + Divisor = (UINT8)Speed << 8; + GetValueWithIO(0x00,0xC1,&Speed); // Register 0xA1 + Divisor |= (UINT8) Speed; + + if( (Divisor == 0xFFFF) || (Divisor == 0x0FFF) || (Divisor == 0 )) { + Speed = 0; + } else { + Speed = (UINTN)1500000/Divisor; + } + Data->Value = (UINT16)Speed; + + return; +} + + +//<AMI_PHDR_START> +//------------------------------------------------------------------------- +// Procedure: GetAndUpdateVIN1Voltage +// +// Description: Get the Voltage value in HWM space register. +// +// Input: +// UINTN IN OUT HWM_DATA * Data +// +// Output: +// None +// +//------------------------------------------------------------------------- +//<AMI_PHDR_END> +void +GetAndUpdateVIN1Voltage ( + IN OUT HWM_DATA * Data + ) +{ + UINTN VIN1; + + Data->Token = STRING_TOKEN(STR_F81866_HMM_VIN1_VALUE); + Data->Type = VOLTAGE; + Data->OddPos = 0x03; + + //OEM_TODO:Get value with HWM IO interface + GetValueWithIO(0x00,0x21,&VIN1) ; // Register 0x21 + VIN1 = VIN1*8; + + Data->Value = (UINT16)VIN1; + + return; + +} + +//<AMI_PHDR_START> +//------------------------------------------------------------------------- +// Procedure: GetAndUpdateVIN2Voltage +// +// Description: Get the Voltage value in HWM space register. +// +// Input: +// UINTN IN OUT HWM_DATA * Data +// +// Output: +// None +// +//------------------------------------------------------------------------- +//<AMI_PHDR_END> +void +GetAndUpdateVIN2Voltage ( + IN OUT HWM_DATA * Data + ) +{ + UINTN VIN2; + + Data->Token = STRING_TOKEN(STR_F81866_HMM_VIN2_VALUE); + Data->Type = VOLTAGE; + Data->OddPos = 0x03; + + //OEM_TODO:Get value with HWM IO interface + GetValueWithIO(0x00,0x22,&VIN2) ; // Register 0x22 + VIN2 = VIN2*8*(20+47)/47; + Data->Value = (UINT16)VIN2; + + return; +} + +//<AMI_PHDR_START> +//------------------------------------------------------------------------- +// Procedure: GetAndUpdateVIN3Voltage +// +// Description: +// Get the Voltage value in HWM space register. +// +// Input: +// UINTN IN OUT HWM_DATA * Data +// +// Output: +// None +// +//------------------------------------------------------------------------- +//<AMI_PHDR_END> +void +GetAndUpdateVIN3Voltage ( + IN OUT HWM_DATA * Data + ) +{ + UINTN VIN3; + + Data->Token = STRING_TOKEN(STR_F81866_HMM_VIN3_VALUE); + Data->Type = VOLTAGE; + Data->OddPos = 0x03; + + //OEM_TODO:Get value with HWM IO interface + GetValueWithIO(0x00,0x23,&VIN3) ; // Register 0x23 + VIN3 = VIN3*8; + Data->Value = (UINT16)VIN3; + + return; +} + +//<AMI_PHDR_START> +//------------------------------------------------------------------------- +// Procedure: GetAndUpdateVIN4Voltage +// +// Description: +// Get the Voltage value in HWM space register. +// +// Input: +// UINTN IN OUT HWM_DATA * Data +// +// Output: +// None +// +//------------------------------------------------------------------------- +//<AMI_PHDR_END> +void +GetAndUpdateVIN4Voltage ( + IN OUT HWM_DATA * Data + ) +{ + UINTN VIN4; + + Data->Token = STRING_TOKEN(STR_F81866_HMM_VIN4_VALUE); + Data->Type = VOLTAGE; + Data->OddPos = 0x03; + + //OEM_TODO:Get value with HWM IO interface + GetValueWithIO(0x00,0x24,&VIN4) ; // Register 0x24 + VIN4 = VIN4*8*(100+100)/100; + Data->Value = (UINT16)VIN4; + + return; +} + +//<AMI_PHDR_START> +//------------------------------------------------------------------------- +// Procedure: GetAndUpdateVSB5VVoltage +// +// Description: +// Get the Voltage value in HWM space register. +// +// Input: +// UINTN IN OUT HWM_DATA * Data +// +// Output: +// None +// +//------------------------------------------------------------------------- +//<AMI_PHDR_END> +void +GetAndUpdateVSB5VVoltage ( + IN OUT HWM_DATA * Data +) +{ + UINTN VSB5V; + + Data->Token = STRING_TOKEN(STR_F81866_HMM_VSB5V_VALUE); + Data->Type = VOLTAGE; + Data->OddPos = 0x03; + + //OEM_TODO:Get value with HWM IO interface + GetValueWithIO(0x00,0x27,&VSB5V) ; // Register 0x27 + VSB5V = VSB5V*8*2; + Data->Value = (UINT16)VSB5V; + + return; +} + +//<AMI_PHDR_START> +//------------------------------------------------------------------------- +// Procedure: GetAndUpdateVCC3VVoltage +// +// Description: +// Get the Voltage value in HWM space register. +// +// Input: +// UINTN IN OUT HWM_DATA * Data +// +// Output: +// None + +// +//------------------------------------------------------------------------- +//<AMI_PHDR_END> +void +GetAndUpdateVCC3VVoltage ( + IN OUT HWM_DATA * Data +) +{ + UINTN VCC3V; + + Data->Token = STRING_TOKEN(STR_F81866_HMM_VCC3V_VALUE); + Data->Type = VOLTAGE; + Data->OddPos = 0x03; + + //OEM_TODO:Get value with HWM IO interface + GetValueWithIO(0x00,0x20,&VCC3V) ; // Register 0x20 + VCC3V = VCC3V * 8 * 2; + + Data->Value = (UINT16)VCC3V; + + return; +} + +//<AMI_PHDR_START> +//------------------------------------------------------------------------- +// Procedure: GetAndUpdateVSB3VVoltage +// +// Description: +// Get the Voltage value in HWM space register. +// +// Input: +// UINTN IN OUT HWM_DATA * Data +// +// Output: +// None + +// +//------------------------------------------------------------------------- +//<AMI_PHDR_END> +void +GetAndUpdateVSB3VVoltage ( + IN OUT HWM_DATA * Data + ) +{ + UINTN VSB3V; + + Data->Token = STRING_TOKEN(STR_F81866_HMM_VSB3V_VALUE); + Data->Type = VOLTAGE; + Data->OddPos = 0x03; + + //OEM_TODO:Get value with HWM IO interface + GetValueWithIO(0x00,0x25,&VSB3V) ; // Register 0x25 + VSB3V = VSB3V * 8 * 2 ; + + Data->Value = (UINT16)VSB3V; + + return; +} + +//<AMI_PHDR_START> +//------------------------------------------------------------------------- +// Procedure: GetAndUpdateVBATVoltage +// +// Description: +// Get the Voltage value in HWM space register. +// +// Input: +// UINTN IN OUT HWM_DATA * Data +// +// Output: +// None + +// +//------------------------------------------------------------------------- +//<AMI_PHDR_END> +void +GetAndUpdateVBATVoltage ( + IN OUT HWM_DATA * Data +) +{ + UINTN VBAT; + + Data->Token = STRING_TOKEN(STR_F81866_HMM_VBAT_VALUE); + Data->Type = VOLTAGE; + Data->OddPos = 0x03; + + //OEM_TODO:Get value with HWM IO interface + GetValueWithIO(0x00,0x26,&VBAT) ; // Register 0x26 + VBAT = VBAT*8*2; + Data->Value = (UINT16)VBAT; + + return; +} + +//<AMI_PHDR_START> +//------------------------------------------------------------------------- +// Procedure: GetValueWithIO +// +// Description: +// Get the register value form HWM space register. +// +// Input: +// UINT8 BankNo, +// UINT8 Register -> Register who content the wanted value +// UINTN *Value -> Register value +// +// Output: +// None +// +//------------------------------------------------------------------------- +//<AMI_PHDR_END> +void +GetValueWithIO ( + IN UINT8 BankNo, + IN UINT8 Register, + OUT UINTN *Value +) +{ + + // Enter Bank NO! + + //Read the data from register + IoWrite8(F81866_HWM_BASE_ADDRESS+0x05, Register); + *Value = IoRead8(F81866_HWM_BASE_ADDRESS+0x06); + return; +} + +//************************************************************************* +//************************************************************************* +//** ** +//** (C)Copyright 1985-2011, American Megatrends, Inc. ** +//** ** +//** All Rights Reserved. ** +//** ** +//** 5555 Oakbrook Parkway, Suite 200, Norcross, GA 30093 ** +//** ** +//** Phone: (770)-246-8600 ** +//** ** +//************************************************************************* +//************************************************************************* + diff --git a/Board/IO/F81866/BSP/F81866SmartFan.c b/Board/IO/F81866/BSP/F81866SmartFan.c new file mode 100644 index 0000000..674a73e --- /dev/null +++ b/Board/IO/F81866/BSP/F81866SmartFan.c @@ -0,0 +1,467 @@ +//************************************************************************* +//************************************************************************* +//** ** +//** (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 HWM_CONFIG_INDEX F81866_HWM_BASE_ADDRESS+5 +#define HWM_CONFIG_DATA F81866_HWM_BASE_ADDRESS+6 +SETUP_DATA SetupData; +static EFI_EVENT gEvtReadyToBoot = NULL; +static EFI_GUID gEfiBootScriptSaveGuid = EFI_BOOT_SCRIPT_SAVE_GUID; + +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 +//---------------------------------------------------------------------------------------------- +DXE_SMF_INIT_DATA DXE_FAN1_INIT_TABLE[] = { + {0x96, 0xFC, 0x00}, + {0xA2, 0xFF, 0x00}, + {0xA3, 0xFF, 0x00}, + {0xA6, 0xFF, 0x00}, + {0xA7, 0xFF, 0x00}, + {0xA8, 0xFF, 0x00}, + {0xA9, 0XFF, 0x00}, + {0xAB, 0xFF, 0x00}, + {0xAC, 0xFF, 0x00}, + {0xAD, 0xFF, 0x00}, + {0xAE, 0xFF, 0x00}, +}; + +DXE_SMF_INIT_DATA DXE_FAN2_INIT_TABLE[] = { + {0x96, 0xF3, 0x00}, + {0xB2, 0xFF, 0x00}, + {0xB3, 0xFF, 0x00}, + {0xB6, 0xFF, 0x00}, + {0xB7, 0xFF, 0x00}, + {0xB8, 0xFF, 0x00}, + {0xB9, 0XFF, 0x00}, + {0xBB, 0xFF, 0x00}, + {0xBC, 0xFF, 0x00}, + {0xBD, 0xFF, 0x00}, + {0xBE, 0xFF, 0x00}, +}; + +DXE_SMF_INIT_DATA DXE_FAN3_INIT_TABLE[] = { + {0x96, 0xCF, 0x00}, + {0xC2, 0xFF, 0x00}, + {0xC3, 0xFF, 0x00}, + {0xC6, 0xFF, 0x00}, + {0xC7, 0xFF, 0x00}, + {0xC8, 0xFF, 0x00}, + {0xC9, 0XFF, 0x00}, + {0xCB, 0xFF, 0x00}, + {0xCC, 0xFF, 0x00}, + {0xCD, 0xFF, 0x00}, + {0xCE, 0xFF, 0x00}, +}; + +S3_SAVE_DATA HwmS3SaveRegisterTbl[] = { +// ---------------------- +//| Bank | Reg8 | +// ---------------------- + {0x00,0x94}, + {0x00,0x96}, + {0x00,0xA2}, + {0x00,0xA3}, + {0x00,0xA6}, + {0x00,0xA7}, + {0x00,0xA8}, + {0x00,0xA9}, + {0x00,0xAB}, + {0x00,0xAC}, + {0x00,0xAD}, + {0x00,0xAE}, + {0x00,0xB2}, + {0x00,0xB3}, + {0x00,0xB6}, + {0x00,0xB7}, + {0x00,0xB8}, + {0x00,0xB9}, + {0x00,0xBB}, + {0x00,0xBC}, + {0x00,0xBD}, + {0x00,0xBE}, + {0x00,0xC2}, + {0x00,0xC3}, + {0x00,0xC6}, + {0x00,0xC7}, + {0x00,0xC8}, + {0x00,0xC9}, + {0x00,0xCB}, + {0x00,0xCC}, + {0x00,0xCD}, + {0x00,0xCE}, +}; +//-------------------------------------------------------------------------- +// Definition of smart fan functions +//-------------------------------------------------------------------------- +VOID F81866SmartFunction (VOID); +static VOID SmartFanFuncStart(VOID); +static VOID F81866_SMF1_INIT(void); +static VOID F81866_SMF2_INIT(void); +static VOID F81866_SMF3_INIT(void); +static void F81866_SMF_WRITE_CFG(DXE_SMF_INIT_DATA DXE_SMF_MODEx_Table); +static EFI_STATUS HwmCallbackReadyToBoot( + IN EFI_EVENT Event, + IN VOID *Context); +//<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; + + //Get Setup variable + Status=pRS->GetVariable( L"Setup", &SetupGuid, NULL, &Size, &SetupData); + if(Status != EFI_SUCCESS) return; + + //Init the smart fan function + if(SetupData.SmartFanEnable) + SmartFanFuncStart(); +} + +//<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(VOID) +{ + EFI_STATUS Status; + //-------------------------------------------------------------------------- + // Before speed control, program neccessary registers if needed. + //-------------------------------------------------------------------------- + + //-------------------------------------------------------------------------- + // Start to program the smart fan mode + //-------------------------------------------------------------------------- + F81866_SMF1_INIT(); + F81866_SMF2_INIT(); + F81866_SMF3_INIT(); + //Create event for boot script + Status = CreateReadyToBootEvent( + TPL_NOTIFY, + HwmCallbackReadyToBoot, + NULL, + &gEvtReadyToBoot + ); + ASSERT_EFI_ERROR(Status); +} + +//<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(VOID) +{ + UINT8 i, temp; + switch (SetupData.Fan1SmartFanMode) { + case 0: + DXE_FAN1_INIT_TABLE[0].OrData8 = 0x02;//mode + DXE_FAN1_INIT_TABLE[1].OrData8 = (UINT8)(1500000/SetupData.Fan1Mode0FixedSpeed >> 8);//mode + DXE_FAN1_INIT_TABLE[2].OrData8 = (UINT8)(1500000/SetupData.Fan1Mode0FixedSpeed & 0xFF);//mode + break; + case 1: + DXE_FAN1_INIT_TABLE[0].OrData8 = 0x03;//mode + DXE_FAN1_INIT_TABLE[2].OrData8 = (UINT8)SetupData.Fan1Mode1FixedDuty*0xFF/100;//mode + break; + case 2: + DXE_FAN1_INIT_TABLE[0].OrData8 = 0x00;//mode + DXE_FAN1_INIT_TABLE[3].OrData8 = SetupData.Fan1Mode2AutoRpmT1; + DXE_FAN1_INIT_TABLE[4].OrData8 = SetupData.Fan1Mode2AutoRpmT2; + DXE_FAN1_INIT_TABLE[5].OrData8 = SetupData.Fan1Mode2AutoRpmT3; + DXE_FAN1_INIT_TABLE[6].OrData8 = SetupData.Fan1Mode2AutoRpmT4; + DXE_FAN1_INIT_TABLE[7].OrData8 = (UINT8)((100-SetupData.Fan1Mode2AutoRpmF1)*32/60); + DXE_FAN1_INIT_TABLE[8].OrData8 = (UINT8)((100-SetupData.Fan1Mode2AutoRpmF2)*32/60); + DXE_FAN1_INIT_TABLE[9].OrData8 = (UINT8)((100-SetupData.Fan1Mode2AutoRpmF3)*32/60); + DXE_FAN1_INIT_TABLE[10].OrData8 = (UINT8)((100-SetupData.Fan1Mode2AutoRpmF4)*32/60); + break; + case 3: + DXE_FAN1_INIT_TABLE[0].OrData8 = 0x01;//mode + DXE_FAN1_INIT_TABLE[3].OrData8 = SetupData.Fan1Mode3AutoDutyT1; + DXE_FAN1_INIT_TABLE[4].OrData8 = SetupData.Fan1Mode3AutoDutyT2; + DXE_FAN1_INIT_TABLE[5].OrData8 = SetupData.Fan1Mode3AutoDutyT3; + DXE_FAN1_INIT_TABLE[6].OrData8 = SetupData.Fan1Mode3AutoDutyT4; + DXE_FAN1_INIT_TABLE[7].OrData8 = (UINT8)(SetupData.Fan1Mode3AutoDutyF1*0xFF/100); + DXE_FAN1_INIT_TABLE[8].OrData8 = (UINT8)(SetupData.Fan1Mode3AutoDutyF2*0xFF/100); + DXE_FAN1_INIT_TABLE[9].OrData8 = (UINT8)(SetupData.Fan1Mode3AutoDutyF3*0xFF/100); + DXE_FAN1_INIT_TABLE[10].OrData8 = (UINT8)(SetupData.Fan1Mode3AutoDutyF4*0xFF/100); + break; + default: + break; + } + for(i=0; i<( (sizeof(DXE_FAN1_INIT_TABLE))/(sizeof(DXE_SMF_INIT_DATA)) ); i++) { + IoWrite8(HWM_CONFIG_INDEX, DXE_FAN1_INIT_TABLE[i].Reg8 ); + if(DXE_FAN1_INIT_TABLE[i].AndData8 == 0xFF) { + temp = DXE_FAN1_INIT_TABLE[i].OrData8; + } else { + temp = IoRead8(HWM_CONFIG_DATA); + temp &= DXE_FAN1_INIT_TABLE[i].AndData8; + temp |= DXE_FAN1_INIT_TABLE[i].OrData8; + } + IoWrite8(HWM_CONFIG_DATA, temp); + } +} + +//<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(VOID) +{ + UINT8 i, temp; + switch (SetupData.Fan2SmartFanMode) { + case 0: + DXE_FAN2_INIT_TABLE[0].OrData8 = 0x02 << 2;//mode + DXE_FAN2_INIT_TABLE[1].OrData8 = (UINT8)(1500000/SetupData.Fan2Mode0FixedSpeed >> 8);//mode + DXE_FAN2_INIT_TABLE[2].OrData8 = (UINT8)(1500000/SetupData.Fan2Mode0FixedSpeed & 0xFF);//mode + break; + case 1: + DXE_FAN2_INIT_TABLE[0].OrData8 = 0x03 << 2;//mode + DXE_FAN2_INIT_TABLE[2].OrData8 = (UINT8)(SetupData.Fan2Mode1FixedDuty*0xFF/100);//mode + break; + case 2: + DXE_FAN2_INIT_TABLE[0].OrData8 = 0x00 << 2;//mode + DXE_FAN2_INIT_TABLE[3].OrData8 = SetupData.Fan2Mode2AutoRpmT1; + DXE_FAN2_INIT_TABLE[4].OrData8 = SetupData.Fan2Mode2AutoRpmT2; + DXE_FAN2_INIT_TABLE[5].OrData8 = SetupData.Fan2Mode2AutoRpmT3; + DXE_FAN2_INIT_TABLE[6].OrData8 = SetupData.Fan2Mode2AutoRpmT4; + DXE_FAN2_INIT_TABLE[7].OrData8 = (UINT8)((100-SetupData.Fan2Mode2AutoRpmF1)*32/60); + DXE_FAN2_INIT_TABLE[8].OrData8 = (UINT8)((100-SetupData.Fan2Mode2AutoRpmF2)*32/60); + DXE_FAN2_INIT_TABLE[9].OrData8 = (UINT8)((100-SetupData.Fan2Mode2AutoRpmF3)*32/60); + DXE_FAN2_INIT_TABLE[10].OrData8 = (UINT8)((100-SetupData.Fan2Mode2AutoRpmF4)*32/60); + break; + case 3: + DXE_FAN2_INIT_TABLE[0].OrData8 = 0x01 << 2;//mode + DXE_FAN2_INIT_TABLE[3].OrData8 = SetupData.Fan2Mode3AutoDutyT1; + DXE_FAN2_INIT_TABLE[4].OrData8 = SetupData.Fan2Mode3AutoDutyT2; + DXE_FAN2_INIT_TABLE[5].OrData8 = SetupData.Fan2Mode3AutoDutyT3; + DXE_FAN2_INIT_TABLE[6].OrData8 = SetupData.Fan2Mode3AutoDutyT4; + DXE_FAN2_INIT_TABLE[7].OrData8 = (UINT8)(SetupData.Fan2Mode3AutoDutyF1*0xFF/100); + DXE_FAN2_INIT_TABLE[8].OrData8 = (UINT8)(SetupData.Fan2Mode3AutoDutyF2*0xFF/100); + DXE_FAN2_INIT_TABLE[9].OrData8 = (UINT8)(SetupData.Fan2Mode3AutoDutyF3*0xFF/100); + DXE_FAN2_INIT_TABLE[10].OrData8 = (UINT8)(SetupData.Fan2Mode3AutoDutyF4*0xFF/100); + break; + default: + break; + } + for(i=0; i<( (sizeof(DXE_FAN2_INIT_TABLE))/(sizeof(DXE_SMF_INIT_DATA)) ); i++) { + IoWrite8(HWM_CONFIG_INDEX, DXE_FAN2_INIT_TABLE[i].Reg8 ); + if(DXE_FAN2_INIT_TABLE[i].AndData8 == 0xFF) { + temp = DXE_FAN2_INIT_TABLE[i].OrData8; + } else { + temp = IoRead8(HWM_CONFIG_DATA); + temp &= DXE_FAN2_INIT_TABLE[i].AndData8; + temp |= DXE_FAN2_INIT_TABLE[i].OrData8; + } + IoWrite8(HWM_CONFIG_DATA, temp); + } +} + +//<AMI_PHDR_START> +//--------------------------------------------------------------------------- +// Procedure: F81866_SMF3_INIT +// +// Description: This function do smart fan3 config +// +// Input: NULL +// +// +// Output: NULL +// +//--------------------------------------------------------------------------- +//<AMI_PHDR_END> +void F81866_SMF3_INIT(VOID) +{ + UINT8 i, temp; + switch (SetupData.Fan3SmartFanMode) { + case 0: + DXE_FAN3_INIT_TABLE[0].OrData8 = 0x02 << 4;//mode + DXE_FAN3_INIT_TABLE[1].OrData8 = (UINT8)(1500000/SetupData.Fan3Mode0FixedSpeed >> 8);//mode + DXE_FAN3_INIT_TABLE[2].OrData8 = (UINT8)(1500000/SetupData.Fan3Mode0FixedSpeed & 0xFF);//mode + break; + case 1: + DXE_FAN3_INIT_TABLE[0].OrData8 = 0x03 << 4;//mode + DXE_FAN3_INIT_TABLE[2].OrData8 = (UINT8)(SetupData.Fan3Mode1FixedDuty*0xFF/100);//mode + break; + case 2: + DXE_FAN3_INIT_TABLE[0].OrData8 = 0x00 << 4;//mode + DXE_FAN3_INIT_TABLE[3].OrData8 = SetupData.Fan3Mode2AutoRpmT1; + DXE_FAN3_INIT_TABLE[4].OrData8 = SetupData.Fan3Mode2AutoRpmT2; + DXE_FAN3_INIT_TABLE[5].OrData8 = SetupData.Fan3Mode2AutoRpmT3; + DXE_FAN3_INIT_TABLE[6].OrData8 = SetupData.Fan3Mode2AutoRpmT4; + DXE_FAN3_INIT_TABLE[7].OrData8 = (UINT8)((100-SetupData.Fan3Mode2AutoRpmF1)*32/60); + DXE_FAN3_INIT_TABLE[8].OrData8 = (UINT8)((100-SetupData.Fan3Mode2AutoRpmF2)*32/60); + DXE_FAN3_INIT_TABLE[9].OrData8 = (UINT8)((100-SetupData.Fan3Mode2AutoRpmF3)*32/60); + DXE_FAN3_INIT_TABLE[10].OrData8 = (UINT8)((100-SetupData.Fan3Mode2AutoRpmF4)*32/60); + break; + case 3: + DXE_FAN3_INIT_TABLE[0].OrData8 = 0x01 << 4;//mode + DXE_FAN3_INIT_TABLE[3].OrData8 = SetupData.Fan3Mode3AutoDutyT1; + DXE_FAN3_INIT_TABLE[4].OrData8 = SetupData.Fan3Mode3AutoDutyT2; + DXE_FAN3_INIT_TABLE[5].OrData8 = SetupData.Fan3Mode3AutoDutyT3; + DXE_FAN3_INIT_TABLE[6].OrData8 = SetupData.Fan3Mode3AutoDutyT4; + DXE_FAN3_INIT_TABLE[7].OrData8 = (UINT8)(SetupData.Fan3Mode3AutoDutyF1*0xFF/100); + DXE_FAN3_INIT_TABLE[8].OrData8 = (UINT8)(SetupData.Fan3Mode3AutoDutyF2*0xFF/100); + DXE_FAN3_INIT_TABLE[9].OrData8 = (UINT8)(SetupData.Fan3Mode3AutoDutyF3*0xFF/100); + DXE_FAN3_INIT_TABLE[10].OrData8 = (UINT8)(SetupData.Fan3Mode3AutoDutyF4*0xFF/100); + break; + default: + break; + } + for(i=0; i<( (sizeof(DXE_FAN3_INIT_TABLE))/(sizeof(DXE_SMF_INIT_DATA)) ); i++) { + IoWrite8(HWM_CONFIG_INDEX, DXE_FAN3_INIT_TABLE[i].Reg8 ); + if(DXE_FAN3_INIT_TABLE[i].AndData8 == 0xFF) { + temp = DXE_FAN3_INIT_TABLE[i].OrData8; + } else { + temp = IoRead8(HWM_CONFIG_DATA); + temp &= DXE_FAN3_INIT_TABLE[i].AndData8; + temp |= DXE_FAN3_INIT_TABLE[i].OrData8; + } + IoWrite8(HWM_CONFIG_DATA, temp); + } +} + +//<AMI_PHDR_START> +//--------------------------------------------------------------------------- +// Procedure: HwmCallbackReadyToBoot +// +// Description: This function save registers for S3 +// +// Input: NULL +// +// +// Output: NULL +// +//--------------------------------------------------------------------------- +//<AMI_PHDR_END> +static EFI_STATUS HwmCallbackReadyToBoot( + IN EFI_EVENT Event, + IN VOID *Context) +{ + EFI_BOOT_SCRIPT_SAVE_PROTOCOL *bss; + EFI_STATUS Status; + UINT8 bank_reg,bank,r,v,i; + + Status = pBS->LocateProtocol(&gEfiBootScriptSaveGuid,NULL,&bss); + if(EFI_ERROR(Status)) return Status; + + // record the register from table into boot script + for (i=0; i < ((sizeof(HwmS3SaveRegisterTbl))/(sizeof(S3_SAVE_DATA))); i++) { + bank = HwmS3SaveRegisterTbl[i].Bank; + bank_reg = 0x4e; + r = HwmS3SaveRegisterTbl[i].Reg8; + + //select bank + IoWrite8(HWM_CONFIG_INDEX, bank_reg); + IoWrite8(HWM_CONFIG_DATA, bank); + //select register to read actual data + IoWrite8(HWM_CONFIG_INDEX, r); + v = IoRead8(HWM_CONFIG_DATA); + //save to s3 bootscrip table + BOOT_SCRIPT_S3_IO_WRITE_MACRO(bss,EfiBootScriptWidthUint8,HWM_CONFIG_INDEX, 1, &bank_reg); + BOOT_SCRIPT_S3_IO_WRITE_MACRO(bss,EfiBootScriptWidthUint8,HWM_CONFIG_DATA, 1, &bank); + + BOOT_SCRIPT_S3_IO_WRITE_MACRO(bss,EfiBootScriptWidthUint8,HWM_CONFIG_INDEX, 1, &r); + BOOT_SCRIPT_S3_IO_WRITE_MACRO(bss,EfiBootScriptWidthUint8,HWM_CONFIG_DATA, 1, &v); + } + + return Status; +} + + +//************************************************************************* +//************************************************************************* +//** ** +//** (C)Copyright 1985-2008, American Megatrends, Inc. ** +//** ** +//** All Rights Reserved. ** +//** ** +//** 5555 Oakbrook Parkway, Suite 200, Norcross, GA 30093 ** +//** ** +//** Phone: (770)-246-8600 ** +//** ** +//************************************************************************* +//************************************************************************* + diff --git a/Board/IO/F81866/BSP/OemIoDecode.c b/Board/IO/F81866/BSP/OemIoDecode.c new file mode 100644 index 0000000..e114211 --- /dev/null +++ b/Board/IO/F81866/BSP/OemIoDecode.c @@ -0,0 +1,411 @@ +//************************************************************************* +//************************************************************************* +//** ** +//** (C)Copyright 1985-2011, 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/OemIoDecode.c 1 7/20/11 4:22a Kasalinyi $ +// +// $Revision: 1 $ +// +// $Date: 7/20/11 4:22a $ +//************************************************************************* +// Revision History +// ---------------- +// $Log: /Alaska/BIN/IO/Fintek/F81866/F81866 Board/OemIoDecode.c $ +// +// 1 7/20/11 4:22a Kasalinyi +// [Category] Improvement +// [Description] Initial Porting +// [Files] BSP.cif +// OemIoDecode.c +// PeiIoTable.h +// DxeIoTable.h +// F81866HwmOemHooks.c +// F81866SmartFan.c +// +// 3 3/21/11 9:44p Mikes +// Seperate the core and oem job +// +//************************************************************************* +//<AMI_FHDR_START> +// +// Name: <OemIoDecode.c> +// +// Description: This file provides a interface to decode any IO resource used +// by IO module. In the interface, has provided some sample codes, but +// only for reference. The sample code is based on some old chipsets. You +// must check your platform and re-program the function. +// You also can call chipset IO decode function with token IODECODETYPE. +// +// Notes: +// !!!!!!!!!!!!Attention!!!!!!!!!!!Attention!!!!!!!!!!!Attention!!!!!!!!!!! +// This sample is not for any chipset, please, re-program the function base +// on your porject. +// !!!!!!!!!!!!Attention!!!!!!!!!!!Attention!!!!!!!!!!!Attention!!!!!!!!!!! +// +//<AMI_FHDR_END> +//************************************************************************* +//------------------------------------------------------------------------- +// Include Files +//------------------------------------------------------------------------- +#include <Efi.h> +#include <Token.h> +#include <Protocol\PciIo.h> +#include <Protocol\AmiSio.h> + +//------------------------------------------------------------------------- +//Variable, Prototype, and External Declarations +//------------------------------------------------------------------------- +#define ICH_LPC_IO_DECODE_OFFSET 0x80 +#define ICH_LPC_IO_ENABLE_OFFSET 0x82 +#define ICH_LPC_REG_GEN1_DEC_OFFSET 0x84 +#define SIO_SB_BUS_NUMBER 0x00 +#define SIO_SB_DEV_NUMBER 0x1F +#define SIO_SB_FUNC_NUMBER 0x00 +#define LPC_PCI_ADDR (UINT32)(BIT31 | (SIO_SB_BUS_NUMBER << 16) | (SIO_SB_DEV_NUMBER << 11) | (SIO_SB_FUNC_NUMBER << 8)) + +EFI_STATUS CSP_SetLpcGenericDecoding ( + IN EFI_PCI_IO_PROTOCOL *LpcPciIo, + IN UINT16 Base, + IN UINT16 Length, + IN BOOLEAN Enable ); + +VOID static RWPciReg16 ( + IN UINT32 dNumOfBusDevFunc, + IN UINT16 Reg, + IN UINT16 SetData, + IN UINT16 MaskData ); + +VOID static WritePciReg32 ( + IN UINT32 dNumOfBusDevFunc, + IN UINT16 Reg, + IN UINT32 Value32 ); + +UINT32 static ReadPciReg32 ( + IN UINT32 dNumOfBusDevFunc, + IN UINT16 Reg ); +//<AMI_PHDR_START> +//------------------------------------------------------------------------- +// Procedure: RWPciReg16 +// +// Description: +// This function read or write PCI 16bit register +// +// Input: +// UINT32 dNumOfBusDevFunc - Content the BUS DEV and FUNC number to be used +// UINT16 Reg +// UINT16 SetData +// UINT16 MaskData +// +// Output: +// NONE +// +// Notes: +// +//------------------------------------------------------------------------- +//<AMI_PHDR_END> +static VOID RWPciReg16 ( + IN UINT32 dNumOfBusDevFunc, + IN UINT16 Reg, + IN UINT16 SetData, + IN UINT16 MaskData ) +{ + UINT16 Value16; + + dNumOfBusDevFunc |= (UINT32)(Reg & ~3); + + IoWrite32(0xcf8, dNumOfBusDevFunc); + Value16 = IoRead16(0xcfc | (UINT8)(Reg & 2)); + + IoWrite32(0xcf8, dNumOfBusDevFunc); + IoWrite16(0xcfc | (UINT8)(Reg & 2), (Value16 & MaskData) | SetData); + +} +//<AMI_PHDR_START> +//---------------------------------------------------------------------- +// Procedure: WritePciReg32 +// +// Description: This function write PCI 32bit register +// +// Input: +// UINT32 dNumOfBusDevFunc - Content the BUS DEV and FUNC number to be used. +// UINT16 Reg +// UINT32 Value32 +// +// Output: +// NONE +// +// Notes: +// +//---------------------------------------------------------------------- +//<AMI_PHDR_END> +static VOID WritePciReg32 ( + IN UINT32 dNumOfBusDevFunc, + IN UINT16 Reg, + IN UINT32 Value32 ) +{ + //BIT31 | (SIO_SB_BUS_NUM << 16) | (SIO_SB_DEV_NUM << 11) | (SIO_SB_FUNC_NUM << 8) | (Reg & 0xfc); + dNumOfBusDevFunc |= (UINT32)(Reg & ~3); + IoWrite32(0xcf8, dNumOfBusDevFunc); + IoWrite32(0xcfc, Value32); +} + +//<AMI_PHDR_START> +//---------------------------------------------------------------------- +// Procedure: ReadPciReg32 +// +// Description: This function read PCI 32bit register +// +// Input: +// UINT32 dNumOfBusDevFunc - Content the BUS DEV and FUNC number to be used. +// UINT16 Reg +// +// Output: +// NONE +// +// Notes: +// +//---------------------------------------------------------------------- +//<AMI_PHDR_END> +static UINT32 ReadPciReg32 ( + IN UINT32 dNumOfBusDevFunc, + IN UINT16 Reg ) +{ + //BIT31 | (SIO_SB_BUS_NUM << 16) | (SIO_SB_DEV_NUM << 11) | (SIO_SB_FUNC_NUM << 8) | (Reg & 0xfc); + dNumOfBusDevFunc |= (UINT32)(Reg & ~3); + IoWrite32(0xcf8, dNumOfBusDevFunc); + return IoRead32(0xcfc); +} +//<AMI_PHDR_START> +//------------------------------------------------------------------------- +// Procedure: CSP_SetLpcDeviceDecoding +// +// Description: +// This function goes through the elinked list of identify functions +// giving control when the token "IODECODETYPE == 1". +// +// Input: +// Base - I/O base address +// Base=0 means disable the decode of the device +// DevUid - The device Unique ID +// If type is 0xFF, DevUid contain the IO length +// Type - Device type +// If type is 0xFF, DevUid contain the IO length +// +// Output: +// EFI_SUCCESS - Set successfully. +// EFI_INVALID_PARAMETER - the Input parameter is invalid. +// +// Notes: +// Chipset porting should provide the Io Ranage decode function. +// If chipset porting provide this function, set IODECODETYPE = 0. +// If chipset porting doesn't provide this function, you can eLink your +// function to IoRangeDecodeList or replace CSP_SetLpcDeviceDecoding elink +// +//------------------------------------------------------------------------- +//<AMI_PHDR_END> +EFI_STATUS CSP_SetLpcDeviceDecoding( + IN EFI_PCI_IO_PROTOCOL *LpcPciIo, + IN UINT16 Base, + IN UINT8 DevUid, + IN SIO_DEV_TYPE Type) +{ + EFI_STATUS Status = EFI_UNSUPPORTED; + UINT16 IoRangeMask16 = 0xffff; + UINT16 IoRangeSet16 = 0; + UINT16 IoEnMask16 = 0xffff; + UINT16 IoEnSet16 = 0; + switch (Base) { + //disable device decode + case 0: + switch(Type) { + case dsFDC:IoEnMask16 &= ~BIT03;break; + case dsLPT:IoEnMask16 &= ~BIT02;break; + case dsUART: + if(DevUid == 0) + IoEnMask16 &= ~BIT00;break;//disable coma + if(DevUid == 1) + IoEnMask16 &= ~BIT01;break;//disable comb + case dsPS2K: + case dsPS2CK:IoEnMask16 &= ~BIT10;break;//disable kbc + case dsGAME: + if(DevUid == 0) + IoEnMask16 &= ~BIT08;break;//disable game1 + if(DevUid == 1) + IoEnMask16 &= ~BIT09;break;//disable game2 + } + break; + // FDC Address Range + case 0x3f0:IoEnSet16 |= BIT03;IoRangeMask16 &= ~BIT12;IoRangeSet16 |= (0 << 12);break; + case 0x370:IoEnSet16 |= BIT03;IoRangeMask16 &= ~BIT12;IoRangeSet16 |= (1 << 12);break; + // LPT Address Range + case 0x378:IoEnSet16 |= BIT02;IoRangeMask16 &= ~(BIT09 | BIT08);IoRangeSet16 |= (0 << 8);break; + case 0x278:IoEnSet16 |= BIT02;IoRangeMask16 &= ~(BIT09 | BIT08);IoRangeSet16 |= (1 << 8);break; + case 0x3bc:IoEnSet16 |= BIT02;IoRangeMask16 &= ~(BIT09 | BIT08);IoRangeSet16 |= (2 << 8);break; + + // ComA Address Range + case 0x3f8:if(DevUid == 0) {IoEnSet16 |= BIT00;IoRangeMask16 &= ~(BIT02 | BIT01 | BIT00);IoRangeSet16 |= 0;break;} + if(DevUid == 1) {IoEnSet16 |= BIT01;IoRangeMask16 &= ~(BIT06 | BIT05 | BIT04);IoRangeSet16 |= (0 << 4);break;} + case 0x2f8:if(DevUid == 0) {IoEnSet16 |= BIT00;IoRangeMask16 &= ~(BIT02 | BIT01 | BIT00);IoRangeSet16 |= 1;break;} + if(DevUid == 1) {IoEnSet16 |= BIT01;IoRangeMask16 &= ~(BIT06 | BIT05 | BIT04);IoRangeSet16 |= (1 << 4);break;} + case 0x220:if(DevUid == 0) {IoEnSet16 |= BIT00;IoRangeMask16 &= ~(BIT02 | BIT01 | BIT00);IoRangeSet16 |= 2;break;} + if(DevUid == 1) {IoEnSet16 |= BIT01;IoRangeMask16 &= ~(BIT06 | BIT05 | BIT04);IoRangeSet16 |= (2 << 4);break;} + case 0x228:if(DevUid == 0) {IoEnSet16 |= BIT00;IoRangeMask16 &= ~(BIT02 | BIT01 | BIT00);IoRangeSet16 |= 3;break;} + if(DevUid == 1) {IoEnSet16 |= BIT01;IoRangeMask16 &= ~(BIT06 | BIT05 | BIT04);IoRangeSet16 |= (3 << 4);break;} + case 0x238:if(DevUid == 0) {IoEnSet16 |= BIT00;IoRangeMask16 &= ~(BIT02 | BIT01 | BIT00);IoRangeSet16 |= 4;break;} + if(DevUid == 1) {IoEnSet16 |= BIT01;IoRangeMask16 &= ~(BIT06 | BIT05 | BIT04);IoRangeSet16 |= (4 << 4);break;} + case 0x2e8:if(DevUid == 0) {IoEnSet16 |= BIT00;IoRangeMask16 &= ~(BIT02 | BIT01 | BIT00);IoRangeSet16 |= 5;break;} + if(DevUid == 1) {IoEnSet16 |= BIT01;IoRangeMask16 &= ~(BIT06 | BIT05 | BIT04);IoRangeSet16 |= (5 << 4);break;} + case 0x338:if(DevUid == 0) {IoEnSet16 |= BIT00;IoRangeMask16 &= ~(BIT02 | BIT01 | BIT00);IoRangeSet16 |= 6;break;} + if(DevUid == 1) {IoEnSet16 |= BIT01;IoRangeMask16 &= ~(BIT06 | BIT05 | BIT04);IoRangeSet16 |= (6 << 4);break;} + case 0x3e8:if(DevUid == 0) {IoEnSet16 |= BIT00;IoRangeMask16 &= ~(BIT02 | BIT01 | BIT00);IoRangeSet16 |= 7;break;} + if(DevUid == 1) {IoEnSet16 |= BIT01;IoRangeMask16 &= ~(BIT06 | BIT05 | BIT04);IoRangeSet16 |= (7 << 4);break;} + + + // KBC Address Enable + case 0x60: + case 0x64:IoEnSet16 |= BIT10;break; + case 0x62: + case 0x66: IoEnSet16 |= BIT11;break; + // Game Port Address Enable + case 0x200:IoEnSet16 |= BIT08;break; + case 0x208:IoEnSet16 |= BIT09;break; + // LPC CFG Address Enable + case 0x2e: IoEnSet16 |= BIT12;break; + case 0x4e: IoEnSet16 |= BIT13;break; + default:if(Type == 0xff) {//!!!Attention!!!If type is 0xFF, DevUid contain the IO length + return CSP_SetLpcGenericDecoding(LpcPciIo, \ + Base , \ + DevUid, \ + TRUE ); + }else return EFI_UNSUPPORTED; + + } + RWPciReg16(LPC_PCI_ADDR,ICH_LPC_IO_DECODE_OFFSET, IoRangeSet16, IoRangeMask16); //0X82 + RWPciReg16(LPC_PCI_ADDR,ICH_LPC_IO_ENABLE_OFFSET, IoEnSet16, IoEnMask16); //0X84 + // Porting End + + return EFI_SUCCESS; +} + +//<AMI_PHDR_START> +//------------------------------------------------------------------------- +// +// Procedure: CSP_SetLpcGenericDecoding +// +// Description: +// This function set LPC Bridge Generic Decoding +// +// Input: +// *LpcPciIo - Pointer to LPC PCI IO Protocol +// Base - I/O base address +// Length - I/O Length +// Enabled - Enable/Disable the generic decode range register +// +// Output: +// EFI_SUCCESS - Set successfully. +// EFI_UNSUPPORTED - This function is not implemented or the +// Length more than the maximum supported +// size of generic range decoding. +// EFI_INVALID_PARAMETER - the Input parameter is invalid. +// EFI_OUT_OF_RESOURCES - There is not available Generic +// Decoding Register. +// EFI_NOT_FOUND - the generic decode range will be disabled +// is not found. +// +// Notes: +// +//------------------------------------------------------------------------- +//<AMI_PHDR_END> +EFI_STATUS CSP_SetLpcGenericDecoding ( + IN EFI_PCI_IO_PROTOCOL *LpcPciIo, + IN UINT16 Base, + IN UINT16 Length, + IN BOOLEAN Enable ) +{ + // Porting Required + UINT32 IoGenDecode32; + UINT16 IoGenDecIndex; + UINT16 Buffer16; + UINT8 Bsf8 = 0; + UINT8 Bsr8 = 0; + + if (Length > 0x100) return EFI_UNSUPPORTED; + + if (Length == 0) return EFI_INVALID_PARAMETER; + + if (Length < 4) Length = 4; + + + // Read I/O Generic Decodes Register. + for (IoGenDecIndex = 0; IoGenDecIndex < 4; IoGenDecIndex++) { + IoGenDecode32 = ReadPciReg32(LPC_PCI_ADDR,ICH_LPC_REG_GEN1_DEC_OFFSET + IoGenDecIndex * 4); + if (Enable) { + if ((IoGenDecode32 & 1) == 0) break; + else if ((IoGenDecode32 & 0xfffc) == Base) break; + } else { + if (((IoGenDecode32 & 0xfffc) == Base) && (IoGenDecode32 & 1)) { + IoGenDecode32 = 0; // Disable & clear the base/mask fields + break; + } + } + } + + if (Enable) { + if (IoGenDecIndex == 4) return EFI_OUT_OF_RESOURCES; + + Buffer16 = Length; + while ((Buffer16 % 2) == 0) { + Buffer16 /= 2; + Bsf8++; + } + + while (Length) { + Length >>= 1; + Bsr8++; + } + + if (Bsf8 == (Bsr8 - 1)) Bsr8--; + + Length = (1 << Bsr8) - 1 ; + + Base &= (~Length); + + IoGenDecode32 = Base | (UINT32)((Length >> 2) << 18) | 1; + + } else { + if (IoGenDecIndex == 4) return EFI_NOT_FOUND; + } + + WritePciReg32(LPC_PCI_ADDR,ICH_LPC_REG_GEN1_DEC_OFFSET + IoGenDecIndex * 4, IoGenDecode32); + // Porting End + + return EFI_SUCCESS; + +} + + +//************************************************************************* +//************************************************************************* +//** ** +//** (C)Copyright 1985-2011, American Megatrends, Inc. ** +//** ** +//** All Rights Reserved. ** +//** ** +//** 5555 Oakbrook Parkway, Suite 200, Norcross, GA 30093 ** +//** ** +//** Phone: (770)-246-8600 ** +//** ** +//************************************************************************* +//************************************************************************* + diff --git a/Board/IO/F81866/BSP/PeiIoTable.h b/Board/IO/F81866/BSP/PeiIoTable.h new file mode 100644 index 0000000..5bda076 --- /dev/null +++ b/Board/IO/F81866/BSP/PeiIoTable.h @@ -0,0 +1,332 @@ +//************************************************************************* +//************************************************************************* +//** ** +//** (C)Copyright 1985-2011, 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/PeiIoTable.h 5 9/16/12 9:38p Elviscai $ +// +// $Revision: 5 $ +// +// $Date: 9/16/12 9:38p $ +//************************************************************************* +// Revision History +// ---------------- +// $Log: /Alaska/BIN/IO/Fintek/F81866/F81866 Board/PeiIoTable.h $ +// +// 5 9/16/12 9:38p Elviscai +// [TAG] EIPNONE +// [Category] Bug Fix +// [Solution] Remove token control, LDN05h index FEh bit7& bit4 to ¡°0¡± +// as fixed. +// +// 4 2/16/12 9:22p Elviscai +// [TAG] EIP82572 +// [Category] Improvement +// [Description] Remove PS2 SWAP auto detection according Spec v0.13 +// +// 3 2/09/12 5:23a Kasalinyi +// [TAG] EIP82488 +// [Category] Improvement +// [Description] Fintek Workaround +// [Files] PeiIoTable.h +// +// 2 2/03/12 1:29a Elviscai +// [TAG] EIP68967 +// [Category] Improvement +// [Description] Correct UART/LPT/FDC muti-function pin definations. +// +// 1 7/20/11 4:22a Kasalinyi +// [Category] Improvement +// [Description] Initial Porting +// [Files] BSP.cif +// OemIoDecode.c +// PeiIoTable.h +// DxeIoTable.h +// F81866HwmOemHooks.c +// F81866SmartFan.c +// +// 4 3/21/11 9:44p Mikes +// Seperate the core and oem job +// +//************************************************************************* +//<AMI_FHDR_START> +// +// Name: PeiIoTable.C +// +// Description: +// SIO init table in PEI phase. Any customers have to review below tables +// for themselves platform and make sure each initialization is necessary. +// +// Notes: +// +//<AMI_FHDR_END> +//************************************************************************* +#ifndef _PEIIoTable_H +#define _PEIIoTable_H +#ifdef __cplusplus +extern "C" { +#endif + +//------------------------------------------------------------------------- +// Include Files +//------------------------------------------------------------------------- + +//------------------------------------------------------------------------- +// Constants, Macros and Type Definitions +//------------------------------------------------------------------------- +typedef struct _IO_DECODE_DATA{ + UINT16 BaseAdd; + //!!!Attention!!!If type is 0xFF, UID is a IO legth + UINT8 UID; + SIO_DEV_TYPE Type; +} IO_DECODE_DATA; + +typedef struct _SIO_DATA{ + UINT16 Addr; + //AND mask value, 0xFF means register don't need AndMask and + //only write OrData8 to regisrer. + UINT8 DataMask; + //OR mask value. + UINT8 DataValue; +} SIO_DATA; + +// SIO DECODE list creation code must be in this order +typedef EFI_STATUS (IO_RANGE_DECODE)( +// IN void *LpcPciIo, + IN EFI_PCI_IO_PROTOCOL *LpcPciIo, + IN UINT16 DevBase, + IN UINT8 UID, + IN SIO_DEV_TYPE Type +); + +//------------------------------------------------------------------------- +//Variable, Prototype, and External Declarations +//------------------------------------------------------------------------- + +//<AMI_THDR_START> +//------------------------------------------------------------------------- +// +// Name: F81866_Decode_Table +// +// Description: +// Table filled with SIO IO resource to decode. It is used +// for PEI IO Decode function. For example: +// 1. Decode Index/data port +// 2. Decode KBC,FDC IO for recovery +// 3. Decode COM port for debug +// 4. Decode total IO base for runtime, pme, acpi, etc... +// 5. Decode more com ports wirh "generic IO range decode" +// +// Notes: +// Attention! Cann't open 3F6(it was used by IDE controller.) +// +//------------------------------------------------------------------------- +//<AMI_THDR_END> +IO_DECODE_DATA F81866_Decode_Table[]={ + // ----------------------------- + //| BaseAdd | UID | Type | + // ----------------------------- + {F81866_CONFIG_INDEX, 2, 0xFF}, + //Below decode is for DEBUG Mode + #if defined(EFI_DEBUG) || (defined(Recovery_SUPPORT) && (SERIAL_RECOVERY_SUPPORT)) + #if (F81866_SERIAL_PORT0_PRESENT) + {F81866_SERIAL_PORT0_BASE_ADDRESS, 0, dsUART}, + #endif + #endif + //Below decode is for recovery mode + #if defined(Recovery_SUPPORT) && (Recovery_SUPPORT) + #if (F81866_KEYBOARD_PRESENT) + {0x60, 0, dsPS2K}, // KBC decode + #endif + #if (F81866_FLOPPY_PORT_PRESENT) + {0x3F0, 0, dsFDC}, // FDC decode + #endif + #endif + //Below decode is for SIO generic IO decode + #if defined(F81866_TOTAL_BASE_ADDRESS) && (F81866_TOTAL_BASE_ADDRESS != 0) + {F81866_TOTAL_BASE_ADDRESS, F81866_TOTAL_LENGTH, 0xFF}, + #endif + // !!!!Attention!!!!This is necessary + //OEM_TODO//OEM_TODO//OEM_TODO//OEM_TODO + // If your com port number > 2 , you'd add more table for more com ports. + {0x3E0, 0x10, 0xFF}, // 0x3E0~0x3F0 , open a IODecode section for UART3 4 + {0x2E0, 0x20, 0xFF}, // 0x2E0~0x2FF , open a IODecode section for UART5 6 + // Add more OEM IO decode below. +}; + +//<AMI_THDR_START> +//------------------------------------------------------------------------- +// +// Name: F81866_PEI_Init_Table +// +// Description: Table filled with SIO logical devices' register value. +// Only do the necessary initialization. For example: +// 1. Program clock and multi-pin setting in global registers +// 2. Program KBC,FDC IO for recovery +// 3. Program COM port for debug +// +// Notes: +// +//------------------------------------------------------------------------- +//<AMI_THDR_END> +SIO_DATA F81866_PEI_Init_Table[] = { + // ----------------------------- + //| Addr | DataMask | DataValue | + // ----------------------------- + + //--------------------------------------------------------------------- + // Enter Configuration Mode. + //--------------------------------------------------------------------- + {F81866_CONFIG_INDEX, 0xFF, F81866_CONFIG_MODE_ENTER_VALUE}, + {F81866_CONFIG_INDEX, 0xFF, F81866_CONFIG_MODE_ENTER_VALUE}, + + //--------------------------------------------------------------------- + // Before init all logical devices, program Global register if needed. + //--------------------------------------------------------------------- + {F81866_CONFIG_INDEX, 0xFF, 0x26}, + {F81866_CONFIG_DATA, 0x3F, F81866_CLOCK << 6}, + #if (F81866_SERIAL_PORT2_PRESENT) + {F81866_CONFIG_INDEX, 0xFF, 0x29}, + {F81866_CONFIG_DATA, 0xCF, 0x30}, + #endif + #if (F81866_SERIAL_PORT3_PRESENT) + {F81866_CONFIG_INDEX, 0xFF, 0x29}, + {F81866_CONFIG_DATA, 0x3F, 0xC0}, + #endif + #if (F81866_MOUSE_PRESENT) + {F81866_CONFIG_INDEX, 0xFF, 0x28}, + {F81866_CONFIG_DATA, 0xEF, 0x00}, + #endif + #if (F81866_SERIAL_PORT4_PRESENT) + {F81866_CONFIG_INDEX, 0xFF, 0x28}, + {F81866_CONFIG_DATA, 0xB3, 0x0C}, + #endif + #if (F81866_SERIAL_PORT5_PRESENT) + {F81866_CONFIG_INDEX, 0xFF, 0x28}, + {F81866_CONFIG_DATA, 0xBC, 0x03}, + #endif + #if (F81866_PARALLEL_PORT_PRESENT) + {F81866_CONFIG_INDEX, 0xFF, 0x28}, + {F81866_CONFIG_DATA, 0xDF, 0x00}, + {F81866_CONFIG_INDEX, 0xFF, 0x2B}, + {F81866_CONFIG_DATA, 0xFC, 0x00}, + #endif + #if (F81866_FLOPPY_PORT_PRESENT) + {F81866_CONFIG_INDEX, 0xFF, 0x28}, + {F81866_CONFIG_DATA, 0xB0, 0x00}, + #endif + // Enable PS/2 KB/MS Wake-up Function + #if (F81866_KEYBOARD_PRESENT) + {F81866_CONFIG_INDEX, 0xFF, 0x2D}, + {F81866_CONFIG_DATA, 0xF7, 0x0F}, + #endif + + //--------------------------------------------------------------------- + // Initialize the Serial Port for debug useage. Default is COMA + //--------------------------------------------------------------------- + #if defined(EFI_DEBUG) || (defined(Recovery_SUPPORT) && (SERIAL_RECOVERY_SUPPORT)) + #if (F81866_SERIAL_PORT0_PRESENT) + // Select device + {F81866_CONFIG_INDEX, 0xFF, F81866_LDN_SEL_REGISTER}, + {F81866_CONFIG_DATA, 0xFF, F81866_LDN_UART1}, + // Program Base Addr + {F81866_CONFIG_INDEX, 0xFF, F81866_BASE1_LO_REGISTER}, + {F81866_CONFIG_DATA, 0xFF, (UINT8)(F81866_SERIAL_PORT0_BASE_ADDRESS & 0xFF)}, + {F81866_CONFIG_INDEX, 0xFF, F81866_BASE1_HI_REGISTER}, + {F81866_CONFIG_DATA, 0xFF, (UINT8)(F81866_SERIAL_PORT0_BASE_ADDRESS >> 8)}, + // Activate Device + {F81866_CONFIG_INDEX, 0xFF, F81866_ACTIVATE_REGISTER}, + {F81866_CONFIG_DATA, 0xFF, F81866_ACTIVATE_VALUE}, + #endif // F81866_SERIAL_PORT0_PRESENT + #endif // #ifdef EFI_DEBUG + + //--------------------------------------------------------------------- + // Initialize the KeyBoard and floppy controller for Recovery + //--------------------------------------------------------------------- + #if defined(Recovery_SUPPORT) && (Recovery_SUPPORT) + #if (F81866_KEYBOARD_PRESENT) + // Seclect device KEYBOARD + {F81866_CONFIG_INDEX, 0xFF, F81866_LDN_SEL_REGISTER}, + {F81866_CONFIG_DATA, 0xFF, F81866_LDN_PS2K}, + // Program Base Addr + {F81866_CONFIG_INDEX, 0xFF, F81866_BASE1_HI_REGISTER}, + {F81866_CONFIG_DATA, 0xFF, 0x00}, + {F81866_CONFIG_INDEX, 0xFF, F81866_BASE1_LO_REGISTER}, + {F81866_CONFIG_DATA, 0xFF, 0x60}, + // Program Interrupt + {F81866_CONFIG_INDEX, 0xFF, F81866_IRQ1_REGISTER}, + {F81866_CONFIG_DATA, 0xFF, 0x01}, + // Activate Device + {F81866_CONFIG_INDEX, 0xFF, F81866_ACTIVATE_REGISTER}, + {F81866_CONFIG_DATA, 0xFF, F81866_ACTIVATE_VALUE}, + #endif //F81866_KEYBOARD_PRESENT + + #if (F81866_FLOPPY_PORT_PRESENT) + // Seclect device FLOPPY + {F81866_CONFIG_INDEX, 0xFF, F81866_LDN_SEL_REGISTER}, + {F81866_CONFIG_DATA, 0xFF, F81866_LDN_FDC}, + // Program Base Addr + {F81866_CONFIG_INDEX, 0xFF, F81866_BASE1_HI_REGISTER}, + {F81866_CONFIG_DATA, 0xFF, 0x03}, + {F81866_CONFIG_INDEX, 0xFF, F81866_BASE1_LO_REGISTER}, + {F81866_CONFIG_DATA, 0xFF, 0xF0}, + // Program Interrupt + {F81866_CONFIG_INDEX, 0xFF, F81866_IRQ1_REGISTER}, + {F81866_CONFIG_DATA, 0xFF, 0x06}, + // Activate Device + {F81866_CONFIG_INDEX, 0xFF, F81866_ACTIVATE_REGISTER}, + {F81866_CONFIG_DATA, 0xFF, F81866_ACTIVATE_VALUE}, + #endif //F81866_FLOPPY_PORT_PRESENT + #endif //#if defined(Recovery_SUPPORT) && (Recovery_SUPPORT == 1) + + //--------------------------------------------------------------------- + // Program and initialize some logical device if needed. + //--------------------------------------------------------------------- + // Seclect device KEYBOARD + {F81866_CONFIG_INDEX, 0xFF, F81866_LDN_SEL_REGISTER}, + {F81866_CONFIG_DATA, 0xFF, F81866_LDN_PS2K}, + // >>EIP82488 [Fintek Workaround]:system will hangs up during RAID1 reboot aging with PS2KB + // >>EIPNONE LDN05h index FEh bit7& bit4 to "0". + {F81866_CONFIG_INDEX, 0xFF, 0xFE}, + {F81866_CONFIG_DATA, 0x63, 0x0C},//set bit2,bit3=1 1 + // >>EIPNONE + // <<EIP82488 + //--------------------------------------------------------------------- + // After init all logical devices, program Global register if needed. + //--------------------------------------------------------------------- + + //--------------------------------------------------------------------- + // After init all logical devices, Exit Configuration Mode. + //--------------------------------------------------------------------- + {F81866_CONFIG_INDEX, 0xFF, F81866_CONFIG_MODE_EXIT_VALUE}, +}; + +/****** DO NOT WRITE BELOW THIS LINE *******/ +#ifdef __cplusplus +} +#endif +#endif //_PEIIoTable_H +//************************************************************************* +//************************************************************************* +//** ** +//** (C)Copyright 1985-2011, American Megatrends, Inc. ** +//** ** +//** All Rights Reserved. ** +//** ** +//** 5555 Oakbrook Parkway, Suite 200, Norcross, GA 30093 ** +//** ** +//** Phone: (770)-246-8600 ** +//** ** +//************************************************************************* +//************************************************************************* + |