mirror of
https://github.com/AsahiLinux/u-boot
synced 2024-12-25 12:33:41 +00:00
738 lines
22 KiB
C
738 lines
22 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.
|
|
*
|
|
* FILENAME:
|
|
*
|
|
* xdma_channel.c
|
|
*
|
|
* DESCRIPTION:
|
|
*
|
|
* This file contains the DMA channel component. This component supports
|
|
* a distributed DMA design in which each device can have it's own dedicated
|
|
* DMA channel, as opposed to a centralized DMA design. This component
|
|
* performs processing for DMA on all devices.
|
|
*
|
|
* See xdma_channel.h for more information about this component.
|
|
*
|
|
* NOTES:
|
|
*
|
|
* None.
|
|
*
|
|
******************************************************************************/
|
|
|
|
/***************************** Include Files *********************************/
|
|
|
|
#include "xdma_channel.h"
|
|
#include "xbasic_types.h"
|
|
#include "xio.h"
|
|
|
|
/************************** Constant Definitions *****************************/
|
|
|
|
/**************************** Type Definitions *******************************/
|
|
|
|
/***************** Macros (Inline Functions) Definitions *********************/
|
|
|
|
/************************** Function Prototypes ******************************/
|
|
|
|
/******************************************************************************
|
|
*
|
|
* FUNCTION:
|
|
*
|
|
* XDmaChannel_Initialize
|
|
*
|
|
* DESCRIPTION:
|
|
*
|
|
* This function initializes a DMA channel. This function must be called
|
|
* prior to using a DMA channel. Initialization of a channel includes setting
|
|
* up the registers base address, and resetting the channel such that it's in a
|
|
* known state. Interrupts for the channel are disabled when the channel is
|
|
* reset.
|
|
*
|
|
* ARGUMENTS:
|
|
*
|
|
* InstancePtr contains a pointer to the DMA channel to operate on.
|
|
*
|
|
* BaseAddress contains the base address of the registers for the DMA channel.
|
|
*
|
|
* RETURN VALUE:
|
|
*
|
|
* XST_SUCCESS indicating initialization was successful.
|
|
*
|
|
* NOTES:
|
|
*
|
|
* None.
|
|
*
|
|
******************************************************************************/
|
|
XStatus
|
|
XDmaChannel_Initialize(XDmaChannel * InstancePtr, u32 BaseAddress)
|
|
{
|
|
/* assert to verify input arguments, don't assert base address */
|
|
|
|
XASSERT_NONVOID(InstancePtr != NULL);
|
|
|
|
/* setup the base address of the registers for the DMA channel such
|
|
* that register accesses can be done
|
|
*/
|
|
InstancePtr->RegBaseAddress = BaseAddress;
|
|
|
|
/* initialize the scatter gather list such that it indicates it has not
|
|
* been created yet and the DMA channel is ready to use (initialized)
|
|
*/
|
|
InstancePtr->GetPtr = NULL;
|
|
InstancePtr->PutPtr = NULL;
|
|
InstancePtr->CommitPtr = NULL;
|
|
InstancePtr->LastPtr = NULL;
|
|
|
|
InstancePtr->TotalDescriptorCount = 0;
|
|
InstancePtr->ActiveDescriptorCount = 0;
|
|
InstancePtr->IsReady = XCOMPONENT_IS_READY;
|
|
|
|
/* initialize the version of the component
|
|
*/
|
|
XVersion_FromString(&InstancePtr->Version, (s8 *)"1.00a");
|
|
|
|
/* reset the DMA channel such that it's in a known state and ready
|
|
* and indicate the initialization occured with no errors, note that
|
|
* the is ready variable must be set before this call or reset will assert
|
|
*/
|
|
XDmaChannel_Reset(InstancePtr);
|
|
|
|
return XST_SUCCESS;
|
|
}
|
|
|
|
/******************************************************************************
|
|
*
|
|
* FUNCTION:
|
|
*
|
|
* XDmaChannel_IsReady
|
|
*
|
|
* DESCRIPTION:
|
|
*
|
|
* This function determines if a DMA channel component has been successfully
|
|
* initialized such that it's ready to use.
|
|
*
|
|
* ARGUMENTS:
|
|
*
|
|
* InstancePtr contains a pointer to the DMA channel to operate on.
|
|
*
|
|
* RETURN VALUE:
|
|
*
|
|
* TRUE if the DMA channel component is ready, FALSE otherwise.
|
|
*
|
|
* NOTES:
|
|
*
|
|
* None.
|
|
*
|
|
******************************************************************************/
|
|
u32
|
|
XDmaChannel_IsReady(XDmaChannel * InstancePtr)
|
|
{
|
|
/* assert to verify input arguments used by the base component */
|
|
|
|
XASSERT_NONVOID(InstancePtr != NULL);
|
|
|
|
return InstancePtr->IsReady == XCOMPONENT_IS_READY;
|
|
}
|
|
|
|
/******************************************************************************
|
|
*
|
|
* FUNCTION:
|
|
*
|
|
* XDmaChannel_GetVersion
|
|
*
|
|
* DESCRIPTION:
|
|
*
|
|
* This function gets the software version for the specified DMA channel
|
|
* component.
|
|
*
|
|
* ARGUMENTS:
|
|
*
|
|
* InstancePtr contains a pointer to the DMA channel to operate on.
|
|
*
|
|
* RETURN VALUE:
|
|
*
|
|
* A pointer to the software version of the specified DMA channel.
|
|
*
|
|
* NOTES:
|
|
*
|
|
* None.
|
|
*
|
|
******************************************************************************/
|
|
XVersion *
|
|
XDmaChannel_GetVersion(XDmaChannel * InstancePtr)
|
|
{
|
|
/* assert to verify input arguments */
|
|
|
|
XASSERT_NONVOID(InstancePtr != NULL);
|
|
XASSERT_NONVOID(InstancePtr->IsReady == XCOMPONENT_IS_READY);
|
|
|
|
/* return a pointer to the version of the DMA channel */
|
|
|
|
return &InstancePtr->Version;
|
|
}
|
|
|
|
/******************************************************************************
|
|
*
|
|
* FUNCTION:
|
|
*
|
|
* XDmaChannel_SelfTest
|
|
*
|
|
* DESCRIPTION:
|
|
*
|
|
* This function performs a self test on the specified DMA channel. This self
|
|
* test is destructive as the DMA channel is reset and a register default is
|
|
* verified.
|
|
*
|
|
* ARGUMENTS:
|
|
*
|
|
* InstancePtr is a pointer to the DMA channel to be operated on.
|
|
*
|
|
* RETURN VALUE:
|
|
*
|
|
* XST_SUCCESS is returned if the self test is successful, or one of the
|
|
* following errors.
|
|
*
|
|
* XST_DMA_RESET_REGISTER_ERROR Indicates the control register value
|
|
* after a reset was not correct
|
|
*
|
|
* NOTES:
|
|
*
|
|
* This test does not performs a DMA transfer to test the channel because the
|
|
* DMA hardware will not currently allow a non-local memory transfer to non-local
|
|
* memory (memory copy), but only allows a non-local memory to or from the device
|
|
* memory (typically a FIFO).
|
|
*
|
|
******************************************************************************/
|
|
|
|
#define XDC_CONTROL_REG_RESET_MASK 0x98000000UL /* control reg reset value */
|
|
|
|
XStatus
|
|
XDmaChannel_SelfTest(XDmaChannel * InstancePtr)
|
|
{
|
|
u32 ControlReg;
|
|
|
|
/* assert to verify input arguments */
|
|
|
|
XASSERT_NONVOID(InstancePtr != NULL);
|
|
XASSERT_NONVOID(InstancePtr->IsReady == XCOMPONENT_IS_READY);
|
|
|
|
/* reset the DMA channel such that it's in a known state before the test
|
|
* it resets to no interrupts enabled, the desired state for the test
|
|
*/
|
|
XDmaChannel_Reset(InstancePtr);
|
|
|
|
/* this should be the first test to help prevent a lock up with the polling
|
|
* loop that occurs later in the test, check the reset value of the DMA
|
|
* control register to make sure it's correct, return with an error if not
|
|
*/
|
|
ControlReg = XDmaChannel_GetControl(InstancePtr);
|
|
if (ControlReg != XDC_CONTROL_REG_RESET_MASK) {
|
|
return XST_DMA_RESET_REGISTER_ERROR;
|
|
}
|
|
|
|
return XST_SUCCESS;
|
|
}
|
|
|
|
/******************************************************************************
|
|
*
|
|
* FUNCTION:
|
|
*
|
|
* XDmaChannel_Reset
|
|
*
|
|
* DESCRIPTION:
|
|
*
|
|
* This function resets the DMA channel. This is a destructive operation such
|
|
* that it should not be done while a channel is being used. If the DMA channel
|
|
* is transferring data into other blocks, such as a FIFO, it may be necessary
|
|
* to reset other blocks. This function does not modify the contents of a
|
|
* scatter gather list for a DMA channel such that the user is responsible for
|
|
* getting buffer descriptors from the list if necessary.
|
|
*
|
|
* ARGUMENTS:
|
|
*
|
|
* InstancePtr contains a pointer to the DMA channel to operate on.
|
|
*
|
|
* RETURN VALUE:
|
|
*
|
|
* None.
|
|
*
|
|
* NOTES:
|
|
*
|
|
* None.
|
|
*
|
|
******************************************************************************/
|
|
void
|
|
XDmaChannel_Reset(XDmaChannel * InstancePtr)
|
|
{
|
|
/* assert to verify input arguments */
|
|
|
|
XASSERT_VOID(InstancePtr != NULL);
|
|
XASSERT_VOID(InstancePtr->IsReady == XCOMPONENT_IS_READY);
|
|
|
|
/* reset the DMA channel such that it's in a known state, the reset
|
|
* register is self clearing such that it only has to be set
|
|
*/
|
|
XIo_Out32(InstancePtr->RegBaseAddress + XDC_RST_REG_OFFSET,
|
|
XDC_RESET_MASK);
|
|
}
|
|
|
|
/******************************************************************************
|
|
*
|
|
* FUNCTION:
|
|
*
|
|
* XDmaChannel_GetControl
|
|
*
|
|
* DESCRIPTION:
|
|
*
|
|
* This function gets the control register contents of the DMA channel.
|
|
*
|
|
* ARGUMENTS:
|
|
*
|
|
* InstancePtr contains a pointer to the DMA channel to operate on.
|
|
*
|
|
* RETURN VALUE:
|
|
*
|
|
* The control register contents of the DMA channel. One or more of the
|
|
* following values may be contained the register. Each of the values are
|
|
* unique bit masks.
|
|
*
|
|
* XDC_DMACR_SOURCE_INCR_MASK Increment the source address
|
|
* XDC_DMACR_DEST_INCR_MASK Increment the destination address
|
|
* XDC_DMACR_SOURCE_LOCAL_MASK Local source address
|
|
* XDC_DMACR_DEST_LOCAL_MASK Local destination address
|
|
* XDC_DMACR_SG_ENABLE_MASK Scatter gather enable
|
|
* XDC_DMACR_GEN_BD_INTR_MASK Individual buffer descriptor interrupt
|
|
* XDC_DMACR_LAST_BD_MASK Last buffer descriptor in a packet
|
|
*
|
|
* NOTES:
|
|
*
|
|
* None.
|
|
*
|
|
******************************************************************************/
|
|
u32
|
|
XDmaChannel_GetControl(XDmaChannel * InstancePtr)
|
|
{
|
|
/* assert to verify input arguments */
|
|
|
|
XASSERT_NONVOID(InstancePtr != NULL);
|
|
XASSERT_NONVOID(InstancePtr->IsReady == XCOMPONENT_IS_READY);
|
|
|
|
/* return the contents of the DMA control register */
|
|
|
|
return XIo_In32(InstancePtr->RegBaseAddress + XDC_DMAC_REG_OFFSET);
|
|
}
|
|
|
|
/******************************************************************************
|
|
*
|
|
* FUNCTION:
|
|
*
|
|
* XDmaChannel_SetControl
|
|
*
|
|
* DESCRIPTION:
|
|
*
|
|
* This function sets the control register of the specified DMA channel.
|
|
*
|
|
* ARGUMENTS:
|
|
*
|
|
* InstancePtr contains a pointer to the DMA channel to operate on.
|
|
*
|
|
* Control contains the value to be written to the control register of the DMA
|
|
* channel. One or more of the following values may be contained the register.
|
|
* Each of the values are unique bit masks such that they may be ORed together
|
|
* to enable multiple bits or inverted and ANDed to disable multiple bits.
|
|
*
|
|
* XDC_DMACR_SOURCE_INCR_MASK Increment the source address
|
|
* XDC_DMACR_DEST_INCR_MASK Increment the destination address
|
|
* XDC_DMACR_SOURCE_LOCAL_MASK Local source address
|
|
* XDC_DMACR_DEST_LOCAL_MASK Local destination address
|
|
* XDC_DMACR_SG_ENABLE_MASK Scatter gather enable
|
|
* XDC_DMACR_GEN_BD_INTR_MASK Individual buffer descriptor interrupt
|
|
* XDC_DMACR_LAST_BD_MASK Last buffer descriptor in a packet
|
|
*
|
|
* RETURN VALUE:
|
|
*
|
|
* None.
|
|
*
|
|
* NOTES:
|
|
*
|
|
* None.
|
|
*
|
|
******************************************************************************/
|
|
void
|
|
XDmaChannel_SetControl(XDmaChannel * InstancePtr, u32 Control)
|
|
{
|
|
/* assert to verify input arguments except the control which can't be
|
|
* asserted since all values are valid
|
|
*/
|
|
XASSERT_VOID(InstancePtr != NULL);
|
|
XASSERT_VOID(InstancePtr->IsReady == XCOMPONENT_IS_READY);
|
|
|
|
/* set the DMA control register to the specified value */
|
|
|
|
XIo_Out32(InstancePtr->RegBaseAddress + XDC_DMAC_REG_OFFSET, Control);
|
|
}
|
|
|
|
/******************************************************************************
|
|
*
|
|
* FUNCTION:
|
|
*
|
|
* XDmaChannel_GetStatus
|
|
*
|
|
* DESCRIPTION:
|
|
*
|
|
* This function gets the status register contents of the DMA channel.
|
|
*
|
|
* ARGUMENTS:
|
|
*
|
|
* InstancePtr contains a pointer to the DMA channel to operate on.
|
|
*
|
|
* RETURN VALUE:
|
|
*
|
|
* The status register contents of the DMA channel. One or more of the
|
|
* following values may be contained the register. Each of the values are
|
|
* unique bit masks.
|
|
*
|
|
* XDC_DMASR_BUSY_MASK The DMA channel is busy
|
|
* XDC_DMASR_BUS_ERROR_MASK A bus error occurred
|
|
* XDC_DMASR_BUS_TIMEOUT_MASK A bus timeout occurred
|
|
* XDC_DMASR_LAST_BD_MASK The last buffer descriptor of a packet
|
|
*
|
|
* NOTES:
|
|
*
|
|
* None.
|
|
*
|
|
******************************************************************************/
|
|
u32
|
|
XDmaChannel_GetStatus(XDmaChannel * InstancePtr)
|
|
{
|
|
/* assert to verify input arguments */
|
|
|
|
XASSERT_NONVOID(InstancePtr != NULL);
|
|
XASSERT_NONVOID(InstancePtr->IsReady == XCOMPONENT_IS_READY);
|
|
|
|
/* return the contents of the DMA status register */
|
|
|
|
return XIo_In32(InstancePtr->RegBaseAddress + XDC_DMAS_REG_OFFSET);
|
|
}
|
|
|
|
/******************************************************************************
|
|
*
|
|
* FUNCTION:
|
|
*
|
|
* XDmaChannel_SetIntrStatus
|
|
*
|
|
* DESCRIPTION:
|
|
*
|
|
* This function sets the interrupt status register of the specified DMA channel.
|
|
* Setting any bit of the interrupt status register will clear the bit to
|
|
* indicate the interrupt processing has been completed. The definitions of each
|
|
* bit in the register match the definition of the bits in the interrupt enable
|
|
* register.
|
|
*
|
|
* ARGUMENTS:
|
|
*
|
|
* InstancePtr contains a pointer to the DMA channel to operate on.
|
|
*
|
|
* Status contains the value to be written to the status register of the DMA
|
|
* channel. One or more of the following values may be contained the register.
|
|
* Each of the values are unique bit masks such that they may be ORed together
|
|
* to enable multiple bits or inverted and ANDed to disable multiple bits.
|
|
*
|
|
* XDC_IXR_DMA_DONE_MASK The dma operation is done
|
|
* XDC_IXR_DMA_ERROR_MASK The dma operation had an error
|
|
* XDC_IXR_PKT_DONE_MASK A packet is complete
|
|
* XDC_IXR_PKT_THRESHOLD_MASK The packet count threshold reached
|
|
* XDC_IXR_PKT_WAIT_BOUND_MASK The packet wait bound reached
|
|
* XDC_IXR_SG_DISABLE_ACK_MASK The scatter gather disable completed
|
|
* XDC_IXR_BD_MASK A buffer descriptor is done
|
|
*
|
|
* RETURN VALUE:
|
|
*
|
|
* None.
|
|
*
|
|
* NOTES:
|
|
*
|
|
* None.
|
|
*
|
|
******************************************************************************/
|
|
void
|
|
XDmaChannel_SetIntrStatus(XDmaChannel * InstancePtr, u32 Status)
|
|
{
|
|
/* assert to verify input arguments except the status which can't be
|
|
* asserted since all values are valid
|
|
*/
|
|
XASSERT_VOID(InstancePtr != NULL);
|
|
XASSERT_VOID(InstancePtr->IsReady == XCOMPONENT_IS_READY);
|
|
|
|
/* set the interrupt status register with the specified value such that
|
|
* all bits which are set in the register are cleared effectively clearing
|
|
* any active interrupts
|
|
*/
|
|
XIo_Out32(InstancePtr->RegBaseAddress + XDC_IS_REG_OFFSET, Status);
|
|
}
|
|
|
|
/******************************************************************************
|
|
*
|
|
* FUNCTION:
|
|
*
|
|
* XDmaChannel_GetIntrStatus
|
|
*
|
|
* DESCRIPTION:
|
|
*
|
|
* This function gets the interrupt status register of the specified DMA channel.
|
|
* The interrupt status register indicates which interrupts are active
|
|
* for the DMA channel. If an interrupt is active, the status register must be
|
|
* set (written) with the bit set for each interrupt which has been processed
|
|
* in order to clear the interrupts. The definitions of each bit in the register
|
|
* match the definition of the bits in the interrupt enable register.
|
|
*
|
|
* ARGUMENTS:
|
|
*
|
|
* InstancePtr contains a pointer to the DMA channel to operate on.
|
|
*
|
|
* RETURN VALUE:
|
|
*
|
|
* The interrupt status register contents of the specified DMA channel.
|
|
* One or more of the following values may be contained the register.
|
|
* Each of the values are unique bit masks.
|
|
*
|
|
* XDC_IXR_DMA_DONE_MASK The dma operation is done
|
|
* XDC_IXR_DMA_ERROR_MASK The dma operation had an error
|
|
* XDC_IXR_PKT_DONE_MASK A packet is complete
|
|
* XDC_IXR_PKT_THRESHOLD_MASK The packet count threshold reached
|
|
* XDC_IXR_PKT_WAIT_BOUND_MASK The packet wait bound reached
|
|
* XDC_IXR_SG_DISABLE_ACK_MASK The scatter gather disable completed
|
|
* XDC_IXR_SG_END_MASK Current descriptor was the end of the list
|
|
* XDC_IXR_BD_MASK A buffer descriptor is done
|
|
*
|
|
* NOTES:
|
|
*
|
|
* None.
|
|
*
|
|
******************************************************************************/
|
|
u32
|
|
XDmaChannel_GetIntrStatus(XDmaChannel * InstancePtr)
|
|
{
|
|
/* assert to verify input arguments */
|
|
|
|
XASSERT_NONVOID(InstancePtr != NULL);
|
|
XASSERT_NONVOID(InstancePtr->IsReady == XCOMPONENT_IS_READY);
|
|
|
|
/* return the contents of the interrupt status register */
|
|
|
|
return XIo_In32(InstancePtr->RegBaseAddress + XDC_IS_REG_OFFSET);
|
|
}
|
|
|
|
/******************************************************************************
|
|
*
|
|
* FUNCTION:
|
|
*
|
|
* XDmaChannel_SetIntrEnable
|
|
*
|
|
* DESCRIPTION:
|
|
*
|
|
* This function sets the interrupt enable register of the specified DMA
|
|
* channel. The interrupt enable register contains bits which enable
|
|
* individual interrupts for the DMA channel. The definitions of each bit
|
|
* in the register match the definition of the bits in the interrupt status
|
|
* register.
|
|
*
|
|
* ARGUMENTS:
|
|
*
|
|
* InstancePtr contains a pointer to the DMA channel to operate on.
|
|
*
|
|
* Enable contains the interrupt enable register contents to be written
|
|
* in the DMA channel. One or more of the following values may be contained
|
|
* the register. Each of the values are unique bit masks such that they may be
|
|
* ORed together to enable multiple bits or inverted and ANDed to disable
|
|
* multiple bits.
|
|
*
|
|
* XDC_IXR_DMA_DONE_MASK The dma operation is done
|
|
* XDC_IXR_DMA_ERROR_MASK The dma operation had an error
|
|
* XDC_IXR_PKT_DONE_MASK A packet is complete
|
|
* XDC_IXR_PKT_THRESHOLD_MASK The packet count threshold reached
|
|
* XDC_IXR_PKT_WAIT_BOUND_MASK The packet wait bound reached
|
|
* XDC_IXR_SG_DISABLE_ACK_MASK The scatter gather disable completed
|
|
* XDC_IXR_SG_END_MASK Current descriptor was the end of the list
|
|
* XDC_IXR_BD_MASK A buffer descriptor is done
|
|
*
|
|
* RETURN VALUE:
|
|
*
|
|
* None.
|
|
*
|
|
* NOTES:
|
|
*
|
|
* None.
|
|
*
|
|
******************************************************************************/
|
|
void
|
|
XDmaChannel_SetIntrEnable(XDmaChannel * InstancePtr, u32 Enable)
|
|
{
|
|
/* assert to verify input arguments except the enable which can't be
|
|
* asserted since all values are valid
|
|
*/
|
|
XASSERT_VOID(InstancePtr != NULL);
|
|
XASSERT_VOID(InstancePtr->IsReady == XCOMPONENT_IS_READY);
|
|
|
|
/* set the interrupt enable register to the specified value */
|
|
|
|
XIo_Out32(InstancePtr->RegBaseAddress + XDC_IE_REG_OFFSET, Enable);
|
|
}
|
|
|
|
/******************************************************************************
|
|
*
|
|
* FUNCTION:
|
|
*
|
|
* XDmaChannel_GetIntrEnable
|
|
*
|
|
* DESCRIPTION:
|
|
*
|
|
* This function gets the interrupt enable of the DMA channel. The
|
|
* interrupt enable contains flags which enable individual interrupts for the
|
|
* DMA channel. The definitions of each bit in the register match the definition
|
|
* of the bits in the interrupt status register.
|
|
*
|
|
* ARGUMENTS:
|
|
*
|
|
* InstancePtr contains a pointer to the DMA channel to operate on.
|
|
*
|
|
* RETURN VALUE:
|
|
*
|
|
* The interrupt enable of the DMA channel. One or more of the following values
|
|
* may be contained the register. Each of the values are unique bit masks.
|
|
*
|
|
* XDC_IXR_DMA_DONE_MASK The dma operation is done
|
|
* XDC_IXR_DMA_ERROR_MASK The dma operation had an error
|
|
* XDC_IXR_PKT_DONE_MASK A packet is complete
|
|
* XDC_IXR_PKT_THRESHOLD_MASK The packet count threshold reached
|
|
* XDC_IXR_PKT_WAIT_BOUND_MASK The packet wait bound reached
|
|
* XDC_IXR_SG_DISABLE_ACK_MASK The scatter gather disable completed
|
|
* XDC_IXR_BD_MASK A buffer descriptor is done
|
|
*
|
|
* NOTES:
|
|
*
|
|
* None.
|
|
*
|
|
******************************************************************************/
|
|
u32
|
|
XDmaChannel_GetIntrEnable(XDmaChannel * InstancePtr)
|
|
{
|
|
/* assert to verify input arguments */
|
|
|
|
XASSERT_NONVOID(InstancePtr != NULL);
|
|
XASSERT_NONVOID(InstancePtr->IsReady == XCOMPONENT_IS_READY);
|
|
|
|
/* return the contents of the interrupt enable register */
|
|
|
|
return XIo_In32(InstancePtr->RegBaseAddress + XDC_IE_REG_OFFSET);
|
|
}
|
|
|
|
/******************************************************************************
|
|
*
|
|
* FUNCTION:
|
|
*
|
|
* XDmaChannel_Transfer
|
|
*
|
|
* DESCRIPTION:
|
|
*
|
|
* This function starts the DMA channel transferring data from a memory source
|
|
* to a memory destination. This function only starts the operation and returns
|
|
* before the operation may be complete. If the interrupt is enabled, an
|
|
* interrupt will be generated when the operation is complete, otherwise it is
|
|
* necessary to poll the channel status to determine when it's complete. It is
|
|
* the responsibility of the caller to determine when the operation is complete
|
|
* by handling the generated interrupt or polling the status. It is also the
|
|
* responsibility of the caller to ensure that the DMA channel is not busy with
|
|
* another transfer before calling this function.
|
|
*
|
|
* ARGUMENTS:
|
|
*
|
|
* InstancePtr contains a pointer to the DMA channel to operate on.
|
|
*
|
|
* SourcePtr contains a pointer to the source memory where the data is to
|
|
* be tranferred from and must be 32 bit aligned.
|
|
*
|
|
* DestinationPtr contains a pointer to the destination memory where the data
|
|
* is to be transferred and must be 32 bit aligned.
|
|
*
|
|
* ByteCount contains the number of bytes to transfer during the DMA operation.
|
|
*
|
|
* RETURN VALUE:
|
|
*
|
|
* None.
|
|
*
|
|
* NOTES:
|
|
*
|
|
* The DMA h/w will not currently allow a non-local memory transfer to non-local
|
|
* memory (memory copy), but only allows a non-local memory to or from the device
|
|
* memory (typically a FIFO).
|
|
*
|
|
* It is the responsibility of the caller to ensure that the cache is
|
|
* flushed and invalidated both before and after the DMA operation completes
|
|
* if the memory pointed to is cached. The caller must also ensure that the
|
|
* pointers contain a physical address rather than a virtual address
|
|
* if address translation is being used.
|
|
*
|
|
******************************************************************************/
|
|
void
|
|
XDmaChannel_Transfer(XDmaChannel * InstancePtr,
|
|
u32 * SourcePtr, u32 * DestinationPtr, u32 ByteCount)
|
|
{
|
|
/* assert to verify input arguments and the alignment of any arguments
|
|
* which have expected alignments
|
|
*/
|
|
XASSERT_VOID(InstancePtr != NULL);
|
|
XASSERT_VOID(SourcePtr != NULL);
|
|
XASSERT_VOID(((u32) SourcePtr & 3) == 0);
|
|
XASSERT_VOID(DestinationPtr != NULL);
|
|
XASSERT_VOID(((u32) DestinationPtr & 3) == 0);
|
|
XASSERT_VOID(ByteCount != 0);
|
|
XASSERT_VOID(InstancePtr->IsReady == XCOMPONENT_IS_READY);
|
|
|
|
/* setup the source and destination address registers for the transfer */
|
|
|
|
XIo_Out32(InstancePtr->RegBaseAddress + XDC_SA_REG_OFFSET,
|
|
(u32) SourcePtr);
|
|
|
|
XIo_Out32(InstancePtr->RegBaseAddress + XDC_DA_REG_OFFSET,
|
|
(u32) DestinationPtr);
|
|
|
|
/* start the DMA transfer to copy from the source buffer to the
|
|
* destination buffer by writing the length to the length register
|
|
*/
|
|
XIo_Out32(InstancePtr->RegBaseAddress + XDC_LEN_REG_OFFSET, ByteCount);
|
|
}
|