/** @file The definition for UHCI driver model and HC protocol routines. Copyright (c) 2004 - 2018, Intel Corporation. All rights reserved.
SPDX-License-Identifier: BSD-2-Clause-Patent **/ #ifndef _EFI_UHCI_H_ #define _EFI_UHCI_H_ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include typedef struct _USB_HC_DEV USB_HC_DEV; #include "UsbHcMem.h" #include "UhciQueue.h" #include "UhciReg.h" #include "UhciSched.h" #include "UhciDebug.h" #include "ComponentName.h" // // UHC timeout experience values // #define UHC_1_MICROSECOND 1 #define UHC_1_MILLISECOND (1000 * UHC_1_MICROSECOND) #define UHC_1_SECOND (1000 * UHC_1_MILLISECOND) // // UHCI register operation timeout, set by experience // #define UHC_GENERIC_TIMEOUT UHC_1_SECOND // // Wait for force global resume(FGR) complete, refers to // specification[UHCI11-2.1.1] // #define UHC_FORCE_GLOBAL_RESUME_STALL (20 * UHC_1_MILLISECOND) // // Wait for roothub port reset and recovery, reset stall // is set by experience, and recovery stall refers to // specification[UHCI11-2.1.1] // #define UHC_ROOT_PORT_RESET_STALL (50 * UHC_1_MILLISECOND) #define UHC_ROOT_PORT_RECOVERY_STALL (10 * UHC_1_MILLISECOND) // // Sync and Async transfer polling interval, set by experience, // and the unit of Async is 100us. // #define UHC_SYNC_POLL_INTERVAL (1 * UHC_1_MILLISECOND) #define UHC_ASYNC_POLL_INTERVAL EFI_TIMER_PERIOD_MILLISECONDS(1) // // UHC raises TPL to TPL_NOTIFY to serialize all its operations // to protect shared data structures. // #define UHCI_TPL TPL_NOTIFY #define USB_HC_DEV_SIGNATURE SIGNATURE_32 ('u', 'h', 'c', 'i') #pragma pack(1) typedef struct { UINT8 ProgInterface; UINT8 SubClassCode; UINT8 BaseCode; } USB_CLASSC; #pragma pack() #define UHC_FROM_USB2_HC_PROTO(This) CR(This, USB_HC_DEV, Usb2Hc, USB_HC_DEV_SIGNATURE) // // USB_HC_DEV support the UHCI hardware controller. It schedules // the asynchronous interrupt transfer with the same method as // EHCI: a reversed tree structure. For synchronous interrupt, // control and bulk transfer, it uses three static queue head to // schedule them. SyncIntQh is for interrupt transfer. LsCtrlQh is // for LOW speed control transfer, and FsCtrlBulkQh is for FULL // speed control or bulk transfer. This is because FULL speed contrl // or bulk transfer can reclaim the unused bandwidth. Some USB // device requires this bandwidth reclamation capability. // struct _USB_HC_DEV { UINT32 Signature; EFI_USB2_HC_PROTOCOL Usb2Hc; EFI_PCI_IO_PROTOCOL *PciIo; EFI_DEVICE_PATH_PROTOCOL *DevicePath; UINT64 OriginalPciAttributes; // // Schedule data structures // UINT32 *FrameBase; // the buffer pointed by this pointer is used to store pci bus address of the QH descriptor. UINT32 *FrameBaseHostAddr; // the buffer pointed by this pointer is used to store host memory address of the QH descriptor. UHCI_QH_SW *SyncIntQh; UHCI_QH_SW *CtrlQh; UHCI_QH_SW *BulkQh; // // Structures to maintain asynchronus interrupt transfers. // When asynchronous interrutp transfer is unlinked from // the frame list, the hardware may still hold a pointer // to it. To synchronize with hardware, its resoureces are // released in two steps using Recycle and RecycleWait. // Check the asynchronous interrupt management routines. // LIST_ENTRY AsyncIntList; EFI_EVENT AsyncIntMonitor; UHCI_ASYNC_REQUEST *Recycle; UHCI_ASYNC_REQUEST *RecycleWait; UINTN RootPorts; USBHC_MEM_POOL *MemPool; EFI_UNICODE_STRING_TABLE *CtrlNameTable; VOID *FrameMapping; // // ExitBootServicesEvent is used to stop the EHC DMA operation // after exit boot service. // EFI_EVENT ExitBootServiceEvent; }; extern EFI_DRIVER_BINDING_PROTOCOL gUhciDriverBinding; extern EFI_COMPONENT_NAME_PROTOCOL gUhciComponentName; extern EFI_COMPONENT_NAME2_PROTOCOL gUhciComponentName2; /** Test to see if this driver supports ControllerHandle. Any ControllerHandle that has UsbHcProtocol installed will be supported. @param This Protocol instance pointer. @param Controller Handle of device to test. @param RemainingDevicePath Not used. @return EFI_SUCCESS This driver supports this device. @return EFI_UNSUPPORTED This driver does not support this device. **/ EFI_STATUS EFIAPI UhciDriverBindingSupported ( IN EFI_DRIVER_BINDING_PROTOCOL *This, IN EFI_HANDLE Controller, IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath ); /** Starting the Usb UHCI Driver. @param This Protocol instance pointer. @param Controller Handle of device to test. @param RemainingDevicePath Not used. @retval EFI_SUCCESS This driver supports this device. @retval EFI_UNSUPPORTED This driver does not support this device. @retval EFI_DEVICE_ERROR This driver cannot be started due to device Error. EFI_OUT_OF_RESOURCES- Failed due to resource shortage. **/ EFI_STATUS EFIAPI UhciDriverBindingStart ( IN EFI_DRIVER_BINDING_PROTOCOL *This, IN EFI_HANDLE Controller, IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath ); /** Stop this driver on ControllerHandle. Support stopping any child handles created by this driver. @param This Protocol instance pointer. @param Controller Handle of device to stop driver on. @param NumberOfChildren Number of Children in the ChildHandleBuffer. @param ChildHandleBuffer List of handles for the children we need to stop. @return EFI_SUCCESS @return others **/ EFI_STATUS EFIAPI UhciDriverBindingStop ( IN EFI_DRIVER_BINDING_PROTOCOL *This, IN EFI_HANDLE Controller, IN UINTN NumberOfChildren, IN EFI_HANDLE *ChildHandleBuffer ); #endif