VOID UpdateConModePage ( IN BMM_CALLBACK_DATA *CallbackData ) /*++ Routine Description: Refresh the text mode page Arguments: CallbackData - BMM_CALLBACK_DATA Returns: None. --*/ { UINTN Mode; UINTN Index; UINTN Col; UINTN Row; CHAR16 RowString[50]; CHAR16 ModeString[50]; UINTN MaxMode; UINTN ValidMode; EFI_STRING_ID *ModeToken; IFR_OPTION *IfrOptionList; EFI_STATUS Status; EFI_SIMPLE_TEXT_OUT_PROTOCOL *ConOut; ConOut = gST->ConOut; Index = 0; ValidMode = 0; MaxMode = (UINTN) (ConOut->Mode->MaxMode); CallbackData->BmmAskSaveOrNot = TRUE; UpdatePageStart (CallbackData); // // Check valid mode // for (Mode = 0; Mode < MaxMode; Mode++) { Status = ConOut->QueryMode (ConOut, Mode, &Col, &Row); if (EFI_ERROR (Status)) { continue; } ValidMode++; } if (ValidMode == 0) { return; } IfrOptionList = EfiAllocateZeroPool (sizeof (IFR_OPTION) * ValidMode); ASSERT(IfrOptionList != NULL); ModeToken = EfiAllocateZeroPool (sizeof (EFI_STRING_ID) * ValidMode); ASSERT(ModeToken != NULL); // // Determin which mode should be the first entry in menu // GetConsoleOutMode (CallbackData); // // Build text mode options // for (Mode = 0; Mode < MaxMode; Mode++) { Status = ConOut->QueryMode (ConOut, Mode, &Col, &Row); if (EFI_ERROR (Status)) { continue; } // // Build mode string Column x Row // EfiValueToString (ModeString, Col, 0, 0); EfiStrCat (ModeString, L" x "); EfiValueToString (RowString, Row, 0, 0); EfiStrCat (ModeString, RowString); IfrLibNewString (CallbackData->BmmHiiHandle, &ModeToken[Index], ModeString); IfrOptionList[Index].StringToken = ModeToken[Index]; IfrOptionList[Index].Value.u16 = (UINT16) Mode; if (Mode == CallbackData->BmmFakeNvData.ConsoleOutMode) { IfrOptionList[Index].Flags = EFI_IFR_OPTION_DEFAULT; } else { IfrOptionList[Index].Flags = 0; } Index++; } CreateOneOfOpCode ( CON_MODE_QUESTION_ID, VARSTORE_ID_BOOT_MAINT, CON_MODE_VAR_OFFSET, STRING_TOKEN (STR_CON_MODE_SETUP), STRING_TOKEN (STR_CON_MODE_SETUP), EFI_IFR_FLAG_RESET_REQUIRED, EFI_IFR_NUMERIC_SIZE_2, IfrOptionList, ValidMode, &gUpdateData ); SafeFreePool (IfrOptionList); SafeFreePool (ModeToken); UpdatePageEnd (CallbackData); }
EFI_STATUS UpdatePlatformInformation ( CHAR16 *SECVer, CHAR16 *uCodeVer, CHAR16 *GOPVer, CHAR16 *MrcVer, CHAR16 *PmcVer, CHAR16 *UlpmcVer, CHAR16 *PunitVer, CHAR16 *SocVer, CHAR16 *BoardVer, CHAR16 *FabVer, CHAR16 *CpuFlavorString, CHAR16 *BiosVer, CHAR16 *PmicVer, CHAR16 *TouchVer, CHAR16 *SecureBootMode, CHAR16 *BootModeString, CHAR16 *SpeedStepMode, CHAR16 *MaxCState, CHAR16 *CpuTurbo, CHAR16 *GfxTurbo, CHAR16 *S0ix, CHAR16 *RC6 ) { UINT32 MicroCodeVersion; CHAR16 Buffer[SMBIOS_STRING_MAX_LENGTH + 2]; EFI_STATUS Status; UINT8 CpuFlavor=0; EFI_PEI_HOB_POINTERS GuidHob; EFI_PLATFORM_INFO_HOB *mPlatformInfo=NULL; UINTN NumHandles; EFI_HANDLE *HandleBuffer; UINTN Index; DXE_PCH_PLATFORM_POLICY_PROTOCOL *PchPlatformPolicy; UINTN PciD31F0RegBase; UINT8 count; UINT8 Data8; UINT8 Data8_1; CHAR16 Name[40]; UINT32 MrcVersion; CHAR16 *Version; SYSTEM_CONFIGURATION SystemConfiguration; EFI_BOOT_MODE BootMode; UINTN VarSize; EFI_PLATFORM_INFO_HOB *mPlatformInfo; Version = AllocateZeroPool (SMBIOS_STRING_MAX_LENGTH + 2); // // Get the System configuration // CopyMem (&SystemConfiguration, PcdGetPtr (PcdSystemConfiguration), sizeof(SYSTEM_CONFIGURATION)); // // Get the HOB list. If it is not present, then ASSERT. // mPlatformInfo = PcdGetPtr (PcdPlatformInfo); GetSeCVersion (SECVer); Status = GetBiosVersionDateTime (Version, NULL, NULL); UnicodeSPrint (Buffer, sizeof (Buffer), L"%s", Version); FreePool(Version); StrCpy (BiosVer, Buffer); Status = TGetGOPDriverName(Name); if(!EFI_ERROR(Status)) { StrCpy (GOPVer, Name); } // //CpuFlavor // //CHV //CHV-DC Tablet 000 //CHV-QC Notebook 001 //CHV-QC Desktop 010 //CPU flavor CpuFlavor = RShiftU64 (EfiReadMsr (MSR_IA32_PLATFORM_ID), 50) & 0x07; switch(CpuFlavor){ case 0x0: UnicodeSPrint (Buffer, sizeof (Buffer), L"%s (%01x)", L"CHV-DC Tablet", CpuFlavor); StrCpy (CpuFlavorString, Buffer); break; case 0x01: #if (TABLET_PF_ENABLE == 1) UnicodeSPrint (Buffer, sizeof (Buffer), L"%s (%01x)", L"CHV-QC Tablet", CpuFlavor); #else UnicodeSPrint (Buffer, sizeof (Buffer), L"%s (%01x)", L"CHV-QC Notebook", CpuFlavor); #endif StrCpy (CpuFlavorString, Buffer); break; case 0x02: UnicodeSPrint (Buffer, sizeof (Buffer), L"%s (%01x)", L"CHV-QC Desktop", CpuFlavor); StrCpy (CpuFlavorString, Buffer); break; case 0x03: UnicodeSPrint (Buffer, sizeof (Buffer), L"%s (%01x)", L"CHV-QC Notebook", CpuFlavor); StrCpy (CpuFlavorString, Buffer); break; default: UnicodeSPrint (Buffer, sizeof (Buffer), L"%s (%01x)", L"Unknown CPU", CpuFlavor); StrCpy (CpuFlavorString, Buffer); break; } if ( NULL != mPlatformInfo) { // // Board Id // UnicodeSPrint (Buffer, sizeof (Buffer), L"%x", mPlatformInfo->BoardId); StrCpy (BoardVer, Buffer); // // FAB ID // UnicodeSPrint (Buffer, sizeof (Buffer), L"%x", mPlatformInfo->FABID); StrCpy (FabVer, Buffer); } // //Update MRC Version // MrcVersion = MmioRead32 (MmPciAddress (0, 0, 0, 0, 0xF0)); MrcVersion &= 0xffff; Index = EfiValueToString (Buffer, MrcVersion/100, PREFIX_ZERO, 0); StrCat (Buffer, L"."); EfiValueToString (Buffer + Index + 1, (MrcVersion%100)/10, PREFIX_ZERO, 0); EfiValueToString (Buffer + Index + 2, (MrcVersion%100)%10, PREFIX_ZERO, 0); StrCpy (MrcVer, Buffer); // //Update Soc Version // // // Retrieve all instances of PCH Platform Policy protocol // Status = gBS->LocateHandleBuffer ( ByProtocol, &gDxePchPlatformPolicyProtocolGuid, NULL, &NumHandles, &HandleBuffer ); if (!EFI_ERROR (Status)) { // // Find the matching PCH Policy protocol // for (Index = 0; Index < NumHandles; Index++) { Status = gBS->HandleProtocol ( HandleBuffer[Index], &gDxePchPlatformPolicyProtocolGuid, &PchPlatformPolicy ); if (!EFI_ERROR (Status)) { PciD31F0RegBase = MmPciAddress ( 0, PchPlatformPolicy->BusNumber, PCI_DEVICE_NUMBER_PCH_LPC, PCI_FUNCTION_NUMBER_PCH_LPC, 0 ); Data8 = MmioRead8 (PciD31F0RegBase + R_PCH_LPC_RID_CC) & B_PCH_LPC_RID_STEPPING_MASK; count = sizeof (SBRevisionTable) / sizeof (SBRevisionTable[0]); for (Index = 0; Index < count; Index++) { if(Data8 == SBRevisionTable[Index].RevId) { UnicodeSPrint (Buffer, sizeof (Buffer), L"%02x %a", Data8, SBRevisionTable[Index].String); StrCpy (SocVer, Buffer); break; } } break; } } } // // Microcode Revision // EfiWriteMsr (EFI_MSR_IA32_BIOS_SIGN_ID, 0); EfiCpuid (EFI_CPUID_VERSION_INFO, NULL); MicroCodeVersion = (UINT32) RShiftU64 (EfiReadMsr (EFI_MSR_IA32_BIOS_SIGN_ID), 32); UnicodeSPrint (Buffer, sizeof (Buffer), L"%x", MicroCodeVersion); StrCpy (uCodeVer, Buffer); // //Secure boot // Data8 = SystemConfiguration.SecureBoot; UnicodeSPrint (Buffer, sizeof(Buffer), L"%x", Data8); StrCpy (SecureBootMode, Buffer); // //Bootmode // BootMode = GetBootModeHob(); UnicodeSPrint (Buffer, sizeof(Buffer), L"%x", BootMode); StrCpy (BootModeString, Buffer); // //SpeedStep // Data8 = SystemConfiguration.EnableGv; UnicodeSPrint (Buffer, sizeof(Buffer), L"%x", Data8); StrCpy (SpeedStepMode, Buffer); // //CPU Turbo // Data8 = SystemConfiguration.TurboModeEnable; UnicodeSPrint (Buffer, sizeof(Buffer), L"%x", Data8); StrCpy (CpuTurbo, Buffer); // //CState // Data8 = SystemConfiguration.MaxCState; UnicodeSPrint (Buffer, sizeof(Buffer), L"%x", Data8); StrCpy (MaxCState, Buffer); // //GFX Turbo // Data8 = SystemConfiguration.IgdTurboEnabled; UnicodeSPrint (Buffer, sizeof(Buffer), L"%x", Data8); StrCpy (GfxTurbo, Buffer); // //S0ix // Data8 = SystemConfiguration.S0ix; UnicodeSPrint (Buffer, sizeof(Buffer), L"%x", Data8); StrCpy (S0ix, Buffer); // //RC6 // Data8 = SystemConfiguration.EnableRenderStandby; UnicodeSPrint (Buffer, sizeof(Buffer), L"%x", Data8); StrCpy (RC6, Buffer); // // Punit Version // Data8 = (UINT8) EfiReadMsr (0x667); UnicodeSPrint (Buffer, sizeof (Buffer), L"0x%x", Data8); StrCpy (PunitVer, Buffer); // // PMC Version // Data8 = (UINT8)((MmioRead32 (PMC_BASE_ADDRESS + R_PCH_PMC_PRSTS)>>16)&0x00FF); Data8_1 = (UINT8)((MmioRead32 (PMC_BASE_ADDRESS + R_PCH_PMC_PRSTS)>>24)&0x00FF); UnicodeSPrint (Buffer, sizeof (Buffer), L"0x%X_%X", Data8_1, Data8); StrCpy (PmcVer, Buffer); TGetTouchFirmwareVersion(TouchVer); return EFI_SUCCESS; }