/** @file
Private Header file for Usb Host Controller PEIM
Copyright (c) 2006 - 2018, Intel Corporation. All rights reserved.
This program and the accompanying materials
are licensed and made available under the terms and conditions
of the BSD License which accompanies this distribution. The
full text of the license may be found at
http://opensource.org/licenses/bsd-license.php
THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
**/
#ifndef _RECOVERY_UHC_H_
#define _RECOVERY_UHC_H_
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#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
);
/**
Get Current Frame Number.
@param UhcDev The UHCI device.
@param FrameNumberAddr The address of frame list register.
@retval The content of the frame list register.
**/
UINT16
GetCurrentFrameNumber (
IN USB_UHC_DEV *UhcDev,
IN UINT32 FrameNumberAddr
);
/**
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
);
/**
Get the horizontal link pointer in QH.
@param PtrQH Place to store QH_STRUCT pointer.
@retval The horizontal link pointer in QH.
**/
VOID *
GetQHHorizontalLinkPtr (
IN QH_STRUCT *PtrQH
);
/**
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
);
/**
Get the vertical validor bit in QH.
@param PtrQH Place to store QH_STRUCT pointer.
@retval The vertical linker is valid or not.
**/
BOOLEAN
GetQHHorizontalValidorInvalid (
IN QH_STRUCT *PtrQH
);
/**
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
);
/**
Get the information about whether the Link Pointer field pointing to
a QH or a TD.
@param PtrTDStruct Place to store TD_STRUCT pointer.
@retval whether the Link Pointer field pointing to a QH or a TD.
**/
BOOLEAN
IsTDLinkPtrQHOrTD (
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
);
/**
Judge the memory block in the memory header is empty or not.
@param MemoryHeaderPtr A pointer to the memory header list.
@retval Whether the memory block in the memory header is empty or not.
**/
BOOLEAN
IsMemoryBlockEmptied (
IN MEMORY_MANAGE_HEADER *MemoryHeaderPtr
);
/**
remove a memory header from list.
@param FirstMemoryHeader A pointer to the memory header list.
@param FreeMemoryHeader A memory header to be removed into the list.
**/
VOID
DelinkMemoryBlock (
IN MEMORY_MANAGE_HEADER *FirstMemoryHeader,
IN MEMORY_MANAGE_HEADER *FreeMemoryHeader
);
/**
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
);
/**
Frees memory that was allocated with AllocateBuffer().
@param IoMmu Pointer to IOMMU PPI.
@param Pages The number of pages to free.
@param HostAddress The base system memory address of the allocated range.
@param Mapping The mapping value returned from Map().
**/
VOID
IoMmuFreeBuffer (
IN EDKII_IOMMU_PPI *IoMmu,
IN UINTN Pages,
IN VOID *HostAddress,
IN VOID *Mapping
);
/**
Initialize IOMMU.
@param IoMmu Pointer to pointer to IOMMU PPI.
**/
VOID
IoMmuInit (
OUT EDKII_IOMMU_PPI **IoMmu
);
#endif