1 /** @file
2 Private Header file for Usb Host Controller PEIM
3 
4 Copyright (c) 2010, Intel Corporation. All rights reserved.<BR>
5 
6 This program and the accompanying materials
7 are licensed and made available under the terms and conditions
8 of the BSD License which accompanies this distribution.  The
9 full text of the license may be found at
10 http://opensource.org/licenses/bsd-license.php
11 
12 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
13 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
14 
15 **/
16 
17 #ifndef _EFI_EHCI_URB_H_
18 #define _EFI_EHCI_URB_H_
19 
20 typedef struct _PEI_EHC_QTD PEI_EHC_QTD;
21 typedef struct _PEI_EHC_QH  PEI_EHC_QH;
22 typedef struct _PEI_URB     PEI_URB;
23 
24 #define EHC_CTRL_TRANSFER       0x01
25 #define EHC_BULK_TRANSFER       0x02
26 #define EHC_INT_TRANSFER_SYNC   0x04
27 #define EHC_INT_TRANSFER_ASYNC  0x08
28 
29 #define EHC_QTD_SIG             SIGNATURE_32 ('U', 'S', 'B', 'T')
30 #define EHC_QH_SIG              SIGNATURE_32 ('U', 'S', 'B', 'H')
31 #define EHC_URB_SIG             SIGNATURE_32 ('U', 'S', 'B', 'R')
32 
33 //
34 // Hardware related bit definitions
35 //
36 #define EHC_TYPE_ITD            0x00
37 #define EHC_TYPE_QH             0x02
38 #define EHC_TYPE_SITD           0x04
39 #define EHC_TYPE_FSTN           0x06
40 
41 #define QH_NAK_RELOAD           3
42 #define QH_HSHBW_MULTI          1
43 
44 #define QTD_MAX_ERR             3
45 #define QTD_PID_OUTPUT          0x00
46 #define QTD_PID_INPUT           0x01
47 #define QTD_PID_SETUP           0x02
48 
49 #define QTD_STAT_DO_OUT         0
50 #define QTD_STAT_DO_SS          0
51 #define QTD_STAT_DO_PING        0x01
52 #define QTD_STAT_DO_CS          0x02
53 #define QTD_STAT_TRANS_ERR      0x08
54 #define QTD_STAT_BABBLE_ERR     0x10
55 #define QTD_STAT_BUFF_ERR       0x20
56 #define QTD_STAT_HALTED         0x40
57 #define QTD_STAT_ACTIVE         0x80
58 #define QTD_STAT_ERR_MASK       (QTD_STAT_TRANS_ERR | QTD_STAT_BABBLE_ERR | QTD_STAT_BUFF_ERR)
59 
60 #define QTD_MAX_BUFFER          4
61 #define QTD_BUF_LEN             4096
62 #define QTD_BUF_MASK            0x0FFF
63 
64 #define QH_MICROFRAME_0         0x01
65 #define QH_MICROFRAME_1         0x02
66 #define QH_MICROFRAME_2         0x04
67 #define QH_MICROFRAME_3         0x08
68 #define QH_MICROFRAME_4         0x10
69 #define QH_MICROFRAME_5         0x20
70 #define QH_MICROFRAME_6         0x40
71 #define QH_MICROFRAME_7         0x80
72 
73 #define USB_ERR_SHORT_PACKET    0x200
74 
75 //
76 // Fill in the hardware link point: pass in a EHC_QH/QH_HW
77 // pointer to QH_LINK; A EHC_QTD/QTD_HW pointer to QTD_LINK
78 //
79 #define QH_LINK(Addr, Type, Term) \
80           ((UINT32) ((EHC_LOW_32BIT (Addr) & 0xFFFFFFE0) | (Type) | ((Term) ? 1 : 0)))
81 
82 #define QTD_LINK(Addr, Term)      QH_LINK((Addr), 0, (Term))
83 
84 //
85 // The defination of EHCI hardware used data structure for
86 // little endian architecture. The QTD and QH structures
87 // are required to be 32 bytes aligned. Don't add members
88 // to the head of the associated software strucuture.
89 //
90 #pragma pack(1)
91 typedef struct {
92   UINT32                  NextQtd;
93   UINT32                  AltNext;
94 
95   UINT32                  Status       : 8;
96   UINT32                  Pid          : 2;
97   UINT32                  ErrCnt       : 2;
98   UINT32                  CurPage      : 3;
99   UINT32                  Ioc          : 1;
100   UINT32                  TotalBytes   : 15;
101   UINT32                  DataToggle   : 1;
102 
103   UINT32                  Page[5];
104   UINT32                  PageHigh[5];
105 } QTD_HW;
106 
107 typedef struct {
108   UINT32                  HorizonLink;
109   //
110   // Endpoint capabilities/Characteristics DWord 1 and DWord 2
111   //
112   UINT32                  DeviceAddr   : 7;
113   UINT32                  Inactive     : 1;
114   UINT32                  EpNum        : 4;
115   UINT32                  EpSpeed      : 2;
116   UINT32                  DtCtrl       : 1;
117   UINT32                  ReclaimHead  : 1;
118   UINT32                  MaxPacketLen : 11;
119   UINT32                  CtrlEp       : 1;
120   UINT32                  NakReload    : 4;
121 
122   UINT32                  SMask        : 8;
123   UINT32                  CMask        : 8;
124   UINT32                  HubAddr      : 7;
125   UINT32                  PortNum      : 7;
126   UINT32                  Multiplier   : 2;
127 
128   //
129   // Transaction execution overlay area
130   //
131   UINT32                  CurQtd;
132   UINT32                  NextQtd;
133   UINT32                  AltQtd;
134 
135   UINT32                  Status       : 8;
136   UINT32                  Pid          : 2;
137   UINT32                  ErrCnt       : 2;
138   UINT32                  CurPage      : 3;
139   UINT32                  Ioc          : 1;
140   UINT32                  TotalBytes   : 15;
141   UINT32                  DataToggle   : 1;
142 
143   UINT32                  Page[5];
144   UINT32                  PageHigh[5];
145 } QH_HW;
146 #pragma pack()
147 
148 
149 //
150 // Endpoint address and its capabilities
151 //
152 typedef struct _USB_ENDPOINT {
153   UINT8                   DevAddr;
154   UINT8                   EpAddr;     // Endpoint address, no direction encoded in
155   EFI_USB_DATA_DIRECTION  Direction;
156   UINT8                   DevSpeed;
157   UINTN                   MaxPacket;
158   UINT8                   HubAddr;
159   UINT8                   HubPort;
160   UINT8                   Toggle;     // Data toggle, not used for control transfer
161   UINTN                   Type;
162   UINTN                   PollRate;   // Polling interval used by EHCI
163 } USB_ENDPOINT;
164 
165 //
166 // Software QTD strcture, this is used to manage all the
167 // QTD generated from a URB. Don't add fields before QtdHw.
168 //
169 struct _PEI_EHC_QTD {
170   QTD_HW                  QtdHw;
171   UINT32                  Signature;
172   EFI_LIST_ENTRY          QtdList;   // The list of QTDs to one end point
173   UINT8                   *Data;     // Buffer of the original data
174   UINTN                   DataLen;   // Original amount of data in this QTD
175 };
176 
177 
178 
179 //
180 // Software QH structure. All three different transaction types
181 // supported by UEFI USB, that is the control/bulk/interrupt
182 // transfers use the queue head and queue token strcuture.
183 //
184 // Interrupt QHs are linked to periodic frame list in the reversed
185 // 2^N tree. Each interrupt QH is linked to the list starting at
186 // frame 0. There is a dummy interrupt QH linked to each frame as
187 // a sentinental whose polling interval is 1. Synchronous interrupt
188 // transfer is linked after this dummy QH.
189 //
190 // For control/bulk transfer, only synchronous (in the sense of UEFI)
191 // transfer is supported. A dummy QH is linked to EHCI AsyncListAddr
192 // as the reclamation header. New transfer is inserted after this QH.
193 //
194 struct _PEI_EHC_QH {
195   QH_HW                   QhHw;
196   UINT32                  Signature;
197   PEI_EHC_QH              *NextQh;    // The queue head pointed to by horizontal link
198   EFI_LIST_ENTRY          Qtds;       // The list of QTDs to this queue head
199   UINTN                   Interval;
200 };
201 
202 //
203 // URB (Usb Request Block) contains information for all kinds of
204 // usb requests.
205 //
206 struct _PEI_URB {
207   UINT32                          Signature;
208   EFI_LIST_ENTRY                  UrbList;
209 
210   //
211   // Transaction information
212   //
213   USB_ENDPOINT                    Ep;
214   EFI_USB_DEVICE_REQUEST          *Request;     // Control transfer only
215   VOID                            *RequestPhy;  // Address of the mapped request
216   VOID                            *RequestMap;
217   VOID                            *Data;
218   UINTN                           DataLen;
219   VOID                            *DataPhy;     // Address of the mapped user data
220   VOID                            *DataMap;
221   EFI_ASYNC_USB_TRANSFER_CALLBACK Callback;
222   VOID                            *Context;
223 
224   //
225   // Schedule data
226   //
227   PEI_EHC_QH                      *Qh;
228 
229   //
230   // Transaction result
231   //
232   UINT32                          Result;
233   UINTN                           Completed;    // completed data length
234   UINT8                           DataToggle;
235 };
236 
237 /**
238   Delete a single asynchronous interrupt transfer for
239   the device and endpoint.
240 
241   @param  Ehc         The EHCI device.
242   @param  Data        Current data not associated with a QTD.
243   @param  DataLen     The length of the data.
244   @param  PktId       Packet ID to use in the QTD.
245   @param  Toggle      Data toggle to use in the QTD.
246   @param  MaxPacket   Maximu packet length of the endpoint.
247 
248   @retval the pointer to the created QTD or NULL if failed to create one.
249 
250 **/
251 PEI_EHC_QTD *
252 EhcCreateQtd (
253   IN PEI_USB2_HC_DEV      *Ehc,
254   IN UINT8                *Data,
255   IN UINTN                DataLen,
256   IN UINT8                PktId,
257   IN UINT8                Toggle,
258   IN UINTN                MaxPacket
259   )
260 ;
261 
262 /**
263   Allocate and initialize a EHCI queue head.
264 
265   @param  Ehci      The EHCI device.
266   @param  Ep        The endpoint to create queue head for.
267 
268   @retval the pointer to the created queue head or NULL if failed to create one.
269 
270 **/
271 PEI_EHC_QH *
272 EhcCreateQh (
273   IN PEI_USB2_HC_DEV      *Ehci,
274   IN USB_ENDPOINT         *Ep
275   )
276 ;
277 
278 /**
279   Free an allocated URB. It is possible for it to be partially inited.
280 
281   @param  Ehc         The EHCI device.
282   @param  Urb         The URB to free.
283 
284 **/
285 VOID
286 EhcFreeUrb (
287   IN PEI_USB2_HC_DEV      *Ehc,
288   IN PEI_URB              *Urb
289   )
290 ;
291 
292 /**
293   Create a new URB and its associated QTD.
294 
295   @param  Ehc               The EHCI device.
296   @param  DevAddr           The device address.
297   @param  EpAddr            Endpoint addrress & its direction.
298   @param  DevSpeed          The device speed.
299   @param  Toggle            Initial data toggle to use.
300   @param  MaxPacket         The max packet length of the endpoint.
301   @param  Hub               The transaction translator to use.
302   @param  Type              The transaction type.
303   @param  Request           The standard USB request for control transfer.
304   @param  Data              The user data to transfer.
305   @param  DataLen           The length of data buffer.
306   @param  Callback          The function to call when data is transferred.
307   @param  Context           The context to the callback.
308   @param  Interval          The interval for interrupt transfer.
309 
310   @retval the pointer to the created URB or NULL.
311 
312 **/
313 PEI_URB *
314 EhcCreateUrb (
315   IN PEI_USB2_HC_DEV                    *Ehc,
316   IN UINT8                              DevAddr,
317   IN UINT8                              EpAddr,
318   IN UINT8                              DevSpeed,
319   IN UINT8                              Toggle,
320   IN UINTN                              MaxPacket,
321   IN EFI_USB2_HC_TRANSACTION_TRANSLATOR *Hub,
322   IN UINTN                              Type,
323   IN EFI_USB_DEVICE_REQUEST             *Request,
324   IN VOID                               *Data,
325   IN UINTN                              DataLen,
326   IN EFI_ASYNC_USB_TRANSFER_CALLBACK    Callback,
327   IN VOID                               *Context,
328   IN UINTN                              Interval
329   )
330 ;
331 #endif
332