]> git.proxmox.com Git - mirror_edk2.git/blob - ArmPkg/Universal/Smbios/SmbiosMiscDxe/Type02/MiscBaseBoardManufacturerFunction.c
ArmPkg: Add Universal/Smbios/SmbiosMiscDxe/Type02
[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) 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
12
13 **/
14
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>
23
24 #include "SmbiosMisc.h"
25
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 {
41 CHAR8 *OptionalStrStart;
42 CHAR8 *StrStart;
43 UINTN RecordLength;
44 UINTN ManuStrLen;
45 UINTN ProductNameStrLen;
46 UINTN VerStrLen;
47 UINTN SerialNumStrLen;
48 UINTN AssetTagStrLen;
49 UINTN ChassisLocaStrLen;
50 UINTN HandleCount;
51 UINT16 *HandleArray;
52 CHAR16 *BaseBoardManufacturer;
53 CHAR16 *BaseBoardProductName;
54 CHAR16 *Version;
55 EFI_STRING SerialNumber;
56 EFI_STRING AssetTag;
57 EFI_STRING ChassisLocation;
58 EFI_STRING_ID TokenToGet;
59 SMBIOS_TABLE_TYPE2 *SmbiosRecord;
60 SMBIOS_TABLE_TYPE2 *InputData;
61 EFI_STATUS Status;
62
63 EFI_STRING_ID TokenToUpdate;
64
65 HandleCount = 0;
66 HandleArray = NULL;
67 InputData = NULL;
68
69 //
70 // First check for invalid parameters.
71 //
72 if (RecordData == NULL) {
73 return EFI_INVALID_PARAMETER;
74 }
75
76 InputData = (SMBIOS_TABLE_TYPE2*)RecordData;
77
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);
82 }
83
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);
88 }
89
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);
94 }
95
96 OemUpdateSmbiosInfo (mSmbiosMiscHiiHandle,
97 STRING_TOKEN (STR_MISC_BASE_BOARD_ASSET_TAG),
98 AssertTagType02
99 );
100 OemUpdateSmbiosInfo (mSmbiosMiscHiiHandle,
101 STRING_TOKEN (STR_MISC_BASE_BOARD_SERIAL_NUMBER),
102 SerialNumberType02
103 );
104 OemUpdateSmbiosInfo (mSmbiosMiscHiiHandle,
105 STRING_TOKEN (STR_MISC_BASE_BOARD_MANUFACTURER),
106 BoardManufacturerType02
107 );
108 OemUpdateSmbiosInfo (mSmbiosMiscHiiHandle,
109 STRING_TOKEN (STR_MISC_BASE_BOARD_SERIAL_NUMBER),
110 SerialNumberType02
111 );
112 OemUpdateSmbiosInfo (mSmbiosMiscHiiHandle,
113 STRING_TOKEN (STR_MISC_BASE_BOARD_SKU_NUMBER),
114 SerialNumberType02
115 );
116 OemUpdateSmbiosInfo (mSmbiosMiscHiiHandle,
117 STRING_TOKEN (STR_MISC_BASE_BOARD_CHASSIS_LOCATION),
118 ChassisLocationType02
119 );
120
121 TokenToGet = STRING_TOKEN (STR_MISC_BASE_BOARD_MANUFACTURER);
122 BaseBoardManufacturer = HiiGetPackageString (&gEfiCallerIdGuid, TokenToGet, NULL);
123 ManuStrLen = StrLen (BaseBoardManufacturer);
124
125 TokenToGet = STRING_TOKEN (STR_MISC_BASE_BOARD_PRODUCT_NAME);
126 BaseBoardProductName = HiiGetPackageString (&gEfiCallerIdGuid, TokenToGet, NULL);
127 ProductNameStrLen = StrLen (BaseBoardProductName);
128
129 TokenToGet = STRING_TOKEN (STR_MISC_BASE_BOARD_VERSION);
130 Version = HiiGetPackageString (&gEfiCallerIdGuid, TokenToGet, NULL);
131 VerStrLen = StrLen (Version);
132
133 TokenToGet = STRING_TOKEN (STR_MISC_BASE_BOARD_SERIAL_NUMBER);
134 SerialNumber = HiiGetPackageString (&gEfiCallerIdGuid, TokenToGet, NULL);
135 SerialNumStrLen = StrLen (SerialNumber);
136
137 TokenToGet = STRING_TOKEN (STR_MISC_BASE_BOARD_ASSET_TAG);
138 AssetTag = HiiGetPackageString (&gEfiCallerIdGuid, TokenToGet, NULL);
139 AssetTagStrLen = StrLen (AssetTag);
140
141 TokenToGet = STRING_TOKEN (STR_MISC_BASE_BOARD_CHASSIS_LOCATION);
142 ChassisLocation = HiiGetPackageString (&gEfiCallerIdGuid, TokenToGet, NULL);
143 ChassisLocaStrLen = StrLen (ChassisLocation);
144
145 //
146 // Two zeros following the last string.
147 //
148 RecordLength = sizeof (SMBIOS_TABLE_TYPE2) +
149 ManuStrLen + 1 +
150 ProductNameStrLen + 1 +
151 VerStrLen + 1 +
152 SerialNumStrLen + 1 +
153 AssetTagStrLen + 1 +
154 ChassisLocaStrLen + 1 + 1;
155 SmbiosRecord = AllocateZeroPool (RecordLength);
156 if (SmbiosRecord == NULL) {
157 Status = EFI_OUT_OF_RESOURCES;
158 goto Exit;
159 }
160
161 (VOID)CopyMem (SmbiosRecord, InputData, sizeof (SMBIOS_TABLE_TYPE2));
162 SmbiosRecord->Hdr.Length = sizeof (SMBIOS_TABLE_TYPE2);
163
164 //
165 // Update Contained objects Handle
166 //
167 SmbiosRecord->NumberOfContainedObjectHandles = 0;
168 SmbiosMiscGetLinkTypeHandle (EFI_SMBIOS_TYPE_SYSTEM_ENCLOSURE, &HandleArray,
169 &HandleCount);
170 // It's assumed there's at most a single chassis
171 ASSERT (HandleCount < 2);
172 if (HandleCount > 0) {
173 SmbiosRecord->ChassisHandle = HandleArray[0];
174 }
175
176 FreePool (HandleArray);
177
178 OptionalStrStart = (CHAR8 *)(SmbiosRecord + 1);
179 UnicodeStrToAsciiStrS (BaseBoardManufacturer, OptionalStrStart, ManuStrLen + 1);
180
181 StrStart = OptionalStrStart + ManuStrLen + 1;
182 UnicodeStrToAsciiStrS (BaseBoardProductName, StrStart, ProductNameStrLen + 1);
183
184 StrStart += ProductNameStrLen + 1;
185 UnicodeStrToAsciiStrS (Version, StrStart, VerStrLen + 1);
186
187 StrStart += VerStrLen + 1;
188 UnicodeStrToAsciiStrS (SerialNumber, StrStart, SerialNumStrLen + 1);
189
190 StrStart += SerialNumStrLen + 1;
191 UnicodeStrToAsciiStrS (AssetTag, StrStart, AssetTagStrLen + 1);
192
193 StrStart += AssetTagStrLen + 1;
194 UnicodeStrToAsciiStrS (ChassisLocation, StrStart, ChassisLocaStrLen + 1);
195
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));
200 }
201
202 FreePool (SmbiosRecord);
203
204 Exit:
205 if (BaseBoardManufacturer != NULL) {
206 FreePool (BaseBoardManufacturer);
207 }
208
209 if (BaseBoardProductName != NULL) {
210 FreePool (BaseBoardProductName);
211 }
212
213 if (Version != NULL) {
214 FreePool (Version);
215 }
216
217 if (SerialNumber != NULL) {
218 FreePool (SerialNumber);
219 }
220
221 if (AssetTag != NULL) {
222 FreePool (AssetTag);
223 }
224
225 if (ChassisLocation != NULL) {
226 FreePool (ChassisLocation);
227 }
228
229 return 0;
230 }