]> git.proxmox.com Git - mirror_edk2.git/blame - ArmPkg/Universal/Smbios/SmbiosMiscDxe/Type00/MiscBiosVendorFunction.c
ArmPkg: Apply uncrustify changes
[mirror_edk2.git] / ArmPkg / Universal / Smbios / SmbiosMiscDxe / Type00 / MiscBiosVendorFunction.c
CommitLineData
6273e59a
RC
1/** @file\r
2\r
3 Copyright (c) 2021, NUVIA Inc. All rights reserved.<BR>\r
4 Copyright (c) 2009, Intel Corporation. All rights reserved.<BR>\r
5 Copyright (c) 2015, Hisilicon Limited. All rights reserved.<BR>\r
6 Copyright (c) 2015, Linaro Limited. All rights reserved.<BR>\r
7 SPDX-License-Identifier: BSD-2-Clause-Patent\r
8\r
9**/\r
10\r
11#include <Library/BaseLib.h>\r
12#include <Library/BaseMemoryLib.h>\r
13#include <Library/DebugLib.h>\r
14#include <Library/HiiLib.h>\r
15#include <Library/MemoryAllocationLib.h>\r
16#include <Library/PrintLib.h>\r
17#include <Library/UefiBootServicesTableLib.h>\r
18\r
19#include "SmbiosMisc.h"\r
20\r
6273e59a 21typedef struct {\r
429309e0
MK
22 CONST CHAR8 *MonthStr;\r
23 UINT32 MonthInt;\r
6273e59a
RC
24} MONTH_DESCRIPTION;\r
25\r
26STATIC CONST\r
429309e0
MK
27MONTH_DESCRIPTION mMonthDescription[] = {\r
28 { "Jan", 1 },\r
29 { "Feb", 2 },\r
30 { "Mar", 3 },\r
31 { "Apr", 4 },\r
32 { "May", 5 },\r
33 { "Jun", 6 },\r
34 { "Jul", 7 },\r
35 { "Aug", 8 },\r
36 { "Sep", 9 },\r
6273e59a
RC
37 { "Oct", 10 },\r
38 { "Nov", 11 },\r
39 { "Dec", 12 },\r
429309e0 40 { "???", 1 }, // Use 1 as default month\r
6273e59a
RC
41};\r
42\r
43/**\r
44 Field Filling Function. Transform an EFI_EXP_BASE2_DATA to a byte, with '64k'\r
45 as the unit.\r
46\r
47 @param Value Pointer to Base2_Data\r
48\r
49 @retval\r
50\r
51**/\r
52UINT8\r
53Base2ToByteWith64KUnit (\r
54 IN UINTN Value\r
55 )\r
56{\r
429309e0 57 UINT8 Size;\r
6273e59a
RC
58\r
59 Size = ((Value + (SIZE_64KB - 1)) >> 16);\r
60\r
61 return Size;\r
62}\r
63\r
64/**\r
65 Returns the date and time this file (and firmware) was built.\r
66\r
67 @param[out] *Time Pointer to the EFI_TIME structure to fill in.\r
68**/\r
69VOID\r
70GetReleaseTime (\r
429309e0 71 OUT EFI_TIME *Time\r
6273e59a
RC
72 )\r
73{\r
429309e0
MK
74 CONST CHAR8 *ReleaseDate = __DATE__;\r
75 CONST CHAR8 *ReleaseTime = __TIME__;\r
76 UINTN i;\r
6273e59a
RC
77\r
78 for (i = 0; i < 12; i++) {\r
79 if (AsciiStrnCmp (ReleaseDate, mMonthDescription[i].MonthStr, 3) == 0) {\r
80 break;\r
81 }\r
82 }\r
83\r
429309e0
MK
84 Time->Month = mMonthDescription[i].MonthInt;\r
85 Time->Day = AsciiStrDecimalToUintn (ReleaseDate + 4);\r
86 Time->Year = AsciiStrDecimalToUintn (ReleaseDate + 7);\r
87 Time->Hour = AsciiStrDecimalToUintn (ReleaseTime);\r
6273e59a
RC
88 Time->Minute = AsciiStrDecimalToUintn (ReleaseTime + 3);\r
89 Time->Second = AsciiStrDecimalToUintn (ReleaseTime + 6);\r
90}\r
91\r
92/**\r
93 Fetches the firmware ('BIOS') release date from the\r
94 FirmwareVersionInfo HOB.\r
95\r
96 @return The release date as a UTF-16 string\r
97**/\r
98CHAR16 *\r
99GetBiosReleaseDate (\r
100 VOID\r
101 )\r
102{\r
429309e0
MK
103 CHAR16 *ReleaseDate;\r
104 EFI_TIME BuildTime;\r
6273e59a
RC
105\r
106 ReleaseDate = AllocateZeroPool ((sizeof (CHAR16)) * SMBIOS_STRING_MAX_LENGTH);\r
107 if (ReleaseDate == NULL) {\r
429309e0 108 return NULL;\r
6273e59a
RC
109 }\r
110\r
111 GetReleaseTime (&BuildTime);\r
112\r
429309e0
MK
113 (VOID)UnicodeSPrintAsciiFormat (\r
114 ReleaseDate,\r
115 (sizeof (CHAR16)) * SMBIOS_STRING_MAX_LENGTH,\r
116 "%02d/%02d/%4d",\r
117 BuildTime.Month,\r
118 BuildTime.Day,\r
119 BuildTime.Year\r
120 );\r
6273e59a
RC
121\r
122 return ReleaseDate;\r
123}\r
124\r
125/**\r
126 Fetches the firmware ('BIOS') version from the\r
127 FirmwareVersionInfo HOB.\r
128\r
129 @return The version as a UTF-16 string\r
130**/\r
131CHAR16 *\r
132GetBiosVersion (\r
133 VOID\r
134 )\r
135{\r
429309e0 136 CHAR16 *ReleaseString;\r
6273e59a
RC
137\r
138 ReleaseString = (CHAR16 *)FixedPcdGetPtr (PcdFirmwareVersionString);\r
139\r
140 return ReleaseString;\r
141}\r
142\r
6273e59a
RC
143/**\r
144 This function makes boot time changes to the contents of the\r
145 MiscBiosVendor (Type 0) record.\r
146\r
147 @param RecordData Pointer to SMBIOS table with default values.\r
148 @param Smbios SMBIOS protocol.\r
149\r
150 @retval EFI_SUCCESS The SMBIOS table was successfully added.\r
151 @retval EFI_INVALID_PARAMETER Invalid parameter was found.\r
152 @retval EFI_OUT_OF_RESOURCES Failed to allocate required memory.\r
153\r
154**/\r
429309e0
MK
155SMBIOS_MISC_TABLE_FUNCTION (MiscBiosVendor) {\r
156 CHAR8 *OptionalStrStart;\r
157 CHAR8 *StrStart;\r
158 UINTN VendorStrLen;\r
159 UINTN VerStrLen;\r
160 UINTN DateStrLen;\r
161 UINTN BiosPhysicalSize;\r
162 CHAR16 *Vendor;\r
163 CHAR16 *Version;\r
164 CHAR16 *ReleaseDate;\r
165 CHAR16 *Char16String;\r
166 EFI_STATUS Status;\r
167 EFI_STRING_ID TokenToUpdate;\r
168 EFI_STRING_ID TokenToGet;\r
169 SMBIOS_TABLE_TYPE0 *SmbiosRecord;\r
170 SMBIOS_TABLE_TYPE0 *InputData;\r
6273e59a
RC
171\r
172 //\r
173 // First check for invalid parameters.\r
174 //\r
175 if (RecordData == NULL) {\r
176 return EFI_INVALID_PARAMETER;\r
177 }\r
178\r
179 InputData = (SMBIOS_TABLE_TYPE0 *)RecordData;\r
180\r
429309e0 181 Vendor = (CHAR16 *)PcdGetPtr (PcdFirmwareVendor);\r
6273e59a
RC
182\r
183 if (StrLen (Vendor) > 0) {\r
184 TokenToUpdate = STRING_TOKEN (STR_MISC_BIOS_VENDOR);\r
185 HiiSetString (mSmbiosMiscHiiHandle, TokenToUpdate, Vendor, NULL);\r
186 }\r
187\r
429309e0 188 Version = GetBiosVersion ();\r
6273e59a
RC
189\r
190 if (StrLen (Version) > 0) {\r
191 TokenToUpdate = STRING_TOKEN (STR_MISC_BIOS_VERSION);\r
192 HiiSetString (mSmbiosMiscHiiHandle, TokenToUpdate, Version, NULL);\r
193 } else {\r
429309e0 194 Version = (CHAR16 *)PcdGetPtr (PcdFirmwareVersionString);\r
6273e59a
RC
195 if (StrLen (Version) > 0) {\r
196 TokenToUpdate = STRING_TOKEN (STR_MISC_BIOS_VERSION);\r
197 HiiSetString (mSmbiosMiscHiiHandle, TokenToUpdate, Version, NULL);\r
198 }\r
199 }\r
200\r
201 Char16String = GetBiosReleaseDate ();\r
429309e0 202 if (StrLen (Char16String) > 0) {\r
6273e59a
RC
203 TokenToUpdate = STRING_TOKEN (STR_MISC_BIOS_RELEASE_DATE);\r
204 HiiSetString (mSmbiosMiscHiiHandle, TokenToUpdate, Char16String, NULL);\r
205 }\r
206\r
429309e0
MK
207 TokenToGet = STRING_TOKEN (STR_MISC_BIOS_VENDOR);\r
208 Vendor = HiiGetPackageString (&gEfiCallerIdGuid, TokenToGet, NULL);\r
6273e59a
RC
209 VendorStrLen = StrLen (Vendor);\r
210\r
211 TokenToGet = STRING_TOKEN (STR_MISC_BIOS_VERSION);\r
429309e0
MK
212 Version = HiiGetPackageString (&gEfiCallerIdGuid, TokenToGet, NULL);\r
213 VerStrLen = StrLen (Version);\r
6273e59a 214\r
429309e0 215 TokenToGet = STRING_TOKEN (STR_MISC_BIOS_RELEASE_DATE);\r
6273e59a 216 ReleaseDate = HiiGetPackageString (&gEfiCallerIdGuid, TokenToGet, NULL);\r
429309e0 217 DateStrLen = StrLen (ReleaseDate);\r
6273e59a
RC
218\r
219 //\r
220 // Now update the BiosPhysicalSize\r
221 //\r
222 BiosPhysicalSize = FixedPcdGet32 (PcdFdSize);\r
223\r
224 //\r
225 // Two zeros following the last string.\r
226 //\r
429309e0
MK
227 SmbiosRecord = AllocateZeroPool (\r
228 sizeof (SMBIOS_TABLE_TYPE0) + VendorStrLen + 1 +\r
229 VerStrLen + 1 +\r
230 DateStrLen + 1 + 1\r
231 );\r
6273e59a
RC
232 if (SmbiosRecord == NULL) {\r
233 Status = EFI_OUT_OF_RESOURCES;\r
234 goto Exit;\r
235 }\r
236\r
237 (VOID)CopyMem (SmbiosRecord, InputData, sizeof (SMBIOS_TABLE_TYPE0));\r
238\r
429309e0 239 SmbiosRecord->Hdr.Length = sizeof (SMBIOS_TABLE_TYPE0);\r
6273e59a
RC
240 SmbiosRecord->BiosSegment = (UINT16)(FixedPcdGet32 (PcdFdBaseAddress) / SIZE_64KB);\r
241 if (BiosPhysicalSize < SIZE_16MB) {\r
242 SmbiosRecord->BiosSize = Base2ToByteWith64KUnit (BiosPhysicalSize) - 1;\r
6273e59a
RC
243 } else {\r
244 SmbiosRecord->BiosSize = 0xFF;\r
c49cb8f3
RC
245 if (BiosPhysicalSize < SIZE_16GB) {\r
246 SmbiosRecord->ExtendedBiosSize.Size = BiosPhysicalSize / SIZE_1MB;\r
247 SmbiosRecord->ExtendedBiosSize.Unit = 0; // Size is in MB\r
248 } else {\r
6273e59a
RC
249 SmbiosRecord->ExtendedBiosSize.Size = BiosPhysicalSize / SIZE_1GB;\r
250 SmbiosRecord->ExtendedBiosSize.Unit = 1; // Size is in GB\r
251 }\r
252 }\r
253\r
429309e0
MK
254 SmbiosRecord->SystemBiosMajorRelease = (UINT8)(PcdGet16 (PcdSystemBiosRelease) >> 8);\r
255 SmbiosRecord->SystemBiosMinorRelease = (UINT8)(PcdGet16 (PcdSystemBiosRelease) & 0xFF);\r
6273e59a
RC
256\r
257 SmbiosRecord->EmbeddedControllerFirmwareMajorRelease = (UINT16)\r
429309e0 258 (PcdGet16 (PcdEmbeddedControllerFirmwareRelease) >> 8);\r
6273e59a 259 SmbiosRecord->EmbeddedControllerFirmwareMinorRelease = (UINT16)\r
429309e0 260 (PcdGet16 (PcdEmbeddedControllerFirmwareRelease) & 0xFF);\r
6273e59a
RC
261\r
262 OptionalStrStart = (CHAR8 *)(SmbiosRecord + 1);\r
263 UnicodeStrToAsciiStrS (Vendor, OptionalStrStart, VendorStrLen + 1);\r
264 StrStart = OptionalStrStart + VendorStrLen + 1;\r
265 UnicodeStrToAsciiStrS (Version, StrStart, VerStrLen + 1);\r
266 StrStart += VerStrLen + 1;\r
267 UnicodeStrToAsciiStrS (ReleaseDate, StrStart, DateStrLen + 1);\r
268 //\r
269 // Now we have got the full smbios record, call smbios protocol to add this record.\r
270 //\r
429309e0 271 Status = SmbiosMiscAddRecord ((UINT8 *)SmbiosRecord, NULL);\r
6273e59a 272 if (EFI_ERROR (Status)) {\r
429309e0
MK
273 DEBUG ((\r
274 DEBUG_ERROR,\r
275 "[%a]:[%dL] Smbios Type00 Table Log Failed! %r \n",\r
276 __FUNCTION__,\r
277 DEBUG_LINE_NUMBER,\r
278 Status\r
279 ));\r
6273e59a
RC
280 }\r
281\r
282 FreePool (SmbiosRecord);\r
283\r
284Exit:\r
285 if (Vendor != NULL) {\r
286 FreePool (Vendor);\r
287 }\r
288\r
289 if (Version != NULL) {\r
290 FreePool (Version);\r
291 }\r
292\r
293 if (ReleaseDate != NULL) {\r
294 FreePool (ReleaseDate);\r
295 }\r
296\r
297 if (Char16String != NULL) {\r
298 FreePool (Char16String);\r
299 }\r
300\r
301 return Status;\r
302}\r