mirror of
				https://git.proxmox.com/git/mirror_edk2
				synced 2025-11-04 02:40:26 +00:00 
			
		
		
		
	git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@10420 6f19259b-4bc3-4df7-8a09-765794883524
		
			
				
	
	
		
			273 lines
		
	
	
		
			7.8 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			273 lines
		
	
	
		
			7.8 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
/** @file
 | 
						|
 | 
						|
  The definition for UHCI register operation routines.
 | 
						|
 | 
						|
Copyright (c) 2007, Intel Corporation. All rights reserved.<BR>
 | 
						|
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 _EFI_UHCI_QUEUE_H_
 | 
						|
#define _EFI_UHCI_QUEUE_H_
 | 
						|
 | 
						|
//
 | 
						|
// Macroes used to set various links in UHCI's driver.
 | 
						|
// In this UHCI driver, QH's horizontal link always pointers to other QH,
 | 
						|
// and its vertical link always pointers to TD. TD's next pointer always
 | 
						|
// pointers to other sibling TD. Frame link always pointers to QH because
 | 
						|
// ISO transfer isn't supported.
 | 
						|
//
 | 
						|
// We should use UINT32 to access these pointers to void race conditions
 | 
						|
// with hardware.
 | 
						|
//
 | 
						|
#define QH_HLINK(Pointer, Terminate)  \
 | 
						|
        (((UINT32) ((UINTN) (Pointer)) & 0xFFFFFFF0) | 0x02 | ((Terminate) ? 0x01 : 0))
 | 
						|
 | 
						|
#define QH_VLINK(Pointer, Terminate)  \
 | 
						|
        (((UINT32) ((UINTN) (Pointer)) & 0xFFFFFFF0) | ((Terminate) ? 0x01 : 0))
 | 
						|
 | 
						|
#define TD_LINK(Pointer, VertFirst, Terminate) \
 | 
						|
        (((UINT32) ((UINTN) (Pointer)) & 0xFFFFFFF0) | \
 | 
						|
         ((VertFirst) ? 0x04 : 0) | ((Terminate) ? 0x01 : 0))
 | 
						|
 | 
						|
#define LINK_TERMINATED(Link) (((Link) & 0x01) != 0)
 | 
						|
 | 
						|
#define UHCI_ADDR(QhOrTd)     ((VOID *) (UINTN) ((QhOrTd) & 0xFFFFFFF0))
 | 
						|
 | 
						|
#pragma pack(1)
 | 
						|
//
 | 
						|
// Both links in QH has this internal structure:
 | 
						|
//   Next pointer: 28, Reserved: 2, NextIsQh: 1, Terminate: 1
 | 
						|
// This is the same as frame list entry.
 | 
						|
//
 | 
						|
typedef struct {
 | 
						|
  UINT32              HorizonLink;
 | 
						|
  UINT32              VerticalLink;
 | 
						|
} UHCI_QH_HW;
 | 
						|
 | 
						|
//
 | 
						|
// Next link in TD has this internal structure:
 | 
						|
//   Next pointer: 28, Reserved: 1, Vertical First: 1, NextIsQh: 1, Terminate: 1
 | 
						|
//
 | 
						|
typedef struct {
 | 
						|
  UINT32              NextLink;
 | 
						|
  UINT32              ActualLen   : 11;
 | 
						|
  UINT32              Reserved1   : 5;
 | 
						|
  UINT32              Status      : 8;
 | 
						|
  UINT32              IntOnCpl    : 1;
 | 
						|
  UINT32              IsIsoch     : 1;
 | 
						|
  UINT32              LowSpeed    : 1;
 | 
						|
  UINT32              ErrorCount  : 2;
 | 
						|
  UINT32              ShortPacket : 1;
 | 
						|
  UINT32              Reserved2   : 2;
 | 
						|
  UINT32              PidCode     : 8;
 | 
						|
  UINT32              DeviceAddr  : 7;
 | 
						|
  UINT32              EndPoint    : 4;
 | 
						|
  UINT32              DataToggle  : 1;
 | 
						|
  UINT32              Reserved3   : 1;
 | 
						|
  UINT32              MaxPacketLen: 11;
 | 
						|
  UINT32              DataBuffer;
 | 
						|
} UHCI_TD_HW;
 | 
						|
#pragma pack()
 | 
						|
 | 
						|
typedef struct _UHCI_TD_SW  UHCI_TD_SW;
 | 
						|
typedef struct _UHCI_QH_SW  UHCI_QH_SW;
 | 
						|
 | 
						|
struct _UHCI_QH_SW {
 | 
						|
  UHCI_QH_HW        QhHw;
 | 
						|
  UHCI_QH_SW        *NextQh;
 | 
						|
  UHCI_TD_SW        *TDs;
 | 
						|
  UINTN             Interval;
 | 
						|
};
 | 
						|
 | 
						|
struct _UHCI_TD_SW {
 | 
						|
  UHCI_TD_HW        TdHw;
 | 
						|
  UHCI_TD_SW        *NextTd;
 | 
						|
  UINT8             *Data;
 | 
						|
  UINT16            DataLen;
 | 
						|
};
 | 
						|
 | 
						|
 | 
						|
/**
 | 
						|
  Link the TD To QH.
 | 
						|
 | 
						|
  @param  Uhc         The UHCI device.
 | 
						|
  @param  Qh          The queue head for the TD to link to.
 | 
						|
  @param  Td          The TD to link.
 | 
						|
 | 
						|
**/
 | 
						|
VOID
 | 
						|
UhciLinkTdToQh (
 | 
						|
  IN USB_HC_DEV           *Uhc,
 | 
						|
  IN UHCI_QH_SW           *Qh,
 | 
						|
  IN UHCI_TD_SW           *Td
 | 
						|
  );
 | 
						|
 | 
						|
 | 
						|
/**
 | 
						|
  Unlink TD from the QH.
 | 
						|
 | 
						|
  @param  Qh          The queue head to unlink from.
 | 
						|
  @param  Td          The TD to unlink.
 | 
						|
 | 
						|
  @return None.
 | 
						|
 | 
						|
**/
 | 
						|
VOID
 | 
						|
UhciUnlinkTdFromQh (
 | 
						|
  IN UHCI_QH_SW           *Qh,
 | 
						|
  IN UHCI_TD_SW           *Td
 | 
						|
  );
 | 
						|
 | 
						|
 | 
						|
/**
 | 
						|
  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_HC_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_HC_DEV              *Uhc,
 | 
						|
  IN  EFI_USB_DATA_DIRECTION  Direction,
 | 
						|
  IN  VOID                    *Data,
 | 
						|
  IN  OUT UINTN               *Len,
 | 
						|
  OUT UINT8                   *PktId,
 | 
						|
  OUT UINT8                   **MappedAddr,
 | 
						|
  OUT VOID                    **Map
 | 
						|
  );
 | 
						|
 | 
						|
 | 
						|
/**
 | 
						|
  Delete a list of TDs.
 | 
						|
 | 
						|
  @param  Uhc         The UHCI device.
 | 
						|
  @param  FirstTd     TD link list head.
 | 
						|
 | 
						|
  @return None.
 | 
						|
 | 
						|
**/
 | 
						|
VOID
 | 
						|
UhciDestoryTds (
 | 
						|
  IN USB_HC_DEV           *Uhc,
 | 
						|
  IN UHCI_TD_SW           *FirstTd
 | 
						|
  );
 | 
						|
 | 
						|
 | 
						|
/**
 | 
						|
  Create an initialize a new queue head.
 | 
						|
 | 
						|
  @param  Uhc         The UHCI device.
 | 
						|
  @param  Interval    The polling interval for the queue.
 | 
						|
 | 
						|
  @return The newly created queue header.
 | 
						|
 | 
						|
**/
 | 
						|
UHCI_QH_SW *
 | 
						|
UhciCreateQh (
 | 
						|
  IN  USB_HC_DEV        *Uhc,
 | 
						|
  IN  UINTN             Interval
 | 
						|
  );
 | 
						|
 | 
						|
 | 
						|
/**
 | 
						|
  Create Tds list for Control Transfer.
 | 
						|
 | 
						|
  @param  Uhc         The UHCI device.
 | 
						|
  @param  DeviceAddr  The device address.
 | 
						|
  @param  DataPktId   Packet Identification of Data Tds.
 | 
						|
  @param  Request     A pointer to cpu memory address of request structure buffer to transfer.
 | 
						|
  @param  RequestPhy  A pointer to pci memory address of request structure buffer to transfer.
 | 
						|
  @param  Data        A pointer to cpu memory address of user data buffer to transfer.
 | 
						|
  @param  DataPhy     A pointer to pci memory address of user data buffer to transfer.
 | 
						|
  @param  DataLen     Length of user data to transfer.
 | 
						|
  @param  MaxPacket   Maximum packet size for control transfer.
 | 
						|
  @param  IsLow       Full speed or low speed.
 | 
						|
 | 
						|
  @return The Td list head for the control transfer.
 | 
						|
 | 
						|
**/
 | 
						|
UHCI_TD_SW *
 | 
						|
UhciCreateCtrlTds (
 | 
						|
  IN USB_HC_DEV           *Uhc,
 | 
						|
  IN UINT8                DeviceAddr,
 | 
						|
  IN UINT8                DataPktId,
 | 
						|
  IN UINT8                *Request,
 | 
						|
  IN UINT8                *RequestPhy,
 | 
						|
  IN UINT8                *Data,
 | 
						|
  IN UINT8                *DataPhy,
 | 
						|
  IN UINTN                DataLen,
 | 
						|
  IN UINT8                MaxPacket,
 | 
						|
  IN BOOLEAN              IsLow
 | 
						|
  );
 | 
						|
 | 
						|
 | 
						|
/**
 | 
						|
  Create Tds list for Bulk/Interrupt Transfer.
 | 
						|
 | 
						|
  @param  Uhc         USB_HC_DEV.
 | 
						|
  @param  DevAddr     Address of Device.
 | 
						|
  @param  EndPoint    Endpoint Number.
 | 
						|
  @param  PktId       Packet Identification of Data Tds.
 | 
						|
  @param  Data        A pointer to cpu memory address of user data buffer to transfer.
 | 
						|
  @param  DataPhy     A pointer to pci memory address of user data buffer to transfer.
 | 
						|
  @param  DataLen     Length of user data to transfer.
 | 
						|
  @param  DataToggle  Data Toggle Pointer.
 | 
						|
  @param  MaxPacket   Maximum packet size for Bulk/Interrupt transfer.
 | 
						|
  @param  IsLow       Is Low Speed Device.
 | 
						|
 | 
						|
  @return The Tds list head for the bulk transfer.
 | 
						|
 | 
						|
**/
 | 
						|
UHCI_TD_SW *
 | 
						|
UhciCreateBulkOrIntTds (
 | 
						|
  IN USB_HC_DEV           *Uhc,
 | 
						|
  IN UINT8                DevAddr,
 | 
						|
  IN UINT8                EndPoint,
 | 
						|
  IN UINT8                PktId,
 | 
						|
  IN UINT8                *Data,
 | 
						|
  IN UINT8                *DataPhy,
 | 
						|
  IN UINTN                DataLen,
 | 
						|
  IN OUT UINT8            *DataToggle,
 | 
						|
  IN UINT8                MaxPacket,
 | 
						|
  IN BOOLEAN              IsLow
 | 
						|
  );
 | 
						|
 | 
						|
#endif
 |