3 Copyright (c) 2009 - 2014, Intel Corporation. All rights reserved.<BR>
5 SPDX-License-Identifier: BSD-2-Clause-Patent
11 MiscSystemManufacturerFunction.c
15 This driver parses the mMiscSubclassDataTable structure and reports
21 #include "CommonHeader.h"
22 #include "MiscSubclassDriver.h"
23 #include <Protocol/DxeSmmReadyToLock.h>
24 #include <Library/NetLib.h>
25 #include "Library/DebugLib.h"
26 #include <Uefi/UefiBaseType.h>
27 #include <Guid/PlatformInfo.h>
30 extern EFI_PLATFORM_INFO_HOB
*mPlatformInfo
;
35 Publish the smbios type 1.
37 @param Event Event whose notification function is being invoked (gEfiDxeSmmReadyToLockProtocolGuid).
38 @param Context Pointer to the notification functions context, which is implementation dependent.
45 AddSmbiosManuCallback (
51 CHAR8
*OptionalStrStart
;
55 UINTN SerialNumStrLen
;
56 UINTN SkuNumberStrLen
;
57 UINTN FamilyNameStrLen
;
59 EFI_STRING Manufacturer
;
60 EFI_STRING ProductName
;
62 EFI_STRING SerialNumber
;
64 EFI_STRING FamilyName
;
65 STRING_REF TokenToGet
;
66 EFI_SMBIOS_HANDLE SmbiosHandle
;
67 SMBIOS_TABLE_TYPE1
*SmbiosRecord
;
68 EFI_MISC_SYSTEM_MANUFACTURER
*ForType1InputData
;
69 EFI_SMBIOS_PROTOCOL
*Smbios
;
75 CHAR16 PlatformNameBuffer
[40];
77 ForType1InputData
= (EFI_MISC_SYSTEM_MANUFACTURER
*)Context
;
80 // First check for invalid parameters.
82 if (Context
== NULL
|| mPlatformInfo
== NULL
) {
83 return EFI_INVALID_PARAMETER
;
86 Status
= gBS
->LocateProtocol (&gEfiSmbiosProtocolGuid
, NULL
, (VOID
*) &Smbios
);
87 ASSERT_EFI_ERROR (Status
);
90 if (BOARD_ID_MINNOW2_TURBOT
== mPlatformInfo
->BoardId
) {
91 // Detect the board is Turbot board platform
92 UnicodeSPrint (PlatformNameBuffer
, sizeof (PlatformNameBuffer
),L
"%s",L
"Minnowboard Turbot ");
94 UnicodeSPrint (PlatformNameBuffer
, sizeof (PlatformNameBuffer
),L
"%s",L
"Minnowboard Max ");
100 switch (PchStepping()) {
102 UnicodeSPrint (Buffer
, sizeof (Buffer
),L
"%s%s", PlatformNameBuffer
, L
"A0 PLATFORM");
103 HiiSetString(mHiiHandle
,STRING_TOKEN(STR_MISC_SYSTEM_PRODUCT_NAME
), Buffer
, NULL
);
104 UnicodeSPrint (Buffer
, sizeof (Buffer
),L
"%s",L
"A0");
105 HiiSetString(mHiiHandle
,STRING_TOKEN(STR_MISC_SYSTEM_VERSION
), Buffer
, NULL
);
106 DEBUG ((EFI_D_ERROR
, "A0 Stepping Detected\n"));
109 UnicodeSPrint (Buffer
, sizeof (Buffer
),L
"%s%s", PlatformNameBuffer
, L
"A1 PLATFORM");
110 HiiSetString(mHiiHandle
,STRING_TOKEN(STR_MISC_SYSTEM_PRODUCT_NAME
), Buffer
, NULL
);
111 UnicodeSPrint (Buffer
, sizeof (Buffer
),L
"%s",L
"A1");
112 HiiSetString(mHiiHandle
,STRING_TOKEN(STR_MISC_SYSTEM_VERSION
), Buffer
, NULL
);
113 DEBUG ((EFI_D_ERROR
, "A1 Stepping Detected\n"));
116 UnicodeSPrint (Buffer
, sizeof (Buffer
),L
"%s%s", PlatformNameBuffer
, L
"B0 PLATFORM");
117 HiiSetString(mHiiHandle
,STRING_TOKEN(STR_MISC_SYSTEM_PRODUCT_NAME
), Buffer
, NULL
);
118 UnicodeSPrint (Buffer
, sizeof (Buffer
),L
"%s",L
"B0");
119 HiiSetString(mHiiHandle
,STRING_TOKEN(STR_MISC_SYSTEM_VERSION
), Buffer
, NULL
);
120 DEBUG ((EFI_D_ERROR
, "B0 Stepping Detected\n"));
123 UnicodeSPrint (Buffer
, sizeof (Buffer
),L
"%s%s", PlatformNameBuffer
, L
"B1 PLATFORM");
124 HiiSetString(mHiiHandle
,STRING_TOKEN(STR_MISC_SYSTEM_PRODUCT_NAME
), Buffer
, NULL
);
125 UnicodeSPrint (Buffer
, sizeof (Buffer
),L
"%s",L
"B1");
126 HiiSetString(mHiiHandle
,STRING_TOKEN(STR_MISC_SYSTEM_VERSION
), Buffer
, NULL
);
127 DEBUG ((EFI_D_ERROR
, "B1 Stepping Detected\n"));
130 UnicodeSPrint (Buffer
, sizeof (Buffer
),L
"%s%s", PlatformNameBuffer
, L
"B2 PLATFORM");
131 HiiSetString(mHiiHandle
,STRING_TOKEN(STR_MISC_SYSTEM_PRODUCT_NAME
), Buffer
, NULL
);
132 UnicodeSPrint (Buffer
, sizeof (Buffer
),L
"%s",L
"B2");
133 HiiSetString(mHiiHandle
,STRING_TOKEN(STR_MISC_SYSTEM_VERSION
), Buffer
, NULL
);
134 DEBUG ((EFI_D_ERROR
, "B2 Stepping Detected\n"));
137 UnicodeSPrint (Buffer
, sizeof (Buffer
),L
"%s%s", PlatformNameBuffer
, L
"B3 PLATFORM");
138 HiiSetString(mHiiHandle
,STRING_TOKEN(STR_MISC_SYSTEM_PRODUCT_NAME
), Buffer
, NULL
);
139 UnicodeSPrint (Buffer
, sizeof (Buffer
),L
"%s",L
"B3");
140 HiiSetString(mHiiHandle
,STRING_TOKEN(STR_MISC_SYSTEM_VERSION
), Buffer
, NULL
);
141 DEBUG ((EFI_D_ERROR
, "B3 Stepping Detected\n"));
144 UnicodeSPrint (Buffer
, sizeof (Buffer
),L
"%s%s", PlatformNameBuffer
, L
"C0 PLATFORM");
145 HiiSetString(mHiiHandle
,STRING_TOKEN(STR_MISC_SYSTEM_PRODUCT_NAME
), Buffer
, NULL
);
146 UnicodeSPrint (Buffer
, sizeof (Buffer
),L
"%s",L
"C0");
147 HiiSetString(mHiiHandle
,STRING_TOKEN(STR_MISC_SYSTEM_VERSION
), Buffer
, NULL
);
148 DEBUG ((EFI_D_ERROR
, "C0 Stepping Detected\n"));
151 UnicodeSPrint (Buffer
, sizeof (Buffer
),L
"%s%s", PlatformNameBuffer
, L
"D0 PLATFORM");
152 HiiSetString(mHiiHandle
,STRING_TOKEN(STR_MISC_SYSTEM_PRODUCT_NAME
), Buffer
, NULL
);
153 UnicodeSPrint (Buffer
, sizeof (Buffer
),L
"%s",L
"D0");
154 HiiSetString(mHiiHandle
,STRING_TOKEN(STR_MISC_SYSTEM_VERSION
), Buffer
, NULL
);
155 DEBUG ((EFI_D_ERROR
, "D0 Stepping Detected\n"));
158 DEBUG ((EFI_D_ERROR
, "Unknow Stepping Detected\n"));
162 if (BOARD_ID_MINNOW2_TURBOT
== mPlatformInfo
->BoardId
) {
163 UnicodeSPrint (Buffer
, sizeof (Buffer
),L
"ADI");
164 HiiSetString(mHiiHandle
,STRING_TOKEN(STR_MISC_SYSTEM_MANUFACTURER
), Buffer
, NULL
);
166 TokenToGet
= STRING_TOKEN (STR_MISC_SYSTEM_MANUFACTURER
);
167 Manufacturer
= SmbiosMiscGetString (TokenToGet
);
168 ManuStrLen
= StrLen(Manufacturer
);
169 if (ManuStrLen
> SMBIOS_STRING_MAX_LENGTH
) {
170 return EFI_UNSUPPORTED
;
173 TokenToGet
= STRING_TOKEN (STR_MISC_SYSTEM_PRODUCT_NAME
);
174 ProductName
= SmbiosMiscGetString (TokenToGet
);
175 PdNameStrLen
= StrLen(ProductName
);
176 if (PdNameStrLen
> SMBIOS_STRING_MAX_LENGTH
) {
177 return EFI_UNSUPPORTED
;
180 TokenToGet
= STRING_TOKEN (STR_MISC_SYSTEM_VERSION
);
181 Version
= SmbiosMiscGetString (TokenToGet
);
182 VerStrLen
= StrLen(Version
);
183 if (VerStrLen
> SMBIOS_STRING_MAX_LENGTH
) {
184 return EFI_UNSUPPORTED
;
188 //Get handle infomation
192 Status
= gBS
->LocateHandle (
194 &gEfiSimpleNetworkProtocolGuid
,
200 if (Status
== EFI_BUFFER_TOO_SMALL
) {
201 Handles
= AllocateZeroPool(BufferSize
);
202 if (Handles
== NULL
) {
203 return (EFI_OUT_OF_RESOURCES
);
205 Status
= gBS
->LocateHandle(
207 &gEfiSimpleNetworkProtocolGuid
,
217 Status
= NetLibGetMacString (
222 if (EFI_ERROR (Status
)) {
225 SerialNumber
= MacStr
;
226 SerialNumStrLen
= StrLen(SerialNumber
);
227 if (SerialNumStrLen
> SMBIOS_STRING_MAX_LENGTH
) {
228 return EFI_UNSUPPORTED
;
230 TokenToGet
= STRING_TOKEN (STR_MISC_SYSTEM_SKU_NUMBER
);
231 SkuNumber
= SmbiosMiscGetString (TokenToGet
);
232 SkuNumberStrLen
= StrLen(SkuNumber
);
233 if (SkuNumberStrLen
> SMBIOS_STRING_MAX_LENGTH
) {
234 return EFI_UNSUPPORTED
;
236 TokenToGet
= STRING_TOKEN (STR_MISC_SYSTEM_FAMILY_NAME1
);
237 FamilyName
= SmbiosMiscGetString (TokenToGet
);
238 FamilyNameStrLen
= StrLen(FamilyName
);
239 if (FamilyNameStrLen
> SMBIOS_STRING_MAX_LENGTH
) {
240 return EFI_UNSUPPORTED
;
244 // Two zeros following the last string.
246 SmbiosRecord
= AllocatePool(sizeof (SMBIOS_TABLE_TYPE1
) + ManuStrLen
+ 1 + PdNameStrLen
+ 1 + VerStrLen
+ 1 + SerialNumStrLen
+ 1 + SkuNumberStrLen
+ 1 + FamilyNameStrLen
+ 1 + 1);
247 ZeroMem(SmbiosRecord
, sizeof (SMBIOS_TABLE_TYPE1
) + ManuStrLen
+ 1 + PdNameStrLen
+ 1 + VerStrLen
+ 1 + SerialNumStrLen
+ 1 + SkuNumberStrLen
+ 1 + FamilyNameStrLen
+ 1 + 1);
249 SmbiosRecord
->Hdr
.Type
= EFI_SMBIOS_TYPE_SYSTEM_INFORMATION
;
250 SmbiosRecord
->Hdr
.Length
= sizeof (SMBIOS_TABLE_TYPE1
);
253 // Make handle chosen by smbios protocol.add automatically.
255 SmbiosRecord
->Hdr
.Handle
= 0;
258 // Manu will be the 1st optional string following the formatted structure.
260 SmbiosRecord
->Manufacturer
= 1;
263 // ProductName will be the 2nd optional string following the formatted structure.
265 SmbiosRecord
->ProductName
= 2;
268 // Version will be the 3rd optional string following the formatted structure.
270 SmbiosRecord
->Version
= 3;
273 // Version will be the 4th optional string following the formatted structure.
275 SmbiosRecord
->SerialNumber
= 4;
277 SmbiosRecord
->SKUNumber
= 5;
278 SmbiosRecord
->Family
= 6;
283 ForType1InputData
->SystemUuid
.Data1
= PcdGet32 (PcdProductSerialNumber
);
284 ForType1InputData
->SystemUuid
.Data4
[0] = PcdGet8 (PcdEmmcManufacturerId
);
286 CopyMem ((UINT8
*) (&SmbiosRecord
->Uuid
),&ForType1InputData
->SystemUuid
,16);
288 SmbiosRecord
->WakeUpType
= (UINT8
)ForType1InputData
->SystemWakeupType
;
290 OptionalStrStart
= (CHAR8
*)(SmbiosRecord
+ 1);
291 UnicodeStrToAsciiStr(Manufacturer
, OptionalStrStart
);
292 UnicodeStrToAsciiStr(ProductName
, OptionalStrStart
+ ManuStrLen
+ 1);
293 UnicodeStrToAsciiStr(Version
, OptionalStrStart
+ ManuStrLen
+ 1 + PdNameStrLen
+ 1);
294 UnicodeStrToAsciiStr(SerialNumber
, OptionalStrStart
+ ManuStrLen
+ 1 + PdNameStrLen
+ 1 + VerStrLen
+ 1);
296 UnicodeStrToAsciiStr(SkuNumber
, OptionalStrStart
+ ManuStrLen
+ 1 + PdNameStrLen
+ 1 + VerStrLen
+ 1 + SerialNumStrLen
+ 1);
297 UnicodeStrToAsciiStr(FamilyName
, OptionalStrStart
+ ManuStrLen
+ 1 + PdNameStrLen
+ 1 + VerStrLen
+ 1 + SerialNumStrLen
+ 1 + SkuNumberStrLen
+1);
300 // Now we have got the full smbios record, call smbios protocol to add this record.
302 SmbiosHandle
= SMBIOS_HANDLE_PI_RESERVED
;
303 Status
= Smbios
-> Add(
307 (EFI_SMBIOS_TABLE_HEADER
*) SmbiosRecord
309 FreePool(SmbiosRecord
);
314 This function makes boot time changes to the contents of the
315 MiscSystemManufacturer (Type 1).
317 @param RecordData Pointer to copy of RecordData from the Data Table.
319 @retval EFI_SUCCESS All parameters were valid.
320 @retval EFI_UNSUPPORTED Unexpected RecordType value.
321 @retval EFI_INVALID_PARAMETER Invalid parameter was found.
324 MISC_SMBIOS_TABLE_FUNCTION(MiscSystemManufacturer
)
327 static BOOLEAN CallbackIsInstalledManu
= FALSE
;
328 VOID
*AddSmbiosManuCallbackNotifyReg
;
329 EFI_EVENT AddSmbiosManuCallbackEvent
;
332 if (CallbackIsInstalledManu
== FALSE
) {
333 CallbackIsInstalledManu
= TRUE
; // Prevent more than 1 callback.
334 DEBUG ((EFI_D_INFO
, "Create Smbios Manu callback.\n"));
337 // gEfiDxeSmmReadyToLockProtocolGuid is ready
339 Status
= gBS
->CreateEvent (
342 (EFI_EVENT_NOTIFY
)AddSmbiosManuCallback
,
344 &AddSmbiosManuCallbackEvent
347 ASSERT_EFI_ERROR (Status
);
348 if (EFI_ERROR (Status
)) {
353 Status
= gBS
->RegisterProtocolNotify (
354 &gEfiDxeSmmReadyToLockProtocolGuid
,
355 AddSmbiosManuCallbackEvent
,
356 &AddSmbiosManuCallbackNotifyReg