3 Copyright (c) 2009 - 2014, Intel Corporation. All rights reserved.<BR>
5 This program and the accompanying materials are licensed and made available under
6 the terms and conditions of the BSD License that accompanies this distribution.
7 The full text of the license may be found at
8 http://opensource.org/licenses/bsd-license.php.
10 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
11 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
17 MiscSystemManufacturerFunction.c
21 This driver parses the mMiscSubclassDataTable structure and reports
27 #include "CommonHeader.h"
28 #include "MiscSubclassDriver.h"
29 #include <Protocol/DxeSmmReadyToLock.h>
30 #include <Library/NetLib.h>
31 #include "Library/DebugLib.h"
32 #include <Uefi/UefiBaseType.h>
36 Publish the smbios type 1.
38 @param Event Event whose notification function is being invoked (gEfiDxeSmmReadyToLockProtocolGuid).
39 @param Context Pointer to the notification functions context, which is implementation dependent.
46 AddSmbiosManuCallback (
52 CHAR8
*OptionalStrStart
;
56 UINTN SerialNumStrLen
;
57 UINTN SkuNumberStrLen
;
58 UINTN FamilyNameStrLen
;
60 EFI_STRING Manufacturer
;
61 EFI_STRING ProductName
;
63 EFI_STRING SerialNumber
;
65 EFI_STRING FamilyName
;
66 STRING_REF TokenToGet
;
67 EFI_SMBIOS_HANDLE SmbiosHandle
;
68 SMBIOS_TABLE_TYPE1
*SmbiosRecord
;
69 EFI_MISC_SYSTEM_MANUFACTURER
*ForType1InputData
;
70 EFI_SMBIOS_PROTOCOL
*Smbios
;
77 ForType1InputData
= (EFI_MISC_SYSTEM_MANUFACTURER
*)Context
;
80 // First check for invalid parameters.
82 if (Context
== NULL
) {
83 return EFI_INVALID_PARAMETER
;
86 Status
= gBS
->LocateProtocol (&gEfiSmbiosProtocolGuid
, NULL
, (VOID
*) &Smbios
);
87 ASSERT_EFI_ERROR (Status
);
92 switch (PchStepping()) {
94 UnicodeSPrint (Buffer
, sizeof (Buffer
),L
"%s",L
"MinnowBoard MAX A0 PLATFORM");
95 HiiSetString(mHiiHandle
,STRING_TOKEN(STR_MISC_SYSTEM_PRODUCT_NAME
), Buffer
, NULL
);
96 UnicodeSPrint (Buffer
, sizeof (Buffer
),L
"%s",L
"A0");
97 HiiSetString(mHiiHandle
,STRING_TOKEN(STR_MISC_SYSTEM_VERSION
), Buffer
, NULL
);
98 DEBUG ((EFI_D_ERROR
, "A0 Stepping Detected\n"));
101 UnicodeSPrint (Buffer
, sizeof (Buffer
),L
"%s",L
"MinnowBoard MAX A1 PLATFORM");
102 HiiSetString(mHiiHandle
,STRING_TOKEN(STR_MISC_SYSTEM_PRODUCT_NAME
), Buffer
, NULL
);
103 UnicodeSPrint (Buffer
, sizeof (Buffer
),L
"%s",L
"A1");
104 HiiSetString(mHiiHandle
,STRING_TOKEN(STR_MISC_SYSTEM_VERSION
), Buffer
, NULL
);
105 DEBUG ((EFI_D_ERROR
, "A1 Stepping Detected\n"));
108 UnicodeSPrint (Buffer
, sizeof (Buffer
),L
"%s",L
"MinnowBoard MAX B0 PLATFORM");
109 HiiSetString(mHiiHandle
,STRING_TOKEN(STR_MISC_SYSTEM_PRODUCT_NAME
), Buffer
, NULL
);
110 UnicodeSPrint (Buffer
, sizeof (Buffer
),L
"%s",L
"B0");
111 HiiSetString(mHiiHandle
,STRING_TOKEN(STR_MISC_SYSTEM_VERSION
), Buffer
, NULL
);
112 DEBUG ((EFI_D_ERROR
, "B0 Stepping Detected\n"));
115 UnicodeSPrint (Buffer
, sizeof (Buffer
),L
"%s",L
"MinnowBoard MAX B1 PLATFORM");
116 HiiSetString(mHiiHandle
,STRING_TOKEN(STR_MISC_SYSTEM_PRODUCT_NAME
), Buffer
, NULL
);
117 UnicodeSPrint (Buffer
, sizeof (Buffer
),L
"%s",L
"B1");
118 HiiSetString(mHiiHandle
,STRING_TOKEN(STR_MISC_SYSTEM_VERSION
), Buffer
, NULL
);
119 DEBUG ((EFI_D_ERROR
, "B1 Stepping Detected\n"));
122 UnicodeSPrint (Buffer
, sizeof (Buffer
),L
"%s",L
"MinnowBoard MAX B2 PLATFORM");
123 HiiSetString(mHiiHandle
,STRING_TOKEN(STR_MISC_SYSTEM_PRODUCT_NAME
), Buffer
, NULL
);
124 UnicodeSPrint (Buffer
, sizeof (Buffer
),L
"%s",L
"B2");
125 HiiSetString(mHiiHandle
,STRING_TOKEN(STR_MISC_SYSTEM_VERSION
), Buffer
, NULL
);
126 DEBUG ((EFI_D_ERROR
, "B2 Stepping Detected\n"));
129 UnicodeSPrint (Buffer
, sizeof (Buffer
),L
"%s",L
"MinnowBoard MAX B3 PLATFORM");
130 HiiSetString(mHiiHandle
,STRING_TOKEN(STR_MISC_SYSTEM_PRODUCT_NAME
), Buffer
, NULL
);
131 UnicodeSPrint (Buffer
, sizeof (Buffer
),L
"%s",L
"B3");
132 HiiSetString(mHiiHandle
,STRING_TOKEN(STR_MISC_SYSTEM_VERSION
), Buffer
, NULL
);
133 DEBUG ((EFI_D_ERROR
, "B3 Stepping Detected\n"));
136 UnicodeSPrint (Buffer
, sizeof (Buffer
),L
"%s",L
"MinnowBoard MAX C0 PLATFORM");
137 HiiSetString(mHiiHandle
,STRING_TOKEN(STR_MISC_SYSTEM_PRODUCT_NAME
), Buffer
, NULL
);
138 UnicodeSPrint (Buffer
, sizeof (Buffer
),L
"%s",L
"C0");
139 HiiSetString(mHiiHandle
,STRING_TOKEN(STR_MISC_SYSTEM_VERSION
), Buffer
, NULL
);
140 DEBUG ((EFI_D_ERROR
, "C0 Stepping Detected\n"));
143 UnicodeSPrint (Buffer
, sizeof (Buffer
),L
"%s",L
"MinnowBoard MAX D0 PLATFORM");
144 HiiSetString(mHiiHandle
,STRING_TOKEN(STR_MISC_SYSTEM_PRODUCT_NAME
), Buffer
, NULL
);
145 UnicodeSPrint (Buffer
, sizeof (Buffer
),L
"%s",L
"D0");
146 HiiSetString(mHiiHandle
,STRING_TOKEN(STR_MISC_SYSTEM_VERSION
), Buffer
, NULL
);
147 DEBUG ((EFI_D_ERROR
, "D0 Stepping Detected\n"));
150 DEBUG ((EFI_D_ERROR
, "Unknow Stepping Detected\n"));
155 TokenToGet
= STRING_TOKEN (STR_MISC_SYSTEM_MANUFACTURER
);
156 Manufacturer
= SmbiosMiscGetString (TokenToGet
);
157 ManuStrLen
= StrLen(Manufacturer
);
158 if (ManuStrLen
> SMBIOS_STRING_MAX_LENGTH
) {
159 return EFI_UNSUPPORTED
;
162 TokenToGet
= STRING_TOKEN (STR_MISC_SYSTEM_PRODUCT_NAME
);
163 ProductName
= SmbiosMiscGetString (TokenToGet
);
164 PdNameStrLen
= StrLen(ProductName
);
165 if (PdNameStrLen
> SMBIOS_STRING_MAX_LENGTH
) {
166 return EFI_UNSUPPORTED
;
169 TokenToGet
= STRING_TOKEN (STR_MISC_SYSTEM_VERSION
);
170 Version
= SmbiosMiscGetString (TokenToGet
);
171 VerStrLen
= StrLen(Version
);
172 if (VerStrLen
> SMBIOS_STRING_MAX_LENGTH
) {
173 return EFI_UNSUPPORTED
;
177 //Get handle infomation
181 Status
= gBS
->LocateHandle (
183 &gEfiSimpleNetworkProtocolGuid
,
189 if (Status
== EFI_BUFFER_TOO_SMALL
) {
190 Handles
= AllocateZeroPool(BufferSize
);
191 if (Handles
== NULL
) {
192 return (EFI_OUT_OF_RESOURCES
);
194 Status
= gBS
->LocateHandle(
196 &gEfiSimpleNetworkProtocolGuid
,
206 Status
= NetLibGetMacString (
211 if (EFI_ERROR (Status
)) {
214 SerialNumber
= MacStr
;
215 SerialNumStrLen
= StrLen(SerialNumber
);
216 if (SerialNumStrLen
> SMBIOS_STRING_MAX_LENGTH
) {
217 return EFI_UNSUPPORTED
;
219 TokenToGet
= STRING_TOKEN (STR_MISC_SYSTEM_SKU_NUMBER
);
220 SkuNumber
= SmbiosMiscGetString (TokenToGet
);
221 SkuNumberStrLen
= StrLen(SkuNumber
);
222 if (SkuNumberStrLen
> SMBIOS_STRING_MAX_LENGTH
) {
223 return EFI_UNSUPPORTED
;
225 TokenToGet
= STRING_TOKEN (STR_MISC_SYSTEM_FAMILY_NAME1
);
226 FamilyName
= SmbiosMiscGetString (TokenToGet
);
227 FamilyNameStrLen
= StrLen(FamilyName
);
228 if (FamilyNameStrLen
> SMBIOS_STRING_MAX_LENGTH
) {
229 return EFI_UNSUPPORTED
;
233 // Two zeros following the last string.
235 SmbiosRecord
= AllocatePool(sizeof (SMBIOS_TABLE_TYPE1
) + ManuStrLen
+ 1 + PdNameStrLen
+ 1 + VerStrLen
+ 1 + SerialNumStrLen
+ 1 + SkuNumberStrLen
+ 1 + FamilyNameStrLen
+ 1 + 1);
236 ZeroMem(SmbiosRecord
, sizeof (SMBIOS_TABLE_TYPE1
) + ManuStrLen
+ 1 + PdNameStrLen
+ 1 + VerStrLen
+ 1 + SerialNumStrLen
+ 1 + SkuNumberStrLen
+ 1 + FamilyNameStrLen
+ 1 + 1);
238 SmbiosRecord
->Hdr
.Type
= EFI_SMBIOS_TYPE_SYSTEM_INFORMATION
;
239 SmbiosRecord
->Hdr
.Length
= sizeof (SMBIOS_TABLE_TYPE1
);
242 // Make handle chosen by smbios protocol.add automatically.
244 SmbiosRecord
->Hdr
.Handle
= 0;
247 // Manu will be the 1st optional string following the formatted structure.
249 SmbiosRecord
->Manufacturer
= 1;
252 // ProductName will be the 2nd optional string following the formatted structure.
254 SmbiosRecord
->ProductName
= 2;
257 // Version will be the 3rd optional string following the formatted structure.
259 SmbiosRecord
->Version
= 3;
262 // Version will be the 4th optional string following the formatted structure.
264 SmbiosRecord
->SerialNumber
= 4;
266 SmbiosRecord
->SKUNumber
= 5;
267 SmbiosRecord
->Family
= 6;
272 ForType1InputData
->SystemUuid
.Data1
= PcdGet32 (PcdProductSerialNumber
);
273 ForType1InputData
->SystemUuid
.Data4
[0] = PcdGet8 (PcdEmmcManufacturerId
);
275 CopyMem ((UINT8
*) (&SmbiosRecord
->Uuid
),&ForType1InputData
->SystemUuid
,16);
277 SmbiosRecord
->WakeUpType
= (UINT8
)ForType1InputData
->SystemWakeupType
;
279 OptionalStrStart
= (CHAR8
*)(SmbiosRecord
+ 1);
280 UnicodeStrToAsciiStr(Manufacturer
, OptionalStrStart
);
281 UnicodeStrToAsciiStr(ProductName
, OptionalStrStart
+ ManuStrLen
+ 1);
282 UnicodeStrToAsciiStr(Version
, OptionalStrStart
+ ManuStrLen
+ 1 + PdNameStrLen
+ 1);
283 UnicodeStrToAsciiStr(SerialNumber
, OptionalStrStart
+ ManuStrLen
+ 1 + PdNameStrLen
+ 1 + VerStrLen
+ 1);
285 UnicodeStrToAsciiStr(SkuNumber
, OptionalStrStart
+ ManuStrLen
+ 1 + PdNameStrLen
+ 1 + VerStrLen
+ 1 + SerialNumStrLen
+ 1);
286 UnicodeStrToAsciiStr(FamilyName
, OptionalStrStart
+ ManuStrLen
+ 1 + PdNameStrLen
+ 1 + VerStrLen
+ 1 + SerialNumStrLen
+ 1 + SkuNumberStrLen
+1);
289 // Now we have got the full smbios record, call smbios protocol to add this record.
291 SmbiosHandle
= SMBIOS_HANDLE_PI_RESERVED
;
292 Status
= Smbios
-> Add(
296 (EFI_SMBIOS_TABLE_HEADER
*) SmbiosRecord
298 FreePool(SmbiosRecord
);
303 This function makes boot time changes to the contents of the
304 MiscSystemManufacturer (Type 1).
306 @param RecordData Pointer to copy of RecordData from the Data Table.
308 @retval EFI_SUCCESS All parameters were valid.
309 @retval EFI_UNSUPPORTED Unexpected RecordType value.
310 @retval EFI_INVALID_PARAMETER Invalid parameter was found.
313 MISC_SMBIOS_TABLE_FUNCTION(MiscSystemManufacturer
)
316 static BOOLEAN CallbackIsInstalledManu
= FALSE
;
317 VOID
*AddSmbiosManuCallbackNotifyReg
;
318 EFI_EVENT AddSmbiosManuCallbackEvent
;
321 if (CallbackIsInstalledManu
== FALSE
) {
322 CallbackIsInstalledManu
= TRUE
; // Prevent more than 1 callback.
323 DEBUG ((EFI_D_INFO
, "Create Smbios Manu callback.\n"));
326 // gEfiDxeSmmReadyToLockProtocolGuid is ready
328 Status
= gBS
->CreateEvent (
331 (EFI_EVENT_NOTIFY
)AddSmbiosManuCallback
,
333 &AddSmbiosManuCallbackEvent
336 ASSERT_EFI_ERROR (Status
);
337 if (EFI_ERROR (Status
)) {
342 Status
= gBS
->RegisterProtocolNotify (
343 &gEfiDxeSmmReadyToLockProtocolGuid
,
344 AddSmbiosManuCallbackEvent
,
345 &AddSmbiosManuCallbackNotifyReg