2 This driver parses the mSmbiosMiscDataTable structure and reports
3 any generated data using SMBIOS protocol.
5 Based on files under Nt32Pkg/MiscSubClassPlatformDxe/
7 Copyright (c) 2022, Ampere Computing LLC. All rights reserved.<BR>
8 Copyright (c) 2021, NUVIA Inc. All rights reserved.<BR>
9 Copyright (c) 2009 - 2011, Intel Corporation. All rights reserved.<BR>
10 Copyright (c) 2015, Hisilicon Limited. All rights reserved.<BR>
11 Copyright (c) 2015, Linaro Limited. All rights reserved.<BR>
12 SPDX-License-Identifier: BSD-2-Clause-Patent
16 #include <Library/BaseLib.h>
17 #include <Library/BaseMemoryLib.h>
18 #include <Library/DebugLib.h>
19 #include <Library/HiiLib.h>
20 #include <Library/MemoryAllocationLib.h>
21 #include <Library/OemMiscLib.h>
22 #include <Library/PrintLib.h>
23 #include <Library/UefiBootServicesTableLib.h>
25 #include "SmbiosMisc.h"
28 This function makes boot time changes to the contents of the
29 MiscBaseBoardManufacturer (Type 2) record.
31 @param RecordData Pointer to SMBIOS table with default values.
32 @param Smbios SMBIOS protocol.
34 @retval EFI_SUCCESS The SMBIOS table was successfully added.
35 @retval EFI_INVALID_PARAMETER Invalid parameter was found.
36 @retval EFI_OUT_OF_RESOURCES Failed to allocate required memory.
39 SMBIOS_MISC_TABLE_FUNCTION (MiscBaseBoardManufacturer
) {
40 CHAR8
*OptionalStrStart
;
44 UINTN ProductNameStrLen
;
46 UINTN SerialNumStrLen
;
48 UINTN ChassisLocaStrLen
;
51 CHAR16
*BaseBoardManufacturer
;
52 CHAR16
*BaseBoardProductName
;
54 EFI_STRING SerialNumber
;
56 EFI_STRING ChassisLocation
;
57 EFI_STRING_ID TokenToGet
;
58 SMBIOS_TABLE_TYPE2
*SmbiosRecord
;
59 SMBIOS_TABLE_TYPE2
*InputData
;
62 EFI_STRING_ID TokenToUpdate
;
69 // First check for invalid parameters.
71 if (RecordData
== NULL
) {
72 return EFI_INVALID_PARAMETER
;
75 InputData
= (SMBIOS_TABLE_TYPE2
*)RecordData
;
77 BaseBoardManufacturer
= (CHAR16
*)PcdGetPtr (PcdBaseBoardManufacturer
);
78 if (StrLen (BaseBoardManufacturer
) > 0) {
79 TokenToUpdate
= STRING_TOKEN (STR_MISC_BASE_BOARD_MANUFACTURER
);
80 HiiSetString (mSmbiosMiscHiiHandle
, TokenToUpdate
, BaseBoardManufacturer
, NULL
);
84 STRING_TOKEN (STR_MISC_BASE_BOARD_MANUFACTURER
),
85 BoardManufacturerType02
89 BaseBoardProductName
= (CHAR16
*)PcdGetPtr (PcdBaseBoardProductName
);
90 if (StrLen (BaseBoardProductName
) > 0) {
91 TokenToUpdate
= STRING_TOKEN (STR_MISC_BASE_BOARD_PRODUCT_NAME
);
92 HiiSetString (mSmbiosMiscHiiHandle
, TokenToUpdate
, BaseBoardProductName
, NULL
);
96 STRING_TOKEN (STR_MISC_BASE_BOARD_PRODUCT_NAME
),
101 Version
= (CHAR16
*)PcdGetPtr (PcdBaseBoardVersion
);
102 if (StrLen (Version
) > 0) {
103 TokenToUpdate
= STRING_TOKEN (STR_MISC_BASE_BOARD_VERSION
);
104 HiiSetString (mSmbiosMiscHiiHandle
, TokenToUpdate
, Version
, NULL
);
106 OemUpdateSmbiosInfo (
107 mSmbiosMiscHiiHandle
,
108 STRING_TOKEN (STR_MISC_BASE_BOARD_VERSION
),
113 OemUpdateSmbiosInfo (
114 mSmbiosMiscHiiHandle
,
115 STRING_TOKEN (STR_MISC_BASE_BOARD_ASSET_TAG
),
118 OemUpdateSmbiosInfo (
119 mSmbiosMiscHiiHandle
,
120 STRING_TOKEN (STR_MISC_BASE_BOARD_SERIAL_NUMBER
),
123 OemUpdateSmbiosInfo (
124 mSmbiosMiscHiiHandle
,
125 STRING_TOKEN (STR_MISC_BASE_BOARD_MANUFACTURER
),
126 BoardManufacturerType02
128 OemUpdateSmbiosInfo (
129 mSmbiosMiscHiiHandle
,
130 STRING_TOKEN (STR_MISC_BASE_BOARD_SERIAL_NUMBER
),
133 OemUpdateSmbiosInfo (
134 mSmbiosMiscHiiHandle
,
135 STRING_TOKEN (STR_MISC_BASE_BOARD_SKU_NUMBER
),
138 OemUpdateSmbiosInfo (
139 mSmbiosMiscHiiHandle
,
140 STRING_TOKEN (STR_MISC_BASE_BOARD_CHASSIS_LOCATION
),
141 ChassisLocationType02
144 TokenToGet
= STRING_TOKEN (STR_MISC_BASE_BOARD_MANUFACTURER
);
145 BaseBoardManufacturer
= HiiGetPackageString (&gEfiCallerIdGuid
, TokenToGet
, NULL
);
146 ManuStrLen
= StrLen (BaseBoardManufacturer
);
148 TokenToGet
= STRING_TOKEN (STR_MISC_BASE_BOARD_PRODUCT_NAME
);
149 BaseBoardProductName
= HiiGetPackageString (&gEfiCallerIdGuid
, TokenToGet
, NULL
);
150 ProductNameStrLen
= StrLen (BaseBoardProductName
);
152 TokenToGet
= STRING_TOKEN (STR_MISC_BASE_BOARD_VERSION
);
153 Version
= HiiGetPackageString (&gEfiCallerIdGuid
, TokenToGet
, NULL
);
154 VerStrLen
= StrLen (Version
);
156 TokenToGet
= STRING_TOKEN (STR_MISC_BASE_BOARD_SERIAL_NUMBER
);
157 SerialNumber
= HiiGetPackageString (&gEfiCallerIdGuid
, TokenToGet
, NULL
);
158 SerialNumStrLen
= StrLen (SerialNumber
);
160 TokenToGet
= STRING_TOKEN (STR_MISC_BASE_BOARD_ASSET_TAG
);
161 AssetTag
= HiiGetPackageString (&gEfiCallerIdGuid
, TokenToGet
, NULL
);
162 AssetTagStrLen
= StrLen (AssetTag
);
164 TokenToGet
= STRING_TOKEN (STR_MISC_BASE_BOARD_CHASSIS_LOCATION
);
165 ChassisLocation
= HiiGetPackageString (&gEfiCallerIdGuid
, TokenToGet
, NULL
);
166 ChassisLocaStrLen
= StrLen (ChassisLocation
);
169 // Two zeros following the last string.
171 RecordLength
= sizeof (SMBIOS_TABLE_TYPE2
) +
173 ProductNameStrLen
+ 1 +
175 SerialNumStrLen
+ 1 +
177 ChassisLocaStrLen
+ 1 + 1;
178 SmbiosRecord
= AllocateZeroPool (RecordLength
);
179 if (SmbiosRecord
== NULL
) {
180 Status
= EFI_OUT_OF_RESOURCES
;
184 (VOID
)CopyMem (SmbiosRecord
, InputData
, sizeof (SMBIOS_TABLE_TYPE2
));
185 SmbiosRecord
->Hdr
.Length
= sizeof (SMBIOS_TABLE_TYPE2
);
188 // Update Contained objects Handle
190 SmbiosRecord
->NumberOfContainedObjectHandles
= 0;
191 SmbiosMiscGetLinkTypeHandle (
192 EFI_SMBIOS_TYPE_SYSTEM_ENCLOSURE
,
196 // It's assumed there's at most a single chassis
197 ASSERT (HandleCount
< 2);
198 if (HandleCount
> 0) {
199 SmbiosRecord
->ChassisHandle
= HandleArray
[0];
202 FreePool (HandleArray
);
204 OptionalStrStart
= (CHAR8
*)(SmbiosRecord
+ 1);
205 UnicodeStrToAsciiStrS (BaseBoardManufacturer
, OptionalStrStart
, ManuStrLen
+ 1);
207 StrStart
= OptionalStrStart
+ ManuStrLen
+ 1;
208 UnicodeStrToAsciiStrS (BaseBoardProductName
, StrStart
, ProductNameStrLen
+ 1);
210 StrStart
+= ProductNameStrLen
+ 1;
211 UnicodeStrToAsciiStrS (Version
, StrStart
, VerStrLen
+ 1);
213 StrStart
+= VerStrLen
+ 1;
214 UnicodeStrToAsciiStrS (SerialNumber
, StrStart
, SerialNumStrLen
+ 1);
216 StrStart
+= SerialNumStrLen
+ 1;
217 UnicodeStrToAsciiStrS (AssetTag
, StrStart
, AssetTagStrLen
+ 1);
219 StrStart
+= AssetTagStrLen
+ 1;
220 UnicodeStrToAsciiStrS (ChassisLocation
, StrStart
, ChassisLocaStrLen
+ 1);
222 Status
= SmbiosMiscAddRecord ((UINT8
*)SmbiosRecord
, NULL
);
223 if (EFI_ERROR (Status
)) {
226 "[%a]:[%dL] Smbios Type02 Table Log Failed! %r \n",
233 FreePool (SmbiosRecord
);
236 if (BaseBoardManufacturer
!= NULL
) {
237 FreePool (BaseBoardManufacturer
);
240 if (BaseBoardProductName
!= NULL
) {
241 FreePool (BaseBoardProductName
);
244 if (Version
!= NULL
) {
248 if (SerialNumber
!= NULL
) {
249 FreePool (SerialNumber
);
252 if (AssetTag
!= NULL
) {
256 if (ChassisLocation
!= NULL
) {
257 FreePool (ChassisLocation
);