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
) {
39 CHAR8
*OptionalStrStart
;
41 UINT8
*SkuNumberField
;
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
;
120 ExtendLength
= ContainedElementCount
* sizeof (CONTAINED_ELEMENT
);
123 // Two zeros following the last string.
125 RecordLength
= sizeof (SMBIOS_TABLE_TYPE3
) +
129 SerialNumStrLen
+ 1 +
130 AssertTagStrLen
+ 1 +
131 ChaNumStrLen
+ 1 + 1;
132 SmbiosRecord
= AllocateZeroPool (RecordLength
);
133 if (SmbiosRecord
== NULL
) {
134 Status
= EFI_OUT_OF_RESOURCES
;
138 (VOID
)CopyMem (SmbiosRecord
, InputData
, sizeof (SMBIOS_TABLE_TYPE3
));
140 SmbiosRecord
->Hdr
.Length
= sizeof (SMBIOS_TABLE_TYPE3
) + ExtendLength
+ 1;
142 SmbiosRecord
->Type
= OemGetChassisType ();
145 ASSERT (ContainedElementCount
< 2);
146 (VOID
)CopyMem (SmbiosRecord
+ 1, &ContainedElements
, ExtendLength
);
149 SkuNumberField
= (UINT8
*)SmbiosRecord
+
150 sizeof (SMBIOS_TABLE_TYPE3
) -
151 sizeof (CONTAINED_ELEMENT
) + ExtendLength
;
155 OptionalStrStart
= (CHAR8
*)((UINT8
*)SmbiosRecord
+ sizeof (SMBIOS_TABLE_TYPE3
) +
157 UnicodeStrToAsciiStrS (Manufacturer
, OptionalStrStart
, ManuStrLen
+ 1);
158 StrStart
= OptionalStrStart
+ ManuStrLen
+ 1;
159 UnicodeStrToAsciiStrS (Version
, StrStart
, VerStrLen
+ 1);
160 StrStart
+= VerStrLen
+ 1;
161 UnicodeStrToAsciiStrS (SerialNumber
, StrStart
, SerialNumStrLen
+ 1);
162 StrStart
+= SerialNumStrLen
+ 1;
163 UnicodeStrToAsciiStrS (AssertTag
, StrStart
, AssertTagStrLen
+ 1);
164 StrStart
+= AssertTagStrLen
+ 1;
165 UnicodeStrToAsciiStrS (ChassisSkuNumber
, StrStart
, ChaNumStrLen
+ 1);
167 SmbiosRecord
->BootupState
= OemGetChassisBootupState ();
168 SmbiosRecord
->PowerSupplyState
= OemGetChassisPowerSupplyState ();
169 SmbiosRecord
->ThermalState
= OemGetChassisThermalState ();
170 SmbiosRecord
->SecurityStatus
= OemGetChassisSecurityStatus ();
171 SmbiosRecord
->Height
= OemGetChassisHeight ();
172 SmbiosRecord
->NumberofPowerCords
= OemGetChassisNumPowerCords ();
175 // Now we have got the full smbios record, call smbios protocol to add this record.
177 Status
= SmbiosMiscAddRecord ((UINT8
*)SmbiosRecord
, NULL
);
178 if (EFI_ERROR (Status
)) {
181 "[%a]:[%dL] Smbios Type03 Table Log Failed! %r \n",
188 FreePool (SmbiosRecord
);
191 if (Manufacturer
!= NULL
) {
192 FreePool (Manufacturer
);
195 if (Version
!= NULL
) {
199 if (SerialNumber
!= NULL
) {
200 FreePool (SerialNumber
);
203 if (AssertTag
!= NULL
) {
204 FreePool (AssertTag
);
207 if (ChassisSkuNumber
!= NULL
) {
208 FreePool (ChassisSkuNumber
);