//**************************************************************************** //**************************************************************************** //** ** //** (C)Copyright 1985-2013, American Megatrends, Inc. ** //** ** //** All Rights Reserved. ** //** ** //** 5555 Oakbrook Pkwy, Suite 200, Norcross, GA 30093 ** //** ** //** Phone: (770)-246-8600 ** //** ** //**************************************************************************** //**************************************************************************** //**************************************************************************** // $Header: /Alaska/BIN/Modules/SMBIOS/SmbiosBoard.c 29 5/07/14 10:33a Davidd $ // // $Revision: 29 $ // // $Date: 5/07/14 10:33a $ //**************************************************************************** // Revision History // ---------------- // $Log: /Alaska/BIN/Modules/SMBIOS/SmbiosBoard.c $ // // 29 5/07/14 10:33a Davidd // [TAG] EIP157418 // [Category] Improvement // [Description] Removal of temporary bus assignment or sample code from // SmbiosBoard.c template // [Files] SmbiosBoard.c // // 28 11/15/13 4:31p Davidd // [TAG] EIP143321 // [Category] Improvement // [Description] Perform "CppCheck" on Smbios module for // '4.6.5.1_SMBIOS_36' release // [Files] SmbiosBoard.c // Smbios.c // SmbiosDMIEdit.c // SmbiosDMIEditFunc.c // SmbiosNvramFunc.c // // 27 5/23/13 2:36p Davidd // [TAG] EIP104836 // [Category] New Feature // [Description] DMIEdit support edit type 4 // [Files] SmbiosBoard.c // SmbiosDMIEditBoard.sdl // Smbios.c // SmbiosDMIEditFunc.c // Smbios.h // SmbiosDynamicData.h // // 26 5/04/11 3:33p Davidd // [TAG] EIP57144 // [Category] NEW FEATURE // [Description] Allow SMBIOS Type 39 to be modified using DMIEdit // [Files] SmbiosBoard.c // Smbios.h // SmbiosDynamicData.h // Smbios.c // SmbiosDmieditFunc.c // SmbiosNvramFunc.c // // 25 4/05/11 11:38a Davidd // [TAG] EIP55656 // [Category] Improvement // [Description] Provide generic support in SMBIOS module to include // build time EC version // [Files] SmbiosBoard.c // // 24 2/09/11 10:57a Davidd // [TAG] EIP52505 // [Category] Improvement // [Description] Dynamically update SMBIOS Type24 (Hardware Security) // according to Administrator/User password setup question. // [Files] SmbiosBoard.c // // 23 11/22/10 12:36p Davidd // [TAG] EIP44236 // [Category] BUG FIX // [Severity] Normal // [Symptom] SMBIOS type 4 Processor Version is incorrect // [RootCause] Type 4 Version string is not resized as updated. // [Solution] Added code to replace the Version strings as updated. // Same // also applied to Manufacturer string. // [Files] // Smbios.c // SmbiosBoard.c // // 22 11/15/10 2:18p Davidd // [TAG] EIP46936 // [Category] Improvement // [Description] Generic Smbios module should have the support to // disable SMBIOS memory update // [Files] // Smbios.c // Smbios.sdl // SmbiosBoard.c // SmbiosDynamicData.h // // 21 11/01/10 12:36p Davidd // [TAG] EIP41560 // [Category] Improvement // [Description] DMIEDIT modified values are not preserved in reboot // [Files] // Smbios.c // Smbios.sdl // SmbiosBoard.c // SmbiosBoard.mak // // 20 6/02/09 3:43p Davidd // Updated AMI and function headers (EIP 22180) // // 19 5/19/09 11:01a Davidd // Changes added to improve memory type 17 porting (EIP 22241). // // 18 12/30/08 3:11p Davidd // Fixed the hanging problem when only SMBIOS binary component is present // (ref. EIP 18370) // // 17 11/14/08 4:39p Davidd // - Added OemUpdate protocol. OEM can add code to update any structure // here. This function will be called after all structures have been // updated with DMI or dynamic data. // // 16 10/27/08 12:52p Davidd // - Code added for memory SPD data access. // - Added Type 41 support (SMBIOS v2.6) // // 15 2/22/08 10:19a Davidd // Simplified the way the number of memory slots for each physical memory // array are defined. // // 14 2/13/08 12:41p Davidd // Added a close comment missing in CreateBatteryDataForSMBios(). // // 13 2/06/08 3:58p Davidd // Added NO_OF_PORTABLE_BATTERY field to SmbiosBoardProtocol to hold the // number of batteries in the system. // // 12 12/17/07 12:09p Davidd // Added PORTABLE_BATTERY_INFO to EFI_SMBIOS_BOARD_PROTOCOL. // Removed entries intended as reminder of porting is needed. This causes // BQA Module Delete/Insertion test to fail. // // 11 11/28/07 10:56a Davidd // Changes added to dynamically update the Processor Information Type 4 // Voltage field. // // 10 11/21/07 12:11p Davidd // // 9 11/21/07 12:04p Davidd // Added function CreateBatteryDataForSMBios to support Portable Battery // Data structure type 22. // // 8 6/05/07 4:03p Michaela // Added porting comment for CreateCPUDataForSMBios() to clarify // usage for backward compatibility only // // 7 3/29/07 3:23p Davidd // Provide sample template code for both Intel and AMD platforms. User to // uncomment appropriate blocks to use. Sample template code might need // additional changes depending on platform. // // 6 3/21/07 4:35p Michaela // minor modification to CreateCPUDataForSMBios to meet // coding standards, add support for AMD and add comments. // // 5 12/15/06 1:13p Davidd // Reformatted to coding standard. // // 1 5/24/06 11:59a Fasihm // Initial check-in for the Santa Rosa Project. (Matanzas CRB) with // Crestline + ICH8M + Merom Processor. // // 3 3/15/06 5:50p Fasihm // Code modified to get the CPU data by making call to the CPU protocol. // Added some SDL token values into the SmbiosBoardProtocol. // // 4 3/03/06 5:32p Davidd // Code modified to get the CPU data by making call to the CPU protocol. // // 3 7/27/05 1:23p Davidd // Added some SDL token values into the SmbiosBoardProtocol. // // 2 7/20/05 11:17a Davidd // Commented out sample code. Sample code is for reference only. // // 1 7/18/05 5:57p Davidd // File added. This file is used to port the CPU, System Slot, and // On-Board Devices dynamic information. // //**************************************************************************** // //---------------------------------------------------------------------------- // // Name: SmbiosBoard.C // // Description: This file contains code for OEM related code for SMBIOS // //---------------------------------------------------------------------------- // //---------------------------------------------------------------------------- // Includes #include #include #include #include #include #include #include #include #include #include #include #define PCI_CFG_ADDRESS(bus,dev,func,reg) \ ((UINT64)((((UINTN)bus) << 24) + (((UINTN)dev) << 16) + (((UINTN)func) << 8) + ((UINTN)reg)))& 0x00000000ffffffff extern EFI_BOOT_SERVICES *pBS; UINT8 SmbusCmdReg; EFI_GUID gEfiSmbiosProtocolGuid = EFI_SMBIOS_PROTOCOL_GUID; EFI_SMBIOS_PROTOCOL *gSmbiosProtocol; EFI_SMBUS_HC_PROTOCOL *gSMBus = NULL; EFI_GUID gEfiSmbiosBoardProtocolGuid = EFI_SMBIOS_BOARD_PROTOCOL_GUID; EFI_SMBIOS_BOARD_PROTOCOL SmbiosBoardProtocol = {BASE_BOARD_INFO, SYS_CHASSIS_INFO, PROCESSOR_DMIEDIT_SUPPORT, OEM_STRING_INFO, SYSTEM_CONFIG_OPTION_INFO, MEMORY_ERROR_INFO, ONBOARD_DEVICE_INFO, PORTABLE_BATTERY_INFO, ADDITIONAL_INFO, ONBOARD_DEVICE_EXTENDED_INFO, SYSTEM_POWER_SUPPLY_INFO, NO_OF_PROCESSOR_SOCKETS, NUMBER_OF_SYSTEM_SLOTS, NUMBER_OF_ONBOARD_DEVICES, NO_OF_PHYSICAL_MEMORY_ARRAY, NO_OF_PORTABLE_BATTERY, ONBOARD_DEVICE_EXT_COUNT, CreateBaseBoardDataForSMBios, CreateChassisDataForSMBios, CreateCPUDataForSMBios, CreateSlotDataForSMBios, CreateOnBoardDevDataForSMBios, CreateBatteryDataForSMBios, CreateOnBoardDevExtInfoForSMBios, EnableSmbusController, RestoreSmbusController, GetSpdByte, OemUpdate, A1_MEMORY_SOCKETS, #if NO_OF_PHYSICAL_MEMORY_ARRAY >= 2 A2_MEMORY_SOCKETS, #endif #if NO_OF_PHYSICAL_MEMORY_ARRAY >= 3 A3_MEMORY_SOCKETS, #endif #if NO_OF_PHYSICAL_MEMORY_ARRAY == 4 A4_MEMORY_SOCKETS, #endif }; typedef VOID (SMBIOS_OEM_UPDATE) (VOID); extern SMBIOS_OEM_UPDATE SMBIOS_OEM_UPDATE_LIST EndOfSmbiosOemUpdateList; SMBIOS_OEM_UPDATE* SmbiosOemUpdate[] = {SMBIOS_OEM_UPDATE_LIST NULL}; /* //---------------------------------------------------------------------------- // ================================================================== // ================================================================== // ================================================================== // === === // === End of SAMPLE TEMPLATE CODE for Intel Weybridge CRB === // === platform. Uncomment this block to use. === // === === // === Might need changes for other platforms. === // === === // ================================================================== // ================================================================== // ================================================================== //---------------------------------------------------------------------------- */ // //---------------------------------------------------------------------------- // ***** PORTING REQUIRED ***** // (if SMBIOS module is part of the project) //---------------------------------------------------------------------------- // Procedure: OemUpdate // // Description: The purpose of this function is to allow OEM to update the // SMBIOS table as needed. OEM can use the EFI_SMBIOS_PROTOCOL // to read, add, delete, and write to the SMBIOS table. // // Input: None // // Output: None // // Note: // //---------------------------------------------------------------------------- // VOID OemUpdate (VOID) { /* //---------------------------------------------------------------------------- // ================================================================== // ================================================================== // ================================================================== // === === // === The following sample code DOES NOT serve any purposes. === // === It is included to illustrate the use of the SMBIOS === // === protocols only. === // === === // ================================================================== // ================================================================== // ================================================================== EFI_STATUS Status; UINT8 *Buffer; UINT16 BSize; UINT16 Handle; Status = pBS->LocateProtocol(&gEfiSmbiosProtocolGuid, NULL, &gSmbiosProtocol); ASSERT_EFI_ERROR(Status); // Read CPU structure Status = gSmbiosProtocol->SmbiosReadStrucByType(4, 1, &Buffer, &BSize); if (!EFI_ERROR(Status)) { // Update previously read CPU structure and write it back, overwriting old data Handle = ((SMBIOS_STRUCTURE_HEADER*)Buffer)->Handle; ((SMBIOS_PROCESSOR_INFO*)Buffer)->MaxSpeed = 0x1234; gSmbiosProtocol->SmbiosWriteStructure(Handle, Buffer, BSize); // Add structure with specific handle = 0x60 Handle = 0x60; gSmbiosProtocol->SmbiosAddStrucByHandle(Handle, Buffer, BSize); // Add structure with next available handle number gSmbiosProtocol->SmbiosAddStructure(Buffer, BSize); // Delete structure with handle = 3 gSmbiosProtocol->SmbiosDeleteStructure(3); // Get available free handle, then add structure with that handle Handle = gSmbiosProtocol->SmbiosGetFreeHandle(); if (Handle != -1) { gSmbiosProtocol->SmbiosAddStrucByHandle(Handle, Buffer, BSize); } // Free memory allocated by the earlier gSmbiosProtocol->SmbiosReadStrucByType call pBS->FreePool(Buffer); } // ================================================================== // ================================================================== // ================================================================== // === === // === End of sample code === // === === // ================================================================== // ================================================================== // ================================================================== //---------------------------------------------------------------------------- */ //=========================================================================== // EC Version (Type 0 Offset 0x16-0x17) dynamic update // // This code requires EC major & minor versions to be available in // ECRev1 & ECRev2 NVRAM variables respectively //=========================================================================== #if (defined(DYNAMIC_UPDATE_TYPE0_EC_VERSION) && (DYNAMIC_UPDATE_TYPE0_EC_VERSION == 1)) { EFI_STATUS Status; EFI_GUID gEfiGlobalVariableGuid = EFI_GLOBAL_VARIABLE; UINT8 EcMajorVersion; UINT8 EcMinorVersion; UINTN Size = sizeof(EcMajorVersion); UINT8 Type0Data[sizeof(SMBIOS_BIOS_INFO)]; UINT16 Type0DataSize = sizeof(SMBIOS_BIOS_INFO); UINT8 *Type0DataPtr = &Type0Data[0]; // Get EC version from ECRev1 & ECRev2 variables Status = pRS->GetVariable( L"ECRev1", \ &gEfiGlobalVariableGuid, \ NULL, \ &Size, \ &EcMajorVersion ); if (EFI_ERROR(Status)) goto exitEcVersionUpdate; Status = pRS->GetVariable( L"ECRev2", \ &gEfiGlobalVariableGuid, \ NULL, \ &Size, \ &EcMinorVersion ); if (EFI_ERROR(Status)) goto exitEcVersionUpdate; Status = pBS->LocateProtocol( &gEfiSmbiosProtocolGuid, NULL, &gSmbiosProtocol); ASSERT_EFI_ERROR(Status); if (Status == EFI_SUCCESS) { // Read Smbios Type 0 structure, update EC version and write it back Status = gSmbiosProtocol->SmbiosReadStrucByType( 0, 1, &Type0DataPtr, &Type0DataSize); ASSERT_EFI_ERROR(Status); ((SMBIOS_BIOS_INFO*)Type0DataPtr)->ECFirmwareMajorRelease = EcMajorVersion; ((SMBIOS_BIOS_INFO*)Type0DataPtr)->ECFirmwareMinorRelease = EcMinorVersion; if (Status == EFI_SUCCESS) { Status = gSmbiosProtocol->SmbiosWriteStructure( ((SMBIOS_BIOS_INFO*)Type0DataPtr)->StructureType.Handle, Type0DataPtr, Type0DataSize); ASSERT_EFI_ERROR(Status); } } exitEcVersionUpdate: Status = EFI_SUCCESS; // Dummy - To avoid build error in some cases } #endif //=========================================================================== // EC Version (Type 0 Offset 0x16-0x17) dynamic update End //=========================================================================== //=========================================================================== // ***** DO NOT REMOVE THIS BLOCK ***** // // Hardware Security (Type 24) dynamic update Start // // Update Type 24 Administrator and Power-on Password Status based on // Setup settings //=========================================================================== #if (defined(TSE_BUILD) && (HARDWARE_SECURITY_INFO == 1)) // Token indicating AMI TSE is used { #include #define AMITSESETUP_GUID \ { 0xc811fa38, 0x42c8, 0x4579, 0xa9, 0xbb, 0x60, 0xe9, 0x4e, 0xdd, 0xfb, 0x34 } EFI_STATUS Status; EFI_GUID AmiTseSetupGuid = AMITSESETUP_GUID; AMITSESETUP AmiTseData; UINTN VariableSize = sizeof(AMITSESETUP); UINTN TsePasswordLength = SETUP_PASSWORD_LENGTH * sizeof(CHAR16); CHAR16 *TestPassWord; UINT8 HwdSecSettings = 0; UINT8 *Type24Data; UINT16 Type24Size; Status = pRS->GetVariable ( L"AMITSESetup", \ &AmiTseSetupGuid, \ NULL, \ &VariableSize, \ &AmiTseData ); if (!EFI_ERROR(Status)) { Status = pBS->AllocatePool(EfiRuntimeServicesData, TsePasswordLength, &TestPassWord); if (Status == EFI_SUCCESS) { MemSet(TestPassWord, TsePasswordLength, 0); if (MemCmp(AmiTseData.UserPassword, TestPassWord, TsePasswordLength) != 0) { HwdSecSettings |= BIT6; // Power-on Password } if (MemCmp(AmiTseData.AdminPassword, TestPassWord, TsePasswordLength) != 0) { HwdSecSettings |= BIT2; // Administrator Password } Status = pBS->LocateProtocol( &gEfiSmbiosProtocolGuid, NULL, &gSmbiosProtocol); ASSERT_EFI_ERROR(Status); if (Status == EFI_SUCCESS) { Status = gSmbiosProtocol->SmbiosReadStrucByType( 24, 1, &Type24Data, &Type24Size); ASSERT_EFI_ERROR(Status); if (Status == EFI_SUCCESS) { ((SMBIOS_HARDWARE_SECURITY_INFO*)Type24Data)->HardwareSecSettings &= 0x33; // Clear Admin & Power-on pwd ((SMBIOS_HARDWARE_SECURITY_INFO*)Type24Data)->HardwareSecSettings |= HwdSecSettings; Status = gSmbiosProtocol->SmbiosWriteStructure( ((SMBIOS_HARDWARE_SECURITY_INFO*)Type24Data)->StructureType.Handle, Type24Data, Type24Size); ASSERT_EFI_ERROR(Status); pBS->FreePool(Type24Data); } } pBS->FreePool(TestPassWord); } } } #endif //=========================================================================== // Hardware Security (Type 24) dynamic update End //=========================================================================== //=========================================================================== // ***** DO NOT REMOVE THIS BLOCK ***** // ***** Calling OEM Update eLinks ***** // // OEM Update eLinks Block Start //=========================================================================== { UINT8 i; for (i = 0; SmbiosOemUpdate[i] != NULL; i++) { SmbiosOemUpdate[i](); } } //=========================================================================== // OEM Update eLinks Block End //=========================================================================== } // //---------------------------------------------------------------------------- // ***** PORTING REQUIRED ***** // (if SMBIOS module is part of the project) //---------------------------------------------------------------------------- // Procedure: EnableSmbusController // // Description: This function saves the current setting of the Smbus // Controller CMD register and then enables it so that SPD data // can be accessed. // // Input: None // // Output: EFI_STATUS // // Note: // //---------------------------------------------------------------------------- // EFI_STATUS EnableSmbusController (VOID) { EFI_GUID EfiSMBusProtocolGuid = EFI_SMBUS_HC_PROTOCOL_GUID; // Enables the SMBus controller command register if needed. return pBS->LocateProtocol( &EfiSMBusProtocolGuid, NULL, &gSMBus ); } // //---------------------------------------------------------------------------- // ***** PORTING REQUIRED ***** // (if SMBIOS module is part of the project) //---------------------------------------------------------------------------- // Procedure: RestoreSmbusController // // Description: This function restores the Smbus Controller CMD register // to the previously saved setting. // // Input: None // // Output: EFI_STATUS // // Note: // //---------------------------------------------------------------------------- // EFI_STATUS RestoreSmbusController (VOID) { EFI_STATUS Status = EFI_UNSUPPORTED; return Status; } // //---------------------------------------------------------------------------- // ***** PORTING REQUIRED ***** // (if SMBIOS module is part of the project) //---------------------------------------------------------------------------- // Procedure: GetSpdByte // // Description: This function reads a byte from the system memory SPD // // Input: IN EFI_SMBUS_DEVICE_ADDRESS SpdAddr // IN UINT8 Offset // IN OUT UINT8 *Data // // Output: EFI_STATUS // UINT8 *Data // // Note: // //---------------------------------------------------------------------------- // EFI_STATUS GetSpdByte ( IN EFI_SMBUS_DEVICE_ADDRESS SpdAddr, IN UINT8 Offset, IN OUT UINT8 *Data ) { UINTN Length = 1; if (gSMBus == NULL) return EFI_UNSUPPORTED; return gSMBus->Execute( gSMBus, SpdAddr, Offset, EfiSmbusReadByte, FALSE, &Length, Data ); } // //---------------------------------------------------------------------------- // ***** PORTING REQUIRED ***** // (if SMBIOS module is part of the project) //---------------------------------------------------------------------------- // Procedure: CreateSlotDataForSMBios // // Description: This function gathers the System Slot status information and // saves them in a variable named "SmbiosSlotsVar". This variable // with the slot information is needed by the SMBIOS module to // create the REQUIRED "Type 9" structure // // Input: None // // Output: EFI_STATUS // Variable named "SmbiosSlotsVar" with system slot information // // Note: Refer to SYSTEM_SLOT_DYNAMIC_DATA in SmbiosDynamicData.h for // structure information. // //---------------------------------------------------------------------------- // EFI_STATUS CreateSlotDataForSMBios (VOID) { EFI_STATUS Status = EFI_SUCCESS; #if UPDATE_SLOT_TYPE9 /* //---------------------------------------------------------------------------- // PORTING REQUIRED - PORTING REQUIRED - PORTING REQUIRED //---------------------------------------------------------------------------- // // Create a SYSTEM_SLOT_DYNAMIC_DATA structure and fill it with system slots // information - bus number for the slot and its current usage status. // Return the slot structure information in a variable named "SmbiosSlotsVar" // */ #endif // UPDATE_SLOT_TYPE9 return Status; } // //---------------------------------------------------------------------------- // Procedure: FillStringBufferWithSpaces // // Description: This function fills the input buffer with spaces. The number // of spaces to be filled is specified in the input BufferSize // // Input: IN UINT8 *BufferPtr // IN UINT8 BufferSize // // Output: Buffer pointed by BufferPtr is filled with spaces // //---------------------------------------------------------------------------- // VOID FillStringBufferWithSpaces ( IN UINT8 *BufferPtr, IN UINT8 BufferSize ) { UINT8 i; for (i = 0; i < (BufferSize - 1); i++) { *BufferPtr = 0x20; BufferPtr++; } *BufferPtr = 0; } // //---------------------------------------------------------------------------- // ***** PORTING REQUIRED ***** // (if SMBIOS module is part of the project) //---------------------------------------------------------------------------- // Procedure: CreateBaseBoardDataForSMBios // // Description: This function provides system chassis information. SMBIOS // Core uses these information to dynamically update SMBIOS // Chassis Type 2. // // Input: None // // Output: Creates variable named "SmbiosBaseBoardVar" with Chassis information // // Note: Refer to BASE_BOARD_DATA in SmbiosDynamicData.h for structure // information. // //---------------------------------------------------------------------------- // EFI_STATUS CreateBaseBoardDataForSMBios ( ) { EFI_STATUS Status = EFI_SUCCESS; #if UPDATE_BASEBOARD_TYPE2 /* //---------------------------------------------------------------------------- // ================================================================== // ================================================================== // ================================================================== // === === // === Start of SAMPLE TEMPLATE CODE === // === === // === Might need changes for specific platform === // === === // ================================================================== // ================================================================== // ================================================================== EFI_GUID EfiSmbiosDynamicDataGuid = EFI_SMBIOS_DYNAMIC_DATA_GUID; BASE_BOARD_DATA BaseBoardInfo; UINTN VarSize; UINT32 Attributes = EFI_VARIABLE_BOOTSERVICE_ACCESS; char* BoardID_Index[] = { "Board Name 1", // 0x00 "Board Name ", // 0x01 "Board Name ", // 0x02 }; char* BoardManufacturerName = "XYZ Corporation"; Status = pBS->LocateProtocol( &gPlatformInfoProtocolGuid, NULL, &gPlatformInfoProtocol); ASSERT_EFI_ERROR(Status); Status = pBS->AllocatePool( EfiBootServicesData, strlen(BoardManufacturerName), &BaseBoardInfo.BoardManufacturer); strcpy(BaseBoardInfo.BoardManufacturer, BoardManufacturerName); Status = pBS->AllocatePool( EfiBootServicesData, strlen(BoardID_Index[gPlatformInfoProtocol->BoardId]), &BaseBoardInfo.BoardName); strcpy(BaseBoardInfo.BoardName, BoardID_Index[gPlatformInfoProtocol->BoardId]); VarSize = sizeof(BASE_BOARD_DATA); Status = pRS->SetVariable( SmbiosBaseBoardVar, &EfiSmbiosDynamicDataGuid, Attributes, VarSize, &BaseBoardInfo); // ================================================================== // ================================================================== // ================================================================== // === === // === End of SAMPLE TEMPLATE CODE === // === === // ================================================================== // ================================================================== // ================================================================== //---------------------------------------------------------------------------- */ #endif // UPDATE_BASEBOARD_TYPE2 return Status; } // //---------------------------------------------------------------------------- // ***** PORTING REQUIRED ***** // (if SMBIOS module is part of the project) //---------------------------------------------------------------------------- // Procedure: CreateChassisDataForSMBios // // Description: This function provides system chassis information. SMBIOS // Core uses these information to dynamically update SMBIOS // Chassis Type 3. // // Input: None // // Output: Creates variable named "SmbiosChassisVar" with Chassis information // // Note: Refer to CHASSIS_DATA in SmbiosDynamicData.h for structure // information. // //---------------------------------------------------------------------------- // EFI_STATUS CreateChassisDataForSMBios ( ) { EFI_STATUS Status = EFI_SUCCESS; #if UPDATE_SYSTEM_CHASSIS_TYPE3 /* //---------------------------------------------------------------------------- // ================================================================== // ================================================================== // ================================================================== // === === // === Start of SAMPLE TEMPLATE CODE === // === === // === Might need changes for specific platform === // === === // ================================================================== // ================================================================== // ================================================================== EFI_GUID EfiSmbiosDynamicDataGuid = EFI_SMBIOS_DYNAMIC_DATA_GUID; CHASSIS_DATA ChassisInfo; UINTN VarSize; UINT32 Attributes = EFI_VARIABLE_BOOTSERVICE_ACCESS; Status = pBS->LocateProtocol( &gPlatformInfoProtocolGuid, NULL, &gPlatformInfoProtocol); ASSERT_EFI_ERROR(Status); switch (gPlatformInfoProtocol->PlatformFlavor) { case FlavorMobile: ChassisInfo.Type = 0x09; // EfiMiscChassisTypeLapTop break; case FlavorDesktop: ChassisInfo.Type = 0x03; // EfiMiscChassisTypeDeskTop break; case FlavorUpServer: ChassisInfo.Type = 0x11; // EfiMiscChassisTypeMainServerChassis break; default: ChassisInfo.Type = 0x02; // EfiMiscChassisTypeUnknown; } VarSize = sizeof(CHASSIS_DATA); Status = pRS->SetVariable( SmbiosChassisVar, &EfiSmbiosDynamicDataGuid, Attributes, VarSize, &ChassisInfo); // ================================================================== // ================================================================== // ================================================================== // === === // === End of SAMPLE TEMPLATE CODE === // === === // ================================================================== // ================================================================== // ================================================================== //---------------------------------------------------------------------------- */ #endif // UPDATE_SYSTEM_CHASSIS_TYPE3 return Status; } // //---------------------------------------------------------------------------- // ***** PORTING REQUIRED ***** // (if SMBIOS module is part of the project) //---------------------------------------------------------------------------- // Procedure: CreateCPUDataForSMBios // // Description: This function gathers the System Processor information and // saves them in a variable named "SmbiosCpuVar". This variable // with the CPU information is needed by the SMBIOS module to // create the "Type 4, 7" structure. // // Input: None // // Output: EFI_STATUS // Variable named "SmbiosCpuVar" with System CPU information // // Note: Refer to CPU_DYNAMIC_DATA in SmbiosDynamicData.h for // structure information. // // ******************** PORTING NOTE ******************** // By default, this function only returns EFI_SUCCESS and should // only be ported if the CPU module does not install the // SMBIOS_CPU_INFO_PROTOCOL. // //---------------------------------------------------------------------------- // EFI_STATUS CreateCPUDataForSMBios (VOID) { EFI_STATUS Status = EFI_SUCCESS; #if UPDATE_CPU_TYPE4 /* //---------------------------------------------------------------------------- // ================================================================== // ================================================================== // ================================================================== // === === // === Start of SAMPLE TEMPLATE CODE for Intel Weybridge CRB === // === platform. Uncomment this block to use. === // === === // === Might need changes for other platforms. === // === === // ================================================================== // ================================================================== // ================================================================== EFI_GUID gAmiCpuInfoProtocolGuid = AMI_CPU_INFO_PROTOCOL_GUID; EFI_GUID EfiSmbiosDynamicDataGuid = EFI_SMBIOS_DYNAMIC_DATA_GUID; UINTN NumCores = 1; UINTN NumHts = 1; UINTN i; UINTN j; UINT32 Attributes = EFI_VARIABLE_BOOTSERVICE_ACCESS; UINT32 L1Cache; UINT32 L2Cache; UINT32 L3Cache; AMI_CPU_INFO *GetCpuInfo = NULL; AMI_CPU_INFO_PROTOCOL *AmiCpuInfo; CPU_DYNAMIC_DATA CpuInfo; CACHE_DESCRIPTOR_INFO *CacheDescInfo; UINT8 CacheTypeTable[] = {4, 3, 1, 5}; UINT8 AssociativityTable[] = {6, 1, 4, 1, 5, 1, 1, 1, 7, 1, 1, 1, 1, 1, 1, 1, 8}; Status = pBS->LocateProtocol (&gAmiCpuInfoProtocolGuid, NULL, &AmiCpuInfo); if (EFI_ERROR(Status)) return Status; CpuInfo.NumberCPU = NO_OF_PROCESSOR_SOCKETS; for(i = 0; i < NO_OF_PROCESSOR_SOCKETS; ++i) { Status = AmiCpuInfo->GetCpuInfo(AmiCpuInfo, (UINTN)i*NumCores*NumHts, &GetCpuInfo); if (Status) { // No data available from CPU module CpuInfo.CpuData[i].CpuData.Status = 0; CpuInfo.CpuData[i].CpuData.CurrentSpeed = 0; // Hardcode MaxSpeed to 4GHz (assumed system max speed) CpuInfo.CpuData[i].CpuData.MaxSpeed = 0x0FA0; CpuInfo.CpuData[i].CpuData.ExtClockFreq = CpuInfo.CpuData[0].CpuData.ExtClockFreq; CpuInfo.CpuData[i].CpuData.ProcessorID_1 = 0; CpuInfo.CpuData[i].CpuData.ProcessorID_2 = 0; CpuInfo.CpuData[i].CpuData.Voltage = BIT01; // Assume 3.3V CpuInfo.CpuData[i].CpuData.Upgrade = CpuInfo.CpuData[0].CpuData.Upgrade; CpuInfo.CpuData[i].CpuData.Family = CpuInfo.CpuData[0].CpuData.Family; MemCpy(CpuInfo.CpuData[i].CpuData.Manufacturer, CpuInfo.CpuData[0].CpuData.Manufacturer, 18); MemCpy(CpuInfo.CpuData[i].CpuData.Version, CpuInfo.CpuData[0].CpuData.Version, 48); continue; } NumCores = GetCpuInfo->NumCores; NumHts = GetCpuInfo->NumHts; CacheDescInfo = GetCpuInfo->CacheInfo; L1Cache = 0; L2Cache = 0; L3Cache = 0; CpuInfo.CpuData[i].L1Cache.SystemCacheType = 0xFF; CpuInfo.CpuData[i].L2Cache.SystemCacheType = 0xFF; CpuInfo.CpuData[i].L3Cache.SystemCacheType = 0xFF; for(j = 0; CacheDescInfo[j].Desc; ++j) { // End of descriptors, Desc = 0. switch(GetCpuInfo->CacheInfo[j].Level) { case 1: L1Cache = CacheDescInfo[j].Size; if (CpuInfo.CpuData[i].L1Cache.SystemCacheType == 0xFF) { CpuInfo.CpuData[i].L1Cache.SystemCacheType = CacheTypeTable[CacheDescInfo[j].Type]; } else { CpuInfo.CpuData[i].L1Cache.SystemCacheType = 0x05; } CpuInfo.CpuData[i].L1Cache.Associativity = AssociativityTable[CacheDescInfo[j].Associativity]; break; case 2: L2Cache = CacheDescInfo[j].Size; if (CpuInfo.CpuData[i].L2Cache.SystemCacheType == 0xFF) { CpuInfo.CpuData[i].L2Cache.SystemCacheType = CacheTypeTable[CacheDescInfo[j].Type]; } else { CpuInfo.CpuData[i].L2Cache.SystemCacheType = 0x05; } CpuInfo.CpuData[i].L2Cache.Associativity = AssociativityTable[CacheDescInfo[j].Associativity]; break; case 3: L3Cache = CacheDescInfo[j].Size; if (CpuInfo.CpuData[i].L3Cache.SystemCacheType == 0xFF) { CpuInfo.CpuData[i].L3Cache.SystemCacheType = CacheTypeTable[CacheDescInfo[j].Type]; } else { CpuInfo.CpuData[i].L3Cache.SystemCacheType = 0x05; } CpuInfo.CpuData[i].L3Cache.Associativity = AssociativityTable[CacheDescInfo[j].Associativity]; break; } } CpuInfo.CpuData[i].CpuData.CurrentSpeed = (UINT16)(GetCpuInfo->IntendedFreq); CpuInfo.CpuData[i].CpuData.MaxSpeed = 3800; // Value from Intel Tiano BIOS CpuInfo.CpuData[i].CpuData.ExtClockFreq = (UINT16)(GetCpuInfo->FSBFreq); CpuInfo.CpuData[i].CpuData.ProcessorID_1 = (UINT32)(GetCpuInfo->Version); CpuInfo.CpuData[i].CpuData.ProcessorID_2 = (UINT32)(GetCpuInfo->Features); // From CPU module: GetCpuInfo->Voltage = Volt * 10000 // From SMBIOS spec, this field should be set to CPU voltage * 10 // Therefore this field should be set to GetCpuInfo->Voltage / 1000 CpuInfo.CpuData[i].CpuData.Voltage = (UINT8)(GetCpuInfo->Voltage / 1000); CpuInfo.CpuData[i].CpuData.Status = 0x41; CpuInfo.CpuData[i].CpuData.Upgrade = 1; CpuInfo.CpuData[i].CpuData.Family = 0xBF; // Intel(R) Core(TM) 2 Duo processor CpuInfo.CpuData[i].CpuData.CoreCount = GetCpuInfo->NumCores; CpuInfo.CpuData[i].CpuData.CoreEnabled = 1; CpuInfo.CpuData[i].CpuData.ThreadCount = GetCpuInfo->NumHts; CpuInfo.CpuData[i].CpuData.Family2 = 0xBF; if(i == 0) { FillStringBufferWithSpaces(CpuInfo.CpuData[i].CpuData.Version, sizeof(CpuInfo.CpuData[i].CpuData.Version)); MemCpy(CpuInfo.CpuData[i].CpuData.Version, GetCpuInfo->BrandString, sizeof(CpuInfo.CpuData[i].CpuData.Version) - 1); FillStringBufferWithSpaces(CpuInfo.CpuData[i].CpuData.Manufacturer, sizeof(CpuInfo.CpuData[i].CpuData.Manufacturer)); MemCpy(CpuInfo.CpuData[i].CpuData.Manufacturer, "Intel", 6); } else { MemCpy(CpuInfo.CpuData[i].CpuData.Manufacturer, CpuInfo.CpuData[0].CpuData.Manufacturer, sizeof(CpuInfo.CpuData[0].CpuData.Manufacturer)); MemCpy(CpuInfo.CpuData[i].CpuData.Version, CpuInfo.CpuData[0].CpuData.Version, sizeof(CpuInfo.CpuData[0].CpuData.Version)); } CpuInfo.CpuData[i].L1Cache.CacheConfig = 0x180; CpuInfo.CpuData[i].L1Cache.MaxCacheSize = L1Cache; // CacheL1 CpuInfo.CpuData[i].L1Cache.InstalledSize = L1Cache; CpuInfo.CpuData[i].L1Cache.SupportSRAM = 0x01; CpuInfo.CpuData[i].L1Cache.CurrentSRAM = 0x01; CpuInfo.CpuData[i].L1Cache.CacheSpeed = 0; CpuInfo.CpuData[i].L1Cache.ErrorCorrectionType = 0x03; CpuInfo.CpuData[i].L2Cache.CacheConfig = 0x281; CpuInfo.CpuData[i].L2Cache.MaxCacheSize = L2Cache; // CacheL2 CpuInfo.CpuData[i].L2Cache.InstalledSize = L2Cache; CpuInfo.CpuData[i].L2Cache.SupportSRAM = 0x01; CpuInfo.CpuData[i].L2Cache.CurrentSRAM = 0x01; CpuInfo.CpuData[i].L2Cache.CacheSpeed = 0; CpuInfo.CpuData[i].L2Cache.ErrorCorrectionType = 0x03; CpuInfo.CpuData[i].L3Cache.CacheConfig = 0x302; CpuInfo.CpuData[i].L3Cache.MaxCacheSize = L3Cache; // CacheL3 CpuInfo.CpuData[i].L3Cache.InstalledSize = L3Cache; CpuInfo.CpuData[i].L3Cache.SupportSRAM = 0x01; CpuInfo.CpuData[i].L3Cache.CurrentSRAM = 0x01; CpuInfo.CpuData[i].L3Cache.CacheSpeed = 0; CpuInfo.CpuData[i].L3Cache.ErrorCorrectionType = 0x03; } Status = pRS->SetVariable( SmbiosCpuVar, &EfiSmbiosDynamicDataGuid, Attributes, sizeof(CPU_DYNAMIC_DATA), &CpuInfo); ASSERT_EFI_ERROR(Status); // ================================================================== // ================================================================== // ================================================================== // === === // === End of SAMPLE TEMPLATE CODE for Intel Weybridge CRB === // === platform. Uncomment this block to use. === // === === // === Might need changes for other platforms. === // === === // ================================================================== // ================================================================== // ================================================================== //---------------------------------------------------------------------------- */ /* //---------------------------------------------------------------------------- // ================================================================== // ================================================================== // ================================================================== // === === // === Start of SAMPLE TEMPLATE CODE for AMD Warthog === // === platform. Uncomment this block to use. === // === === // === Might need changes for other platforms. === // === === // ================================================================== // ================================================================== // ================================================================== EFI_GUID gAmiCpuInfoProtocolGuid = AMI_CPU_INFO_PROTOCOL_GUID; EFI_GUID EfiSmbiosDynamicDataGuid = EFI_SMBIOS_DYNAMIC_DATA_GUID; UINT8 AmiType, AmiAssoc, AmiCurLevel; UINT16 AmiCurSize, L1CacheSize, L2CacheSize, L3CacheSize; UINT32 Attributes = EFI_VARIABLE_BOOTSERVICE_ACCESS; UINTN NumHts = 1, CurNode=0, CurCPU=0, NumCores = 1, CurCacheIndex; AMI_CPU_INFO *AmiCpuInfo = NULL; AMI_CPU_INFO_PROTOCOL *AmiCpuInfoProtocol; CPU_DYNAMIC_DATA CpuInfo; CACHE_DESCRIPTOR_INFO *AmiCacheDesc; CPU_DATA *CurCpuData, *Cpu0Data; CACHE_DATA *CurL1Cache, *CurL2Cache, *CurL3Cache; // ================================================================== // The mapping between AMI_CPU_INFO.CACHE_DESCRIPTOR_INFO.Type // and CPU_DYNAMIC_DATA.SINGLE_CPU_DATA.CACHE_DATA.SystemCacheType // should not require a translation table as the cache type is // encoded the same for both structures: // // CACHE_DESCRIPTOR_INFO.Type <-> CACHE_DATA.SystemCacheType // (Other) 1 <-> 1 // (Unknown) 2 <-> 2 // (Instruction) 3 <-> 3 // (Data) 4 <-> 4 // (Unified) 5 <-> 5 // // ================================================================== // The mapping between AMI_CPU_INFO.CACHE_DESCRIPTOR_INFO.Associativity // and CPU_DYNAMIC_DATA.SINGLE_CPU_DATA.CACHE_DATA.Associativity // should not require a translation table as the cache associativity // is encoded the same for both structures: // // CACHE_DESCRIPTOR_INFO.Associativity <-> CACHE_DATA.Associativity // (Other) 1 <-> 1 // (Unknown) 2 <-> 2 // (Direct) 3 <-> 3 // (2-way Set) 4 <-> 4 // (4-way Set) 5 <-> 5 // (Fully) 6 <-> 6 // (8-way Set) 7 <-> 7 // (16-way Set) 8 <-> 8 // // ================================================================== // Fill Processor Information Table (Type 4) and associated Cache // Information structures. // // Notes: A SINGLE_CPU_DATA structure is created for each // slot/socket such that only one structure is created for // a multi-core processor. This implies the assumption // that all cores on a processor have identical // configuration. // // ================================================================== Status = pBS->LocateProtocol ( &gAmiCpuInfoProtocolGuid, NULL, &AmiCpuInfoProtocol); if (EFI_ERROR(Status)) return Status; Status = AmiCpuInfoProtocol->GetCpuInfo( AmiCpuInfoProtocol, 0, &AmiCpuInfo); if (EFI_ERROR(Status)) return Status; CpuInfo.NumberCPU = NO_OF_PROCESSOR_SOCKETS; Cpu0Data = &(CpuInfo.CpuData[0].CpuData); // For each Core0 on each slot/node, create a // CPU information table. for(CurNode=0, CurCPU=0; CurNode < NO_OF_PROCESSOR_SOCKETS; CurNode++, CurCPU = AmiCpuInfo->NumCores*CurNode ) { Status = AmiCpuInfoProtocol->GetCpuInfo( AmiCpuInfoProtocol, CurCPU, &AmiCpuInfo); // some pointers to make code easier to read/type CurCpuData = &(CpuInfo.CpuData[CurNode].CpuData); CurL1Cache = &(CpuInfo.CpuData[CurNode].L1Cache); CurL2Cache = &(CpuInfo.CpuData[CurNode].L2Cache); CurL3Cache = &(CpuInfo.CpuData[CurNode].L3Cache); // if an AMI_CPU_INFO structure does not exist for this Socket // then fill with default data and attempt to get next // socket information. if (Status) { CurCpuData->Status = 0; CurCpuData->CurrentSpeed = 0; CurCpuData->MaxSpeed = 0x0FA0; CurCpuData->ExtClockFreq = Cpu0Data->ExtClockFreq; CurCpuData->ProcessorID_1 = 0; CurCpuData->ProcessorID_2 = 0; CurCpuData->Status = 0; CurCpuData->Upgrade = Cpu0Data->Upgrade; CurCpuData->Family = Cpu0Data->Family; MemCpy(CurCpuData->Manufacturer, Cpu0Data->Manufacturer, 18); MemCpy(CurCpuData->Version, Cpu0Data->Version, 48); continue; } NumCores = AmiCpuInfo->NumCores; NumHts = AmiCpuInfo->NumHts; AmiCacheDesc = AmiCpuInfo->CacheInfo; L1CacheSize = 0; L2CacheSize = 0; L3CacheSize = 0; // if more than one L1, L2, or L3 cache exits, // its type will be unified by default. CurL1Cache->SystemCacheType = 0xFF; CurL2Cache->SystemCacheType = 0xFF; CurL3Cache->SystemCacheType = 0xFF; // ========================================================== // Fill Cache Information Table (Type 7) for this slot/node // ========================================================== for ( CurCacheIndex = 0; AmiCacheDesc[CurCacheIndex].Desc; // Desc == 0 is last ++CurCacheIndex ) { AmiType = AmiCacheDesc[CurCacheIndex].Type; AmiAssoc = AmiCacheDesc[CurCacheIndex].Associativity; AmiCurLevel = AmiCacheDesc[CurCacheIndex].Level; AmiCurSize = AmiCacheDesc[CurCacheIndex].Size; switch ( AmiCurLevel ) { case EFI_CACHE_L1: L1CacheSize = AmiCurSize; if (CurL1Cache->SystemCacheType == 0xFF) CurL1Cache->SystemCacheType = AmiType; else CurL1Cache->SystemCacheType = 0x05; CurL1Cache->Associativity = AmiAssoc; break; case EFI_CACHE_L2: L2CacheSize = AmiCurSize; if (CurL2Cache->SystemCacheType == 0xFF) CurL2Cache->SystemCacheType = AmiType; else CurL2Cache->SystemCacheType = 0x05; CurL2Cache->Associativity = AmiAssoc; break; case EFI_CACHE_L3: L3CacheSize = AmiCurSize; if (CurL3Cache->SystemCacheType == 0xFF) CurL3Cache->SystemCacheType = AmiType; else CurL3Cache->SystemCacheType = 0x05; CurL3Cache->Associativity = AmiAssoc; break; } // switch } // for CurCpuData->CurrentSpeed = (UINT16)(AmiCpuInfo->ActualFreq); #if AMD_SYSTEM_BOARD == 1 CurCpuData->MaxSpeed = (UINT16)(AmiCpuInfo->MaxFreq); #endif CurCpuData->ExtClockFreq = (UINT16)(AmiCpuInfo->FSBFreq); CurCpuData->ProcessorID_1 = (UINT32)(AmiCpuInfo->Version); CurCpuData->ProcessorID_2 = (UINT32)(AmiCpuInfo->Features); CurCpuData->Status = 0x41; // Socket popuated // and CPU enabled CurCpuData->Upgrade = SMBIOS_PROCESSOR_UPGRADE; // CPU.sdl tokens CurCpuData->Family = SMBIOS_PROCESSOR_FAMILY; if(CurNode == 0) { FillStringBufferWithSpaces( CurCpuData->Version, sizeof(CurCpuData->Version)); MemCpy( CurCpuData->Version, AmiCpuInfo->BrandString, sizeof(CurCpuData->Version) - 1); FillStringBufferWithSpaces( CurCpuData->Manufacturer, sizeof(CurCpuData->Manufacturer)); MemCpy( CurCpuData->Manufacturer, AmiCpuInfo->BrandString, 5); } else { MemCpy( CurCpuData->Manufacturer, Cpu0Data->Manufacturer, sizeof(Cpu0Data->Manufacturer)); MemCpy( CurCpuData->Version, Cpu0Data->Version, sizeof(Cpu0Data->Version)); } CurL1Cache->CacheConfig = 0x180; CurL1Cache->MaxCacheSize = L1CacheSize; // CacheL1 CurL1Cache->InstalledSize = L1CacheSize; CurL1Cache->SupportSRAM = 0x01; CurL1Cache->CurrentSRAM = 0x01; CurL1Cache->CacheSpeed = 0; CurL1Cache->ErrorCorrectionType = 0x03; CurL2Cache->CacheConfig = 0x281; CurL2Cache->MaxCacheSize = L2CacheSize; // CacheL2 CurL2Cache->InstalledSize = L2CacheSize; CurL2Cache->SupportSRAM = 0x01; CurL2Cache->CurrentSRAM = 0x01; CurL2Cache->CacheSpeed = 0; CurL2Cache->ErrorCorrectionType = 0x03; CurL3Cache->CacheConfig = 0x302; CurL3Cache->MaxCacheSize = L3CacheSize; // CacheL3 CurL3Cache->InstalledSize = L3CacheSize; CurL3Cache->SupportSRAM = 0x01; CurL3Cache->CurrentSRAM = 0x01; CurL3Cache->CacheSpeed = 0; CurL3Cache->ErrorCorrectionType = 0x03; } // for Status = pRS->SetVariable( SmbiosCpuVar, &EfiSmbiosDynamicDataGuid, Attributes, sizeof(CPU_DYNAMIC_DATA), &CpuInfo ); ASSERT_EFI_ERROR(Status); // ================================================================== // ================================================================== // ================================================================== // === === // === End of SAMPLE TEMPLATE CODE for AMD Warthog === // === platform. Uncomment this block to use. === // === === // === Might need changes for other platforms. === // === === // ================================================================== // ================================================================== // ================================================================== //---------------------------------------------------------------------------- */ #endif // UPDATE_CPU_TYPE4 return Status; } // //---------------------------------------------------------------------------- // ***** OPTIONAL ***** // (if SMBIOS module is part of the project) //---------------------------------------------------------------------------- // Procedure: CreateOnBoardDevDataForSMBios // // Description: This function gathers the Onboard Device status information and // saves them in a variable named "SmbiosOnBoardVar". This variable // with the OnBoard Device information is needed by the SMBIOS // module to create the "Type 10" structure. // // Input: None // // Output: EFI_STATUS // Variable named "SmbiosOnBoardVar" with on-board device information // // Note: Refer to ONBOARD_DEV_DYNAMIC_DATA in SmbiosDynamicData.h for // structure information. // // Set device status to 0 if disabled. // Set device status to 0x80 if enabled. // Ex: In sample code // OnBoardDevInfo.OnBoardDev[0] = 0; // Disabled // OnBoardDevInfo.OnBoardDev[0] = 0x80; // Enabled // //---------------------------------------------------------------------------- // EFI_STATUS CreateOnBoardDevDataForSMBios (VOID) { EFI_STATUS Status = EFI_SUCCESS; #if UPDATE_ONBOARD_DEV_TYPE10 /* //---------------------------------------------------------------------------- // ================================================================== // ================================================================== // ================================================================== // === === // === Start of SAMPLE TEMPLATE CODE for Intel Weybridge CRB === // === platform. Uncomment this block to use. === // === === // === Might need changes for other platforms. === // === === // ================================================================== // ================================================================== // ================================================================== EFI_GUID EfiSmbiosDynamicDataGuid = EFI_SMBIOS_DYNAMIC_DATA_GUID; UINTN VarSize; UINT32 Attributes = EFI_VARIABLE_BOOTSERVICE_ACCESS; ONBOARD_DEV_DYNAMIC_DATA OnBoardDevInfo; UINT64 PciAddress; UINT8 Value8; EFI_GUID gEfiPciRootBridgeIoProtocolGuid = EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL_GUID; EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL *gPciRootBridgeIo; Status = pBS->LocateProtocol( &gEfiPciRootBridgeIoProtocolGuid, NULL, &gPciRootBridgeIo); ASSERT_EFI_ERROR(Status); // Onboard Video PciAddress = PCI_CFG_ADDRESS (0, 0, 0, MCH_REG_GGC); gPciRootBridgeIo->Pci.Read ( gPciRootBridgeIo, EfiPciWidthUint8, PciAddress, 1, &Value8); if (Value8 & BIT01) { OnBoardDevInfo.OnBoardDev[0] = 0; // Disabled } else { OnBoardDevInfo.OnBoardDev[0] = 0x80; // Enabled } // Onboard LAN Value8 = *(UINT8*)(SB_RCBA + R_RCBA_BUC); if (Value8 & B_LAN_DISABLE) { OnBoardDevInfo.OnBoardDev[1] = 0; // Disabled } else { OnBoardDevInfo.OnBoardDev[1] = 0x80; // Enabled } // Onboard 1394 - Use GPIO49 0/1 = Enabled/Disabled Value8 = IoRead32(GPIO_BASE_ADDRESS + ICH_GPIO_GP_LVL2 + 2); if (Value8 & BIT01) { OnBoardDevInfo.OnBoardDev[2] = 0; // Disabled } else { OnBoardDevInfo.OnBoardDev[2] = 0x80; // Enabled } VarSize = sizeof(ONBOARD_DEV_DYNAMIC_DATA); Status = pRS->SetVariable(SmbiosOnBoardVar, &EfiSmbiosDynamicDataGuid, Attributes, VarSize, &OnBoardDevInfo); // ================================================================== // ================================================================== // ================================================================== // === === // === End of SAMPLE TEMPLATE CODE for Intel Weybridge CRB === // === platform. Uncomment this block to use. === // === === // === Might need changes for other platforms. === // === === // ================================================================== // ================================================================== // ================================================================== //---------------------------------------------------------------------------- */ #endif // UPDATE_ONBOARD_DEV_TYPE10 return Status; } // //---------------------------------------------------------------------------- // ***** OPTIONAL ***** // (if SMBIOS module is part of the project) //---------------------------------------------------------------------------- // Procedure: CreateOnBoardDevExtInfoForSMBios // // Description: This function gathers the Onboard Device status information // and saves them in a variable named "SmbiosOnBoardExtVar". // This variable with the OnBoard Device Extended information // is needed by the SMBIOS module to create the "Type 41" // structure. // // Input: None // // Output: EFI_STATUS // Variable named "SmbiosOnBoardExtVar" with on-board device // information. // // Note: Refer to ONBOARD_DEV_EXT_DYNAMIC_DATA in SmbiosDynamicData.h for // structure information. // // Set device status to 0 if disabled. // Set device status to 0x80 if enabled. // Ex: In sample code // OnBoardDevInfo.OnBoardDev[0] = 0; // Disabled // OnBoardDevInfo.OnBoardDev[0] = 0x80; // Enabled // //---------------------------------------------------------------------------- // EFI_STATUS CreateOnBoardDevExtInfoForSMBios (VOID) { EFI_STATUS Status = EFI_SUCCESS; #if UPDATE_DEVICE_EXT_TYPE41 /* //---------------------------------------------------------------------------- // ================================================================== // ================================================================== // ================================================================== // === === // === Start of SAMPLE TEMPLATE CODE for Intel Weybridge CRB === // === platform. Uncomment this block to use. === // === === // === Might need changes for other platforms. === // === === // ================================================================== // ================================================================== // ================================================================== EFI_GUID EfiSmbiosDynamicDataGuid = EFI_SMBIOS_DYNAMIC_DATA_GUID; UINTN VarSize; UINT32 Attributes = EFI_VARIABLE_BOOTSERVICE_ACCESS; ONBOARD_DEV_EXT_DYNAMIC_DATA OnBoardDevExtInfo; UINT64 PciAddress; UINT8 Value8; EFI_GUID gEfiPciRootBridgeIoProtocolGuid = EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL_GUID; EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL *gPciRootBridgeIo; Status = pBS->LocateProtocol( &gEfiPciRootBridgeIoProtocolGuid, NULL, &gPciRootBridgeIo); ASSERT_EFI_ERROR(Status); // Onboard Video PciAddress = PCI_CFG_ADDRESS (0, 0, 0, MCH_REG_GGC); gPciRootBridgeIo->Pci.Read ( gPciRootBridgeIo, EfiPciWidthUint8, PciAddress, 1, &Value8); if (Value8 & BIT01) { OnBoardDevExtInfo.OnBoardDev[0] = 0; // Disabled } else { OnBoardDevExtInfo.OnBoardDev[0] = 0x80; // Enabled } OnBoardDevExtInfo.BusNumber[0] = 0; // Onboard LAN Value8 = *(UINT8*)(SB_RCBA + R_RCBA_BUC); if (Value8 & B_LAN_DISABLE) { OnBoardDevExtInfo.OnBoardDev[1] = 0; // Disabled } else { OnBoardDevExtInfo.OnBoardDev[1] = 0x80; // Enabled } OnBoardDevExtInfo.BusNumber[1] = 0; // Onboard 1394 - Use GPIO49 0/1 = Enabled/Disabled Value8 = IoRead32(GPIO_BASE_ADDRESS + ICH_GPIO_GP_LVL2 + 2); if (Value8 & BIT01) { OnBoardDevExtInfo.OnBoardDev[2] = 0; // Disabled } else { OnBoardDevExtInfo.OnBoardDev[2] = 0x80; // Enabled } PciAddress = PCI_CFG_ADDRESS (0, 0x1C, 2, 0x19); gPciRootBridgeIo->Pci.Read ( gPciRootBridgeIo, EfiPciWidthUint8, PciAddress, 1, &Value8); OnBoardDevExtInfo.BusNumber[2] = Value8; VarSize = sizeof(ONBOARD_DEV_EXT_DYNAMIC_DATA); Status = pRS->SetVariable(SmbiosOnBoardExtVar, &EfiSmbiosDynamicDataGuid, Attributes, VarSize, &OnBoardDevExtInfo); // ================================================================== // ================================================================== // ================================================================== // === === // === End of SAMPLE TEMPLATE CODE for Intel Weybridge CRB === // === platform. Uncomment this block to use. === // === === // === Might need changes for other platforms. === // === === // ================================================================== // ================================================================== // ================================================================== //---------------------------------------------------------------------------- */ #endif // UPDATE_DEVICE_EXT_TYPE41 return Status; } // //---------------------------------------------------------------------------- // ***** PORTING REQUIRED ***** // (if SMBIOS module is part of the project) //---------------------------------------------------------------------------- // Procedure: CreateBatteryDataForSMBios // // Description: This function provides system battery information. SMBIOS // Core uses these information to dynamically update SMBIOS // Portable Battery Data structure Type 22. // // Input: None // // Output: EFI_STATUS // Variable named "SmbiosBatteryVar" with Battery information // // Note: Refer to BATTERY_DYNAMIC_DATA in SmbiosDynamicData.h for // structure information. // //---------------------------------------------------------------------------- // EFI_STATUS CreateBatteryDataForSMBios (VOID) { EFI_STATUS Status = EFI_SUCCESS; #if UPDATE_BATTERY_TYPE22 /* //---------------------------------------------------------------------------- // ================================================================== // ================================================================== // ================================================================== // === === // === Start of dummy code === // === === // === PORTING IS NEEDED FOR INDIVIDUAL PLATFORM !!! === // === === // ================================================================== // ================================================================== // ================================================================== EFI_GUID EfiSmbiosDynamicDataGuid = EFI_SMBIOS_DYNAMIC_DATA_GUID; BATTERY_DYNAMIC_DATA BatteryInfo; UINTN VarSize; UINT32 Attributes = EFI_VARIABLE_BOOTSERVICE_ACCESS; UINT8 DeviceName1[] = "BATT 1"; UINT8 DeviceName2[] = "Another Battery Name"; UINT8 SbdsVersion1[] = "01.12.912"; UINT8 SbdsVersion2[] = "00.01"; BatteryInfo.BatteryDynamicData[0].DesignCapacity = 1; BatteryInfo.BatteryDynamicData[0].DesignVoltage = 5000; BatteryInfo.BatteryDynamicData[0].SbdsSerialNumber = 0x1111; BatteryInfo.BatteryDynamicData[0].SbdsManufacturedDate = 0x2841; BatteryInfo.BatteryDynamicData[0].DesignCapacityMult = 1000; // When copying strings, MAKE SURE THE ZERO TERMINATOR // for the string is included MemCpy (BatteryInfo.BatteryDynamicData[0].DeviceName, DeviceName1, sizeof(DeviceName1)); MemCpy (BatteryInfo.BatteryDynamicData[0].SbdsVersion, SbdsVersion1, sizeof(SbdsVersion1)); BatteryInfo.BatteryDynamicData[0].Valid = TRUE; BatteryInfo.BatteryDynamicData[1].DesignCapacity = 1; BatteryInfo.BatteryDynamicData[1].DesignVoltage = 9000; BatteryInfo.BatteryDynamicData[1].SbdsSerialNumber = 0x4444; BatteryInfo.BatteryDynamicData[1].SbdsManufacturedDate = 0x1814; BatteryInfo.BatteryDynamicData[1].DesignCapacityMult = 500; // When copying strings, MAKE SURE THE ZERO TERMINATOR // for the string is included MemCpy (BatteryInfo.BatteryDynamicData[1].DeviceName, DeviceName2, sizeof(DeviceName2)); MemCpy (BatteryInfo.BatteryDynamicData[1].SbdsVersion, SbdsVersion2, sizeof(SbdsVersion2)); BatteryInfo.BatteryDynamicData[1].Valid = FALSE; BatteryInfo.BatteryDynamicData[2].DesignCapacity = 1; BatteryInfo.BatteryDynamicData[2].DesignVoltage = 3000; BatteryInfo.BatteryDynamicData[2].SbdsSerialNumber = 0x7777; BatteryInfo.BatteryDynamicData[2].SbdsManufacturedDate = 0x0814; BatteryInfo.BatteryDynamicData[2].DesignCapacityMult = 200; // When copying strings, MAKE SURE THE ZERO TERMINATOR // for the string is included MemCpy (BatteryInfo.BatteryDynamicData[2].DeviceName, DeviceName2, sizeof(DeviceName2)); MemCpy (BatteryInfo.BatteryDynamicData[2].SbdsVersion, SbdsVersion2, sizeof(SbdsVersion2)); BatteryInfo.BatteryDynamicData[2].Valid = FALSE; BatteryInfo.BatteryDynamicData[3].DesignCapacity = 1; BatteryInfo.BatteryDynamicData[3].DesignVoltage = 1000; BatteryInfo.BatteryDynamicData[3].SbdsSerialNumber = 0x9999; BatteryInfo.BatteryDynamicData[3].SbdsManufacturedDate = 0x5814; BatteryInfo.BatteryDynamicData[3].DesignCapacityMult = 700; // When copying strings, MAKE SURE THE ZERO TERMINATOR // for the string is included MemCpy (BatteryInfo.BatteryDynamicData[3].DeviceName, DeviceName2, sizeof(DeviceName2)); MemCpy (BatteryInfo.BatteryDynamicData[3].SbdsVersion, SbdsVersion2, sizeof(SbdsVersion2)); BatteryInfo.BatteryDynamicData[3].Valid = TRUE; VarSize = sizeof(BATTERY_DYNAMIC_DATA); Status = pRS->SetVariable(SmbiosBatteryVar, &EfiSmbiosDynamicDataGuid, Attributes, VarSize, &BatteryInfo); // ================================================================== // ================================================================== // ================================================================== // === === // === End of dummy code === // === === // ================================================================== // ================================================================== // ================================================================== //---------------------------------------------------------------------------- */ #endif // UPDATE_BATTERY_TYPE22 return Status; } // //---------------------------------------------------------------------------- // Procedure: SMIBiosBoardDriverEntryPoint // // Description: SMBIOS Board driver entry point // // Input: IN EFI_HANDLE ImageHandle, // IN EFI_SYSTEM_TABLE *SystemTable // // Output: EFI_STATUS // // Modified: // // Referrals: // // Notes: //---------------------------------------------------------------------------- // EFI_STATUS SMIBiosBoardDriverEntryPoint( IN EFI_HANDLE ImageHandle, IN EFI_SYSTEM_TABLE *SystemTable ) { EFI_STATUS Status; InitAmiLib(ImageHandle, SystemTable); Status = pBS->InstallProtocolInterface(&ImageHandle, &gEfiSmbiosBoardProtocolGuid, EFI_NATIVE_INTERFACE, &SmbiosBoardProtocol); return Status; } //**************************************************************************** //**************************************************************************** //** ** //** (C)Copyright 1985-2013, American Megatrends, Inc. ** //** ** //** All Rights Reserved. ** //** ** //** 5555 Oakbrook Pkwy, Suite 200, Norcross, GA 30093 ** //** ** //** Phone: (770)-246-8600 ** //** ** //**************************************************************************** //****************************************************************************