]> git.proxmox.com Git - mirror_edk2.git/blame - SecurityPkg/Tcg/TrEEConfig/TrEEConfigDriver.c
SecurityPkg/TrEEPei: remove TrEE.
[mirror_edk2.git] / SecurityPkg / Tcg / TrEEConfig / TrEEConfigDriver.c
CommitLineData
c1d93242
JY
1/** @file\r
2 The module entry point for TrEE configuration module.\r
3\r
4Copyright (c) 2013, Intel Corporation. All rights reserved.<BR>\r
5This program and the accompanying materials \r
6are licensed and made available under the terms and conditions of the BSD License \r
7which accompanies this distribution. The full text of the license may be found at \r
8http://opensource.org/licenses/bsd-license.php\r
9\r
10THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, \r
11WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
12\r
13**/\r
14\r
15#include "TrEEConfigImpl.h"\r
16\r
17extern TPM_INSTANCE_ID mTpmInstanceId[TPM_DEVICE_MAX + 1];\r
18\r
19/**\r
20 The entry point for TrEE configuration driver.\r
21\r
22 @param[in] ImageHandle The image handle of the driver.\r
23 @param[in] SystemTable The system table.\r
24\r
25 @retval EFI_ALREADY_STARTED The driver already exists in system.\r
26 @retval EFI_OUT_OF_RESOURCES Fail to execute entry point due to lack of resources.\r
27 @retval EFI_SUCCES All the related protocols are installed on the driver.\r
28 @retval Others Fail to install protocols as indicated.\r
29\r
30**/\r
31EFI_STATUS\r
32EFIAPI\r
33TrEEConfigDriverEntryPoint (\r
34 IN EFI_HANDLE ImageHandle,\r
35 IN EFI_SYSTEM_TABLE *SystemTable\r
36 )\r
37{\r
38 EFI_STATUS Status;\r
39 TREE_CONFIG_PRIVATE_DATA *PrivateData;\r
40 TREE_CONFIGURATION TrEEConfiguration;\r
5437d457 41 TREE_DEVICE_DETECTION TrEEDeviceDetection;\r
c1d93242
JY
42 UINTN Index;\r
43 UINTN DataSize;\r
5437d457 44 EDKII_VARIABLE_LOCK_PROTOCOL *VariableLockProtocol;\r
c1d93242
JY
45\r
46 Status = gBS->OpenProtocol (\r
47 ImageHandle,\r
48 &gEfiCallerIdGuid,\r
49 NULL,\r
50 ImageHandle,\r
51 ImageHandle,\r
52 EFI_OPEN_PROTOCOL_TEST_PROTOCOL\r
53 );\r
54 if (!EFI_ERROR (Status)) {\r
55 return EFI_ALREADY_STARTED;\r
56 }\r
57 \r
58 //\r
59 // Create a private data structure.\r
60 //\r
61 PrivateData = AllocateCopyPool (sizeof (TREE_CONFIG_PRIVATE_DATA), &mTrEEConfigPrivateDateTemplate);\r
62 ASSERT (PrivateData != NULL);\r
63\r
64 //\r
65 // Install private GUID.\r
66 // \r
67 Status = gBS->InstallMultipleProtocolInterfaces (\r
68 &ImageHandle,\r
69 &gEfiCallerIdGuid,\r
70 PrivateData,\r
71 NULL\r
72 );\r
73 ASSERT_EFI_ERROR (Status);\r
74\r
75 DataSize = sizeof(TrEEConfiguration);\r
76 Status = gRT->GetVariable (\r
77 TREE_STORAGE_NAME,\r
78 &gTrEEConfigFormSetGuid,\r
79 NULL,\r
80 &DataSize,\r
81 &TrEEConfiguration\r
82 );\r
83 if (EFI_ERROR (Status)) {\r
5437d457
JY
84 //\r
85 // Variable not ready, set default value\r
86 //\r
87 TrEEConfiguration.TpmDevice = TPM_DEVICE_DEFAULT;\r
c1d93242 88 }\r
5437d457 89\r
c1d93242 90 //\r
5437d457 91 // Validation\r
c1d93242 92 //\r
5437d457
JY
93 if ((TrEEConfiguration.TpmDevice > TPM_DEVICE_MAX) || (TrEEConfiguration.TpmDevice < TPM_DEVICE_MIN)) {\r
94 TrEEConfiguration.TpmDevice = TPM_DEVICE_DEFAULT;\r
95 }\r
c1d93242
JY
96\r
97 //\r
5437d457 98 // Save to variable so platform driver can get it.\r
c1d93242 99 //\r
5437d457
JY
100 Status = gRT->SetVariable (\r
101 TREE_STORAGE_NAME,\r
102 &gTrEEConfigFormSetGuid,\r
103 EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS,\r
104 sizeof(TrEEConfiguration),\r
105 &TrEEConfiguration\r
106 );\r
107 if (EFI_ERROR (Status)) {\r
108 DEBUG ((EFI_D_ERROR, "TrEEConfigDriver: Fail to set TREE_STORAGE_NAME\n"));\r
109 }\r
c1d93242
JY
110\r
111 //\r
5437d457 112 // Sync data from PCD to variable, so that we do not need detect again in S3 phase.\r
c1d93242 113 //\r
5437d457 114 TrEEDeviceDetection.TpmDeviceDetected = TPM_DEVICE_NULL;\r
c1d93242
JY
115 for (Index = 0; Index < sizeof(mTpmInstanceId)/sizeof(mTpmInstanceId[0]); Index++) {\r
116 if (CompareGuid (PcdGetPtr(PcdTpmInstanceGuid), &mTpmInstanceId[Index].TpmInstanceGuid)) {\r
5437d457 117 TrEEDeviceDetection.TpmDeviceDetected = mTpmInstanceId[Index].TpmDevice;\r
c1d93242
JY
118 break;\r
119 }\r
120 }\r
121\r
5437d457
JY
122 PrivateData->TpmDeviceDetected = TrEEDeviceDetection.TpmDeviceDetected;\r
123\r
c1d93242
JY
124 //\r
125 // Save to variable so platform driver can get it.\r
126 //\r
127 Status = gRT->SetVariable (\r
5437d457 128 TREE_DEVICE_DETECTION_NAME,\r
c1d93242 129 &gTrEEConfigFormSetGuid,\r
207256b7 130 EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS,\r
5437d457
JY
131 sizeof(TrEEDeviceDetection),\r
132 &TrEEDeviceDetection\r
c1d93242 133 );\r
5437d457
JY
134 if (EFI_ERROR (Status)) {\r
135 DEBUG ((EFI_D_ERROR, "TrEEConfigDriver: Fail to set TREE_DEVICE_DETECTION_NAME\n"));\r
136 Status = gRT->SetVariable (\r
137 TREE_DEVICE_DETECTION_NAME,\r
138 &gTrEEConfigFormSetGuid,\r
139 EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS,\r
140 0,\r
141 NULL\r
142 );\r
143 ASSERT_EFI_ERROR (Status);\r
144 }\r
145\r
146 //\r
147 // We should lock TrEEDeviceDetection, because it contains information needed at S3.\r
148 //\r
149 Status = gBS->LocateProtocol (&gEdkiiVariableLockProtocolGuid, NULL, (VOID **)&VariableLockProtocol);\r
150 if (!EFI_ERROR (Status)) {\r
151 Status = VariableLockProtocol->RequestToLock (\r
152 VariableLockProtocol,\r
153 TREE_DEVICE_DETECTION_NAME,\r
154 &gTrEEConfigFormSetGuid\r
155 );\r
156 ASSERT_EFI_ERROR (Status);\r
157 }\r
c1d93242
JY
158 \r
159 //\r
160 // Install TrEE configuration form\r
161 //\r
162 Status = InstallTrEEConfigForm (PrivateData);\r
163 if (EFI_ERROR (Status)) {\r
164 goto ErrorExit;\r
165 }\r
166\r
167 return EFI_SUCCESS;\r
168\r
169ErrorExit:\r
170 if (PrivateData != NULL) {\r
171 UninstallTrEEConfigForm (PrivateData);\r
172 } \r
173 \r
174 return Status;\r
175}\r
176\r
177/**\r
178 Unload the TrEE configuration form.\r
179\r
180 @param[in] ImageHandle The driver's image handle.\r
181\r
182 @retval EFI_SUCCESS The TrEE configuration form is unloaded.\r
183 @retval Others Failed to unload the form.\r
184\r
185**/\r
186EFI_STATUS\r
187EFIAPI\r
188TrEEConfigDriverUnload (\r
189 IN EFI_HANDLE ImageHandle\r
190 )\r
191{\r
192 EFI_STATUS Status;\r
193 TREE_CONFIG_PRIVATE_DATA *PrivateData;\r
194\r
195 Status = gBS->HandleProtocol (\r
196 ImageHandle,\r
197 &gEfiCallerIdGuid,\r
198 (VOID **) &PrivateData\r
199 ); \r
200 if (EFI_ERROR (Status)) {\r
201 return Status; \r
202 }\r
203 \r
204 ASSERT (PrivateData->Signature == TREE_CONFIG_PRIVATE_DATA_SIGNATURE);\r
205\r
206 gBS->UninstallMultipleProtocolInterfaces (\r
207 &ImageHandle,\r
208 &gEfiCallerIdGuid,\r
209 PrivateData,\r
210 NULL\r
211 );\r
212 \r
213 UninstallTrEEConfigForm (PrivateData);\r
214\r
215 return EFI_SUCCESS;\r
216}\r