--- /dev/null
+/** @file\r
+ This driver parses the mMiscSubclassDataTable structure and reports\r
+ any generated data to smbios.\r
+\r
+ Based on files under Nt32Pkg/MiscSubClassPlatformDxe/\r
+\r
+ Copyright (c) 2021, NUVIA Inc. All rights reserved.<BR>\r
+ Copyright (c) 2006 - 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
+ This function makes boot time changes to the contents of the\r
+ MiscSystemManufacturer (Type 1) 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(MiscSystemManufacturer)\r
+{\r
+ CHAR8 *OptionalStrStart;\r
+ CHAR8 *StrStart;\r
+ UINTN ManuStrLen;\r
+ UINTN VerStrLen;\r
+ UINTN PdNameStrLen;\r
+ UINTN SerialNumStrLen;\r
+ UINTN SKUNumStrLen;\r
+ UINTN FamilyStrLen;\r
+ UINTN RecordLength;\r
+ EFI_STRING Manufacturer;\r
+ EFI_STRING ProductName;\r
+ EFI_STRING Version;\r
+ EFI_STRING SerialNumber;\r
+ EFI_STRING SKUNumber;\r
+ EFI_STRING Family;\r
+ EFI_STRING_ID TokenToGet;\r
+ SMBIOS_TABLE_TYPE1 *SmbiosRecord;\r
+ SMBIOS_TABLE_TYPE1 *InputData;\r
+ EFI_STATUS Status;\r
+ EFI_STRING_ID TokenToUpdate;\r
+ CHAR16 *Product;\r
+ CHAR16 *pVersion;\r
+\r
+ Status = EFI_SUCCESS;\r
+\r
+ //\r
+ // First check for invalid parameters.\r
+ //\r
+ if (RecordData == NULL) {\r
+ return EFI_INVALID_PARAMETER;\r
+ }\r
+\r
+ InputData = (SMBIOS_TABLE_TYPE1 *)RecordData;\r
+\r
+ Product = (CHAR16 *) PcdGetPtr (PcdSystemProductName);\r
+ if (StrLen (Product) > 0) {\r
+ TokenToUpdate = STRING_TOKEN (STR_MISC_SYSTEM_PRODUCT_NAME);\r
+ HiiSetString (mSmbiosMiscHiiHandle, TokenToUpdate, Product, NULL);\r
+ }\r
+\r
+ pVersion = (CHAR16 *) PcdGetPtr (PcdSystemVersion);\r
+ if (StrLen (pVersion) > 0) {\r
+ TokenToUpdate = STRING_TOKEN (STR_MISC_SYSTEM_VERSION);\r
+ HiiSetString (mSmbiosMiscHiiHandle, TokenToUpdate, pVersion, NULL);\r
+ }\r
+\r
+ OemUpdateSmbiosInfo (mSmbiosMiscHiiHandle,\r
+ STRING_TOKEN (STR_MISC_SYSTEM_SERIAL_NUMBER),\r
+ SerialNumType01);\r
+ OemUpdateSmbiosInfo (mSmbiosMiscHiiHandle,\r
+ STRING_TOKEN (STR_MISC_SYSTEM_MANUFACTURER),\r
+ SystemManufacturerType01);\r
+ OemUpdateSmbiosInfo (mSmbiosMiscHiiHandle,\r
+ STRING_TOKEN (STR_MISC_SYSTEM_SKU_NUMBER),\r
+ SkuNumberType01);\r
+ OemUpdateSmbiosInfo (mSmbiosMiscHiiHandle,\r
+ STRING_TOKEN (STR_MISC_SYSTEM_FAMILY),\r
+ FamilyType01);\r
+\r
+ TokenToGet = STRING_TOKEN (STR_MISC_SYSTEM_MANUFACTURER);\r
+ Manufacturer = HiiGetPackageString (&gEfiCallerIdGuid, TokenToGet, NULL);\r
+ ManuStrLen = StrLen (Manufacturer);\r
+\r
+ TokenToGet = STRING_TOKEN (STR_MISC_SYSTEM_PRODUCT_NAME);\r
+ ProductName = HiiGetPackageString (&gEfiCallerIdGuid, TokenToGet, NULL);\r
+ PdNameStrLen = StrLen (ProductName);\r
+\r
+ TokenToGet = STRING_TOKEN (STR_MISC_SYSTEM_VERSION);\r
+ Version = HiiGetPackageString (&gEfiCallerIdGuid, TokenToGet, NULL);\r
+ VerStrLen = StrLen (Version);\r
+\r
+ TokenToGet = STRING_TOKEN (STR_MISC_SYSTEM_SERIAL_NUMBER);\r
+ SerialNumber = HiiGetPackageString (&gEfiCallerIdGuid, TokenToGet, NULL);\r
+ SerialNumStrLen = StrLen (SerialNumber);\r
+\r
+ TokenToGet = STRING_TOKEN (STR_MISC_SYSTEM_SKU_NUMBER);\r
+ SKUNumber = HiiGetPackageString (&gEfiCallerIdGuid, TokenToGet, NULL);\r
+ SKUNumStrLen = StrLen (SKUNumber);\r
+\r
+ TokenToGet = STRING_TOKEN (STR_MISC_SYSTEM_FAMILY);\r
+ Family = HiiGetPackageString (&gEfiCallerIdGuid, TokenToGet, NULL);\r
+ FamilyStrLen = StrLen (Family);\r
+\r
+ //\r
+ // Two zeros following the last string.\r
+ //\r
+ RecordLength = sizeof (SMBIOS_TABLE_TYPE1) +\r
+ ManuStrLen + 1 +\r
+ PdNameStrLen + 1 +\r
+ VerStrLen + 1 +\r
+ SerialNumStrLen + 1 +\r
+ SKUNumStrLen + 1 +\r
+ FamilyStrLen + 1 + 1;\r
+ SmbiosRecord = AllocateZeroPool (RecordLength);\r
+\r
+ if (SmbiosRecord == NULL) {\r
+ Status = EFI_OUT_OF_RESOURCES;\r
+ goto Exit;\r
+ }\r
+\r
+ (VOID)CopyMem (SmbiosRecord, InputData, sizeof (SMBIOS_TABLE_TYPE1));\r
+\r
+ SmbiosRecord->Hdr.Length = sizeof (SMBIOS_TABLE_TYPE1);\r
+\r
+ CopyGuid(&SmbiosRecord->Uuid, &InputData->Uuid);\r
+\r
+ OptionalStrStart = (CHAR8 *)(SmbiosRecord + 1);\r
+ UnicodeStrToAsciiStrS (Manufacturer, OptionalStrStart, ManuStrLen + 1);\r
+ StrStart = OptionalStrStart + ManuStrLen + 1;\r
+ UnicodeStrToAsciiStrS (ProductName, StrStart, PdNameStrLen + 1);\r
+ StrStart += PdNameStrLen + 1;\r
+ UnicodeStrToAsciiStrS (Version, StrStart, VerStrLen + 1);\r
+ StrStart += VerStrLen + 1;\r
+ UnicodeStrToAsciiStrS (SerialNumber, StrStart, SerialNumStrLen + 1);\r
+ StrStart += SerialNumStrLen + 1;\r
+ UnicodeStrToAsciiStrS (SKUNumber, StrStart, SKUNumStrLen + 1);\r
+ StrStart += SKUNumStrLen + 1;\r
+ UnicodeStrToAsciiStrS (Family, StrStart, FamilyStrLen + 1);\r
+\r
+ //\r
+ // Now we have got the full smbios record, call smbios protocol to add this record.\r
+ //\r
+ Status = SmbiosMiscAddRecord ((UINT8*)SmbiosRecord, NULL);\r
+ if (EFI_ERROR (Status)) {\r
+ DEBUG ((DEBUG_ERROR, "[%a]:[%dL] Smbios Type01 Table Log Failed! %r \n",\r
+ __FUNCTION__, __LINE__, Status));\r
+ }\r
+\r
+ FreePool (SmbiosRecord);\r
+\r
+Exit:\r
+ if (Manufacturer != NULL) {\r
+ FreePool (Manufacturer);\r
+ }\r
+\r
+ if (ProductName != NULL) {\r
+ FreePool (ProductName);\r
+ }\r
+\r
+ if (Version != NULL) {\r
+ FreePool (Version);\r
+ }\r
+\r
+ if (SerialNumber != NULL) {\r
+ FreePool (SerialNumber);\r
+ }\r
+\r
+ if (SKUNumber != NULL) {\r
+ FreePool (SKUNumber);\r
+ }\r
+\r
+ if (Family != NULL) {\r
+ FreePool (Family);\r
+ }\r
+\r
+ return Status;\r
+}\r