--- /dev/null
+/** @file\r
+ This driver parses the mSmbiosMiscDataTable structure and reports\r
+ any generated data using SMBIOS protocol.\r
+\r
+ Based on files under Nt32Pkg/MiscSubClassPlatformDxe/\r
+\r
+ Copyright (c) 2021, NUVIA Inc. All rights reserved.<BR>\r
+ Copyright (c) 2009 - 2011, Intel Corporation. All rights reserved.<BR>\r
+ Copyright (c) 2015, Hisilicon Limited. All rights reserved.<BR>\r
+ Copyright (c) 2015, Linaro Limited. All rights reserved.<BR>\r
+ SPDX-License-Identifier: BSD-2-Clause-Patent\r
+\r
+**/\r
+\r
+#include <Library/BaseLib.h>\r
+#include <Library/BaseMemoryLib.h>\r
+#include <Library/DebugLib.h>\r
+#include <Library/HiiLib.h>\r
+#include <Library/MemoryAllocationLib.h>\r
+#include <Library/OemMiscLib.h>\r
+#include <Library/PrintLib.h>\r
+#include <Library/UefiBootServicesTableLib.h>\r
+\r
+#include "SmbiosMisc.h"\r
+\r
+\r
+/**\r
+ This function makes boot time changes to the contents of the\r
+ MiscBaseBoardManufacturer (Type 2) record.\r
+\r
+ @param RecordData Pointer to SMBIOS table with default values.\r
+ @param Smbios SMBIOS protocol.\r
+\r
+ @retval EFI_SUCCESS The SMBIOS table was successfully added.\r
+ @retval EFI_INVALID_PARAMETER Invalid parameter was found.\r
+ @retval EFI_OUT_OF_RESOURCES Failed to allocate required memory.\r
+\r
+**/\r
+SMBIOS_MISC_TABLE_FUNCTION(MiscBaseBoardManufacturer)\r
+{\r
+ CHAR8 *OptionalStrStart;\r
+ CHAR8 *StrStart;\r
+ UINTN RecordLength;\r
+ UINTN ManuStrLen;\r
+ UINTN ProductNameStrLen;\r
+ UINTN VerStrLen;\r
+ UINTN SerialNumStrLen;\r
+ UINTN AssetTagStrLen;\r
+ UINTN ChassisLocaStrLen;\r
+ UINTN HandleCount;\r
+ UINT16 *HandleArray;\r
+ CHAR16 *BaseBoardManufacturer;\r
+ CHAR16 *BaseBoardProductName;\r
+ CHAR16 *Version;\r
+ EFI_STRING SerialNumber;\r
+ EFI_STRING AssetTag;\r
+ EFI_STRING ChassisLocation;\r
+ EFI_STRING_ID TokenToGet;\r
+ SMBIOS_TABLE_TYPE2 *SmbiosRecord;\r
+ SMBIOS_TABLE_TYPE2 *InputData;\r
+ EFI_STATUS Status;\r
+\r
+ EFI_STRING_ID TokenToUpdate;\r
+\r
+ HandleCount = 0;\r
+ HandleArray = NULL;\r
+ InputData = NULL;\r
+\r
+ //\r
+ // First check for invalid parameters.\r
+ //\r
+ if (RecordData == NULL) {\r
+ return EFI_INVALID_PARAMETER;\r
+ }\r
+\r
+ InputData = (SMBIOS_TABLE_TYPE2*)RecordData;\r
+\r
+ BaseBoardManufacturer = (CHAR16 *) PcdGetPtr (PcdBaseBoardManufacturer);\r
+ if (StrLen (BaseBoardManufacturer) > 0) {\r
+ TokenToUpdate = STRING_TOKEN (STR_MISC_BASE_BOARD_MANUFACTURER);\r
+ HiiSetString (mSmbiosMiscHiiHandle, TokenToUpdate, BaseBoardManufacturer, NULL);\r
+ }\r
+\r
+ BaseBoardProductName = (CHAR16 *) PcdGetPtr (PcdBaseBoardProductName);\r
+ if (StrLen (BaseBoardProductName) > 0) {\r
+ TokenToUpdate = STRING_TOKEN (STR_MISC_BASE_BOARD_PRODUCT_NAME);\r
+ HiiSetString (mSmbiosMiscHiiHandle, TokenToUpdate, BaseBoardProductName, NULL);\r
+ }\r
+\r
+ Version = (CHAR16 *) PcdGetPtr (PcdBaseBoardVersion);\r
+ if (StrLen (Version) > 0) {\r
+ TokenToUpdate = STRING_TOKEN (STR_MISC_BASE_BOARD_VERSION);\r
+ HiiSetString (mSmbiosMiscHiiHandle, TokenToUpdate, Version, NULL);\r
+ }\r
+\r
+ OemUpdateSmbiosInfo (mSmbiosMiscHiiHandle,\r
+ STRING_TOKEN (STR_MISC_BASE_BOARD_ASSET_TAG),\r
+ AssertTagType02\r
+ );\r
+ OemUpdateSmbiosInfo (mSmbiosMiscHiiHandle,\r
+ STRING_TOKEN (STR_MISC_BASE_BOARD_SERIAL_NUMBER),\r
+ SerialNumberType02\r
+ );\r
+ OemUpdateSmbiosInfo (mSmbiosMiscHiiHandle,\r
+ STRING_TOKEN (STR_MISC_BASE_BOARD_MANUFACTURER),\r
+ BoardManufacturerType02\r
+ );\r
+ OemUpdateSmbiosInfo (mSmbiosMiscHiiHandle,\r
+ STRING_TOKEN (STR_MISC_BASE_BOARD_SERIAL_NUMBER),\r
+ SerialNumberType02\r
+ );\r
+ OemUpdateSmbiosInfo (mSmbiosMiscHiiHandle,\r
+ STRING_TOKEN (STR_MISC_BASE_BOARD_SKU_NUMBER),\r
+ SerialNumberType02\r
+ );\r
+ OemUpdateSmbiosInfo (mSmbiosMiscHiiHandle,\r
+ STRING_TOKEN (STR_MISC_BASE_BOARD_CHASSIS_LOCATION),\r
+ ChassisLocationType02\r
+ );\r
+\r
+ TokenToGet = STRING_TOKEN (STR_MISC_BASE_BOARD_MANUFACTURER);\r
+ BaseBoardManufacturer = HiiGetPackageString (&gEfiCallerIdGuid, TokenToGet, NULL);\r
+ ManuStrLen = StrLen (BaseBoardManufacturer);\r
+\r
+ TokenToGet = STRING_TOKEN (STR_MISC_BASE_BOARD_PRODUCT_NAME);\r
+ BaseBoardProductName = HiiGetPackageString (&gEfiCallerIdGuid, TokenToGet, NULL);\r
+ ProductNameStrLen = StrLen (BaseBoardProductName);\r
+\r
+ TokenToGet = STRING_TOKEN (STR_MISC_BASE_BOARD_VERSION);\r
+ Version = HiiGetPackageString (&gEfiCallerIdGuid, TokenToGet, NULL);\r
+ VerStrLen = StrLen (Version);\r
+\r
+ TokenToGet = STRING_TOKEN (STR_MISC_BASE_BOARD_SERIAL_NUMBER);\r
+ SerialNumber = HiiGetPackageString (&gEfiCallerIdGuid, TokenToGet, NULL);\r
+ SerialNumStrLen = StrLen (SerialNumber);\r
+\r
+ TokenToGet = STRING_TOKEN (STR_MISC_BASE_BOARD_ASSET_TAG);\r
+ AssetTag = HiiGetPackageString (&gEfiCallerIdGuid, TokenToGet, NULL);\r
+ AssetTagStrLen = StrLen (AssetTag);\r
+\r
+ TokenToGet = STRING_TOKEN (STR_MISC_BASE_BOARD_CHASSIS_LOCATION);\r
+ ChassisLocation = HiiGetPackageString (&gEfiCallerIdGuid, TokenToGet, NULL);\r
+ ChassisLocaStrLen = StrLen (ChassisLocation);\r
+\r
+ //\r
+ // Two zeros following the last string.\r
+ //\r
+ RecordLength = sizeof (SMBIOS_TABLE_TYPE2) +\r
+ ManuStrLen + 1 +\r
+ ProductNameStrLen + 1 +\r
+ VerStrLen + 1 +\r
+ SerialNumStrLen + 1 +\r
+ AssetTagStrLen + 1 +\r
+ ChassisLocaStrLen + 1 + 1;\r
+ SmbiosRecord = AllocateZeroPool (RecordLength);\r
+ if (SmbiosRecord == NULL) {\r
+ Status = EFI_OUT_OF_RESOURCES;\r
+ goto Exit;\r
+ }\r
+\r
+ (VOID)CopyMem (SmbiosRecord, InputData, sizeof (SMBIOS_TABLE_TYPE2));\r
+ SmbiosRecord->Hdr.Length = sizeof (SMBIOS_TABLE_TYPE2);\r
+\r
+ //\r
+ // Update Contained objects Handle\r
+ //\r
+ SmbiosRecord->NumberOfContainedObjectHandles = 0;\r
+ SmbiosMiscGetLinkTypeHandle (EFI_SMBIOS_TYPE_SYSTEM_ENCLOSURE, &HandleArray,\r
+ &HandleCount);\r
+ // It's assumed there's at most a single chassis\r
+ ASSERT (HandleCount < 2);\r
+ if (HandleCount > 0) {\r
+ SmbiosRecord->ChassisHandle = HandleArray[0];\r
+ }\r
+\r
+ FreePool (HandleArray);\r
+\r
+ OptionalStrStart = (CHAR8 *)(SmbiosRecord + 1);\r
+ UnicodeStrToAsciiStrS (BaseBoardManufacturer, OptionalStrStart, ManuStrLen + 1);\r
+\r
+ StrStart = OptionalStrStart + ManuStrLen + 1;\r
+ UnicodeStrToAsciiStrS (BaseBoardProductName, StrStart, ProductNameStrLen + 1);\r
+\r
+ StrStart += ProductNameStrLen + 1;\r
+ UnicodeStrToAsciiStrS (Version, StrStart, VerStrLen + 1);\r
+\r
+ StrStart += VerStrLen + 1;\r
+ UnicodeStrToAsciiStrS (SerialNumber, StrStart, SerialNumStrLen + 1);\r
+\r
+ StrStart += SerialNumStrLen + 1;\r
+ UnicodeStrToAsciiStrS (AssetTag, StrStart, AssetTagStrLen + 1);\r
+\r
+ StrStart += AssetTagStrLen + 1;\r
+ UnicodeStrToAsciiStrS (ChassisLocation, StrStart, ChassisLocaStrLen + 1);\r
+\r
+ Status = SmbiosMiscAddRecord ((UINT8 *)SmbiosRecord, NULL);\r
+ if (EFI_ERROR (Status)) {\r
+ DEBUG ((DEBUG_ERROR, "[%a]:[%dL] Smbios Type02 Table Log Failed! %r \n",\r
+ __FUNCTION__, __LINE__, Status));\r
+ }\r
+\r
+ FreePool (SmbiosRecord);\r
+\r
+Exit:\r
+ if (BaseBoardManufacturer != NULL) {\r
+ FreePool (BaseBoardManufacturer);\r
+ }\r
+\r
+ if (BaseBoardProductName != NULL) {\r
+ FreePool (BaseBoardProductName);\r
+ }\r
+\r
+ if (Version != NULL) {\r
+ FreePool (Version);\r
+ }\r
+\r
+ if (SerialNumber != NULL) {\r
+ FreePool (SerialNumber);\r
+ }\r
+\r
+ if (AssetTag != NULL) {\r
+ FreePool (AssetTag);\r
+ }\r
+\r
+ if (ChassisLocation != NULL) {\r
+ FreePool (ChassisLocation);\r
+ }\r
+\r
+ return 0;\r
+}\r