diff options
Diffstat (limited to 'Board/IO/F81866/F81866DXE.C')
-rw-r--r-- | Board/IO/F81866/F81866DXE.C | 1411 |
1 files changed, 1411 insertions, 0 deletions
diff --git a/Board/IO/F81866/F81866DXE.C b/Board/IO/F81866/F81866DXE.C new file mode 100644 index 0000000..269cbb1 --- /dev/null +++ b/Board/IO/F81866/F81866DXE.C @@ -0,0 +1,1411 @@ +//************************************************************************* +//************************************************************************* +//** ** +//** (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/F81866DXE.C 3 2/03/12 2:02a Elviscai $ +// +// $Revision: 3 $ +// +// $Date: 2/03/12 2:02a $ +//************************************************************************* +// Revision History +// ---------------- +// $Log: /Alaska/BIN/IO/Fintek/F81866/F81866DXE.C $ +// +// 3 2/03/12 2:02a Elviscai +// [TAG] EIPNONE +// [Category] Bug Fix +// [Solution] Add WDT_INIT routine for WDT +// +// 2 12/14/11 9:19p Kasalinyi +// [TAG] EIPNone +// [Category] Improvement +// [Description] Fix Smart Function build error +// [Files] F81866DXE.C +// F81866.UNI +// F81866.MAK +// IO_F81866.SDL +// +// 1 7/20/11 4:22a Kasalinyi +// [Category] Improvement +// [Description] Initial Porting +// [Files] F81866.CIF +// IO_F81866.SDL +// F81866.ASL +// F81866.MAK +// F81866.SD +// F81866.UNI +// F81866DXE.C +// F81866PEI.C +// F81866PeiDebugger.C +// F81866Setup.C +// F81866Setup.H +// History.txt +// F81866.chm +// +// 4 3/21/11 9:41p Mikes +// seperate the core and oem job +// +//************************************************************************* +//<AMI_FHDR_START> +// +// Name: <F81866DXE.C> +// +// Description: 1. Port SIO DXE initial table and routine for genericsio.c +// 2. Define enter/exit config mode scrip table +// 3. Define SIO bootscriptable table +// +//<AMI_FHDR_END> +//************************************************************************* +//------------------------------------------------------------------------- +// Include Files +//------------------------------------------------------------------------- +#include <Efi.h> +#include <Token.h> +#include <GenericSIO.h> +#include <Setup.h> +#include <Protocol\AmiSio.h> +#include <Protocol\PciIo.h> +#include <AmiCspLib.h> +#include "BSP\DxeIoTable.h" + +//------------------------------------------------------------------------- +// Constants, Macros and Type Definitions +//------------------------------------------------------------------------- +#define INITIAL_ROUTINE(name) \ +static EFI_STATUS name(\ + IN AMI_SIO_PROTOCOL *AmiSio,\ + IN EFI_PCI_IO_PROTOCOL *PciIo,\ + IN SIO_INIT_STEP InitStep\ +); + +//------------------------------------------------------------------------- +//Variable, Prototype, and External Declarations +//------------------------------------------------------------------------- +EFI_BOOT_SCRIPT_SAVE_PROTOCOL * BootScriptProtocol = NULL; +#if (IODECODETYPE) +// 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 +); +extern IO_RANGE_DECODE SIO_IoRange_Decode_LIST EndOfInitList; +static IO_RANGE_DECODE* CspIoRangeDecodeList[] = {SIO_IoRange_Decode_LIST NULL}; +#endif //#if (IODECODETYPE) + +extern VOID SioCfgMode(GSPIO *Sio, BOOLEAN Enter); +extern VOID DevSelect(SPIO_DEV *Dev); +extern VOID SioRegister(SPIO_DEV *Dev, BOOLEAN Write, UINT8 Reg, UINT8 *Val); + +//smart fan +#if F81866_SMF_SUPPORT +extern VOID F81866SmartFunction(VOID); +#endif + +EFI_STATUS LoopCspIoDecodeListInit( + IN EFI_PCI_IO_PROTOCOL *PciIo, + IN AMI_SIO_PROTOCOL *AmiSio +); + +VOID ProgramSioRegisterTable( + IN AMI_SIO_PROTOCOL *AmiSio, + IN DXE_DEVICE_INIT_DATA *Table, + IN UINT8 Count +); + +VOID ProgramIsaRegisterTable( + IN UINT16 Index, + IN UINT16 Data, + IN DXE_DEVICE_INIT_DATA *Table, + IN UINT8 Count +); + +VOID ProgramRtRegisterTable( + IN UINT16 Base, + IN DXE_DEVICE_INIT_DATA *Table, + IN UINT8 Count +); + +VOID SaveSxSioRegisterTable( + IN UINT16 Index, + IN UINT16 Data, + IN UINT8 *Table, + IN UINT8 Count +); +VOID SaveSxRtRegisterTable( + IN UINT16 Base, + IN UINT16 *Table, + IN UINT8 Count +); +VOID ClearDevResource( + IN SPIO_DEV* dev +); +//Declare initial routines for your SPIO_DEV_LST list. +INITIAL_ROUTINE(FDC_Init) + +INITIAL_ROUTINE(COM_Init) + +INITIAL_ROUTINE(LPT_Init) + +INITIAL_ROUTINE(KBC_Init) + +INITIAL_ROUTINE(PME_Init) + +INITIAL_ROUTINE(HWM_Init) + +INITIAL_ROUTINE(GPIO_Init) + +INITIAL_ROUTINE(WDT_Init) + +//<AMI_THDR_START> +//------------------------------------------------------------------------- +// +// Name: F81866_DevLst +// +// Description: Table filled with SIO porting information +// +//------------+-------+-------+--------+---------+---------+-------------+------------+------------+-----------+------------+------------+-------------| +//SIO_DEV_TYP | UINT8 | UINT8 | UINT16 | BOOLEAN | BOOLEAN | UINT8 | UINT8 | UINT16 | UINT16 | UINT16 | UINT8 | SIO_INIT | +//Type | LDN | UID | PnpId | Impleme | HasSetu | Flags | AslName[5] | ResBase[2] | ResLen[2] | IrqMask[2] | DmaMask[2] | InitRoutine | +//------------+-------+-------+--------+---------+---------+-------------+------------+------------+-----------+------------+------------+-------------| +// Field "Falgs" is needed to indicate that SIO Logical Device represented +// by this table entry shares all or some resources with previous entry. +// Such situation is sutable for FDC - and PS2 controller +// This field must be filled properely in order to have driver working right. +// Here possible Flags Settings +// #define SIO_SHR_NONE 0x00 +// #define SIO_SHR_IO1 0x01 //device shares resources programmed in SIO_1_BASE_REG +// #define SIO_SHR_IO2 0x02 //device shares resources programmed in SIO_2_BASE_REG +// #define SIO_SHR_IO 0x03 //device shares resources programmed in all SIO_BASE_REG +// #define SIO_SHR_IRQ1 0x04 +// #define SIO_SHR_IRQ2 0x08 +// #define SIO_SHR_IRQ 0x0C +// #define SIO_SHR_DMA1 0x10 +// #define SIO_SHR_DMA2 0x20 +// #define SIO_SHR_DMA 0x30 +// #define SIO_SHR_ALL 0x3F +// #define SIO_NO_RES 0x80 //this bit will be set if GCD call to allocate resource succeed +// //at least one call must return SUCCESS if this flag +// +//------------------------------------------------------------------------- +//<AMI_THDR_END> +//AMI_TODO: Please check below notes. +//1. if device has no ASL code and has IO base register to be initialized, fill it in below table +//2. If device has no IO base register to be initialized, set flag to SIO_NO_RES +//3. if more device PnpId is 0x0C08, please check the UID of these devices. +static SPIO_DEV_LST F81866_DevLst[]={ +//If device Implemented=FALSE the rest of the table will be ignored, just to avoid compilation ERROR +//Type LDN UID PnpId Implement HasSetu Share RES AslName[5] Base Length IrqMask DmaMask InitRoutine +//=============================================================================== +{dsFDC, F81866_LDN_FDC, 0, 0x0604, F81866_FLOPPY_PORT_PRESENT, TRUE, SIO_SHR_NONE, {"FDC"}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, FDC_Init},//LDN 0x00 +{dsLPT, F81866_LDN_LPT, 0, 0x0400, F81866_PARALLEL_PORT_PRESENT, TRUE, SIO_SHR_NONE, {"LPTE"}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, LPT_Init},//LDN 0x03 +{dsUART, F81866_LDN_UART1, 0, 0x0501, F81866_SERIAL_PORT0_PRESENT, TRUE, SIO_SHR_NONE, {"UAR1"}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, COM_Init},//LDN 0x10 +{dsUART, F81866_LDN_UART2, 1, 0x0501, F81866_SERIAL_PORT1_PRESENT, TRUE, SIO_SHR_NONE, {"UAR2"}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, COM_Init},//LDN 0x11 +{dsUART, F81866_LDN_UART3, 2, 0x0501, F81866_SERIAL_PORT2_PRESENT, TRUE, SIO_SHR_NONE, {"UAR3"}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, COM_Init},//LDN 0x12 +{dsUART, F81866_LDN_UART4, 3, 0x0501, F81866_SERIAL_PORT3_PRESENT, TRUE, SIO_SHR_IRQ1, {"UAR4"}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, COM_Init},//LDN 0x13 +{dsUART, F81866_LDN_UART5, 4, 0x0501, F81866_SERIAL_PORT4_PRESENT, TRUE, SIO_SHR_NONE, {"UAR5"}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, COM_Init},//LDN 0x14 +{dsUART, F81866_LDN_UART6, 5, 0x0501, F81866_SERIAL_PORT5_PRESENT, TRUE, SIO_SHR_IRQ1, {"UAR6"}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, COM_Init},//LDN 0x15 +{dsPS2CK, F81866_LDN_PS2K, 0, 0x0303, F81866_KEYBOARD_PRESENT, FALSE, SIO_SHR_NONE, {"PS2K"}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, KBC_Init},//LDN 0x05 +#if F81866_MOUSE_PRESENT +{dsPS2CM, F81866_LDN_PS2M, 0, 0x0F03, F81866_MOUSE_PRESENT, FALSE, SIO_SHR_IO, {"PS2M"}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, NULL},//LDN 0x05 +#endif +{dsPME, F81866_LDN_PME, 0, 0x0C08, F81866_PME_CONTROLLER_PRESENT,FALSE, SIO_NO_RES, {NULL}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, PME_Init},//LDN 0x0A +{dsHwMon, F81866_LDN_HWM, 1, 0x0C08, F81866_HWM_PRESENT, FALSE, SIO_SHR_NONE, {NULL}, {IO3B, 0}, {IO3L, 0}, {0, 0}, {0, 0}, HWM_Init},//LDN 0x04 +{dsGPIO, F81866_LDN_GPIO, 2, 0x0C08, F81866_GPIO_PORT_PRESENT, FALSE, SIO_SHR_NONE, {NULL}, {IO1B, 0}, {IO1L, 0}, {0, 0}, {0, 0}, GPIO_Init},//LDN 0x06 +{dsNone, F81866_LDN_WDT, 3, 0x0C08, F81866_WDT_PRESENT, FALSE, SIO_SHR_NONE, {NULL}, {IO2B, 0}, {IO2L, 0}, {0, 0}, {0, 0}, WDT_Init},//LDN 0x06 +//=============================================================================== +};//SPIO_DEV_LST mSpioDeviceList[] END of structure Buffer +#define F81866_DEV_CNT (sizeof(F81866_DevLst)/sizeof(SPIO_DEV_LST)) + +// Note: below bootscript table->more registers, more post time +//------------------------------------------------------------------------- +// Define the registers to save/restore in BootScriptSave table when SIO sleep +//------------------------------------------------------------------------- +static UINT8 F81866_GLOBAL_REGS[] = { + //AMI_TODO: + //Global registers. For example: + //LDN Register, Multi-fun registers and Device Specific registers + //0x07, + 0x25,0x26,0x27,0x28,0x29,0x2A,0x2B,0x2C,0x2D +}; +#define F81866_G_REG_CNT (sizeof(F81866_GLOBAL_REGS)/sizeof(UINT8)) + +//------------------------------------------------------------------------- +// Define the local registers for configure SIO +//------------------------------------------------------------------------- +static UINT8 F81866_LOCAL_REGS[] = { +//AMI_TODO: + F81866_ACTIVATE_REGISTER, //Activate Reg + F81866_BASE1_HI_REGISTER, //IO Base Registers + F81866_BASE1_LO_REGISTER, //IO Base Registers + F81866_BASE2_HI_REGISTER, //IO Base Registers + F81866_BASE2_LO_REGISTER, //IO Base Registers + F81866_IRQ1_REGISTER, //IRQ & DMA Select Regs + F81866_IRQ2_REGISTER, //IRQ & DMA Select Regs + F81866_DMA1_REGISTER, //IRQ & DMA Select Regs + F81866_DMA2_REGISTER, //IRQ & DMA Select Regs + //Logical Device Configuration Registers(Dwevice Specific) + 0xE0,0xE1,0xE2,0xE3,0xE4,0xE5,0xE6,0xE7,0xE8,0xE9,0xEA,0xEB,0xEC,0xED,0xEE, + 0xF0,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE, +}; +#define F81866_L_REG_CNT (sizeof(F81866_LOCAL_REGS)/sizeof(UINT8)) + +//------------------------------------------------------------------------- +// Define script variable for enter config mode +//------------------------------------------------------------------------- +static SPIO_SCRIPT F81866_OPEN_CONFIG[]={ + //AMI_TODO: + + { + 1, //BOOLEAN IdxDat; //1=IDX 0=DAT + 1, //BOOLEAN WrRd; //1=Write 0=Read + F81866_CONFIG_MODE_ENTER_VALUE //UINT8 Value; //if WrRd=0 wait for this data to come + },{ + 1, //BOOLEAN IdxDat; //1=IDX 0=DAT + 1, //BOOLEAN WrRd; //1=Write 0=Read + F81866_CONFIG_MODE_ENTER_VALUE //UINT8 Value; //if WrRd=0 wait for this data to come + } +}; + +//------------------------------------------------------------------------- +// Define script variable for exit config mode +//------------------------------------------------------------------------- +static SPIO_SCRIPT F81866_CLOSE_CONFIG[]={ + //AMI_TODO: + + { + 1, //BOOLEAN IdxDat; //1=IDX 0=DAT + 1, //BOOLEAN WrRd; //1=Write 0=Read + F81866_CONFIG_MODE_EXIT_VALUE //UINT8 Value; //if WrRd=0 wait for this data to come + } +}; + +//------------------------------------------------------------------------- +// Here comes the table telling how to enter "SIO Config Mode" +//------------------------------------------------------------------------- +static SPIO_SCRIPT_LST F81866_ENTER_CONFIG={ + cfgByteSeq, //Operation Type + (sizeof(F81866_OPEN_CONFIG))/(sizeof(SPIO_SCRIPT)), + &F81866_OPEN_CONFIG //Instruction +}; + +//------------------------------------------------------------------------- +// Here comes the table telling how to exit "SIO Config Mode" +//------------------------------------------------------------------------- +static SPIO_SCRIPT_LST F81866_EXIT_CONFIG={ + cfgByteSeq, //Operation Type + (sizeof(F81866_CLOSE_CONFIG))/(sizeof(SPIO_SCRIPT)), + &F81866_CLOSE_CONFIG //Instruction +}; + +//------------------------------------------------------------------------- +// If Spio uses complicated way to enter and exit config mode +// use cfgRoutine as Operation Type instead +//------------------------------------------------------------------------- + +//------------------------------------------------------------------------- +// Here goes SPIO_LIST_ITEM structure for F81866 +//------------------------------------------------------------------------- +// value of -1 (0xF..F) means Do not check this parameter +#ifndef SB_BUS_NUM +#define SB_BUS_NUM SIO_SB_BUS_NUM +#endif +#ifndef SB_DEV_NUM +#define SB_DEV_NUM SIO_SB_DEV_NUM +#endif +#ifndef SB_FUNC_NUM +#define SB_FUNC_NUM SIO_SB_FUNC_NUM +#endif + +SPIO_LIST_ITEM F81866={ + //This Information is needed to identify right LPC bridge for the SIO + -1, //UINT32 IsaVenDevId; + -1, //UINT32 IsaSubVenId; + SB_BUS_NUM, //UINT8 IsaBusNo; + SB_DEV_NUM, //UINT8 IsaDevNo; + SB_FUNC_NUM, //UINT8 IsaFuncNo; + //This is the information Needed to access SIO Generic Registers + //for the second SIO in the system change F81866 name to to SIO2_.... + //and so on + F81866_CONFIG_INDEX, //UINT16 SioIndex; + F81866_CONFIG_DATA, //UINT16 SioData; + // Dev Select and Activate + F81866_LDN_SEL_REGISTER, //UINT8 DevSel; + F81866_ACTIVATE_REGISTER, //UINT8 Activate; + F81866_ACTIVATE_VALUE, //UINT8 ActivVal; + F81866_DEACTIVATE_VALUE, //UINT8 DeactVal; + //Generic registers location + F81866_BASE1_HI_REGISTER, //UINT8 Base1Hi; + F81866_BASE1_LO_REGISTER, //UINT8 Base1Lo; + F81866_BASE2_HI_REGISTER, //UINT8 Base2Hi; + F81866_BASE2_LO_REGISTER, //UINT8 Base2Lo; + F81866_IRQ1_REGISTER, //UINT8 Irq1; + F81866_IRQ2_REGISTER, //UINT8 Irq2; + F81866_DMA1_REGISTER, //UINT8 Dma1; + F81866_DMA2_REGISTER, //UINT8 Dma2; + //List of devices inside this SIO + F81866_DEV_CNT, //UINTN DevCount; + &F81866_DevLst[0], //SPIO_DEV_LST *SioDevList; + //List of valid registers inside SIO to check if they has to be saved + //in BOOT_SCRIPT_SAVE for S3 state Resume + //This is for global registers which are the same for all devices in SIO + F81866_G_REG_CNT, //UINTN GlobalInclRegCount; + &F81866_GLOBAL_REGS[0], //UINT8 *GlobalIncludeReg; + //This is for Local registers they are unique for each device in SIO + F81866_L_REG_CNT, //UINTN LocalInclRegCount; + &F81866_LOCAL_REGS[0], //UINT8 *LocalIncludeReg; + //How To enter/exit Configuration mode if any + &F81866_ENTER_CONFIG, //SPIO_SCRIPT_LST *EnterCfgMode; + &F81866_EXIT_CONFIG, //SPIO_SCRIPT_LST *ExitCfgMode; +}; + +// <AMI_PHDR_START> +//------------------------------------------------------------------------- +// +// Procedure: LoopCspIoDecodeListInit +// +// Description: +// This function goes throught the elinked list IoRangeDecodeList +// +// Input: +// IN EFI_PCI_IO_PROTOCOL *PciIo - Read/Write PCI config space +// IN AMI_SIO_PROTOCOL *AmiSio - contents SIO device information +// +// Output: +// EFI_NOT_FOUND - can't find the decode routine. +// EFI_SUCCESS - decode sucessfully. +// +// Modified: Nothing +// +// Referrals: None +// +// Notes: +// +//------------------------------------------------------------------------- +// <AMI_PHDR_END> +EFI_STATUS LoopCspIoDecodeListInit( + IN EFI_PCI_IO_PROTOCOL *PciIo, + IN AMI_SIO_PROTOCOL *AmiSio ) +{ + EFI_STATUS Status; + SPIO_DEV *dev=(SPIO_DEV*)AmiSio; + #if(IODECODETYPE) + UINTN i; + + for(i=0; CspIoRangeDecodeList[i]; i++) + { + Status = CspIoRangeDecodeList[i](PciIo,dev->VlData.DevBase1, dev->DeviceInfo->UID, dev->DeviceInfo->Type); + if(Status == EFI_SUCCESS) return Status; + } + #else + Status = SbLib_SetLpcDeviceDecoding(PciIo,dev->VlData.DevBase1, dev->DeviceInfo->UID, dev->DeviceInfo->Type); + #endif + + return Status; +} +//------------------------------------------------------------------------- + +//------------------------------------------------------------------------- +//!!!!!!!!!!! PORTING REQUIRED !!!!!!!!!!! PORTING REQUIRED !!!!!!!!!!!* +//!!!!!!!!!!!!!!!! must be maintained for SIO devices!!!!!!!!!!!!!!!!!!* +//------------------------------------------------------------------------- +// <AMI_PHDR_START> +//------------------------------------------------------------------------- +// +// Procedure: XXXX_Init +// +// Description: +// Each of INIT functions will be called twice by GenericSIO after standart +// initialization(Assigning and Programming IO/IRQ/DMA resources), +// First time it will be called before Activating the device, +// If device requires some additional initialization like +// - programming SIO device registers except IO1, IO2, IRQ1, IRQ2, DMA1 DMA2 +// Second time After Installing AmiSioProtocol, and DevicePath Protocol of SIO Device. +// If device requires some additional initialization like +// - if programming of some runtime registers like SIO_GPIO, SIO_PM SIO_HHM is needed +// - implementation of some additional setup questions +// do it here +// NOTE#1 Once SIO_INIT function invoced SIO Logical device allready selected +// NOTE#2 If Device Does not require any additional initialization just set +// InitRoutine field to NULL in SioDevLst[] Table. +// +// Input: +// IN AMI_SIO_PROTOCOL *AmiSio - Logical Device's information +// IN EFI_PCI_IO_PROTOCOL *PciIo - Read/Write PCI config space +// IN SIO_INIT_STEP InitStep - Initial routine step +// +// Output: None +// EFI_STATUS +// EFI_SUCCESS - Initial step sucessfully +// EFI_INVALID_PARAMETER - not find the initial step +// +// Modified: Nothing +// +// Referrals: None +// +// Note: +// It is recommended to have a separate Initialization Routine for each SIO Device. +// it will save you some code needed to detect which device is currently selected. +// case isGetSetupData: +// SIO implementation uses separate set of NVRAM variables +// associated with each LogicalDevice who has +// SPIO_DEV.DeviceInfo->HasSetup property set to true. +// Current Setup Settings are stored in SPIO_DEV.NvData. +// If due to different look and fill we need to overwrite standard +// Setup settings, we can do it here..... +// ===================================================== +// if(SetupData==NULL){ +// Status=GetSetupData(); +// if(EFI_ERROR(Status)) return Status; +// } +// dev->NvData.DevEnable = SetupData->FdcEnable; +// dev->NvData.DevPrsId = 0;//SetupData->FdcPrsId; +// dev->NvData.DevMode = 0;//SetupData->FdcMode; +// break; +// +// case isPrsSelect: +// If LDN uses non-standard way to determine possible resources(_PRS), +// or _PRS may wary based on LD mode. Then here we can get LD mode using +// SPIO_DEV.NvData.Mode field and get corresponded to the mode _PRS Buffer +// using GetPrsFromAml() function if ACPISUPPORT is ON. Or set of functions +// EFI_STATUS SetUartPrs(SPIO_DEV *Dev); +// EFI_STATUS SetLptPrs(SPIO_DEV *Dev, BOOLEAN UseDma); +// EFI_STATUS SetFdcPrs(SPIO_DEV *Dev); +// EFI_STATUS SetPs2kPrs(SPIO_DEV *Dev); +// EFI_STATUS SetPs2mPrs(SPIO_DEV *Dev); +// EFI_STATUS SetGamePrs(SPIO_DEV *Dev); +// EFI_STATUS SetMpu401Prs(SPIO_DEV *Dev); +// Defined in GenericSio.h +// +// case isBeforeActivate: +// //If any register needs to be initialized, whle enumerating all SIO devices. +// //Use NEW SbLib_SetLpcDeviceDecoding() function to set Device Decoding Range for +// //Legacy devices. Implementation in SbGeneric.c, definition in SbCspLib.h +// //===================================================== +// +// case isAfterActivate: +// //Ttis Initialization step is used to programm any runtime registers rsiding in +// //Decvice's decoded io space like SIO_GPIOs, SIO_PM, HHM registers. +// //This Programming is needed if device doesnot have or don't need driver to do so. +// //If there are a spetial driver like could be for HHM which could get THIS device handle +// //and programm like Terminal Driver for COM ports and Floppy Driver for FDC +// //nothing needs to be done here +// +// case isAfterBootScript: +// //This initialization step is needed to +// //Use NEW SbLib_SetLpcDeviceDecoding() function to set Device Decoding Range for Legacy devices +// +//------------------------------------------------------------------------- +// <AMI_PHDR_END> + +// <AMI_PHDR_START> +//------------------------------------------------------------------------- +// +// Procedure: FDC_Init +// +// Description: +// This function provide each initial routine in genericsio.c +// +// Input: +// IN AMI_SIO_PROTOCOL *AmiSio - Logical Device's information +// IN EFI_PCI_IO_PROTOCOL *PciIo - Read/Write PCI config space +// IN SIO_INIT_STEP InitStep - Initial routine step +// +// Output: +// EFI_SUCCESS - Initial step sucessfully +// EFI_INVALID_PARAMETER - not find the initial step +// +// Modified: Nothing +// +// Referrals: None +// +// Notes: +//------------------------------------------------------------------------- +// <AMI_PHDR_END> +static EFI_STATUS FDC_Init( + IN AMI_SIO_PROTOCOL *AmiSio, + IN EFI_PCI_IO_PROTOCOL *PciIo, + IN SIO_INIT_STEP InitStep +) +{ + EFI_STATUS Status=EFI_SUCCESS; + SPIO_DEV *dev=(SPIO_DEV*)AmiSio; + UINT8 rv; //FdcMode Register + + switch (InitStep) + { + case isGetSetupData: + // Disable IODecode? + if((!dev->DeviceInfo->Implemented) || (!dev->NvData.DevEnable)) + LoopCspIoDecodeListInit(NULL,AmiSio); + break; + + case isPrsSelect: + break; + + case isBeforeActivate: + LoopCspIoDecodeListInit(PciIo,AmiSio); // Enable IODecode + + //AMI_TODO: please check the register define and program FDC mode + + //Read FDC Mode register + Status=AmiSio->Access(AmiSio,FALSE,FALSE,0xF0,&rv); + ASSERT_EFI_ERROR(Status); + if(EFI_ERROR(Status))return Status; + + if(dev->NvData.DevMode)rv |= 0x10; //Bit00 set = FDD is Write Protect + else rv &= (UINT8)(~0x10); + + Status=AmiSio->Access(AmiSio,TRUE,FALSE,0xF0,&rv); + ASSERT_EFI_ERROR(Status); + + + break; + + case isAfterActivate: + break; + + #if(CORE_AFTER_4634) + case isAfterBootScript: + break; + #endif + + default: Status=EFI_INVALID_PARAMETER; + } //switch + + return Status; +} + +// <AMI_PHDR_START> +//------------------------------------------------------------------------- +// +// Procedure: COM_Init +// +// Description: +// This function provide each initial routine in genericsio.c +// +// Input: +// IN AMI_SIO_PROTOCOL *AmiSio - Logical Device's information +// IN EFI_PCI_IO_PROTOCOL *PciIo - Read/Write PCI config space +// IN SIO_INIT_STEP InitStep - Initial routine step +// +// Output: +// EFI_SUCCESS - Initial step sucessfully +// EFI_INVALID_PARAMETER - not find the initial step +// +// Modified: Nothing +// +// Referrals: None +// +// Notes: +//------------------------------------------------------------------------- +// <AMI_PHDR_END> +static EFI_STATUS COM_Init( + IN AMI_SIO_PROTOCOL *AmiSio, + IN EFI_PCI_IO_PROTOCOL *PciIo, + IN SIO_INIT_STEP InitStep +) +{ + EFI_STATUS Status=EFI_SUCCESS; + SPIO_DEV *dev=(SPIO_DEV*)AmiSio; + UINT8 rv; + + switch (InitStep) + { + case isGetSetupData: + if((!dev->DeviceInfo->Implemented) || (!dev->NvData.DevEnable)) { + LoopCspIoDecodeListInit(NULL,AmiSio); + ClearDevResource(dev); + } + break; + + case isPrsSelect: + break; + + case isBeforeActivate: + + //Only decode UART1/UART2. More others UART port is decode in PEI + //Attention! Remove the more com ports to PEI decode. + if(dev->DeviceInfo->UID <= 0x02) + LoopCspIoDecodeListInit(PciIo,AmiSio); + + //Programm Device Mode register here(if NEEDED)use AmiSioProtocol + if(DXE_COM_Mode_Init_Table[dev->DeviceInfo->UID].AndData8 == 0xFF) { + rv=DXE_COM_Mode_Init_Table[dev->DeviceInfo->UID].OrData8; + } else { + Status=AmiSio->Access(AmiSio, FALSE, FALSE, 0xF0, &rv); + ASSERT_EFI_ERROR(Status); + rv &= DXE_COM_Mode_Init_Table[dev->DeviceInfo->UID].AndData8; + rv |= DXE_COM_Mode_Init_Table[dev->DeviceInfo->UID].OrData8; + } + Status=AmiSio->Access(AmiSio,TRUE,FALSE,0xF0,&rv); + + //AMI_TODO: You can program device mode as follow: + + if(dev->DeviceInfo->UID == 0x05) { + Status=AmiSio->Access(AmiSio,FALSE,FALSE,0xF1,&rv); + ASSERT_EFI_ERROR(Status); + if(EFI_ERROR(Status))return Status; + //clear Bit4~3 where COM Port mode is: + rv &= 0xE7; + switch (dev->NvData.DevMode) { + case 0: + rv |= 0x00; //Bit4~3 = 000, Disable IR1 function + break; + case 1: + rv |= 0x10; //Bit4~3 = 010, Enable IR1 function, active pulse is 1.6uS + break; + case 2: + rv |= 0x18; //Bit4~3 = 011, Enable IR1 function, active pulse is 3/16 bit time + break; + default: return EFI_INVALID_PARAMETER; + } + Status=AmiSio->Access(AmiSio,TRUE,FALSE,0xF1,&rv); + ASSERT_EFI_ERROR(Status); + } + + //Programm Serial_X IRQ Share register. + if((dev->DeviceInfo->Flags & SIO_SHR_IRQ1) && dev->ResOwner) { + //enter cfgmode + SioCfgMode(dev->Owner, TRUE); + //set device resource owner share register + DevSelect(dev->ResOwner); + SioRegister(dev->ResOwner, FALSE, 0xF0, &rv);//read reg0xF0 value + rv |= 0x01; //Bit1:share or normal + SioRegister(dev->ResOwner, TRUE, 0xF0, &rv);//write reg0xF0 value + //set device irq register + DevSelect(dev); + SioRegister(dev->ResOwner, FALSE, 0x70, &rv);//read reg0x70 value + SioRegister(dev, TRUE, 0x70, &rv);//write reg0x70 value + SioRegister(dev, FALSE, 0xF0, &rv);//read reg0xF0 value + rv |= 0x01; //Bit1:share or normal + SioRegister(dev, TRUE, 0xF0, &rv);//write reg0xF0 value + //exit cfgmode + SioCfgMode(dev->Owner, FALSE); + dev->VlData.DevIrq1=dev->ResOwner->VlData.DevIrq1; + } + + break; + + case isAfterActivate: + break; + + #if(CORE_AFTER_4634) + case isAfterBootScript: + break; + #endif + + default: Status=EFI_INVALID_PARAMETER; + }//switch + return Status; +} + +// <AMI_PHDR_START> +//------------------------------------------------------------------------- +// +// Procedure: LPT_Init +// +// Description: +// This function provide each initial routine in genericsio.c +// +// Input: +// IN AMI_SIO_PROTOCOL *AmiSio - Logical Device's information +// IN EFI_PCI_IO_PROTOCOL *PciIo - Read/Write PCI config space +// IN SIO_INIT_STEP InitStep - Initial routine step +// +// Output: +// EFI_SUCCESS - Initial step sucessfully +// EFI_INVALID_PARAMETER - not find the initial step +// +// Modified: Nothing +// +// Referrals: None +// +// Notes: +//------------------------------------------------------------------------- +// <AMI_PHDR_END> +static EFI_STATUS LPT_Init( + IN AMI_SIO_PROTOCOL *AmiSio, + IN EFI_PCI_IO_PROTOCOL *PciIo, + IN SIO_INIT_STEP InitStep +) +{ + EFI_STATUS Status=EFI_SUCCESS; + SPIO_DEV *dev=(SPIO_DEV*)AmiSio; + UINT8 rv; //LptMode Register + + switch (InitStep) { + case isGetSetupData: + // Disable decode? + if((!dev->DeviceInfo->Implemented) || (!dev->NvData.DevEnable)) + LoopCspIoDecodeListInit(NULL,AmiSio); + break; + + case isPrsSelect: + //depend on LPT Mode it may or may not use a DMA channel + Strcpy(&dev->DeviceInfo->AslName[0],"LPTE"); + if(dev->NvData.DevMode&0x04) { + #if ACPI_SUPPORT + //if ACPI is Supported get _PRS for Extended Parallel Port from DSDT + //last parameter is 0-based index in F81866_DevLst[] table. + Status=GetPrsFromAml(dev,"EPPR", 1); + #else + //if ACPI is not supported use corresponded Function seting + //"UseDma" parameter to TRUE for Extended Parallel Port + Status=SetLptPrs(dev, TRUE); + #endif + }else { + #if ACPI_SUPPORT + //if ACPI is Supported get _PRS for Standard Parallel Port from DSDT + //last parameter is 0-based index in WPCD376I_DevLst[] table. + Status=GetPrsFromAml(dev,"LPPR", 1); + #else + //if ACPI is not supported use corresponded Function seting + //"UseDma" parameter to FALSE for Standard Parallel Port + Status=SetLptPrs(dev, FALSE); + #endif + } + ASSERT_EFI_ERROR(Status); + + break; + + case isBeforeActivate: + LoopCspIoDecodeListInit(PciIo,AmiSio); // Enable IODecode + + //Programm Device Mode register here(if NEEDED)use AmiSioProtocol + + //AMI_TODO: You can program device mode as follow: + + //Programm Device Mode register here(if NEEDED)use AmiSioProtocol + Status=AmiSio->Access(AmiSio,FALSE,FALSE,0xF0,&rv); //LPT Configuration Reg, Read the reg value + ASSERT_EFI_ERROR(Status); + if(EFI_ERROR(Status))return Status; + + //Program Lpt Mode register following SIO Specification instructions. + //Set mode:Bit2-0 set = LPT mode + //clear lowest 3 bits where LPT mode is: + rv&=0xF8; + switch (dev->NvData.DevMode) { + case 0: rv|=4; //STD Printer Mode + break; + case 1: rv|=0; //SPP Mode + break; + case 2: rv|=1; //EPP-1.9 and SPP Mode + break; + case 3: rv|=5; //EPP-1.7 and SPP Mode + break; + case 4: rv|=2; //ECP Mode + break; + case 5: rv|=3; //ECP and EPP-1.9 Mode + break; + case 6: rv|=7; //ECP and EPP-1.7 Mode + break; + default: return EFI_INVALID_PARAMETER; + } + //Program back Device Mode register + Status=AmiSio->Access(AmiSio,TRUE,FALSE,0xF0,&rv); + ASSERT_EFI_ERROR(Status); + + break; + + case isAfterActivate: + break; + + #if(CORE_AFTER_4634) + case isAfterBootScript: + break; + #endif + + default: Status=EFI_INVALID_PARAMETER; + } //switch + + return Status; +} + +// <AMI_PHDR_START> +//------------------------------------------------------------------------- +// +// Procedure: KBC_Init +// +// Description: +// This function provide each initial routine in genericsio.c +// +// Input: +// IN AMI_SIO_PROTOCOL *AmiSio - Logical Device's information +// IN EFI_PCI_IO_PROTOCOL *PciIo - Read/Write PCI config space +// IN SIO_INIT_STEP InitStep - Initial routine step +// +// Output: +// EFI_SUCCESS - Initial step sucessfully +// EFI_INVALID_PARAMETER - not find the initial step +// +// Modified: Nothing +// +// Referrals: None +// +// Notes: +//------------------------------------------------------------------------- +// <AMI_PHDR_END> +static EFI_STATUS KBC_Init( + IN AMI_SIO_PROTOCOL *AmiSio, + IN EFI_PCI_IO_PROTOCOL *PciIo, + IN SIO_INIT_STEP InitStep +) +{ + EFI_STATUS Status=EFI_SUCCESS; + + switch (InitStep) { + case isGetSetupData: + case isPrsSelect: + case isAfterActivate: + #if(CORE_AFTER_4634) + case isAfterBootScript: + #endif + break; + + case isBeforeActivate: + LoopCspIoDecodeListInit(PciIo,AmiSio); // Enable IODecode + break; + + default: Status=EFI_INVALID_PARAMETER; + } //switch + + return Status; +} + +// <AMI_PHDR_START> +//------------------------------------------------------------------------- +// +// Procedure: PME_Init +// +// Description: +// This function provide each initial routine in genericsio.c +// +// Input: +// IN AMI_SIO_PROTOCOL *AmiSio - Logical Device's information +// IN EFI_PCI_IO_PROTOCOL *PciIo - Read/Write PCI config space +// IN SIO_INIT_STEP InitStep - Initial routine step +// +// Output: +// EFI_SUCCESS - Initial step sucessfully +// EFI_INVALID_PARAMETER - not find the initial step +// +// Modified: Nothing +// +// Referrals: None +// +// Notes: +//------------------------------------------------------------------------- +// <AMI_PHDR_END> +static EFI_STATUS PME_Init( + IN AMI_SIO_PROTOCOL *AmiSio, + IN EFI_PCI_IO_PROTOCOL *PciIo, + IN SIO_INIT_STEP InitStep +) +{ + EFI_STATUS Status=EFI_SUCCESS; + + #if F81866_PME_CONTROLLER_PRESENT + + + switch (InitStep) { + case isGetSetupData: + break; + + case isPrsSelect: + break; + + case isBeforeActivate: + // OEM_TODO: You need to fill DXE_PME_Init_Table[] first. + + break; + + case isAfterActivate: + break; + + #if(CORE_AFTER_4634) + case isAfterBootScript: + break; + #endif + + default: Status=EFI_INVALID_PARAMETER; + } //switch + #endif + + return Status; +} + +// <AMI_PHDR_START> +//------------------------------------------------------------------------- +// +// Procedure: HWM_Init +// +// Description: +// This function provide each initial routine in genericsio.c +// +// Input: +// IN AMI_SIO_PROTOCOL *AmiSio - Logical Device's information +// IN EFI_PCI_IO_PROTOCOL *PciIo - Read/Write PCI config space +// IN SIO_INIT_STEP InitStep - Initial routine step +// +// Output: +// EFI_SUCCESS - Initial step sucessfully +// EFI_INVALID_PARAMETER - not find the initial step +// +// Modified: Nothing +// +// Referrals: None +// +// Notes: +//------------------------------------------------------------------------- +// <AMI_PHDR_END> +static EFI_STATUS HWM_Init( + IN AMI_SIO_PROTOCOL *AmiSio, + IN EFI_PCI_IO_PROTOCOL *PciIo, + IN SIO_INIT_STEP InitStep +) +{ + EFI_STATUS Status=EFI_SUCCESS; + SPIO_DEV *dev=(SPIO_DEV*)AmiSio; + BootScriptProtocol = dev->Owner->BootScript; + + #if F81866_HWM_PRESENT + + switch (InitStep) { + case isGetSetupData: + break; + + case isPrsSelect: + break; + + case isBeforeActivate: + // HWM registers initial if needed. + // AMI_TODO: Add init function for configure HWM SIO space. + + break; + + case isAfterActivate: + // HWM registers initial if needed. + // AMI_TODO: Add init function for configure HWM SIO space. + ProgramIsaRegisterTable(F81866_HWM_BASE_ADDRESS+0x05, \ + F81866_HWM_BASE_ADDRESS+0x06, \ + DXE_HWM_Init_Table_After_Active, + sizeof(DXE_HWM_Init_Table_After_Active)/sizeof(DXE_DEVICE_INIT_DATA)); + + #if F81866_SMF_SUPPORT + F81866SmartFunction(); + #endif + break; + + #if(CORE_AFTER_4634) + case isAfterBootScript: + //AMI_TODO: + // Restore HWM registers after Sx resume, if needed. + // Below HWM read/write interface is LPC/ISA interface, + // if other interface, please re-program it. + // This, Width, Address, Count, Buffer + SaveSxSioRegisterTable(F81866_HWM_BASE_ADDRESS+0x05, \ + F81866_HWM_BASE_ADDRESS+0x06, \ + DXE_HWM_SIO_BootScript_Table, + sizeof(DXE_HWM_SIO_BootScript_Table)/sizeof(UINT8)); + break; + #endif + + + default: Status=EFI_INVALID_PARAMETER; + } //switch + #endif + + return Status; +} + +// <AMI_PHDR_START> +//------------------------------------------------------------------------- +// +// Procedure: GPIO_Init +// +// Description: +// This function provide each initial routine in genericsio.c +// +// Input: +// IN AMI_SIO_PROTOCOL *AmiSio - Logical Device's information +// IN EFI_PCI_IO_PROTOCOL *PciIo - Read/Write PCI config space +// IN SIO_INIT_STEP InitStep - Initial routine step +// +// Output: +// EFI_SUCCESS - Initial step sucessfully +// EFI_INVALID_PARAMETER - not find the initial step +// +// Modified: Nothing +// +// Referrals: None +// +// Notes: +//------------------------------------------------------------------------- +// <AMI_PHDR_END> +static EFI_STATUS GPIO_Init( + IN AMI_SIO_PROTOCOL *AmiSio, + IN EFI_PCI_IO_PROTOCOL *PciIo, + IN SIO_INIT_STEP InitStep +) +{ + EFI_STATUS Status=EFI_SUCCESS; + #if F81866_GPIO_PORT_PRESENT + + + switch (InitStep) { + case isGetSetupData: + break; + + case isPrsSelect: + break; + + case isBeforeActivate: + + break; + case isAfterActivate: + break; + + #if(CORE_AFTER_4634) + case isAfterBootScript: + break; + #endif + + default: Status=EFI_INVALID_PARAMETER; + } //switch + #endif + + return Status; +} + +// <AMI_PHDR_START> +//------------------------------------------------------------------------- +// +// Procedure: WDT_Init +// +// Description: +// This function provide each initial routine in genericsio.c +// +// Input: +// IN AMI_SIO_PROTOCOL *AmiSio - Logical Device's information +// IN EFI_PCI_IO_PROTOCOL *PciIo - Read/Write PCI config space +// IN SIO_INIT_STEP InitStep - Initial routine step +// +// Output: +// EFI_SUCCESS - Initial step sucessfully +// EFI_INVALID_PARAMETER - not find the initial step +// +// Modified: Nothing +// +// Referrals: None +// +// Notes: +//------------------------------------------------------------------------- +// <AMI_PHDR_END> +static EFI_STATUS WDT_Init( + IN AMI_SIO_PROTOCOL *AmiSio, + IN EFI_PCI_IO_PROTOCOL *PciIo, + IN SIO_INIT_STEP InitStep +) +{ + EFI_STATUS Status=EFI_SUCCESS; + + switch (InitStep) { + case isGetSetupData: + break; + + case isPrsSelect: + break; + + case isBeforeActivate: + + break; + case isAfterActivate: + break; + + #if(CORE_AFTER_4634) + case isAfterBootScript: + break; + #endif + + default: Status=EFI_INVALID_PARAMETER; + } //switch + + return Status; +} + +//------------------------------------------------------------------------- +//!!!!!!!!!!! Porting End !!!!!!!!!!! +//------------------------------------------------------------------------- +// <AMI_PHDR_START> +//------------------------------------------------------------------------- +// +// Procedure: ClearDevResource +// +// Description: +// This function will Clear SIO resource +// +// Input: +// SPIO_DEV* dev +// Output: +// NONE +// +//------------------------------------------------------------------------- +// <AMI_PHDR_END> +VOID ClearDevResource( + IN SPIO_DEV* dev) +{ + UINT8 Value8; + Value8=0x00; + SioCfgMode(dev->Owner, TRUE); + DevSelect(dev); + SioRegister(dev, TRUE,F81866_BASE1_HI_REGISTER,&Value8); + SioRegister(dev, TRUE,F81866_BASE1_LO_REGISTER,&Value8); +// SioRegister(dev, TRUE,F81866_BASE2_HI_REGISTER,&Value8); +// SioRegister(dev, TRUE,F81866_BASE2_LO_REGISTER,&Value8); + SioRegister(dev, TRUE,F81866_IRQ1_REGISTER,&Value8); +// SioRegister(dev, TRUE,F81866_IRQ2_REGISTER,&Value8); +// SioRegister(dev, TRUE,F81866_DMA1_REGISTER,&Value8); +// SioRegister(dev, TRUE,F81866_DMA2_REGISTER,&Value8); + SioCfgMode(dev->Owner, FALSE); + return; + +} +// <AMI_PHDR_START> +//------------------------------------------------------------------------- +// +// Procedure: ProgramSioRegisterTable +// +// Description: +// This function will Program the SIO config space. +// +// Input: +// IN DXE_DEVICE_INIT_DATA *Table - initial table +// IN UINT8 Count Table Length +// +// Output: +// NONE +// +//------------------------------------------------------------------------- +// <AMI_PHDR_END> +VOID ProgramSioRegisterTable( + IN AMI_SIO_PROTOCOL *AmiSio, + IN DXE_DEVICE_INIT_DATA *Table, + IN UINT8 Count +) +{ + UINT8 i; + UINT8 Value8; + + for(i=0;i<Count;i++) { + if(Table[i].AndData8 == 0xFF) + Value8=Table[i].OrData8; + else { + AmiSio->Access(AmiSio, FALSE, FALSE, (UINT8)(Table[i].Reg16), &Value8); + Value8 &= Table[i].AndData8; + Value8 |= Table[i].OrData8; + } + AmiSio->Access(AmiSio, TRUE, FALSE, (UINT8)(Table[i].Reg16), &Value8); + } + + return; +} + +// <AMI_PHDR_START> +//------------------------------------------------------------------------- +// +// Procedure: ProgramIsaRegisterTable +// +// Description: +// This function will Program the SIO config space. +// +// Input: +// IN UINT16 Index - Index port +// IN UINT16 Data - Data port +// IN UINT16 *Table - initial table +// IN UINT8 Count Table Length +// +// Output: +// NONE +// +//------------------------------------------------------------------------- +// <AMI_PHDR_END> +VOID ProgramIsaRegisterTable( + IN UINT16 Index, + IN UINT16 Data, + IN DXE_DEVICE_INIT_DATA *Table, + IN UINT8 Count +) +{ + UINT8 i; + UINT8 Value8; + + for(i=0;i<Count;i++) { + if(Table[i].AndData8 == 0xFF) + Value8=Table[i].OrData8; + else { + IoWrite8(Index, (UINT8)(Table[i].Reg16)); + Value8 = IoRead8(Data); + Value8 &= Table[i].AndData8; + Value8 |= Table[i].OrData8; + } + IoWrite8(Index, (UINT8)(Table[i].Reg16)); + IoWrite8(Data, Value8); + } + + return; +} +// <AMI_PHDR_START> +//------------------------------------------------------------------------- +// +// Procedure: ProgramRtRegisterTable +// +// Description: +// This function will program the runtime register. +// +// Input: +// IN UINT16 Base - Runtime register IO base +// IN DXE_DEVICE_INIT_DATA *Table - initial table +// IN UINT8 Count Table Length +// +// Output: +// NONE +// +//------------------------------------------------------------------------- +// <AMI_PHDR_END> +VOID ProgramRtRegisterTable( + IN UINT16 Base, + IN DXE_DEVICE_INIT_DATA *Table, + IN UINT8 Count + +) +{ + UINT8 i; + UINT8 Value8; + + for(i=0;i<Count;i++) { + if(Table[i].AndData8 == 0xFF) + Value8 = Table[i].OrData8; + else + Value8 = (IoRead8(Base+Table[i].Reg16) & Table[i].AndData8)|\ + Table[i].OrData8; + IoWrite8(Base+Table[i].Reg16, Value8 ); + } +} + +// <AMI_PHDR_START> +//------------------------------------------------------------------------- +// +// Procedure: SaveSxSioRegisterTable +// +// Description: +// This function will Save the SIO registers to boot script Table +// +// Input: +// IN UINT16 Index - Index port +// IN UINT16 Data - Data port +// IN UINT16 *Table - initial table +// IN UINT8 Count Table Length +// +// Output: +// NONE +// +//------------------------------------------------------------------------- +// <AMI_PHDR_END> +VOID SaveSxSioRegisterTable( + IN UINT16 Index, + IN UINT16 Data, + IN UINT8 *Table, + IN UINT8 Count +) +{ + UINT8 i; + UINT8 Value8; + + for(i=0;i<Count;i++) { + IoWrite8(Index,Table[i]); + BOOT_SCRIPT_S3_IO_WRITE_MACRO(BootScriptProtocol, + EfiBootScriptWidthUint8, + Index, + 1, + &Table[i]); + Value8 = IoRead8(Data); + BOOT_SCRIPT_S3_IO_WRITE_MACRO(BootScriptProtocol, + EfiBootScriptWidthUint8, + Data, + 1, + &Value8); + } + + return; +} + +// <AMI_PHDR_START> +//------------------------------------------------------------------------- +// +// Procedure: SaveSxRtRegisterTable +// +// Description: +// This function will Save the runtime registers to boot script Table +// +// Input: +// IN UINT16 Index - Index port +// IN UINT16 Data - Data port +// IN UINT16 *Table - initial table +// IN UINT8 Count Table Length +// +// Output: +// NONE +// +//------------------------------------------------------------------------- +// <AMI_PHDR_END> +VOID SaveSxRtRegisterTable( + IN UINT16 Base, + IN UINT16 *Table, + IN UINT8 Count +) +{ + UINT8 i; + UINT8 Value8; + + for(i=0;i<Count;i++) { + Value8 = IoRead8(Base+Table[i]); + BOOT_SCRIPT_S3_IO_WRITE_MACRO(BootScriptProtocol, + EfiBootScriptWidthUint8, + (Base+Table[i]), + 1, + &Value8); + } + + return; + +} + +//************************************************************************* +//************************************************************************* +//** ** +//** (C)Copyright 1985-2011, American Megatrends, Inc. ** +//** ** +//** All Rights Reserved. ** +//** ** +//** 5555 Oakbrook Parkway, Suite 200, Norcross, GA 30093 ** +//** ** +//** Phone: (770)-246-8600 ** +//** ** +//************************************************************************* +//************************************************************************* + |