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>
33 #include <Guid/PlatformInfo.h>
36 extern EFI_PLATFORM_INFO_HOB
*mPlatformInfo
;
41 Publish the smbios type 1.
43 @param Event Event whose notification function is being invoked (gEfiDxeSmmReadyToLockProtocolGuid).
44 @param Context Pointer to the notification functions context, which is implementation dependent.
51 AddSmbiosManuCallback (
57 CHAR8
*OptionalStrStart
;
61 UINTN SerialNumStrLen
;
62 UINTN SkuNumberStrLen
;
63 UINTN FamilyNameStrLen
;
65 EFI_STRING Manufacturer
;
66 EFI_STRING ProductName
;
68 EFI_STRING SerialNumber
;
70 EFI_STRING FamilyName
;
71 STRING_REF TokenToGet
;
72 EFI_SMBIOS_HANDLE SmbiosHandle
;
73 SMBIOS_TABLE_TYPE1
*SmbiosRecord
;
74 EFI_MISC_SYSTEM_MANUFACTURER
*ForType1InputData
;
75 EFI_SMBIOS_PROTOCOL
*Smbios
;
81 CHAR16 PlatformNameBuffer
[40];
83 ForType1InputData
= (EFI_MISC_SYSTEM_MANUFACTURER
*)Context
;
86 // First check for invalid parameters.
88 if (Context
== NULL
|| mPlatformInfo
== NULL
) {
89 return EFI_INVALID_PARAMETER
;
92 Status
= gBS
->LocateProtocol (&gEfiSmbiosProtocolGuid
, NULL
, (VOID
*) &Smbios
);
93 ASSERT_EFI_ERROR (Status
);
96 if (BOARD_ID_MINNOW2_TURBOT
== mPlatformInfo
->BoardId
) {
97 // Detect the board is Turbot board platform
98 UnicodeSPrint (PlatformNameBuffer
, sizeof (PlatformNameBuffer
),L
"%s",L
"Minnowboard Turbot ");
100 UnicodeSPrint (PlatformNameBuffer
, sizeof (PlatformNameBuffer
),L
"%s",L
"Minnowboard Max ");
106 switch (PchStepping()) {
108 UnicodeSPrint (Buffer
, sizeof (Buffer
),L
"%s%s", PlatformNameBuffer
, L
"A0 PLATFORM");
109 HiiSetString(mHiiHandle
,STRING_TOKEN(STR_MISC_SYSTEM_PRODUCT_NAME
), Buffer
, NULL
);
110 UnicodeSPrint (Buffer
, sizeof (Buffer
),L
"%s",L
"A0");
111 HiiSetString(mHiiHandle
,STRING_TOKEN(STR_MISC_SYSTEM_VERSION
), Buffer
, NULL
);
112 DEBUG ((EFI_D_ERROR
, "A0 Stepping Detected\n"));
115 UnicodeSPrint (Buffer
, sizeof (Buffer
),L
"%s%s", PlatformNameBuffer
, L
"A1 PLATFORM");
116 HiiSetString(mHiiHandle
,STRING_TOKEN(STR_MISC_SYSTEM_PRODUCT_NAME
), Buffer
, NULL
);
117 UnicodeSPrint (Buffer
, sizeof (Buffer
),L
"%s",L
"A1");
118 HiiSetString(mHiiHandle
,STRING_TOKEN(STR_MISC_SYSTEM_VERSION
), Buffer
, NULL
);
119 DEBUG ((EFI_D_ERROR
, "A1 Stepping Detected\n"));
122 UnicodeSPrint (Buffer
, sizeof (Buffer
),L
"%s%s", PlatformNameBuffer
, L
"B0 PLATFORM");
123 HiiSetString(mHiiHandle
,STRING_TOKEN(STR_MISC_SYSTEM_PRODUCT_NAME
), Buffer
, NULL
);
124 UnicodeSPrint (Buffer
, sizeof (Buffer
),L
"%s",L
"B0");
125 HiiSetString(mHiiHandle
,STRING_TOKEN(STR_MISC_SYSTEM_VERSION
), Buffer
, NULL
);
126 DEBUG ((EFI_D_ERROR
, "B0 Stepping Detected\n"));
129 UnicodeSPrint (Buffer
, sizeof (Buffer
),L
"%s%s", PlatformNameBuffer
, L
"B1 PLATFORM");
130 HiiSetString(mHiiHandle
,STRING_TOKEN(STR_MISC_SYSTEM_PRODUCT_NAME
), Buffer
, NULL
);
131 UnicodeSPrint (Buffer
, sizeof (Buffer
),L
"%s",L
"B1");
132 HiiSetString(mHiiHandle
,STRING_TOKEN(STR_MISC_SYSTEM_VERSION
), Buffer
, NULL
);
133 DEBUG ((EFI_D_ERROR
, "B1 Stepping Detected\n"));
136 UnicodeSPrint (Buffer
, sizeof (Buffer
),L
"%s%s", PlatformNameBuffer
, L
"B2 PLATFORM");
137 HiiSetString(mHiiHandle
,STRING_TOKEN(STR_MISC_SYSTEM_PRODUCT_NAME
), Buffer
, NULL
);
138 UnicodeSPrint (Buffer
, sizeof (Buffer
),L
"%s",L
"B2");
139 HiiSetString(mHiiHandle
,STRING_TOKEN(STR_MISC_SYSTEM_VERSION
), Buffer
, NULL
);
140 DEBUG ((EFI_D_ERROR
, "B2 Stepping Detected\n"));
143 UnicodeSPrint (Buffer
, sizeof (Buffer
),L
"%s%s", PlatformNameBuffer
, L
"B3 PLATFORM");
144 HiiSetString(mHiiHandle
,STRING_TOKEN(STR_MISC_SYSTEM_PRODUCT_NAME
), Buffer
, NULL
);
145 UnicodeSPrint (Buffer
, sizeof (Buffer
),L
"%s",L
"B3");
146 HiiSetString(mHiiHandle
,STRING_TOKEN(STR_MISC_SYSTEM_VERSION
), Buffer
, NULL
);
147 DEBUG ((EFI_D_ERROR
, "B3 Stepping Detected\n"));
150 UnicodeSPrint (Buffer
, sizeof (Buffer
),L
"%s%s", PlatformNameBuffer
, L
"C0 PLATFORM");
151 HiiSetString(mHiiHandle
,STRING_TOKEN(STR_MISC_SYSTEM_PRODUCT_NAME
), Buffer
, NULL
);
152 UnicodeSPrint (Buffer
, sizeof (Buffer
),L
"%s",L
"C0");
153 HiiSetString(mHiiHandle
,STRING_TOKEN(STR_MISC_SYSTEM_VERSION
), Buffer
, NULL
);
154 DEBUG ((EFI_D_ERROR
, "C0 Stepping Detected\n"));
157 UnicodeSPrint (Buffer
, sizeof (Buffer
),L
"%s%s", PlatformNameBuffer
, L
"D0 PLATFORM");
158 HiiSetString(mHiiHandle
,STRING_TOKEN(STR_MISC_SYSTEM_PRODUCT_NAME
), Buffer
, NULL
);
159 UnicodeSPrint (Buffer
, sizeof (Buffer
),L
"%s",L
"D0");
160 HiiSetString(mHiiHandle
,STRING_TOKEN(STR_MISC_SYSTEM_VERSION
), Buffer
, NULL
);
161 DEBUG ((EFI_D_ERROR
, "D0 Stepping Detected\n"));
164 DEBUG ((EFI_D_ERROR
, "Unknow Stepping Detected\n"));
168 if (BOARD_ID_MINNOW2_TURBOT
== mPlatformInfo
->BoardId
) {
169 UnicodeSPrint (Buffer
, sizeof (Buffer
),L
"ADI");
170 HiiSetString(mHiiHandle
,STRING_TOKEN(STR_MISC_SYSTEM_MANUFACTURER
), Buffer
, NULL
);
172 TokenToGet
= STRING_TOKEN (STR_MISC_SYSTEM_MANUFACTURER
);
173 Manufacturer
= SmbiosMiscGetString (TokenToGet
);
174 ManuStrLen
= StrLen(Manufacturer
);
175 if (ManuStrLen
> SMBIOS_STRING_MAX_LENGTH
) {
176 return EFI_UNSUPPORTED
;
179 TokenToGet
= STRING_TOKEN (STR_MISC_SYSTEM_PRODUCT_NAME
);
180 ProductName
= SmbiosMiscGetString (TokenToGet
);
181 PdNameStrLen
= StrLen(ProductName
);
182 if (PdNameStrLen
> SMBIOS_STRING_MAX_LENGTH
) {
183 return EFI_UNSUPPORTED
;
186 TokenToGet
= STRING_TOKEN (STR_MISC_SYSTEM_VERSION
);
187 Version
= SmbiosMiscGetString (TokenToGet
);
188 VerStrLen
= StrLen(Version
);
189 if (VerStrLen
> SMBIOS_STRING_MAX_LENGTH
) {
190 return EFI_UNSUPPORTED
;
194 //Get handle infomation
198 Status
= gBS
->LocateHandle (
200 &gEfiSimpleNetworkProtocolGuid
,
206 if (Status
== EFI_BUFFER_TOO_SMALL
) {
207 Handles
= AllocateZeroPool(BufferSize
);
208 if (Handles
== NULL
) {
209 return (EFI_OUT_OF_RESOURCES
);
211 Status
= gBS
->LocateHandle(
213 &gEfiSimpleNetworkProtocolGuid
,
223 Status
= NetLibGetMacString (
228 if (EFI_ERROR (Status
)) {
231 SerialNumber
= MacStr
;
232 SerialNumStrLen
= StrLen(SerialNumber
);
233 if (SerialNumStrLen
> SMBIOS_STRING_MAX_LENGTH
) {
234 return EFI_UNSUPPORTED
;
236 TokenToGet
= STRING_TOKEN (STR_MISC_SYSTEM_SKU_NUMBER
);
237 SkuNumber
= SmbiosMiscGetString (TokenToGet
);
238 SkuNumberStrLen
= StrLen(SkuNumber
);
239 if (SkuNumberStrLen
> SMBIOS_STRING_MAX_LENGTH
) {
240 return EFI_UNSUPPORTED
;
242 TokenToGet
= STRING_TOKEN (STR_MISC_SYSTEM_FAMILY_NAME1
);
243 FamilyName
= SmbiosMiscGetString (TokenToGet
);
244 FamilyNameStrLen
= StrLen(FamilyName
);
245 if (FamilyNameStrLen
> SMBIOS_STRING_MAX_LENGTH
) {
246 return EFI_UNSUPPORTED
;
250 // Two zeros following the last string.
252 SmbiosRecord
= AllocatePool(sizeof (SMBIOS_TABLE_TYPE1
) + ManuStrLen
+ 1 + PdNameStrLen
+ 1 + VerStrLen
+ 1 + SerialNumStrLen
+ 1 + SkuNumberStrLen
+ 1 + FamilyNameStrLen
+ 1 + 1);
253 ZeroMem(SmbiosRecord
, sizeof (SMBIOS_TABLE_TYPE1
) + ManuStrLen
+ 1 + PdNameStrLen
+ 1 + VerStrLen
+ 1 + SerialNumStrLen
+ 1 + SkuNumberStrLen
+ 1 + FamilyNameStrLen
+ 1 + 1);
255 SmbiosRecord
->Hdr
.Type
= EFI_SMBIOS_TYPE_SYSTEM_INFORMATION
;
256 SmbiosRecord
->Hdr
.Length
= sizeof (SMBIOS_TABLE_TYPE1
);
259 // Make handle chosen by smbios protocol.add automatically.
261 SmbiosRecord
->Hdr
.Handle
= 0;
264 // Manu will be the 1st optional string following the formatted structure.
266 SmbiosRecord
->Manufacturer
= 1;
269 // ProductName will be the 2nd optional string following the formatted structure.
271 SmbiosRecord
->ProductName
= 2;
274 // Version will be the 3rd optional string following the formatted structure.
276 SmbiosRecord
->Version
= 3;
279 // Version will be the 4th optional string following the formatted structure.
281 SmbiosRecord
->SerialNumber
= 4;
283 SmbiosRecord
->SKUNumber
= 5;
284 SmbiosRecord
->Family
= 6;
289 ForType1InputData
->SystemUuid
.Data1
= PcdGet32 (PcdProductSerialNumber
);
290 ForType1InputData
->SystemUuid
.Data4
[0] = PcdGet8 (PcdEmmcManufacturerId
);
292 CopyMem ((UINT8
*) (&SmbiosRecord
->Uuid
),&ForType1InputData
->SystemUuid
,16);
294 SmbiosRecord
->WakeUpType
= (UINT8
)ForType1InputData
->SystemWakeupType
;
296 OptionalStrStart
= (CHAR8
*)(SmbiosRecord
+ 1);
297 UnicodeStrToAsciiStr(Manufacturer
, OptionalStrStart
);
298 UnicodeStrToAsciiStr(ProductName
, OptionalStrStart
+ ManuStrLen
+ 1);
299 UnicodeStrToAsciiStr(Version
, OptionalStrStart
+ ManuStrLen
+ 1 + PdNameStrLen
+ 1);
300 UnicodeStrToAsciiStr(SerialNumber
, OptionalStrStart
+ ManuStrLen
+ 1 + PdNameStrLen
+ 1 + VerStrLen
+ 1);
302 UnicodeStrToAsciiStr(SkuNumber
, OptionalStrStart
+ ManuStrLen
+ 1 + PdNameStrLen
+ 1 + VerStrLen
+ 1 + SerialNumStrLen
+ 1);
303 UnicodeStrToAsciiStr(FamilyName
, OptionalStrStart
+ ManuStrLen
+ 1 + PdNameStrLen
+ 1 + VerStrLen
+ 1 + SerialNumStrLen
+ 1 + SkuNumberStrLen
+1);
306 // Now we have got the full smbios record, call smbios protocol to add this record.
308 SmbiosHandle
= SMBIOS_HANDLE_PI_RESERVED
;
309 Status
= Smbios
-> Add(
313 (EFI_SMBIOS_TABLE_HEADER
*) SmbiosRecord
315 FreePool(SmbiosRecord
);
320 This function makes boot time changes to the contents of the
321 MiscSystemManufacturer (Type 1).
323 @param RecordData Pointer to copy of RecordData from the Data Table.
325 @retval EFI_SUCCESS All parameters were valid.
326 @retval EFI_UNSUPPORTED Unexpected RecordType value.
327 @retval EFI_INVALID_PARAMETER Invalid parameter was found.
330 MISC_SMBIOS_TABLE_FUNCTION(MiscSystemManufacturer
)
333 static BOOLEAN CallbackIsInstalledManu
= FALSE
;
334 VOID
*AddSmbiosManuCallbackNotifyReg
;
335 EFI_EVENT AddSmbiosManuCallbackEvent
;
338 if (CallbackIsInstalledManu
== FALSE
) {
339 CallbackIsInstalledManu
= TRUE
; // Prevent more than 1 callback.
340 DEBUG ((EFI_D_INFO
, "Create Smbios Manu callback.\n"));
343 // gEfiDxeSmmReadyToLockProtocolGuid is ready
345 Status
= gBS
->CreateEvent (
348 (EFI_EVENT_NOTIFY
)AddSmbiosManuCallback
,
350 &AddSmbiosManuCallbackEvent
353 ASSERT_EFI_ERROR (Status
);
354 if (EFI_ERROR (Status
)) {
359 Status
= gBS
->RegisterProtocolNotify (
360 &gEfiDxeSmmReadyToLockProtocolGuid
,
361 AddSmbiosManuCallbackEvent
,
362 &AddSmbiosManuCallbackNotifyReg