]> git.proxmox.com Git - mirror_edk2.git/blame - MdeModulePkg/Bus/Pci/UhciDxe/UhciQueue.h
1. Fixed tools_def.template to meet ICC build for IA32
[mirror_edk2.git] / MdeModulePkg / Bus / Pci / UhciDxe / UhciQueue.h
CommitLineData
913cb9dc 1/** @file\r
2\r
3Copyright (c) 2007, Intel Corporation\r
4All rights reserved. This program and the accompanying materials\r
5are licensed and made available under the terms and conditions of the BSD License\r
6which accompanies this distribution. The full text of the license may be found at\r
7http://opensource.org/licenses/bsd-license.php\r
8\r
9THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
10WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
11\r
12Module Name:\r
13\r
14 UhciQueue.h\r
15\r
16Abstract:\r
17\r
18 The definition for UHCI register operation routines.\r
19\r
20Revision History\r
21\r
22\r
23**/\r
24\r
25#ifndef _EFI_UHCI_QUEUE_H_\r
26#define _EFI_UHCI_QUEUE_H_\r
27\r
28//\r
29// Macroes used to set various links in UHCI's driver.\r
30// In this UHCI driver, QH's horizontal link always pointers to other QH,\r
31// and its vertical link always pointers to TD. TD's next pointer always\r
32// pointers to other sibling TD. Frame link always pointers to QH because\r
33// ISO transfer isn't supported.\r
34//\r
35// We should use UINT32 to access these pointers to void race conditions\r
36// with hardware.\r
37//\r
38#define QH_HLINK(Pointer, Terminate) \\r
39 (((UINT32) ((UINTN) (Pointer)) & 0xFFFFFFF0) | 0x02 | ((Terminate) ? 0x01 : 0))\r
40\r
41#define QH_VLINK(Pointer, Terminate) \\r
42 (((UINT32) ((UINTN) (Pointer)) & 0xFFFFFFF0) | ((Terminate) ? 0x01 : 0))\r
43\r
44#define TD_LINK(Pointer, VertFirst, Terminate) \\r
45 (((UINT32) ((UINTN) (Pointer)) & 0xFFFFFFF0) | \\r
46 ((VertFirst) ? 0x04 : 0) | ((Terminate) ? 0x01 : 0))\r
47\r
48#define LINK_TERMINATED(Link) (((Link) & 0x01) != 0)\r
49\r
50#define UHCI_ADDR(QhOrTd) ((VOID *) (UINTN) ((QhOrTd) & 0xFFFFFFF0))\r
51\r
52#pragma pack(1)\r
53//\r
54// Both links in QH has this internal structure:\r
55// Next pointer: 28, Reserved: 2, NextIsQh: 1, Terminate: 1\r
56// This is the same as frame list entry.\r
57//\r
58typedef struct {\r
59 UINT32 HorizonLink;\r
60 UINT32 VerticalLink;\r
61} UHCI_QH_HW;\r
62\r
63//\r
64// Next link in TD has this internal structure:\r
65// Next pointer: 28, Reserved: 1, Vertical First: 1, NextIsQh: 1, Terminate: 1\r
66//\r
67typedef struct {\r
68 UINT32 NextLink;\r
69 UINT32 ActualLen : 11;\r
70 UINT32 Reserved1 : 5;\r
71 UINT32 Status : 8;\r
72 UINT32 IntOnCpl : 1;\r
73 UINT32 IsIsoch : 1;\r
74 UINT32 LowSpeed : 1;\r
75 UINT32 ErrorCount : 2;\r
76 UINT32 ShortPacket : 1;\r
77 UINT32 Reserved2 : 2;\r
78 UINT32 PidCode : 8;\r
79 UINT32 DeviceAddr : 7;\r
80 UINT32 EndPoint : 4;\r
81 UINT32 DataToggle : 1;\r
82 UINT32 Reserved3 : 1;\r
83 UINT32 MaxPacketLen: 11;\r
84 UINT32 DataBuffer;\r
85} UHCI_TD_HW;\r
86#pragma pack()\r
87\r
88typedef struct _UHCI_TD_SW UHCI_TD_SW;\r
89typedef struct _UHCI_QH_SW UHCI_QH_SW;\r
90\r
c52fa98c 91struct _UHCI_QH_SW {\r
913cb9dc 92 UHCI_QH_HW QhHw;\r
93 UHCI_QH_SW *NextQh;\r
94 UHCI_TD_SW *TDs;\r
95 UINTN Interval;\r
c52fa98c 96};\r
913cb9dc 97\r
c52fa98c 98struct _UHCI_TD_SW {\r
913cb9dc 99 UHCI_TD_HW TdHw;\r
100 UHCI_TD_SW *NextTd;\r
101 UINT8 *Data;\r
102 UINT16 DataLen;\r
c52fa98c 103};\r
913cb9dc 104\r
105\r
106/**\r
107 Link the TD To QH\r
108\r
109 @param Qh The queue head for the TD to link to\r
110 @param Td The TD to link\r
111\r
112 @return VOID\r
113\r
114**/\r
115VOID\r
116UhciLinkTdToQh (\r
117 IN UHCI_QH_SW *Qh,\r
118 IN UHCI_TD_SW *Td\r
119 )\r
120;\r
121\r
122\r
123/**\r
124 Unlink TD from the QH\r
125\r
126 @param Qh The queue head to unlink from\r
127 @param Td The TD to unlink\r
128\r
129 @return VOID\r
130\r
131**/\r
132VOID\r
133UhciUnlinkTdFromQh (\r
134 IN UHCI_QH_SW *Qh,\r
135 IN UHCI_TD_SW *Td\r
136 )\r
137;\r
138\r
139\r
140/**\r
141 Map address of request structure buffer\r
142\r
143 @param Uhc The UHCI device\r
144 @param Request The user request buffer\r
145 @param MappedAddr Mapped address of request\r
146 @param Map Identificaion of this mapping to return\r
147\r
148 @return EFI_SUCCESS : Success\r
149 @return EFI_DEVICE_ERROR : Fail to map the user request\r
150\r
151**/\r
152EFI_STATUS\r
153UhciMapUserRequest (\r
154 IN USB_HC_DEV *Uhc,\r
155 IN OUT VOID *Request,\r
156 OUT UINT8 **MappedAddr,\r
157 OUT VOID **Map\r
158 )\r
159;\r
160\r
161\r
162/**\r
163 Map address of user data buffer\r
164\r
165 @param Uhc The UHCI device\r
166 @param Direction direction of the data transfer\r
167 @param Data The user data buffer\r
168 @param Len Length of the user data\r
169 @param PktId Packet identificaion\r
170 @param MappedAddr mapped address to return\r
171 @param Map identificaion of this mapping to return\r
172\r
173 @return EFI_SUCCESS : Success\r
174 @return EFI_DEVICE_ERROR : Fail to map the user data\r
175\r
176**/\r
177EFI_STATUS\r
178UhciMapUserData (\r
179 IN USB_HC_DEV *Uhc,\r
180 IN EFI_USB_DATA_DIRECTION Direction,\r
181 IN VOID *Data,\r
182 IN OUT UINTN *Len,\r
183 OUT UINT8 *PktId,\r
184 OUT UINT8 **MappedAddr,\r
185 OUT VOID **Map\r
186 )\r
187;\r
188\r
189\r
190/**\r
191 Delete a list of TDs\r
192\r
193 @param Uhc The UHCI device\r
194 @param FirstTd TD link list head\r
195\r
196 @return VOID\r
197\r
198**/\r
199VOID\r
200UhciDestoryTds (\r
201 IN USB_HC_DEV *Uhc,\r
202 IN UHCI_TD_SW *FirstTd\r
203 )\r
204;\r
205\r
206\r
207/**\r
208 Create an initialize a new queue head\r
209\r
210 @param Uhc The UHCI device\r
211 @param Interval The polling interval for the queue\r
212\r
213 @return The newly created queue header\r
214\r
215**/\r
216UHCI_QH_SW *\r
217UhciCreateQh (\r
218 IN USB_HC_DEV *Uhc,\r
219 IN UINTN Interval\r
220 )\r
221;\r
222\r
223\r
224/**\r
225 Create Tds list for Control Transfer\r
226\r
227 @param Uhc The UHCI device\r
228 @param DeviceAddr The device address\r
229 @param DataPktId Packet Identification of Data Tds\r
230 @param Request A pointer to request structure buffer to transfer\r
231 @param Data A pointer to user data buffer to transfer\r
232 @param DataLen Length of user data to transfer\r
233 @param MaxPacket Maximum packet size for control transfer\r
234 @param IsLow Full speed or low speed\r
235\r
236 @return The Td list head for the control transfer\r
237\r
238**/\r
239UHCI_TD_SW *\r
240UhciCreateCtrlTds (\r
241 IN USB_HC_DEV *Uhc,\r
242 IN UINT8 DeviceAddr,\r
243 IN UINT8 DataPktId,\r
244 IN UINT8 *Request,\r
245 IN UINT8 *Data,\r
246 IN UINTN DataLen,\r
247 IN UINT8 MaxPacket,\r
248 IN BOOLEAN IsLow\r
249 )\r
250;\r
251\r
252\r
253/**\r
254 Create Tds list for Bulk/Interrupt Transfer\r
255\r
256 @param Uhc USB_HC_DEV\r
257 @param DevAddr Address of Device\r
258 @param EndPoint Endpoint Number\r
259 @param PktId Packet Identification of Data Tds\r
260 @param Data A pointer to user data buffer to transfer\r
261 @param DataLen Length of user data to transfer\r
262 @param DataToggle Data Toggle Pointer\r
263 @param MaxPacket Maximum packet size for Bulk/Interrupt transfer\r
264 @param IsLow Is Low Speed Device\r
265\r
266 @return The Tds list head for the bulk transfer\r
267\r
268**/\r
269UHCI_TD_SW *\r
270UhciCreateBulkOrIntTds (\r
271 IN USB_HC_DEV *Uhc,\r
272 IN UINT8 DevAddr,\r
273 IN UINT8 EndPoint,\r
274 IN UINT8 PktId,\r
275 IN UINT8 *Data,\r
276 IN UINTN DataLen,\r
277 IN OUT UINT8 *DataToggle,\r
278 IN UINT8 MaxPacket,\r
279 IN BOOLEAN IsLow\r
280 )\r
281;\r
282\r
283#endif\r