2 This driver parses the mMiscSubclassDataTable structure and reports
3 any generated data to smbios.
5 Copyright (c) 2013-2015 Intel Corporation.
7 This program and the accompanying materials
8 are licensed and made available under the terms and conditions of the BSD License
9 which accompanies this distribution. The full text of the license may be found at
10 http://opensource.org/licenses/bsd-license.php
12 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
13 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
19 #include "CommonHeader.h"
21 #include "SmbiosMisc.h"
24 This function makes boot time changes to the contents of the
25 MiscSystemManufacturer (Type 1).
27 @param RecordData Pointer to copy of RecordData from the Data Table.
29 @retval EFI_SUCCESS All parameters were valid.
30 @retval EFI_UNSUPPORTED Unexpected RecordType value.
31 @retval EFI_INVALID_PARAMETER Invalid parameter was found.
34 MISC_SMBIOS_TABLE_FUNCTION(MiscSystemManufacturer
)
36 CHAR8
*OptionalStrStart
;
40 UINTN SerialNumStrLen
;
44 CHAR16 Manufacturer
[SMBIOS_STRING_MAX_LENGTH
];
45 CHAR16 ProductName
[SMBIOS_STRING_MAX_LENGTH
];
46 CHAR16 Version
[SMBIOS_STRING_MAX_LENGTH
];
47 CHAR16 SerialNumber
[SMBIOS_STRING_MAX_LENGTH
];
48 CHAR16 SKUNumber
[SMBIOS_STRING_MAX_LENGTH
];
49 CHAR16 Family
[SMBIOS_STRING_MAX_LENGTH
];
50 EFI_STRING ManufacturerPtr
;
51 EFI_STRING ProductNamePtr
;
52 EFI_STRING VersionPtr
;
53 EFI_STRING SerialNumberPtr
;
54 EFI_STRING SKUNumberPtr
;
56 STRING_REF TokenToGet
;
57 STRING_REF TokenToUpdate
;
58 EFI_SMBIOS_HANDLE SmbiosHandle
;
59 SMBIOS_TABLE_TYPE1
*SmbiosRecord
;
60 EFI_MISC_SYSTEM_MANUFACTURER
*ForType1InputData
;
62 ForType1InputData
= (EFI_MISC_SYSTEM_MANUFACTURER
*)RecordData
;
65 // First check for invalid parameters.
67 if (RecordData
== NULL
) {
68 return EFI_INVALID_PARAMETER
;
72 // Update strings from PCD
74 AsciiStrToUnicodeStr ((CHAR8
*) PcdGetPtr(PcdSMBIOSSystemManufacturer
), Manufacturer
);
75 if (StrLen (Manufacturer
) > 0) {
76 TokenToUpdate
= STRING_TOKEN (STR_MISC_SYSTEM_MANUFACTURER
);
77 HiiSetString (mHiiHandle
, TokenToUpdate
, Manufacturer
, NULL
);
79 TokenToGet
= STRING_TOKEN (STR_MISC_SYSTEM_MANUFACTURER
);
80 ManufacturerPtr
= HiiGetPackageString(&gEfiCallerIdGuid
, TokenToGet
, NULL
);
81 ManuStrLen
= StrLen(ManufacturerPtr
);
82 if (ManuStrLen
> SMBIOS_STRING_MAX_LENGTH
) {
83 return EFI_UNSUPPORTED
;
86 AsciiStrToUnicodeStr ((CHAR8
*) PcdGetPtr(PcdSMBIOSSystemProductName
), ProductName
);
87 if (StrLen (ProductName
) > 0) {
88 TokenToUpdate
= STRING_TOKEN (STR_MISC_SYSTEM_PRODUCT_NAME
);
89 HiiSetString (mHiiHandle
, TokenToUpdate
, ProductName
, NULL
);
91 TokenToGet
= STRING_TOKEN (STR_MISC_SYSTEM_PRODUCT_NAME
);
92 ProductNamePtr
= HiiGetPackageString(&gEfiCallerIdGuid
, TokenToGet
, NULL
);
93 PdNameStrLen
= StrLen(ProductNamePtr
);
94 if (PdNameStrLen
> SMBIOS_STRING_MAX_LENGTH
) {
95 return EFI_UNSUPPORTED
;
98 AsciiStrToUnicodeStr ((CHAR8
*) PcdGetPtr(PcdSMBIOSSystemVersion
), Version
);
99 if (StrLen (Version
) > 0) {
100 TokenToUpdate
= STRING_TOKEN (STR_MISC_SYSTEM_VERSION
);
101 HiiSetString (mHiiHandle
, TokenToUpdate
, Version
, NULL
);
103 TokenToGet
= STRING_TOKEN (STR_MISC_SYSTEM_VERSION
);
104 VersionPtr
= HiiGetPackageString(&gEfiCallerIdGuid
, TokenToGet
, NULL
);
105 VerStrLen
= StrLen(VersionPtr
);
106 if (VerStrLen
> SMBIOS_STRING_MAX_LENGTH
) {
107 return EFI_UNSUPPORTED
;
110 AsciiStrToUnicodeStr ((CHAR8
*) PcdGetPtr(PcdSMBIOSSystemSerialNumber
), SerialNumber
);
111 if (StrLen (SerialNumber
) > 0) {
112 TokenToUpdate
= STRING_TOKEN (STR_MISC_SYSTEM_SERIAL_NUMBER
);
113 HiiSetString (mHiiHandle
, TokenToUpdate
, SerialNumber
, NULL
);
115 TokenToGet
= STRING_TOKEN (STR_MISC_SYSTEM_SERIAL_NUMBER
);
116 SerialNumberPtr
= HiiGetPackageString(&gEfiCallerIdGuid
, TokenToGet
, NULL
);
117 SerialNumStrLen
= StrLen(SerialNumberPtr
);
118 if (SerialNumStrLen
> SMBIOS_STRING_MAX_LENGTH
) {
119 return EFI_UNSUPPORTED
;
122 AsciiStrToUnicodeStr ((CHAR8
*) PcdGetPtr(PcdSMBIOSSystemSKUNumber
), SKUNumber
);
123 if (StrLen (SKUNumber
) > 0) {
124 TokenToUpdate
= STRING_TOKEN (STR_MISC_SYSTEM_SKU_NUMBER
);
125 HiiSetString (mHiiHandle
, TokenToUpdate
, SKUNumber
, NULL
);
127 TokenToGet
= STRING_TOKEN (STR_MISC_SYSTEM_SKU_NUMBER
);
128 SKUNumberPtr
= HiiGetPackageString(&gEfiCallerIdGuid
, TokenToGet
, NULL
);
129 SKUNumStrLen
= StrLen(SKUNumberPtr
);
130 if (SKUNumStrLen
> SMBIOS_STRING_MAX_LENGTH
) {
131 return EFI_UNSUPPORTED
;
134 AsciiStrToUnicodeStr ((CHAR8
*) PcdGetPtr(PcdSMBIOSSystemFamily
), Family
);
135 if (StrLen (Family
) > 0) {
136 TokenToUpdate
= STRING_TOKEN (STR_MISC_SYSTEM_FAMILY
);
137 HiiSetString (mHiiHandle
, TokenToUpdate
, Family
, NULL
);
139 TokenToGet
= STRING_TOKEN (STR_MISC_SYSTEM_FAMILY
);
140 FamilyPtr
= HiiGetPackageString(&gEfiCallerIdGuid
, TokenToGet
, NULL
);
141 FamilyStrLen
= StrLen(FamilyPtr
);
142 if (FamilyStrLen
> SMBIOS_STRING_MAX_LENGTH
) {
143 return EFI_UNSUPPORTED
;
146 // Two zeros following the last string.
148 SmbiosRecord
= AllocatePool(sizeof (SMBIOS_TABLE_TYPE1
) + ManuStrLen
+ 1 + PdNameStrLen
+ 1 + VerStrLen
+ 1 + SerialNumStrLen
+ 1 + SKUNumStrLen
+ 1 + FamilyStrLen
+ 1 + 1);
149 ZeroMem(SmbiosRecord
, sizeof (SMBIOS_TABLE_TYPE1
) + ManuStrLen
+ 1 + PdNameStrLen
+ 1 + VerStrLen
+ 1 + SerialNumStrLen
+ 1 + SKUNumStrLen
+ 1 + FamilyStrLen
+ 1 + 1);
151 SmbiosRecord
->Hdr
.Type
= EFI_SMBIOS_TYPE_SYSTEM_INFORMATION
;
152 SmbiosRecord
->Hdr
.Length
= sizeof (SMBIOS_TABLE_TYPE1
);
154 // Make handle chosen by smbios protocol.add automatically.
156 SmbiosRecord
->Hdr
.Handle
= 0;
158 // Manu will be the 1st optional string following the formatted structure.
160 SmbiosRecord
->Manufacturer
= 1;
162 // ProductName will be the 2nd optional string following the formatted structure.
164 SmbiosRecord
->ProductName
= 2;
166 // Version will be the 3rd optional string following the formatted structure.
168 SmbiosRecord
->Version
= 3;
170 // Serial number will be the 4th optional string following the formatted structure.
172 SmbiosRecord
->SerialNumber
= 4;
174 // SKU number will be the 5th optional string following the formatted structure.
176 SmbiosRecord
->SKUNumber
= 5;
178 // Family will be the 6th optional string following the formatted structure.
180 SmbiosRecord
->Family
= 6;
181 CopyMem ((UINT8
*) (&SmbiosRecord
->Uuid
), (UINT8
*)PcdGetPtr(PcdSMBIOSSystemUuid
),16);
182 SmbiosRecord
->WakeUpType
= (UINT8
)ForType1InputData
->SystemWakeupType
;
184 OptionalStrStart
= (CHAR8
*)(SmbiosRecord
+ 1);
185 UnicodeStrToAsciiStr(ManufacturerPtr
, OptionalStrStart
);
186 UnicodeStrToAsciiStr(ProductNamePtr
, OptionalStrStart
+ ManuStrLen
+ 1);
187 UnicodeStrToAsciiStr(VersionPtr
, OptionalStrStart
+ ManuStrLen
+ 1 + PdNameStrLen
+ 1);
188 UnicodeStrToAsciiStr(SerialNumberPtr
, OptionalStrStart
+ ManuStrLen
+ 1 + PdNameStrLen
+ 1 + VerStrLen
+ 1);
189 UnicodeStrToAsciiStr(SKUNumberPtr
, OptionalStrStart
+ ManuStrLen
+ 1 + PdNameStrLen
+ 1 + VerStrLen
+ 1 + SerialNumStrLen
+ 1);
190 UnicodeStrToAsciiStr(FamilyPtr
, OptionalStrStart
+ ManuStrLen
+ 1 + PdNameStrLen
+ 1 + VerStrLen
+ 1 + SerialNumStrLen
+ 1 + SKUNumStrLen
+ 1);
193 // Now we have got the full smbios record, call smbios protocol to add this record.
195 SmbiosHandle
= SMBIOS_HANDLE_PI_RESERVED
;
196 Status
= Smbios
-> Add(
200 (EFI_SMBIOS_TABLE_HEADER
*) SmbiosRecord
202 FreePool(SmbiosRecord
);