BayTrail/AaeonIoPkg/F81866/F81866DxeInit.c
2022-09-02 09:03:16 +08:00

1072 lines
39 KiB
C

//**********************************************************************
//**********************************************************************
//** **
//** (C)Copyright 1985-2013, American Megatrends, Inc. **
//** **
//** All Rights Reserved. **
//** **
//** 5555 Oakbrook Parkway, Suite 200, Norcross, GA 30093 **
//** **
//** Phone: (770)-246-8600 **
//** **
//**********************************************************************
//**********************************************************************
//**********************************************************************
//<AMI_FHDR_START>
//
// Name: <F81866DxeInit.c>
//
// Description: 1. Port SIO DXE initial table and routine for GenericSio.c
// 2. Define SIO bootscriptable table
//
//<AMI_FHDR_END>
//**********************************************************************
//----------------------------------------------------------------------
//Include Files
//----------------------------------------------------------------------
#include <AmiDxeLib.h>
#include <Library/AmiSioDxeLib.h>
#include <AmiGenericSio.h>
#include "F81866DxeIoTable.h"
//INTERNAL_085_RayWu, ADD 2015/01/28 >>
#include <Token.h>
#include <Setup.h>
//INTERNAL_085_RayWu, ADD 2015/01/28 <<
//INTERNAL_085_RayWu, ADD 2015/01/28 >>
#if defined(F81866_SMF_SUPPORT) && (F81866_SMF_SUPPORT == 1)
extern VOID F81866SmartFunction(VOID);
extern VOID SmartFanBootScript(EFI_S3_SAVE_STATE_PROTOCOL *BootScriptProtocol);
#endif //F81866_SMF_SUPPORT == 1
//INTERNAL_085_RayWu, ADD 2015/01/28 <<
#if !defined(AAEONPOWERMODE_SUPPORT) || (AAEONPOWERMODE_SUPPORT == 0)
#define AAEON_ACLOSS_LAST_STATE 0
#define AAEON_ACLOSS_ALWAYS_ON 1
#define AAEON_ACLOSS_ALWAYS_OFF 2
#if !defined(STATEAFTERG3_MAP)
#if defined(CRB_USE_VAR_STATEAFTERG3) && (CRB_USE_VAR_STATEAFTERG3 == 1)
UINT8 MapToACPowerLoss[3] = STATEAFTERG3_MAP {2, 0, 1}
#else
UINT8 MapToACPowerLoss[3] = STATEAFTERG3_MAP {2, 1, 0}
#endif
#endif
#endif
// F81866_ERP_Miles++ >>>>>
#if F81866_ERP_SUPPORT
EFI_STATUS F81866ErpModeCfg(VOID)
{
EFI_GUID SetupGuid = SETUP_GUID;
UINTN VariableSize = sizeof(SETUP_DATA);
EFI_STATUS Status;
SETUP_DATA *SetupData = NULL;
UINT8 reg8;
TRACE((TRACE_ALWAYS, "[F81866ErpModeCfg]Enter F81866ErpModeCfg\n"));
Status = GetEfiVariable(L"Setup", &SetupGuid, NULL, &VariableSize, &SetupData);
IoWrite8(F81866_CONFIG_INDEX, F81866_CONFIG_MODE_ENTER_VALUE);
IoWrite8(F81866_CONFIG_INDEX, F81866_CONFIG_MODE_ENTER_VALUE);
IoWrite8(F81866_CONFIG_INDEX, F81866_LDN_SEL_REGISTER);
IoWrite8(F81866_CONFIG_DATA, F81866_LDN_PME);
#if AAEONPOWERMODE_SUPPORT
if((SetupData->F81866ErpMode != 0x00) && (SetupData->AaeonPowerMode == 0x0))
#else
if(SetupData->F81866ErpMode != 0x00)
#endif
{
if(SetupData->F81866ErpMode == 1)
{
//Intel DSW mode
#if AAEONPOWERMODE_SUPPORT
if(SetupData->AaeonRestoreACPowerLoss == 2)
#else
#if CRB_USE_VAR_STATEAFTERG3
if((SetupData->F81866RestoreACPowerLoss == 0x02) || ((SetupData->F81866RestoreACPowerLoss == 0x03) && (SetupData.StateAfterG3 == MapToACPowerLoss[AAEON_ACLOSS_ALWAYS_OFF])))
#else
if((SetupData->F81866RestoreACPowerLoss == 0x02) || ((SetupData->F81866RestoreACPowerLoss == 0x03) && (SetupData->LastState == MapToACPowerLoss[AAEON_ACLOSS_ALWAYS_OFF])))
#endif
#endif
{
//Always off: Set ERP on for S5 and AC_Failure
IoWrite8(F81866_CONFIG_INDEX, 0xE1);
reg8 = (IoRead8(F81866_CONFIG_DATA) & 0xF0) | 0x05;
IoWrite8(F81866_CONFIG_DATA, reg8);
} else
{
//Always on/Last state-on: Set ERP off for AC_Failure, ERP on for S5
IoWrite8(F81866_CONFIG_INDEX, 0xE1);
reg8 = (IoRead8(F81866_CONFIG_DATA) & 0xF0) | 0x04;
IoWrite8(F81866_CONFIG_DATA, reg8);
}
} else
{
//ERP mode
#if AAEONPOWERMODE_SUPPORT
if(SetupData->AaeonRestoreACPowerLoss == 2)
#else
#if CRB_USE_VAR_STATEAFTERG3
if((SetupData->F81866RestoreACPowerLoss == 0x02) || ((SetupData->F81866RestoreACPowerLoss == 0x03) && (SetupData->StateAfterG3 == MapToACPowerLoss[AAEON_ACLOSS_ALWAYS_OFF])))
#else
if((SetupData->F81866RestoreACPowerLoss == 0x02) || ((SetupData->F81866RestoreACPowerLoss == 0x03) && (SetupData->LastState == MapToACPowerLoss[AAEON_ACLOSS_ALWAYS_OFF])))
#endif
#endif
{
//Always off: Set ERP on for S5 and AC_Failure
IoWrite8(F81866_CONFIG_INDEX, 0xE1);
reg8 = (IoRead8(F81866_CONFIG_DATA) & 0xF0) | 0x0F;
IoWrite8(F81866_CONFIG_DATA, reg8);
} else
{
//Always on/Last state-on: Set ERP off for AC_Failure, ERP on for S5
IoWrite8(F81866_CONFIG_INDEX, 0xE1);
reg8 = (IoRead8(F81866_CONFIG_DATA) & 0xF0) | 0x0C;
IoWrite8(F81866_CONFIG_DATA, reg8);
}
}
IoWrite8(F81866_CONFIG_INDEX, 0xEC);
#if INTEL_DEEP_SX_SUPPORT
if(SetupData->F81866ErpMode == 1)
reg8 = (IoRead8(F81866_CONFIG_DATA) & 0x3F) | 0xC0;
else
reg8 = IoRead8(F81866_CONFIG_DATA) & 0x3F;
// reg8 = (IoRead8(F81866_CONFIG_DATA) & 0x3F) | 0x40;
#else
reg8 = IoRead8(F81866_CONFIG_DATA) & 0x3F;
#endif
IoWrite8(F81866_CONFIG_DATA, reg8);
IoWrite8(F81866_CONFIG_INDEX, 0xE0);
reg8 = IoRead8(F81866_CONFIG_DATA) | 0x80;
IoWrite8(F81866_CONFIG_DATA, reg8);
} else
{
IoWrite8(F81866_CONFIG_INDEX, 0xE0);
reg8 = IoRead8(F81866_CONFIG_DATA) & 0x7F;
IoWrite8(F81866_CONFIG_DATA, reg8);
}
IoWrite8(F81866_CONFIG_INDEX, F81866_CONFIG_MODE_EXIT_VALUE);
if (SetupData) pBS->FreePool(SetupData);
return EFI_SUCCESS;
}
#endif //F81866_ERP_SUPPORT
// F81866_ERP_Miles++ <<<<<
// <AMI_PHDR_START>
//----------------------------------------------------------------------
//
// Procedure: F81866_ClearDevResource
//
// Description:
// This function will Clear SIO resource.
//
// Input:
// SIO_DEV2* Dev
// Output:
// NONE
//
//----------------------------------------------------------------------
// <AMI_PHDR_END>
VOID F81866_ClearDevResource(
IN SIO_DEV2 *Dev
)
{
//Enter Configuration Mode.
IoWrite8(F81866_CONFIG_INDEX, F81866_CONFIG_MODE_ENTER_VALUE);
IoWrite8(F81866_CONFIG_INDEX, F81866_CONFIG_MODE_ENTER_VALUE);
//Seclect device
IoWrite8(F81866_CONFIG_INDEX, F81866_LDN_SEL_REGISTER);
IoWrite8(F81866_CONFIG_DATA, Dev->DeviceInfo->Ldn);
//Clear Base Address
IoWrite8(F81866_CONFIG_INDEX, F81866_BASE1_HI_REGISTER);
IoWrite8(F81866_CONFIG_DATA, 0);
IoWrite8(F81866_CONFIG_INDEX, F81866_BASE1_LO_REGISTER);
IoWrite8(F81866_CONFIG_DATA, 0);
//Clear Interrupt
IoWrite8(F81866_CONFIG_INDEX, F81866_IRQ1_REGISTER);
IoWrite8(F81866_CONFIG_DATA, 0);
//Exit Configuration Mode
IoWrite8(F81866_CONFIG_INDEX, F81866_CONFIG_MODE_EXIT_VALUE);
return;
}
// <AMI_PHDR_START>
//----------------------------------------------------------------------
//
// Procedure: F81866_FDC_Init
//
// Description:
// This function provide each initial routine in genericsio.c
//
// Input:
// IN AMI_BOARD_INIT_PROTOCOL *This - AMI Board Int Protocol.
// IN UINTN *Function - AMI Sdl SIO Init Routine.
// IN OUT VOID *ParameterBlock - SIO Component Initialization Routine Parameters Block...
//
// Output:
// EFI_SUCCESS - Initial step sucessfully
// EFI_INVALID_PARAMETER - not find the initial step
//
// Modified: Nothing
//
// Referrals: None
//
// Notes:
//----------------------------------------------------------------------
// <AMI_PHDR_END>
#if F81866_FLOPPY_PORT_PRESENT
EFI_STATUS F81866_FDC_Init(
IN AMI_BOARD_INIT_PROTOCOL *This,
IN UINTN *Function,
IN OUT VOID *ParameterBlock
)
{
//Update Standard parameter block
AMI_BOARD_INIT_PARAMETER_BLOCK *Args=(AMI_BOARD_INIT_PARAMETER_BLOCK*)ParameterBlock;
SIO_INIT_STEP InitStep=(SIO_INIT_STEP)Args->InitStep;
AMI_SIO_PROTOCOL *AmiSio=(AMI_SIO_PROTOCOL*)Args->Param1;
EFI_PCI_IO_PROTOCOL *PciIo=(EFI_PCI_IO_PROTOCOL*)Args->Param2;
EFI_STATUS Status=EFI_SUCCESS;
SIO_DEV2 *Dev=(SIO_DEV2*)AmiSio;
UINT8 rv; //FdcMode Register
//Check if parameters passed are VALID and
if(Args->Signature != AMI_SIO_PARAM_SIG) return EFI_INVALID_PARAMETER;
switch (InitStep) {
case isGetSetupData:
//Clear Device Resource?
if((!Dev->DeviceInfo->Implemented) || (!Dev->NvData.DevEnable)) {
F81866_ClearDevResource(Dev);
}
break;
case isPrsSelect:
break;
case isBeforeActivate:
#if !defined(SecDecodePkg_SUPPORT) || (SecDecodePkg_SUPPORT == 0)
//Decode?
if(Dev->DeviceInfo->Implemented && Dev->NvData.DevEnable) {
AmiSioLibSetLpcDeviceDecoding(PciIo,Dev->VlData.DevBase1, Dev->DeviceInfo->Uid, Dev->DeviceInfo->Type);
} else {
AmiSioLibSetLpcDeviceDecoding(PciIo,0, Dev->DeviceInfo->Uid, Dev->DeviceInfo->Type);
}
#endif
//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 isGetModeData: {
//FDC Has 2 possible modes
//Make sure Device Mode Strings are Static VAR!
//Otherwise The string will gone after control flow leave this function
static CHAR16 FdcModeStr1[] = L"Read Write";
static CHAR16 FdcModeStr2[] = L"Write Protect";
static CHAR16 FdcModeHelp[] = L"Change mode of Floppy Disk Controller. Select 'Read Write' for normal operation. Select 'Write Protect' mode for read only operation.";
//---------------------------------------------------
Dev->DevModeCnt=2;
//Make room for 2 floppy modes + Help String...
Dev->DevModeStr=MallocZ(sizeof(CHAR16*)*(Dev->DevModeCnt+1));
if(Dev->DevModeStr==NULL) {
Status=EFI_OUT_OF_RESOURCES;
ASSERT_EFI_ERROR(Status);
return Status;
}
Dev->DevModeStr[0]=&FdcModeStr1[0];
Dev->DevModeStr[1]=&FdcModeStr2[0];
Dev->DevModeStr[2]=&FdcModeHelp[0];
}
break;
case isAfterActivate:
break;
case isAfterBootScript:
break;
#if AMI_SIO_MINOR_VERSION >= 6
case isAfterSmmBootScript:
break;
#endif
default:
Status=EFI_INVALID_PARAMETER;
} //switch
return Status;
}
#endif
// <AMI_PHDR_START>
//----------------------------------------------------------------------
//
// Procedure: F81866_COM_Init
//
// Description:
// This function provide each initial routine in genericsio.c
//
// Input:
// IN AMI_BOARD_INIT_PROTOCOL *This - AMI Board Int Protocol.
// IN UINTN *Function - AMI Sdl SIO Init Routine.
// IN OUT VOID *ParameterBlock - SIO Component Initialization Routine Parameters Block...
//
// Output:
// EFI_SUCCESS - Initial step sucessfully
// EFI_INVALID_PARAMETER - not find the initial step
//
// Modified: Nothing
//
// Referrals: None
//
// Notes:
//----------------------------------------------------------------------
// <AMI_PHDR_END>
//#if F81866_SERIAL_PORT1_PRESENT | F81866_SERIAL_PORT2_PRESENT
EFI_STATUS F81866_COM_Init(
IN AMI_BOARD_INIT_PROTOCOL *This,
IN UINTN *Function,
IN OUT VOID *ParameterBlock
)
{
//Update Standard parameter block
AMI_BOARD_INIT_PARAMETER_BLOCK *Args=(AMI_BOARD_INIT_PARAMETER_BLOCK*)ParameterBlock;
SIO_INIT_STEP InitStep=(SIO_INIT_STEP)Args->InitStep;
AMI_SIO_PROTOCOL *AmiSio=(AMI_SIO_PROTOCOL*)Args->Param1;
EFI_PCI_IO_PROTOCOL *PciIo=(EFI_PCI_IO_PROTOCOL*)Args->Param2;
EFI_STATUS Status=EFI_SUCCESS;
SIO_DEV2 *Dev=(SIO_DEV2*)AmiSio;
// UINT8 rv; //ComMode Register //RayWu, REMOVE 2015/04/14
//Check if parameters passed are VALID and
if(Args->Signature != AMI_SIO_PARAM_SIG) return EFI_INVALID_PARAMETER;
switch (InitStep) {
case isGetSetupData:
//Clear Device Resource?
if((!Dev->DeviceInfo->Implemented) || (!Dev->NvData.DevEnable)) {
F81866_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 !defined(SecDecodePkg_SUPPORT) || (SecDecodePkg_SUPPORT == 0)
if(Dev->DeviceInfo->Uid < 0x02) {
//Decode?
if(Dev->DeviceInfo->Implemented && Dev->NvData.DevEnable) {
AmiSioLibSetLpcDeviceDecoding(PciIo,Dev->VlData.DevBase1, Dev->DeviceInfo->Uid, Dev->DeviceInfo->Type);
} else {
AmiSioLibSetLpcDeviceDecoding(PciIo,0, Dev->DeviceInfo->Uid, Dev->DeviceInfo->Type);
}
}
#endif
//RayWu, REMOVE 2015/04/14 >>
// //Program COM RS485/RS232 Mode Registers.
// if(F81866_DXE_COM_Mode_Init_Table[Dev->DeviceInfo->Uid].AndData8 == 0xFF) {
// rv=F81866_DXE_COM_Mode_Init_Table[Dev->DeviceInfo->Uid].OrData8;
// } else {
// Status=AmiSio->Access(AmiSio, FALSE, FALSE, F81866_DXE_COM_Mode_Init_Table[Dev->DeviceInfo->Uid].Reg8,&rv);
// ASSERT_EFI_ERROR(Status);
// rv &= F81866_DXE_COM_Mode_Init_Table[Dev->DeviceInfo->Uid].AndData8;
// rv |= F81866_DXE_COM_Mode_Init_Table[Dev->DeviceInfo->Uid].OrData8;
// }
// Status=AmiSio->Access(AmiSio,TRUE,FALSE,F81866_DXE_COM_Mode_Init_Table[Dev->DeviceInfo->Uid].Reg8,&rv);
// ASSERT_EFI_ERROR(Status);
// //Program COM Clock Source Registers.
// if(F81866_DXE_COM_Mode_Init_Table[Dev->DeviceInfo->Uid+6].AndData8 == 0xFF) {
// rv=F81866_DXE_COM_Mode_Init_Table[Dev->DeviceInfo->Uid+6].OrData8;
// } else {
// Status=AmiSio->Access(AmiSio, FALSE, FALSE, F81866_DXE_COM_Mode_Init_Table[Dev->DeviceInfo->Uid+6].Reg8,&rv);
// ASSERT_EFI_ERROR(Status);
// rv &= F81866_DXE_COM_Mode_Init_Table[Dev->DeviceInfo->Uid+6].AndData8;
// rv |= F81866_DXE_COM_Mode_Init_Table[Dev->DeviceInfo->Uid+6].OrData8;
// }
// Status=AmiSio->Access(AmiSio,TRUE,FALSE,F81866_DXE_COM_Mode_Init_Table[Dev->DeviceInfo->Uid+6].Reg8,&rv);
// ASSERT_EFI_ERROR(Status);
// //Programm Device Mode register here(if NEEDED)use AmiSioProtocol
// //AMI_TODO: You can program device mode as follow:
// if(Dev->DeviceInfo->Uid == 0x05) {
// //if(Dev->DeviceInfo->Uid == 0x01) {
// 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);
// if (Dev->NvData.DevMode > 0) {
// //Get DSDT.. we have to update it.
// ACPI_HDR *dsdt;
// EFI_PHYSICAL_ADDRESS a;
//
// Status=LibGetDsdt(&a,EFI_ACPI_TABLE_VERSION_ALL);
// if(EFI_ERROR(Status)) {
// SIO_TRACE((TRACE_SIO,"F81866_COM_Init: Fail to Get DSDT - returned %r\n", Status));
// ASSERT_EFI_ERROR(Status);
// } else dsdt=(ACPI_HDR*)a;
// Status=UpdateAslNameOfDevice(dsdt, Dev->DeviceInfo->AslName, "_HID", 0x1005D041);
// ASSERT_EFI_ERROR(Status);
// //Checksum
// dsdt->Checksum = 0;
// dsdt->Checksum = ChsumTbl((UINT8*)dsdt, dsdt->Length);
// }
// }
//RayWu, REMOVE 2015/04/14 <<
//RayWu, REMOVE 2015/04/14 >> Transfer to PEI phase
////RayWu, ADD 2014/12/05 >>
// // All UART default as 128 byte FIFO
// {
// UINT8 Value8;
//
// Status = AmiSio->Access(AmiSio, FALSE, FALSE, 0xF6, &Value8);
// Value8 |= (BIT0 + BIT1);
// Status = AmiSio->Access(AmiSio, TRUE, FALSE, 0xF6, &Value8);
// }
////RayWu, ADD 2014/12/05 <<
//RayWu, REMOVE 2015/04/14 <<
//RayWu, REMOVE 2014/12/05 >>
// //Programm Device to PCI IRQ shanre mode
// if((Dev->DeviceInfo->Flags & SIO_SHR_IRQ1) && Dev->ResOwner) {
// //Programm ResOwner
// //1. Config the share bit
// Status=AmiSio->Access((AMI_SIO_PROTOCOL *)Dev->ResOwner,FALSE,FALSE,0xF0,&rv);
// ASSERT_EFI_ERROR(Status);
// rv &= 0xFC;
// rv |= 0x01; //Bit0: 1: IRQ is ahring with other device
// //Bit1: 0: Sharing IRQ active low level mode
// Status=AmiSio->Access((AMI_SIO_PROTOCOL *)Dev->ResOwner,TRUE,FALSE,0xF0,&rv);
// ASSERT_EFI_ERROR(Status);
// //Programm Device
// //1. Config the share bit
// Status=AmiSio->Access(AmiSio,FALSE,FALSE,0xF0,&rv);
// ASSERT_EFI_ERROR(Status);
// rv &= 0xFC;
// rv |= 0x01; //Bit0: 1: IRQ is ahring with other device
// //Bit1: 1: Sharing IRQ active low level mode
// Status=AmiSio->Access(AmiSio,TRUE,FALSE,0xF0,&rv);
// ASSERT_EFI_ERROR(Status);
// //2. Config the IRQ resource
// //Status=AmiSio->Access(AmiSio,FALSE,FALSE,0x70,&rv);
// //ASSERT_EFI_ERROR(Status);
// //rv = Dev->ResOwner->VlData.DevIrq1; //Get the IRQ from the ResOwner
// //Status=AmiSio->Access(AmiSio,TRUE,FALSE,0x70,&rv);
// //ASSERT_EFI_ERROR(Status);
// //3. Update the Device Private Data
// //Dev->VlData.DevIrq1 = Dev->ResOwner->VlData.DevIrq1;
// }
//RayWu, REMOVE 2014/12/05 <<
break;
case isGetModeData:
//RayWu, REMOVE 2015/04/14 >>
// if(Dev->DeviceInfo->Uid == 0x05) {
// //COM6 Has 3 possible modes
// //Make sure Device Mode Strings are Static VAR!
// //Otherwise The string will gone after control flow leave this function
// static CHAR16 Com6ModeStr1[] = L"Disable IR1";
// static CHAR16 Com6ModeStr2[] = L"Enable IR1 (pulse 1.6uS)";
// static CHAR16 Com6ModeStr3[] = L"Enable IR1 (pulse 3/16 bit time)";
// static CHAR16 Com6ModeHelp[] = L"Change the Serial Port mode. Enable, Disable and Configure IR function.";
// //---------------------------------------------------
// Dev->DevModeCnt=3;
// //Make room for 2 floppy modes + Help String...
// Dev->DevModeStr=MallocZ(sizeof(CHAR16*)*(Dev->DevModeCnt+1));
// if(Dev->DevModeStr==NULL) {
// Status=EFI_OUT_OF_RESOURCES;
// ASSERT_EFI_ERROR(Status);
// return Status;
// }
// Dev->DevModeStr[0]=&Com6ModeStr1[0];
// Dev->DevModeStr[1]=&Com6ModeStr2[0];
// Dev->DevModeStr[2]=&Com6ModeStr3[0];
// Dev->DevModeStr[3]=&Com6ModeHelp[0];
// }
//RayWu, REMOVE 2015/04/14 <<
break;
case isAfterActivate:
break;
case isAfterBootScript:
break;
#if AMI_SIO_MINOR_VERSION >= 6
case isAfterSmmBootScript:
break;
#endif
default:
Status=EFI_INVALID_PARAMETER;
}//switch
return Status;
}
//#endif
//<AMI_PHDR_START>
//----------------------------------------------------------------------
//
//Procedure: F81866_LPT_Init
//
//Description:
// This function provide each initial routine in genericsio.c
//
//Input:
// IN AMI_BOARD_INIT_PROTOCOL *This - AMI Board Int Protocol.
// IN UINTN *Function - AMI Sdl SIO Init Routine.
// IN OUT VOID *ParameterBlock - SIO Component Initialization Routine Parameters Block...
//
//Output:
// EFI_SUCCESS - Initial step sucessfully
// EFI_INVALID_PARAMETER - not find the initial step
//
//Modified: Nothing
//
//Referrals: None
//
//Notes:
//----------------------------------------------------------------------
//<AMI_PHDR_END>
#if F81866_PARALLEL_PORT_PRESENT
EFI_STATUS F81866_LPT_Init(
IN AMI_BOARD_INIT_PROTOCOL *This,
IN UINTN *Function,
IN OUT VOID *ParameterBlock
)
{
//Update Standard parameter block
AMI_BOARD_INIT_PARAMETER_BLOCK *Args=(AMI_BOARD_INIT_PARAMETER_BLOCK*)ParameterBlock;
SIO_INIT_STEP InitStep=(SIO_INIT_STEP)Args->InitStep;
AMI_SIO_PROTOCOL *AmiSio=(AMI_SIO_PROTOCOL*)Args->Param1;
EFI_PCI_IO_PROTOCOL *PciIo=(EFI_PCI_IO_PROTOCOL*)Args->Param2;
EFI_STATUS Status=EFI_SUCCESS;
SIO_DEV2 *Dev=(SIO_DEV2*)AmiSio;
UINT8 rv; //LptMode Register
//Check if parameters passed are VALID and
if(Args->Signature != AMI_SIO_PARAM_SIG) return EFI_INVALID_PARAMETER;
switch (InitStep) {
case isGetSetupData:
//Clear Device Resource?
if((!Dev->DeviceInfo->Implemented) || (!Dev->NvData.DevEnable)) {
F81866_ClearDevResource(Dev);
}
break;
case isPrsSelect:
//depend on LPT Mode it may or may not use a DMA channel
//Strcpy(&Dev->DeviceInfo->AslName[0],"LPTE");
//EFI_DEADLOOP();
if(Dev->NvData.DevMode >3 ) { //7 mode
//if(Dev->NvData.DevMode&0x02) { //4 mode
ACPI_HDR *dsdt;
EFI_PHYSICAL_ADDRESS a;
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=SioDxeLibGetPrsFromAml(Dev,"EPPR", 1);
} else {
//if ACPI is not supported use corresponded Function seting
//"UseDma" parameter to TRUE for Extended Parallel Port
Status=SioDxeLibSetLptPrs(Dev, TRUE);
}
//Get DSDT.. we have to update it.
Status=LibGetDsdt(&a,EFI_ACPI_TABLE_VERSION_ALL);
if(EFI_ERROR(Status)) {
SIO_TRACE((TRACE_SIO,"F81866_LPT_Init: Fail to Get DSDT - returned %r\n", Status));
ASSERT_EFI_ERROR(Status);
} else dsdt=(ACPI_HDR*)a;
Status=UpdateAslNameOfDevice(dsdt, Dev->DeviceInfo->AslName, "_HID", 0x0104D041);
//Checksum
dsdt->Checksum = 0;
dsdt->Checksum = ChsumTbl((UINT8*)dsdt, dsdt->Length);
} 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=SioDxeLibGetPrsFromAml(Dev,"LPPR", 1);
} else {
//if ACPI is not supported use corresponded Function seting
//"UseDma" parameter to FALSE for Standard Parallel Port
Status=SioDxeLibSetLptPrs(Dev, FALSE);
}
}
ASSERT_EFI_ERROR(Status);
break;
case isBeforeActivate:
#if !defined(SecDecodePkg_SUPPORT) || (SecDecodePkg_SUPPORT == 0)
//Decode?
if(Dev->DeviceInfo->Implemented && Dev->NvData.DevEnable) {
AmiSioLibSetLpcDeviceDecoding(PciIo,Dev->VlData.DevBase1, Dev->DeviceInfo->Uid, Dev->DeviceInfo->Type);
} else {
AmiSioLibSetLpcDeviceDecoding(PciIo,0, Dev->DeviceInfo->Uid, Dev->DeviceInfo->Type);
}
#endif
//Programm Device Mode register here(if NEEDED)use AmiSioProtocol
//AMI_TODO: You can program device mode as follow:
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 isGetModeData: {
//LPT Has 7 possible modes
//Make sure Device Mode Strings are Static VAR!
//Otherwise The string will gone after control flow leave this function
static CHAR16 LptModeStr1[] = L"STD Printer Mode";
static CHAR16 LptModeStr2[] = L"SPP Mode";
static CHAR16 LptModeStr3[] = L"EPP-1.9 and SPP Mode";
static CHAR16 LptModeStr4[] = L"EPP-1.7 and SPP Mode";
static CHAR16 LptModeStr5[] = L"ECP Mode";
static CHAR16 LptModeStr6[] = L"ECP and EPP 1.9 Mode";
static CHAR16 LptModeStr7[] = L"ECP and EPP 1.7 Mode";
static CHAR16 LptModeHelp[] = L"Change Parallel Port mode. Some of the Modes required a DMA resource. After Mode changing, Reset the System to reflect actual device settings.";
//---------------------------------------------------
Dev->DevModeCnt=7;
//Make room for 2 floppy modes + Help String...
Dev->DevModeStr=MallocZ(sizeof(CHAR16*)*(Dev->DevModeCnt+1));
if(Dev->DevModeStr==NULL) {
Status=EFI_OUT_OF_RESOURCES;
ASSERT_EFI_ERROR(Status);
return Status;
}
Dev->DevModeStr[0]=&LptModeStr1[0];
Dev->DevModeStr[1]=&LptModeStr2[0];
Dev->DevModeStr[2]=&LptModeStr3[0];
Dev->DevModeStr[3]=&LptModeStr4[0];
Dev->DevModeStr[4]=&LptModeStr5[0];
Dev->DevModeStr[5]=&LptModeStr6[0];
Dev->DevModeStr[6]=&LptModeStr7[0];
Dev->DevModeStr[7]=&LptModeHelp[0];
}
break;
case isAfterActivate:
break;
case isAfterBootScript:
break;
#if AMI_SIO_MINOR_VERSION >= 6
case isAfterSmmBootScript:
break;
#endif
default:
Status=EFI_INVALID_PARAMETER;
} //switch
return Status;
}
#endif
//<AMI_PHDR_START>
//----------------------------------------------------------------------
//
//Procedure: F81866_KBC_Init
//
//Description:
// This function provide each initial routine in genericsio.c
//
//Input:
// IN AMI_BOARD_INIT_PROTOCOL *This - AMI Board Int Protocol.
// IN UINTN *Function - AMI Sdl SIO Init Routine.
// IN OUT VOID *ParameterBlock - SIO Component Initialization Routine Parameters Block...
//
//Output:
// EFI_SUCCESS - Initial step sucessfully
// EFI_INVALID_PARAMETER - not find the initial step
//
//Modified: Nothing
//
//Referrals: None
//
//Notes:
//----------------------------------------------------------------------
//<AMI_PHDR_END>
#if F81866_KEYBOARD_PRESENT
EFI_STATUS F81866_KBC_Init(
IN AMI_BOARD_INIT_PROTOCOL *This,
IN UINTN *Function,
IN OUT VOID *ParameterBlock
)
{
//Update Standard parameter block
AMI_BOARD_INIT_PARAMETER_BLOCK *Args=(AMI_BOARD_INIT_PARAMETER_BLOCK*)ParameterBlock;
SIO_INIT_STEP InitStep=(SIO_INIT_STEP)Args->InitStep;
AMI_SIO_PROTOCOL *AmiSio=(AMI_SIO_PROTOCOL*)Args->Param1;
EFI_PCI_IO_PROTOCOL *PciIo=(EFI_PCI_IO_PROTOCOL*)Args->Param2;
SIO_DEV2 *Dev=(SIO_DEV2*)AmiSio;
EFI_STATUS Status=EFI_SUCCESS;
//Check if parameters passed are VALID and
if(Args->Signature != AMI_SIO_PARAM_SIG) return EFI_INVALID_PARAMETER;
switch (InitStep) {
case isGetSetupData:
case isPrsSelect:
case isAfterActivate:
case isAfterBootScript:
case isGetModeData:
break;
case isBeforeActivate:
#if !defined(SecDecodePkg_SUPPORT) || (SecDecodePkg_SUPPORT == 0)
//Decode?
if(Dev->DeviceInfo->Implemented && Dev->NvData.DevEnable) {
AmiSioLibSetLpcDeviceDecoding(PciIo,Dev->VlData.DevBase1, Dev->DeviceInfo->Uid, Dev->DeviceInfo->Type);
} else {
AmiSioLibSetLpcDeviceDecoding(PciIo,0, Dev->DeviceInfo->Uid, Dev->DeviceInfo->Type);
}
#endif
break;
#if AMI_SIO_MINOR_VERSION >= 6
case isAfterSmmBootScript:
break;
#endif
default:
Status=EFI_INVALID_PARAMETER;
} //switch
return Status;
}
#endif
//<AMI_PHDR_START>
//----------------------------------------------------------------------
//
//Procedure: F81866_PME_Init
//
//Description:
// This function provide each initial routine in genericsio.c
//
//Input:
// IN AMI_BOARD_INIT_PROTOCOL *This - AMI Board Int Protocol.
// IN UINTN *Function - AMI Sdl SIO Init Routine.
// IN OUT VOID *ParameterBlock - SIO Component Initialization Routine Parameters Block...
//
//Output:
// EFI_SUCCESS - Initial step sucessfully
// EFI_INVALID_PARAMETER - not find the initial step
//
//Modified: Nothing
//
//Referrals: None
//
//Notes:
//----------------------------------------------------------------------
//<AMI_PHDR_END>
#if F81866_PME_CONTROLLER_PRESENT
EFI_STATUS F81866_PME_Init(
IN AMI_BOARD_INIT_PROTOCOL *This,
IN UINTN *Function,
IN OUT VOID *ParameterBlock
)
{
//Update Standard parameter block
AMI_BOARD_INIT_PARAMETER_BLOCK *Args=(AMI_BOARD_INIT_PARAMETER_BLOCK*)ParameterBlock;
SIO_INIT_STEP InitStep=(SIO_INIT_STEP)Args->InitStep;
AMI_SIO_PROTOCOL *AmiSio=(AMI_SIO_PROTOCOL*)Args->Param1;
EFI_PCI_IO_PROTOCOL *PciIo=(EFI_PCI_IO_PROTOCOL*)Args->Param2;
EFI_STATUS Status=EFI_SUCCESS;
//Check if parameters passed are VALID and
if(Args->Signature != AMI_SIO_PARAM_SIG) return EFI_INVALID_PARAMETER;
switch (InitStep) {
case isGetSetupData:
break;
case isPrsSelect:
break;
case isBeforeActivate:
//PME registers initial if needed.
//OEM_TODO: You need to fill DXE_PME_Init_Table_Before_Active[] first.
ProgramIsaRegisterTable(F81866_CONFIG_INDEX, F81866_CONFIG_DATA,\
DXE_PME_Init_Table_Before_Active,sizeof(DXE_PME_Init_Table_Before_Active)/(sizeof(SIO_DEVICE_INIT_DATA)));
break;
case isAfterActivate:
// F81866_ERP_Miles++ >>>>>
#if F81866_ERP_SUPPORT
F81866ErpModeCfg();
#endif //F81866_ERP_SUPPORT
// F81866_ERP_Miles++ <<<<<
break;
case isAfterBootScript:
case isGetModeData:
break;
#if AMI_SIO_MINOR_VERSION >= 6
case isAfterSmmBootScript:
break;
#endif
default:
Status=EFI_INVALID_PARAMETER;
} //switch
return Status;
}
#endif
//<AMI_PHDR_START>
//----------------------------------------------------------------------
//
//Procedure: F81866_HWM_Init
//
//Description:
// This function provide each initial routine in genericsio.c
//
//Input:
// IN AMI_BOARD_INIT_PROTOCOL *This - AMI Board Int Protocol.
// IN UINTN *Function - AMI Sdl SIO Init Routine.
// IN OUT VOID *ParameterBlock - SIO Component Initialization Routine Parameters Block...
//
//Output:
// EFI_SUCCESS - Initial step sucessfully
// EFI_INVALID_PARAMETER - not find the initial step
//
//Modified: Nothing
//
//Referrals: None
//
//Notes:
//----------------------------------------------------------------------
//<AMI_PHDR_END>
#if F81866_HWM_PRESENT
EFI_STATUS F81866_HWM_Init(
IN AMI_BOARD_INIT_PROTOCOL *This,
IN UINTN *Function,
IN OUT VOID *ParameterBlock
)
{
//Update Standard parameter block
AMI_BOARD_INIT_PARAMETER_BLOCK *Args=(AMI_BOARD_INIT_PARAMETER_BLOCK*)ParameterBlock;
SIO_INIT_STEP InitStep=(SIO_INIT_STEP)Args->InitStep;
AMI_SIO_PROTOCOL *AmiSio=(AMI_SIO_PROTOCOL*)Args->Param1;
EFI_PCI_IO_PROTOCOL *PciIo=(EFI_PCI_IO_PROTOCOL*)Args->Param2;
EFI_STATUS Status=EFI_SUCCESS;
SIO_DEV2 *Dev=(SIO_DEV2*)AmiSio;
EFI_S3_SAVE_STATE_PROTOCOL *BootScriptProtocol = Dev->Owner->SaveState;
//Check if parameters passed are VALID and
if(Args->Signature != AMI_SIO_PARAM_SIG) return EFI_INVALID_PARAMETER;
switch (InitStep) {
case isGetSetupData:
break;
case isPrsSelect:
case isGetModeData:
break;
case isBeforeActivate:
break;
case isAfterActivate:
//HWM registers initial if needed.
//OEM_TODO: You need to fill DXE_HWM_Init_Table_After_Active[] first.
ProgramIsaRegisterTable(F81866_HWM_INDEX_PORT, F81866_HWM_DATA_PORT,\
DXE_HWM_Init_Table_After_Active,sizeof(DXE_HWM_Init_Table_After_Active)/(sizeof(SIO_DEVICE_INIT_DATA)));
//INTERNAL_085_RayWu, ADD 2015/01/28 >>
#if defined(F81866_SMF_SUPPORT) && (F81866_SMF_SUPPORT == 1)
F81866SmartFunction();
#endif
//INTERNAL_085_RayWu, ADD 2015/01/28 <<
break;
case isAfterBootScript:
//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
BootScriptProtocol = (EFI_S3_SAVE_STATE_PROTOCOL*)Dev->Owner->SaveState;
SioLib_BootScriptSioS3SaveTable(F81866_HWM_INDEX_PORT, F81866_HWM_DATA_PORT, \
DXE_HWM_Init_Table_After_Active,sizeof(DXE_HWM_Init_Table_After_Active)/(sizeof(SIO_DEVICE_INIT_DATA)), BootScriptProtocol);
//F81866_SMF_Miles++ >>>>>
#if defined(F81866_SMF_SUPPORT) && (F81866_SMF_SUPPORT == 1)
SmartFanBootScript(BootScriptProtocol);
#endif
//F81866_SMF_Miles++ <<<<<
break;
#if AMI_SIO_MINOR_VERSION >= 6
case isAfterSmmBootScript:
break;
#endif
default:
Status=EFI_INVALID_PARAMETER;
} //switch
return Status;
}
#endif
//<AMI_PHDR_START>
//----------------------------------------------------------------------
//
//Procedure: F81866_GPIO_Init
//
//Description:
// This function provide each initial routine in genericsio.c
//
//Input:
// IN AMI_BOARD_INIT_PROTOCOL *This - AMI Board Int Protocol.
// IN UINTN *Function - AMI Sdl SIO Init Routine.
// IN OUT VOID *ParameterBlock - SIO Component Initialization Routine Parameters Block...
//
//Output:
// EFI_SUCCESS - Initial step sucessfully
// EFI_INVALID_PARAMETER - not find the initial step
//
//Modified: Nothing
//
//Referrals: None
//
//Notes:
//----------------------------------------------------------------------
//<AMI_PHDR_END>
//#if F81866_GPIO_PORT_PRESENT
EFI_STATUS F81866_GPIO_Init(
IN AMI_BOARD_INIT_PROTOCOL *This,
IN UINTN *Function,
IN OUT VOID *ParameterBlock
)
{
//Update Standard parameter block
AMI_BOARD_INIT_PARAMETER_BLOCK *Args=(AMI_BOARD_INIT_PARAMETER_BLOCK*)ParameterBlock;
SIO_INIT_STEP InitStep=(SIO_INIT_STEP)Args->InitStep;
AMI_SIO_PROTOCOL *AmiSio=(AMI_SIO_PROTOCOL*)Args->Param1;
EFI_PCI_IO_PROTOCOL *PciIo=(EFI_PCI_IO_PROTOCOL*)Args->Param2;
EFI_STATUS Status=EFI_SUCCESS;
//Check if parameters passed are VALID and
if(Args->Signature != AMI_SIO_PARAM_SIG) return EFI_INVALID_PARAMETER;
switch (InitStep) {
case isGetSetupData:
break;
case isPrsSelect:
case isGetModeData:
break;
case isBeforeActivate:
//Initial GPIO register if you need.
//OEM_TODO: You need to fill DXE_GPIO_Init_Table_Before_Active[] first.
ProgramIsaRegisterTable(F81866_CONFIG_INDEX, F81866_CONFIG_DATA,\
DXE_GPIO_Init_Table_Before_Active,sizeof(DXE_GPIO_Init_Table_Before_Active)/(sizeof(SIO_DEVICE_INIT_DATA)));
break;
case isAfterActivate:
break;
case isAfterBootScript:
break;
#if AMI_SIO_MINOR_VERSION >= 6
case isAfterSmmBootScript:
break;
#endif
default:
Status=EFI_INVALID_PARAMETER;
} //switch
return Status;
}
//#endif
//**********************************************************************
//**********************************************************************
//** **
//** (C)Copyright 1985-2013, American Megatrends, Inc. **
//** **
//** All Rights Reserved. **
//** **
//** 5555 Oakbrook Parkway, Suite 200, Norcross, GA 30093 **
//** **
//** Phone: (770)-246-8600 **
//** **
//**********************************************************************
//**********************************************************************