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