TianoCore EDK2 master
Loading...
Searching...
No Matches
Uhci.h
Go to the documentation of this file.
1
10#ifndef _EFI_UHCI_H_
11#define _EFI_UHCI_H_
12
13#include <Uefi.h>
14
17#include <Protocol/PciIo.h>
18
19#include <Guid/EventGroup.h>
20
21#include <Library/DebugLib.h>
25#include <Library/UefiLib.h>
26#include <Library/BaseLib.h>
28#include <Library/PcdLib.h>
30
32
33typedef struct _USB_HC_DEV USB_HC_DEV;
34
35#include "UsbHcMem.h"
36#include "UhciQueue.h"
37#include "UhciReg.h"
38#include "UhciSched.h"
39#include "UhciDebug.h"
40#include "ComponentName.h"
41
42//
43// UHC timeout experience values
44//
45
46#define UHC_1_MICROSECOND 1
47#define UHC_1_MILLISECOND (1000 * UHC_1_MICROSECOND)
48#define UHC_1_SECOND (1000 * UHC_1_MILLISECOND)
49
50//
51// UHCI register operation timeout, set by experience
52//
53#define UHC_GENERIC_TIMEOUT UHC_1_SECOND
54
55//
56// Wait for force global resume(FGR) complete, refers to
57// specification[UHCI11-2.1.1]
58//
59#define UHC_FORCE_GLOBAL_RESUME_STALL (20 * UHC_1_MILLISECOND)
60
61//
62// Wait for roothub port reset and recovery, reset stall
63// is set by experience, and recovery stall refers to
64// specification[UHCI11-2.1.1]
65//
66#define UHC_ROOT_PORT_RESET_STALL (50 * UHC_1_MILLISECOND)
67#define UHC_ROOT_PORT_RECOVERY_STALL (10 * UHC_1_MILLISECOND)
68
69//
70// Sync and Async transfer polling interval, set by experience,
71// and the unit of Async is 100us.
72//
73#define UHC_SYNC_POLL_INTERVAL (1 * UHC_1_MILLISECOND)
74#define UHC_ASYNC_POLL_INTERVAL EFI_TIMER_PERIOD_MILLISECONDS(1)
75
76//
77// UHC raises TPL to TPL_NOTIFY to serialize all its operations
78// to protect shared data structures.
79//
80#define UHCI_TPL TPL_NOTIFY
81
82#define USB_HC_DEV_SIGNATURE SIGNATURE_32 ('u', 'h', 'c', 'i')
83
84#pragma pack(1)
85typedef struct {
86 UINT8 ProgInterface;
87 UINT8 SubClassCode;
88 UINT8 BaseCode;
90#pragma pack()
91
92#define UHC_FROM_USB2_HC_PROTO(This) CR(This, USB_HC_DEV, Usb2Hc, USB_HC_DEV_SIGNATURE)
93
94//
95// USB_HC_DEV support the UHCI hardware controller. It schedules
96// the asynchronous interrupt transfer with the same method as
97// EHCI: a reversed tree structure. For synchronous interrupt,
98// control and bulk transfer, it uses three static queue head to
99// schedule them. SyncIntQh is for interrupt transfer. LsCtrlQh is
100// for LOW speed control transfer, and FsCtrlBulkQh is for FULL
101// speed control or bulk transfer. This is because FULL speed contrl
102// or bulk transfer can reclaim the unused bandwidth. Some USB
103// device requires this bandwidth reclamation capability.
104//
106 UINT32 Signature;
108 EFI_PCI_IO_PROTOCOL *PciIo;
109 EFI_DEVICE_PATH_PROTOCOL *DevicePath;
110 UINT64 OriginalPciAttributes;
111
112 //
113 // Schedule data structures
114 //
115 UINT32 *FrameBase; // the buffer pointed by this pointer is used to store pci bus address of the QH descriptor.
116 UINT32 *FrameBaseHostAddr; // the buffer pointed by this pointer is used to store host memory address of the QH descriptor.
117 UHCI_QH_SW *SyncIntQh;
118 UHCI_QH_SW *CtrlQh;
119 UHCI_QH_SW *BulkQh;
120
121 //
122 // Structures to maintain asynchronus interrupt transfers.
123 // When asynchronous interrutp transfer is unlinked from
124 // the frame list, the hardware may still hold a pointer
125 // to it. To synchronize with hardware, its resoureces are
126 // released in two steps using Recycle and RecycleWait.
127 // Check the asynchronous interrupt management routines.
128 //
129 LIST_ENTRY AsyncIntList;
130 EFI_EVENT AsyncIntMonitor;
131 UHCI_ASYNC_REQUEST *Recycle;
132 UHCI_ASYNC_REQUEST *RecycleWait;
133
134 UINTN RootPorts;
135 USBHC_MEM_POOL *MemPool;
136 EFI_UNICODE_STRING_TABLE *CtrlNameTable;
137 VOID *FrameMapping;
138
139 //
140 // ExitBootServicesEvent is used to stop the EHC DMA operation
141 // after exit boot service.
142 //
143 EFI_EVENT ExitBootServiceEvent;
144};
145
146extern EFI_DRIVER_BINDING_PROTOCOL gUhciDriverBinding;
147extern EFI_COMPONENT_NAME_PROTOCOL gUhciComponentName;
148extern EFI_COMPONENT_NAME2_PROTOCOL gUhciComponentName2;
149
163EFIAPI
166 IN EFI_HANDLE Controller,
167 IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath
168 );
169
184EFIAPI
187 IN EFI_HANDLE Controller,
188 IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath
189 );
190
205EFIAPI
208 IN EFI_HANDLE Controller,
209 IN UINTN NumberOfChildren,
210 IN EFI_HANDLE *ChildHandleBuffer
211 );
212
213#endif
UINT64 UINTN
#define IN
Definition: Base.h:279
RETURN_STATUS EFI_STATUS
Definition: UefiBaseType.h:29
VOID * EFI_EVENT
Definition: UefiBaseType.h:37
VOID * EFI_HANDLE
Definition: UefiBaseType.h:33
EFI_STATUS EFIAPI UhciDriverBindingStart(IN EFI_DRIVER_BINDING_PROTOCOL *This, IN EFI_HANDLE Controller, IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath)
Definition: Uhci.c:1609
EFI_STATUS EFIAPI UhciDriverBindingStop(IN EFI_DRIVER_BINDING_PROTOCOL *This, IN EFI_HANDLE Controller, IN UINTN NumberOfChildren, IN EFI_HANDLE *ChildHandleBuffer)
Definition: Uhci.c:1830
EFI_STATUS EFIAPI UhciDriverBindingSupported(IN EFI_DRIVER_BINDING_PROTOCOL *This, IN EFI_HANDLE Controller, IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath)
Definition: Uhci.c:1346