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
;
45 UINTN AssertTagStrLen
;
46 UINTN SerialNumStrLen
;
48 EFI_STRING Manufacturer
;
50 EFI_STRING SerialNumber
;
52 EFI_STRING ChassisSkuNumber
;
53 EFI_STRING_ID TokenToGet
;
54 SMBIOS_TABLE_TYPE3
*SmbiosRecord
;
55 SMBIOS_TABLE_TYPE3
*InputData
;
58 UINT8 ContainedElementCount
;
59 CONTAINED_ELEMENT ContainedElements
;
65 // First check for invalid parameters.
67 if (RecordData
== NULL
) {
68 return EFI_INVALID_PARAMETER
;
71 InputData
= (SMBIOS_TABLE_TYPE3
*)RecordData
;
75 STRING_TOKEN (STR_MISC_CHASSIS_ASSET_TAG
),
80 STRING_TOKEN (STR_MISC_CHASSIS_SERIAL_NUMBER
),
85 STRING_TOKEN (STR_MISC_CHASSIS_VERSION
),
90 STRING_TOKEN (STR_MISC_CHASSIS_MANUFACTURER
),
95 STRING_TOKEN (STR_MISC_CHASSIS_SKU_NUMBER
),
99 TokenToGet
= STRING_TOKEN (STR_MISC_CHASSIS_MANUFACTURER
);
100 Manufacturer
= HiiGetPackageString (&gEfiCallerIdGuid
, TokenToGet
, NULL
);
101 ManuStrLen
= StrLen (Manufacturer
);
103 TokenToGet
= STRING_TOKEN (STR_MISC_CHASSIS_VERSION
);
104 Version
= HiiGetPackageString (&gEfiCallerIdGuid
, TokenToGet
, NULL
);
105 VerStrLen
= StrLen (Version
);
107 TokenToGet
= STRING_TOKEN (STR_MISC_CHASSIS_SERIAL_NUMBER
);
108 SerialNumber
= HiiGetPackageString (&gEfiCallerIdGuid
, TokenToGet
, NULL
);
109 SerialNumStrLen
= StrLen (SerialNumber
);
111 TokenToGet
= STRING_TOKEN (STR_MISC_CHASSIS_ASSET_TAG
);
112 AssertTag
= HiiGetPackageString (&gEfiCallerIdGuid
, TokenToGet
, NULL
);
113 AssertTagStrLen
= StrLen (AssertTag
);
115 TokenToGet
= STRING_TOKEN (STR_MISC_CHASSIS_SKU_NUMBER
);
116 ChassisSkuNumber
= HiiGetPackageString (&gEfiCallerIdGuid
, TokenToGet
, NULL
);
117 ChaNumStrLen
= StrLen (ChassisSkuNumber
);
119 ContainedElementCount
= InputData
->ContainedElementCount
;
121 if (ContainedElementCount
> 1) {
122 ExtendLength
= (ContainedElementCount
- 1) * sizeof (CONTAINED_ELEMENT
);
126 // Two zeros following the last string.
128 RecordLength
= sizeof (SMBIOS_TABLE_TYPE3
) +
132 SerialNumStrLen
+ 1 +
133 AssertTagStrLen
+ 1 +
134 ChaNumStrLen
+ 1 + 1;
135 SmbiosRecord
= AllocateZeroPool (RecordLength
);
136 if (SmbiosRecord
== NULL
) {
137 Status
= EFI_OUT_OF_RESOURCES
;
141 (VOID
)CopyMem (SmbiosRecord
, InputData
, sizeof (SMBIOS_TABLE_TYPE3
));
143 SmbiosRecord
->Hdr
.Length
= sizeof (SMBIOS_TABLE_TYPE3
) + ExtendLength
+ 1;
145 SmbiosRecord
->Type
= OemGetChassisType ();
148 ASSERT (ContainedElementCount
< 2);
149 (VOID
)CopyMem (SmbiosRecord
+ 1, &ContainedElements
, ExtendLength
);
152 *((UINT8
*)SmbiosRecord
+ sizeof (SMBIOS_TABLE_TYPE3
) + ExtendLength
) = 5;
154 OptionalStrStart
= (CHAR8
*)((UINT8
*)SmbiosRecord
+ sizeof (SMBIOS_TABLE_TYPE3
) +
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);
166 SmbiosRecord
->BootupState
= OemGetChassisBootupState ();
167 SmbiosRecord
->PowerSupplyState
= OemGetChassisPowerSupplyState ();
168 SmbiosRecord
->ThermalState
= OemGetChassisThermalState ();
169 SmbiosRecord
->SecurityStatus
= OemGetChassisSecurityStatus ();
170 SmbiosRecord
->Height
= OemGetChassisHeight ();
171 SmbiosRecord
->NumberofPowerCords
= OemGetChassisNumPowerCords ();
174 // Now we have got the full smbios record, call smbios protocol to add this record.
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
));
182 FreePool (SmbiosRecord
);
185 if (Manufacturer
!= NULL
) {
186 FreePool (Manufacturer
);
189 if (Version
!= NULL
) {
193 if (SerialNumber
!= NULL
) {
194 FreePool (SerialNumber
);
197 if (AssertTag
!= NULL
) {
198 FreePool (AssertTag
);
201 if (ChassisSkuNumber
!= NULL
) {
202 FreePool (ChassisSkuNumber
);