307 lines
11 KiB
C
307 lines
11 KiB
C
/******************************************************************************
|
|
*
|
|
* Author: Xilinx, Inc.
|
|
*
|
|
*
|
|
* This program is free software; you can redistribute it and/or modify it
|
|
* under the terms of the GNU General Public License as published by the
|
|
* Free Software Foundation; either version 2 of the License, or (at your
|
|
* option) any later version.
|
|
*
|
|
*
|
|
* XILINX IS PROVIDING THIS DESIGN, CODE, OR INFORMATION "AS IS" AS A
|
|
* COURTESY TO YOU. BY PROVIDING THIS DESIGN, CODE, OR INFORMATION AS
|
|
* ONE POSSIBLE IMPLEMENTATION OF THIS FEATURE, APPLICATION OR STANDARD,
|
|
* XILINX IS MAKING NO REPRESENTATION THAT THIS IMPLEMENTATION IS FREE
|
|
* FROM ANY CLAIMS OF INFRINGEMENT, AND YOU ARE RESPONSIBLE FOR OBTAINING
|
|
* ANY THIRD PARTY RIGHTS YOU MAY REQUIRE FOR YOUR IMPLEMENTATION.
|
|
* XILINX EXPRESSLY DISCLAIMS ANY WARRANTY WHATSOEVER WITH RESPECT TO
|
|
* THE ADEQUACY OF THE IMPLEMENTATION, INCLUDING BUT NOT LIMITED TO ANY
|
|
* WARRANTIES OR REPRESENTATIONS THAT THIS IMPLEMENTATION IS FREE FROM
|
|
* CLAIMS OF INFRINGEMENT, IMPLIED WARRANTIES OF MERCHANTABILITY AND
|
|
* FITNESS FOR A PARTICULAR PURPOSE.
|
|
*
|
|
*
|
|
* Xilinx hardware products are not intended for use in life support
|
|
* appliances, devices, or systems. Use in such applications is
|
|
* expressly prohibited.
|
|
*
|
|
*
|
|
* (c) Copyright 2002-2004 Xilinx Inc.
|
|
* All rights reserved.
|
|
*
|
|
*
|
|
* You should have received a copy of the GNU General Public License along
|
|
* with this program; if not, write to the Free Software Foundation, Inc.,
|
|
* 675 Mass Ave, Cambridge, MA 02139, USA.
|
|
*
|
|
******************************************************************************/
|
|
/*****************************************************************************/
|
|
/*
|
|
*
|
|
* @file xpacket_fifo_v1_00_b.h
|
|
*
|
|
* This component is a common component because it's primary purpose is to
|
|
* prevent code duplication in drivers. A driver which must handle a packet
|
|
* FIFO uses this component rather than directly manipulating a packet FIFO.
|
|
*
|
|
* A FIFO is a device which has dual port memory such that one user may be
|
|
* inserting data into the FIFO while another is consuming data from the FIFO.
|
|
* A packet FIFO is designed for use with packet protocols such as Ethernet and
|
|
* ATM. It is typically only used with devices when DMA and/or Scatter Gather
|
|
* is used. It differs from a nonpacket FIFO in that it does not provide any
|
|
* interrupts for thresholds of the FIFO such that it is less useful without
|
|
* DMA.
|
|
*
|
|
* @note
|
|
*
|
|
* This component has the capability to generate an interrupt when an error
|
|
* condition occurs. It is the user's responsibility to provide the interrupt
|
|
* processing to handle the interrupt. This component provides the ability to
|
|
* determine if that interrupt is active, a deadlock condition, and the ability
|
|
* to reset the FIFO to clear the condition. In this condition, the device which
|
|
* is using the FIFO should also be reset to prevent other problems. This error
|
|
* condition could occur as a normal part of operation if the size of the FIFO
|
|
* is not setup correctly. See the hardware IP specification for more details.
|
|
*
|
|
* <pre>
|
|
* MODIFICATION HISTORY:
|
|
*
|
|
* Ver Who Date Changes
|
|
* ----- ---- -------- -----------------------------------------------
|
|
* 1.00b rpm 03/26/02 First release
|
|
* </pre>
|
|
*
|
|
*****************************************************************************/
|
|
#ifndef XPACKET_FIFO_H /* prevent circular inclusions */
|
|
#define XPACKET_FIFO_H /* by using protection macros */
|
|
|
|
/***************************** Include Files *********************************/
|
|
|
|
#include "xbasic_types.h"
|
|
#include "xstatus.h"
|
|
|
|
/************************** Constant Definitions *****************************/
|
|
|
|
/*
|
|
* These constants specify the FIFO type and are mutually exclusive
|
|
*/
|
|
#define XPF_READ_FIFO_TYPE 0 /* a read FIFO */
|
|
#define XPF_WRITE_FIFO_TYPE 1 /* a write FIFO */
|
|
|
|
/*
|
|
* These constants define the offsets to each of the registers from the
|
|
* register base address, each of the constants are a number of bytes
|
|
*/
|
|
#define XPF_RESET_REG_OFFSET 0UL
|
|
#define XPF_MODULE_INFO_REG_OFFSET 0UL
|
|
#define XPF_COUNT_STATUS_REG_OFFSET 4UL
|
|
|
|
/*
|
|
* This constant is used with the Reset Register
|
|
*/
|
|
#define XPF_RESET_FIFO_MASK 0x0000000A
|
|
|
|
/*
|
|
* These constants are used with the Occupancy/Vacancy Count Register. This
|
|
* register also contains FIFO status
|
|
*/
|
|
#define XPF_COUNT_MASK 0x0000FFFF
|
|
#define XPF_DEADLOCK_MASK 0x20000000
|
|
#define XPF_ALMOST_EMPTY_FULL_MASK 0x40000000
|
|
#define XPF_EMPTY_FULL_MASK 0x80000000
|
|
|
|
/**************************** Type Definitions *******************************/
|
|
|
|
/*
|
|
* The XPacketFifo driver instance data. The driver is required to allocate a
|
|
* variable of this type for every packet FIFO in the device.
|
|
*/
|
|
typedef struct {
|
|
u32 RegBaseAddress; /* Base address of registers */
|
|
u32 IsReady; /* Device is initialized and ready */
|
|
u32 DataBaseAddress; /* Base address of data for FIFOs */
|
|
} XPacketFifoV100b;
|
|
|
|
/***************** Macros (Inline Functions) Definitions *********************/
|
|
|
|
/*****************************************************************************/
|
|
/*
|
|
*
|
|
* Reset the specified packet FIFO. Resetting a FIFO will cause any data
|
|
* contained in the FIFO to be lost.
|
|
*
|
|
* @param InstancePtr contains a pointer to the FIFO to operate on.
|
|
*
|
|
* @return
|
|
*
|
|
* None.
|
|
*
|
|
* @note
|
|
*
|
|
* Signature: void XPF_V100B_RESET(XPacketFifoV100b *InstancePtr)
|
|
*
|
|
******************************************************************************/
|
|
#define XPF_V100B_RESET(InstancePtr) \
|
|
XIo_Out32((InstancePtr)->RegBaseAddress + XPF_RESET_REG_OFFSET, XPF_RESET_FIFO_MASK);
|
|
|
|
/*****************************************************************************/
|
|
/*
|
|
*
|
|
* Get the occupancy count for a read packet FIFO and the vacancy count for a
|
|
* write packet FIFO. These counts indicate the number of 32-bit words
|
|
* contained (occupancy) in the FIFO or the number of 32-bit words available
|
|
* to write (vacancy) in the FIFO.
|
|
*
|
|
* @param InstancePtr contains a pointer to the FIFO to operate on.
|
|
*
|
|
* @return
|
|
*
|
|
* The occupancy or vacancy count for the specified packet FIFO.
|
|
*
|
|
* @note
|
|
*
|
|
* Signature: u32 XPF_V100B_GET_COUNT(XPacketFifoV100b *InstancePtr)
|
|
*
|
|
******************************************************************************/
|
|
#define XPF_V100B_GET_COUNT(InstancePtr) \
|
|
(XIo_In32((InstancePtr)->RegBaseAddress + XPF_COUNT_STATUS_REG_OFFSET) & \
|
|
XPF_COUNT_MASK)
|
|
|
|
/*****************************************************************************/
|
|
/*
|
|
*
|
|
* Determine if the specified packet FIFO is almost empty. Almost empty is
|
|
* defined for a read FIFO when there is only one data word in the FIFO.
|
|
*
|
|
* @param InstancePtr contains a pointer to the FIFO to operate on.
|
|
*
|
|
* @return
|
|
*
|
|
* TRUE if the packet FIFO is almost empty, FALSE otherwise.
|
|
*
|
|
* @note
|
|
*
|
|
* Signature: u32 XPF_V100B_IS_ALMOST_EMPTY(XPacketFifoV100b *InstancePtr)
|
|
*
|
|
******************************************************************************/
|
|
#define XPF_V100B_IS_ALMOST_EMPTY(InstancePtr) \
|
|
(XIo_In32((InstancePtr)->RegBaseAddress + XPF_COUNT_STATUS_REG_OFFSET) & \
|
|
XPF_ALMOST_EMPTY_FULL_MASK)
|
|
|
|
/*****************************************************************************/
|
|
/*
|
|
*
|
|
* Determine if the specified packet FIFO is almost full. Almost full is
|
|
* defined for a write FIFO when there is only one available data word in the
|
|
* FIFO.
|
|
*
|
|
* @param InstancePtr contains a pointer to the FIFO to operate on.
|
|
*
|
|
* @return
|
|
*
|
|
* TRUE if the packet FIFO is almost full, FALSE otherwise.
|
|
*
|
|
* @note
|
|
*
|
|
* Signature: u32 XPF_V100B_IS_ALMOST_FULL(XPacketFifoV100b *InstancePtr)
|
|
*
|
|
******************************************************************************/
|
|
#define XPF_V100B_IS_ALMOST_FULL(InstancePtr) \
|
|
(XIo_In32((InstancePtr)->RegBaseAddress + XPF_COUNT_STATUS_REG_OFFSET) & \
|
|
XPF_ALMOST_EMPTY_FULL_MASK)
|
|
|
|
/*****************************************************************************/
|
|
/*
|
|
*
|
|
* Determine if the specified packet FIFO is empty. This applies only to a
|
|
* read FIFO.
|
|
*
|
|
* @param InstancePtr contains a pointer to the FIFO to operate on.
|
|
*
|
|
* @return
|
|
*
|
|
* TRUE if the packet FIFO is empty, FALSE otherwise.
|
|
*
|
|
* @note
|
|
*
|
|
* Signature: u32 XPF_V100B_IS_EMPTY(XPacketFifoV100b *InstancePtr)
|
|
*
|
|
******************************************************************************/
|
|
#define XPF_V100B_IS_EMPTY(InstancePtr) \
|
|
(XIo_In32((InstancePtr)->RegBaseAddress + XPF_COUNT_STATUS_REG_OFFSET) & \
|
|
XPF_EMPTY_FULL_MASK)
|
|
|
|
/*****************************************************************************/
|
|
/*
|
|
*
|
|
* Determine if the specified packet FIFO is full. This applies only to a
|
|
* write FIFO.
|
|
*
|
|
* @param InstancePtr contains a pointer to the FIFO to operate on.
|
|
*
|
|
* @return
|
|
*
|
|
* TRUE if the packet FIFO is full, FALSE otherwise.
|
|
*
|
|
* @note
|
|
*
|
|
* Signature: u32 XPF_V100B_IS_FULL(XPacketFifoV100b *InstancePtr)
|
|
*
|
|
******************************************************************************/
|
|
#define XPF_V100B_IS_FULL(InstancePtr) \
|
|
(XIo_In32((InstancePtr)->RegBaseAddress + XPF_COUNT_STATUS_REG_OFFSET) & \
|
|
XPF_EMPTY_FULL_MASK)
|
|
|
|
/*****************************************************************************/
|
|
/*
|
|
*
|
|
* Determine if the specified packet FIFO is deadlocked. This condition occurs
|
|
* when the FIFO is full and empty at the same time and is caused by a packet
|
|
* being written to the FIFO which exceeds the total data capacity of the FIFO.
|
|
* It occurs because of the mark/restore features of the packet FIFO which allow
|
|
* retransmission of a packet. The software should reset the FIFO and any devices
|
|
* using the FIFO when this condition occurs.
|
|
*
|
|
* @param InstancePtr contains a pointer to the FIFO to operate on.
|
|
*
|
|
* @return
|
|
*
|
|
* TRUE if the packet FIFO is deadlocked, FALSE otherwise.
|
|
*
|
|
* @note
|
|
*
|
|
* This component has the capability to generate an interrupt when an error
|
|
* condition occurs. It is the user's responsibility to provide the interrupt
|
|
* processing to handle the interrupt. This function provides the ability to
|
|
* determine if a deadlock condition, and the ability to reset the FIFO to
|
|
* clear the condition.
|
|
*
|
|
* In this condition, the device which is using the FIFO should also be reset
|
|
* to prevent other problems. This error condition could occur as a normal part
|
|
* of operation if the size of the FIFO is not setup correctly.
|
|
*
|
|
* Signature: u32 XPF_V100B_IS_DEADLOCKED(XPacketFifoV100b *InstancePtr)
|
|
*
|
|
******************************************************************************/
|
|
#define XPF_V100B_IS_DEADLOCKED(InstancePtr) \
|
|
(XIo_In32((InstancePtr)->RegBaseAddress + XPF_COUNT_STATUS_REG_OFFSET) & \
|
|
XPF_DEADLOCK_MASK)
|
|
|
|
/************************** Function Prototypes ******************************/
|
|
|
|
/* Standard functions */
|
|
|
|
XStatus XPacketFifoV100b_Initialize(XPacketFifoV100b * InstancePtr,
|
|
u32 RegBaseAddress, u32 DataBaseAddress);
|
|
XStatus XPacketFifoV100b_SelfTest(XPacketFifoV100b * InstancePtr, u32 FifoType);
|
|
|
|
/* Data functions */
|
|
|
|
XStatus XPacketFifoV100b_Read(XPacketFifoV100b * InstancePtr,
|
|
u8 * ReadBufferPtr, u32 ByteCount);
|
|
XStatus XPacketFifoV100b_Write(XPacketFifoV100b * InstancePtr,
|
|
u8 * WriteBufferPtr, u32 ByteCount);
|
|
|
|
#endif /* end of protection macro */
|