2 This driver parses the mMiscSubclassDataTable structure and reports
3 any generated data to smbios.
5 Based on files under Nt32Pkg/MiscSubClassPlatformDxe/
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
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>
24 #include "SmbiosMisc.h"
27 This function makes boot time changes to the contents of the
28 MiscChassisManufacturer (Type 3) record.
30 @param RecordData Pointer to SMBIOS table with default values.
31 @param Smbios SMBIOS protocol.
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.
38 SMBIOS_MISC_TABLE_FUNCTION(MiscChassisManufacturer
)
40 CHAR8
*OptionalStrStart
;
42 UINT8
*SkuNumberField
;
46 UINTN AssertTagStrLen
;
47 UINTN SerialNumStrLen
;
49 EFI_STRING Manufacturer
;
51 EFI_STRING SerialNumber
;
53 EFI_STRING ChassisSkuNumber
;
54 EFI_STRING_ID TokenToGet
;
55 SMBIOS_TABLE_TYPE3
*SmbiosRecord
;
56 SMBIOS_TABLE_TYPE3
*InputData
;
59 UINT8 ContainedElementCount
;
60 CONTAINED_ELEMENT ContainedElements
;
66 // First check for invalid parameters.
68 if (RecordData
== NULL
) {
69 return EFI_INVALID_PARAMETER
;
72 InputData
= (SMBIOS_TABLE_TYPE3
*)RecordData
;
76 STRING_TOKEN (STR_MISC_CHASSIS_ASSET_TAG
),
81 STRING_TOKEN (STR_MISC_CHASSIS_SERIAL_NUMBER
),
86 STRING_TOKEN (STR_MISC_CHASSIS_VERSION
),
91 STRING_TOKEN (STR_MISC_CHASSIS_MANUFACTURER
),
96 STRING_TOKEN (STR_MISC_CHASSIS_SKU_NUMBER
),
100 TokenToGet
= STRING_TOKEN (STR_MISC_CHASSIS_MANUFACTURER
);
101 Manufacturer
= HiiGetPackageString (&gEfiCallerIdGuid
, TokenToGet
, NULL
);
102 ManuStrLen
= StrLen (Manufacturer
);
104 TokenToGet
= STRING_TOKEN (STR_MISC_CHASSIS_VERSION
);
105 Version
= HiiGetPackageString (&gEfiCallerIdGuid
, TokenToGet
, NULL
);
106 VerStrLen
= StrLen (Version
);
108 TokenToGet
= STRING_TOKEN (STR_MISC_CHASSIS_SERIAL_NUMBER
);
109 SerialNumber
= HiiGetPackageString (&gEfiCallerIdGuid
, TokenToGet
, NULL
);
110 SerialNumStrLen
= StrLen (SerialNumber
);
112 TokenToGet
= STRING_TOKEN (STR_MISC_CHASSIS_ASSET_TAG
);
113 AssertTag
= HiiGetPackageString (&gEfiCallerIdGuid
, TokenToGet
, NULL
);
114 AssertTagStrLen
= StrLen (AssertTag
);
116 TokenToGet
= STRING_TOKEN (STR_MISC_CHASSIS_SKU_NUMBER
);
117 ChassisSkuNumber
= HiiGetPackageString (&gEfiCallerIdGuid
, TokenToGet
, NULL
);
118 ChaNumStrLen
= StrLen (ChassisSkuNumber
);
120 ContainedElementCount
= InputData
->ContainedElementCount
;
121 ExtendLength
= ContainedElementCount
* sizeof (CONTAINED_ELEMENT
);
124 // Two zeros following the last string.
126 RecordLength
= sizeof (SMBIOS_TABLE_TYPE3
) +
130 SerialNumStrLen
+ 1 +
131 AssertTagStrLen
+ 1 +
132 ChaNumStrLen
+ 1 + 1;
133 SmbiosRecord
= AllocateZeroPool (RecordLength
);
134 if (SmbiosRecord
== NULL
) {
135 Status
= EFI_OUT_OF_RESOURCES
;
139 (VOID
)CopyMem (SmbiosRecord
, InputData
, sizeof (SMBIOS_TABLE_TYPE3
));
141 SmbiosRecord
->Hdr
.Length
= sizeof (SMBIOS_TABLE_TYPE3
) + ExtendLength
+ 1;
143 SmbiosRecord
->Type
= OemGetChassisType ();
146 ASSERT (ContainedElementCount
< 2);
147 (VOID
)CopyMem (SmbiosRecord
+ 1, &ContainedElements
, ExtendLength
);
150 SkuNumberField
= (UINT8
*)SmbiosRecord
+
151 sizeof (SMBIOS_TABLE_TYPE3
) -
152 sizeof (CONTAINED_ELEMENT
) + ExtendLength
;
156 OptionalStrStart
= (CHAR8
*)((UINT8
*)SmbiosRecord
+ sizeof (SMBIOS_TABLE_TYPE3
) +
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);
168 SmbiosRecord
->BootupState
= OemGetChassisBootupState ();
169 SmbiosRecord
->PowerSupplyState
= OemGetChassisPowerSupplyState ();
170 SmbiosRecord
->ThermalState
= OemGetChassisThermalState ();
171 SmbiosRecord
->SecurityStatus
= OemGetChassisSecurityStatus ();
172 SmbiosRecord
->Height
= OemGetChassisHeight ();
173 SmbiosRecord
->NumberofPowerCords
= OemGetChassisNumPowerCords ();
176 // Now we have got the full smbios record, call smbios protocol to add this record.
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
));
184 FreePool (SmbiosRecord
);
187 if (Manufacturer
!= NULL
) {
188 FreePool (Manufacturer
);
191 if (Version
!= NULL
) {
195 if (SerialNumber
!= NULL
) {
196 FreePool (SerialNumber
);
199 if (AssertTag
!= NULL
) {
200 FreePool (AssertTag
);
203 if (ChassisSkuNumber
!= NULL
) {
204 FreePool (ChassisSkuNumber
);