/*----------------------------------------------------------------------------------------*/ EFI_STATUS TranslateSysAddrToCS ( IN AMD_IDENTIFY_DIMM *AmdDimmInfo ) { BOOLEAN ChipSelectFound; ChipSelectFound = FALSE; // // Get the MmioBase address to access extended config info // mMmioBase = EfiReadMsr (0xC0010058); mMmioBase &= 0x000000FFFFF00000; PlatformTranslateSysAddrToCS ( AmdDimmInfo->MemoryAddress, &ChipSelectFound, &AmdDimmInfo->SocketId, &AmdDimmInfo->MemChannelId, &AmdDimmInfo->ChipSelect, &AmdDimmInfo->Bank, &AmdDimmInfo->Row, &AmdDimmInfo->Column ); AmdDimmInfo->DimmId = AmdDimmInfo->ChipSelect / 2; AmdDimmInfo->ChipSelect %= 2; if (!ChipSelectFound) { return EFI_NOT_FOUND; } else { return EFI_SUCCESS; } }
UINT16 DetermineiFsbFromMsr ( VOID ) { // // Determine the processor core frequency // UINT64 Temp; Temp = (EfiReadMsr (BSEL_CR_OVERCLOCK_CONTROL)) & FUSE_BSEL_MASK; return miFSBFrequencyTable[(UINT32)(Temp)]; }
EFI_STATUS InitializeRasRuntime ( IN EFI_HANDLE ImageHandle, IN EFI_SYSTEM_TABLE *SystemTable ) { UINT64 MsrVal; if ((SystemTable != NULL) && (SystemTable->BootServices != NULL)) { gST = SystemTable; gBS = SystemTable->BootServices; gRT = SystemTable->RuntimeServices; } MsrVal = EfiReadMsr (AMD_MSR_MMIO_CFG_BASE); mCfgMmioBase = (UINT32) MsrVal & 0xfff00000; return EFI_SUCCESS; }
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; }