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