2 This driver parses the mMiscSubclassDataTable structure and reports
3 any generated data to smbios.
5 Copyright (c) 2013-2015 Intel Corporation.
7 SPDX-License-Identifier: BSD-2-Clause-Patent
13 #include "CommonHeader.h"
15 #include "SmbiosMisc.h"
18 This function makes boot time changes to the contents of the
19 MiscSystemManufacturer (Type 1).
21 @param RecordData Pointer to copy of RecordData from the Data Table.
23 @retval EFI_SUCCESS All parameters were valid.
24 @retval EFI_UNSUPPORTED Unexpected RecordType value.
25 @retval EFI_INVALID_PARAMETER Invalid parameter was found.
28 MISC_SMBIOS_TABLE_FUNCTION(MiscSystemManufacturer
)
30 CHAR8
*OptionalStrStart
;
34 UINTN SerialNumStrLen
;
38 CHAR16 Manufacturer
[SMBIOS_STRING_MAX_LENGTH
];
39 CHAR16 ProductName
[SMBIOS_STRING_MAX_LENGTH
];
40 CHAR16 Version
[SMBIOS_STRING_MAX_LENGTH
];
41 CHAR16 SerialNumber
[SMBIOS_STRING_MAX_LENGTH
];
42 CHAR16 SKUNumber
[SMBIOS_STRING_MAX_LENGTH
];
43 CHAR16 Family
[SMBIOS_STRING_MAX_LENGTH
];
44 EFI_STRING ManufacturerPtr
;
45 EFI_STRING ProductNamePtr
;
46 EFI_STRING VersionPtr
;
47 EFI_STRING SerialNumberPtr
;
48 EFI_STRING SKUNumberPtr
;
50 STRING_REF TokenToGet
;
51 STRING_REF TokenToUpdate
;
52 EFI_SMBIOS_HANDLE SmbiosHandle
;
53 SMBIOS_TABLE_TYPE1
*SmbiosRecord
;
54 EFI_MISC_SYSTEM_MANUFACTURER
*ForType1InputData
;
56 ForType1InputData
= (EFI_MISC_SYSTEM_MANUFACTURER
*)RecordData
;
59 // First check for invalid parameters.
61 if (RecordData
== NULL
) {
62 return EFI_INVALID_PARAMETER
;
66 // Update strings from PCD
68 AsciiStrToUnicodeStr ((CHAR8
*) PcdGetPtr(PcdSMBIOSSystemManufacturer
), Manufacturer
);
69 if (StrLen (Manufacturer
) > 0) {
70 TokenToUpdate
= STRING_TOKEN (STR_MISC_SYSTEM_MANUFACTURER
);
71 HiiSetString (mHiiHandle
, TokenToUpdate
, Manufacturer
, NULL
);
73 TokenToGet
= STRING_TOKEN (STR_MISC_SYSTEM_MANUFACTURER
);
74 ManufacturerPtr
= HiiGetPackageString(&gEfiCallerIdGuid
, TokenToGet
, NULL
);
75 ManuStrLen
= StrLen(ManufacturerPtr
);
76 if (ManuStrLen
> SMBIOS_STRING_MAX_LENGTH
) {
77 return EFI_UNSUPPORTED
;
80 AsciiStrToUnicodeStr ((CHAR8
*) PcdGetPtr(PcdSMBIOSSystemProductName
), ProductName
);
81 if (StrLen (ProductName
) > 0) {
82 TokenToUpdate
= STRING_TOKEN (STR_MISC_SYSTEM_PRODUCT_NAME
);
83 HiiSetString (mHiiHandle
, TokenToUpdate
, ProductName
, NULL
);
85 TokenToGet
= STRING_TOKEN (STR_MISC_SYSTEM_PRODUCT_NAME
);
86 ProductNamePtr
= HiiGetPackageString(&gEfiCallerIdGuid
, TokenToGet
, NULL
);
87 PdNameStrLen
= StrLen(ProductNamePtr
);
88 if (PdNameStrLen
> SMBIOS_STRING_MAX_LENGTH
) {
89 return EFI_UNSUPPORTED
;
92 AsciiStrToUnicodeStr ((CHAR8
*) PcdGetPtr(PcdSMBIOSSystemVersion
), Version
);
93 if (StrLen (Version
) > 0) {
94 TokenToUpdate
= STRING_TOKEN (STR_MISC_SYSTEM_VERSION
);
95 HiiSetString (mHiiHandle
, TokenToUpdate
, Version
, NULL
);
97 TokenToGet
= STRING_TOKEN (STR_MISC_SYSTEM_VERSION
);
98 VersionPtr
= HiiGetPackageString(&gEfiCallerIdGuid
, TokenToGet
, NULL
);
99 VerStrLen
= StrLen(VersionPtr
);
100 if (VerStrLen
> SMBIOS_STRING_MAX_LENGTH
) {
101 return EFI_UNSUPPORTED
;
104 AsciiStrToUnicodeStr ((CHAR8
*) PcdGetPtr(PcdSMBIOSSystemSerialNumber
), SerialNumber
);
105 if (StrLen (SerialNumber
) > 0) {
106 TokenToUpdate
= STRING_TOKEN (STR_MISC_SYSTEM_SERIAL_NUMBER
);
107 HiiSetString (mHiiHandle
, TokenToUpdate
, SerialNumber
, NULL
);
109 TokenToGet
= STRING_TOKEN (STR_MISC_SYSTEM_SERIAL_NUMBER
);
110 SerialNumberPtr
= HiiGetPackageString(&gEfiCallerIdGuid
, TokenToGet
, NULL
);
111 SerialNumStrLen
= StrLen(SerialNumberPtr
);
112 if (SerialNumStrLen
> SMBIOS_STRING_MAX_LENGTH
) {
113 return EFI_UNSUPPORTED
;
116 AsciiStrToUnicodeStr ((CHAR8
*) PcdGetPtr(PcdSMBIOSSystemSKUNumber
), SKUNumber
);
117 if (StrLen (SKUNumber
) > 0) {
118 TokenToUpdate
= STRING_TOKEN (STR_MISC_SYSTEM_SKU_NUMBER
);
119 HiiSetString (mHiiHandle
, TokenToUpdate
, SKUNumber
, NULL
);
121 TokenToGet
= STRING_TOKEN (STR_MISC_SYSTEM_SKU_NUMBER
);
122 SKUNumberPtr
= HiiGetPackageString(&gEfiCallerIdGuid
, TokenToGet
, NULL
);
123 SKUNumStrLen
= StrLen(SKUNumberPtr
);
124 if (SKUNumStrLen
> SMBIOS_STRING_MAX_LENGTH
) {
125 return EFI_UNSUPPORTED
;
128 AsciiStrToUnicodeStr ((CHAR8
*) PcdGetPtr(PcdSMBIOSSystemFamily
), Family
);
129 if (StrLen (Family
) > 0) {
130 TokenToUpdate
= STRING_TOKEN (STR_MISC_SYSTEM_FAMILY
);
131 HiiSetString (mHiiHandle
, TokenToUpdate
, Family
, NULL
);
133 TokenToGet
= STRING_TOKEN (STR_MISC_SYSTEM_FAMILY
);
134 FamilyPtr
= HiiGetPackageString(&gEfiCallerIdGuid
, TokenToGet
, NULL
);
135 FamilyStrLen
= StrLen(FamilyPtr
);
136 if (FamilyStrLen
> SMBIOS_STRING_MAX_LENGTH
) {
137 return EFI_UNSUPPORTED
;
140 // Two zeros following the last string.
142 SmbiosRecord
= AllocatePool(sizeof (SMBIOS_TABLE_TYPE1
) + ManuStrLen
+ 1 + PdNameStrLen
+ 1 + VerStrLen
+ 1 + SerialNumStrLen
+ 1 + SKUNumStrLen
+ 1 + FamilyStrLen
+ 1 + 1);
143 ZeroMem(SmbiosRecord
, sizeof (SMBIOS_TABLE_TYPE1
) + ManuStrLen
+ 1 + PdNameStrLen
+ 1 + VerStrLen
+ 1 + SerialNumStrLen
+ 1 + SKUNumStrLen
+ 1 + FamilyStrLen
+ 1 + 1);
145 SmbiosRecord
->Hdr
.Type
= EFI_SMBIOS_TYPE_SYSTEM_INFORMATION
;
146 SmbiosRecord
->Hdr
.Length
= sizeof (SMBIOS_TABLE_TYPE1
);
148 // Make handle chosen by smbios protocol.add automatically.
150 SmbiosRecord
->Hdr
.Handle
= 0;
152 // Manu will be the 1st optional string following the formatted structure.
154 SmbiosRecord
->Manufacturer
= 1;
156 // ProductName will be the 2nd optional string following the formatted structure.
158 SmbiosRecord
->ProductName
= 2;
160 // Version will be the 3rd optional string following the formatted structure.
162 SmbiosRecord
->Version
= 3;
164 // Serial number will be the 4th optional string following the formatted structure.
166 SmbiosRecord
->SerialNumber
= 4;
168 // SKU number will be the 5th optional string following the formatted structure.
170 SmbiosRecord
->SKUNumber
= 5;
172 // Family will be the 6th optional string following the formatted structure.
174 SmbiosRecord
->Family
= 6;
175 CopyMem ((UINT8
*) (&SmbiosRecord
->Uuid
), (UINT8
*)PcdGetPtr(PcdSMBIOSSystemUuid
),16);
176 SmbiosRecord
->WakeUpType
= (UINT8
)ForType1InputData
->SystemWakeupType
;
178 OptionalStrStart
= (CHAR8
*)(SmbiosRecord
+ 1);
179 UnicodeStrToAsciiStr(ManufacturerPtr
, OptionalStrStart
);
180 UnicodeStrToAsciiStr(ProductNamePtr
, OptionalStrStart
+ ManuStrLen
+ 1);
181 UnicodeStrToAsciiStr(VersionPtr
, OptionalStrStart
+ ManuStrLen
+ 1 + PdNameStrLen
+ 1);
182 UnicodeStrToAsciiStr(SerialNumberPtr
, OptionalStrStart
+ ManuStrLen
+ 1 + PdNameStrLen
+ 1 + VerStrLen
+ 1);
183 UnicodeStrToAsciiStr(SKUNumberPtr
, OptionalStrStart
+ ManuStrLen
+ 1 + PdNameStrLen
+ 1 + VerStrLen
+ 1 + SerialNumStrLen
+ 1);
184 UnicodeStrToAsciiStr(FamilyPtr
, OptionalStrStart
+ ManuStrLen
+ 1 + PdNameStrLen
+ 1 + VerStrLen
+ 1 + SerialNumStrLen
+ 1 + SKUNumStrLen
+ 1);
187 // Now we have got the full smbios record, call smbios protocol to add this record.
189 SmbiosHandle
= SMBIOS_HANDLE_PI_RESERVED
;
190 Status
= Smbios
-> Add(
194 (EFI_SMBIOS_TABLE_HEADER
*) SmbiosRecord
196 FreePool(SmbiosRecord
);