1/** @file
2  The header file of HII Config Access protocol implementation of TCG2
3  configuration module.
4
5Copyright (c) 2015 - 2017, Intel Corporation. All rights reserved.<BR>
6This program and the accompanying materials
7are licensed and made available under the terms and conditions of the BSD License
8which accompanies this distribution.  The full text of the license may be found at
9http://opensource.org/licenses/bsd-license.php
10
11THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
12WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
13
14**/
15
16#ifndef __TCG2_CONFIG_IMPL_H__
17#define __TCG2_CONFIG_IMPL_H__
18
19#include <Uefi.h>
20
21#include <Protocol/HiiConfigAccess.h>
22#include <Protocol/HiiConfigRouting.h>
23#include <Protocol/Tcg2Protocol.h>
24#include <Protocol/VariableLock.h>
25
26#include <Library/BaseLib.h>
27#include <Library/BaseMemoryLib.h>
28#include <Library/DebugLib.h>
29#include <Library/MemoryAllocationLib.h>
30#include <Library/UefiBootServicesTableLib.h>
31#include <Library/UefiRuntimeServicesTableLib.h>
32#include <Library/UefiHiiServicesLib.h>
33#include <Library/UefiLib.h>
34#include <Library/HiiLib.h>
35#include <Library/DevicePathLib.h>
36#include <Library/PcdLib.h>
37#include <Library/PrintLib.h>
38#include <Library/Tcg2PhysicalPresenceLib.h>
39
40#include <Guid/MdeModuleHii.h>
41
42#include "Tcg2ConfigNvData.h"
43
44//
45// Tool generated IFR binary data and String package data
46//
47extern UINT8                        Tcg2ConfigBin[];
48extern UINT8                        Tcg2ConfigDxeStrings[];
49
50///
51/// HII specific Vendor Device Path definition.
52///
53typedef struct {
54  VENDOR_DEVICE_PATH                VendorDevicePath;
55  EFI_DEVICE_PATH_PROTOCOL          End;
56} HII_VENDOR_DEVICE_PATH;
57
58typedef struct {
59  UINTN                             Signature;
60
61  EFI_HII_CONFIG_ACCESS_PROTOCOL    ConfigAccess;
62  EFI_HII_HANDLE                    HiiHandle;
63  EFI_HANDLE                        DriverHandle;
64
65  UINT8                             TpmDeviceDetected;
66  EFI_TCG2_PROTOCOL                 *Tcg2Protocol;
67  EFI_TCG2_BOOT_SERVICE_CAPABILITY  ProtocolCapability;
68  UINT32                            PCRBanksDesired;
69} TCG2_CONFIG_PRIVATE_DATA;
70
71extern TCG2_CONFIG_PRIVATE_DATA      mTcg2ConfigPrivateDateTemplate;
72extern TCG2_CONFIG_PRIVATE_DATA      *mTcg2ConfigPrivateDate;
73#define TCG2_CONFIG_PRIVATE_DATA_SIGNATURE     SIGNATURE_32 ('T', 'r', 'E', 'D')
74#define TCG2_CONFIG_PRIVATE_DATA_FROM_THIS(a)  CR (a, TCG2_CONFIG_PRIVATE_DATA, ConfigAccess, TCG2_CONFIG_PRIVATE_DATA_SIGNATURE)
75
76#define TPM_HID_PNP_SIZE                                           8
77#define TPM_HID_ACPI_SIZE                                          9
78
79/**
80  This function publish the TCG2 configuration Form for TPM device.
81
82  @param[in, out]  PrivateData   Points to TCG2 configuration private data.
83
84  @retval EFI_SUCCESS            HII Form is installed for this network device.
85  @retval EFI_OUT_OF_RESOURCES   Not enough resource for HII Form installation.
86  @retval Others                 Other errors as indicated.
87
88**/
89EFI_STATUS
90InstallTcg2ConfigForm (
91  IN OUT TCG2_CONFIG_PRIVATE_DATA  *PrivateData
92  );
93
94/**
95  This function removes TCG2 configuration Form.
96
97  @param[in, out]  PrivateData   Points to TCG2 configuration private data.
98
99**/
100VOID
101UninstallTcg2ConfigForm (
102  IN OUT TCG2_CONFIG_PRIVATE_DATA    *PrivateData
103  );
104
105/**
106  This function allows a caller to extract the current configuration for one
107  or more named elements from the target driver.
108
109  @param[in]   This              Points to the EFI_HII_CONFIG_ACCESS_PROTOCOL.
110  @param[in]   Request           A null-terminated Unicode string in
111                                 <ConfigRequest> format.
112  @param[out]  Progress          On return, points to a character in the Request
113                                 string. Points to the string's null terminator if
114                                 request was successful. Points to the most recent
115                                 '&' before the first failing name/value pair (or
116                                 the beginning of the string if the failure is in
117                                 the first name/value pair) if the request was not
118                                 successful.
119  @param[out]  Results           A null-terminated Unicode string in
120                                 <ConfigAltResp> format which has all values filled
121                                 in for the names in the Request string. String to
122                                 be allocated by the called function.
123
124  @retval EFI_SUCCESS            The Results is filled with the requested values.
125  @retval EFI_OUT_OF_RESOURCES   Not enough memory to store the results.
126  @retval EFI_INVALID_PARAMETER  Request is illegal syntax, or unknown name.
127  @retval EFI_NOT_FOUND          Routing data doesn't match any storage in this
128                                 driver.
129
130**/
131EFI_STATUS
132EFIAPI
133Tcg2ExtractConfig (
134  IN CONST EFI_HII_CONFIG_ACCESS_PROTOCOL        *This,
135  IN CONST EFI_STRING                            Request,
136       OUT EFI_STRING                            *Progress,
137       OUT EFI_STRING                            *Results
138  );
139
140/**
141  This function processes the results of changes in configuration.
142
143  @param[in]  This               Points to the EFI_HII_CONFIG_ACCESS_PROTOCOL.
144  @param[in]  Configuration      A null-terminated Unicode string in <ConfigResp>
145                                 format.
146  @param[out] Progress           A pointer to a string filled in with the offset of
147                                 the most recent '&' before the first failing
148                                 name/value pair (or the beginning of the string if
149                                 the failure is in the first name/value pair) or
150                                 the terminating NULL if all was successful.
151
152  @retval EFI_SUCCESS            The Results is processed successfully.
153  @retval EFI_INVALID_PARAMETER  Configuration is NULL.
154  @retval EFI_NOT_FOUND          Routing data doesn't match any storage in this
155                                 driver.
156
157**/
158EFI_STATUS
159EFIAPI
160Tcg2RouteConfig (
161  IN CONST EFI_HII_CONFIG_ACCESS_PROTOCOL      *This,
162  IN CONST EFI_STRING                          Configuration,
163       OUT EFI_STRING                          *Progress
164  );
165
166/**
167  This function processes the results of changes in configuration.
168
169  @param[in]  This               Points to the EFI_HII_CONFIG_ACCESS_PROTOCOL.
170  @param[in]  Action             Specifies the type of action taken by the browser.
171  @param[in]  QuestionId         A unique value which is sent to the original
172                                 exporting driver so that it can identify the type
173                                 of data to expect.
174  @param[in]  Type               The type of value for the question.
175  @param[in]  Value              A pointer to the data being sent to the original
176                                 exporting driver.
177  @param[out] ActionRequest      On return, points to the action requested by the
178                                 callback function.
179
180  @retval EFI_SUCCESS            The callback successfully handled the action.
181  @retval EFI_OUT_OF_RESOURCES   Not enough storage is available to hold the
182                                 variable and its data.
183  @retval EFI_DEVICE_ERROR       The variable could not be saved.
184  @retval EFI_UNSUPPORTED        The specified Action is not supported by the
185                                 callback.
186
187**/
188EFI_STATUS
189EFIAPI
190Tcg2Callback (
191  IN CONST EFI_HII_CONFIG_ACCESS_PROTOCOL      *This,
192  IN     EFI_BROWSER_ACTION                    Action,
193  IN     EFI_QUESTION_ID                       QuestionId,
194  IN     UINT8                                 Type,
195  IN     EFI_IFR_TYPE_VALUE                    *Value,
196     OUT EFI_BROWSER_ACTION_REQUEST            *ActionRequest
197  );
198
199#endif
200