1/** @file
2  Defines the PEI_USB_IO_PPI that the USB-related PEIM can use for I/O operations
3  on the USB BUS.  This interface enables recovery from a
4  USB-class storage device, such as USB CD/DVD, USB hard drive, or USB FLASH
5  drive.  These interfaces are modeled on the UEFI 2.3 specification EFI_USB_IO_PROTOCOL.
6  Refer to section 16.2.4 of the UEFI 2.3 Specification for more information on
7  these interfaces.
8
9Copyright (c) 2006 - 2013, Intel Corporation. All rights reserved.<BR>
10
11This program and the accompanying materials
12are licensed and made available under the terms and conditions
13of the BSD License which accompanies this distribution.  The
14full text of the license may be found at
15http://opensource.org/licenses/bsd-license.php
16
17THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
18WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
19
20**/
21
22#ifndef _PEI_USB_IO_PPI_H_
23#define _PEI_USB_IO_PPI_H_
24
25#include <Protocol/Usb2HostController.h>
26
27///
28/// Global ID for the PEI_USB_IO_PPI.
29///
30#define PEI_USB_IO_PPI_GUID \
31  { \
32    0x7c29785c, 0x66b9, 0x49fc, { 0xb7, 0x97, 0x1c, 0xa5, 0x55, 0xe, 0xf2, 0x83} \
33  }
34
35///
36/// Forward declaration for the PEI_USB_IO_PPI.
37///
38typedef struct _PEI_USB_IO_PPI  PEI_USB_IO_PPI;
39
40/**
41  Submits control transfer to a target USB device.
42
43  @param[in]     PeiServices   The pointer to the PEI Services Table.
44  @param[in]     This          The pointer to this instance of the PEI_USB_IO_PPI.
45  @param[in]     Request       A pointer to the USB device request that will be
46                               sent to the USB device.
47  @param[in]     Direction     Specifies the data direction for the transfer. There
48                               are three values available:
49                               EfiUsbDataIn, EfiUsbDataOut and EfiUsbNoData.
50  @param[in]     Timeout       Indicates the maximum time, in milliseconds, that
51                               the transfer is allowed to complete.
52                               If Timeout is 0, then the caller must wait for the
53                               function to be completed until EFI_SUCCESS or
54                               EFI_DEVICE_ERROR is returned.
55  @param[in,out] Data          A pointer to the buffer of data that will be
56                               transmitted to or received from the USB device.
57  @param[in]     DataLength    On input, indicates the size, in bytes, of the data
58                               buffer specified by Data.
59
60  @retval EFI_SUCCESS             The control transfer was completed successfully.
61  @retval EFI_INVALID_PARAMETER   Some parameters are invalid.
62  @retval EFI_OUT_OF_RESOURCES    The control transfer could not be completed due
63                                  to a lack of resources.
64  @retval EFI_TIMEOUT             The control transfer failed due to timeout.
65  @retval EFI_DEVICE_ERROR        The control transfer failed due to host controller
66                                  or device error.
67                                  Caller should check TransferResult for detailed
68                                  error information.
69
70**/
71typedef
72EFI_STATUS
73(EFIAPI *PEI_USB_CONTROL_TRANSFER)(
74  IN     EFI_PEI_SERVICES        **PeiServices,
75  IN     PEI_USB_IO_PPI          *This,
76  IN     EFI_USB_DEVICE_REQUEST  *Request,
77  IN     EFI_USB_DATA_DIRECTION  Direction,
78  IN     UINT32                  Timeout,
79  IN OUT VOID                    *Data OPTIONAL,
80  IN     UINTN                   DataLength  OPTIONAL
81  );
82
83/**
84  Submits bulk transfer to a target USB device.
85
86  @param[in] PeiServices       The pointer to the PEI Services Table.
87  @param[in] This              The pointer to this instance of the PEI_USB_IO_PPI.
88  @param[in] DeviceEndpoint    The endpoint address.
89  @param[in] Data              The data buffer to be transfered.
90  @param[in] DataLength        The length of data buffer.
91  @param[in] Timeout           The timeout for the transfer, in milliseconds.
92                               If Timeout is 0, then the caller must wait for the
93                               function to be completed until EFI_SUCCESS or
94                               EFI_DEVICE_ERROR is returned.
95
96  @retval EFI_SUCCESS             The bulk transfer completed successfully.
97  @retval EFI_INVALID_PARAMETER   Some parameters are invalid.
98  @retval EFI_OUT_OF_RESOURCES    The bulk transfer could not be completed due to
99                                  a lack of resources.
100  @retval EFI_TIMEOUT             The bulk transfer failed due to timeout.
101  @retval EFI_DEVICE_ERROR        The bulk transfer failed due to host controller
102                                  or device error.
103                                  Caller should check TransferResult for detailed
104                                  error information.
105
106**/
107typedef
108EFI_STATUS
109(EFIAPI *PEI_USB_BULK_TRANSFER)(
110  IN EFI_PEI_SERVICES  **PeiServices,
111  IN PEI_USB_IO_PPI    *This,
112  IN UINT8             DeviceEndpoint,
113  IN OUT VOID          *Data,
114  IN OUT UINTN         *DataLength,
115  IN UINTN             Timeout
116  );
117
118/**
119  Get interface descriptor from a USB device.
120
121  @param[in] PeiServices           The pointer to the PEI Services Table.
122  @param[in] This                  The pointer to this instance of the PEI_USB_IO_PPI.
123  @param[in] InterfaceDescriptor   The interface descriptor.
124
125  @retval EFI_SUCCESS             The interface descriptor was returned.
126  @retval EFI_INVALID_PARAMETER   Some parameters are invalid.
127  @retval EFI_DEVICE_ERROR        A device error occurred, the function failed to
128                                  get the interface descriptor.
129
130**/
131typedef
132EFI_STATUS
133(EFIAPI *PEI_USB_GET_INTERFACE_DESCRIPTOR)(
134  IN EFI_PEI_SERVICES              **PeiServices,
135  IN PEI_USB_IO_PPI                *This,
136  IN EFI_USB_INTERFACE_DESCRIPTOR  **InterfaceDescriptor
137  );
138
139/**
140  Get endpoint descriptor from a USB device.
141
142  @param[in] PeiServices          The pointer to the PEI Services Table.
143  @param[in] This                 The pointer to this instance of the PEI_USB_IO_PPI.
144  @param[in] EndPointIndex        The index of the end point.
145  @param[in] EndpointDescriptor   The endpoint descriptor.
146
147  @retval EFI_SUCCESS             The endpoint descriptor was returned.
148  @retval EFI_INVALID_PARAMETER   Some parameters are invalid.
149  @retval EFI_DEVICE_ERROR        A device error occurred, the function failed to
150                                  get the endpoint descriptor.
151
152**/
153typedef
154EFI_STATUS
155(EFIAPI *PEI_USB_GET_ENDPOINT_DESCRIPTOR)(
156  IN EFI_PEI_SERVICES               **PeiServices,
157  IN PEI_USB_IO_PPI                 *This,
158  IN UINT8                          EndpointIndex,
159  IN EFI_USB_ENDPOINT_DESCRIPTOR    **EndpointDescriptor
160  );
161
162/**
163  Issue a port reset to the device.
164
165  @param[in] PeiServices   The pointer to the PEI Services Table.
166  @param[in] This          The pointer to this instance of the PEI_USB_IO_PPI.
167
168  @retval EFI_SUCCESS             The port reset was issued successfully.
169  @retval EFI_INVALID_PARAMETER   Some parameters are invalid.
170  @retval EFI_DEVICE_ERROR        Device error occurred.
171
172**/
173typedef
174EFI_STATUS
175(EFIAPI *PEI_USB_PORT_RESET)(
176  IN EFI_PEI_SERVICES  **PeiServices,
177  IN PEI_USB_IO_PPI    *This
178  );
179
180///
181/// This PPI contains a set of services to interact with the USB host controller.
182/// These interfaces are modeled on the UEFI 2.3 specification EFI_USB_IO_PROTOCOL.
183/// Refer to section 16.2.4 of the UEFI 2.3 Specification for more information on
184/// these interfaces.
185///
186struct _PEI_USB_IO_PPI {
187  PEI_USB_CONTROL_TRANSFER          UsbControlTransfer;
188  PEI_USB_BULK_TRANSFER             UsbBulkTransfer;
189  PEI_USB_GET_INTERFACE_DESCRIPTOR  UsbGetInterfaceDescriptor;
190  PEI_USB_GET_ENDPOINT_DESCRIPTOR   UsbGetEndpointDescriptor;
191  PEI_USB_PORT_RESET                UsbPortReset;
192};
193
194extern EFI_GUID gPeiUsbIoPpiGuid;
195
196#endif
197