3 Copyright (c) 1999 - 2014, Intel Corporation. All rights reserved.
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.
18 MiscOemType0x94Function.c
22 The function that processes the Smbios data type 0x94.
26 #include "CommonHeader.h"
28 #include "MiscSubclassDriver.h"
29 #include <Protocol/DataHub.h>
30 #include <Library/HiiLib.h>
31 #include <Protocol/CpuIo2.h>
32 #include <Library/PrintLib.h>
33 #include <Protocol/PciRootBridgeIo.h>
34 #include <Protocol/SimpleNetwork.h>
35 #include <Protocol/DevicePath.h>
36 #include <Protocol/DiskInfo.h>
37 #include <Protocol/IdeControllerInit.h>
38 #include <Protocol/MpService.h>
39 #include <Protocol/PchPlatformPolicy.h>
40 #include <Protocol/CpuIo2.h>
41 #include <Protocol/I2cBus.h>
43 #include <Library/IoLib.h>
44 #include <Library/I2CLib.h>
45 #include <Library/CpuIA32.h>
46 #include <Library/UefiRuntimeServicesTableLib.h>
47 #include <Guid/PlatformInfo.h>
48 #include <Guid/SetupVariable.h>
49 #include <Guid/Vlv2Variable.h>
51 #include "Valleyview.h"
52 #include "VlvAccess.h"
53 #include "PchAccess.h"
54 #include "SetupMode.h"
55 #include "PchCommonDefinitions.h"
56 #include <PlatformBaseAddresses.h>
66 SB_REV SBRevisionTable
[] = {
67 {V_PCH_LPC_RID_0
, "(A0 Stepping)"},
68 {V_PCH_LPC_RID_1
, "(A0 Stepping)"},
69 {V_PCH_LPC_RID_2
, "(A1 Stepping)"},
70 {V_PCH_LPC_RID_3
, "(A1 Stepping)"},
71 {V_PCH_LPC_RID_4
, "(B0 Stepping)"},
72 {V_PCH_LPC_RID_5
, "(B0 Stepping)"},
73 {V_PCH_LPC_RID_6
, "(B1 Stepping)"},
74 {V_PCH_LPC_RID_7
, "(B1 Stepping)"},
75 {V_PCH_LPC_RID_8
, "(B2 Stepping)"},
76 {V_PCH_LPC_RID_9
, "(B2 Stepping)"},
77 {V_PCH_LPC_RID_A
, "(B3 Stepping)"},
78 {V_PCH_LPC_RID_B
, "(B3 Stepping)"}
81 #define LEFT_JUSTIFY 0x01
82 #define PREFIX_SIGN 0x02
83 #define PREFIX_BLANK 0x04
84 #define COMMA_TYPE 0x08
85 #define LONG_TYPE 0x10
86 #define PREFIX_ZERO 0x20
88 #define ICH_REG_REV 0x08
89 #define MSR_IA32_PLATFORM_ID 0x17
90 #define CHARACTER_NUMBER_FOR_VALUE 30
93 UINT8 ReadBuffer
[20]; //Version report length
94 UINT8 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
98 VSPrint worker function that prints a Value as a decimal number in Buffer
100 @param Buffer Location to place ascii decimal number string of Value.
101 @param Value Decimal value to convert to a string in Buffer.
102 @param Flags Flags to use in printing decimal string, see file header for details.
103 @param Width Width of hex value.
105 @retval Number of characters printed.
110 IN OUT CHAR16
*Buffer
,
116 CHAR16 TempBuffer
[CHARACTER_NUMBER_FOR_VALUE
];
124 BOOLEAN ValueIsNegative
;
127 TempStr
= TempBuffer
;
131 ValueIsNegative
= FALSE
;
133 if (Width
> CHARACTER_NUMBER_FOR_VALUE
- 1) {
134 Width
= CHARACTER_NUMBER_FOR_VALUE
- 1;
139 ValueIsNegative
= TRUE
;
144 Value
= (INT64
)DivU64x32 ((UINT64
)Value
, 10);
145 Remainder
= (UINTN
)((UINT64
)TempValue
- 10 * Value
);
146 *(TempStr
++) = (CHAR16
)(Remainder
+ '0');
149 if ((Flags
& COMMA_TYPE
) == COMMA_TYPE
) {
150 if (ValueCharNum
% 3 == 0 && Value
!= 0) {
155 } while (Value
!= 0);
157 if (ValueIsNegative
) {
162 if ((Flags
& PREFIX_ZERO
) && !ValueIsNegative
) {
169 if (!(Flags
& LEFT_JUSTIFY
)) {
170 for (; Index
< Width
; Index
++) {
171 *(TempStr
++) = Prefix
;
176 // Reverse temp string into Buffer.
178 if (Width
> 0 && (UINTN
) (TempStr
- TempBuffer
) > Width
) {
179 TempStr
= TempBuffer
+ Width
;
182 while (TempStr
!= TempBuffer
) {
183 *(BufferPtr
++) = *(--TempStr
);
191 static CHAR16 mHexStr
[] = { L
'0', L
'1', L
'2', L
'3', L
'4', L
'5', L
'6', L
'7',
192 L
'8', L
'9', L
'A', L
'B', L
'C', L
'D', L
'E', L
'F' };
194 VSPrint worker function that prints a Value as a hex number in Buffer
196 @param Buffer Location to place ascii hex string of Value.
197 @param Value Hex value to convert to a string in Buffer.
198 @param Flags Flags to use in printing Hex string, see file header for details.
199 @param Width Width of hex value.
201 @retval Number of characters printed.
206 IN OUT CHAR16
*Buffer
,
212 CHAR16 TempBuffer
[CHARACTER_NUMBER_FOR_VALUE
];
219 TempStr
= TempBuffer
;
223 // Count starts at one since we will null terminate. Each iteration of the
224 // loop picks off one nibble. Oh yea TempStr ends up backwards
228 if (Width
> CHARACTER_NUMBER_FOR_VALUE
- 1) {
229 Width
= CHARACTER_NUMBER_FOR_VALUE
- 1;
233 Index
= ((UINTN
)Value
& 0xf);
234 *(TempStr
++) = mHexStr
[Index
];
235 Value
= RShiftU64 (Value
, 4);
237 } while (Value
!= 0);
239 if (Flags
& PREFIX_ZERO
) {
246 if (!(Flags
& LEFT_JUSTIFY
)) {
247 for (; Index
< Width
; Index
++) {
248 *(TempStr
++) = Prefix
;
253 // Reverse temp string into Buffer.
255 if (Width
> 0 && (UINTN
) (TempStr
- TempBuffer
) > Width
) {
256 TempStr
= TempBuffer
+ Width
;
259 while (TempStr
!= TempBuffer
) {
260 *(BufferPtr
++) = *(--TempStr
);
269 Converts MAC address to Unicode string.
270 The value is 64-bit and the resulting string will be 12
271 digit hex number in pairs of digits separated by dashes.
273 @param String - string that will contain the value
274 @param Val - value to convert
280 IN EFI_MAC_ADDRESS
*MacAddr
,
286 for (i
= 0; i
< AddrSize
; i
++) {
290 MacAddr
->Addr
[i
] & 0xFF,
297 // Terminate the string.
299 String
[2 * AddrSize
] = L
'\0';
307 TJudgeHandleIsPCIDevice(
314 EFI_DEVICE_PATH
*DPath
;
315 EFI_DEVICE_PATH
*DevicePath
;
317 Status
= gBS
->HandleProtocol (
319 &gEfiDevicePathProtocolGuid
,
322 if(!EFI_ERROR(Status
))
325 while(!IsDevicePathEnd(DPath
))
327 if((DPath
->Type
== HARDWARE_DEVICE_PATH
) && (DPath
->SubType
== HW_PCI_DP
))
329 PCI_DEVICE_PATH
*PCIPath
;
331 PCIPath
= (PCI_DEVICE_PATH
*) DPath
;
332 DPath
= NextDevicePathNode(DPath
);
333 if(IsDevicePathEnd(DPath
) && (PCIPath
->Device
== Device
) && (PCIPath
->Function
== Funs
))
340 DPath
= NextDevicePathNode(DPath
);
344 return EFI_UNSUPPORTED
;
355 EFI_GUID
**ProtocolGuidArray
= NULL
;
360 EFI_OPEN_PROTOCOL_INFORMATION_ENTRY
*OpenInfo
= NULL
;
362 EFI_HANDLE
*mHandleBuffer
= NULL
;
365 // Retrieve the list of all handles from the handle database
367 Status
= gBS
->LocateHandleBuffer (
375 for (HandleIndex
= 0; HandleIndex
< mHandleCount
; HandleIndex
++)
378 // Retrieve the list of all the protocols on each handle
380 Status
= gBS
->ProtocolsPerHandle (
381 mHandleBuffer
[HandleIndex
],
385 if (!EFI_ERROR (Status
))
387 for (ProtocolIndex
= 0; ProtocolIndex
< ArrayCount
; ProtocolIndex
++)
389 Status
= gBS
->OpenProtocolInformation (
390 mHandleBuffer
[HandleIndex
],
391 ProtocolGuidArray
[ProtocolIndex
],
395 if (!EFI_ERROR (Status
))
397 for (OpenInfoIndex
= 0; OpenInfoIndex
< OpenInfoCount
; OpenInfoIndex
++)
399 if(OpenInfo
[OpenInfoIndex
].AgentHandle
== Father
)
401 if ((OpenInfo
[OpenInfoIndex
].Attributes
& EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER
) == EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER
)
403 *Child
= mHandleBuffer
[HandleIndex
];
404 Status
= EFI_SUCCESS
;
409 Status
= EFI_NOT_FOUND
;
418 FreePool (ProtocolGuidArray
);
419 ProtocolGuidArray
= NULL
;
427 if(ProtocolGuidArray
!= NULL
)
429 FreePool(ProtocolGuidArray
);
430 ProtocolGuidArray
= NULL
;
432 if(mHandleBuffer
!= NULL
)
434 FreePool (mHandleBuffer
);
435 mHandleBuffer
= NULL
;
446 EFI_DRIVER_BINDING_PROTOCOL
*BindHandle
= NULL
;
450 Status
= gBS
->OpenProtocol(
452 &gEfiDriverBindingProtocolGuid
,
456 EFI_OPEN_PROTOCOL_GET_PROTOCOL
459 if (EFI_ERROR(Status
))
461 return EFI_NOT_FOUND
;
464 Version
= BindHandle
->Version
;
465 Ptr
= (UINT16
*)&Version
;
466 UnicodeSPrint(Name
, 40, L
"%d.%d.%d", Version
>> 24 , (Version
>>16)& 0x0f ,*(Ptr
));
476 EFI_HANDLE
*Handles
= NULL
;
479 EFI_HANDLE Child
= 0;
481 Status
= gBS
->LocateHandleBuffer(
483 &gEfiDriverBindingProtocolGuid
,
488 for (Index
= 0; Index
< HandleCount
; Index
++)
490 Status
= TSearchChildHandle(Handles
[Index
], &Child
);
491 if(!EFI_ERROR(Status
))
493 Status
= TJudgeHandleIsPCIDevice(Child
, 0x02, 0x00);
494 if(!EFI_ERROR(Status
))
496 return TGetDriverName(Handles
[Index
], Name
);
500 return EFI_UNSUPPORTED
;
504 TGetTouchFirmwareVersion(
507 EFI_STATUS rc
=EFI_SUCCESS
;
509 UINTN Size
= sizeof(UINTN
);
514 rc
= gRT
->GetVariable(
516 &gEfiVlv2VariableGuid
,
522 UnicodeSPrint(Buffer
, sizeof(Buffer
), L
"%02x.%02x", (TouchVer
&0xFFFF)>>8,TouchVer
&0xFF);
523 HiiSetString(mHiiHandle
, STRING_TOKEN(STR_MISC_TOUCH_VERSION
), Buffer
, NULL
);
530 UpdatePlatformInformation (
533 UINT32 MicroCodeVersion
;
538 EFI_IA32_REGISTER_SET RegSet
;
539 EFI_LEGACY_BIOS_PROTOCOL
*LegacyBios
= NULL
;
542 EFI_PEI_HOB_POINTERS GuidHob
;
543 EFI_PLATFORM_INFO_HOB
*mPlatformInfo
=NULL
;
545 EFI_HANDLE
*HandleBuffer
;
547 DXE_PCH_PLATFORM_POLICY_PROTOCOL
*PchPlatformPolicy
;
548 UINTN PciD31F0RegBase
;
560 // Get the HOB list. If it is not present, then ASSERT.
562 GuidHob
.Raw
= GetHobList ();
563 if (GuidHob
.Raw
!= NULL
) {
564 if ((GuidHob
.Raw
= GetNextGuidHob (&gEfiPlatformInfoGuid
, GuidHob
.Raw
)) != NULL
) {
565 mPlatformInfo
= GET_GUID_HOB_DATA (GuidHob
.Guid
);
572 Status
= gBS
->LocateProtocol(
573 &gEfiLegacyBiosProtocolGuid
,
578 RegSet
.X
.AX
= 0x5f01;
579 Status
= LegacyBios
->Int86 (LegacyBios
, 0x10, &RegSet
);
580 ASSERT_EFI_ERROR(Status
);
583 // simulate AMI int15 (ax=5f01) handler
584 // check NbInt15.asm in AMI code for asm edition
586 EDX
= (UINT16
)((RegSet
.E
.EBX
>> 16) & 0xffff);
587 IgdVBIOSRevH
= (UINT8
)(((EDX
& 0x0F00) >> 4) | (EDX
& 0x000F));
588 IgdVBIOSRevL
= (UINT8
)(((RegSet
.X
.BX
& 0x0F00) >> 4) | (RegSet
.X
.BX
& 0x000F));
590 if (IgdVBIOSRevH
==0 && IgdVBIOSRevL
==0) {
591 HiiSetString(mHiiHandle
, STRING_TOKEN(STR_CHIP_IGD_VBIOS_REV_VALUE
), L
"N/A", NULL
);
593 UnicodeSPrint (Buffer
, sizeof (Buffer
), L
"%02X%02X", IgdVBIOSRevH
,IgdVBIOSRevL
);
594 HiiSetString(mHiiHandle
, STRING_TOKEN(STR_CHIP_IGD_VBIOS_REV_VALUE
), Buffer
, NULL
);
597 Status
= TGetGOPDriverName(Name
);
599 if(!EFI_ERROR(Status
))
601 HiiSetString(mHiiHandle
, STRING_TOKEN(STR_MISC_GOP_VERSION
), Name
, NULL
);
609 //VLV-QC Notebook 001
614 CpuFlavor
= RShiftU64 (EfiReadMsr (MSR_IA32_PLATFORM_ID
), 50) & 0x07;
618 UnicodeSPrint (Buffer
, sizeof (Buffer
), L
"%s (%01x)", L
"VLV-DC Tablet", CpuFlavor
);
621 UnicodeSPrint (Buffer
, sizeof (Buffer
), L
"%s (%01x)", L
"VLV-QC Notebook", CpuFlavor
);
624 UnicodeSPrint (Buffer
, sizeof (Buffer
), L
"%s (%01x)", L
"VLV-QC Desktop", CpuFlavor
);
627 UnicodeSPrint (Buffer
, sizeof (Buffer
), L
"%s (%01x)", L
"VLV-QC Notebook", CpuFlavor
);
630 UnicodeSPrint (Buffer
, sizeof (Buffer
), L
"%s (%01x)", L
"Unknown CPU", CpuFlavor
);
633 HiiSetString(mHiiHandle
,STRING_TOKEN(STR_MISC_CPU_FLAVOR_VALUE
), Buffer
, NULL
);
635 if ( NULL
!= mPlatformInfo
) {
639 UnicodeSPrint (Buffer
, sizeof (Buffer
), L
"%x", mPlatformInfo
->BoardId
);
640 HiiSetString(mHiiHandle
,STRING_TOKEN(STR_MISC_BOARD_ID_VALUE
), Buffer
, NULL
);
645 UnicodeSPrint (Buffer
, sizeof (Buffer
), L
"%x", mPlatformInfo
->BoardRev
);
646 HiiSetString(mHiiHandle
,STRING_TOKEN(STR_MISC_FAB_ID_VALUE
), Buffer
, NULL
);
652 MrcVersion
= MmioRead32 (MmPciAddress (0, 0, 0, 0, 0xF0));
653 MrcVersion
&= 0xffff;
654 Index
= EfiValueToString (Buffer
, MrcVersion
/100, PREFIX_ZERO
, 0);
655 StrCat (Buffer
, L
".");
656 EfiValueToString (Buffer
+ Index
+ 1, (MrcVersion
%100)/10, PREFIX_ZERO
, 0);
657 EfiValueToString (Buffer
+ Index
+ 2, (MrcVersion
%100)%10, PREFIX_ZERO
, 0);
658 HiiSetString(mHiiHandle
,STRING_TOKEN(STR_MISC_MRC_VERSION_VALUE
), Buffer
, NULL
);
665 // Retrieve all instances of PCH Platform Policy protocol
667 Status
= gBS
->LocateHandleBuffer (
669 &gDxePchPlatformPolicyProtocolGuid
,
674 if (!EFI_ERROR (Status
)) {
676 // Find the matching PCH Policy protocol
678 for (Index
= 0; Index
< NumHandles
; Index
++) {
679 Status
= gBS
->HandleProtocol (
681 &gDxePchPlatformPolicyProtocolGuid
,
682 (VOID
**) &PchPlatformPolicy
684 if (!EFI_ERROR (Status
)) {
685 PciD31F0RegBase
= MmPciAddress (
687 PchPlatformPolicy
->BusNumber
,
688 PCI_DEVICE_NUMBER_PCH_LPC
,
689 PCI_FUNCTION_NUMBER_PCH_LPC
,
693 Data8
= MmioRead8 (PciD31F0RegBase
+ R_PCH_LPC_RID_CC
);
694 count
= ARRAY_SIZE (SBRevisionTable
);
695 for (Index
= 0; Index
< count
; Index
++) {
696 if(Data8
== SBRevisionTable
[Index
].RevId
) {
697 UnicodeSPrint (Buffer
, sizeof (Buffer
), L
"%02x %a", Data8
, SBRevisionTable
[Index
].String
);
698 HiiSetString(mHiiHandle
,STRING_TOKEN(STR_MISC_SOC_VALUE
), Buffer
, NULL
);
708 // Microcode Revision
710 EfiWriteMsr (EFI_MSR_IA32_BIOS_SIGN_ID
, 0);
711 EfiCpuid (EFI_CPUID_VERSION_INFO
, NULL
);
712 MicroCodeVersion
= (UINT32
) RShiftU64 (EfiReadMsr (EFI_MSR_IA32_BIOS_SIGN_ID
), 32);
713 UnicodeSPrint (Buffer
, sizeof (Buffer
), L
"%x", MicroCodeVersion
);
714 HiiSetString(mHiiHandle
,STRING_TOKEN(STR_MISC_PROCESSOR_MICROCODE_VALUE
), Buffer
, NULL
);
720 Data8
= SystemConfiguration
.SecureBoot
;
721 UnicodeSPrint (Buffer
, sizeof(Buffer
), L
"%x", Data8
);
722 HiiSetString(mHiiHandle
, STRING_TOKEN(STR_MISC_SECURE_BOOT
), Buffer
, NULL
);
727 BootMode
= GetBootModeHob();
728 UnicodeSPrint (Buffer
, sizeof(Buffer
), L
"%x", BootMode
);
729 HiiSetString(mHiiHandle
, STRING_TOKEN(STR_MISC_BOOT_MODE
), Buffer
, NULL
);
735 UnicodeSPrint (Buffer
, sizeof(Buffer
), L
"%x", Data8
);
736 HiiSetString(mHiiHandle
, STRING_TOKEN(STR_MISC_SPEED_STEP
), Buffer
, NULL
);
742 UnicodeSPrint (Buffer
, sizeof(Buffer
), L
"%x", Data8
);
743 HiiSetString(mHiiHandle
, STRING_TOKEN(STR_MISC_CPU_TURBO
), Buffer
, NULL
);
749 UnicodeSPrint (Buffer
, sizeof(Buffer
), L
"%x", Data8
);
750 HiiSetString(mHiiHandle
, STRING_TOKEN(STR_MISC_CSTATE
), Buffer
, NULL
);
755 Data8
= SystemConfiguration
.IgdTurboEnabled
;
756 UnicodeSPrint (Buffer
, sizeof(Buffer
), L
"%x", Data8
);
757 HiiSetString(mHiiHandle
, STRING_TOKEN(STR_MISC_GFX_TURBO
), Buffer
, NULL
);
760 UnicodeSPrint (Buffer
, sizeof(Buffer
), L
"%x", Data8
);
761 HiiSetString(mHiiHandle
, STRING_TOKEN(STR_MISC_S0IX_VALUE
), Buffer
, NULL
);
767 UnicodeSPrint (Buffer
, sizeof(Buffer
), L
"%x", Data8
);
768 HiiSetString(mHiiHandle
, STRING_TOKEN(STR_MISC_RC6_VALUE
), Buffer
, NULL
);
774 UnicodeSPrint (Buffer
, sizeof (Buffer
), L
"0x%x", Data8
);
775 HiiSetString(mHiiHandle
,STRING_TOKEN(STR_MISC_PUNIT_FW_VALUE
), Buffer
, NULL
);
780 Data8
= (UINT8
)((MmioRead32 (PMC_BASE_ADDRESS
+ R_PCH_PMC_PRSTS
)>>16)&0x00FF);
781 Data8_1
= (UINT8
)((MmioRead32 (PMC_BASE_ADDRESS
+ R_PCH_PMC_PRSTS
)>>24)&0x00FF);
782 UnicodeSPrint (Buffer
, sizeof (Buffer
), L
"0x%X_%X", Data8_1
, Data8
);
783 HiiSetString(mHiiHandle
,STRING_TOKEN(STR_MISC_PMC_FW_VALUE
), Buffer
, NULL
);
788 Status
= ByteReadI2C(PMICI2cBus
, PMICI2cAdd
, PMICVendorOffset
, 1, &Data8
);
789 if(!EFI_ERROR(Status
)){
790 Status
= ByteReadI2C(PMICI2cBus
, PMICI2cAdd
, PMICRevOffset
, 1, &Data8_1
);
791 if(!EFI_ERROR(Status
)){
792 UnicodeSPrint(Buffer
, sizeof(Buffer
), L
"%02x.%02x", Data8
, Data8_1
);
793 HiiSetString(mHiiHandle
, STRING_TOKEN(STR_MISC_PMIC_VERSION
), Buffer
, NULL
);
797 TGetTouchFirmwareVersion();
804 Smbios OEM type 0x94 callback.
806 @param Event Event whose notification function is being invoked.
807 @param Context Pointer to the notification functions context, which is implementation dependent.
813 AddSmbiosT0x94Callback (
819 UINTN SECVerStrLen
= 0;
820 UINTN uCodeVerStrLen
= 0;
822 UINTN MRCVersionStrLen
= 0;
823 UINTN PMCVersionStrLen
= 0;
824 UINTN ULPMCVersionStrLen
= 0;
825 UINTN PUNITVersionStrLen
= 0;
826 UINTN SOCVersionStrLen
= 0;
827 UINTN BOARDVersionStrLen
= 0;
828 UINTN FABVersionStrLen
= 0;
829 UINTN CPUFLAVORStrLen
= 0;
830 UINTN BIOSVersionStrLen
= 0;
831 UINTN PMICVersionStrLen
= 0;
832 UINTN TOUCHVersionStrLen
= 0;
833 UINTN SecureBootModeLen
= 0;
834 UINTN BootModeLen
= 0;
835 UINTN SpeedStepModeLen
= 0;
836 UINTN MaxCStateLen
= 0;
837 UINTN CpuTurboLen
= 0;
838 UINTN GfxTurboLen
= 0;
839 UINTN IdleReserveLen
= 0;
842 SMBIOS_TABLE_TYPE94
*SmbiosRecord
;
843 EFI_SMBIOS_HANDLE SmbiosHandle
;
844 EFI_MISC_OEM_TYPE_0x94
*ForType94InputData
;
858 CHAR16
*TouchVer
= L
"15.16";
859 CHAR16
*SecureBootMode
;
861 CHAR16
*SpeedStepMode
;
872 STRING_REF TokenToGet
;
873 CHAR8
*OptionalStrStart
;
874 EFI_SMBIOS_PROTOCOL
*SmbiosProtocol
;
876 ForType94InputData
= (EFI_MISC_OEM_TYPE_0x94
*)Context
;
878 DEBUG ((EFI_D_INFO
, "Executing SMBIOS T0x94 callback.\n"));
880 gBS
->CloseEvent (Event
); // Unload this event.
883 // First check for invalid parameters.
885 if (Context
== NULL
) {
889 UpdatePlatformInformation();
891 Status
= gBS
->LocateProtocol (
892 &gEfiSmbiosProtocolGuid
,
894 (VOID
**) &SmbiosProtocol
896 ASSERT_EFI_ERROR (Status
);
898 TokenToGet
= STRING_TOKEN (STR_MISC_SEC_VERSION
);
899 SECVer
= SmbiosMiscGetString (TokenToGet
);
900 SECVerStrLen
= StrLen(SECVer
);
901 if (SECVerStrLen
> SMBIOS_STRING_MAX_LENGTH
) {
905 TokenToGet
= STRING_TOKEN (STR_MISC_UCODE_VERSION
);
906 uCodeVer
= SmbiosMiscGetString (TokenToGet
);
907 uCodeVerStrLen
= StrLen(uCodeVer
);
908 if (uCodeVerStrLen
> SMBIOS_STRING_MAX_LENGTH
) {
912 TokenToGet
= STRING_TOKEN (STR_MISC_GOP_VERSION
);
913 GOPVer
= SmbiosMiscGetString (TokenToGet
);
914 GOPStrLen
= StrLen(GOPVer
);
915 if (GOPStrLen
> SMBIOS_STRING_MAX_LENGTH
) {
919 TokenToGet
= STRING_TOKEN (STR_MISC_MRC_VERSION_VALUE
);
920 MrcVer
= SmbiosMiscGetString (TokenToGet
);
921 MRCVersionStrLen
= StrLen(MrcVer
);
922 if (MRCVersionStrLen
> SMBIOS_STRING_MAX_LENGTH
) {
926 TokenToGet
= STRING_TOKEN (STR_MISC_PMC_FW_VALUE
);
927 PmcVer
= SmbiosMiscGetString (TokenToGet
);
928 PMCVersionStrLen
= StrLen(PmcVer
);
929 if (PMCVersionStrLen
> SMBIOS_STRING_MAX_LENGTH
) {
933 TokenToGet
= STRING_TOKEN (STR_MISC_ULPMC_FW_VALUE
);
934 UlpmcVer
= SmbiosMiscGetString (TokenToGet
);
935 ULPMCVersionStrLen
= StrLen(UlpmcVer
);
936 if (ULPMCVersionStrLen
> SMBIOS_STRING_MAX_LENGTH
) {
940 TokenToGet
= STRING_TOKEN (STR_MISC_PUNIT_FW_VALUE
);
941 PunitVer
= SmbiosMiscGetString (TokenToGet
);
942 PUNITVersionStrLen
= StrLen(PunitVer
);
943 if (PUNITVersionStrLen
> SMBIOS_STRING_MAX_LENGTH
) {
947 TokenToGet
= STRING_TOKEN (STR_MISC_SOC_VALUE
);
948 SocVer
= SmbiosMiscGetString (TokenToGet
);
949 SOCVersionStrLen
= StrLen(SocVer
);
950 if (SOCVersionStrLen
> SMBIOS_STRING_MAX_LENGTH
) {
954 TokenToGet
= STRING_TOKEN (STR_MISC_BOARD_ID_VALUE
);
955 BoardVer
= SmbiosMiscGetString (TokenToGet
);
956 BOARDVersionStrLen
= StrLen(BoardVer
);
957 if (BOARDVersionStrLen
> SMBIOS_STRING_MAX_LENGTH
) {
961 TokenToGet
= STRING_TOKEN (STR_MISC_FAB_ID_VALUE
);
962 FabVer
= SmbiosMiscGetString (TokenToGet
);
963 FABVersionStrLen
= StrLen(FabVer
);
964 if (FABVersionStrLen
> SMBIOS_STRING_MAX_LENGTH
) {
968 TokenToGet
= STRING_TOKEN (STR_MISC_CPU_FLAVOR_VALUE
);
969 CpuFlavor
= SmbiosMiscGetString (TokenToGet
);
970 CPUFLAVORStrLen
= StrLen(CpuFlavor
);
971 if (CPUFLAVORStrLen
> SMBIOS_STRING_MAX_LENGTH
) {
975 TokenToGet
= STRING_TOKEN (STR_MISC_BIOS_VERSION
);
976 BiosVer
= SmbiosMiscGetString (TokenToGet
);
977 BIOSVersionStrLen
= StrLen(BiosVer
);
978 if (BIOSVersionStrLen
> SMBIOS_STRING_MAX_LENGTH
) {
982 TokenToGet
= STRING_TOKEN (STR_MISC_PMIC_VERSION
);
983 PmicVer
= SmbiosMiscGetString (TokenToGet
);
984 PMICVersionStrLen
= StrLen(PmicVer
);
985 if (PMICVersionStrLen
> SMBIOS_STRING_MAX_LENGTH
) {
989 TokenToGet
= STRING_TOKEN (STR_MISC_TOUCH_VERSION
);
990 TouchVer
= SmbiosMiscGetString (TokenToGet
);
991 TOUCHVersionStrLen
= StrLen(TouchVer
);
992 if (TOUCHVersionStrLen
> SMBIOS_STRING_MAX_LENGTH
) {
996 TokenToGet
= STRING_TOKEN (STR_MISC_SECURE_BOOT
);
997 SecureBootMode
= SmbiosMiscGetString(TokenToGet
);
998 SecureBootModeLen
= StrLen(SecureBootMode
);
999 if (SecureBootModeLen
> SMBIOS_STRING_MAX_LENGTH
) {
1003 TokenToGet
= STRING_TOKEN (STR_MISC_BOOT_MODE
);
1004 BootMode
= SmbiosMiscGetString(TokenToGet
);
1005 BootModeLen
= StrLen(BootMode
);
1006 if (BootModeLen
> SMBIOS_STRING_MAX_LENGTH
) {
1010 TokenToGet
= STRING_TOKEN (STR_MISC_SPEED_STEP
);
1011 SpeedStepMode
= SmbiosMiscGetString(TokenToGet
);
1012 SpeedStepModeLen
= StrLen(SpeedStepMode
);
1013 if (SpeedStepModeLen
> SMBIOS_STRING_MAX_LENGTH
) {
1017 TokenToGet
= STRING_TOKEN (STR_MISC_CPU_TURBO
);
1018 CpuTurbo
= SmbiosMiscGetString(TokenToGet
);
1019 CpuTurboLen
= StrLen(CpuTurbo
);
1020 if (CpuTurboLen
> SMBIOS_STRING_MAX_LENGTH
) {
1024 TokenToGet
= STRING_TOKEN (STR_MISC_CSTATE
);
1025 MaxCState
= SmbiosMiscGetString(TokenToGet
);
1026 MaxCStateLen
= StrLen(MaxCState
);
1027 if (MaxCStateLen
> SMBIOS_STRING_MAX_LENGTH
) {
1031 TokenToGet
= STRING_TOKEN (STR_MISC_GFX_TURBO
);
1032 GfxTurbo
= SmbiosMiscGetString(TokenToGet
);
1033 GfxTurboLen
= StrLen(GfxTurbo
);
1034 if (GfxTurboLen
> SMBIOS_STRING_MAX_LENGTH
) {
1038 TokenToGet
= STRING_TOKEN (STR_MISC_S0IX_VALUE
);
1039 IdleReserve
= SmbiosMiscGetString(TokenToGet
);
1040 IdleReserveLen
= StrLen(IdleReserve
);
1041 if (S0ixLen
> SMBIOS_STRING_MAX_LENGTH
) {
1045 TokenToGet
= STRING_TOKEN (STR_MISC_RC6_VALUE
);
1046 RC6
= SmbiosMiscGetString(TokenToGet
);
1047 RC6Len
= StrLen(RC6
);
1048 if (RC6Len
> SMBIOS_STRING_MAX_LENGTH
) {
1052 RecordLen
= sizeof (SMBIOS_TABLE_TYPE94
) + SECVerStrLen
+ 1 + uCodeVerStrLen
+ 1 + GOPStrLen
+ 1 + PMCVersionStrLen
+ 1 + \
1053 TOUCHVersionStrLen
+ 1 + PMICVersionStrLen
+ 1 + BIOSVersionStrLen
+ 1 + CPUFLAVORStrLen
+ 1 + \
1054 BOARDVersionStrLen
+ 1 + FABVersionStrLen
+ 1 + PUNITVersionStrLen
+ 1 + ULPMCVersionStrLen
+ 1 + \
1055 MRCVersionStrLen
+ 1 + SOCVersionStrLen
+ 1 + SecureBootModeLen
+ 1 + BootModeLen
+ 1 + \
1056 SpeedStepModeLen
+ 1 + CpuTurboLen
+ 1 + MaxCStateLen
+ 1 + GfxTurboLen
+ 1 + + RC6Len
+ 1 + 1;
1058 SmbiosRecord
= AllocatePool(RecordLen
);
1060 ZeroMem(SmbiosRecord
, RecordLen
);
1062 SmbiosRecord
->Hdr
.Type
= EFI_SMBIOS_TYPE_MISC_VERSION_INFO
;
1063 SmbiosRecord
->Hdr
.Length
= sizeof (SMBIOS_TABLE_TYPE94
);
1066 // Make handle chosen by smbios protocol.add automatically.
1068 SmbiosRecord
->Hdr
.Handle
= 0;
1070 SmbiosRecord
->GopVersion
= 1;
1072 SmbiosRecord
->SECVersion
= 2;
1074 SmbiosRecord
->MRCVersion
= 3;
1076 SmbiosRecord
->uCodeVersion
= 4;
1078 SmbiosRecord
->PUnitVersion
= 5;
1080 SmbiosRecord
->PMCVersion
= 6;
1082 SmbiosRecord
->ULPMCVersion
= 7;
1084 SmbiosRecord
->SoCVersion
= 8;
1086 SmbiosRecord
->BoardVersion
= 9;
1088 SmbiosRecord
->FabVersion
= 10;
1090 SmbiosRecord
->CPUFlavor
= 11;
1092 SmbiosRecord
->BiosVersion
= 12;
1094 SmbiosRecord
->PmicVersion
= 13;
1096 SmbiosRecord
->TouchVersion
= 14;
1098 SmbiosRecord
->SecureBoot
= 15;
1100 SmbiosRecord
->BootMode
= 16;
1102 SmbiosRecord
->SpeedStepMode
= 17;
1104 SmbiosRecord
->CPUTurboMode
= 18;
1106 SmbiosRecord
->MaxCState
= 19;
1108 SmbiosRecord
->GfxTurbo
= 20;
1109 SmbiosRecord
->IdleReserve
= 21;
1111 SmbiosRecord
->RC6
= 22;
1114 OptionalStrStart
= (CHAR8
*)(SmbiosRecord
+ 1);
1115 UnicodeStrToAsciiStr(GOPVer
, OptionalStrStart
);
1116 StrIdx
+= GOPStrLen
+ 1;
1118 UnicodeStrToAsciiStr(SECVer
, OptionalStrStart
+ StrIdx
);
1119 StrIdx
+= SECVerStrLen
+ 1;
1121 UnicodeStrToAsciiStr(MrcVer
, OptionalStrStart
+ StrIdx
);
1122 StrIdx
+= MRCVersionStrLen
+ 1;
1124 UnicodeStrToAsciiStr(uCodeVer
, OptionalStrStart
+ StrIdx
);
1125 StrIdx
+= uCodeVerStrLen
+ 1;
1127 UnicodeStrToAsciiStr(PunitVer
, OptionalStrStart
+ StrIdx
);
1128 StrIdx
+= PUNITVersionStrLen
+ 1;
1130 UnicodeStrToAsciiStr(PmcVer
, OptionalStrStart
+ StrIdx
);
1131 StrIdx
+= PMCVersionStrLen
+ 1;
1133 UnicodeStrToAsciiStr(UlpmcVer
, OptionalStrStart
+ StrIdx
);
1134 StrIdx
+= ULPMCVersionStrLen
+ 1;
1137 UnicodeStrToAsciiStr(SocVer
, OptionalStrStart
+ StrIdx
);
1138 StrIdx
+= SOCVersionStrLen
+1;
1140 UnicodeStrToAsciiStr(BoardVer
, OptionalStrStart
+ StrIdx
);
1141 StrIdx
+= BOARDVersionStrLen
+ 1;
1143 UnicodeStrToAsciiStr(FabVer
, OptionalStrStart
+ StrIdx
);
1144 StrIdx
+= FABVersionStrLen
+ 1;
1146 UnicodeStrToAsciiStr(CpuFlavor
, OptionalStrStart
+ StrIdx
);
1147 StrIdx
+= CPUFLAVORStrLen
+ 1;
1149 UnicodeStrToAsciiStr(BiosVer
, OptionalStrStart
+ StrIdx
);
1150 StrIdx
+= BIOSVersionStrLen
+ 1;
1152 UnicodeStrToAsciiStr(PmicVer
, OptionalStrStart
+ StrIdx
);
1153 StrIdx
+= PMICVersionStrLen
+ 1;
1155 UnicodeStrToAsciiStr(TouchVer
, OptionalStrStart
+ StrIdx
);
1156 StrIdx
+= TOUCHVersionStrLen
+ 1;
1158 UnicodeStrToAsciiStr(SecureBootMode
, OptionalStrStart
+ StrIdx
);
1159 StrIdx
+= SecureBootModeLen
+ 1;
1161 UnicodeStrToAsciiStr(BootMode
, OptionalStrStart
+ StrIdx
);
1162 StrIdx
+= BootModeLen
+ 1;
1164 UnicodeStrToAsciiStr(SpeedStepMode
, OptionalStrStart
+ StrIdx
);
1165 StrIdx
+= SpeedStepModeLen
+ 1;
1167 UnicodeStrToAsciiStr(CpuTurbo
, OptionalStrStart
+ StrIdx
);
1168 StrIdx
+= CpuTurboLen
+ 1;
1170 UnicodeStrToAsciiStr(MaxCState
, OptionalStrStart
+ StrIdx
);
1171 StrIdx
+= MaxCStateLen
+ 1;
1173 UnicodeStrToAsciiStr(GfxTurbo
, OptionalStrStart
+ StrIdx
);
1174 StrIdx
+= GfxTurboLen
+ 1;
1176 UnicodeStrToAsciiStr(IdleReserve
, OptionalStrStart
+ StrIdx
);
1177 StrIdx
+= S0ixLen
+ 1;
1179 UnicodeStrToAsciiStr(RC6
, OptionalStrStart
+ StrIdx
);
1180 StrIdx
+= RC6Len
+ 1;
1183 // Now we have got the full smbios record, call smbios protocol to add this record.
1185 SmbiosHandle
= SMBIOS_HANDLE_PI_RESERVED
;
1186 Status
= SmbiosProtocol
-> Add (
1190 (EFI_SMBIOS_TABLE_HEADER
*) SmbiosRecord
1193 FreePool(SmbiosRecord
);
1198 This function makes boot time changes to the contents of the
1199 MiscOemType0x94 (Type 0x94).
1201 @param RecordData Pointer to copy of RecordData from the Data Table.
1203 @retval EFI_SUCCESS All parameters were valid.
1204 @retval EFI_UNSUPPORTED Unexpected RecordType value.
1205 @retval EFI_INVALID_PARAMETER Invalid parameter was found.
1208 MISC_SMBIOS_TABLE_FUNCTION(MiscOemType0x94
)
1211 EFI_EVENT AddSmbiosT0x94CallbackEvent
;
1213 Status
= EfiCreateEventReadyToBootEx (
1215 AddSmbiosT0x94Callback
,
1217 &AddSmbiosT0x94CallbackEvent
1220 ASSERT_EFI_ERROR (Status
);