//********************************************************************** //********************************************************************** //** ** //** (C)Copyright 1985-2013, American Megatrends, Inc. ** //** ** //** All Rights Reserved. ** //** ** //** 5555 Oakbrook Parkway, Suite 200, Norcross, GA 30093 ** //** ** //** Phone: (770)-246-8600 ** //** ** //********************************************************************** //********************************************************************** //********************************************************************** // // // Name: // // Description: 1. Port SIO DXE initial table and routine for GenericSio.c // 2. Define SIO bootscriptable table // // //********************************************************************** //---------------------------------------------------------------------- //Include Files //---------------------------------------------------------------------- #include #include #include #include "F81866DxeIoTable.h" //INTERNAL_085_RayWu, ADD 2015/01/28 >> #include #include //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++ <<<<< // //---------------------------------------------------------------------- // // Procedure: F81866_ClearDevResource // // Description: // This function will Clear SIO resource. // // Input: // SIO_DEV2* Dev // Output: // NONE // //---------------------------------------------------------------------- // 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; } // //---------------------------------------------------------------------- // // 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: //---------------------------------------------------------------------- // #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 // //---------------------------------------------------------------------- // // 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: //---------------------------------------------------------------------- // //#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 // //---------------------------------------------------------------------- // //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: //---------------------------------------------------------------------- // #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 // //---------------------------------------------------------------------- // //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: //---------------------------------------------------------------------- // #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 // //---------------------------------------------------------------------- // //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: //---------------------------------------------------------------------- // #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 // //---------------------------------------------------------------------- // //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: //---------------------------------------------------------------------- // #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 // //---------------------------------------------------------------------- // //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: //---------------------------------------------------------------------- // //#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 ** //** ** //********************************************************************** //**********************************************************************