]> git.proxmox.com Git - mirror_edk2.git/blob - ArmPkg/Universal/Smbios/SmbiosMiscDxe/Type02/MiscBaseBoardManufacturerFunction.c
f61546955f121f21f22ee0be7ce2eb2e4a930efa
[mirror_edk2.git] / ArmPkg / Universal / Smbios / SmbiosMiscDxe / Type02 / MiscBaseBoardManufacturerFunction.c
1 /** @file
2 This driver parses the mSmbiosMiscDataTable structure and reports
3 any generated data using SMBIOS protocol.
4
5 Based on files under Nt32Pkg/MiscSubClassPlatformDxe/
6
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
13
14 **/
15
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>
24
25 #include "SmbiosMisc.h"
26
27 /**
28 This function makes boot time changes to the contents of the
29 MiscBaseBoardManufacturer (Type 2) record.
30
31 @param RecordData Pointer to SMBIOS table with default values.
32 @param Smbios SMBIOS protocol.
33
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.
37
38 **/
39 SMBIOS_MISC_TABLE_FUNCTION (MiscBaseBoardManufacturer) {
40 CHAR8 *OptionalStrStart;
41 CHAR8 *StrStart;
42 UINTN RecordLength;
43 UINTN ManuStrLen;
44 UINTN ProductNameStrLen;
45 UINTN VerStrLen;
46 UINTN SerialNumStrLen;
47 UINTN AssetTagStrLen;
48 UINTN ChassisLocaStrLen;
49 UINTN HandleCount;
50 UINT16 *HandleArray;
51 CHAR16 *BaseBoardManufacturer;
52 CHAR16 *BaseBoardProductName;
53 CHAR16 *Version;
54 EFI_STRING SerialNumber;
55 EFI_STRING AssetTag;
56 EFI_STRING ChassisLocation;
57 EFI_STRING_ID TokenToGet;
58 SMBIOS_TABLE_TYPE2 *SmbiosRecord;
59 SMBIOS_TABLE_TYPE2 *InputData;
60 EFI_STATUS Status;
61
62 EFI_STRING_ID TokenToUpdate;
63
64 HandleCount = 0;
65 HandleArray = NULL;
66 InputData = NULL;
67
68 //
69 // First check for invalid parameters.
70 //
71 if (RecordData == NULL) {
72 return EFI_INVALID_PARAMETER;
73 }
74
75 InputData = (SMBIOS_TABLE_TYPE2 *)RecordData;
76
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);
81 } else {
82 OemUpdateSmbiosInfo (
83 mSmbiosMiscHiiHandle,
84 STRING_TOKEN (STR_MISC_BASE_BOARD_MANUFACTURER),
85 BoardManufacturerType02
86 );
87 }
88
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);
93 } else {
94 OemUpdateSmbiosInfo (
95 mSmbiosMiscHiiHandle,
96 STRING_TOKEN (STR_MISC_BASE_BOARD_PRODUCT_NAME),
97 ProductNameType02
98 );
99 }
100
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);
105 } else {
106 OemUpdateSmbiosInfo (
107 mSmbiosMiscHiiHandle,
108 STRING_TOKEN (STR_MISC_BASE_BOARD_VERSION),
109 VersionType02
110 );
111 }
112
113 OemUpdateSmbiosInfo (
114 mSmbiosMiscHiiHandle,
115 STRING_TOKEN (STR_MISC_BASE_BOARD_ASSET_TAG),
116 AssetTagType02
117 );
118 OemUpdateSmbiosInfo (
119 mSmbiosMiscHiiHandle,
120 STRING_TOKEN (STR_MISC_BASE_BOARD_SERIAL_NUMBER),
121 SerialNumberType02
122 );
123 OemUpdateSmbiosInfo (
124 mSmbiosMiscHiiHandle,
125 STRING_TOKEN (STR_MISC_BASE_BOARD_MANUFACTURER),
126 BoardManufacturerType02
127 );
128 OemUpdateSmbiosInfo (
129 mSmbiosMiscHiiHandle,
130 STRING_TOKEN (STR_MISC_BASE_BOARD_SERIAL_NUMBER),
131 SerialNumberType02
132 );
133 OemUpdateSmbiosInfo (
134 mSmbiosMiscHiiHandle,
135 STRING_TOKEN (STR_MISC_BASE_BOARD_SKU_NUMBER),
136 SerialNumberType02
137 );
138 OemUpdateSmbiosInfo (
139 mSmbiosMiscHiiHandle,
140 STRING_TOKEN (STR_MISC_BASE_BOARD_CHASSIS_LOCATION),
141 ChassisLocationType02
142 );
143
144 TokenToGet = STRING_TOKEN (STR_MISC_BASE_BOARD_MANUFACTURER);
145 BaseBoardManufacturer = HiiGetPackageString (&gEfiCallerIdGuid, TokenToGet, NULL);
146 ManuStrLen = StrLen (BaseBoardManufacturer);
147
148 TokenToGet = STRING_TOKEN (STR_MISC_BASE_BOARD_PRODUCT_NAME);
149 BaseBoardProductName = HiiGetPackageString (&gEfiCallerIdGuid, TokenToGet, NULL);
150 ProductNameStrLen = StrLen (BaseBoardProductName);
151
152 TokenToGet = STRING_TOKEN (STR_MISC_BASE_BOARD_VERSION);
153 Version = HiiGetPackageString (&gEfiCallerIdGuid, TokenToGet, NULL);
154 VerStrLen = StrLen (Version);
155
156 TokenToGet = STRING_TOKEN (STR_MISC_BASE_BOARD_SERIAL_NUMBER);
157 SerialNumber = HiiGetPackageString (&gEfiCallerIdGuid, TokenToGet, NULL);
158 SerialNumStrLen = StrLen (SerialNumber);
159
160 TokenToGet = STRING_TOKEN (STR_MISC_BASE_BOARD_ASSET_TAG);
161 AssetTag = HiiGetPackageString (&gEfiCallerIdGuid, TokenToGet, NULL);
162 AssetTagStrLen = StrLen (AssetTag);
163
164 TokenToGet = STRING_TOKEN (STR_MISC_BASE_BOARD_CHASSIS_LOCATION);
165 ChassisLocation = HiiGetPackageString (&gEfiCallerIdGuid, TokenToGet, NULL);
166 ChassisLocaStrLen = StrLen (ChassisLocation);
167
168 //
169 // Two zeros following the last string.
170 //
171 RecordLength = sizeof (SMBIOS_TABLE_TYPE2) +
172 ManuStrLen + 1 +
173 ProductNameStrLen + 1 +
174 VerStrLen + 1 +
175 SerialNumStrLen + 1 +
176 AssetTagStrLen + 1 +
177 ChassisLocaStrLen + 1 + 1;
178 SmbiosRecord = AllocateZeroPool (RecordLength);
179 if (SmbiosRecord == NULL) {
180 Status = EFI_OUT_OF_RESOURCES;
181 goto Exit;
182 }
183
184 (VOID)CopyMem (SmbiosRecord, InputData, sizeof (SMBIOS_TABLE_TYPE2));
185 SmbiosRecord->Hdr.Length = sizeof (SMBIOS_TABLE_TYPE2);
186
187 //
188 // Update Contained objects Handle
189 //
190 SmbiosRecord->NumberOfContainedObjectHandles = 0;
191 SmbiosMiscGetLinkTypeHandle (
192 EFI_SMBIOS_TYPE_SYSTEM_ENCLOSURE,
193 &HandleArray,
194 &HandleCount
195 );
196 // It's assumed there's at most a single chassis
197 ASSERT (HandleCount < 2);
198 if (HandleCount > 0) {
199 SmbiosRecord->ChassisHandle = HandleArray[0];
200 }
201
202 FreePool (HandleArray);
203
204 OptionalStrStart = (CHAR8 *)(SmbiosRecord + 1);
205 UnicodeStrToAsciiStrS (BaseBoardManufacturer, OptionalStrStart, ManuStrLen + 1);
206
207 StrStart = OptionalStrStart + ManuStrLen + 1;
208 UnicodeStrToAsciiStrS (BaseBoardProductName, StrStart, ProductNameStrLen + 1);
209
210 StrStart += ProductNameStrLen + 1;
211 UnicodeStrToAsciiStrS (Version, StrStart, VerStrLen + 1);
212
213 StrStart += VerStrLen + 1;
214 UnicodeStrToAsciiStrS (SerialNumber, StrStart, SerialNumStrLen + 1);
215
216 StrStart += SerialNumStrLen + 1;
217 UnicodeStrToAsciiStrS (AssetTag, StrStart, AssetTagStrLen + 1);
218
219 StrStart += AssetTagStrLen + 1;
220 UnicodeStrToAsciiStrS (ChassisLocation, StrStart, ChassisLocaStrLen + 1);
221
222 Status = SmbiosMiscAddRecord ((UINT8 *)SmbiosRecord, NULL);
223 if (EFI_ERROR (Status)) {
224 DEBUG ((
225 DEBUG_ERROR,
226 "[%a]:[%dL] Smbios Type02 Table Log Failed! %r \n",
227 __FUNCTION__,
228 DEBUG_LINE_NUMBER,
229 Status
230 ));
231 }
232
233 FreePool (SmbiosRecord);
234
235 Exit:
236 if (BaseBoardManufacturer != NULL) {
237 FreePool (BaseBoardManufacturer);
238 }
239
240 if (BaseBoardProductName != NULL) {
241 FreePool (BaseBoardProductName);
242 }
243
244 if (Version != NULL) {
245 FreePool (Version);
246 }
247
248 if (SerialNumber != NULL) {
249 FreePool (SerialNumber);
250 }
251
252 if (AssetTag != NULL) {
253 FreePool (AssetTag);
254 }
255
256 if (ChassisLocation != NULL) {
257 FreePool (ChassisLocation);
258 }
259
260 return 0;
261 }