/** @file Static SMBIOS Table for ARM platform Derived from EmulatorPkg package Note SMBIOS 2.7.1 Required structures: BIOS Information (Type 0) System Information (Type 1) Board Information (Type 2) System Enclosure (Type 3) Processor Information (Type 4) - CPU Driver Cache Information (Type 7) - For cache that is external to processor System Slots (Type 9) - If system has slots Physical Memory Array (Type 16) Memory Device (Type 17) - For each socketed system-memory Device Memory Array Mapped Address (Type 19) - One per contiguous block per Physical Memroy Array System Boot Information (Type 32) Copyright (c) 2012, Apple Inc. All rights reserved.
Copyright (c) 2013, Linaro Ltd. All rights reserved.
Copyright (c) 2014 - 2016, AMD Inc. All rights reserved.
This program and the accompanying materials are licensed and made available under the terms and conditions of the BSD License which accompanies this distribution. The full text of the license may be found at http://opensource.org/licenses/bsd-license.php THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. **/ /*---------------------------------------------------------------------------------------- * M O D U L E S U S E D *---------------------------------------------------------------------------------------- */ #include #include #include #include #include #include #include #include #include #include #include #include /*---------------------------------------------------------------------------------------- * E X T E R N S *---------------------------------------------------------------------------------------- */ extern EFI_BOOT_SERVICES *gBS; /*---------------------------------------------------------------------------------------- * G L O B A L S *---------------------------------------------------------------------------------------- */ STATIC EFI_SMBIOS_PROTOCOL *mSmbiosProtocol; STATIC AMD_ISCP_DXE_PROTOCOL *mIscpDxeProtocol; STATIC ISCP_SMBIOS_INFO mSmbiosInfo; /*********************************************************************** SMBIOS data definition TYPE0 BIOS Information ************************************************************************/ STATIC CONST SMBIOS_TABLE_TYPE0 mBIOSInfoType0 = { { EFI_SMBIOS_TYPE_BIOS_INFORMATION, sizeof (SMBIOS_TABLE_TYPE0), 0 }, 1, // Vendor String 2, // BiosVersion String 0xE000, // BiosSegment 3, // BiosReleaseDate String 0x7F, // BiosSize { // BiosCharacteristics 0, // Reserved :2; ///< Bits 0-1. 0, // Unknown :1; 0, // BiosCharacteristicsNotSupported :1; 0, // IsaIsSupported :1; 0, // McaIsSupported :1; 0, // EisaIsSupported :1; 0, // PciIsSupported :1; 0, // PcmciaIsSupported :1; 0, // PlugAndPlayIsSupported :1; 0, // ApmIsSupported :1; 1, // BiosIsUpgradable :1; 1, // BiosShadowingAllowed :1; 0, // VlVesaIsSupported :1; 0, // EscdSupportIsAvailable :1; 0, // BootFromCdIsSupported :1; 1, // SelectableBootIsSupported :1; 0, // RomBiosIsSocketed :1; 0, // BootFromPcmciaIsSupported :1; 0, // EDDSpecificationIsSupported :1; 0, // JapaneseNecFloppyIsSupported :1; 0, // JapaneseToshibaFloppyIsSupported :1; 0, // Floppy525_360IsSupported :1; 0, // Floppy525_12IsSupported :1; 0, // Floppy35_720IsSupported :1; 0, // Floppy35_288IsSupported :1; 0, // PrintScreenIsSupported :1; 0, // Keyboard8042IsSupported :1; 0, // SerialIsSupported :1; 0, // PrinterIsSupported :1; 0, // CgaMonoIsSupported :1; 0, // NecPc98 :1; 0 // ReservedForVendor :32; ///< Bits 32-63. Bits 32-47 reserved for BIOS vendor ///< and bits 48-63 reserved for System Vendor. }, { // BIOSCharacteristicsExtensionBytes[] 0x81, // AcpiIsSupported :1; // UsbLegacyIsSupported :1; // AgpIsSupported :1; // I2OBootIsSupported :1; // Ls120BootIsSupported :1; // AtapiZipDriveBootIsSupported :1; // Boot1394IsSupported :1; // SmartBatteryIsSupported :1; // BIOSCharacteristicsExtensionBytes[1] 0x0a, // BiosBootSpecIsSupported :1; // FunctionKeyNetworkBootIsSupported :1; // TargetContentDistributionEnabled :1; // UefiSpecificationSupported :1; // VirtualMachineSupported :1; // ExtensionByte2Reserved :3; }, 0x00, // SystemBiosMajorRelease 0x01, // SystemBiosMinorRelease 0xFF, // EmbeddedControllerFirmwareMajorRelease 0xFF, // EmbeddedControllerFirmwareMinorRelease }; STATIC CHAR8 CONST * CONST mBIOSInfoType0Strings[] = { "github.com/tianocore/", // Vendor String __TIME__, // BiosVersion String __DATE__, // BiosReleaseDate String NULL }; /*********************************************************************** SMBIOS data definition TYPE1 System Information ************************************************************************/ STATIC CONST SMBIOS_TABLE_TYPE1 mSysInfoType1 = { { EFI_SMBIOS_TYPE_SYSTEM_INFORMATION, sizeof (SMBIOS_TABLE_TYPE1), 0 }, 1, // Manufacturer String 2, // ProductName String 3, // Version String 4, // SerialNumber String { 0x25EF0280, 0xEC82, 0x42B0, { 0x8F, 0xB6, 0x10, 0xAD, 0xCC, 0xC6, 0x7C, 0x02 } }, SystemWakeupTypePowerSwitch, 5, // SKUNumber String 6, // Family String }; STATIC CHAR8 CONST * CONST mSysInfoType1Strings[] = { "AMD", "Seattle", "1.0", "System Serial#", "System SKU#", "edk2", NULL }; /*********************************************************************** SMBIOS data definition TYPE2 Board Information ************************************************************************/ STATIC CONST SMBIOS_TABLE_TYPE2 mBoardInfoType2 = { { EFI_SMBIOS_TYPE_BASEBOARD_INFORMATION, sizeof (SMBIOS_TABLE_TYPE2), 0 }, 1, // Manufacturer String 2, // ProductName String 3, // Version String 4, // SerialNumber String 5, // AssetTag String { // FeatureFlag 1, // Motherboard :1; 0, // RequiresDaughterCard :1; 0, // Removable :1; 0, // Replaceable :1; 0, // HotSwappable :1; 0, // Reserved :3; }, 6, // LocationInChassis String 0, // ChassisHandle; BaseBoardTypeMotherBoard, // BoardType; 0, // NumberOfContainedObjectHandles; { 0 } // ContainedObjectHandles[1]; }; STATIC CHAR8 CONST * CONST mBoardInfoType2Strings[] = { "AMD", "Seattle", "1.0", "Base Board Serial#", "Base Board Asset Tag#", "Part Component", NULL }; /*********************************************************************** SMBIOS data definition TYPE3 Enclosure Information ************************************************************************/ STATIC CONST SMBIOS_TABLE_TYPE3 mEnclosureInfoType3 = { { EFI_SMBIOS_TYPE_SYSTEM_ENCLOSURE, sizeof (SMBIOS_TABLE_TYPE3), 0 }, 1, // Manufacturer String MiscChassisTypeLapTop, // Type; 2, // Version String 3, // SerialNumber String 4, // AssetTag String ChassisStateSafe, // BootupState; ChassisStateSafe, // PowerSupplyState; ChassisStateSafe, // ThermalState; ChassisSecurityStatusNone,// SecurityStatus; { 0, 0, 0, 0 }, // OemDefined[4]; 0, // Height; 0, // NumberofPowerCords; 0, // ContainedElementCount; 0, // ContainedElementRecordLength; { { 0 } }, // ContainedElements[1]; }; STATIC CHAR8 CONST * CONST mEnclosureInfoType3Strings[] = { "AMD", "1.0", "Chassis Board Serial#", "Chassis Board Asset Tag#", NULL }; /*********************************************************************** SMBIOS data definition TYPE4 Processor Information ************************************************************************/ STATIC SMBIOS_TABLE_TYPE4 mProcessorInfoType4 = { { EFI_SMBIOS_TYPE_PROCESSOR_INFORMATION, sizeof (SMBIOS_TABLE_TYPE4), 0}, 1, // Socket String ProcessorOther, // ProcessorType; ///< The enumeration value from PROCESSOR_TYPE_DATA. ProcessorFamilyIndicatorFamily2, // ProcessorFamily; ///< The enumeration value from PROCESSOR_FAMILY2_DATA. 2, // ProcessorManufacture String; { // ProcessorId; { // PROCESSOR_SIGNATURE 0, // ProcessorSteppingId:4; 0, // ProcessorModel: 4; 0, // ProcessorFamily: 4; 0, // ProcessorType: 2; 0, // ProcessorReserved1: 2; 0, // ProcessorXModel: 4; 0, // ProcessorXFamily: 8; 0, // ProcessorReserved2: 4; }, { // PROCESSOR_FEATURE_FLAGS 0, // ProcessorFpu :1; 0, // ProcessorVme :1; 0, // ProcessorDe :1; 0, // ProcessorPse :1; 0, // ProcessorTsc :1; 0, // ProcessorMsr :1; 0, // ProcessorPae :1; 0, // ProcessorMce :1; 0, // ProcessorCx8 :1; 0, // ProcessorApic :1; 0, // ProcessorReserved1 :1; 0, // ProcessorSep :1; 0, // ProcessorMtrr :1; 0, // ProcessorPge :1; 0, // ProcessorMca :1; 0, // ProcessorCmov :1; 0, // ProcessorPat :1; 0, // ProcessorPse36 :1; 0, // ProcessorPsn :1; 0, // ProcessorClfsh :1; 0, // ProcessorReserved2 :1; 0, // ProcessorDs :1; 0, // ProcessorAcpi :1; 0, // ProcessorMmx :1; 0, // ProcessorFxsr :1; 0, // ProcessorSse :1; 0, // ProcessorSse2 :1; 0, // ProcessorSs :1; 0, // ProcessorReserved3 :1; 0, // ProcessorTm :1; 0, // ProcessorReserved4 :2; } }, 3, // ProcessorVersion String; { // Voltage; 1, // ProcessorVoltageCapability5V :1; 1, // ProcessorVoltageCapability3_3V :1; 1, // ProcessorVoltageCapability2_9V :1; 0, // ProcessorVoltageCapabilityReserved :1; ///< Bit 3, must be zero. 0, // ProcessorVoltageReserved :3; ///< Bits 4-6, must be zero. 0 // ProcessorVoltageIndicateLegacy :1; }, 0, // ExternalClock; 0, // MaxSpeed; 0, // CurrentSpeed; 0x41, // Status; ProcessorUpgradeOther, // ProcessorUpgrade; ///< The enumeration value from PROCESSOR_UPGRADE. 0, // L1CacheHandle; 0, // L2CacheHandle; 0, // L3CacheHandle; 4, // SerialNumber; 5, // AssetTag; 6, // PartNumber; 0, // CoreCount; 0, // EnabledCoreCount; 0, // ThreadCount; 0, // ProcessorCharacteristics; ProcessorFamilyARM, // ARM Processor Family; }; STATIC CHAR8 CONST * CONST mProcessorInfoType4Strings[] = { "Socket", "ARM", #ifdef ARM_CPU_AARCH64 "v8", #else "v7", #endif "1.0", "1.0", "1.0", NULL }; /*********************************************************************** SMBIOS data definition TYPE7 Cache Information ************************************************************************/ STATIC SMBIOS_TABLE_TYPE7 mCacheInfoType7 = { { EFI_SMBIOS_TYPE_CACHE_INFORMATION, sizeof (SMBIOS_TABLE_TYPE7), 0 }, 1, // SocketDesignation String 0x018A, // Cache Configuration 0x00FF, // Maximum Size 256k 0x00FF, // Install Size 256k { // Supported SRAM Type 0, //Other :1 0, //Unknown :1 0, //NonBurst :1 1, //Burst :1 0, //PiplelineBurst :1 1, //Synchronous :1 0, //Asynchronous :1 0 //Reserved :9 }, { // Current SRAM Type 0, //Other :1 0, //Unknown :1 0, //NonBurst :1 1, //Burst :1 0, //PiplelineBurst :1 1, //Synchronous :1 0, //Asynchronous :1 0 //Reserved :9 }, 0, // Cache Speed unknown CacheErrorMultiBit, // Error Correction Multi CacheTypeUnknown, // System Cache Type CacheAssociativity2Way // Associativity }; STATIC CONST CHAR8 *mCacheInfoType7Strings[] = { "Cache1", NULL }; /*********************************************************************** SMBIOS data definition TYPE9 System Slot Information ************************************************************************/ STATIC CONST SMBIOS_TABLE_TYPE9 mSysSlotInfoType9 = { { EFI_SMBIOS_TYPE_SYSTEM_SLOTS, sizeof (SMBIOS_TABLE_TYPE9), 0 }, 1, // SlotDesignation String SlotTypeOther, // SlotType; ///< The enumeration value from MISC_SLOT_TYPE. SlotDataBusWidthOther, // SlotDataBusWidth; ///< The enumeration value from MISC_SLOT_DATA_BUS_WIDTH. SlotUsageAvailable, // CurrentUsage; ///< The enumeration value from MISC_SLOT_USAGE. SlotLengthOther, // SlotLength; ///< The enumeration value from MISC_SLOT_LENGTH. 0, // SlotID; { // SlotCharacteristics1; 1, // CharacteristicsUnknown :1; 0, // Provides50Volts :1; 0, // Provides33Volts :1; 0, // SharedSlot :1; 0, // PcCard16Supported :1; 0, // CardBusSupported :1; 0, // ZoomVideoSupported :1; 0, // ModemRingResumeSupported:1; }, { // SlotCharacteristics2; 0, // PmeSignalSupported :1; 0, // HotPlugDevicesSupported :1; 0, // SmbusSignalSupported :1; 0, // Reserved :5; ///< Set to 0. }, 0, // SegmentGroupNum; 0, // BusNum; 0, // DevFuncNum; }; STATIC CHAR8 CONST * CONST mSysSlotInfoType9Strings[] = { "SD Card", NULL }; /*********************************************************************** SMBIOS data definition TYPE16 Physical Memory ArrayInformation ************************************************************************/ STATIC SMBIOS_TABLE_TYPE16 mPhyMemArrayInfoType16 = { { EFI_SMBIOS_TYPE_PHYSICAL_MEMORY_ARRAY, sizeof (SMBIOS_TABLE_TYPE16), 0 }, MemoryArrayLocationSystemBoard, // Location; ///< The enumeration value from MEMORY_ARRAY_LOCATION. MemoryArrayUseSystemMemory, // Use; ///< The enumeration value from MEMORY_ARRAY_USE. MemoryErrorCorrectionUnknown, // MemoryErrorCorrection; ///< The enumeration value from MEMORY_ERROR_CORRECTION. 0x80000000, // MaximumCapacity; 0xFFFE, // MemoryErrorInformationHandle; 1, // NumberOfMemoryDevices; 0x3fffffffffffffffULL, // ExtendedMaximumCapacity; }; STATIC CHAR8 CONST * CONST mPhyMemArrayInfoType16Strings[] = { NULL }; /*********************************************************************** SMBIOS data definition TYPE17 Memory Device Information ************************************************************************/ STATIC SMBIOS_TABLE_TYPE17 mMemDevInfoType17 = { { EFI_SMBIOS_TYPE_MEMORY_DEVICE, sizeof (SMBIOS_TABLE_TYPE17), 0 }, 0, // MemoryArrayHandle; 0xFFFE, // MemoryErrorInformationHandle; 0xFFFF, // TotalWidth; 0xFFFF, // DataWidth; 0xFFFF, // Size; MemoryFormFactorUnknown, // FormFactor; ///< The enumeration value from MEMORY_FORM_FACTOR. 0xff, // DeviceSet; 1, // DeviceLocator String 2, // BankLocator String MemoryTypeDram, // MemoryType; ///< The enumeration value from MEMORY_DEVICE_TYPE. { // TypeDetail; 0, // Reserved :1; 0, // Other :1; 1, // Unknown :1; 0, // FastPaged :1; 0, // StaticColumn :1; 0, // PseudoStatic :1; 0, // Rambus :1; 0, // Synchronous :1; 0, // Cmos :1; 0, // Edo :1; 0, // WindowDram :1; 0, // CacheDram :1; 0, // Nonvolatile :1; 0, // Registered :1; 0, // Unbuffered :1; 0, // Reserved1 :1; }, 0, // Speed; 3, // Manufacturer String 0, // SerialNumber String 0, // AssetTag String 0, // PartNumber String 0, // Attributes; 0, // ExtendedSize; 0, // ConfiguredMemoryClockSpeed; }; #if (FixedPcdGetBool (PcdIscpSupport)) STATIC CHAR8 CONST *mMemDevInfoType17Strings[ 7 ] = {0}; #else STATIC CHAR8 CONST * CONST mMemDevInfoType17Strings[] = { "OS Virtual Memory", "malloc", "OSV", NULL }; #endif /*********************************************************************** SMBIOS data definition TYPE19 Memory Array Mapped Address Information ************************************************************************/ STATIC SMBIOS_TABLE_TYPE19 mMemArrMapInfoType19 = { { EFI_SMBIOS_TYPE_MEMORY_ARRAY_MAPPED_ADDRESS, sizeof (SMBIOS_TABLE_TYPE19), 0 }, 0x80000000, // StartingAddress; 0xbfffffff, // EndingAddress; 0, // MemoryArrayHandle; 1, // PartitionWidth; 0, // ExtendedStartingAddress; 0, // ExtendedEndingAddress; }; STATIC CHAR8 CONST * CONST mMemArrMapInfoType19Strings[] = { NULL }; /*********************************************************************** SMBIOS data definition TYPE32 Boot Information ************************************************************************/ STATIC CONST SMBIOS_TABLE_TYPE32 mBootInfoType32 = { { EFI_SMBIOS_TYPE_SYSTEM_BOOT_INFORMATION, sizeof (SMBIOS_TABLE_TYPE32), 0 }, { 0, 0, 0, 0, 0, 0 }, // Reserved[6]; BootInformationStatusNoError // BootStatus }; STATIC CHAR8 CONST * CONST mBootInfoType32Strings[] = { NULL }; /** Create SMBIOS record. Converts a fixed SMBIOS structure and an array of pointers to strings into an SMBIOS record where the strings are cat'ed on the end of the fixed record and terminated via a double NULL and add to SMBIOS table. SMBIOS_TABLE_TYPE32 gSmbiosType12 = { { EFI_SMBIOS_TYPE_SYSTEM_CONFIGURATION_OPTIONS, sizeof (SMBIOS_TABLE_TYPE12), 0 }, 1 // StringCount }; CHAR8 *gSmbiosType12Strings[] = { "Not Found", NULL }; ... LogSmbiosData ( (EFI_SMBIOS_TABLE_HEADER*)&gSmbiosType12, gSmbiosType12Strings ); @param Template Fixed SMBIOS structure, required. @param StringArray Array of strings to convert to an SMBIOS string pack. NULL is OK. **/ STATIC EFI_STATUS EFIAPI LogSmbiosData ( IN EFI_SMBIOS_TABLE_HEADER *Template, IN CONST CHAR8* CONST *StringPack ) { EFI_STATUS Status; EFI_SMBIOS_HANDLE SmbiosHandle; EFI_SMBIOS_TABLE_HEADER *Record; UINTN Index; UINTN StringSize; UINTN Size; CHAR8 *Str; // Calculate the size of the fixed record and optional string pack Size = Template->Length; if (StringPack == NULL) { // At least a double null is required Size += 2; } else { for (Index = 0; StringPack[Index] != NULL; Index++) { StringSize = AsciiStrSize (StringPack[Index]); Size += StringSize; } if (StringPack[0] == NULL) { // At least a double null is required Size += 1; } // Don't forget the terminating double null Size += 1; } // Copy over Template Record = (EFI_SMBIOS_TABLE_HEADER *)AllocateZeroPool (Size); if (Record == NULL) { return EFI_OUT_OF_RESOURCES; } CopyMem (Record, Template, Template->Length); // Append string pack Str = ((CHAR8 *)Record) + Record->Length; for (Index = 0; StringPack[Index] != NULL; Index++) { StringSize = AsciiStrSize (StringPack[Index]); CopyMem (Str, StringPack[Index], StringSize); Str += StringSize; } *Str = 0; SmbiosHandle = SMBIOS_HANDLE_PI_RESERVED; Status = mSmbiosProtocol->Add ( mSmbiosProtocol, gImageHandle, &SmbiosHandle, Record ); ASSERT_EFI_ERROR (Status); FreePool (Record); return Status; } /*********************************************************************** SMBIOS data update TYPE0 BIOS Information ************************************************************************/ STATIC VOID BIOSInfoUpdateSmbiosType0 ( VOID ) { LogSmbiosData ((EFI_SMBIOS_TABLE_HEADER *)&mBIOSInfoType0, mBIOSInfoType0Strings); } /*********************************************************************** SMBIOS data update TYPE1 System Information ************************************************************************/ STATIC VOID SysInfoUpdateSmbiosType1 ( VOID ) { LogSmbiosData ((EFI_SMBIOS_TABLE_HEADER *)&mSysInfoType1, mSysInfoType1Strings); } /*********************************************************************** SMBIOS data update TYPE2 Board Information ************************************************************************/ STATIC VOID BoardInfoUpdateSmbiosType2 ( VOID ) { LogSmbiosData ((EFI_SMBIOS_TABLE_HEADER *)&mBoardInfoType2, mBoardInfoType2Strings); } /*********************************************************************** SMBIOS data update TYPE3 Enclosure Information ************************************************************************/ STATIC VOID EnclosureInfoUpdateSmbiosType3 ( VOID ) { LogSmbiosData ((EFI_SMBIOS_TABLE_HEADER *)&mEnclosureInfoType3, mEnclosureInfoType3Strings); } /*********************************************************************** SMBIOS data update TYPE4 Processor Information ************************************************************************/ STATIC VOID ProcessorInfoUpdateSmbiosType4 ( VOID ) { #if (FixedPcdGetBool (PcdIscpSupport)) ISCP_TYPE4_SMBIOS_INFO *SmbiosT4 = &mSmbiosInfo.SmbiosCpuBuffer.T4[0]; DEBUG ((EFI_D_ERROR, "Logging SmbiosType4 from ISCP.\n")); mProcessorInfoType4.ProcessorType = SmbiosT4->T4ProcType; mProcessorInfoType4.ProcessorFamily = SmbiosT4->T4ProcFamily; mProcessorInfoType4.ProcessorFamily2 = SmbiosT4->T4ProcFamily2; mProcessorInfoType4.ProcessorCharacteristics = SmbiosT4->T4ProcCharacteristics; mProcessorInfoType4.MaxSpeed = SmbiosT4->T4MaxSpeed; mProcessorInfoType4.CurrentSpeed = SmbiosT4->T4CurrentSpeed; mProcessorInfoType4.CoreCount = SmbiosT4->T4CoreCount; mProcessorInfoType4.EnabledCoreCount = SmbiosT4->T4CoreEnabled; mProcessorInfoType4.ThreadCount = SmbiosT4->T4ThreadCount; mProcessorInfoType4.ProcessorUpgrade = SmbiosT4->T4ProcUpgrade; mProcessorInfoType4.Status= (UINT8)SmbiosT4->T4Status; mProcessorInfoType4.ExternalClock = SmbiosT4->T4ExternalClock; CopyMem (&mProcessorInfoType4.ProcessorId.Signature, &SmbiosT4->T4ProcId.ProcIDLsd, sizeof(UINT32)); CopyMem (&mProcessorInfoType4.ProcessorId.FeatureFlags, &SmbiosT4->T4ProcId.ProcIDMsd, sizeof(UINT32)); CopyMem (&mProcessorInfoType4.Voltage, &SmbiosT4->T4Voltage, sizeof(UINT8)); #else mProcessorInfoType4.ProcessorType = CentralProcessor; mProcessorInfoType4.ProcessorFamily = ProcessorFamilyIndicatorFamily2; mProcessorInfoType4.ProcessorFamily2 = ProcessorFamilyARM; #ifdef ARM_CPU_AARCH64 mProcessorInfoType4.ProcessorCharacteristics = 0x6C; #else mProcessorInfoType4.ProcessorCharacteristics = 0x68; #endif mProcessorInfoType4.MaxSpeed = PcdGet32(PcdArmArchTimerFreqInHz)/1000000; // In MHz mProcessorInfoType4.CurrentSpeed = PcdGet32(PcdArmArchTimerFreqInHz)/1000000; // In MHz mProcessorInfoType4.CoreCount = PcdGet32(PcdCoreCount); mProcessorInfoType4.EnabledCoreCount = PcdGet32(PcdCoreCount); mProcessorInfoType4.ThreadCount = PcdGet32(PcdCoreCount); mProcessorInfoType4.ProcessorUpgrade = ProcessorUpgradeDaughterBoard; #endif LogSmbiosData ((EFI_SMBIOS_TABLE_HEADER *)&mProcessorInfoType4, mProcessorInfoType4Strings); } /*********************************************************************** SMBIOS data update TYPE7 Cache Information ************************************************************************/ STATIC VOID CacheInfoUpdateSmbiosType7 ( VOID ) { #if (FixedPcdGetBool (PcdIscpSupport)) ISCP_TYPE7_SMBIOS_INFO *SmbiosT7; SMBIOS_TABLE_TYPE7 dstType7 = {{0}}; DEBUG ((EFI_D_ERROR, "Logging SmbiosType7 from ISCP.\n")); CopyMem ((VOID *) &dstType7.Hdr, (VOID *) &mCacheInfoType7.Hdr, sizeof (SMBIOS_STRUCTURE)); dstType7.SocketDesignation = 1; // "L# Cache" // L1 cache settings mCacheInfoType7Strings[0] = "L1 Cache"; SmbiosT7 = &mSmbiosInfo.SmbiosCpuBuffer.T7L1[0]; dstType7.CacheConfiguration = SmbiosT7->T7CacheCfg; dstType7.MaximumCacheSize = SmbiosT7->T7MaxCacheSize; dstType7.InstalledSize = SmbiosT7->T7InstallSize; CopyMem (&dstType7.SupportedSRAMType, &SmbiosT7->T7SupportedSramType, sizeof(UINT16)); CopyMem (&dstType7.CurrentSRAMType, &SmbiosT7->T7CurrentSramType, sizeof(UINT16)); dstType7.CacheSpeed = SmbiosT7->T7CacheSpeed; dstType7.ErrorCorrectionType = SmbiosT7->T7ErrorCorrectionType; dstType7.SystemCacheType = SmbiosT7->T7SystemCacheType; dstType7.Associativity = SmbiosT7->T7Associativity; LogSmbiosData ((EFI_SMBIOS_TABLE_HEADER *)&dstType7, mCacheInfoType7Strings); // L2 cache settings mCacheInfoType7Strings[0] = "L2 Cache"; SmbiosT7 = &mSmbiosInfo.SmbiosCpuBuffer.T7L2[0]; dstType7.CacheConfiguration = SmbiosT7->T7CacheCfg; dstType7.MaximumCacheSize = SmbiosT7->T7MaxCacheSize; dstType7.InstalledSize = SmbiosT7->T7InstallSize; CopyMem (&dstType7.SupportedSRAMType, &SmbiosT7->T7SupportedSramType, sizeof(UINT16)); CopyMem (&dstType7.CurrentSRAMType, &SmbiosT7->T7CurrentSramType, sizeof(UINT16)); dstType7.CacheSpeed = SmbiosT7->T7CacheSpeed; dstType7.ErrorCorrectionType = SmbiosT7->T7ErrorCorrectionType; dstType7.SystemCacheType = SmbiosT7->T7SystemCacheType; dstType7.Associativity = SmbiosT7->T7Associativity; LogSmbiosData ((EFI_SMBIOS_TABLE_HEADER *)&dstType7, mCacheInfoType7Strings); // L3 cache settings mCacheInfoType7Strings[0] = "L3 Cache"; SmbiosT7 = &mSmbiosInfo.SmbiosCpuBuffer.T7L3[0]; dstType7.CacheConfiguration = SmbiosT7->T7CacheCfg; dstType7.MaximumCacheSize = SmbiosT7->T7MaxCacheSize; dstType7.InstalledSize = SmbiosT7->T7InstallSize; CopyMem (&dstType7.SupportedSRAMType, &SmbiosT7->T7SupportedSramType, sizeof(UINT16)); CopyMem (&dstType7.CurrentSRAMType, &SmbiosT7->T7CurrentSramType, sizeof(UINT16)); dstType7.CacheSpeed = SmbiosT7->T7CacheSpeed; dstType7.ErrorCorrectionType = SmbiosT7->T7ErrorCorrectionType; dstType7.SystemCacheType = SmbiosT7->T7SystemCacheType; dstType7.Associativity = SmbiosT7->T7Associativity; LogSmbiosData ((EFI_SMBIOS_TABLE_HEADER *)&dstType7, mCacheInfoType7Strings); #else LogSmbiosData ((EFI_SMBIOS_TABLE_HEADER *)&mCacheInfoType7, mCacheInfoType7Strings); #endif } /*********************************************************************** SMBIOS data update TYPE9 System Slot Information ************************************************************************/ STATIC VOID SysSlotInfoUpdateSmbiosType9 ( VOID ) { LogSmbiosData ((EFI_SMBIOS_TABLE_HEADER *)&mSysSlotInfoType9, mSysSlotInfoType9Strings); } /*********************************************************************** SMBIOS data update TYPE16 Physical Memory Array Information ************************************************************************/ STATIC VOID PhyMemArrayInfoUpdateSmbiosType16 ( VOID ) { #if (FixedPcdGetBool (PcdIscpSupport)) ISCP_TYPE16_SMBIOS_INFO *SmbiosT16 = &mSmbiosInfo.SmbiosMemBuffer.T16; DEBUG ((EFI_D_ERROR, "Logging SmbiosType16 from ISCP.\n")); mPhyMemArrayInfoType16.Location = SmbiosT16->Location; mPhyMemArrayInfoType16.Use = SmbiosT16->Use; mPhyMemArrayInfoType16.MemoryErrorCorrection = SmbiosT16->MemoryErrorCorrection; mPhyMemArrayInfoType16.NumberOfMemoryDevices = SmbiosT16->NumberOfMemoryDevices; #endif LogSmbiosData ((EFI_SMBIOS_TABLE_HEADER *)&mPhyMemArrayInfoType16, mPhyMemArrayInfoType16Strings); } /*********************************************************************** SMBIOS data update TYPE17 Memory Device Information ************************************************************************/ STATIC VOID MemDevInfoUpdatedstType17 ( VOID ) { #if (FixedPcdGetBool (PcdIscpSupport)) SMBIOS_TABLE_TYPE17 dstType17 = {{0}}; ISCP_TYPE17_SMBIOS_INFO *srcType17; UINTN i, j, StrIndex, LastIndex; DEBUG ((EFI_D_ERROR, "Logging SmbiosType17 from ISCP.\n")); LastIndex = (sizeof(mMemDevInfoType17Strings) / sizeof (CHAR8 *)) - 1; for (i = 0; i < 2; ++i) { for (j = 0; j < 2; ++j) { srcType17 = &mSmbiosInfo.SmbiosMemBuffer.T17[i][j]; CopyMem ((VOID *) &dstType17.Hdr, (VOID *) &mMemDevInfoType17.Hdr, sizeof (SMBIOS_STRUCTURE)); dstType17.MemoryArrayHandle = srcType17->Handle; dstType17.TotalWidth = srcType17->TotalWidth; dstType17.DataWidth = srcType17->DataWidth; dstType17.Size = srcType17->MemorySize; dstType17.FormFactor = srcType17->FormFactor; dstType17.DeviceSet = srcType17->DeviceSet; dstType17.MemoryType = srcType17->MemoryType; CopyMem ((VOID *) &dstType17.TypeDetail, (VOID *) &mMemDevInfoType17.TypeDetail, sizeof (UINT16)); dstType17.Speed = srcType17->Speed; dstType17.Attributes = srcType17->Attributes; dstType17.ExtendedSize = srcType17->ExtSize; dstType17.ConfiguredMemoryClockSpeed = srcType17->ConfigSpeed; // Build table of TYPE17 strings StrIndex = 0; if (AsciiStrLen ((CHAR8 *)srcType17->DeviceLocator) && StrIndex < LastIndex) { mMemDevInfoType17Strings[StrIndex++] = (CHAR8 *)srcType17->DeviceLocator; dstType17.DeviceLocator = (SMBIOS_TABLE_STRING) StrIndex; } else { dstType17.DeviceLocator = 0; } if (AsciiStrLen ((CHAR8 *)srcType17->BankLocator) && StrIndex < LastIndex) { mMemDevInfoType17Strings[StrIndex++] = (CHAR8 *)srcType17->BankLocator; dstType17.BankLocator = (SMBIOS_TABLE_STRING) StrIndex; } else { dstType17.BankLocator = 0; } if (AsciiStrLen ((CHAR8 *)srcType17->ManufacturerIdCode) && StrIndex < LastIndex) { mMemDevInfoType17Strings[StrIndex++] = (CHAR8 *)srcType17->ManufacturerIdCode; dstType17.Manufacturer = (SMBIOS_TABLE_STRING) StrIndex; } else { dstType17.Manufacturer = 0; } if (AsciiStrLen ((CHAR8 *)srcType17->SerialNumber) && StrIndex < LastIndex) { mMemDevInfoType17Strings[StrIndex++] = (CHAR8 *)srcType17->SerialNumber; dstType17.SerialNumber = (SMBIOS_TABLE_STRING) StrIndex; } else { dstType17.SerialNumber = 0; } if (AsciiStrLen ((CHAR8 *)srcType17->PartNumber) && StrIndex < LastIndex) { mMemDevInfoType17Strings[StrIndex++] = (CHAR8 *)srcType17->PartNumber; dstType17.PartNumber = (SMBIOS_TABLE_STRING) StrIndex; } else { dstType17.PartNumber = 0; } mMemDevInfoType17Strings[StrIndex] = NULL; LogSmbiosData ((EFI_SMBIOS_TABLE_HEADER *)&dstType17, mMemDevInfoType17Strings); } } #else LogSmbiosData ((EFI_SMBIOS_TABLE_HEADER *)&mMemDevInfoType17, mMemDevInfoType17Strings); #endif } /*********************************************************************** SMBIOS data update TYPE19 Memory Array Map Information ************************************************************************/ STATIC VOID MemArrMapInfoUpdateSmbiosType19 ( VOID ) { #if (FixedPcdGetBool (PcdIscpSupport)) ISCP_TYPE19_SMBIOS_INFO *SmbiosT19 = &mSmbiosInfo.SmbiosMemBuffer.T19; DEBUG ((EFI_D_ERROR, "Logging SmbiosType19 from ISCP.\n")); mMemArrMapInfoType19.StartingAddress = SmbiosT19->StartingAddr; mMemArrMapInfoType19.EndingAddress = SmbiosT19->EndingAddr; mMemArrMapInfoType19.MemoryArrayHandle = SmbiosT19->MemoryArrayHandle; mMemArrMapInfoType19.PartitionWidth = SmbiosT19->PartitionWidth; mMemArrMapInfoType19.ExtendedStartingAddress = SmbiosT19->ExtStartingAddr; mMemArrMapInfoType19.ExtendedEndingAddress = SmbiosT19->ExtEndingAddr; #endif LogSmbiosData ((EFI_SMBIOS_TABLE_HEADER *)&mMemArrMapInfoType19, mMemArrMapInfoType19Strings); } /*********************************************************************** SMBIOS data update TYPE32 Boot Information ************************************************************************/ STATIC VOID BootInfoUpdateSmbiosType32 ( VOID ) { LogSmbiosData ((EFI_SMBIOS_TABLE_HEADER *)&mBootInfoType32, mBootInfoType32Strings); } /*********************************************************************** Driver Entry ************************************************************************/ EFI_STATUS EFIAPI PlatformSmbiosDriverEntryPoint ( IN EFI_HANDLE ImageHandle, IN EFI_SYSTEM_TABLE *SystemTable ) { EFI_STATUS Status; DEBUG ((EFI_D_ERROR, "PlatformSmbiosDxe Loaded\n")); // // Locate Smbios protocol // Status = gBS->LocateProtocol ( &gEfiSmbiosProtocolGuid, NULL, (VOID **)&mSmbiosProtocol ); if (EFI_ERROR (Status)) { mSmbiosProtocol = NULL; DEBUG ((EFI_D_ERROR, "Failed to Locate SMBIOS Protocol")); return Status; } #if (FixedPcdGetBool (PcdIscpSupport)) Status = gBS->LocateProtocol ( &gAmdIscpDxeProtocolGuid, NULL, (VOID **)&mIscpDxeProtocol ); if (EFI_ERROR (Status)) { mIscpDxeProtocol = NULL; DEBUG ((EFI_D_ERROR, "Failed to Locate ISCP DXE Protocol")); return Status; } Status = mIscpDxeProtocol-> AmdExecuteSmbiosInfoDxe ( mIscpDxeProtocol, &mSmbiosInfo ); if (EFI_ERROR (Status)) { DEBUG ((EFI_D_ERROR, "Failed to get SMBIOS data via ISCP")); return Status; } #endif BIOSInfoUpdateSmbiosType0(); SysInfoUpdateSmbiosType1(); BoardInfoUpdateSmbiosType2(); EnclosureInfoUpdateSmbiosType3(); ProcessorInfoUpdateSmbiosType4(); CacheInfoUpdateSmbiosType7(); SysSlotInfoUpdateSmbiosType9(); PhyMemArrayInfoUpdateSmbiosType16(); MemDevInfoUpdatedstType17(); MemArrMapInfoUpdateSmbiosType19(); BootInfoUpdateSmbiosType32(); return Status; }