]> git.proxmox.com Git - mirror_edk2.git/blob - ArmPkg/Universal/Smbios/SmbiosMiscDxe/Type03/MiscChassisManufacturerFunction.c
ArmPkg: Reproduce builds across source format changes
[mirror_edk2.git] / ArmPkg / Universal / Smbios / SmbiosMiscDxe / Type03 / MiscChassisManufacturerFunction.c
1 /** @file
2 This driver parses the mMiscSubclassDataTable structure and reports
3 any generated data to smbios.
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 This function makes boot time changes to the contents of the
28 MiscChassisManufacturer (Type 3) record.
29
30 @param RecordData Pointer to SMBIOS table with default values.
31 @param Smbios SMBIOS protocol.
32
33 @retval EFI_SUCCESS The SMBIOS table was successfully added.
34 @retval EFI_INVALID_PARAMETER Invalid parameter was found.
35 @retval EFI_OUT_OF_RESOURCES Failed to allocate required memory.
36
37 **/
38 SMBIOS_MISC_TABLE_FUNCTION(MiscChassisManufacturer)
39 {
40 CHAR8 *OptionalStrStart;
41 CHAR8 *StrStart;
42 UINT8 *SkuNumberField;
43 UINTN RecordLength;
44 UINTN ManuStrLen;
45 UINTN VerStrLen;
46 UINTN AssertTagStrLen;
47 UINTN SerialNumStrLen;
48 UINTN ChaNumStrLen;
49 EFI_STRING Manufacturer;
50 EFI_STRING Version;
51 EFI_STRING SerialNumber;
52 EFI_STRING AssertTag;
53 EFI_STRING ChassisSkuNumber;
54 EFI_STRING_ID TokenToGet;
55 SMBIOS_TABLE_TYPE3 *SmbiosRecord;
56 SMBIOS_TABLE_TYPE3 *InputData;
57 EFI_STATUS Status;
58
59 UINT8 ContainedElementCount;
60 CONTAINED_ELEMENT ContainedElements;
61 UINT8 ExtendLength;
62
63 ExtendLength = 0;
64
65 //
66 // First check for invalid parameters.
67 //
68 if (RecordData == NULL) {
69 return EFI_INVALID_PARAMETER;
70 }
71
72 InputData = (SMBIOS_TABLE_TYPE3 *)RecordData;
73
74 OemUpdateSmbiosInfo (
75 mSmbiosMiscHiiHandle,
76 STRING_TOKEN (STR_MISC_CHASSIS_ASSET_TAG),
77 AssetTagType03
78 );
79 OemUpdateSmbiosInfo (
80 mSmbiosMiscHiiHandle,
81 STRING_TOKEN (STR_MISC_CHASSIS_SERIAL_NUMBER),
82 SerialNumberType03
83 );
84 OemUpdateSmbiosInfo (
85 mSmbiosMiscHiiHandle,
86 STRING_TOKEN (STR_MISC_CHASSIS_VERSION),
87 VersionType03
88 );
89 OemUpdateSmbiosInfo (
90 mSmbiosMiscHiiHandle,
91 STRING_TOKEN (STR_MISC_CHASSIS_MANUFACTURER),
92 ManufacturerType03
93 );
94 OemUpdateSmbiosInfo (
95 mSmbiosMiscHiiHandle,
96 STRING_TOKEN (STR_MISC_CHASSIS_SKU_NUMBER),
97 SkuNumberType03
98 );
99
100 TokenToGet = STRING_TOKEN (STR_MISC_CHASSIS_MANUFACTURER);
101 Manufacturer = HiiGetPackageString (&gEfiCallerIdGuid, TokenToGet, NULL);
102 ManuStrLen = StrLen (Manufacturer);
103
104 TokenToGet = STRING_TOKEN (STR_MISC_CHASSIS_VERSION);
105 Version = HiiGetPackageString (&gEfiCallerIdGuid, TokenToGet, NULL);
106 VerStrLen = StrLen (Version);
107
108 TokenToGet = STRING_TOKEN (STR_MISC_CHASSIS_SERIAL_NUMBER);
109 SerialNumber = HiiGetPackageString (&gEfiCallerIdGuid, TokenToGet, NULL);
110 SerialNumStrLen = StrLen (SerialNumber);
111
112 TokenToGet = STRING_TOKEN (STR_MISC_CHASSIS_ASSET_TAG);
113 AssertTag = HiiGetPackageString (&gEfiCallerIdGuid, TokenToGet, NULL);
114 AssertTagStrLen = StrLen (AssertTag);
115
116 TokenToGet = STRING_TOKEN (STR_MISC_CHASSIS_SKU_NUMBER);
117 ChassisSkuNumber = HiiGetPackageString (&gEfiCallerIdGuid, TokenToGet, NULL);
118 ChaNumStrLen = StrLen (ChassisSkuNumber);
119
120 ContainedElementCount = InputData->ContainedElementCount;
121 ExtendLength = ContainedElementCount * sizeof (CONTAINED_ELEMENT);
122
123 //
124 // Two zeros following the last string.
125 //
126 RecordLength = sizeof (SMBIOS_TABLE_TYPE3) +
127 ExtendLength + 1 +
128 ManuStrLen + 1 +
129 VerStrLen + 1 +
130 SerialNumStrLen + 1 +
131 AssertTagStrLen + 1 +
132 ChaNumStrLen + 1 + 1;
133 SmbiosRecord = AllocateZeroPool (RecordLength);
134 if (SmbiosRecord == NULL) {
135 Status = EFI_OUT_OF_RESOURCES;
136 goto Exit;
137 }
138
139 (VOID)CopyMem (SmbiosRecord, InputData, sizeof (SMBIOS_TABLE_TYPE3));
140
141 SmbiosRecord->Hdr.Length = sizeof (SMBIOS_TABLE_TYPE3) + ExtendLength + 1;
142
143 SmbiosRecord->Type = OemGetChassisType ();
144
145 //ContainedElements
146 ASSERT (ContainedElementCount < 2);
147 (VOID)CopyMem (SmbiosRecord + 1, &ContainedElements, ExtendLength);
148
149 //ChassisSkuNumber
150 SkuNumberField = (UINT8 *)SmbiosRecord +
151 sizeof (SMBIOS_TABLE_TYPE3) -
152 sizeof (CONTAINED_ELEMENT) + ExtendLength;
153
154 *SkuNumberField = 5;
155
156 OptionalStrStart = (CHAR8 *)((UINT8 *)SmbiosRecord + sizeof (SMBIOS_TABLE_TYPE3) +
157 ExtendLength + 1);
158 UnicodeStrToAsciiStrS (Manufacturer, OptionalStrStart, ManuStrLen + 1);
159 StrStart = OptionalStrStart + ManuStrLen + 1;
160 UnicodeStrToAsciiStrS (Version, StrStart, VerStrLen + 1);
161 StrStart += VerStrLen + 1;
162 UnicodeStrToAsciiStrS (SerialNumber, StrStart, SerialNumStrLen + 1);
163 StrStart += SerialNumStrLen + 1;
164 UnicodeStrToAsciiStrS (AssertTag, StrStart, AssertTagStrLen + 1);
165 StrStart += AssertTagStrLen + 1;
166 UnicodeStrToAsciiStrS (ChassisSkuNumber, StrStart, ChaNumStrLen + 1);
167
168 SmbiosRecord->BootupState = OemGetChassisBootupState ();
169 SmbiosRecord->PowerSupplyState = OemGetChassisPowerSupplyState ();
170 SmbiosRecord->ThermalState = OemGetChassisThermalState ();
171 SmbiosRecord->SecurityStatus = OemGetChassisSecurityStatus ();
172 SmbiosRecord->Height = OemGetChassisHeight ();
173 SmbiosRecord->NumberofPowerCords = OemGetChassisNumPowerCords ();
174
175 //
176 // Now we have got the full smbios record, call smbios protocol to add this record.
177 //
178 Status = SmbiosMiscAddRecord ((UINT8*)SmbiosRecord, NULL);
179 if (EFI_ERROR (Status)) {
180 DEBUG ((DEBUG_ERROR, "[%a]:[%dL] Smbios Type03 Table Log Failed! %r \n",
181 __FUNCTION__, DEBUG_LINE_NUMBER, Status));
182 }
183
184 FreePool (SmbiosRecord);
185
186 Exit:
187 if (Manufacturer != NULL) {
188 FreePool (Manufacturer);
189 }
190
191 if (Version != NULL) {
192 FreePool (Version);
193 }
194
195 if (SerialNumber != NULL) {
196 FreePool (SerialNumber);
197 }
198
199 if (AssertTag != NULL) {
200 FreePool (AssertTag);
201 }
202
203 if (ChassisSkuNumber != NULL) {
204 FreePool (ChassisSkuNumber);
205 }
206
207 return 0;
208 }