]> git.proxmox.com Git - mirror_edk2.git/blame - MdeModulePkg/Bus/Pci/UhciPei/UhcPeim.h
UefiCpuPkg: Move AsmRelocateApLoopStart from Mpfuncs.nasm to AmdSev.nasm
[mirror_edk2.git] / MdeModulePkg / Bus / Pci / UhciPei / UhcPeim.h
CommitLineData
4b1bf81c 1/** @file\r
2Private Header file for Usb Host Controller PEIM\r
3\r
d1102dba
LG
4Copyright (c) 2006 - 2018, Intel Corporation. All rights reserved.<BR>\r
5\r
9d510e61 6SPDX-License-Identifier: BSD-2-Clause-Patent\r
4b1bf81c 7\r
8**/\r
9\r
10#ifndef _RECOVERY_UHC_H_\r
11#define _RECOVERY_UHC_H_\r
12\r
4b1bf81c 13#include <PiPei.h>\r
14\r
15#include <Ppi/UsbController.h>\r
16#include <Ppi/UsbHostController.h>\r
8284b179
SZ
17#include <Ppi/IoMmu.h>\r
18#include <Ppi/EndOfPeiPhase.h>\r
4b1bf81c 19\r
20#include <Library/DebugLib.h>\r
21#include <Library/PeimEntryPoint.h>\r
22#include <Library/PeiServicesLib.h>\r
23#include <Library/BaseMemoryLib.h>\r
24#include <Library/TimerLib.h>\r
25#include <Library/IoLib.h>\r
26#include <Library/PeiServicesLib.h>\r
27\r
1436aea4
MK
28#define USB_SLOW_SPEED_DEVICE 0x01\r
29#define USB_FULL_SPEED_DEVICE 0x02\r
4b1bf81c 30\r
31//\r
32// One memory block uses 16 page\r
33//\r
1436aea4
MK
34#define NORMAL_MEMORY_BLOCK_UNIT_IN_PAGES 16\r
35\r
36#define USBCMD 0 /* Command Register Offset 00-01h */\r
37#define USBCMD_RS BIT0 /* Run/Stop */\r
38#define USBCMD_HCRESET BIT1 /* Host reset */\r
39#define USBCMD_GRESET BIT2 /* Global reset */\r
40#define USBCMD_EGSM BIT3 /* Global Suspend Mode */\r
41#define USBCMD_FGR BIT4 /* Force Global Resume */\r
42#define USBCMD_SWDBG BIT5 /* SW Debug mode */\r
43#define USBCMD_CF BIT6 /* Config Flag (sw only) */\r
44#define USBCMD_MAXP BIT7 /* Max Packet (0 = 32, 1 = 64) */\r
4b1bf81c 45\r
46/* Status register */\r
1436aea4
MK
47#define USBSTS 2 /* Status Register Offset 02-03h */\r
48#define USBSTS_USBINT BIT0 /* Interrupt due to IOC */\r
49#define USBSTS_ERROR BIT1 /* Interrupt due to error */\r
50#define USBSTS_RD BIT2 /* Resume Detect */\r
51#define USBSTS_HSE BIT3 /* Host System Error - basically PCI problems */\r
52#define USBSTS_HCPE BIT4 /* Host Controller Process Error - the scripts were buggy */\r
53#define USBSTS_HCH BIT5 /* HC Halted */\r
4b1bf81c 54\r
55/* Interrupt enable register */\r
1436aea4
MK
56#define USBINTR 4 /* Interrupt Enable Register 04-05h */\r
57#define USBINTR_TIMEOUT BIT0 /* Timeout/CRC error enable */\r
58#define USBINTR_RESUME BIT1 /* Resume interrupt enable */\r
59#define USBINTR_IOC BIT2 /* Interrupt On Complete enable */\r
60#define USBINTR_SP BIT3 /* Short packet interrupt enable */\r
4b1bf81c 61\r
62/* Frame Number Register Offset 06-08h */\r
63#define USBFRNUM 6\r
64\r
65/* Frame List Base Address Register Offset 08-0Bh */\r
66#define USBFLBASEADD 8\r
67\r
68/* Start of Frame Modify Register Offset 0Ch */\r
69#define USBSOF 0x0c\r
70\r
71/* USB port status and control registers */\r
1436aea4
MK
72#define USBPORTSC1 0x10 /*Port 1 offset 10-11h */\r
73#define USBPORTSC2 0x12 /*Port 2 offset 12-13h */\r
74\r
75#define USBPORTSC_CCS BIT0 /* Current Connect Status ("device present") */\r
76#define USBPORTSC_CSC BIT1 /* Connect Status Change */\r
77#define USBPORTSC_PED BIT2 /* Port Enable / Disable */\r
78#define USBPORTSC_PEDC BIT3 /* Port Enable / Disable Change */\r
79#define USBPORTSC_LSL BIT4 /* Line Status Low bit*/\r
80#define USBPORTSC_LSH BIT5 /* Line Status High bit*/\r
81#define USBPORTSC_RD BIT6 /* Resume Detect */\r
82#define USBPORTSC_LSDA BIT8 /* Low Speed Device Attached */\r
83#define USBPORTSC_PR BIT9 /* Port Reset */\r
84#define USBPORTSC_SUSP BIT12 /* Suspend */\r
85\r
86#define SETUP_PACKET_ID 0x2D\r
87#define INPUT_PACKET_ID 0x69\r
88#define OUTPUT_PACKET_ID 0xE1\r
89#define ERROR_PACKET_ID 0x55\r
4b1bf81c 90\r
ca243131 91#define STALL_1_MICRO_SECOND 1\r
4b1bf81c 92#define STALL_1_MILLI_SECOND 1000\r
93\r
4b1bf81c 94#pragma pack(1)\r
95\r
96typedef struct {\r
1436aea4
MK
97 UINT32 FrameListPtrTerminate : 1;\r
98 UINT32 FrameListPtrQSelect : 1;\r
99 UINT32 FrameListRsvd : 2;\r
100 UINT32 FrameListPtr : 28;\r
4b1bf81c 101} FRAMELIST_ENTRY;\r
102\r
103typedef struct {\r
1436aea4
MK
104 UINT32 QHHorizontalTerminate : 1;\r
105 UINT32 QHHorizontalQSelect : 1;\r
106 UINT32 QHHorizontalRsvd : 2;\r
107 UINT32 QHHorizontalPtr : 28;\r
108 UINT32 QHVerticalTerminate : 1;\r
109 UINT32 QHVerticalQSelect : 1;\r
110 UINT32 QHVerticalRsvd : 2;\r
111 UINT32 QHVerticalPtr : 28;\r
4b1bf81c 112} QUEUE_HEAD;\r
113\r
114typedef struct {\r
1436aea4
MK
115 QUEUE_HEAD QueueHead;\r
116 UINT32 Reserved1;\r
117 UINT32 Reserved2;\r
118 VOID *PtrNext;\r
119 VOID *PtrDown;\r
120 VOID *Reserved3;\r
121 UINT32 Reserved4;\r
4b1bf81c 122} QH_STRUCT;\r
123\r
124typedef struct {\r
1436aea4
MK
125 UINT32 TDLinkPtrTerminate : 1;\r
126 UINT32 TDLinkPtrQSelect : 1;\r
127 UINT32 TDLinkPtrDepthSelect : 1;\r
128 UINT32 TDLinkPtrRsvd : 1;\r
129 UINT32 TDLinkPtr : 28;\r
130 UINT32 TDStatusActualLength : 11;\r
131 UINT32 TDStatusRsvd : 5;\r
132 UINT32 TDStatus : 8;\r
133 UINT32 TDStatusIOC : 1;\r
134 UINT32 TDStatusIOS : 1;\r
135 UINT32 TDStatusLS : 1;\r
136 UINT32 TDStatusErr : 2;\r
137 UINT32 TDStatusSPD : 1;\r
138 UINT32 TDStatusRsvd2 : 2;\r
139 UINT32 TDTokenPID : 8;\r
140 UINT32 TDTokenDevAddr : 7;\r
141 UINT32 TDTokenEndPt : 4;\r
142 UINT32 TDTokenDataToggle : 1;\r
143 UINT32 TDTokenRsvd : 1;\r
144 UINT32 TDTokenMaxLen : 11;\r
145 UINT32 TDBufferPtr;\r
4b1bf81c 146} TD;\r
147\r
148typedef struct {\r
1436aea4
MK
149 TD TDData;\r
150 UINT8 *PtrTDBuffer;\r
151 VOID *PtrNextTD;\r
152 VOID *PtrNextQH;\r
153 UINT16 TDBufferLength;\r
154 UINT16 Reserved;\r
4b1bf81c 155} TD_STRUCT;\r
156\r
157#pragma pack()\r
158\r
159typedef struct _MEMORY_MANAGE_HEADER MEMORY_MANAGE_HEADER;\r
160\r
161struct _MEMORY_MANAGE_HEADER {\r
1436aea4
MK
162 UINT8 *BitArrayPtr;\r
163 UINTN BitArraySizeInBytes;\r
164 UINT8 *MemoryBlockPtr;\r
165 UINTN MemoryBlockSizeInBytes;\r
166 MEMORY_MANAGE_HEADER *Next;\r
4b1bf81c 167};\r
168\r
1436aea4 169#define USB_UHC_DEV_SIGNATURE SIGNATURE_32 ('p', 'u', 'h', 'c')\r
4b1bf81c 170typedef struct {\r
1436aea4
MK
171 UINTN Signature;\r
172 PEI_USB_HOST_CONTROLLER_PPI UsbHostControllerPpi;\r
173 EDKII_IOMMU_PPI *IoMmu;\r
174 EFI_PEI_PPI_DESCRIPTOR PpiDescriptor;\r
8284b179
SZ
175 //\r
176 // EndOfPei callback is used to stop the UHC DMA operation\r
177 // after exit PEI phase.\r
178 //\r
1436aea4 179 EFI_PEI_NOTIFY_DESCRIPTOR EndOfPeiNotifyList;\r
4b1bf81c 180\r
1436aea4
MK
181 UINT32 UsbHostControllerBaseAddress;\r
182 FRAMELIST_ENTRY *FrameListEntry;\r
183 QH_STRUCT *ConfigQH;\r
184 QH_STRUCT *BulkQH;\r
4b1bf81c 185 //\r
186 // Header1 used for QH,TD memory blocks management\r
187 //\r
1436aea4 188 MEMORY_MANAGE_HEADER *Header1;\r
4b1bf81c 189} USB_UHC_DEV;\r
190\r
1436aea4
MK
191#define PEI_RECOVERY_USB_UHC_DEV_FROM_UHCI_THIS(a) CR (a, USB_UHC_DEV, UsbHostControllerPpi, USB_UHC_DEV_SIGNATURE)\r
192#define PEI_RECOVERY_USB_UHC_DEV_FROM_THIS_NOTIFY(a) CR (a, USB_UHC_DEV, EndOfPeiNotifyList, USB_UHC_DEV_SIGNATURE)\r
4b1bf81c 193\r
194/**\r
195 Submits control transfer to a target USB device.\r
d1102dba 196\r
4b1bf81c 197 @param PeiServices The pointer of EFI_PEI_SERVICES.\r
198 @param This The pointer of PEI_USB_HOST_CONTROLLER_PPI.\r
199 @param DeviceAddress The target device address.\r
200 @param DeviceSpeed Target device speed.\r
d1102dba 201 @param MaximumPacketLength Maximum packet size the default control transfer\r
4b1bf81c 202 endpoint is capable of sending or receiving.\r
203 @param Request USB device request to send.\r
204 @param TransferDirection Specifies the data direction for the data stage.\r
205 @param Data Data buffer to be transmitted or received from USB device.\r
206 @param DataLength The size (in bytes) of the data buffer.\r
207 @param TimeOut Indicates the maximum timeout, in millisecond.\r
208 @param TransferResult Return the result of this control transfer.\r
209\r
210 @retval EFI_SUCCESS Transfer was completed successfully.\r
211 @retval EFI_OUT_OF_RESOURCES The transfer failed due to lack of resources.\r
212 @retval EFI_INVALID_PARAMETER Some parameters are invalid.\r
213 @retval EFI_TIMEOUT Transfer failed due to timeout.\r
214 @retval EFI_DEVICE_ERROR Transfer failed due to host controller or device error.\r
215\r
216**/\r
217EFI_STATUS\r
218EFIAPI\r
219UhcControlTransfer (\r
1436aea4
MK
220 IN EFI_PEI_SERVICES **PeiServices,\r
221 IN PEI_USB_HOST_CONTROLLER_PPI *This,\r
222 IN UINT8 DeviceAddress,\r
223 IN UINT8 DeviceSpeed,\r
224 IN UINT8 MaximumPacketLength,\r
225 IN EFI_USB_DEVICE_REQUEST *Request,\r
226 IN EFI_USB_DATA_DIRECTION TransferDirection,\r
227 IN OUT VOID *Data OPTIONAL,\r
228 IN OUT UINTN *DataLength OPTIONAL,\r
229 IN UINTN TimeOut,\r
230 OUT UINT32 *TransferResult\r
4b1bf81c 231 );\r
232\r
233/**\r
234 Submits bulk transfer to a bulk endpoint of a USB device.\r
d1102dba 235\r
4b1bf81c 236 @param PeiServices The pointer of EFI_PEI_SERVICES.\r
237 @param This The pointer of PEI_USB_HOST_CONTROLLER_PPI.\r
238 @param DeviceAddress Target device address.\r
239 @param EndPointAddress Endpoint number and its direction in bit 7.\r
d1102dba 240 @param MaximumPacketLength Maximum packet size the endpoint is capable of\r
4b1bf81c 241 sending or receiving.\r
d1102dba 242 @param Data Array of pointers to the buffers of data to transmit\r
4b1bf81c 243 from or receive into.\r
244 @param DataLength The lenght of the data buffer.\r
245 @param DataToggle On input, the initial data toggle for the transfer;\r
d1102dba 246 On output, it is updated to to next data toggle to use of\r
4b1bf81c 247 the subsequent bulk transfer.\r
248 @param TimeOut Indicates the maximum time, in millisecond, which the\r
249 transfer is allowed to complete.\r
250 @param TransferResult A pointer to the detailed result information of the\r
251 bulk transfer.\r
252\r
253 @retval EFI_SUCCESS The transfer was completed successfully.\r
254 @retval EFI_OUT_OF_RESOURCES The transfer failed due to lack of resource.\r
255 @retval EFI_INVALID_PARAMETER Parameters are invalid.\r
256 @retval EFI_TIMEOUT The transfer failed due to timeout.\r
257 @retval EFI_DEVICE_ERROR The transfer failed due to host controller error.\r
258\r
259**/\r
260EFI_STATUS\r
261EFIAPI\r
262UhcBulkTransfer (\r
1436aea4
MK
263 IN EFI_PEI_SERVICES **PeiServices,\r
264 IN PEI_USB_HOST_CONTROLLER_PPI *This,\r
265 IN UINT8 DeviceAddress,\r
266 IN UINT8 EndPointAddress,\r
267 IN UINT8 MaximumPacketLength,\r
268 IN OUT VOID *Data,\r
269 IN OUT UINTN *DataLength,\r
270 IN OUT UINT8 *DataToggle,\r
271 IN UINTN TimeOut,\r
272 OUT UINT32 *TransferResult\r
4b1bf81c 273 );\r
274\r
275/**\r
276 Retrieves the number of root hub ports.\r
277\r
278 @param[in] PeiServices The pointer to the PEI Services Table.\r
d1102dba 279 @param[in] This The pointer to this instance of the\r
4b1bf81c 280 PEI_USB_HOST_CONTROLLER_PPI.\r
d1102dba
LG
281 @param[out] PortNumber The pointer to the number of the root hub ports.\r
282\r
4b1bf81c 283 @retval EFI_SUCCESS The port number was retrieved successfully.\r
284 @retval EFI_INVALID_PARAMETER PortNumber is NULL.\r
285\r
286**/\r
287EFI_STATUS\r
288EFIAPI\r
289UhcGetRootHubPortNumber (\r
1436aea4
MK
290 IN EFI_PEI_SERVICES **PeiServices,\r
291 IN PEI_USB_HOST_CONTROLLER_PPI *This,\r
292 OUT UINT8 *PortNumber\r
4b1bf81c 293 );\r
294\r
295/**\r
296 Retrieves the current status of a USB root hub port.\r
d1102dba 297\r
4b1bf81c 298 @param PeiServices The pointer of EFI_PEI_SERVICES.\r
299 @param This The pointer of PEI_USB_HOST_CONTROLLER_PPI.\r
d1102dba 300 @param PortNumber The root hub port to retrieve the state from.\r
4b1bf81c 301 @param PortStatus Variable to receive the port state.\r
302\r
303 @retval EFI_SUCCESS The status of the USB root hub port specified.\r
304 by PortNumber was returned in PortStatus.\r
305 @retval EFI_INVALID_PARAMETER PortNumber is invalid.\r
306\r
307**/\r
308EFI_STATUS\r
309EFIAPI\r
310UhcGetRootHubPortStatus (\r
1436aea4
MK
311 IN EFI_PEI_SERVICES **PeiServices,\r
312 IN PEI_USB_HOST_CONTROLLER_PPI *This,\r
313 IN UINT8 PortNumber,\r
314 OUT EFI_USB_PORT_STATUS *PortStatus\r
4b1bf81c 315 );\r
316\r
317/**\r
318 Sets a feature for the specified root hub port.\r
d1102dba 319\r
4b1bf81c 320 @param PeiServices The pointer of EFI_PEI_SERVICES\r
321 @param This The pointer of PEI_USB_HOST_CONTROLLER_PPI\r
322 @param PortNumber Root hub port to set.\r
323 @param PortFeature Feature to set.\r
324\r
325 @retval EFI_SUCCESS The feature specified by PortFeature was set.\r
326 @retval EFI_INVALID_PARAMETER PortNumber is invalid or PortFeature is invalid.\r
327 @retval EFI_TIMEOUT The time out occurred.\r
328\r
329**/\r
330EFI_STATUS\r
331EFIAPI\r
332UhcSetRootHubPortFeature (\r
1436aea4
MK
333 IN EFI_PEI_SERVICES **PeiServices,\r
334 IN PEI_USB_HOST_CONTROLLER_PPI *This,\r
335 IN UINT8 PortNumber,\r
336 IN EFI_USB_PORT_FEATURE PortFeature\r
4b1bf81c 337 );\r
338\r
339/**\r
340 Clears a feature for the specified root hub port.\r
d1102dba 341\r
4b1bf81c 342 @param PeiServices The pointer of EFI_PEI_SERVICES.\r
343 @param This The pointer of PEI_USB_HOST_CONTROLLER_PPI.\r
344 @param PortNumber Specifies the root hub port whose feature\r
345 is requested to be cleared.\r
346 @param PortFeature Indicates the feature selector associated with the\r
347 feature clear request.\r
348\r
d1102dba 349 @retval EFI_SUCCESS The feature specified by PortFeature was cleared\r
4b1bf81c 350 for the USB root hub port specified by PortNumber.\r
351 @retval EFI_INVALID_PARAMETER PortNumber is invalid or PortFeature is invalid.\r
352\r
353**/\r
354EFI_STATUS\r
355EFIAPI\r
356UhcClearRootHubPortFeature (\r
1436aea4
MK
357 IN EFI_PEI_SERVICES **PeiServices,\r
358 IN PEI_USB_HOST_CONTROLLER_PPI *This,\r
359 IN UINT8 PortNumber,\r
360 IN EFI_USB_PORT_FEATURE PortFeature\r
4b1bf81c 361 );\r
362\r
363/**\r
364 Initialize UHCI.\r
365\r
366 @param UhcDev UHCI Device.\r
367\r
368 @retval EFI_SUCCESS UHCI successfully initialized.\r
369 @retval EFI_OUT_OF_RESOURCES Resource can not be allocated.\r
370\r
371**/\r
372EFI_STATUS\r
373InitializeUsbHC (\r
1436aea4 374 IN USB_UHC_DEV *UhcDev\r
4b1bf81c 375 );\r
376\r
377/**\r
378 Create Frame List Structure.\r
379\r
380 @param UhcDev UHCI device.\r
381\r
382 @retval EFI_OUT_OF_RESOURCES Can't allocate memory resources.\r
383 @retval EFI_SUCCESS Success.\r
384\r
385**/\r
386EFI_STATUS\r
387CreateFrameList (\r
1436aea4 388 USB_UHC_DEV *UhcDev\r
4b1bf81c 389 );\r
390\r
391/**\r
392 Read a 16bit width data from Uhc HC IO space register.\r
d1102dba 393\r
4b1bf81c 394 @param UhcDev The UHCI device.\r
395 @param Port The IO space address of the register.\r
396\r
397 @retval the register content read.\r
398\r
399**/\r
400UINT16\r
401USBReadPortW (\r
1436aea4
MK
402 IN USB_UHC_DEV *UhcDev,\r
403 IN UINT32 Port\r
4b1bf81c 404 );\r
405\r
406/**\r
407 Write a 16bit width data into Uhc HC IO space register.\r
d1102dba 408\r
4b1bf81c 409 @param UhcDev The UHCI device.\r
410 @param Port The IO space address of the register.\r
411 @param Data The data written into the register.\r
412\r
413**/\r
414VOID\r
415USBWritePortW (\r
1436aea4
MK
416 IN USB_UHC_DEV *UhcDev,\r
417 IN UINT32 Port,\r
418 IN UINT16 Data\r
4b1bf81c 419 );\r
420\r
421/**\r
422 Write a 32bit width data into Uhc HC IO space register.\r
d1102dba 423\r
4b1bf81c 424 @param UhcDev The UHCI device.\r
425 @param Port The IO space address of the register.\r
426 @param Data The data written into the register.\r
427\r
428**/\r
429VOID\r
430USBWritePortDW (\r
1436aea4
MK
431 IN USB_UHC_DEV *UhcDev,\r
432 IN UINT32 Port,\r
433 IN UINT32 Data\r
4b1bf81c 434 );\r
435\r
436/**\r
437 Clear the content of UHCI's Status Register.\r
d1102dba 438\r
4b1bf81c 439 @param UhcDev The UHCI device.\r
440 @param StatusAddr The IO space address of the register.\r
441\r
442**/\r
443VOID\r
444ClearStatusReg (\r
1436aea4
MK
445 IN USB_UHC_DEV *UhcDev,\r
446 IN UINT32 StatusAddr\r
4b1bf81c 447 );\r
448\r
449/**\r
450 Check whether the host controller operates well.\r
451\r
452 @param UhcDev The UHCI device.\r
453 @param StatusRegAddr The io address of status register.\r
454\r
455 @retval TRUE Host controller is working.\r
456 @retval FALSE Host controller is halted or system error.\r
457\r
458**/\r
459BOOLEAN\r
460IsStatusOK (\r
1436aea4
MK
461 IN USB_UHC_DEV *UhcDev,\r
462 IN UINT32 StatusRegAddr\r
4b1bf81c 463 );\r
464\r
4b1bf81c 465/**\r
466 Set Frame List Base Address.\r
467\r
468 @param UhcDev The UHCI device.\r
469 @param FrameListRegAddr The address of frame list register.\r
470 @param Addr The address of frame list table.\r
471\r
472**/\r
473VOID\r
474SetFrameListBaseAddress (\r
1436aea4
MK
475 IN USB_UHC_DEV *UhcDev,\r
476 IN UINT32 FrameListRegAddr,\r
477 IN UINT32 Addr\r
4b1bf81c 478 );\r
479\r
480/**\r
481 Create QH and initialize.\r
482\r
483 @param UhcDev The UHCI device.\r
484 @param PtrQH Place to store QH_STRUCT pointer.\r
485\r
486 @retval EFI_OUT_OF_RESOURCES Can't allocate memory resources.\r
487 @retval EFI_SUCCESS Success.\r
488\r
489**/\r
490EFI_STATUS\r
491CreateQH (\r
492 IN USB_UHC_DEV *UhcDev,\r
493 OUT QH_STRUCT **PtrQH\r
494 );\r
495\r
496/**\r
497 Set the horizontal link pointer in QH.\r
498\r
499 @param PtrQH Place to store QH_STRUCT pointer.\r
500 @param PtrNext Place to the next QH_STRUCT.\r
501\r
502**/\r
503VOID\r
504SetQHHorizontalLinkPtr (\r
505 IN QH_STRUCT *PtrQH,\r
506 IN VOID *PtrNext\r
507 );\r
508\r
4b1bf81c 509/**\r
510 Set a QH or TD horizontally to be connected with a specific QH.\r
511\r
512 @param PtrQH Place to store QH_STRUCT pointer.\r
513 @param IsQH Specify QH or TD is connected.\r
514\r
515**/\r
516VOID\r
517SetQHHorizontalQHorTDSelect (\r
518 IN QH_STRUCT *PtrQH,\r
519 IN BOOLEAN IsQH\r
520 );\r
521\r
522/**\r
523 Set the horizontal validor bit in QH.\r
524\r
525 @param PtrQH Place to store QH_STRUCT pointer.\r
526 @param IsValid Specify the horizontal linker is valid or not.\r
527\r
528**/\r
529VOID\r
530SetQHHorizontalValidorInvalid (\r
531 IN QH_STRUCT *PtrQH,\r
532 IN BOOLEAN IsValid\r
533 );\r
534\r
535/**\r
536 Set the vertical link pointer in QH.\r
537\r
538 @param PtrQH Place to store QH_STRUCT pointer.\r
539 @param PtrNext Place to the next QH_STRUCT.\r
540\r
541**/\r
542VOID\r
543SetQHVerticalLinkPtr (\r
544 IN QH_STRUCT *PtrQH,\r
545 IN VOID *PtrNext\r
546 );\r
547\r
548/**\r
549 Set a QH or TD vertically to be connected with a specific QH.\r
550\r
551 @param PtrQH Place to store QH_STRUCT pointer.\r
552 @param IsQH Specify QH or TD is connected.\r
553\r
554**/\r
555VOID\r
556SetQHVerticalQHorTDSelect (\r
557 IN QH_STRUCT *PtrQH,\r
558 IN BOOLEAN IsQH\r
559 );\r
560\r
561/**\r
562 Set the vertical validor bit in QH.\r
563\r
564 @param PtrQH Place to store QH_STRUCT pointer.\r
565 @param IsValid Specify the vertical linker is valid or not.\r
566\r
567**/\r
568VOID\r
569SetQHVerticalValidorInvalid (\r
570 IN QH_STRUCT *PtrQH,\r
571 IN BOOLEAN IsValid\r
572 );\r
573\r
4b1bf81c 574/**\r
575 Allocate TD or QH Struct.\r
576\r
577 @param UhcDev The UHCI device.\r
578 @param Size The size of allocation.\r
579 @param PtrStruct Place to store TD_STRUCT pointer.\r
580\r
581 @return EFI_SUCCESS Allocate successfully.\r
582 @retval EFI_OUT_OF_RESOURCES Can't allocate memory resource.\r
583\r
584**/\r
585EFI_STATUS\r
586AllocateTDorQHStruct (\r
1436aea4
MK
587 IN USB_UHC_DEV *UhcDev,\r
588 IN UINT32 Size,\r
589 OUT VOID **PtrStruct\r
4b1bf81c 590 );\r
591\r
592/**\r
593 Create a TD Struct.\r
594\r
595 @param UhcDev The UHCI device.\r
596 @param PtrTD Place to store TD_STRUCT pointer.\r
597\r
598 @return EFI_SUCCESS Allocate successfully.\r
599 @retval EFI_OUT_OF_RESOURCES Can't allocate memory resource.\r
600\r
601**/\r
602EFI_STATUS\r
603CreateTD (\r
1436aea4
MK
604 IN USB_UHC_DEV *UhcDev,\r
605 OUT TD_STRUCT **PtrTD\r
4b1bf81c 606 );\r
607\r
608/**\r
609 Generate Setup Stage TD.\r
610\r
611 @param UhcDev The UHCI device.\r
612 @param DevAddr Device address.\r
613 @param Endpoint Endpoint number.\r
614 @param DeviceSpeed Device Speed.\r
8284b179
SZ
615 @param DevRequest CPU memory address of request structure buffer to transfer.\r
616 @param RequestPhy PCI memory address of request structure buffer to transfer.\r
4b1bf81c 617 @param RequestLen Request length.\r
618 @param PtrTD TD_STRUCT generated.\r
619\r
620 @return EFI_SUCCESS Generate setup stage TD successfully.\r
621 @retval EFI_OUT_OF_RESOURCES Can't allocate memory resource.\r
622\r
623**/\r
624EFI_STATUS\r
625GenSetupStageTD (\r
1436aea4
MK
626 IN USB_UHC_DEV *UhcDev,\r
627 IN UINT8 DevAddr,\r
628 IN UINT8 Endpoint,\r
629 IN UINT8 DeviceSpeed,\r
630 IN UINT8 *DevRequest,\r
631 IN UINT8 *RequestPhy,\r
632 IN UINT8 RequestLen,\r
633 OUT TD_STRUCT **PtrTD\r
4b1bf81c 634 );\r
635\r
636/**\r
637 Generate Data Stage TD.\r
638\r
639 @param UhcDev The UHCI device.\r
640 @param DevAddr Device address.\r
641 @param Endpoint Endpoint number.\r
8284b179
SZ
642 @param PtrData CPU memory address of user data buffer to transfer.\r
643 @param DataPhy PCI memory address of user data buffer to transfer.\r
4b1bf81c 644 @param Len Data length.\r
645 @param PktID PacketID.\r
646 @param Toggle Data toggle value.\r
647 @param DeviceSpeed Device Speed.\r
648 @param PtrTD TD_STRUCT generated.\r
649\r
650 @return EFI_SUCCESS Generate data stage TD successfully.\r
651 @retval EFI_OUT_OF_RESOURCES Can't allocate memory resource.\r
652\r
653**/\r
654EFI_STATUS\r
655GenDataTD (\r
1436aea4
MK
656 IN USB_UHC_DEV *UhcDev,\r
657 IN UINT8 DevAddr,\r
658 IN UINT8 Endpoint,\r
659 IN UINT8 *PtrData,\r
660 IN UINT8 *DataPhy,\r
661 IN UINT8 Len,\r
662 IN UINT8 PktID,\r
663 IN UINT8 Toggle,\r
664 IN UINT8 DeviceSpeed,\r
665 OUT TD_STRUCT **PtrTD\r
4b1bf81c 666 );\r
667\r
668/**\r
669 Generate Status Stage TD.\r
670\r
671 @param UhcDev The UHCI device.\r
672 @param DevAddr Device address.\r
673 @param Endpoint Endpoint number.\r
674 @param PktID PacketID.\r
675 @param DeviceSpeed Device Speed.\r
676 @param PtrTD TD_STRUCT generated.\r
677\r
678 @return EFI_SUCCESS Generate status stage TD successfully.\r
679 @retval EFI_OUT_OF_RESOURCES Can't allocate memory resource.\r
680\r
681**/\r
682EFI_STATUS\r
683CreateStatusTD (\r
1436aea4
MK
684 IN USB_UHC_DEV *UhcDev,\r
685 IN UINT8 DevAddr,\r
686 IN UINT8 Endpoint,\r
687 IN UINT8 PktID,\r
688 IN UINT8 DeviceSpeed,\r
689 OUT TD_STRUCT **PtrTD\r
4b1bf81c 690 );\r
691\r
692/**\r
693 Set the link pointer validor bit in TD.\r
694\r
695 @param PtrTDStruct Place to store TD_STRUCT pointer.\r
696 @param IsValid Specify the linker pointer is valid or not.\r
697\r
698**/\r
699VOID\r
700SetTDLinkPtrValidorInvalid (\r
1436aea4
MK
701 IN TD_STRUCT *PtrTDStruct,\r
702 IN BOOLEAN IsValid\r
4b1bf81c 703 );\r
704\r
705/**\r
706 Set the Link Pointer pointing to a QH or TD.\r
707\r
708 @param PtrTDStruct Place to store TD_STRUCT pointer.\r
709 @param IsQH Specify QH or TD is connected.\r
710\r
711**/\r
712VOID\r
713SetTDLinkPtrQHorTDSelect (\r
1436aea4
MK
714 IN TD_STRUCT *PtrTDStruct,\r
715 IN BOOLEAN IsQH\r
4b1bf81c 716 );\r
717\r
718/**\r
719 Set the traverse is depth-first or breadth-first.\r
720\r
721 @param PtrTDStruct Place to store TD_STRUCT pointer.\r
722 @param IsDepth Specify the traverse is depth-first or breadth-first.\r
723\r
724**/\r
725VOID\r
726SetTDLinkPtrDepthorBreadth (\r
1436aea4
MK
727 IN TD_STRUCT *PtrTDStruct,\r
728 IN BOOLEAN IsDepth\r
4b1bf81c 729 );\r
730\r
731/**\r
732 Set TD Link Pointer in TD.\r
733\r
734 @param PtrTDStruct Place to store TD_STRUCT pointer.\r
735 @param PtrNext Place to the next TD_STRUCT.\r
736\r
737**/\r
738VOID\r
739SetTDLinkPtr (\r
1436aea4
MK
740 IN TD_STRUCT *PtrTDStruct,\r
741 IN VOID *PtrNext\r
4b1bf81c 742 );\r
743\r
744/**\r
745 Get TD Link Pointer.\r
746\r
747 @param PtrTDStruct Place to store TD_STRUCT pointer.\r
748\r
749 @retval Get TD Link Pointer in TD.\r
750\r
751**/\r
1436aea4 752VOID *\r
4b1bf81c 753GetTDLinkPtr (\r
1436aea4 754 IN TD_STRUCT *PtrTDStruct\r
4b1bf81c 755 );\r
756\r
4b1bf81c 757/**\r
758 Enable/Disable short packet detection mechanism.\r
759\r
760 @param PtrTDStruct Place to store TD_STRUCT pointer.\r
761 @param IsEnable Enable or disable short packet detection mechanism.\r
762\r
763**/\r
764VOID\r
765EnableorDisableTDShortPacket (\r
1436aea4
MK
766 IN TD_STRUCT *PtrTDStruct,\r
767 IN BOOLEAN IsEnable\r
4b1bf81c 768 );\r
769\r
770/**\r
771 Set the max error counter in TD.\r
772\r
773 @param PtrTDStruct Place to store TD_STRUCT pointer.\r
774 @param MaxErrors The number of allowable error.\r
775\r
776**/\r
777VOID\r
778SetTDControlErrorCounter (\r
1436aea4
MK
779 IN TD_STRUCT *PtrTDStruct,\r
780 IN UINT8 MaxErrors\r
4b1bf81c 781 );\r
782\r
783/**\r
784 Set the TD is targeting a low-speed device or not.\r
785\r
786 @param PtrTDStruct Place to store TD_STRUCT pointer.\r
787 @param IsLowSpeedDevice Whether The device is low-speed.\r
788\r
789**/\r
790VOID\r
791SetTDLoworFullSpeedDevice (\r
1436aea4
MK
792 IN TD_STRUCT *PtrTDStruct,\r
793 IN BOOLEAN IsLowSpeedDevice\r
4b1bf81c 794 );\r
795\r
796/**\r
797 Set the TD is isochronous transfer type or not.\r
798\r
799 @param PtrTDStruct Place to store TD_STRUCT pointer.\r
800 @param IsIsochronous Whether the transaction isochronous transfer type.\r
801\r
802**/\r
803VOID\r
804SetTDControlIsochronousorNot (\r
1436aea4
MK
805 IN TD_STRUCT *PtrTDStruct,\r
806 IN BOOLEAN IsIsochronous\r
4b1bf81c 807 );\r
808\r
809/**\r
810 Set if UCHI should issue an interrupt on completion of the frame\r
811 in which this TD is executed\r
812\r
813 @param PtrTDStruct Place to store TD_STRUCT pointer.\r
814 @param IsSet Whether HC should issue an interrupt on completion.\r
815\r
816**/\r
817VOID\r
818SetorClearTDControlIOC (\r
1436aea4
MK
819 IN TD_STRUCT *PtrTDStruct,\r
820 IN BOOLEAN IsSet\r
4b1bf81c 821 );\r
822\r
823/**\r
824 Set if the TD is active and can be executed.\r
825\r
826 @param PtrTDStruct Place to store TD_STRUCT pointer.\r
827 @param IsActive Whether the TD is active and can be executed.\r
828\r
829**/\r
830VOID\r
831SetTDStatusActiveorInactive (\r
1436aea4
MK
832 IN TD_STRUCT *PtrTDStruct,\r
833 IN BOOLEAN IsActive\r
4b1bf81c 834 );\r
835\r
836/**\r
837 Specifies the maximum number of data bytes allowed for the transfer.\r
838\r
839 @param PtrTDStruct Place to store TD_STRUCT pointer.\r
840 @param MaxLen The maximum number of data bytes allowed.\r
841\r
842 @retval The allowed maximum number of data.\r
843**/\r
844UINT16\r
845SetTDTokenMaxLength (\r
1436aea4
MK
846 IN TD_STRUCT *PtrTDStruct,\r
847 IN UINT16 MaxLen\r
4b1bf81c 848 );\r
849\r
850/**\r
851 Set the data toggle bit to DATA1.\r
852\r
853 @param PtrTDStruct Place to store TD_STRUCT pointer.\r
854\r
855**/\r
856VOID\r
857SetTDTokenDataToggle1 (\r
1436aea4 858 IN TD_STRUCT *PtrTDStruct\r
4b1bf81c 859 );\r
860\r
861/**\r
862 Set the data toggle bit to DATA0.\r
863\r
864 @param PtrTDStruct Place to store TD_STRUCT pointer.\r
865\r
866**/\r
867VOID\r
868SetTDTokenDataToggle0 (\r
1436aea4 869 IN TD_STRUCT *PtrTDStruct\r
4b1bf81c 870 );\r
871\r
872/**\r
873 Set EndPoint Number the TD is targeting at.\r
874\r
875 @param PtrTDStruct Place to store TD_STRUCT pointer.\r
876 @param EndPoint The Endport number of the target.\r
877\r
878**/\r
879VOID\r
880SetTDTokenEndPoint (\r
1436aea4
MK
881 IN TD_STRUCT *PtrTDStruct,\r
882 IN UINTN EndPoint\r
4b1bf81c 883 );\r
884\r
885/**\r
886 Set Device Address the TD is targeting at.\r
887\r
888 @param PtrTDStruct Place to store TD_STRUCT pointer.\r
889 @param DevAddr The Device Address of the target.\r
890\r
891**/\r
892VOID\r
893SetTDTokenDeviceAddress (\r
1436aea4
MK
894 IN TD_STRUCT *PtrTDStruct,\r
895 IN UINTN DevAddr\r
4b1bf81c 896 );\r
897\r
898/**\r
899 Set Packet Identification the TD is targeting at.\r
900\r
901 @param PtrTDStruct Place to store TD_STRUCT pointer.\r
902 @param PacketID The Packet Identification of the target.\r
903\r
904**/\r
905VOID\r
906SetTDTokenPacketID (\r
1436aea4
MK
907 IN TD_STRUCT *PtrTDStruct,\r
908 IN UINT8 PacketID\r
4b1bf81c 909 );\r
910\r
911/**\r
912 Set the beginning address of the data buffer that will be used\r
913 during the transaction.\r
914\r
915 @param PtrTDStruct Place to store TD_STRUCT pointer.\r
916\r
917**/\r
918VOID\r
919SetTDDataBuffer (\r
1436aea4 920 IN TD_STRUCT *PtrTDStruct\r
4b1bf81c 921 );\r
922\r
923/**\r
924 Detect whether the TD is active.\r
925\r
926 @param PtrTDStruct Place to store TD_STRUCT pointer.\r
927\r
928 @retval The TD is active or not.\r
929\r
930**/\r
931BOOLEAN\r
932IsTDStatusActive (\r
1436aea4 933 IN TD_STRUCT *PtrTDStruct\r
4b1bf81c 934 );\r
935\r
936/**\r
937 Detect whether the TD is stalled.\r
938\r
939 @param PtrTDStruct Place to store TD_STRUCT pointer.\r
940\r
941 @retval The TD is stalled or not.\r
942\r
943**/\r
944BOOLEAN\r
945IsTDStatusStalled (\r
1436aea4 946 IN TD_STRUCT *PtrTDStruct\r
4b1bf81c 947 );\r
948\r
949/**\r
950 Detect whether Data Buffer Error is happened.\r
951\r
952 @param PtrTDStruct Place to store TD_STRUCT pointer.\r
953\r
954 @retval The Data Buffer Error is happened or not.\r
955\r
956**/\r
957BOOLEAN\r
958IsTDStatusBufferError (\r
1436aea4 959 IN TD_STRUCT *PtrTDStruct\r
4b1bf81c 960 );\r
961\r
962/**\r
963 Detect whether Babble Error is happened.\r
964\r
965 @param PtrTDStruct Place to store TD_STRUCT pointer.\r
966\r
967 @retval The Babble Error is happened or not.\r
968\r
969**/\r
970BOOLEAN\r
971IsTDStatusBabbleError (\r
1436aea4 972 IN TD_STRUCT *PtrTDStruct\r
4b1bf81c 973 );\r
974\r
975/**\r
976 Detect whether NAK is received.\r
977\r
978 @param PtrTDStruct Place to store TD_STRUCT pointer.\r
979\r
980 @retval The NAK is received or not.\r
981\r
982**/\r
983BOOLEAN\r
984IsTDStatusNAKReceived (\r
1436aea4 985 IN TD_STRUCT *PtrTDStruct\r
4b1bf81c 986 );\r
987\r
988/**\r
989 Detect whether CRC/Time Out Error is encountered.\r
990\r
991 @param PtrTDStruct Place to store TD_STRUCT pointer.\r
992\r
993 @retval The CRC/Time Out Error is encountered or not.\r
994\r
995**/\r
996BOOLEAN\r
997IsTDStatusCRCTimeOutError (\r
1436aea4 998 IN TD_STRUCT *PtrTDStruct\r
4b1bf81c 999 );\r
1000\r
1001/**\r
1002 Detect whether Bitstuff Error is received.\r
1003\r
1004 @param PtrTDStruct Place to store TD_STRUCT pointer.\r
1005\r
1006 @retval The Bitstuff Error is received or not.\r
1007\r
1008**/\r
1009BOOLEAN\r
1010IsTDStatusBitStuffError (\r
1436aea4 1011 IN TD_STRUCT *PtrTDStruct\r
4b1bf81c 1012 );\r
1013\r
1014/**\r
1015 Retrieve the actual number of bytes that were tansferred.\r
1016\r
1017 @param PtrTDStruct Place to store TD_STRUCT pointer.\r
1018\r
1019 @retval The actual number of bytes that were tansferred.\r
1020\r
1021**/\r
1022UINT16\r
1023GetTDStatusActualLength (\r
1436aea4 1024 IN TD_STRUCT *PtrTDStruct\r
4b1bf81c 1025 );\r
1026\r
1027/**\r
1028 Retrieve the information of whether the Link Pointer field is valid or not.\r
1029\r
1030 @param PtrTDStruct Place to store TD_STRUCT pointer.\r
1031\r
1032 @retval The linker pointer field is valid or not.\r
1033\r
1034**/\r
1035BOOLEAN\r
1036GetTDLinkPtrValidorInvalid (\r
1436aea4 1037 IN TD_STRUCT *PtrTDStruct\r
4b1bf81c 1038 );\r
1039\r
1040/**\r
1041 Count TD Number from PtrFirstTD.\r
1042\r
1043 @param PtrFirstTD Place to store TD_STRUCT pointer.\r
1044\r
1045 @retval The queued TDs number.\r
1046\r
1047**/\r
1048UINTN\r
1049CountTDsNumber (\r
1436aea4 1050 IN TD_STRUCT *PtrFirstTD\r
4b1bf81c 1051 );\r
1052\r
1053/**\r
1054 Link TD To QH.\r
1055\r
1056 @param PtrQH Place to store QH_STRUCT pointer.\r
1057 @param PtrTD Place to store TD_STRUCT pointer.\r
1058\r
1059**/\r
1060VOID\r
1061LinkTDToQH (\r
1436aea4
MK
1062 IN QH_STRUCT *PtrQH,\r
1063 IN TD_STRUCT *PtrTD\r
4b1bf81c 1064 );\r
1065\r
1066/**\r
1067 Link TD To TD.\r
1068\r
1069 @param PtrPreTD Place to store TD_STRUCT pointer.\r
1070 @param PtrTD Place to store TD_STRUCT pointer.\r
1071\r
1072**/\r
1073VOID\r
1074LinkTDToTD (\r
1436aea4
MK
1075 IN TD_STRUCT *PtrPreTD,\r
1076 IN TD_STRUCT *PtrTD\r
4b1bf81c 1077 );\r
1078\r
1079/**\r
1080 Execute Control Transfer.\r
1081\r
1082 @param UhcDev The UCHI device.\r
1083 @param PtrTD A pointer to TD_STRUCT data.\r
1084 @param ActualLen Actual transfer Length.\r
1085 @param TimeOut TimeOut value.\r
1086 @param TransferResult Transfer Result.\r
1087\r
1088 @return EFI_DEVICE_ERROR The transfer failed due to transfer error.\r
1089 @return EFI_TIMEOUT The transfer failed due to time out.\r
1090 @return EFI_SUCCESS The transfer finished OK.\r
1091\r
1092**/\r
1093EFI_STATUS\r
1094ExecuteControlTransfer (\r
1436aea4
MK
1095 IN USB_UHC_DEV *UhcDev,\r
1096 IN TD_STRUCT *PtrTD,\r
1097 OUT UINTN *ActualLen,\r
1098 IN UINTN TimeOut,\r
1099 OUT UINT32 *TransferResult\r
4b1bf81c 1100 );\r
1101\r
1102/**\r
1103 Execute Bulk Transfer.\r
1104\r
1105 @param UhcDev The UCHI device.\r
1106 @param PtrTD A pointer to TD_STRUCT data.\r
1107 @param ActualLen Actual transfer Length.\r
1108 @param DataToggle DataToggle value.\r
1109 @param TimeOut TimeOut value.\r
1110 @param TransferResult Transfer Result.\r
1111\r
1112 @return EFI_DEVICE_ERROR The transfer failed due to transfer error.\r
1113 @return EFI_TIMEOUT The transfer failed due to time out.\r
1114 @return EFI_SUCCESS The transfer finished OK.\r
1115\r
1116**/\r
1117EFI_STATUS\r
1118ExecBulkTransfer (\r
1436aea4
MK
1119 IN USB_UHC_DEV *UhcDev,\r
1120 IN TD_STRUCT *PtrTD,\r
1121 IN OUT UINTN *ActualLen,\r
1122 IN UINT8 *DataToggle,\r
1123 IN UINTN TimeOut,\r
1124 OUT UINT32 *TransferResult\r
4b1bf81c 1125 );\r
1126\r
1127/**\r
1128 Delete Queued TDs.\r
1129\r
1130 @param UhcDev The UCHI device.\r
1131 @param PtrFirstTD Place to store TD_STRUCT pointer.\r
1132\r
1133**/\r
1134VOID\r
1135DeleteQueuedTDs (\r
1436aea4
MK
1136 IN USB_UHC_DEV *UhcDev,\r
1137 IN TD_STRUCT *PtrFirstTD\r
4b1bf81c 1138 );\r
1139\r
1140/**\r
1141 Check TDs Results.\r
1142\r
1143 @param PtrTD A pointer to TD_STRUCT data.\r
1144 @param Result The result to return.\r
1145 @param ErrTDPos The Error TD position.\r
1146 @param ActualTransferSize Actual transfer size.\r
1147\r
1148 @retval The TD is executed successfully or not.\r
1149\r
1150**/\r
1151BOOLEAN\r
1152CheckTDsResults (\r
1436aea4
MK
1153 IN TD_STRUCT *PtrTD,\r
1154 OUT UINT32 *Result,\r
1155 OUT UINTN *ErrTDPos,\r
1156 OUT UINTN *ActualTransferSize\r
4b1bf81c 1157 );\r
1158\r
1159/**\r
1160 Create Memory Block.\r
1161\r
1162 @param UhcDev The UCHI device.\r
1163 @param MemoryHeader The Pointer to allocated memory block.\r
1164 @param MemoryBlockSizeInPages The page size of memory block to be allocated.\r
1165\r
1166 @retval EFI_OUT_OF_RESOURCES Can't allocate memory resources.\r
1167 @retval EFI_SUCCESS Success.\r
1168\r
1169**/\r
1170EFI_STATUS\r
1171CreateMemoryBlock (\r
1172 IN USB_UHC_DEV *UhcDev,\r
1173 OUT MEMORY_MANAGE_HEADER **MemoryHeader,\r
1174 IN UINTN MemoryBlockSizeInPages\r
1175 );\r
1176\r
1177/**\r
1178 Initialize UHCI memory management.\r
1179\r
1180 @param UhcDev The UCHI device.\r
1181\r
1182 @retval EFI_OUT_OF_RESOURCES Can't allocate memory resources.\r
1183 @retval EFI_SUCCESS Success.\r
1184\r
1185**/\r
1186EFI_STATUS\r
1187InitializeMemoryManagement (\r
1436aea4 1188 IN USB_UHC_DEV *UhcDev\r
4b1bf81c 1189 );\r
1190\r
1191/**\r
1192 Initialize UHCI memory management.\r
1193\r
1194 @param UhcDev The UCHI device.\r
1195 @param Pool Buffer pointer to store the buffer pointer.\r
1196 @param AllocSize The size of the pool to be allocated.\r
1197\r
1198 @retval EFI_OUT_OF_RESOURCES Can't allocate memory resources.\r
1199 @retval EFI_SUCCESS Success.\r
1200\r
1201**/\r
1202EFI_STATUS\r
1203UhcAllocatePool (\r
1436aea4
MK
1204 IN USB_UHC_DEV *UhcDev,\r
1205 OUT UINT8 **Pool,\r
1206 IN UINTN AllocSize\r
4b1bf81c 1207 );\r
1208\r
1209/**\r
1210 Alloc Memory In MemoryBlock.\r
1211\r
1212 @param MemoryHeader The pointer to memory manage header.\r
1213 @param Pool Buffer pointer to store the buffer pointer.\r
1214 @param NumberOfMemoryUnit The size of the pool to be allocated.\r
1215\r
1216 @retval EFI_OUT_OF_RESOURCES Can't allocate memory resources.\r
1217 @retval EFI_SUCCESS Success.\r
1218\r
1219**/\r
1220EFI_STATUS\r
1221AllocMemInMemoryBlock (\r
1222 IN MEMORY_MANAGE_HEADER *MemoryHeader,\r
1223 OUT VOID **Pool,\r
1224 IN UINTN NumberOfMemoryUnit\r
1225 );\r
1226\r
1227/**\r
1228 Uhci Free Pool.\r
1229\r
1230 @param UhcDev The UHCI device.\r
1231 @param Pool A pointer to store the buffer address.\r
1232 @param AllocSize The size of the pool to be freed.\r
1233\r
1234**/\r
1235VOID\r
1236UhcFreePool (\r
1436aea4
MK
1237 IN USB_UHC_DEV *UhcDev,\r
1238 IN UINT8 *Pool,\r
1239 IN UINTN AllocSize\r
4b1bf81c 1240 );\r
1241\r
1242/**\r
1243 Insert a new memory header into list.\r
1244\r
1245 @param MemoryHeader A pointer to the memory header list.\r
1246 @param NewMemoryHeader A new memory header to be inserted into the list.\r
1247\r
1248**/\r
1249VOID\r
1250InsertMemoryHeaderToList (\r
1251 IN MEMORY_MANAGE_HEADER *MemoryHeader,\r
1252 IN MEMORY_MANAGE_HEADER *NewMemoryHeader\r
1253 );\r
1254\r
8284b179
SZ
1255/**\r
1256 Map address of request structure buffer.\r
1257\r
1258 @param Uhc The UHCI device.\r
1259 @param Request The user request buffer.\r
1260 @param MappedAddr Mapped address of request.\r
1261 @param Map Identificaion of this mapping to return.\r
1262\r
1263 @return EFI_SUCCESS Success.\r
1264 @return EFI_DEVICE_ERROR Fail to map the user request.\r
1265\r
1266**/\r
1267EFI_STATUS\r
1268UhciMapUserRequest (\r
1436aea4
MK
1269 IN USB_UHC_DEV *Uhc,\r
1270 IN OUT VOID *Request,\r
1271 OUT UINT8 **MappedAddr,\r
1272 OUT VOID **Map\r
8284b179
SZ
1273 );\r
1274\r
1275/**\r
1276 Map address of user data buffer.\r
1277\r
1278 @param Uhc The UHCI device.\r
1279 @param Direction Direction of the data transfer.\r
1280 @param Data The user data buffer.\r
1281 @param Len Length of the user data.\r
1282 @param PktId Packet identificaion.\r
1283 @param MappedAddr Mapped address to return.\r
1284 @param Map Identificaion of this mapping to return.\r
1285\r
1286 @return EFI_SUCCESS Success.\r
1287 @return EFI_DEVICE_ERROR Fail to map the user data.\r
1288\r
1289**/\r
1290EFI_STATUS\r
1291UhciMapUserData (\r
1292 IN USB_UHC_DEV *Uhc,\r
1293 IN EFI_USB_DATA_DIRECTION Direction,\r
1294 IN VOID *Data,\r
1295 IN OUT UINTN *Len,\r
1296 OUT UINT8 *PktId,\r
1297 OUT UINT8 **MappedAddr,\r
1298 OUT VOID **Map\r
1299 );\r
1300\r
1301/**\r
1302 Provides the controller-specific addresses required to access system memory from a\r
1303 DMA bus master.\r
1304\r
1305 @param IoMmu Pointer to IOMMU PPI.\r
1306 @param Operation Indicates if the bus master is going to read or write to system memory.\r
1307 @param HostAddress The system memory address to map to the PCI controller.\r
1308 @param NumberOfBytes On input the number of bytes to map. On output the number of bytes\r
1309 that were mapped.\r
1310 @param DeviceAddress The resulting map address for the bus master PCI controller to use to\r
1311 access the hosts HostAddress.\r
1312 @param Mapping A resulting value to pass to Unmap().\r
1313\r
1314 @retval EFI_SUCCESS The range was mapped for the returned NumberOfBytes.\r
1315 @retval EFI_UNSUPPORTED The HostAddress cannot be mapped as a common buffer.\r
1316 @retval EFI_INVALID_PARAMETER One or more parameters are invalid.\r
1317 @retval EFI_OUT_OF_RESOURCES The request could not be completed due to a lack of resources.\r
1318 @retval EFI_DEVICE_ERROR The system hardware could not map the requested address.\r
1319\r
1320**/\r
1321EFI_STATUS\r
1322IoMmuMap (\r
1323 IN EDKII_IOMMU_PPI *IoMmu,\r
1324 IN EDKII_IOMMU_OPERATION Operation,\r
1325 IN VOID *HostAddress,\r
1326 IN OUT UINTN *NumberOfBytes,\r
1327 OUT EFI_PHYSICAL_ADDRESS *DeviceAddress,\r
1328 OUT VOID **Mapping\r
1329 );\r
1330\r
1331/**\r
1332 Completes the Map() operation and releases any corresponding resources.\r
1333\r
1334 @param IoMmu Pointer to IOMMU PPI.\r
1335 @param Mapping The mapping value returned from Map().\r
1336\r
1337**/\r
1338VOID\r
1339IoMmuUnmap (\r
1436aea4
MK
1340 IN EDKII_IOMMU_PPI *IoMmu,\r
1341 IN VOID *Mapping\r
8284b179
SZ
1342 );\r
1343\r
1344/**\r
1345 Allocates pages that are suitable for an OperationBusMasterCommonBuffer or\r
1346 OperationBusMasterCommonBuffer64 mapping.\r
1347\r
1348 @param IoMmu Pointer to IOMMU PPI.\r
1349 @param Pages The number of pages to allocate.\r
1350 @param HostAddress A pointer to store the base system memory address of the\r
1351 allocated range.\r
1352 @param DeviceAddress The resulting map address for the bus master PCI controller to use to\r
1353 access the hosts HostAddress.\r
1354 @param Mapping A resulting value to pass to Unmap().\r
1355\r
1356 @retval EFI_SUCCESS The requested memory pages were allocated.\r
1357 @retval EFI_UNSUPPORTED Attributes is unsupported. The only legal attribute bits are\r
1358 MEMORY_WRITE_COMBINE and MEMORY_CACHED.\r
1359 @retval EFI_INVALID_PARAMETER One or more parameters are invalid.\r
1360 @retval EFI_OUT_OF_RESOURCES The memory pages could not be allocated.\r
1361\r
1362**/\r
1363EFI_STATUS\r
1364IoMmuAllocateBuffer (\r
1365 IN EDKII_IOMMU_PPI *IoMmu,\r
1366 IN UINTN Pages,\r
1367 OUT VOID **HostAddress,\r
1368 OUT EFI_PHYSICAL_ADDRESS *DeviceAddress,\r
1369 OUT VOID **Mapping\r
1370 );\r
1371\r
8284b179
SZ
1372/**\r
1373 Initialize IOMMU.\r
1374\r
1375 @param IoMmu Pointer to pointer to IOMMU PPI.\r
1376\r
1377**/\r
1378VOID\r
1379IoMmuInit (\r
1436aea4 1380 OUT EDKII_IOMMU_PPI **IoMmu\r
8284b179
SZ
1381 );\r
1382\r
4b1bf81c 1383#endif\r