summaryrefslogtreecommitdiff
path: root/Board/IO/F81866/BSP
diff options
context:
space:
mode:
Diffstat (limited to 'Board/IO/F81866/BSP')
-rw-r--r--Board/IO/F81866/BSP/BSP.cif13
-rw-r--r--Board/IO/F81866/BSP/DxeIoTable.h165
-rw-r--r--Board/IO/F81866/BSP/F81866HwmOemHooks.c733
-rw-r--r--Board/IO/F81866/BSP/F81866SmartFan.c467
-rw-r--r--Board/IO/F81866/BSP/OemIoDecode.c411
-rw-r--r--Board/IO/F81866/BSP/PeiIoTable.h332
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 **
+//** **
+//*************************************************************************
+//*************************************************************************
+