|  | /****************************************************************************** | 
|  | * | 
|  | *     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); | 
|  | } |