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