1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
|
/** @file
UEFI Platform to Driver Configuration Protocol is defined in UEFI specification.
This is a protocol that is optionally produced by the platform and optionally consumed
by a UEFI Driver in its Start() function. This protocol allows the driver to receive
configuration information as part of being started.
Copyright (c) 2006 - 2008, Intel Corporation
All rights reserved. This program and the accompanying materials
are licensed and made available under the terms and conditions of the BSD License
which accompanies this distribution. The full text of the license may be found at
http://opensource.org/licenses/bsd-license.php
THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
**/
#ifndef __PLATFORM_TO_DRIVER_CONFIGUARTION_H__
#define __PLATFORM_TO_DRIVER_CONFIGUARTION_H__
#define EFI_PLATFORM_TO_DRIVER_CONFIGURATION_PROTOCOL_GUID \
{ 0x642cd590, 0x8059, 0x4c0a, { 0xa9, 0x58, 0xc5, 0xec, 0x7, 0xd2, 0x3c, 0x4b } }
typedef struct _EFI_PLATFORM_TO_DRIVER_CONFIGURATION_PROTOCOL EFI_PLATFORM_TO_DRIVER_CONFIGURATION_PROTOCOL;
/**
The UEFI driver must call Query early in the Start() function
before any time consuming operations are performed. If
ChildHandle is NULL the driver is requesting information from
the platform about the ControllerHandle that is being started.
Information returned from Query may lead to the drivers Start()
function failing. If the UEFI driver is a bus driver and
producing a ChildHandle the driver must call Query after the
child handle has been created and an EFI_DEVICE_PATH_PROTOCOL
has been placed on that handle, but before any time consuming
operation is performed. If information return by Query may lead
the driver to decide to not create the ChildHandle. The driver
must then cleanup and remove the ChildHandle from the system.
The UEFI driver repeatedly calls Query, processes the
information returned by the platform, and calls Response passing
in the arguments returned from Query. The Instance value passed
into Response must be the same value returned from the
corresponding call to Query. The UEFI driver must continuously
call Query and Response until EFI_NOT_FOUND is returned by
Query. The only value of Instance that has meaning to the UEFI
driver is zero. An Instance value of zero means return the first
ParameterBlock in the set of unprocessed parameter blocks. If a
ParameterBlock has been processed via a Query and corresponding
Response call it must not be returned again via a Query call.
@param This A pointer to the EFI_PLATFORM_TO_DRIVER_CONFIGURATION_PROTOCOL instance.
@param ControllerHandle The handle the platform will return
configuration information about.
@param ChildHandle The handle of the child controller to
return information on. This is an optional
parameter that may be NULL. It will be
NULL for device drivers, and for bus
drivers that attempt to get options for
the bus controller. It will not be NULL
for a bus driver that attempts to get
options for one of its child controllers.
@param Instance Pointer to the Instance value. On output the
instance associated with the parameter data
return. On input zero means return the first
query data or pass in a valid instance
number returned from a previous call to
Query.
@param ParameterTypeGuid An EFI_GUID that defines the
contents of ParameterBlock. UEFI
drivers must use the
ParameterTypeGuid to determine how
to parser the ParameterBlock.
@param ParameterBlock The platform returns a pointer to the
ParameterBlock structure which
contains details about the
configuration parameters specific to
the ParameterTypeGuid. This structure
is defined based on the protocol and
may be different for different
protocols. UEFI driver decodes this
structure and its contents based on
ProtocolGuid. ParameterBlock is
allocated by the platform and the
platform is responsible for freeing
the ParameterBlock after Result is
called.
@param ParameterBlockSize The platform returns the size of
the ParameterBlock in bytes.
@retval EFI_SUCCESS The platform return parameter
information for ControllerHandle.
@retval EFI_NOT_FOUND No more unread Instance exists.
@retval EFI_INVALID_PARAMETER ControllerHandle is not a valid
EFI_HANDLE.
@retval EFI_INVALID_PARAMETER Instance is NULL.
@retval EFI_DEVICE_ERROR A device error occurred while
attempting to return parameter block
information for the controller
specified by ControllerHandle and
ChildHandle.
@retval EFI_OUT_RESOURCES There are not enough resources
available to set the configuration
options for the controller specified
by ControllerHandle and ChildHandle.
**/
typedef
EFI_STATUS
(EFIAPI *EFI_PLATFORM_TO_DRIVER_CONFIGURATION_QUERY)(
IN CONST EFI_PLATFORM_TO_DRIVER_CONFIGURATION_PROTOCOL *This,
IN CONST EFI_HANDLE ControllerHandle,
IN CONST EFI_HANDLE ChildHandle OPTIONAL,
IN OUT UINTN *Instance,
IN OUT EFI_GUID **ParameterTypeGuid,
IN OUT VOID **ParameterBlock,
IN OUT UINTN *ParameterBlockSize
);
typedef enum {
///
/// The controller specified by ControllerHandle is still
/// in a usable state, it's configuration has been updated
/// via parsing the ParameterBlock. If required by the
/// parameter block and the module supports an NVRAM store
/// the configuration information from PB was successfully
/// saved to the NVRAM. No actions are required before
/// this controller can be used again with the updated
/// configuration settings.
///
EfiPlatformConfigurationActionNone = 0,
///
/// The driver has detected that the controller specified
/// by ControllerHandle is not in a usable state, and it
/// needs to be stopped. The calling agent can use the
/// DisconnectControservice to perform this operation, and
/// it should be performed as soon as possible.
///
EfiPlatformConfigurationActionStopController = 1,
///
/// This controller specified by ControllerHandle needs to
/// be stopped and restarted before it can be used again.
/// The calling agent can use the DisconnectController()
/// and ConnectController() services to perform this
/// operation. The restart operation can be delayed until
/// all of the configuratiooptions have been set.
///
EfiPlatformConfigurationActionRestartController = 2,
///
/// A configuration change has been made that requires the
/// platform to be restarted before the controller
/// specified by ControllerHandle can be used again. The
/// calling agent can use the ResetSystem() services to
/// perform this operation. The restart operation can be
/// delayed until all of the configuration options have
/// been set.
///
EfiPlatformConfigurationActionRestartPlatform = 3,
///
/// The controller specified by ControllerHandle is still
/// in a usable state; its configuration has been updated
/// via parsing the ParameterBlock. The driver tried to
/// update the driver's private NVRAM store with
/// information from ParameterBlock and failed. No actions
/// are required before this controller can be used again
/// with the updated configuration settings, but these
/// configuration settings are not guaranteed to persist
/// after ControllerHandle is stopped.
///
EfiPlatformConfigurationActionNvramFailed = 4,
EfiPlatformConfigurationActionMaximum
} EFI_PLATFORM_CONFIGURATION_ACTION;
/**
The UEFI driver repeatedly calls Query, processes the
information returned by the platform, and calls Response passing
in the arguments returned from Query. The UEFI driver must
continuously call Query until EFI_NOT_FOUND is returned. For
every call to Query that returns EFI_SUCCESS a corrisponding
call to Response is required passing in the same
ContollerHandle, ChildHandle, Instance, ParameterTypeGuid,
ParameterBlock, and ParameterBlockSize. The UEFI driver may
update values in ParameterBlock based on rules defined by
ParameterTypeGuid. The platform is responsible for freeing
ParameterBlock and the UEFI driver must not try to free it
@param This A pointer to the EFI_PLATFORM_TO_DRIVER_CONFIGURATION_PROTOCOL instance.
@param ControllerHandle The handle the driver is returning
configuration information about.
@param ChildHandle The handle of the child controller to
return information on. This is an optional
parameter that may be NULL. It will be
NULL for device drivers, and for bus
drivers that attempt to get options for
the bus controller. It will not be NULL
for a bus driver that attempts to get
options for one of its child controllers.
Instance Instance data returned from
Query().
@param ParameterTypeGuid ParameterTypeGuid returned from Query.
@param ParameterBlock ParameterBlock returned from Query.
@param ParameterBlockSize The ParameterBlock size returned from Query.
@param Configuration ActionThe driver tells the platform what
action is required for ParameterBlock to
take effect.
@retval EFI_SUCCESS The platform return parameter information
for ControllerHandle.
@retval EFI_NOT_FOUND Instance was not found.
@retval EFI_INVALID_PARAMETER ControllerHandle is not a valid EFI_HANDLE.
@retval EFI_INVALID_PARAMETER Instance is zero.
**/
typedef
EFI_STATUS
(EFIAPI *EFI_PLATFORM_TO_DRIVER_CONFIGURATION_RESPONSE)(
IN CONST EFI_PLATFORM_TO_DRIVER_CONFIGURATION_PROTOCOL *This,
IN CONST EFI_HANDLE ControllerHandle,
IN CONST EFI_HANDLE ChildHandle OPTIONAL,
IN CONST UINTN *Instance,
IN CONST EFI_GUID *ParameterTypeGuid,
IN CONST VOID *ParameterBlock,
IN CONST UINTN ParameterBlockSize ,
IN CONST EFI_PLATFORM_CONFIGURATION_ACTION ConfigurationAction
);
///
/// The EFI_PLATFORM_TO_DRIVER_CONFIGURATION_PROTOCOL is used by the
/// UEFI driver to query the platform for configuration information.
/// The UEFI driver calls Query() multiple times to get
/// configuration information from the platform. For every call to
/// Query() there must be a matching call to Response() so the
/// UEFI driver can inform the platform how it used the
/// information passed in from Query(). It's legal for a UEFI
/// driver to use Response() to inform the platform it does not
/// understand the data returned via Query() and thus no action was
/// taken.
///
struct _EFI_PLATFORM_TO_DRIVER_CONFIGURATION_PROTOCOL {
EFI_PLATFORM_TO_DRIVER_CONFIGURATION_QUERY Query;
EFI_PLATFORM_TO_DRIVER_CONFIGURATION_RESPONSE Response;
};
#define EFI_PLATFORM_TO_DRIVER_CONFIGURATION_CLP_GUID \
{0x345ecc0e, 0xcb6, 0x4b75, { 0xbb, 0x57, 0x1b, 0x12, 0x9c, 0x47, 0x33,0x3e } }
/**
ParameterTypeGuid provides the support for parameters
communicated through the DMTF SM CLP Specification 1.0 Final
Standard to be used to configure the UEFI driver. In this
section the producer of the
EFI_PLATFORM_TO_DRIVER_CONFIGURATION_PROTOCOL is platform
firmware and the consumer is the UEFI driver. Note: if future
versions of the DMTF SM CLP Specification require changes to the
parameter block definition, newer ParameterTypeGuid will be
used.
**/
typedef struct {
CHAR8 *CLPCommand; ///< A pointer to the DMTF SM CLP command line null-terminated string that the
///< driver is required to parse and process when this EFI_SUCCESS The platform
///< return parameter information for ControllerHandle. EFI_NOT_FOUND Instance
///< was not found. EFI_INVALID_PARAMETER ControllerHandle is not a valid
///< EFI_HANDLE. EFI_INVALID_PARAMETER Instance is zero. function is called.
///< See the DMTF SM CLP Specification 1.0 Final Standard for details on the
///< format and syntax of the CLP command line string. CLPCommand buffer
///< is allocated by the producer of the EFI_PLATFORM_TO_DRIVER_CONFIGURATION_PROTOOL.
UINT32 CLPCommandLength; ///< The length of the CLP Command in bytes.
CHAR8 *CLPReturnString; ///< A pointer to the CLP return status string that the driver is required to
///< provide to the calling agent. The calling agent may parse and/ or pass
///< this for processing and user feedback. The SM CLP Command Response string
///< buffer is filled in by the UEFI driver in the "keyword=value" format
///< described in the SM CLP Specification, unless otherwise requested via the SM
///< CLP Coutput option in the Command Line string buffer. UEFI driver's support
///< for this default "keyword=value" output format is required if the UEFI
///< driver supports this protocol, while support for other SM CLP output
///< formats is optional (the UEFI Driver should return an EFI_UNSUPPORTED if
///< the SM CLP Coutput option requested by the caller is not supported by the
///< UEFI Driver). CLPReturnString buffer is allocated by the consumer of the
///< EFI_PLATFORM_TO_DRIVER_CONFIGURATION_PROTOC OL and undefined prior to the call to
///< Response().
UINT32 CLPReturnStringLength; ///< The length of the CLP return status string in bytes.
UINT8 CLPCmdStatus; ///< SM CLP Command Status (see DMTF SM CLP Specification 1.0 Final Standard -
///< Table 4) CLPErrorValue SM CLP Processing Error Value (see DMTF SM
///< CLP Specification 1.0 Final Standard - Table 6). This field is filled in by
///< the consumer of the EFI_PLATFORM_TO_DRIVER_CONFIGURATION_PROTOC
///< OL and undefined prior to the call to Response().
UINT8 CLPErrorValue; ///< SM CLP Processing Error Value (see DMTF SM CLP Specification 1.0 Final Standard - Table 6).
///< This field is filled in by the consumer of the EFI_PLATFORM_TO_DRIVER_CONFIGURATION_PROTOCOL and undefined prior to the call to Response().
UINT16 CLPMsgCode; ///< Bit 15: OEM Message Code Flag 0 = Message Code is an SM CLP Probable
///< Cause Value. (see SM CLP Specification Table 11) 1 = Message Code is OEM
///< Specific Bits 14-0: Message Code This field is filled in by the consumer of
///< the EFI_PLATFORM_TO_DRIVER_CONFIGURATION_PROTOC OL and undefined prior to the call to
///< Response().
} EFI_CONFIGURE_CLP_PARAMETER_BLK;
extern EFI_GUID gEfiPlatformToDriverConfigurationClpGuid;
extern EFI_GUID gEfiPlatformToDriverConfigurationProtocolGuid;
#endif
|