]> git.proxmox.com Git - mirror_edk2.git/blame - Vlv2TbltDevicePkg/SmBiosMiscDxe/MiscOemType0x94Function.c
Upload BSD-licensed Vlv2TbltDevicePkg and Vlv2DeviceRefCodePkg to
[mirror_edk2.git] / Vlv2TbltDevicePkg / SmBiosMiscDxe / MiscOemType0x94Function.c
CommitLineData
3cbfba02
DW
1/*++\r
2\r
3Copyright (c) 1999 - 2014, Intel Corporation. All rights reserved.\r
4 \r\r
5 This program and the accompanying materials are licensed and made available under\r\r
6 the terms and conditions of the BSD License that accompanies this distribution. \r\r
7 The full text of the license may be found at \r\r
8 http://opensource.org/licenses/bsd-license.php. \r\r
9 \r\r
10 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, \r\r
11 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. \r\r
12 \r\r
13\r
14\r
15\r
16Module Name:\r
17\r
18 MiscOemType0x94Function.c\r
19\r
20Abstract:\r
21\r
22 The function that processes the Smbios data type 0x94.\r
23\r
24--*/\r
25\r
26#include "CommonHeader.h"\r
27\r
28#include "MiscSubclassDriver.h"\r
29#include <Protocol/DataHub.h>\r
30#include <Library/HiiLib.h>\r
31#include <Protocol/CpuIo2.h>\r
32#include <Library/PrintLib.h>\r
33#include <Protocol/PciRootBridgeIo.h>\r
34#include <Protocol/SimpleNetwork.h>\r
35#include <Protocol/DevicePath.h>\r
36#include <Protocol/DiskInfo.h>\r
37#include <Protocol/IdeControllerInit.h>\r
38#include <Protocol/MpService.h>\r
39#include <Protocol/PchPlatformPolicy.h>\r
40#include <Protocol/CpuIo2.h>\r
41#include <Protocol/I2cBus.h>\r
42\r
43#include <Library/IoLib.h>\r
44#include <Library/I2CLib.h>\r
45#include <Library/CpuIA32.h>\r
46#include <Library/UefiRuntimeServicesTableLib.h>\r
47#include <Guid/PlatformInfo.h>\r
48#include <Guid/SetupVariable.h>\r
49#include <Guid/Vlv2Variable.h>\r
50\r
51#include "Valleyview.h"\r
52#include "VlvAccess.h"\r
53#include "PchAccess.h"\r
54#include "SetupMode.h"\r
55#include "PchCommonDefinitions.h"\r
56#include <PlatformBaseAddresses.h>\r
57\r
58typedef struct {\r
59 UINT8 RevId;\r
60 CHAR8 String[16];\r
61} SB_REV;\r
62\r
63//\r
64// Silicon Steppings\r
65//\r
66SB_REV SBRevisionTable[] = {\r
67 {V_PCH_LPC_RID_0, "(A0 Stepping)"},\r
68 {V_PCH_LPC_RID_1, "(A0 Stepping)"},\r
69 {V_PCH_LPC_RID_2, "(A1 Stepping)"},\r
70 {V_PCH_LPC_RID_3, "(A1 Stepping)"},\r
71 {V_PCH_LPC_RID_4, "(B0 Stepping)"},\r
72 {V_PCH_LPC_RID_5, "(B0 Stepping)"},\r
73 {V_PCH_LPC_RID_6, "(B1 Stepping)"},\r
74 {V_PCH_LPC_RID_7, "(B1 Stepping)"},\r
75 {V_PCH_LPC_RID_8, "(B2 Stepping)"},\r
76 {V_PCH_LPC_RID_9, "(B2 Stepping)"},\r
77 {V_PCH_LPC_RID_A, "(B3 Stepping)"},\r
78 {V_PCH_LPC_RID_B, "(B3 Stepping)"}\r
79};\r
80\r
81#define LEFT_JUSTIFY 0x01\r
82#define PREFIX_SIGN 0x02\r
83#define PREFIX_BLANK 0x04\r
84#define COMMA_TYPE 0x08\r
85#define LONG_TYPE 0x10\r
86#define PREFIX_ZERO 0x20\r
87\r
88#define ICH_REG_REV 0x08\r
89#define MSR_IA32_PLATFORM_ID 0x17\r
90#define CHARACTER_NUMBER_FOR_VALUE 30\r
91\r
92\r
93UINT8 ReadBuffer[20]; //Version report length\r
94UINT8 WriteBuffer[22] = {0x40,0x01,0x14,0x00,0x06,0x51,0x02,0x07,0,0,0,0,0,0,0,0,0,0,0,0,0,0}; //Version request\r
95\r
96/**\r
97\r
98 VSPrint worker function that prints a Value as a decimal number in Buffer\r
99\r
100 @param Buffer Location to place ascii decimal number string of Value.\r
101 @param Value Decimal value to convert to a string in Buffer.\r
102 @param Flags Flags to use in printing decimal string, see file header for details.\r
103 @param Width Width of hex value.\r
104\r
105 @retval Number of characters printed.\r
106\r
107**/\r
108UINTN\r
109EfiValueToString (\r
110 IN OUT CHAR16 *Buffer,\r
111 IN INT64 Value,\r
112 IN UINTN Flags,\r
113 IN UINTN Width\r
114 )\r
115{\r
116 CHAR16 TempBuffer[CHARACTER_NUMBER_FOR_VALUE];\r
117 CHAR16 *TempStr;\r
118 CHAR16 *BufferPtr;\r
119 UINTN Count;\r
120 UINTN ValueCharNum;\r
121 UINTN Remainder;\r
122 CHAR16 Prefix;\r
123 UINTN Index;\r
124 BOOLEAN ValueIsNegative;\r
125 UINT64 TempValue;\r
126\r
127 TempStr = TempBuffer;\r
128 BufferPtr = Buffer;\r
129 Count = 0;\r
130 ValueCharNum = 0;\r
131 ValueIsNegative = FALSE;\r
132\r
133 if (Width > CHARACTER_NUMBER_FOR_VALUE - 1) {\r
134 Width = CHARACTER_NUMBER_FOR_VALUE - 1;\r
135 }\r
136\r
137 if (Value < 0) {\r
138 Value = -Value;\r
139 ValueIsNegative = TRUE;\r
140 }\r
141\r
142 do {\r
143 TempValue = Value;\r
144 Value = (INT64)DivU64x32 ((UINT64)Value, 10);\r
145 Remainder = (UINTN)((UINT64)TempValue - 10 * Value);\r
146 *(TempStr++) = (CHAR16)(Remainder + '0');\r
147 ValueCharNum++;\r
148 Count++;\r
149 if ((Flags & COMMA_TYPE) == COMMA_TYPE) {\r
150 if (ValueCharNum % 3 == 0 && Value != 0) {\r
151 *(TempStr++) = ',';\r
152 Count++;\r
153 }\r
154 }\r
155 } while (Value != 0);\r
156\r
157 if (ValueIsNegative) {\r
158 *(TempStr++) = '-';\r
159 Count++;\r
160 }\r
161\r
162 if ((Flags & PREFIX_ZERO) && !ValueIsNegative) {\r
163 Prefix = '0';\r
164 } else {\r
165 Prefix = ' ';\r
166 }\r
167\r
168 Index = Count;\r
169 if (!(Flags & LEFT_JUSTIFY)) {\r
170 for (; Index < Width; Index++) {\r
171 *(TempStr++) = Prefix;\r
172 }\r
173 }\r
174\r
175 //\r
176 // Reverse temp string into Buffer.\r
177 //\r
178 if (Width > 0 && (UINTN) (TempStr - TempBuffer) > Width) {\r
179 TempStr = TempBuffer + Width;\r
180 }\r
181 Index = 0;\r
182 while (TempStr != TempBuffer) {\r
183 *(BufferPtr++) = *(--TempStr);\r
184 Index++;\r
185 }\r
186\r
187 *BufferPtr = 0;\r
188 return Index;\r
189}\r
190\r
191static CHAR16 mHexStr[] = { L'0', L'1', L'2', L'3', L'4', L'5', L'6', L'7',\r
192 L'8', L'9', L'A', L'B', L'C', L'D', L'E', L'F' };\r
193/**\r
194 VSPrint worker function that prints a Value as a hex number in Buffer\r
195\r
196 @param Buffer Location to place ascii hex string of Value.\r
197 @param Value Hex value to convert to a string in Buffer.\r
198 @param Flags Flags to use in printing Hex string, see file header for details.\r
199 @param Width Width of hex value.\r
200\r
201 @retval Number of characters printed.\r
202\r
203**/\r
204UINTN\r
205EfiValueToHexStr (\r
206 IN OUT CHAR16 *Buffer,\r
207 IN UINT64 Value,\r
208 IN UINTN Flags,\r
209 IN UINTN Width\r
210 )\r
211{\r
212 CHAR16 TempBuffer[CHARACTER_NUMBER_FOR_VALUE];\r
213 CHAR16 *TempStr;\r
214 CHAR16 Prefix;\r
215 CHAR16 *BufferPtr;\r
216 UINTN Count;\r
217 UINTN Index;\r
218\r
219 TempStr = TempBuffer;\r
220 BufferPtr = Buffer;\r
221\r
222 //\r
223 // Count starts at one since we will null terminate. Each iteration of the\r
224 // loop picks off one nibble. Oh yea TempStr ends up backwards\r
225 //\r
226 Count = 0;\r
227\r
228 if (Width > CHARACTER_NUMBER_FOR_VALUE - 1) {\r
229 Width = CHARACTER_NUMBER_FOR_VALUE - 1;\r
230 }\r
231\r
232 do {\r
233 Index = ((UINTN)Value & 0xf);\r
234 *(TempStr++) = mHexStr[Index];\r
235 Value = RShiftU64 (Value, 4);\r
236 Count++;\r
237 } while (Value != 0);\r
238\r
239 if (Flags & PREFIX_ZERO) {\r
240 Prefix = '0';\r
241 } else {\r
242 Prefix = ' ';\r
243 }\r
244\r
245 Index = Count;\r
246 if (!(Flags & LEFT_JUSTIFY)) {\r
247 for (; Index < Width; Index++) {\r
248 *(TempStr++) = Prefix;\r
249 }\r
250 }\r
251\r
252 //\r
253 // Reverse temp string into Buffer.\r
254 //\r
255 if (Width > 0 && (UINTN) (TempStr - TempBuffer) > Width) {\r
256 TempStr = TempBuffer + Width;\r
257 }\r
258 Index = 0;\r
259 while (TempStr != TempBuffer) {\r
260 *(BufferPtr++) = *(--TempStr);\r
261 Index++;\r
262 }\r
263\r
264 *BufferPtr = 0;\r
265 return Index;\r
266}\r
267\r
268/**\r
269 Converts MAC address to Unicode string.\r
270 The value is 64-bit and the resulting string will be 12\r
271 digit hex number in pairs of digits separated by dashes.\r
272\r
273 @param String - string that will contain the value\r
274 @param Val - value to convert\r
275\r
276**/\r
277CHAR16 *\r
278StrMacToString (\r
279 OUT CHAR16 *String,\r
280 IN EFI_MAC_ADDRESS *MacAddr,\r
281 IN UINT32 AddrSize\r
282 )\r
283{\r
284 UINT32 i;\r
285\r
286 for (i = 0; i < AddrSize; i++) {\r
287\r
288 EfiValueToHexStr (\r
289 &String[2 * i],\r
290 MacAddr->Addr[i] & 0xFF,\r
291 PREFIX_ZERO,\r
292 2\r
293 );\r
294 }\r
295\r
296 //\r
297 // Terminate the string.\r
298 //\r
299 String[2 * AddrSize] = L'\0';\r
300\r
301 return String;\r
302}\r
303\r
304\r
305\r
306EFI_STATUS\r
307TJudgeHandleIsPCIDevice(\r
308 EFI_HANDLE Handle,\r
309 UINT8 Device,\r
310 UINT8 Funs\r
311)\r
312{\r
313 EFI_STATUS Status;\r
314 EFI_DEVICE_PATH *DPath;\r
315 EFI_DEVICE_PATH *DevicePath;\r
316\r
317 Status = gBS->HandleProtocol (\r
318 Handle,\r
319 &gEfiDevicePathProtocolGuid,\r
320 (VOID **) &DPath\r
321 );\r
322 if(!EFI_ERROR(Status))\r
323 {\r
324 DevicePath = DPath;\r
325 while(!IsDevicePathEnd(DPath))\r
326 {\r
327 if((DPath->Type == HARDWARE_DEVICE_PATH) && (DPath->SubType == HW_PCI_DP))\r
328 {\r
329 PCI_DEVICE_PATH *PCIPath;\r
330\r
331 PCIPath = (PCI_DEVICE_PATH*) DPath;\r
332 DPath = NextDevicePathNode(DPath);\r
333 if(IsDevicePathEnd(DPath) && (PCIPath->Device == Device) && (PCIPath->Function == Funs))\r
334 {\r
335 return EFI_SUCCESS;\r
336 }\r
337 }\r
338 else\r
339 {\r
340 DPath = NextDevicePathNode(DPath);\r
341 }\r
342 }\r
343 }\r
344 return EFI_UNSUPPORTED;\r
345}\r
346\r
347EFI_STATUS\r
348TSearchChildHandle(\r
349 EFI_HANDLE Father,\r
350 EFI_HANDLE *Child\r
351 )\r
352{\r
353 EFI_STATUS Status;\r
354 UINTN HandleIndex;\r
355 EFI_GUID **ProtocolGuidArray = NULL;\r
356 UINTN ArrayCount;\r
357 UINTN ProtocolIndex;\r
358 UINTN OpenInfoCount;\r
359 UINTN OpenInfoIndex;\r
360 EFI_OPEN_PROTOCOL_INFORMATION_ENTRY *OpenInfo = NULL;\r
361 UINTN mHandleCount;\r
362 EFI_HANDLE *mHandleBuffer= NULL;\r
363\r
364 //\r
365 // Retrieve the list of all handles from the handle database\r
366 //\r
367 Status = gBS->LocateHandleBuffer (\r
368 AllHandles,\r
369 NULL,\r
370 NULL,\r
371 &mHandleCount,\r
372 &mHandleBuffer\r
373 );\r
374\r
375 for (HandleIndex = 0; HandleIndex < mHandleCount; HandleIndex++)\r
376 {\r
377 //\r
378 // Retrieve the list of all the protocols on each handle\r
379 //\r
380 Status = gBS->ProtocolsPerHandle (\r
381 mHandleBuffer[HandleIndex],\r
382 &ProtocolGuidArray,\r
383 &ArrayCount\r
384 );\r
385 if (!EFI_ERROR (Status))\r
386 {\r
387 for (ProtocolIndex = 0; ProtocolIndex < ArrayCount; ProtocolIndex++)\r
388 {\r
389 Status = gBS->OpenProtocolInformation (\r
390 mHandleBuffer[HandleIndex],\r
391 ProtocolGuidArray[ProtocolIndex],\r
392 &OpenInfo,\r
393 &OpenInfoCount\r
394 );\r
395 if (!EFI_ERROR (Status))\r
396 {\r
397 for (OpenInfoIndex = 0; OpenInfoIndex < OpenInfoCount; OpenInfoIndex++)\r
398 {\r
399 if(OpenInfo[OpenInfoIndex].AgentHandle == Father)\r
400 {\r
401 if ((OpenInfo[OpenInfoIndex].Attributes & EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER) == EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER)\r
402 {\r
403 *Child = mHandleBuffer[HandleIndex];\r
404 Status = EFI_SUCCESS;\r
405 goto TryReturn;\r
406 }\r
407 }\r
408 }\r
409 Status = EFI_NOT_FOUND;\r
410 }\r
411 }\r
412 if(OpenInfo != NULL)\r
413 {\r
414 FreePool(OpenInfo);\r
415 OpenInfo = NULL;\r
416 }\r
417 }\r
418 FreePool (ProtocolGuidArray);\r
419 ProtocolGuidArray = NULL;\r
420 }\r
421TryReturn:\r
422 if(OpenInfo != NULL)\r
423 {\r
424 FreePool (OpenInfo);\r
425 OpenInfo = NULL;\r
426 }\r
427 if(ProtocolGuidArray != NULL)\r
428 {\r
429 FreePool(ProtocolGuidArray);\r
430 ProtocolGuidArray = NULL;\r
431 }\r
432 if(mHandleBuffer != NULL)\r
433 {\r
434 FreePool (mHandleBuffer);\r
435 mHandleBuffer = NULL;\r
436 }\r
437 return Status;\r
438}\r
439\r
440EFI_STATUS\r
441TGetDriverName(\r
442 EFI_HANDLE Handle,\r
443 CHAR16 *Name\r
444)\r
445{\r
446 EFI_DRIVER_BINDING_PROTOCOL *BindHandle = NULL;\r
447 EFI_STATUS Status;\r
448 UINT32 Version;\r
449 UINT16 *Ptr;\r
450 Status = gBS->OpenProtocol(\r
451 Handle,\r
452 &gEfiDriverBindingProtocolGuid,\r
453 (VOID**)&BindHandle,\r
454 NULL,\r
455 NULL,\r
456 EFI_OPEN_PROTOCOL_GET_PROTOCOL\r
457 );\r
458\r
459 if (EFI_ERROR(Status))\r
460 {\r
461 return EFI_NOT_FOUND;\r
462 }\r
463\r
464 Version = BindHandle->Version;\r
465 Ptr = (UINT16*)&Version;\r
466 UnicodeSPrint(Name, 40, L"%d.%d.%d", Version >> 24 , (Version >>16)& 0x0f ,*(Ptr));\r
467 return EFI_SUCCESS;\r
468}\r
469\r
470EFI_STATUS\r
471TGetGOPDriverName(\r
472 CHAR16 *Name\r
473)\r
474{\r
475 UINTN HandleCount;\r
476 EFI_HANDLE *Handles= NULL;\r
477 UINTN Index;\r
478 EFI_STATUS Status;\r
479 EFI_HANDLE Child = 0;\r
480\r
481 Status = gBS->LocateHandleBuffer(\r
482 ByProtocol,\r
483 &gEfiDriverBindingProtocolGuid,\r
484 NULL,\r
485 &HandleCount,\r
486 &Handles\r
487 );\r
488 for (Index = 0; Index < HandleCount ; Index++)\r
489 {\r
490 Status = TSearchChildHandle(Handles[Index], &Child);\r
491 if(!EFI_ERROR(Status))\r
492 {\r
493 Status = TJudgeHandleIsPCIDevice(Child, 0x02, 0x00);\r
494 if(!EFI_ERROR(Status))\r
495 {\r
496 return TGetDriverName(Handles[Index], Name);\r
497 }\r
498 }\r
499 }\r
500 return EFI_UNSUPPORTED;\r
501}\r
502\r
503EFI_STATUS\r
504TGetTouchFirmwareVersion(\r
505 )\r
506{\r
507 EFI_STATUS rc=EFI_SUCCESS;\r
508 UINTN TouchVer = 0;\r
509 UINTN Size = sizeof(UINTN);\r
510\r
511\r
512 CHAR16 Buffer[40];\r
513\r
514 rc = gRT->GetVariable(\r
515 L"TouchVer",\r
516 &gEfiVlv2VariableGuid,\r
517 NULL,\r
518 &Size,\r
519 &TouchVer\r
520 );\r
521 if(!EFI_ERROR(rc)){\r
522 UnicodeSPrint(Buffer, sizeof(Buffer), L"%02x.%02x", (TouchVer&0xFFFF)>>8,TouchVer&0xFF);\r
523 HiiSetString(mHiiHandle, STRING_TOKEN(STR_MISC_TOUCH_VERSION), Buffer, NULL);\r
524 }\r
525\r
526 return EFI_SUCCESS;\r
527}\r
528\r
529EFI_STATUS\r
530UpdatePlatformInformation (\r
531 )\r
532{\r
533 UINT32 MicroCodeVersion;\r
534 CHAR16 Buffer[40];\r
535 UINT8 IgdVBIOSRevH;\r
536 UINT8 IgdVBIOSRevL;\r
537 UINT16 EDX;\r
538 EFI_IA32_REGISTER_SET RegSet;\r
539 EFI_LEGACY_BIOS_PROTOCOL *LegacyBios = NULL;\r
540 EFI_STATUS Status;\r
541 UINT8 CpuFlavor=0;\r
542 EFI_PEI_HOB_POINTERS GuidHob;\r
543 EFI_PLATFORM_INFO_HOB *mPlatformInfo=NULL;\r
544 UINTN NumHandles;\r
545 EFI_HANDLE *HandleBuffer;\r
546 UINTN Index;\r
547 DXE_PCH_PLATFORM_POLICY_PROTOCOL *PchPlatformPolicy;\r
548 UINTN PciD31F0RegBase;\r
549 UINT8 count;\r
550 UINT8 Data8;\r
551 UINT8 Data8_1;\r
552\r
553 CHAR16 Name[40];\r
554 UINT32 MrcVersion;\r
555\r
556 UINT8 KscFwRevH =0;\r
557 UINT8 KscFwRevL =0;\r
558\r
559 //\r
560 // Get the HOB list. If it is not present, then ASSERT.\r
561 //\r
562 GuidHob.Raw = GetHobList ();\r
563 if (GuidHob.Raw != NULL) {\r
564 if ((GuidHob.Raw = GetNextGuidHob (&gEfiPlatformInfoGuid, GuidHob.Raw)) != NULL) {\r
565 mPlatformInfo = GET_GUID_HOB_DATA (GuidHob.Guid);\r
566 }\r
567 }\r
568\r
569 //\r
570 //VBIOS version\r
571 //\r
572 Status = gBS->LocateProtocol(\r
573 &gEfiLegacyBiosProtocolGuid,\r
574 NULL,\r
575 (VOID **)&LegacyBios\r
576 );\r
577\r
578 RegSet.X.AX = 0x5f01;\r
579 Status = LegacyBios->Int86 (LegacyBios, 0x10, &RegSet);\r
580 ASSERT_EFI_ERROR(Status);\r
581\r
582 //\r
583 // simulate AMI int15 (ax=5f01) handler\r
584 // check NbInt15.asm in AMI code for asm edition\r
585 //\r
586 EDX = (UINT16)((RegSet.E.EBX >> 16) & 0xffff);\r
587 IgdVBIOSRevH = (UINT8)(((EDX & 0x0F00) >> 4) | (EDX & 0x000F));\r
588 IgdVBIOSRevL = (UINT8)(((RegSet.X.BX & 0x0F00) >> 4) | (RegSet.X.BX & 0x000F));\r
589\r
590 if (IgdVBIOSRevH==0 && IgdVBIOSRevL==0) {\r
591 HiiSetString(mHiiHandle, STRING_TOKEN(STR_CHIP_IGD_VBIOS_REV_VALUE), L"N/A", NULL);\r
592 } else {\r
593 UnicodeSPrint (Buffer, sizeof (Buffer), L"%02X%02X", IgdVBIOSRevH,IgdVBIOSRevL);\r
594 HiiSetString(mHiiHandle, STRING_TOKEN(STR_CHIP_IGD_VBIOS_REV_VALUE), Buffer, NULL);\r
595 }\r
596\r
597 Status = TGetGOPDriverName(Name);\r
598\r
599 if(!EFI_ERROR(Status))\r
600 {\r
601 HiiSetString(mHiiHandle, STRING_TOKEN(STR_MISC_GOP_VERSION), Name, NULL);\r
602 }\r
603\r
604 //\r
605 //CpuFlavor\r
606 //\r
607 //VLV\r
608 //VLV-DC Tablet 000\r
609 //VLV-QC Notebook 001\r
610 //VLV-QC Desktop 010\r
611 //\r
612 //CPU flavor\r
613 //\r
614 CpuFlavor = RShiftU64 (EfiReadMsr (MSR_IA32_PLATFORM_ID), 50) & 0x07;\r
615\r
616 switch(CpuFlavor){\r
617 case 0x0:\r
618 UnicodeSPrint (Buffer, sizeof (Buffer), L"%s (%01x)", L"VLV-DC Tablet", CpuFlavor);\r
619 break;\r
620 case 0x01:\r
621 UnicodeSPrint (Buffer, sizeof (Buffer), L"%s (%01x)", L"VLV-QC Notebook", CpuFlavor);\r
622 break;\r
623 case 0x02:\r
624 UnicodeSPrint (Buffer, sizeof (Buffer), L"%s (%01x)", L"VLV-QC Desktop", CpuFlavor);\r
625 break;\r
626 case 0x03:\r
627 UnicodeSPrint (Buffer, sizeof (Buffer), L"%s (%01x)", L"VLV-QC Notebook", CpuFlavor);\r
628 break;\r
629 default:\r
630 UnicodeSPrint (Buffer, sizeof (Buffer), L"%s (%01x)", L"Unknown CPU", CpuFlavor);\r
631 break;\r
632 }\r
633 HiiSetString(mHiiHandle,STRING_TOKEN(STR_MISC_CPU_FLAVOR_VALUE), Buffer, NULL);\r
634\r
635 if ( NULL != mPlatformInfo) {\r
636 //\r
637 // Board Id\r
638 //\r
639 UnicodeSPrint (Buffer, sizeof (Buffer), L"%x", mPlatformInfo->BoardId);\r
640 HiiSetString(mHiiHandle,STRING_TOKEN(STR_MISC_BOARD_ID_VALUE), Buffer, NULL);\r
641\r
642 //\r
643 // FAB ID\r
644 //\r
645 UnicodeSPrint (Buffer, sizeof (Buffer), L"%x", mPlatformInfo->BoardRev);\r
646 HiiSetString(mHiiHandle,STRING_TOKEN(STR_MISC_FAB_ID_VALUE), Buffer, NULL);\r
647 }\r
648\r
649 //\r
650 //Update MRC Version\r
651 //\r
652 MrcVersion = MmioRead32 (MmPciAddress (0, 0, 0, 0, 0xF0));\r
653 MrcVersion &= 0xffff;\r
654 Index = EfiValueToString (Buffer, MrcVersion/100, PREFIX_ZERO, 0);\r
655 StrCat (Buffer, L".");\r
656 EfiValueToString (Buffer + Index + 1, (MrcVersion%100)/10, PREFIX_ZERO, 0);\r
657 EfiValueToString (Buffer + Index + 2, (MrcVersion%100)%10, PREFIX_ZERO, 0);\r
658 HiiSetString(mHiiHandle,STRING_TOKEN(STR_MISC_MRC_VERSION_VALUE), Buffer, NULL);\r
659\r
660 //\r
661 //Update Soc Version\r
662 //\r
663\r
664 //\r
665 // Retrieve all instances of PCH Platform Policy protocol\r
666 //\r
667 Status = gBS->LocateHandleBuffer (\r
668 ByProtocol,\r
669 &gDxePchPlatformPolicyProtocolGuid,\r
670 NULL,\r
671 &NumHandles,\r
672 &HandleBuffer\r
673 );\r
674 if (!EFI_ERROR (Status)) {\r
675 //\r
676 // Find the matching PCH Policy protocol\r
677 //\r
678 for (Index = 0; Index < NumHandles; Index++) {\r
679 Status = gBS->HandleProtocol (\r
680 HandleBuffer[Index],\r
681 &gDxePchPlatformPolicyProtocolGuid,\r
682 (VOID **) &PchPlatformPolicy\r
683 );\r
684 if (!EFI_ERROR (Status)) {\r
685 PciD31F0RegBase = MmPciAddress (\r
686 0,\r
687 PchPlatformPolicy->BusNumber,\r
688 PCI_DEVICE_NUMBER_PCH_LPC,\r
689 PCI_FUNCTION_NUMBER_PCH_LPC,\r
690 0\r
691 );\r
692\r
693 Data8 = MmioRead8 (PciD31F0RegBase + R_PCH_LPC_RID_CC);\r
694 count = sizeof (SBRevisionTable) / sizeof (SBRevisionTable[0]);\r
695 for (Index = 0; Index < count; Index++) {\r
696 if(Data8 == SBRevisionTable[Index].RevId) {\r
697 UnicodeSPrint (Buffer, sizeof (Buffer), L"%02x %a", Data8, SBRevisionTable[Index].String);\r
698 HiiSetString(mHiiHandle,STRING_TOKEN(STR_MISC_SOC_VALUE), Buffer, NULL);\r
699 break;\r
700 }\r
701 }\r
702 break;\r
703 }\r
704 }\r
705 }\r
706\r
707 //\r
708 // Microcode Revision\r
709 //\r
710 EfiWriteMsr (EFI_MSR_IA32_BIOS_SIGN_ID, 0);\r
711 EfiCpuid (EFI_CPUID_VERSION_INFO, NULL);\r
712 MicroCodeVersion = (UINT32) RShiftU64 (EfiReadMsr (EFI_MSR_IA32_BIOS_SIGN_ID), 32);\r
713 UnicodeSPrint (Buffer, sizeof (Buffer), L"%x", MicroCodeVersion);\r
714 HiiSetString(mHiiHandle,STRING_TOKEN(STR_MISC_PROCESSOR_MICROCODE_VALUE), Buffer, NULL);\r
715\r
716\r
717 //\r
718 //Secure boot\r
719 //\r
720 Data8 = SystemConfiguration.SecureBoot;\r
721 UnicodeSPrint (Buffer, sizeof(Buffer), L"%x", Data8);\r
722 HiiSetString(mHiiHandle, STRING_TOKEN(STR_MISC_SECURE_BOOT), Buffer, NULL);\r
723\r
724 //\r
725 //Bootmode\r
726 //\r
727 BootMode = GetBootModeHob();\r
728 UnicodeSPrint (Buffer, sizeof(Buffer), L"%x", BootMode);\r
729 HiiSetString(mHiiHandle, STRING_TOKEN(STR_MISC_BOOT_MODE), Buffer, NULL);\r
730\r
731 //\r
732 //SpeedStep\r
733 //\r
734 Data8 = 1;\r
735 UnicodeSPrint (Buffer, sizeof(Buffer), L"%x", Data8);\r
736 HiiSetString(mHiiHandle, STRING_TOKEN(STR_MISC_SPEED_STEP), Buffer, NULL);\r
737\r
738 //\r
739 //CPU Turbo\r
740 //\r
741 Data8 = 2;\r
742 UnicodeSPrint (Buffer, sizeof(Buffer), L"%x", Data8);\r
743 HiiSetString(mHiiHandle, STRING_TOKEN(STR_MISC_CPU_TURBO), Buffer, NULL);\r
744\r
745 //\r
746 //CState\r
747 //\r
748 Data8 = 3;\r
749 UnicodeSPrint (Buffer, sizeof(Buffer), L"%x", Data8);\r
750 HiiSetString(mHiiHandle, STRING_TOKEN(STR_MISC_CSTATE), Buffer, NULL);\r
751\r
752 //\r
753 //GFX Turbo\r
754 //\r
755 Data8 = SystemConfiguration.IgdTurboEnabled;\r
756 UnicodeSPrint (Buffer, sizeof(Buffer), L"%x", Data8);\r
757 HiiSetString(mHiiHandle, STRING_TOKEN(STR_MISC_GFX_TURBO), Buffer, NULL);\r
758\r
759 Data8 = 0;\r
760 UnicodeSPrint (Buffer, sizeof(Buffer), L"%x", Data8);\r
761 HiiSetString(mHiiHandle, STRING_TOKEN(STR_MISC_S0IX_VALUE), Buffer, NULL);\r
762\r
763 //\r
764 //RC6\r
765 //\r
766 Data8 = 0; \r
767 UnicodeSPrint (Buffer, sizeof(Buffer), L"%x", Data8);\r
768 HiiSetString(mHiiHandle, STRING_TOKEN(STR_MISC_RC6_VALUE), Buffer, NULL);\r
769\r
770 //\r
771 // Punit Version\r
772 //\r
773 Data8 = 0;\r
774 UnicodeSPrint (Buffer, sizeof (Buffer), L"0x%x", Data8);\r
775 HiiSetString(mHiiHandle,STRING_TOKEN(STR_MISC_PUNIT_FW_VALUE), Buffer, NULL);\r
776\r
777 //\r
778 // PMC Version\r
779 //\r
780 Data8 = (UINT8)((MmioRead32 (PMC_BASE_ADDRESS + R_PCH_PMC_PRSTS)>>16)&0x00FF);\r
781 Data8_1 = (UINT8)((MmioRead32 (PMC_BASE_ADDRESS + R_PCH_PMC_PRSTS)>>24)&0x00FF);\r
782 UnicodeSPrint (Buffer, sizeof (Buffer), L"0x%X_%X", Data8_1, Data8);\r
783 HiiSetString(mHiiHandle,STRING_TOKEN(STR_MISC_PMC_FW_VALUE), Buffer, NULL);\r
784\r
785 //\r
786 //PMIC Version\r
787 //\r
788 Status = ByteReadI2C(PMICI2cBus, PMICI2cAdd, PMICVendorOffset, 1, &Data8);\r
789 if(!EFI_ERROR(Status)){\r
790 Status = ByteReadI2C(PMICI2cBus, PMICI2cAdd, PMICRevOffset, 1, &Data8_1);\r
791 if(!EFI_ERROR(Status)){\r
792 UnicodeSPrint(Buffer, sizeof(Buffer), L"%02x.%02x", Data8, Data8_1);\r
793 HiiSetString(mHiiHandle, STRING_TOKEN(STR_MISC_PMIC_VERSION), Buffer, NULL);\r
794 }\r
795 }\r
796\r
797 TGetTouchFirmwareVersion();\r
798\r
799 return EFI_SUCCESS;\r
800}\r
801\r
802\r
803/**\r
804 Smbios OEM type 0x94 callback.\r
805\r
806 @param Event Event whose notification function is being invoked.\r
807 @param Context Pointer to the notification functions context, which is implementation dependent.\r
808\r
809 @retval None\r
810\r
811**/\r
812VOID\r
813AddSmbiosT0x94Callback (\r
814 IN EFI_EVENT Event,\r
815 IN VOID *Context\r
816 )\r
817{\r
818 EFI_STATUS Status;\r
819 UINTN SECVerStrLen = 0;\r
820 UINTN uCodeVerStrLen = 0;\r
821 UINTN GOPStrLen = 0;\r
822 UINTN MRCVersionStrLen = 0;\r
823 UINTN PMCVersionStrLen = 0;\r
824 UINTN ULPMCVersionStrLen = 0;\r
825 UINTN PUNITVersionStrLen = 0;\r
826 UINTN SOCVersionStrLen = 0;\r
827 UINTN BOARDVersionStrLen = 0;\r
828 UINTN FABVersionStrLen = 0;\r
829 UINTN CPUFLAVORStrLen = 0;\r
830 UINTN BIOSVersionStrLen = 0;\r
831 UINTN PMICVersionStrLen = 0;\r
832 UINTN TOUCHVersionStrLen = 0;\r
833 UINTN SecureBootModeLen = 0;\r
834 UINTN BootModeLen = 0;\r
835 UINTN SpeedStepModeLen = 0;\r
836 UINTN MaxCStateLen = 0;\r
837 UINTN CpuTurboLen = 0;\r
838 UINTN GfxTurboLen = 0;\r
839 UINTN IdleReserveLen = 0;\r
840 UINTN RC6Len = 0;\r
841\r
842 SMBIOS_TABLE_TYPE94 *SmbiosRecord;\r
843 EFI_SMBIOS_HANDLE SmbiosHandle;\r
844 EFI_MISC_OEM_TYPE_0x94 *ForType94InputData;\r
845 CHAR16 *SECVer;\r
846 CHAR16 *uCodeVer;\r
847 CHAR16 *GOPVer;\r
848 CHAR16 *MrcVer;\r
849 CHAR16 *PmcVer;\r
850 CHAR16 *UlpmcVer;\r
851 CHAR16 *PunitVer;\r
852 CHAR16 *SocVer;\r
853 CHAR16 *BoardVer;\r
854 CHAR16 *FabVer;\r
855 CHAR16 *CpuFlavor;\r
856 CHAR16 *BiosVer;\r
857 CHAR16 *PmicVer;\r
858 CHAR16 *TouchVer = L"15.16";\r
859 CHAR16 *SecureBootMode;\r
860 CHAR16 *BootMode;\r
861 CHAR16 *SpeedStepMode;\r
862 CHAR16 *MaxCState;\r
863 CHAR16 *CpuTurbo;\r
864 CHAR16 *GfxTurbo;\r
865 CHAR16 *IdleReserve;\r
866 CHAR16 *RC6;\r
867\r
868 UINTN RecordLen = 0;\r
869 UINTN StrIdx = 0;\r
870\r
871\r
872 STRING_REF TokenToGet;\r
873 CHAR8 *OptionalStrStart;\r
874 EFI_SMBIOS_PROTOCOL *SmbiosProtocol;\r
875\r
876 ForType94InputData = (EFI_MISC_OEM_TYPE_0x94 *)Context;\r
877\r
878 DEBUG ((EFI_D_INFO, "Executing SMBIOS T0x94 callback.\n"));\r
879\r
880 gBS->CloseEvent (Event); // Unload this event.\r
881\r
882 //\r
883 // First check for invalid parameters.\r
884 //\r
885 if (Context == NULL) {\r
886 return;\r
887 }\r
888\r
889 UpdatePlatformInformation();\r
890\r
891 Status = gBS->LocateProtocol (\r
892 &gEfiSmbiosProtocolGuid,\r
893 NULL,\r
894 (VOID **) &SmbiosProtocol\r
895 );\r
896 ASSERT_EFI_ERROR (Status);\r
897\r
898 TokenToGet = STRING_TOKEN (STR_MISC_SEC_VERSION);\r
899 SECVer = SmbiosMiscGetString (TokenToGet);\r
900 SECVerStrLen = StrLen(SECVer);\r
901 if (SECVerStrLen > SMBIOS_STRING_MAX_LENGTH) {\r
902 return;\r
903 }\r
904\r
905 TokenToGet = STRING_TOKEN (STR_MISC_UCODE_VERSION);\r
906 uCodeVer = SmbiosMiscGetString (TokenToGet);\r
907 uCodeVerStrLen = StrLen(uCodeVer);\r
908 if (uCodeVerStrLen > SMBIOS_STRING_MAX_LENGTH) {\r
909 return;\r
910 }\r
911\r
912 TokenToGet = STRING_TOKEN (STR_MISC_GOP_VERSION);\r
913 GOPVer = SmbiosMiscGetString (TokenToGet);\r
914 GOPStrLen = StrLen(GOPVer);\r
915 if (GOPStrLen > SMBIOS_STRING_MAX_LENGTH) {\r
916 return;\r
917 }\r
918\r
919 TokenToGet = STRING_TOKEN (STR_MISC_MRC_VERSION_VALUE);\r
920 MrcVer = SmbiosMiscGetString (TokenToGet);\r
921 MRCVersionStrLen = StrLen(MrcVer);\r
922 if (MRCVersionStrLen > SMBIOS_STRING_MAX_LENGTH) {\r
923 return;\r
924 }\r
925\r
926 TokenToGet = STRING_TOKEN (STR_MISC_PMC_FW_VALUE);\r
927 PmcVer = SmbiosMiscGetString (TokenToGet);\r
928 PMCVersionStrLen = StrLen(PmcVer);\r
929 if (PMCVersionStrLen > SMBIOS_STRING_MAX_LENGTH) {\r
930 return;\r
931 }\r
932\r
933 TokenToGet = STRING_TOKEN (STR_MISC_ULPMC_FW_VALUE);\r
934 UlpmcVer = SmbiosMiscGetString (TokenToGet);\r
935 ULPMCVersionStrLen = StrLen(UlpmcVer);\r
936 if (ULPMCVersionStrLen > SMBIOS_STRING_MAX_LENGTH) {\r
937 return;\r
938 }\r
939\r
940 TokenToGet = STRING_TOKEN (STR_MISC_PUNIT_FW_VALUE);\r
941 PunitVer = SmbiosMiscGetString (TokenToGet);\r
942 PUNITVersionStrLen = StrLen(PunitVer);\r
943 if (PUNITVersionStrLen > SMBIOS_STRING_MAX_LENGTH) {\r
944 return;\r
945 }\r
946\r
947 TokenToGet = STRING_TOKEN (STR_MISC_SOC_VALUE);\r
948 SocVer = SmbiosMiscGetString (TokenToGet);\r
949 SOCVersionStrLen = StrLen(SocVer);\r
950 if (SOCVersionStrLen > SMBIOS_STRING_MAX_LENGTH) {\r
951 return;\r
952 }\r
953\r
954 TokenToGet = STRING_TOKEN (STR_MISC_BOARD_ID_VALUE);\r
955 BoardVer = SmbiosMiscGetString (TokenToGet);\r
956 BOARDVersionStrLen = StrLen(BoardVer);\r
957 if (BOARDVersionStrLen > SMBIOS_STRING_MAX_LENGTH) {\r
958 return;\r
959 }\r
960\r
961 TokenToGet = STRING_TOKEN (STR_MISC_FAB_ID_VALUE);\r
962 FabVer = SmbiosMiscGetString (TokenToGet);\r
963 FABVersionStrLen = StrLen(FabVer);\r
964 if (FABVersionStrLen > SMBIOS_STRING_MAX_LENGTH) {\r
965 return;\r
966 }\r
967\r
968 TokenToGet = STRING_TOKEN (STR_MISC_CPU_FLAVOR_VALUE);\r
969 CpuFlavor = SmbiosMiscGetString (TokenToGet);\r
970 CPUFLAVORStrLen = StrLen(CpuFlavor);\r
971 if (CPUFLAVORStrLen > SMBIOS_STRING_MAX_LENGTH) {\r
972 return;\r
973 }\r
974\r
975 TokenToGet = STRING_TOKEN (STR_MISC_BIOS_VERSION);\r
976 BiosVer = SmbiosMiscGetString (TokenToGet);\r
977 BIOSVersionStrLen = StrLen(BiosVer);\r
978 if (BIOSVersionStrLen > SMBIOS_STRING_MAX_LENGTH) {\r
979 return;\r
980 }\r
981\r
982 TokenToGet = STRING_TOKEN (STR_MISC_PMIC_VERSION);\r
983 PmicVer = SmbiosMiscGetString (TokenToGet);\r
984 PMICVersionStrLen = StrLen(PmicVer);\r
985 if (PMICVersionStrLen > SMBIOS_STRING_MAX_LENGTH) {\r
986 return;\r
987 }\r
988\r
989 TokenToGet = STRING_TOKEN (STR_MISC_TOUCH_VERSION);\r
990 TouchVer = SmbiosMiscGetString (TokenToGet);\r
991 TOUCHVersionStrLen = StrLen(TouchVer);\r
992 if (TOUCHVersionStrLen > SMBIOS_STRING_MAX_LENGTH) {\r
993 return;\r
994 }\r
995\r
996 TokenToGet = STRING_TOKEN (STR_MISC_SECURE_BOOT);\r
997 SecureBootMode = SmbiosMiscGetString(TokenToGet);\r
998 SecureBootModeLen = StrLen(SecureBootMode);\r
999 if (SecureBootModeLen > SMBIOS_STRING_MAX_LENGTH) {\r
1000 return;\r
1001 }\r
1002\r
1003 TokenToGet = STRING_TOKEN (STR_MISC_BOOT_MODE);\r
1004 BootMode = SmbiosMiscGetString(TokenToGet);\r
1005 BootModeLen = StrLen(BootMode);\r
1006 if (BootModeLen > SMBIOS_STRING_MAX_LENGTH) {\r
1007 return;\r
1008 }\r
1009\r
1010 TokenToGet = STRING_TOKEN (STR_MISC_SPEED_STEP);\r
1011 SpeedStepMode = SmbiosMiscGetString(TokenToGet);\r
1012 SpeedStepModeLen = StrLen(SpeedStepMode);\r
1013 if (SpeedStepModeLen > SMBIOS_STRING_MAX_LENGTH) {\r
1014 return;\r
1015 }\r
1016\r
1017 TokenToGet = STRING_TOKEN (STR_MISC_CPU_TURBO);\r
1018 CpuTurbo = SmbiosMiscGetString(TokenToGet);\r
1019 CpuTurboLen = StrLen(CpuTurbo);\r
1020 if (CpuTurboLen > SMBIOS_STRING_MAX_LENGTH) {\r
1021 return;\r
1022 }\r
1023\r
1024 TokenToGet = STRING_TOKEN (STR_MISC_CSTATE);\r
1025 MaxCState = SmbiosMiscGetString(TokenToGet);\r
1026 MaxCStateLen = StrLen(MaxCState);\r
1027 if (MaxCStateLen > SMBIOS_STRING_MAX_LENGTH) {\r
1028 return;\r
1029 }\r
1030\r
1031 TokenToGet = STRING_TOKEN (STR_MISC_GFX_TURBO);\r
1032 GfxTurbo = SmbiosMiscGetString(TokenToGet);\r
1033 GfxTurboLen = StrLen(GfxTurbo);\r
1034 if (GfxTurboLen > SMBIOS_STRING_MAX_LENGTH) {\r
1035 return;\r
1036 }\r
1037\r
1038 TokenToGet = STRING_TOKEN (STR_MISC_S0IX_VALUE);\r
1039 IdleReserve = SmbiosMiscGetString(TokenToGet);\r
1040 IdleReserveLen = StrLen(IdleReserve);\r
1041 if (S0ixLen > SMBIOS_STRING_MAX_LENGTH) {\r
1042 return;\r
1043 }\r
1044\r
1045 TokenToGet = STRING_TOKEN (STR_MISC_RC6_VALUE);\r
1046 RC6 = SmbiosMiscGetString(TokenToGet);\r
1047 RC6Len = StrLen(RC6);\r
1048 if (RC6Len > SMBIOS_STRING_MAX_LENGTH) {\r
1049 return;\r
1050 }\r
1051\r
1052 RecordLen = sizeof (SMBIOS_TABLE_TYPE94) + SECVerStrLen + 1 + uCodeVerStrLen + 1 + GOPStrLen + 1 + PMCVersionStrLen + 1 + \\r
1053 TOUCHVersionStrLen + 1 + PMICVersionStrLen + 1 + BIOSVersionStrLen + 1 + CPUFLAVORStrLen + 1 + \\r
1054 BOARDVersionStrLen + 1 + FABVersionStrLen + 1 + PUNITVersionStrLen+ 1 + ULPMCVersionStrLen + 1 + \\r
1055 MRCVersionStrLen + 1 + SOCVersionStrLen + 1 + SecureBootModeLen + 1 + BootModeLen + 1 + \\r
1056 SpeedStepModeLen + 1 + CpuTurboLen + 1 + MaxCStateLen + 1 + GfxTurboLen + 1 + + RC6Len + 1 + 1;\r
1057\r
1058 SmbiosRecord = AllocatePool(RecordLen);\r
1059\r
1060 ZeroMem(SmbiosRecord, RecordLen);\r
1061\r
1062 SmbiosRecord->Hdr.Type = EFI_SMBIOS_TYPE_MISC_VERSION_INFO;\r
1063 SmbiosRecord->Hdr.Length = sizeof (SMBIOS_TABLE_TYPE94);\r
1064\r
1065 //\r
1066 // Make handle chosen by smbios protocol.add automatically.\r
1067 //\r
1068 SmbiosRecord->Hdr.Handle = 0;\r
1069\r
1070 SmbiosRecord->GopVersion = 1;\r
1071\r
1072 SmbiosRecord->SECVersion = 2;\r
1073\r
1074 SmbiosRecord->MRCVersion = 3;\r
1075\r
1076 SmbiosRecord->uCodeVersion = 4;\r
1077\r
1078 SmbiosRecord->PUnitVersion = 5;\r
1079\r
1080 SmbiosRecord->PMCVersion = 6;\r
1081\r
1082 SmbiosRecord->ULPMCVersion = 7;\r
1083\r
1084 SmbiosRecord->SoCVersion = 8;\r
1085\r
1086 SmbiosRecord->BoardVersion = 9;\r
1087\r
1088 SmbiosRecord->FabVersion = 10;\r
1089\r
1090 SmbiosRecord->CPUFlavor = 11;\r
1091\r
1092 SmbiosRecord->BiosVersion = 12;\r
1093\r
1094 SmbiosRecord->PmicVersion = 13;\r
1095\r
1096 SmbiosRecord->TouchVersion = 14;\r
1097\r
1098 SmbiosRecord->SecureBoot = 15;\r
1099\r
1100 SmbiosRecord->BootMode = 16;\r
1101\r
1102 SmbiosRecord->SpeedStepMode= 17;\r
1103\r
1104 SmbiosRecord->CPUTurboMode = 18;\r
1105\r
1106 SmbiosRecord->MaxCState = 19;\r
1107\r
1108 SmbiosRecord->GfxTurbo = 20;\r
1109 SmbiosRecord->IdleReserve = 21;\r
1110\r
1111 SmbiosRecord->RC6 = 22;\r
1112\r
1113\r
1114 OptionalStrStart = (CHAR8 *)(SmbiosRecord + 1);\r
1115 UnicodeStrToAsciiStr(GOPVer, OptionalStrStart);\r
1116 StrIdx += GOPStrLen + 1;\r
1117\r
1118 UnicodeStrToAsciiStr(SECVer, OptionalStrStart + StrIdx);\r
1119 StrIdx += SECVerStrLen + 1;\r
1120\r
1121 UnicodeStrToAsciiStr(MrcVer, OptionalStrStart + StrIdx);\r
1122 StrIdx += MRCVersionStrLen + 1;\r
1123\r
1124 UnicodeStrToAsciiStr(uCodeVer, OptionalStrStart + StrIdx);\r
1125 StrIdx += uCodeVerStrLen + 1;\r
1126\r
1127 UnicodeStrToAsciiStr(PunitVer, OptionalStrStart + StrIdx);\r
1128 StrIdx += PUNITVersionStrLen + 1;\r
1129\r
1130 UnicodeStrToAsciiStr(PmcVer, OptionalStrStart + StrIdx);\r
1131 StrIdx += PMCVersionStrLen + 1;\r
1132\r
1133 UnicodeStrToAsciiStr(UlpmcVer, OptionalStrStart + StrIdx);\r
1134 StrIdx += ULPMCVersionStrLen + 1;\r
1135\r
1136\r
1137 UnicodeStrToAsciiStr(SocVer, OptionalStrStart + StrIdx);\r
1138 StrIdx += SOCVersionStrLen +1;\r
1139\r
1140 UnicodeStrToAsciiStr(BoardVer, OptionalStrStart + StrIdx);\r
1141 StrIdx += BOARDVersionStrLen + 1;\r
1142\r
1143 UnicodeStrToAsciiStr(FabVer, OptionalStrStart + StrIdx);\r
1144 StrIdx += FABVersionStrLen + 1;\r
1145\r
1146 UnicodeStrToAsciiStr(CpuFlavor, OptionalStrStart + StrIdx);\r
1147 StrIdx += CPUFLAVORStrLen + 1;\r
1148\r
1149 UnicodeStrToAsciiStr(BiosVer, OptionalStrStart + StrIdx);\r
1150 StrIdx += BIOSVersionStrLen + 1;\r
1151\r
1152 UnicodeStrToAsciiStr(PmicVer, OptionalStrStart + StrIdx);\r
1153 StrIdx += PMICVersionStrLen + 1;\r
1154\r
1155 UnicodeStrToAsciiStr(TouchVer, OptionalStrStart + StrIdx);\r
1156 StrIdx += TOUCHVersionStrLen + 1;\r
1157\r
1158 UnicodeStrToAsciiStr(SecureBootMode, OptionalStrStart + StrIdx);\r
1159 StrIdx += SecureBootModeLen + 1;\r
1160\r
1161 UnicodeStrToAsciiStr(BootMode, OptionalStrStart + StrIdx);\r
1162 StrIdx += BootModeLen + 1;\r
1163\r
1164 UnicodeStrToAsciiStr(SpeedStepMode, OptionalStrStart + StrIdx);\r
1165 StrIdx += SpeedStepModeLen + 1;\r
1166\r
1167 UnicodeStrToAsciiStr(CpuTurbo, OptionalStrStart + StrIdx);\r
1168 StrIdx += CpuTurboLen + 1;\r
1169\r
1170 UnicodeStrToAsciiStr(MaxCState, OptionalStrStart + StrIdx);\r
1171 StrIdx += MaxCStateLen + 1;\r
1172\r
1173 UnicodeStrToAsciiStr(GfxTurbo, OptionalStrStart + StrIdx);\r
1174 StrIdx += GfxTurboLen + 1;\r
1175\r
1176 UnicodeStrToAsciiStr(IdleReserve, OptionalStrStart + StrIdx);\r
1177 StrIdx += S0ixLen + 1;\r
1178\r
1179 UnicodeStrToAsciiStr(RC6, OptionalStrStart + StrIdx);\r
1180 StrIdx += RC6Len + 1;\r
1181\r
1182 //\r
1183 // Now we have got the full smbios record, call smbios protocol to add this record.\r
1184 //\r
1185 SmbiosHandle = SMBIOS_HANDLE_PI_RESERVED;\r
1186 Status = SmbiosProtocol-> Add (\r
1187 SmbiosProtocol,\r
1188 NULL,\r
1189 &SmbiosHandle,\r
1190 (EFI_SMBIOS_TABLE_HEADER *) SmbiosRecord\r
1191 );\r
1192\r
1193 FreePool(SmbiosRecord);\r
1194 return;\r
1195}\r
1196\r
1197/**\r
1198 This function makes boot time changes to the contents of the\r
1199 MiscOemType0x94 (Type 0x94).\r
1200\r
1201 @param RecordData Pointer to copy of RecordData from the Data Table.\r
1202\r
1203 @retval EFI_SUCCESS All parameters were valid.\r
1204 @retval EFI_UNSUPPORTED Unexpected RecordType value.\r
1205 @retval EFI_INVALID_PARAMETER Invalid parameter was found.\r
1206\r
1207**/\r
1208MISC_SMBIOS_TABLE_FUNCTION(MiscOemType0x94)\r
1209{\r
1210 EFI_STATUS Status;\r
1211 EFI_EVENT AddSmbiosT0x94CallbackEvent;\r
1212\r
1213 Status = EfiCreateEventReadyToBootEx (\r
1214 TPL_CALLBACK,\r
1215 AddSmbiosT0x94Callback,\r
1216 RecordData,\r
1217 &AddSmbiosT0x94CallbackEvent\r
1218 );\r
1219\r
1220 ASSERT_EFI_ERROR (Status);\r
1221 return Status;\r
1222\r
1223}\r