/** @file | |
Private Header file for Usb Host Controller PEIM | |
Copyright (c) 2006 - 2018, Intel Corporation. All rights reserved.<BR> | |
SPDX-License-Identifier: BSD-2-Clause-Patent | |
**/ | |
#ifndef _RECOVERY_UHC_H_ | |
#define _RECOVERY_UHC_H_ | |
#include <PiPei.h> | |
#include <Ppi/UsbController.h> | |
#include <Ppi/UsbHostController.h> | |
#include <Ppi/IoMmu.h> | |
#include <Ppi/EndOfPeiPhase.h> | |
#include <Library/DebugLib.h> | |
#include <Library/PeimEntryPoint.h> | |
#include <Library/PeiServicesLib.h> | |
#include <Library/BaseMemoryLib.h> | |
#include <Library/TimerLib.h> | |
#include <Library/IoLib.h> | |
#include <Library/PeiServicesLib.h> | |
#define USB_SLOW_SPEED_DEVICE 0x01 | |
#define USB_FULL_SPEED_DEVICE 0x02 | |
// | |
// One memory block uses 16 page | |
// | |
#define NORMAL_MEMORY_BLOCK_UNIT_IN_PAGES 16 | |
#define USBCMD 0 /* Command Register Offset 00-01h */ | |
#define USBCMD_RS BIT0 /* Run/Stop */ | |
#define USBCMD_HCRESET BIT1 /* Host reset */ | |
#define USBCMD_GRESET BIT2 /* Global reset */ | |
#define USBCMD_EGSM BIT3 /* Global Suspend Mode */ | |
#define USBCMD_FGR BIT4 /* Force Global Resume */ | |
#define USBCMD_SWDBG BIT5 /* SW Debug mode */ | |
#define USBCMD_CF BIT6 /* Config Flag (sw only) */ | |
#define USBCMD_MAXP BIT7 /* Max Packet (0 = 32, 1 = 64) */ | |
/* Status register */ | |
#define USBSTS 2 /* Status Register Offset 02-03h */ | |
#define USBSTS_USBINT BIT0 /* Interrupt due to IOC */ | |
#define USBSTS_ERROR BIT1 /* Interrupt due to error */ | |
#define USBSTS_RD BIT2 /* Resume Detect */ | |
#define USBSTS_HSE BIT3 /* Host System Error - basically PCI problems */ | |
#define USBSTS_HCPE BIT4 /* Host Controller Process Error - the scripts were buggy */ | |
#define USBSTS_HCH BIT5 /* HC Halted */ | |
/* Interrupt enable register */ | |
#define USBINTR 4 /* Interrupt Enable Register 04-05h */ | |
#define USBINTR_TIMEOUT BIT0 /* Timeout/CRC error enable */ | |
#define USBINTR_RESUME BIT1 /* Resume interrupt enable */ | |
#define USBINTR_IOC BIT2 /* Interrupt On Complete enable */ | |
#define USBINTR_SP BIT3 /* Short packet interrupt enable */ | |
/* Frame Number Register Offset 06-08h */ | |
#define USBFRNUM 6 | |
/* Frame List Base Address Register Offset 08-0Bh */ | |
#define USBFLBASEADD 8 | |
/* Start of Frame Modify Register Offset 0Ch */ | |
#define USBSOF 0x0c | |
/* USB port status and control registers */ | |
#define USBPORTSC1 0x10 /*Port 1 offset 10-11h */ | |
#define USBPORTSC2 0x12 /*Port 2 offset 12-13h */ | |
#define USBPORTSC_CCS BIT0 /* Current Connect Status ("device present") */ | |
#define USBPORTSC_CSC BIT1 /* Connect Status Change */ | |
#define USBPORTSC_PED BIT2 /* Port Enable / Disable */ | |
#define USBPORTSC_PEDC BIT3 /* Port Enable / Disable Change */ | |
#define USBPORTSC_LSL BIT4 /* Line Status Low bit*/ | |
#define USBPORTSC_LSH BIT5 /* Line Status High bit*/ | |
#define USBPORTSC_RD BIT6 /* Resume Detect */ | |
#define USBPORTSC_LSDA BIT8 /* Low Speed Device Attached */ | |
#define USBPORTSC_PR BIT9 /* Port Reset */ | |
#define USBPORTSC_SUSP BIT12 /* Suspend */ | |
#define SETUP_PACKET_ID 0x2D | |
#define INPUT_PACKET_ID 0x69 | |
#define OUTPUT_PACKET_ID 0xE1 | |
#define ERROR_PACKET_ID 0x55 | |
#define STALL_1_MICRO_SECOND 1 | |
#define STALL_1_MILLI_SECOND 1000 | |
#pragma pack(1) | |
typedef struct { | |
UINT32 FrameListPtrTerminate : 1; | |
UINT32 FrameListPtrQSelect : 1; | |
UINT32 FrameListRsvd : 2; | |
UINT32 FrameListPtr : 28; | |
} FRAMELIST_ENTRY; | |
typedef struct { | |
UINT32 QHHorizontalTerminate : 1; | |
UINT32 QHHorizontalQSelect : 1; | |
UINT32 QHHorizontalRsvd : 2; | |
UINT32 QHHorizontalPtr : 28; | |
UINT32 QHVerticalTerminate : 1; | |
UINT32 QHVerticalQSelect : 1; | |
UINT32 QHVerticalRsvd : 2; | |
UINT32 QHVerticalPtr : 28; | |
} QUEUE_HEAD; | |
typedef struct { | |
QUEUE_HEAD QueueHead; | |
UINT32 Reserved1; | |
UINT32 Reserved2; | |
VOID *PtrNext; | |
VOID *PtrDown; | |
VOID *Reserved3; | |
UINT32 Reserved4; | |
} QH_STRUCT; | |
typedef struct { | |
UINT32 TDLinkPtrTerminate : 1; | |
UINT32 TDLinkPtrQSelect : 1; | |
UINT32 TDLinkPtrDepthSelect : 1; | |
UINT32 TDLinkPtrRsvd : 1; | |
UINT32 TDLinkPtr : 28; | |
UINT32 TDStatusActualLength : 11; | |
UINT32 TDStatusRsvd : 5; | |
UINT32 TDStatus : 8; | |
UINT32 TDStatusIOC : 1; | |
UINT32 TDStatusIOS : 1; | |
UINT32 TDStatusLS : 1; | |
UINT32 TDStatusErr : 2; | |
UINT32 TDStatusSPD : 1; | |
UINT32 TDStatusRsvd2 : 2; | |
UINT32 TDTokenPID : 8; | |
UINT32 TDTokenDevAddr : 7; | |
UINT32 TDTokenEndPt : 4; | |
UINT32 TDTokenDataToggle : 1; | |
UINT32 TDTokenRsvd : 1; | |
UINT32 TDTokenMaxLen : 11; | |
UINT32 TDBufferPtr; | |
} TD; | |
typedef struct { | |
TD TDData; | |
UINT8 *PtrTDBuffer; | |
VOID *PtrNextTD; | |
VOID *PtrNextQH; | |
UINT16 TDBufferLength; | |
UINT16 Reserved; | |
} TD_STRUCT; | |
#pragma pack() | |
typedef struct _MEMORY_MANAGE_HEADER MEMORY_MANAGE_HEADER; | |
struct _MEMORY_MANAGE_HEADER { | |
UINT8 *BitArrayPtr; | |
UINTN BitArraySizeInBytes; | |
UINT8 *MemoryBlockPtr; | |
UINTN MemoryBlockSizeInBytes; | |
MEMORY_MANAGE_HEADER *Next; | |
}; | |
#define USB_UHC_DEV_SIGNATURE SIGNATURE_32 ('p', 'u', 'h', 'c') | |
typedef struct { | |
UINTN Signature; | |
PEI_USB_HOST_CONTROLLER_PPI UsbHostControllerPpi; | |
EDKII_IOMMU_PPI *IoMmu; | |
EFI_PEI_PPI_DESCRIPTOR PpiDescriptor; | |
// | |
// EndOfPei callback is used to stop the UHC DMA operation | |
// after exit PEI phase. | |
// | |
EFI_PEI_NOTIFY_DESCRIPTOR EndOfPeiNotifyList; | |
UINT32 UsbHostControllerBaseAddress; | |
FRAMELIST_ENTRY *FrameListEntry; | |
QH_STRUCT *ConfigQH; | |
QH_STRUCT *BulkQH; | |
// | |
// Header1 used for QH,TD memory blocks management | |
// | |
MEMORY_MANAGE_HEADER *Header1; | |
} USB_UHC_DEV; | |
#define PEI_RECOVERY_USB_UHC_DEV_FROM_UHCI_THIS(a) CR (a, USB_UHC_DEV, UsbHostControllerPpi, USB_UHC_DEV_SIGNATURE) | |
#define PEI_RECOVERY_USB_UHC_DEV_FROM_THIS_NOTIFY(a) CR (a, USB_UHC_DEV, EndOfPeiNotifyList, USB_UHC_DEV_SIGNATURE) | |
/** | |
Submits control transfer to a target USB device. | |
@param PeiServices The pointer of EFI_PEI_SERVICES. | |
@param This The pointer of PEI_USB_HOST_CONTROLLER_PPI. | |
@param DeviceAddress The target device address. | |
@param DeviceSpeed Target device speed. | |
@param MaximumPacketLength Maximum packet size the default control transfer | |
endpoint is capable of sending or receiving. | |
@param Request USB device request to send. | |
@param TransferDirection Specifies the data direction for the data stage. | |
@param Data Data buffer to be transmitted or received from USB device. | |
@param DataLength The size (in bytes) of the data buffer. | |
@param TimeOut Indicates the maximum timeout, in millisecond. | |
@param TransferResult Return the result of this control transfer. | |
@retval EFI_SUCCESS Transfer was completed successfully. | |
@retval EFI_OUT_OF_RESOURCES The transfer failed due to lack of resources. | |
@retval EFI_INVALID_PARAMETER Some parameters are invalid. | |
@retval EFI_TIMEOUT Transfer failed due to timeout. | |
@retval EFI_DEVICE_ERROR Transfer failed due to host controller or device error. | |
**/ | |
EFI_STATUS | |
EFIAPI | |
UhcControlTransfer ( | |
IN EFI_PEI_SERVICES **PeiServices, | |
IN PEI_USB_HOST_CONTROLLER_PPI *This, | |
IN UINT8 DeviceAddress, | |
IN UINT8 DeviceSpeed, | |
IN UINT8 MaximumPacketLength, | |
IN EFI_USB_DEVICE_REQUEST *Request, | |
IN EFI_USB_DATA_DIRECTION TransferDirection, | |
IN OUT VOID *Data OPTIONAL, | |
IN OUT UINTN *DataLength OPTIONAL, | |
IN UINTN TimeOut, | |
OUT UINT32 *TransferResult | |
); | |
/** | |
Submits bulk transfer to a bulk endpoint of a USB device. | |
@param PeiServices The pointer of EFI_PEI_SERVICES. | |
@param This The pointer of PEI_USB_HOST_CONTROLLER_PPI. | |
@param DeviceAddress Target device address. | |
@param EndPointAddress Endpoint number and its direction in bit 7. | |
@param MaximumPacketLength Maximum packet size the endpoint is capable of | |
sending or receiving. | |
@param Data Array of pointers to the buffers of data to transmit | |
from or receive into. | |
@param DataLength The lenght of the data buffer. | |
@param DataToggle On input, the initial data toggle for the transfer; | |
On output, it is updated to to next data toggle to use of | |
the subsequent bulk transfer. | |
@param TimeOut Indicates the maximum time, in millisecond, which the | |
transfer is allowed to complete. | |
@param TransferResult A pointer to the detailed result information of the | |
bulk transfer. | |
@retval EFI_SUCCESS The transfer was completed successfully. | |
@retval EFI_OUT_OF_RESOURCES The transfer failed due to lack of resource. | |
@retval EFI_INVALID_PARAMETER Parameters are invalid. | |
@retval EFI_TIMEOUT The transfer failed due to timeout. | |
@retval EFI_DEVICE_ERROR The transfer failed due to host controller error. | |
**/ | |
EFI_STATUS | |
EFIAPI | |
UhcBulkTransfer ( | |
IN EFI_PEI_SERVICES **PeiServices, | |
IN PEI_USB_HOST_CONTROLLER_PPI *This, | |
IN UINT8 DeviceAddress, | |
IN UINT8 EndPointAddress, | |
IN UINT8 MaximumPacketLength, | |
IN OUT VOID *Data, | |
IN OUT UINTN *DataLength, | |
IN OUT UINT8 *DataToggle, | |
IN UINTN TimeOut, | |
OUT UINT32 *TransferResult | |
); | |
/** | |
Retrieves the number of root hub ports. | |
@param[in] PeiServices The pointer to the PEI Services Table. | |
@param[in] This The pointer to this instance of the | |
PEI_USB_HOST_CONTROLLER_PPI. | |
@param[out] PortNumber The pointer to the number of the root hub ports. | |
@retval EFI_SUCCESS The port number was retrieved successfully. | |
@retval EFI_INVALID_PARAMETER PortNumber is NULL. | |
**/ | |
EFI_STATUS | |
EFIAPI | |
UhcGetRootHubPortNumber ( | |
IN EFI_PEI_SERVICES **PeiServices, | |
IN PEI_USB_HOST_CONTROLLER_PPI *This, | |
OUT UINT8 *PortNumber | |
); | |
/** | |
Retrieves the current status of a USB root hub port. | |
@param PeiServices The pointer of EFI_PEI_SERVICES. | |
@param This The pointer of PEI_USB_HOST_CONTROLLER_PPI. | |
@param PortNumber The root hub port to retrieve the state from. | |
@param PortStatus Variable to receive the port state. | |
@retval EFI_SUCCESS The status of the USB root hub port specified. | |
by PortNumber was returned in PortStatus. | |
@retval EFI_INVALID_PARAMETER PortNumber is invalid. | |
**/ | |
EFI_STATUS | |
EFIAPI | |
UhcGetRootHubPortStatus ( | |
IN EFI_PEI_SERVICES **PeiServices, | |
IN PEI_USB_HOST_CONTROLLER_PPI *This, | |
IN UINT8 PortNumber, | |
OUT EFI_USB_PORT_STATUS *PortStatus | |
); | |
/** | |
Sets a feature for the specified root hub port. | |
@param PeiServices The pointer of EFI_PEI_SERVICES | |
@param This The pointer of PEI_USB_HOST_CONTROLLER_PPI | |
@param PortNumber Root hub port to set. | |
@param PortFeature Feature to set. | |
@retval EFI_SUCCESS The feature specified by PortFeature was set. | |
@retval EFI_INVALID_PARAMETER PortNumber is invalid or PortFeature is invalid. | |
@retval EFI_TIMEOUT The time out occurred. | |
**/ | |
EFI_STATUS | |
EFIAPI | |
UhcSetRootHubPortFeature ( | |
IN EFI_PEI_SERVICES **PeiServices, | |
IN PEI_USB_HOST_CONTROLLER_PPI *This, | |
IN UINT8 PortNumber, | |
IN EFI_USB_PORT_FEATURE PortFeature | |
); | |
/** | |
Clears a feature for the specified root hub port. | |
@param PeiServices The pointer of EFI_PEI_SERVICES. | |
@param This The pointer of PEI_USB_HOST_CONTROLLER_PPI. | |
@param PortNumber Specifies the root hub port whose feature | |
is requested to be cleared. | |
@param PortFeature Indicates the feature selector associated with the | |
feature clear request. | |
@retval EFI_SUCCESS The feature specified by PortFeature was cleared | |
for the USB root hub port specified by PortNumber. | |
@retval EFI_INVALID_PARAMETER PortNumber is invalid or PortFeature is invalid. | |
**/ | |
EFI_STATUS | |
EFIAPI | |
UhcClearRootHubPortFeature ( | |
IN EFI_PEI_SERVICES **PeiServices, | |
IN PEI_USB_HOST_CONTROLLER_PPI *This, | |
IN UINT8 PortNumber, | |
IN EFI_USB_PORT_FEATURE PortFeature | |
); | |
/** | |
Initialize UHCI. | |
@param UhcDev UHCI Device. | |
@retval EFI_SUCCESS UHCI successfully initialized. | |
@retval EFI_OUT_OF_RESOURCES Resource can not be allocated. | |
**/ | |
EFI_STATUS | |
InitializeUsbHC ( | |
IN USB_UHC_DEV *UhcDev | |
); | |
/** | |
Create Frame List Structure. | |
@param UhcDev UHCI device. | |
@retval EFI_OUT_OF_RESOURCES Can't allocate memory resources. | |
@retval EFI_SUCCESS Success. | |
**/ | |
EFI_STATUS | |
CreateFrameList ( | |
USB_UHC_DEV *UhcDev | |
); | |
/** | |
Read a 16bit width data from Uhc HC IO space register. | |
@param UhcDev The UHCI device. | |
@param Port The IO space address of the register. | |
@retval the register content read. | |
**/ | |
UINT16 | |
USBReadPortW ( | |
IN USB_UHC_DEV *UhcDev, | |
IN UINT32 Port | |
); | |
/** | |
Write a 16bit width data into Uhc HC IO space register. | |
@param UhcDev The UHCI device. | |
@param Port The IO space address of the register. | |
@param Data The data written into the register. | |
**/ | |
VOID | |
USBWritePortW ( | |
IN USB_UHC_DEV *UhcDev, | |
IN UINT32 Port, | |
IN UINT16 Data | |
); | |
/** | |
Write a 32bit width data into Uhc HC IO space register. | |
@param UhcDev The UHCI device. | |
@param Port The IO space address of the register. | |
@param Data The data written into the register. | |
**/ | |
VOID | |
USBWritePortDW ( | |
IN USB_UHC_DEV *UhcDev, | |
IN UINT32 Port, | |
IN UINT32 Data | |
); | |
/** | |
Clear the content of UHCI's Status Register. | |
@param UhcDev The UHCI device. | |
@param StatusAddr The IO space address of the register. | |
**/ | |
VOID | |
ClearStatusReg ( | |
IN USB_UHC_DEV *UhcDev, | |
IN UINT32 StatusAddr | |
); | |
/** | |
Check whether the host controller operates well. | |
@param UhcDev The UHCI device. | |
@param StatusRegAddr The io address of status register. | |
@retval TRUE Host controller is working. | |
@retval FALSE Host controller is halted or system error. | |
**/ | |
BOOLEAN | |
IsStatusOK ( | |
IN USB_UHC_DEV *UhcDev, | |
IN UINT32 StatusRegAddr | |
); | |
/** | |
Set Frame List Base Address. | |
@param UhcDev The UHCI device. | |
@param FrameListRegAddr The address of frame list register. | |
@param Addr The address of frame list table. | |
**/ | |
VOID | |
SetFrameListBaseAddress ( | |
IN USB_UHC_DEV *UhcDev, | |
IN UINT32 FrameListRegAddr, | |
IN UINT32 Addr | |
); | |
/** | |
Create QH and initialize. | |
@param UhcDev The UHCI device. | |
@param PtrQH Place to store QH_STRUCT pointer. | |
@retval EFI_OUT_OF_RESOURCES Can't allocate memory resources. | |
@retval EFI_SUCCESS Success. | |
**/ | |
EFI_STATUS | |
CreateQH ( | |
IN USB_UHC_DEV *UhcDev, | |
OUT QH_STRUCT **PtrQH | |
); | |
/** | |
Set the horizontal link pointer in QH. | |
@param PtrQH Place to store QH_STRUCT pointer. | |
@param PtrNext Place to the next QH_STRUCT. | |
**/ | |
VOID | |
SetQHHorizontalLinkPtr ( | |
IN QH_STRUCT *PtrQH, | |
IN VOID *PtrNext | |
); | |
/** | |
Set a QH or TD horizontally to be connected with a specific QH. | |
@param PtrQH Place to store QH_STRUCT pointer. | |
@param IsQH Specify QH or TD is connected. | |
**/ | |
VOID | |
SetQHHorizontalQHorTDSelect ( | |
IN QH_STRUCT *PtrQH, | |
IN BOOLEAN IsQH | |
); | |
/** | |
Set the horizontal validor bit in QH. | |
@param PtrQH Place to store QH_STRUCT pointer. | |
@param IsValid Specify the horizontal linker is valid or not. | |
**/ | |
VOID | |
SetQHHorizontalValidorInvalid ( | |
IN QH_STRUCT *PtrQH, | |
IN BOOLEAN IsValid | |
); | |
/** | |
Set the vertical link pointer in QH. | |
@param PtrQH Place to store QH_STRUCT pointer. | |
@param PtrNext Place to the next QH_STRUCT. | |
**/ | |
VOID | |
SetQHVerticalLinkPtr ( | |
IN QH_STRUCT *PtrQH, | |
IN VOID *PtrNext | |
); | |
/** | |
Set a QH or TD vertically to be connected with a specific QH. | |
@param PtrQH Place to store QH_STRUCT pointer. | |
@param IsQH Specify QH or TD is connected. | |
**/ | |
VOID | |
SetQHVerticalQHorTDSelect ( | |
IN QH_STRUCT *PtrQH, | |
IN BOOLEAN IsQH | |
); | |
/** | |
Set the vertical validor bit in QH. | |
@param PtrQH Place to store QH_STRUCT pointer. | |
@param IsValid Specify the vertical linker is valid or not. | |
**/ | |
VOID | |
SetQHVerticalValidorInvalid ( | |
IN QH_STRUCT *PtrQH, | |
IN BOOLEAN IsValid | |
); | |
/** | |
Allocate TD or QH Struct. | |
@param UhcDev The UHCI device. | |
@param Size The size of allocation. | |
@param PtrStruct Place to store TD_STRUCT pointer. | |
@return EFI_SUCCESS Allocate successfully. | |
@retval EFI_OUT_OF_RESOURCES Can't allocate memory resource. | |
**/ | |
EFI_STATUS | |
AllocateTDorQHStruct ( | |
IN USB_UHC_DEV *UhcDev, | |
IN UINT32 Size, | |
OUT VOID **PtrStruct | |
); | |
/** | |
Create a TD Struct. | |
@param UhcDev The UHCI device. | |
@param PtrTD Place to store TD_STRUCT pointer. | |
@return EFI_SUCCESS Allocate successfully. | |
@retval EFI_OUT_OF_RESOURCES Can't allocate memory resource. | |
**/ | |
EFI_STATUS | |
CreateTD ( | |
IN USB_UHC_DEV *UhcDev, | |
OUT TD_STRUCT **PtrTD | |
); | |
/** | |
Generate Setup Stage TD. | |
@param UhcDev The UHCI device. | |
@param DevAddr Device address. | |
@param Endpoint Endpoint number. | |
@param DeviceSpeed Device Speed. | |
@param DevRequest CPU memory address of request structure buffer to transfer. | |
@param RequestPhy PCI memory address of request structure buffer to transfer. | |
@param RequestLen Request length. | |
@param PtrTD TD_STRUCT generated. | |
@return EFI_SUCCESS Generate setup stage TD successfully. | |
@retval EFI_OUT_OF_RESOURCES Can't allocate memory resource. | |
**/ | |
EFI_STATUS | |
GenSetupStageTD ( | |
IN USB_UHC_DEV *UhcDev, | |
IN UINT8 DevAddr, | |
IN UINT8 Endpoint, | |
IN UINT8 DeviceSpeed, | |
IN UINT8 *DevRequest, | |
IN UINT8 *RequestPhy, | |
IN UINT8 RequestLen, | |
OUT TD_STRUCT **PtrTD | |
); | |
/** | |
Generate Data Stage TD. | |
@param UhcDev The UHCI device. | |
@param DevAddr Device address. | |
@param Endpoint Endpoint number. | |
@param PtrData CPU memory address of user data buffer to transfer. | |
@param DataPhy PCI memory address of user data buffer to transfer. | |
@param Len Data length. | |
@param PktID PacketID. | |
@param Toggle Data toggle value. | |
@param DeviceSpeed Device Speed. | |
@param PtrTD TD_STRUCT generated. | |
@return EFI_SUCCESS Generate data stage TD successfully. | |
@retval EFI_OUT_OF_RESOURCES Can't allocate memory resource. | |
**/ | |
EFI_STATUS | |
GenDataTD ( | |
IN USB_UHC_DEV *UhcDev, | |
IN UINT8 DevAddr, | |
IN UINT8 Endpoint, | |
IN UINT8 *PtrData, | |
IN UINT8 *DataPhy, | |
IN UINT8 Len, | |
IN UINT8 PktID, | |
IN UINT8 Toggle, | |
IN UINT8 DeviceSpeed, | |
OUT TD_STRUCT **PtrTD | |
); | |
/** | |
Generate Status Stage TD. | |
@param UhcDev The UHCI device. | |
@param DevAddr Device address. | |
@param Endpoint Endpoint number. | |
@param PktID PacketID. | |
@param DeviceSpeed Device Speed. | |
@param PtrTD TD_STRUCT generated. | |
@return EFI_SUCCESS Generate status stage TD successfully. | |
@retval EFI_OUT_OF_RESOURCES Can't allocate memory resource. | |
**/ | |
EFI_STATUS | |
CreateStatusTD ( | |
IN USB_UHC_DEV *UhcDev, | |
IN UINT8 DevAddr, | |
IN UINT8 Endpoint, | |
IN UINT8 PktID, | |
IN UINT8 DeviceSpeed, | |
OUT TD_STRUCT **PtrTD | |
); | |
/** | |
Set the link pointer validor bit in TD. | |
@param PtrTDStruct Place to store TD_STRUCT pointer. | |
@param IsValid Specify the linker pointer is valid or not. | |
**/ | |
VOID | |
SetTDLinkPtrValidorInvalid ( | |
IN TD_STRUCT *PtrTDStruct, | |
IN BOOLEAN IsValid | |
); | |
/** | |
Set the Link Pointer pointing to a QH or TD. | |
@param PtrTDStruct Place to store TD_STRUCT pointer. | |
@param IsQH Specify QH or TD is connected. | |
**/ | |
VOID | |
SetTDLinkPtrQHorTDSelect ( | |
IN TD_STRUCT *PtrTDStruct, | |
IN BOOLEAN IsQH | |
); | |
/** | |
Set the traverse is depth-first or breadth-first. | |
@param PtrTDStruct Place to store TD_STRUCT pointer. | |
@param IsDepth Specify the traverse is depth-first or breadth-first. | |
**/ | |
VOID | |
SetTDLinkPtrDepthorBreadth ( | |
IN TD_STRUCT *PtrTDStruct, | |
IN BOOLEAN IsDepth | |
); | |
/** | |
Set TD Link Pointer in TD. | |
@param PtrTDStruct Place to store TD_STRUCT pointer. | |
@param PtrNext Place to the next TD_STRUCT. | |
**/ | |
VOID | |
SetTDLinkPtr ( | |
IN TD_STRUCT *PtrTDStruct, | |
IN VOID *PtrNext | |
); | |
/** | |
Get TD Link Pointer. | |
@param PtrTDStruct Place to store TD_STRUCT pointer. | |
@retval Get TD Link Pointer in TD. | |
**/ | |
VOID * | |
GetTDLinkPtr ( | |
IN TD_STRUCT *PtrTDStruct | |
); | |
/** | |
Enable/Disable short packet detection mechanism. | |
@param PtrTDStruct Place to store TD_STRUCT pointer. | |
@param IsEnable Enable or disable short packet detection mechanism. | |
**/ | |
VOID | |
EnableorDisableTDShortPacket ( | |
IN TD_STRUCT *PtrTDStruct, | |
IN BOOLEAN IsEnable | |
); | |
/** | |
Set the max error counter in TD. | |
@param PtrTDStruct Place to store TD_STRUCT pointer. | |
@param MaxErrors The number of allowable error. | |
**/ | |
VOID | |
SetTDControlErrorCounter ( | |
IN TD_STRUCT *PtrTDStruct, | |
IN UINT8 MaxErrors | |
); | |
/** | |
Set the TD is targeting a low-speed device or not. | |
@param PtrTDStruct Place to store TD_STRUCT pointer. | |
@param IsLowSpeedDevice Whether The device is low-speed. | |
**/ | |
VOID | |
SetTDLoworFullSpeedDevice ( | |
IN TD_STRUCT *PtrTDStruct, | |
IN BOOLEAN IsLowSpeedDevice | |
); | |
/** | |
Set the TD is isochronous transfer type or not. | |
@param PtrTDStruct Place to store TD_STRUCT pointer. | |
@param IsIsochronous Whether the transaction isochronous transfer type. | |
**/ | |
VOID | |
SetTDControlIsochronousorNot ( | |
IN TD_STRUCT *PtrTDStruct, | |
IN BOOLEAN IsIsochronous | |
); | |
/** | |
Set if UCHI should issue an interrupt on completion of the frame | |
in which this TD is executed | |
@param PtrTDStruct Place to store TD_STRUCT pointer. | |
@param IsSet Whether HC should issue an interrupt on completion. | |
**/ | |
VOID | |
SetorClearTDControlIOC ( | |
IN TD_STRUCT *PtrTDStruct, | |
IN BOOLEAN IsSet | |
); | |
/** | |
Set if the TD is active and can be executed. | |
@param PtrTDStruct Place to store TD_STRUCT pointer. | |
@param IsActive Whether the TD is active and can be executed. | |
**/ | |
VOID | |
SetTDStatusActiveorInactive ( | |
IN TD_STRUCT *PtrTDStruct, | |
IN BOOLEAN IsActive | |
); | |
/** | |
Specifies the maximum number of data bytes allowed for the transfer. | |
@param PtrTDStruct Place to store TD_STRUCT pointer. | |
@param MaxLen The maximum number of data bytes allowed. | |
@retval The allowed maximum number of data. | |
**/ | |
UINT16 | |
SetTDTokenMaxLength ( | |
IN TD_STRUCT *PtrTDStruct, | |
IN UINT16 MaxLen | |
); | |
/** | |
Set the data toggle bit to DATA1. | |
@param PtrTDStruct Place to store TD_STRUCT pointer. | |
**/ | |
VOID | |
SetTDTokenDataToggle1 ( | |
IN TD_STRUCT *PtrTDStruct | |
); | |
/** | |
Set the data toggle bit to DATA0. | |
@param PtrTDStruct Place to store TD_STRUCT pointer. | |
**/ | |
VOID | |
SetTDTokenDataToggle0 ( | |
IN TD_STRUCT *PtrTDStruct | |
); | |
/** | |
Set EndPoint Number the TD is targeting at. | |
@param PtrTDStruct Place to store TD_STRUCT pointer. | |
@param EndPoint The Endport number of the target. | |
**/ | |
VOID | |
SetTDTokenEndPoint ( | |
IN TD_STRUCT *PtrTDStruct, | |
IN UINTN EndPoint | |
); | |
/** | |
Set Device Address the TD is targeting at. | |
@param PtrTDStruct Place to store TD_STRUCT pointer. | |
@param DevAddr The Device Address of the target. | |
**/ | |
VOID | |
SetTDTokenDeviceAddress ( | |
IN TD_STRUCT *PtrTDStruct, | |
IN UINTN DevAddr | |
); | |
/** | |
Set Packet Identification the TD is targeting at. | |
@param PtrTDStruct Place to store TD_STRUCT pointer. | |
@param PacketID The Packet Identification of the target. | |
**/ | |
VOID | |
SetTDTokenPacketID ( | |
IN TD_STRUCT *PtrTDStruct, | |
IN UINT8 PacketID | |
); | |
/** | |
Set the beginning address of the data buffer that will be used | |
during the transaction. | |
@param PtrTDStruct Place to store TD_STRUCT pointer. | |
**/ | |
VOID | |
SetTDDataBuffer ( | |
IN TD_STRUCT *PtrTDStruct | |
); | |
/** | |
Detect whether the TD is active. | |
@param PtrTDStruct Place to store TD_STRUCT pointer. | |
@retval The TD is active or not. | |
**/ | |
BOOLEAN | |
IsTDStatusActive ( | |
IN TD_STRUCT *PtrTDStruct | |
); | |
/** | |
Detect whether the TD is stalled. | |
@param PtrTDStruct Place to store TD_STRUCT pointer. | |
@retval The TD is stalled or not. | |
**/ | |
BOOLEAN | |
IsTDStatusStalled ( | |
IN TD_STRUCT *PtrTDStruct | |
); | |
/** | |
Detect whether Data Buffer Error is happened. | |
@param PtrTDStruct Place to store TD_STRUCT pointer. | |
@retval The Data Buffer Error is happened or not. | |
**/ | |
BOOLEAN | |
IsTDStatusBufferError ( | |
IN TD_STRUCT *PtrTDStruct | |
); | |
/** | |
Detect whether Babble Error is happened. | |
@param PtrTDStruct Place to store TD_STRUCT pointer. | |
@retval The Babble Error is happened or not. | |
**/ | |
BOOLEAN | |
IsTDStatusBabbleError ( | |
IN TD_STRUCT *PtrTDStruct | |
); | |
/** | |
Detect whether NAK is received. | |
@param PtrTDStruct Place to store TD_STRUCT pointer. | |
@retval The NAK is received or not. | |
**/ | |
BOOLEAN | |
IsTDStatusNAKReceived ( | |
IN TD_STRUCT *PtrTDStruct | |
); | |
/** | |
Detect whether CRC/Time Out Error is encountered. | |
@param PtrTDStruct Place to store TD_STRUCT pointer. | |
@retval The CRC/Time Out Error is encountered or not. | |
**/ | |
BOOLEAN | |
IsTDStatusCRCTimeOutError ( | |
IN TD_STRUCT *PtrTDStruct | |
); | |
/** | |
Detect whether Bitstuff Error is received. | |
@param PtrTDStruct Place to store TD_STRUCT pointer. | |
@retval The Bitstuff Error is received or not. | |
**/ | |
BOOLEAN | |
IsTDStatusBitStuffError ( | |
IN TD_STRUCT *PtrTDStruct | |
); | |
/** | |
Retrieve the actual number of bytes that were tansferred. | |
@param PtrTDStruct Place to store TD_STRUCT pointer. | |
@retval The actual number of bytes that were tansferred. | |
**/ | |
UINT16 | |
GetTDStatusActualLength ( | |
IN TD_STRUCT *PtrTDStruct | |
); | |
/** | |
Retrieve the information of whether the Link Pointer field is valid or not. | |
@param PtrTDStruct Place to store TD_STRUCT pointer. | |
@retval The linker pointer field is valid or not. | |
**/ | |
BOOLEAN | |
GetTDLinkPtrValidorInvalid ( | |
IN TD_STRUCT *PtrTDStruct | |
); | |
/** | |
Count TD Number from PtrFirstTD. | |
@param PtrFirstTD Place to store TD_STRUCT pointer. | |
@retval The queued TDs number. | |
**/ | |
UINTN | |
CountTDsNumber ( | |
IN TD_STRUCT *PtrFirstTD | |
); | |
/** | |
Link TD To QH. | |
@param PtrQH Place to store QH_STRUCT pointer. | |
@param PtrTD Place to store TD_STRUCT pointer. | |
**/ | |
VOID | |
LinkTDToQH ( | |
IN QH_STRUCT *PtrQH, | |
IN TD_STRUCT *PtrTD | |
); | |
/** | |
Link TD To TD. | |
@param PtrPreTD Place to store TD_STRUCT pointer. | |
@param PtrTD Place to store TD_STRUCT pointer. | |
**/ | |
VOID | |
LinkTDToTD ( | |
IN TD_STRUCT *PtrPreTD, | |
IN TD_STRUCT *PtrTD | |
); | |
/** | |
Execute Control Transfer. | |
@param UhcDev The UCHI device. | |
@param PtrTD A pointer to TD_STRUCT data. | |
@param ActualLen Actual transfer Length. | |
@param TimeOut TimeOut value. | |
@param TransferResult Transfer Result. | |
@return EFI_DEVICE_ERROR The transfer failed due to transfer error. | |
@return EFI_TIMEOUT The transfer failed due to time out. | |
@return EFI_SUCCESS The transfer finished OK. | |
**/ | |
EFI_STATUS | |
ExecuteControlTransfer ( | |
IN USB_UHC_DEV *UhcDev, | |
IN TD_STRUCT *PtrTD, | |
OUT UINTN *ActualLen, | |
IN UINTN TimeOut, | |
OUT UINT32 *TransferResult | |
); | |
/** | |
Execute Bulk Transfer. | |
@param UhcDev The UCHI device. | |
@param PtrTD A pointer to TD_STRUCT data. | |
@param ActualLen Actual transfer Length. | |
@param DataToggle DataToggle value. | |
@param TimeOut TimeOut value. | |
@param TransferResult Transfer Result. | |
@return EFI_DEVICE_ERROR The transfer failed due to transfer error. | |
@return EFI_TIMEOUT The transfer failed due to time out. | |
@return EFI_SUCCESS The transfer finished OK. | |
**/ | |
EFI_STATUS | |
ExecBulkTransfer ( | |
IN USB_UHC_DEV *UhcDev, | |
IN TD_STRUCT *PtrTD, | |
IN OUT UINTN *ActualLen, | |
IN UINT8 *DataToggle, | |
IN UINTN TimeOut, | |
OUT UINT32 *TransferResult | |
); | |
/** | |
Delete Queued TDs. | |
@param UhcDev The UCHI device. | |
@param PtrFirstTD Place to store TD_STRUCT pointer. | |
**/ | |
VOID | |
DeleteQueuedTDs ( | |
IN USB_UHC_DEV *UhcDev, | |
IN TD_STRUCT *PtrFirstTD | |
); | |
/** | |
Check TDs Results. | |
@param PtrTD A pointer to TD_STRUCT data. | |
@param Result The result to return. | |
@param ErrTDPos The Error TD position. | |
@param ActualTransferSize Actual transfer size. | |
@retval The TD is executed successfully or not. | |
**/ | |
BOOLEAN | |
CheckTDsResults ( | |
IN TD_STRUCT *PtrTD, | |
OUT UINT32 *Result, | |
OUT UINTN *ErrTDPos, | |
OUT UINTN *ActualTransferSize | |
); | |
/** | |
Create Memory Block. | |
@param UhcDev The UCHI device. | |
@param MemoryHeader The Pointer to allocated memory block. | |
@param MemoryBlockSizeInPages The page size of memory block to be allocated. | |
@retval EFI_OUT_OF_RESOURCES Can't allocate memory resources. | |
@retval EFI_SUCCESS Success. | |
**/ | |
EFI_STATUS | |
CreateMemoryBlock ( | |
IN USB_UHC_DEV *UhcDev, | |
OUT MEMORY_MANAGE_HEADER **MemoryHeader, | |
IN UINTN MemoryBlockSizeInPages | |
); | |
/** | |
Initialize UHCI memory management. | |
@param UhcDev The UCHI device. | |
@retval EFI_OUT_OF_RESOURCES Can't allocate memory resources. | |
@retval EFI_SUCCESS Success. | |
**/ | |
EFI_STATUS | |
InitializeMemoryManagement ( | |
IN USB_UHC_DEV *UhcDev | |
); | |
/** | |
Initialize UHCI memory management. | |
@param UhcDev The UCHI device. | |
@param Pool Buffer pointer to store the buffer pointer. | |
@param AllocSize The size of the pool to be allocated. | |
@retval EFI_OUT_OF_RESOURCES Can't allocate memory resources. | |
@retval EFI_SUCCESS Success. | |
**/ | |
EFI_STATUS | |
UhcAllocatePool ( | |
IN USB_UHC_DEV *UhcDev, | |
OUT UINT8 **Pool, | |
IN UINTN AllocSize | |
); | |
/** | |
Alloc Memory In MemoryBlock. | |
@param MemoryHeader The pointer to memory manage header. | |
@param Pool Buffer pointer to store the buffer pointer. | |
@param NumberOfMemoryUnit The size of the pool to be allocated. | |
@retval EFI_OUT_OF_RESOURCES Can't allocate memory resources. | |
@retval EFI_SUCCESS Success. | |
**/ | |
EFI_STATUS | |
AllocMemInMemoryBlock ( | |
IN MEMORY_MANAGE_HEADER *MemoryHeader, | |
OUT VOID **Pool, | |
IN UINTN NumberOfMemoryUnit | |
); | |
/** | |
Uhci Free Pool. | |
@param UhcDev The UHCI device. | |
@param Pool A pointer to store the buffer address. | |
@param AllocSize The size of the pool to be freed. | |
**/ | |
VOID | |
UhcFreePool ( | |
IN USB_UHC_DEV *UhcDev, | |
IN UINT8 *Pool, | |
IN UINTN AllocSize | |
); | |
/** | |
Insert a new memory header into list. | |
@param MemoryHeader A pointer to the memory header list. | |
@param NewMemoryHeader A new memory header to be inserted into the list. | |
**/ | |
VOID | |
InsertMemoryHeaderToList ( | |
IN MEMORY_MANAGE_HEADER *MemoryHeader, | |
IN MEMORY_MANAGE_HEADER *NewMemoryHeader | |
); | |
/** | |
Map address of request structure buffer. | |
@param Uhc The UHCI device. | |
@param Request The user request buffer. | |
@param MappedAddr Mapped address of request. | |
@param Map Identificaion of this mapping to return. | |
@return EFI_SUCCESS Success. | |
@return EFI_DEVICE_ERROR Fail to map the user request. | |
**/ | |
EFI_STATUS | |
UhciMapUserRequest ( | |
IN USB_UHC_DEV *Uhc, | |
IN OUT VOID *Request, | |
OUT UINT8 **MappedAddr, | |
OUT VOID **Map | |
); | |
/** | |
Map address of user data buffer. | |
@param Uhc The UHCI device. | |
@param Direction Direction of the data transfer. | |
@param Data The user data buffer. | |
@param Len Length of the user data. | |
@param PktId Packet identificaion. | |
@param MappedAddr Mapped address to return. | |
@param Map Identificaion of this mapping to return. | |
@return EFI_SUCCESS Success. | |
@return EFI_DEVICE_ERROR Fail to map the user data. | |
**/ | |
EFI_STATUS | |
UhciMapUserData ( | |
IN USB_UHC_DEV *Uhc, | |
IN EFI_USB_DATA_DIRECTION Direction, | |
IN VOID *Data, | |
IN OUT UINTN *Len, | |
OUT UINT8 *PktId, | |
OUT UINT8 **MappedAddr, | |
OUT VOID **Map | |
); | |
/** | |
Provides the controller-specific addresses required to access system memory from a | |
DMA bus master. | |
@param IoMmu Pointer to IOMMU PPI. | |
@param Operation Indicates if the bus master is going to read or write to system memory. | |
@param HostAddress The system memory address to map to the PCI controller. | |
@param NumberOfBytes On input the number of bytes to map. On output the number of bytes | |
that were mapped. | |
@param DeviceAddress The resulting map address for the bus master PCI controller to use to | |
access the hosts HostAddress. | |
@param Mapping A resulting value to pass to Unmap(). | |
@retval EFI_SUCCESS The range was mapped for the returned NumberOfBytes. | |
@retval EFI_UNSUPPORTED The HostAddress cannot be mapped as a common buffer. | |
@retval EFI_INVALID_PARAMETER One or more parameters are invalid. | |
@retval EFI_OUT_OF_RESOURCES The request could not be completed due to a lack of resources. | |
@retval EFI_DEVICE_ERROR The system hardware could not map the requested address. | |
**/ | |
EFI_STATUS | |
IoMmuMap ( | |
IN EDKII_IOMMU_PPI *IoMmu, | |
IN EDKII_IOMMU_OPERATION Operation, | |
IN VOID *HostAddress, | |
IN OUT UINTN *NumberOfBytes, | |
OUT EFI_PHYSICAL_ADDRESS *DeviceAddress, | |
OUT VOID **Mapping | |
); | |
/** | |
Completes the Map() operation and releases any corresponding resources. | |
@param IoMmu Pointer to IOMMU PPI. | |
@param Mapping The mapping value returned from Map(). | |
**/ | |
VOID | |
IoMmuUnmap ( | |
IN EDKII_IOMMU_PPI *IoMmu, | |
IN VOID *Mapping | |
); | |
/** | |
Allocates pages that are suitable for an OperationBusMasterCommonBuffer or | |
OperationBusMasterCommonBuffer64 mapping. | |
@param IoMmu Pointer to IOMMU PPI. | |
@param Pages The number of pages to allocate. | |
@param HostAddress A pointer to store the base system memory address of the | |
allocated range. | |
@param DeviceAddress The resulting map address for the bus master PCI controller to use to | |
access the hosts HostAddress. | |
@param Mapping A resulting value to pass to Unmap(). | |
@retval EFI_SUCCESS The requested memory pages were allocated. | |
@retval EFI_UNSUPPORTED Attributes is unsupported. The only legal attribute bits are | |
MEMORY_WRITE_COMBINE and MEMORY_CACHED. | |
@retval EFI_INVALID_PARAMETER One or more parameters are invalid. | |
@retval EFI_OUT_OF_RESOURCES The memory pages could not be allocated. | |
**/ | |
EFI_STATUS | |
IoMmuAllocateBuffer ( | |
IN EDKII_IOMMU_PPI *IoMmu, | |
IN UINTN Pages, | |
OUT VOID **HostAddress, | |
OUT EFI_PHYSICAL_ADDRESS *DeviceAddress, | |
OUT VOID **Mapping | |
); | |
/** | |
Initialize IOMMU. | |
@param IoMmu Pointer to pointer to IOMMU PPI. | |
**/ | |
VOID | |
IoMmuInit ( | |
OUT EDKII_IOMMU_PPI **IoMmu | |
); | |
#endif |