]> git.proxmox.com Git - mirror_edk2.git/blame - SecurityPkg/Tcg/Tcg2Config/Tcg2ConfigPeim.c
SecurityPkg: Replace BSD License with BSD+Patent License
[mirror_edk2.git] / SecurityPkg / Tcg / Tcg2Config / Tcg2ConfigPeim.c
CommitLineData
1abfa4ce
JY
1/** @file\r
2 The module entry point for Tcg2 configuration module.\r
3\r
b3548d32 4Copyright (c) 2015 - 2018, Intel Corporation. All rights reserved.<BR>\r
289b714b 5SPDX-License-Identifier: BSD-2-Clause-Patent\r
1abfa4ce
JY
6\r
7**/\r
8\r
9\r
10#include <PiPei.h>\r
11\r
12#include <Guid/TpmInstance.h>\r
13\r
14#include <Library/BaseLib.h>\r
15#include <Library/BaseMemoryLib.h>\r
16#include <Library/DebugLib.h>\r
17#include <Library/MemoryAllocationLib.h>\r
18#include <Library/PeiServicesLib.h>\r
19#include <Library/PcdLib.h>\r
20\r
21#include <Ppi/ReadOnlyVariable2.h>\r
22#include <Ppi/TpmInitialized.h>\r
23#include <Protocol/Tcg2Protocol.h>\r
24\r
25#include "Tcg2ConfigNvData.h"\r
26\r
27TPM_INSTANCE_ID mTpmInstanceId[] = TPM_INSTANCE_ID_LIST;\r
28\r
29CONST EFI_PEI_PPI_DESCRIPTOR gTpmSelectedPpi = {\r
30 (EFI_PEI_PPI_DESCRIPTOR_PPI | EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST),\r
31 &gEfiTpmDeviceSelectedGuid,\r
32 NULL\r
33};\r
34\r
35EFI_PEI_PPI_DESCRIPTOR mTpmInitializationDonePpiList = {\r
36 EFI_PEI_PPI_DESCRIPTOR_PPI | EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST,\r
37 &gPeiTpmInitializationDonePpiGuid,\r
38 NULL\r
39};\r
40\r
41/**\r
42 This routine check both SetupVariable and real TPM device, and return final TpmDevice configuration.\r
43\r
44 @param SetupTpmDevice TpmDevice configuration in setup driver\r
45\r
46 @return TpmDevice configuration\r
47**/\r
48UINT8\r
49DetectTpmDevice (\r
50 IN UINT8 SetupTpmDevice\r
51 );\r
52\r
53/**\r
54 The entry point for Tcg2 configuration driver.\r
55\r
56 @param FileHandle Handle of the file being invoked.\r
57 @param PeiServices Describes the list of possible PEI Services.\r
58\r
59 @retval EFI_SUCCES Convert variable to PCD successfully.\r
60 @retval Others Fail to convert variable to PCD.\r
61**/\r
62EFI_STATUS\r
63EFIAPI\r
64Tcg2ConfigPeimEntryPoint (\r
65 IN EFI_PEI_FILE_HANDLE FileHandle,\r
66 IN CONST EFI_PEI_SERVICES **PeiServices\r
67 )\r
68{\r
69 UINTN Size;\r
70 EFI_STATUS Status;\r
71 EFI_STATUS Status2;\r
72 EFI_PEI_READ_ONLY_VARIABLE2_PPI *VariablePpi;\r
73 TCG2_CONFIGURATION Tcg2Configuration;\r
74 UINTN Index;\r
75 UINT8 TpmDevice;\r
76\r
77 Status = PeiServicesLocatePpi (&gEfiPeiReadOnlyVariable2PpiGuid, 0, NULL, (VOID **) &VariablePpi);\r
78 ASSERT_EFI_ERROR (Status);\r
79\r
80 Size = sizeof(Tcg2Configuration);\r
81 Status = VariablePpi->GetVariable (\r
82 VariablePpi,\r
83 TCG2_STORAGE_NAME,\r
84 &gTcg2ConfigFormSetGuid,\r
85 NULL,\r
86 &Size,\r
87 &Tcg2Configuration\r
88 );\r
89 if (EFI_ERROR (Status)) {\r
90 //\r
91 // Variable not ready, set default value\r
92 //\r
93 Tcg2Configuration.TpmDevice = TPM_DEVICE_DEFAULT;\r
94 }\r
95\r
96 //\r
97 // Validation\r
98 //\r
99 if ((Tcg2Configuration.TpmDevice > TPM_DEVICE_MAX) || (Tcg2Configuration.TpmDevice < TPM_DEVICE_MIN)) {\r
100 Tcg2Configuration.TpmDevice = TPM_DEVICE_DEFAULT;\r
101 }\r
102\r
103 //\r
104 // Although we have SetupVariable info, we still need detect TPM device manually.\r
105 //\r
106 DEBUG ((EFI_D_INFO, "Tcg2Configuration.TpmDevice from Setup: %x\n", Tcg2Configuration.TpmDevice));\r
107\r
108 if (PcdGetBool (PcdTpmAutoDetection)) {\r
109 TpmDevice = DetectTpmDevice (Tcg2Configuration.TpmDevice);\r
110 DEBUG ((EFI_D_INFO, "TpmDevice final: %x\n", TpmDevice));\r
111 if (TpmDevice != TPM_DEVICE_NULL) {\r
112 Tcg2Configuration.TpmDevice = TpmDevice;\r
113 }\r
114 } else {\r
115 TpmDevice = Tcg2Configuration.TpmDevice;\r
116 }\r
117\r
118 //\r
119 // Convert variable to PCD.\r
120 // This is work-around because there is no gurantee DynamicHiiPcd can return correct value in DXE phase.\r
121 // Using DynamicPcd instead.\r
122 //\r
123 // NOTE: Tcg2Configuration variable contains the desired TpmDevice type,\r
124 // while PcdTpmInstanceGuid PCD contains the real detected TpmDevice type\r
125 //\r
126 for (Index = 0; Index < sizeof(mTpmInstanceId)/sizeof(mTpmInstanceId[0]); Index++) {\r
127 if (TpmDevice == mTpmInstanceId[Index].TpmDevice) {\r
128 Size = sizeof(mTpmInstanceId[Index].TpmInstanceGuid);\r
fe3ca12d
SZ
129 Status = PcdSetPtrS (PcdTpmInstanceGuid, &Size, &mTpmInstanceId[Index].TpmInstanceGuid);\r
130 ASSERT_EFI_ERROR (Status);\r
1abfa4ce
JY
131 DEBUG ((EFI_D_INFO, "TpmDevice PCD: %g\n", &mTpmInstanceId[Index].TpmInstanceGuid));\r
132 break;\r
133 }\r
134 }\r
135\r
136 //\r
137 // Selection done\r
138 //\r
139 Status = PeiServicesInstallPpi (&gTpmSelectedPpi);\r
140 ASSERT_EFI_ERROR (Status);\r
141\r
142 //\r
143 // Even if no TPM is selected or detected, we still need intall TpmInitializationDonePpi.\r
144 // Because TcgPei or Tcg2Pei will not run, but we still need a way to notify other driver.\r
145 // Other driver can know TPM initialization state by TpmInitializedPpi.\r
146 //\r
147 if (CompareGuid (PcdGetPtr(PcdTpmInstanceGuid), &gEfiTpmDeviceInstanceNoneGuid)) {\r
148 Status2 = PeiServicesInstallPpi (&mTpmInitializationDonePpiList);\r
149 ASSERT_EFI_ERROR (Status2);\r
150 }\r
151\r
152 return Status;\r
153}\r