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) 2021, NUVIA Inc. All rights reserved.<BR>
8 Copyright (c) 2009 - 2011, Intel Corporation. All rights reserved.<BR>
9 Copyright (c) 2015, Hisilicon Limited. All rights reserved.<BR>
10 Copyright (c) 2015, Linaro Limited. All rights reserved.<BR>
11 SPDX-License-Identifier: BSD-2-Clause-Patent
15 #include <Library/BaseLib.h>
16 #include <Library/BaseMemoryLib.h>
17 #include <Library/DebugLib.h>
18 #include <Library/HiiLib.h>
19 #include <Library/MemoryAllocationLib.h>
20 #include <Library/OemMiscLib.h>
21 #include <Library/PrintLib.h>
22 #include <Library/UefiBootServicesTableLib.h>
24 #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
)
41 CHAR8
*OptionalStrStart
;
45 UINTN ProductNameStrLen
;
47 UINTN SerialNumStrLen
;
49 UINTN ChassisLocaStrLen
;
52 CHAR16
*BaseBoardManufacturer
;
53 CHAR16
*BaseBoardProductName
;
55 EFI_STRING SerialNumber
;
57 EFI_STRING ChassisLocation
;
58 EFI_STRING_ID TokenToGet
;
59 SMBIOS_TABLE_TYPE2
*SmbiosRecord
;
60 SMBIOS_TABLE_TYPE2
*InputData
;
63 EFI_STRING_ID TokenToUpdate
;
70 // First check for invalid parameters.
72 if (RecordData
== NULL
) {
73 return EFI_INVALID_PARAMETER
;
76 InputData
= (SMBIOS_TABLE_TYPE2
*)RecordData
;
78 BaseBoardManufacturer
= (CHAR16
*) PcdGetPtr (PcdBaseBoardManufacturer
);
79 if (StrLen (BaseBoardManufacturer
) > 0) {
80 TokenToUpdate
= STRING_TOKEN (STR_MISC_BASE_BOARD_MANUFACTURER
);
81 HiiSetString (mSmbiosMiscHiiHandle
, TokenToUpdate
, BaseBoardManufacturer
, NULL
);
84 BaseBoardProductName
= (CHAR16
*) PcdGetPtr (PcdBaseBoardProductName
);
85 if (StrLen (BaseBoardProductName
) > 0) {
86 TokenToUpdate
= STRING_TOKEN (STR_MISC_BASE_BOARD_PRODUCT_NAME
);
87 HiiSetString (mSmbiosMiscHiiHandle
, TokenToUpdate
, BaseBoardProductName
, NULL
);
90 Version
= (CHAR16
*) PcdGetPtr (PcdBaseBoardVersion
);
91 if (StrLen (Version
) > 0) {
92 TokenToUpdate
= STRING_TOKEN (STR_MISC_BASE_BOARD_VERSION
);
93 HiiSetString (mSmbiosMiscHiiHandle
, TokenToUpdate
, Version
, NULL
);
96 OemUpdateSmbiosInfo (mSmbiosMiscHiiHandle
,
97 STRING_TOKEN (STR_MISC_BASE_BOARD_ASSET_TAG
),
100 OemUpdateSmbiosInfo (mSmbiosMiscHiiHandle
,
101 STRING_TOKEN (STR_MISC_BASE_BOARD_SERIAL_NUMBER
),
104 OemUpdateSmbiosInfo (mSmbiosMiscHiiHandle
,
105 STRING_TOKEN (STR_MISC_BASE_BOARD_MANUFACTURER
),
106 BoardManufacturerType02
108 OemUpdateSmbiosInfo (mSmbiosMiscHiiHandle
,
109 STRING_TOKEN (STR_MISC_BASE_BOARD_SERIAL_NUMBER
),
112 OemUpdateSmbiosInfo (mSmbiosMiscHiiHandle
,
113 STRING_TOKEN (STR_MISC_BASE_BOARD_SKU_NUMBER
),
116 OemUpdateSmbiosInfo (mSmbiosMiscHiiHandle
,
117 STRING_TOKEN (STR_MISC_BASE_BOARD_CHASSIS_LOCATION
),
118 ChassisLocationType02
121 TokenToGet
= STRING_TOKEN (STR_MISC_BASE_BOARD_MANUFACTURER
);
122 BaseBoardManufacturer
= HiiGetPackageString (&gEfiCallerIdGuid
, TokenToGet
, NULL
);
123 ManuStrLen
= StrLen (BaseBoardManufacturer
);
125 TokenToGet
= STRING_TOKEN (STR_MISC_BASE_BOARD_PRODUCT_NAME
);
126 BaseBoardProductName
= HiiGetPackageString (&gEfiCallerIdGuid
, TokenToGet
, NULL
);
127 ProductNameStrLen
= StrLen (BaseBoardProductName
);
129 TokenToGet
= STRING_TOKEN (STR_MISC_BASE_BOARD_VERSION
);
130 Version
= HiiGetPackageString (&gEfiCallerIdGuid
, TokenToGet
, NULL
);
131 VerStrLen
= StrLen (Version
);
133 TokenToGet
= STRING_TOKEN (STR_MISC_BASE_BOARD_SERIAL_NUMBER
);
134 SerialNumber
= HiiGetPackageString (&gEfiCallerIdGuid
, TokenToGet
, NULL
);
135 SerialNumStrLen
= StrLen (SerialNumber
);
137 TokenToGet
= STRING_TOKEN (STR_MISC_BASE_BOARD_ASSET_TAG
);
138 AssetTag
= HiiGetPackageString (&gEfiCallerIdGuid
, TokenToGet
, NULL
);
139 AssetTagStrLen
= StrLen (AssetTag
);
141 TokenToGet
= STRING_TOKEN (STR_MISC_BASE_BOARD_CHASSIS_LOCATION
);
142 ChassisLocation
= HiiGetPackageString (&gEfiCallerIdGuid
, TokenToGet
, NULL
);
143 ChassisLocaStrLen
= StrLen (ChassisLocation
);
146 // Two zeros following the last string.
148 RecordLength
= sizeof (SMBIOS_TABLE_TYPE2
) +
150 ProductNameStrLen
+ 1 +
152 SerialNumStrLen
+ 1 +
154 ChassisLocaStrLen
+ 1 + 1;
155 SmbiosRecord
= AllocateZeroPool (RecordLength
);
156 if (SmbiosRecord
== NULL
) {
157 Status
= EFI_OUT_OF_RESOURCES
;
161 (VOID
)CopyMem (SmbiosRecord
, InputData
, sizeof (SMBIOS_TABLE_TYPE2
));
162 SmbiosRecord
->Hdr
.Length
= sizeof (SMBIOS_TABLE_TYPE2
);
165 // Update Contained objects Handle
167 SmbiosRecord
->NumberOfContainedObjectHandles
= 0;
168 SmbiosMiscGetLinkTypeHandle (EFI_SMBIOS_TYPE_SYSTEM_ENCLOSURE
, &HandleArray
,
170 // It's assumed there's at most a single chassis
171 ASSERT (HandleCount
< 2);
172 if (HandleCount
> 0) {
173 SmbiosRecord
->ChassisHandle
= HandleArray
[0];
176 FreePool (HandleArray
);
178 OptionalStrStart
= (CHAR8
*)(SmbiosRecord
+ 1);
179 UnicodeStrToAsciiStrS (BaseBoardManufacturer
, OptionalStrStart
, ManuStrLen
+ 1);
181 StrStart
= OptionalStrStart
+ ManuStrLen
+ 1;
182 UnicodeStrToAsciiStrS (BaseBoardProductName
, StrStart
, ProductNameStrLen
+ 1);
184 StrStart
+= ProductNameStrLen
+ 1;
185 UnicodeStrToAsciiStrS (Version
, StrStart
, VerStrLen
+ 1);
187 StrStart
+= VerStrLen
+ 1;
188 UnicodeStrToAsciiStrS (SerialNumber
, StrStart
, SerialNumStrLen
+ 1);
190 StrStart
+= SerialNumStrLen
+ 1;
191 UnicodeStrToAsciiStrS (AssetTag
, StrStart
, AssetTagStrLen
+ 1);
193 StrStart
+= AssetTagStrLen
+ 1;
194 UnicodeStrToAsciiStrS (ChassisLocation
, StrStart
, ChassisLocaStrLen
+ 1);
196 Status
= SmbiosMiscAddRecord ((UINT8
*)SmbiosRecord
, NULL
);
197 if (EFI_ERROR (Status
)) {
198 DEBUG ((DEBUG_ERROR
, "[%a]:[%dL] Smbios Type02 Table Log Failed! %r \n",
199 __FUNCTION__
, __LINE__
, Status
));
202 FreePool (SmbiosRecord
);
205 if (BaseBoardManufacturer
!= NULL
) {
206 FreePool (BaseBoardManufacturer
);
209 if (BaseBoardProductName
!= NULL
) {
210 FreePool (BaseBoardProductName
);
213 if (Version
!= NULL
) {
217 if (SerialNumber
!= NULL
) {
218 FreePool (SerialNumber
);
221 if (AssetTag
!= NULL
) {
225 if (ChassisLocation
!= NULL
) {
226 FreePool (ChassisLocation
);