axicdma: Add support for 64-bit addressing

This patch updates the driver to support 64-bit addressing.

Signed-off-by: Kedareswara rao Appana <appanad@xilinx.com>
Acked-by: Anirudha Sarangi   <anirudh@xilinx.com>
This commit is contained in:
Kedareswara rao Appana 2015-07-27 15:07:14 +05:30 committed by Nava kishore Manne
parent 60efc68c14
commit 1ebd52627f
10 changed files with 359 additions and 157 deletions

View file

@ -36,7 +36,7 @@ BEGIN driver axicdma
OPTION supported_peripherals = (axi_cdma_v[3-9]_[0-9][0-9]_[a-z] axi_cdma_v[3-9]_[0-9]);
OPTION driver_state = ACTIVE;
OPTION copyfiles = all;
OPTION VERSION = 3.0;
OPTION VERSION = 4.0;
OPTION NAME = axicdma;
END driver

View file

@ -31,9 +31,9 @@
##############################################################################
proc generate {drv_handle} {
::hsi::utils::define_include_file $drv_handle "xparameters.h" "XAxiCdma" "NUM_INSTANCES" "DEVICE_ID" "C_BASEADDR" "C_HIGHADDR" "C_INCLUDE_DRE" "C_USE_DATAMOVER_LITE" "C_M_AXI_DATA_WIDTH" "C_INCLUDE_SG" "C_M_AXI_MAX_BURST_LEN"
::hsi::utils::define_include_file $drv_handle "xparameters.h" "XAxiCdma" "NUM_INSTANCES" "DEVICE_ID" "C_BASEADDR" "C_HIGHADDR" "C_INCLUDE_DRE" "C_USE_DATAMOVER_LITE" "C_M_AXI_DATA_WIDTH" "C_INCLUDE_SG" "C_M_AXI_MAX_BURST_LEN" "C_ADDR_WIDTH"
::hsi::utils::define_config_file $drv_handle "xaxicdma_g.c" "XAxiCdma" "DEVICE_ID" "C_BASEADDR" "C_INCLUDE_DRE" "C_USE_DATAMOVER_LITE" "C_M_AXI_DATA_WIDTH" "C_M_AXI_MAX_BURST_LEN"
::hsi::utils::define_config_file $drv_handle "xaxicdma_g.c" "XAxiCdma" "DEVICE_ID" "C_BASEADDR" "C_INCLUDE_DRE" "C_USE_DATAMOVER_LITE" "C_M_AXI_DATA_WIDTH" "C_M_AXI_MAX_BURST_LEN" "C_ADDR_WIDTH"
::hsi::utils::define_canonical_xpars $drv_handle "xparameters.h" "AxiCdma" "DEVICE_ID" "C_BASEADDR" "C_HIGHADDR" "C_INCLUDE_DRE" "C_USE_DATAMOVER_LITE" "C_M_AXI_DATA_WIDTH" "C_INCLUDE_SG" "C_M_AXI_MAX_BURST_LEN"
::hsi::utils::define_canonical_xpars $drv_handle "xparameters.h" "AxiCdma" "DEVICE_ID" "C_BASEADDR" "C_HIGHADDR" "C_INCLUDE_DRE" "C_USE_DATAMOVER_LITE" "C_M_AXI_DATA_WIDTH" "C_INCLUDE_SG" "C_M_AXI_MAX_BURST_LEN" "C_ADDR_WIDTH"
}

View file

@ -96,6 +96,8 @@ extern void xil_printf(const char *format, ...);
#define MEMORY_BASE XPAR_AXI_7SDDR_0_S_AXI_BASEADDR
#elif XPAR_MIG7SERIES_0_BASEADDR
#define MEMORY_BASE XPAR_MIG7SERIES_0_BASEADDR
#elif XPAR_PSU_DDR_0_S_AXI_BASEADDR
#define MEMORY_BASE XPAR_PSU_DDR_0_S_AXI_BASEADDR
#else
#warning CHECK FOR THE VALID DDR ADDRESS IN XPARAMETERS.H, \
DEFAULT SET TO 0x01000000
@ -108,9 +110,8 @@ extern void xil_printf(const char *format, ...);
#define RX_BUFFER_BASE (MEMORY_BASE + 0x00660000)
#define RX_BUFFER_HIGH (MEMORY_BASE + 0x0068FFFF)
#define MAX_PKT_LEN 128
#define MARK_UNCACHEABLE 0x701
/* Number of BDs in the transfer example
* We show how to submit multiple BDs for one transmit.
@ -358,7 +359,7 @@ static int SetupTransfer(XAxiCdma * InstancePtr)
/* Flush the SrcBuffer before the DMA transfer, in case the Data Cache
* is enabled
*/
Xil_DCacheFlushRange((u32)TransmitBufferPtr,
Xil_DCacheFlushRange((UINTPTR)TransmitBufferPtr,
MAX_PKT_LEN * NUMBER_OF_BDS_TO_TRANSFER);
return XST_SUCCESS;
@ -384,8 +385,8 @@ static int DoTransfer(XAxiCdma * InstancePtr)
XAxiCdma_Bd *BdCurPtr;
int Status;
int Index;
u32 SrcBufferAddr;
u32 DstBufferAddr;
UINTPTR SrcBufferAddr;
UINTPTR DstBufferAddr;
Status = XAxiCdma_BdRingAlloc(InstancePtr,
NUMBER_OF_BDS_TO_TRANSFER, &BdPtr);
@ -395,8 +396,8 @@ static int DoTransfer(XAxiCdma * InstancePtr)
return XST_FAILURE;
}
SrcBufferAddr = (u32)TransmitBufferPtr;
DstBufferAddr = (u32)ReceiveBufferPtr;
SrcBufferAddr = (UINTPTR)TransmitBufferPtr;
DstBufferAddr = (UINTPTR)ReceiveBufferPtr;
BdCurPtr = BdPtr;
/* Set up the BDs
@ -470,7 +471,7 @@ static int CheckData(u8 *SrcPtr, u8 *DestPtr, int Length)
/* Invalidate the DestBuffer before receiving the data, in case the
* Data Cache is enabled
*/
Xil_DCacheInvalidateRange((u32)DestPtr, Length);
Xil_DCacheInvalidateRange((UINTPTR)DestPtr, Length);
for (Index = 0; Index < Length; Index++) {
if ( DestPtr[Index] != SrcPtr[Index]) {
@ -508,6 +509,10 @@ int XAxiCdma_SgPollExample(u16 DeviceId)
SrcPtr = (u8 *)TransmitBufferPtr;
DstPtr = (u8 *)ReceiveBufferPtr;
#ifdef __aarch64__
Xil_SetTlbAttributes(MEMORY_BASE, MARK_UNCACHEABLE);
#endif
/* Initialize the XAxiCdma device.
*/
CfgPtr = XAxiCdma_LookupConfig(DeviceId);

View file

@ -258,15 +258,15 @@ static int DoSimplePollTransfer(XAxiCdma *InstancePtr, int Length, int Retries)
/* Flush the SrcBuffer before the DMA transfer, in case the Data Cache
* is enabled
*/
Xil_DCacheFlushRange((u32)&SrcBuffer, Length);
Xil_DCacheFlushRange((UINTPTR)&SrcBuffer, Length);
/* Try to start the DMA transfer
*/
while (Retries) {
Retries -= 1;
Status = XAxiCdma_SimpleTransfer(InstancePtr, (u32)SrcBuffer,
(u32)DestBuffer, Length, NULL, NULL);
Status = XAxiCdma_SimpleTransfer(InstancePtr, (UINTPTR)SrcBuffer,
(UINTPTR)DestBuffer, Length, NULL, NULL);
if (Status == XST_SUCCESS) {
break;
}
@ -341,7 +341,9 @@ static int CheckData(u8 *SrcPtr, u8 *DestPtr, int Length)
/* Invalidate the DestBuffer before receiving the data, in case the
* Data Cache is enabled
*/
Xil_DCacheInvalidateRange((u32)DestPtr, Length);
#ifndef __aarch64__
Xil_DCacheInvalidateRange((UINTPTR)DestPtr, Length);
#endif
for (Index = 0; Index < Length; Index++) {
if ( DestPtr[Index] != SrcPtr[Index]) {

View file

@ -153,7 +153,7 @@ int XAxiCdma_ResetIsDone(XAxiCdma *InstancePtr)
* @note None.
*
*****************************************************************************/
int XAxiCdma_CfgInitialize(XAxiCdma *InstancePtr, XAxiCdma_Config *CfgPtr,
u32 XAxiCdma_CfgInitialize(XAxiCdma *InstancePtr, XAxiCdma_Config *CfgPtr,
u32 EffectiveAddr)
{
u32 RegValue;
@ -167,6 +167,7 @@ int XAxiCdma_CfgInitialize(XAxiCdma *InstancePtr, XAxiCdma_Config *CfgPtr,
InstancePtr->HasDRE = CfgPtr->HasDRE;
InstancePtr->IsLite = CfgPtr->IsLite;
InstancePtr->WordLength = ((unsigned int)CfgPtr->DataWidth) >> 3;
InstancePtr->AddrWidth = CfgPtr->AddrWidth;
/* AXI CDMA supports 32 bits data width and up
*/
@ -419,9 +420,8 @@ int XAxiCdma_SwitchMode(XAxiCdma *InstancePtr, int Mode)
/* Update the CDESC register, because the hardware is
* to start from the CDESC
*/
XAxiCdma_WriteReg(InstancePtr->BaseAddr,
XAXICDMA_CDESC_OFFSET,
(u32)InstancePtr->BdaRestart);
XAxiCdma_BdSetCurBdPtr(InstancePtr,
(UINTPTR)InstancePtr->BdaRestart);
return XST_SUCCESS;
}
@ -464,7 +464,7 @@ int XAxiCdma_SwitchMode(XAxiCdma *InstancePtr, int Mode)
* function to be NULL.
*
*****************************************************************************/
int XAxiCdma_SimpleTransfer(XAxiCdma *InstancePtr, u32 SrcAddr, u32 DstAddr,
u32 XAxiCdma_SimpleTransfer(XAxiCdma *InstancePtr, UINTPTR SrcAddr, UINTPTR DstAddr,
int Length, XAxiCdma_CallBackFn SimpleCallBack, void *CallBackRef)
{
u32 WordBits;
@ -533,9 +533,18 @@ int XAxiCdma_SimpleTransfer(XAxiCdma *InstancePtr, u32 SrcAddr, u32 DstAddr,
InstancePtr->SimpleCallBackRef = CallBackRef;
XAxiCdma_WriteReg(InstancePtr->BaseAddr, XAXICDMA_SRCADDR_OFFSET,
SrcAddr);
LOWER_32_BITS(SrcAddr));
if (InstancePtr->AddrWidth > 32)
XAxiCdma_WriteReg(InstancePtr->BaseAddr,
XAXICDMA_SRCADDR_MSB_OFFSET,
UPPER_32_BITS(SrcAddr));
XAxiCdma_WriteReg(InstancePtr->BaseAddr, XAXICDMA_DSTADDR_OFFSET,
DstAddr);
LOWER_32_BITS(DstAddr));
if (InstancePtr->AddrWidth > 32)
XAxiCdma_WriteReg(InstancePtr->BaseAddr,
XAXICDMA_DSTADDR_MSB_OFFSET,
UPPER_32_BITS(DstAddr));
/* Writing to the BTT register starts the transfer
*/
@ -676,12 +685,20 @@ void XAxiCdma_DumpRegisters(XAxiCdma *InstancePtr)
XAxiCdma_ReadReg(RegBase, XAXICDMA_SR_OFFSET));
xil_printf("Current BD register: %x\r\n",
XAxiCdma_ReadReg(RegBase, XAXICDMA_CDESC_OFFSET));
xil_printf("Current BD MSB register: %x\r\n",
XAxiCdma_ReadReg(RegBase, XAXICDMA_CDESC_MSB_OFFSET));
xil_printf("Tail BD register: %x\r\n",
XAxiCdma_ReadReg(RegBase, XAXICDMA_TDESC_OFFSET));
xil_printf("Tail BD MSB register: %x\r\n",
XAxiCdma_ReadReg(RegBase, XAXICDMA_TDESC_MSB_OFFSET));
xil_printf("Source Addr register: %x\r\n",
XAxiCdma_ReadReg(RegBase, XAXICDMA_SRCADDR_OFFSET));
xil_printf("Source Addr MSB register: %x\r\n",
XAxiCdma_ReadReg(RegBase, XAXICDMA_SRCADDR_MSB_OFFSET));
xil_printf("Destination Addr register: %x\r\n",
XAxiCdma_ReadReg(RegBase, XAXICDMA_DSTADDR_OFFSET));
xil_printf("Destination Addr MSB register: %x\r\n",
XAxiCdma_ReadReg(RegBase, XAXICDMA_DSTADDR_MSB_OFFSET));
xil_printf("BTT register: %x\r\n",
XAxiCdma_ReadReg(RegBase, XAXICDMA_BTT_OFFSET));

View file

@ -330,6 +330,7 @@
* Added logic to check if DDR is present in the test app
* tcl file. (CR 700806)
* 3.0 adk 19/12/13 Updated as per the New Tcl API's
* 4.0 adk 27/07/15 Added support for 64-bit Addressing.
* </pre>
*****************************************************************************/
@ -416,11 +417,12 @@ typedef struct {
*/
typedef struct {
u32 DeviceId; /**< Unique ID of this instance */
u32 BaseAddress; /**< Physical address of this instance */
UINTPTR BaseAddress; /**< Physical address of this instance */
int HasDRE; /**< Whether support unaligned transfers */
int IsLite; /**< Whether hardware build is lite mode */
int DataWidth; /**< Length of a word in bits */
int BurstLen; /**< Burst length */
int AddrWidth; /**< Address Width */
}XAxiCdma_Config;
/**
@ -432,7 +434,7 @@ typedef struct {
* @{
*/
typedef struct {
u32 BaseAddr; /**< Virtual base address of the DMA engine */
UINTPTR BaseAddr; /**< Virtual base address of the DMA engine */
int Initialized; /**< The driver/engine in working state */
int SimpleOnlyBuild; /**< Whether hardware is simple only build */
@ -444,9 +446,9 @@ typedef struct {
int SGWaiting; /**< Flag that SG transfers are waiting */
/* BD ring fields for SG transfer */
u32 FirstBdPhysAddr; /**< Physical address of 1st BD in list */
u32 FirstBdAddr; /**< Virtual address of 1st BD in list */
u32 LastBdAddr; /**< Virtual address of last BD in the list */
UINTPTR FirstBdPhysAddr; /**< Physical address of 1st BD in list */
UINTPTR FirstBdAddr; /**< Virtual address of 1st BD in list */
UINTPTR LastBdAddr; /**< Virtual address of last BD in the list */
u32 BdRingTotalLen; /**< Total size of ring in bytes */
u32 BdSeparation; /**< Distance between adjacent BDs in bytes */
XAxiCdma_Bd *FreeBdHead; /**< First BD in the free group */
@ -470,6 +472,7 @@ typedef struct {
int SgHandlerTail; /**< Last active sg transfer handler */
XAxiCdma_IntrHandlerList Handlers[XAXICDMA_MAXIMUM_MAX_HANDLER];
/**< List of interrupt handlers */
int AddrWidth; /**< Address Width */
}XAxiCdma;
/* @} */
@ -483,7 +486,10 @@ typedef struct {
* XCACHE_FLUSH_DCACHE_RANGE and XCACHE_INVALIDATE_DCACHE_RANGE macros are not
* implemented or they do nothing.
*****************************************************************************/
#ifdef __MICROBLAZE__
#ifdef __aarch64__
#define XAXICDMA_CACHE_FLUSH(BdPtr)
#define XAXICDMA_CACHE_INVALIDATE(BdPtr)
#elif __MICROBLAZE__
#ifdef XCACHE_FLUSH_DCACHE_RANGE
#define XAXICDMA_CACHE_FLUSH(BdPtr) \
XCACHE_FLUSH_DCACHE_RANGE((BdPtr), XAXICDMA_BD_HW_NUM_BYTES)
@ -512,7 +518,7 @@ typedef struct {
XAxiCdma_Config *XAxiCdma_LookupConfig(u32 DeviceId);
int XAxiCdma_CfgInitialize(XAxiCdma *InstancePtr, XAxiCdma_Config *CfgPtr,
u32 XAxiCdma_CfgInitialize(XAxiCdma *InstancePtr, XAxiCdma_Config *CfgPtr,
u32 EffectiveAddr);
void XAxiCdma_Reset(XAxiCdma *InstancePtr);
int XAxiCdma_ResetIsDone(XAxiCdma *InstancePtr);
@ -525,34 +531,36 @@ void XAxiCdma_IntrEnable(XAxiCdma *InstancePtr, u32 Mask);
u32 XAxiCdma_IntrGetEnabled(XAxiCdma *InstancePtr);
void XAxiCdma_IntrDisable(XAxiCdma *InstancePtr, u32 Mask);
void XAxiCdma_IntrHandler(void *HandlerRef);
int XAxiCdma_SimpleTransfer(XAxiCdma *InstancePtr, u32 SrcAddr, u32 DstAddr,
u32 XAxiCdma_SimpleTransfer(XAxiCdma *InstancePtr, UINTPTR SrcAddr, UINTPTR DstAddr,
int Length, XAxiCdma_CallBackFn SimpleCallBack, void *CallbackRef);
int XAxiCdma_SelectKeyHole(XAxiCdma *InstancePtr, u32 Direction, u32 Select);
/* BD ring API functions
*/
int XAxiCdma_BdRingCntCalc(u32 Alignment, u32 Bytes, u32 BuffAddr);
int XAxiCdma_BdRingMemCalc(u32 Alignment, int NumBd);
int XAxiCdma_BdRingGetCnt(XAxiCdma *InstancePtr);
int XAxiCdma_BdRingGetFreeCnt(XAxiCdma *InstancePtr);
u32 XAxiCdma_BdRingCntCalc(u32 Alignment, u32 Bytes, u32 BuffAddr);
u32 XAxiCdma_BdRingMemCalc(u32 Alignment, int NumBd);
u32 XAxiCdma_BdRingGetCnt(XAxiCdma *InstancePtr);
u32 XAxiCdma_BdRingGetFreeCnt(XAxiCdma *InstancePtr);
void XAxiCdma_BdRingSnapShotCurrBd(XAxiCdma *InstancePtr);
XAxiCdma_Bd *XAxiCdma_BdRingGetCurrBd(XAxiCdma *InstancePtr);
XAxiCdma_Bd *XAxiCdma_BdRingNext(XAxiCdma *InstancePtr, XAxiCdma_Bd *BdPtr);
XAxiCdma_Bd *XAxiCdma_BdRingPrev(XAxiCdma *InstancePtr, XAxiCdma_Bd *BdPtr);
int XAxiCdma_BdRingCreate(XAxiCdma *InstancePtr, u32 PhysAddr,
u32 VirtAddr, u32 Alignment, int BdCount);
int XAxiCdma_BdRingClone(XAxiCdma *InstancePtr, XAxiCdma_Bd * TemplateBdPtr);
int XAxiCdma_BdRingAlloc(XAxiCdma *InstancePtr, int NumBd,
LONG XAxiCdma_BdRingCreate(XAxiCdma *InstancePtr, UINTPTR PhysAddr,
UINTPTR VirtAddr, u32 Alignment, int BdCount);
LONG XAxiCdma_BdRingClone(XAxiCdma *InstancePtr, XAxiCdma_Bd * TemplateBdPtr);
LONG XAxiCdma_BdRingAlloc(XAxiCdma *InstancePtr, int NumBd,
XAxiCdma_Bd ** BdSetPtr);
int XAxiCdma_BdRingUnAlloc(XAxiCdma *InstancePtr, int NumBd,
LONG XAxiCdma_BdRingUnAlloc(XAxiCdma *InstancePtr, int NumBd,
XAxiCdma_Bd * BdSetPtr);
int XAxiCdma_BdRingToHw(XAxiCdma *InstancePtr, int NumBd,
LONG XAxiCdma_BdRingToHw(XAxiCdma *InstancePtr, int NumBd,
XAxiCdma_Bd * BdSetPtr, XAxiCdma_CallBackFn CallBack,
void *CallBackRef);
int XAxiCdma_BdRingFromHw(XAxiCdma *InstancePtr, int BdLimit,
u32 XAxiCdma_BdRingFromHw(XAxiCdma *InstancePtr, int BdLimit,
XAxiCdma_Bd ** BdSetPtr);
int XAxiCdma_BdRingFree(XAxiCdma *InstancePtr, int NumBd,
u32 XAxiCdma_BdRingFree(XAxiCdma *InstancePtr, int NumBd,
XAxiCdma_Bd * BdSetPtr);
void XAxiCdma_BdSetCurBdPtr(XAxiCdma *InstancePtr, UINTPTR CurBdPtr);
void XAxiCdma_BdSetTailBdPtr(XAxiCdma *InstancePtr, UINTPTR TailBdPtr);
/* Debug utility function
*/

View file

@ -51,6 +51,7 @@
/***************************** Include Files *********************************/
#include "xaxicdma.h"
#include "xaxicdma_bd.h"
#define XAXICDMA_PAGE_SIZE 0x1000
@ -71,7 +72,7 @@
*****************************************************************************/
void XAxiCdma_BdClear(XAxiCdma_Bd* BdPtr)
{
memset((void *)((u32)BdPtr + XAXICDMA_BD_START_CLEAR), 0,
memset((void *)((UINTPTR)BdPtr + XAXICDMA_BD_START_CLEAR), 0,
XAXICDMA_BD_TO_CLEAR);
return;
@ -92,8 +93,8 @@ void XAxiCdma_BdClear(XAxiCdma_Bd* BdPtr)
void XAxiCdma_BdClone(XAxiCdma_Bd *BdPtr, XAxiCdma_Bd *TmpBd)
{
memcpy((void *)((u32)BdPtr + XAXICDMA_BD_START_CLEAR),
(void *)((u32)TmpBd + XAXICDMA_BD_START_CLEAR),
memcpy((void *)((UINTPTR)BdPtr + XAXICDMA_BD_START_CLEAR),
(void *)((UINTPTR)TmpBd + XAXICDMA_BD_START_CLEAR),
XAXICDMA_BD_TO_CLEAR);
return;
@ -110,10 +111,17 @@ void XAxiCdma_BdClone(XAxiCdma_Bd *BdPtr, XAxiCdma_Bd *TmpBd)
* @note None.
*
*****************************************************************************/
u32 XAxiCdma_BdGetNextPtr(XAxiCdma_Bd* BdPtr)
LONG XAxiCdma_BdGetNextPtr(XAxiCdma_Bd* BdPtr)
{
u32 addrlen;
addrlen = XAxiCdma_BdGetAddrLength(BdPtr);
return (u32)(XAxiCdma_BdRead(BdPtr, XAXICDMA_BD_NDESC_OFFSET));
if (addrlen > 32) {
return (u64)((XAxiCdma_BdRead(BdPtr, XAXICDMA_BD_NDESC_OFFSET)) |
((uint64_t)(XAxiCdma_BdRead(BdPtr, XAXICDMA_BD_NDESC_MSB_OFFSET)) << 32U));
} else {
return (u32)(XAxiCdma_BdRead(BdPtr, XAXICDMA_BD_NDESC_OFFSET));
}
}
/*****************************************************************************/
@ -128,11 +136,16 @@ u32 XAxiCdma_BdGetNextPtr(XAxiCdma_Bd* BdPtr)
* @note None.
*
*****************************************************************************/
void XAxiCdma_BdSetNextPtr(XAxiCdma_Bd* BdPtr, u32 NextBdPtr)
void XAxiCdma_BdSetNextPtr(XAxiCdma_Bd* BdPtr, UINTPTR NextBdPtr)
{
u32 addrlen;
addrlen = XAxiCdma_BdGetAddrLength(BdPtr);
XAxiCdma_BdWrite(BdPtr, XAXICDMA_BD_NDESC_OFFSET, NextBdPtr);
XAxiCdma_BdWrite(BdPtr, XAXICDMA_BD_NDESC_OFFSET,
(NextBdPtr & XAXICDMA_DESC_LSB_MASK));
if (addrlen > 32)
XAxiCdma_BdWrite(BdPtr, XAXICDMA_BD_NDESC_MSB_OFFSET,
UPPER_32_BITS(NextBdPtr));
return;
}
@ -193,8 +206,10 @@ void XAxiCdma_BdClearSts(XAxiCdma_Bd* BdPtr)
* @note None.
*
*****************************************************************************/
int XAxiCdma_BdSetSrcBufAddr(XAxiCdma_Bd* BdPtr, u32 Addr)
u32 XAxiCdma_BdSetSrcBufAddr(XAxiCdma_Bd* BdPtr, UINTPTR Addr)
{
u32 addrlen;
addrlen = XAxiCdma_BdGetAddrLength(BdPtr);
if (XAxiCdma_BdRead(BdPtr, XAXICDMA_BD_HASDRE_OFFSET) == 0) {
@ -209,7 +224,10 @@ int XAxiCdma_BdSetSrcBufAddr(XAxiCdma_Bd* BdPtr, u32 Addr)
}
}
XAxiCdma_BdWrite(BdPtr, XAXICDMA_BD_BUFSRC_OFFSET, Addr);
XAxiCdma_BdWrite(BdPtr, XAXICDMA_BD_BUFSRC_OFFSET, LOWER_32_BITS(Addr));
if (addrlen > 32)
XAxiCdma_BdWrite(BdPtr, XAXICDMA_BD_BUFSRC_MSB_OFFSET,
UPPER_32_BITS(Addr));
return XST_SUCCESS;
}
@ -225,10 +243,17 @@ int XAxiCdma_BdSetSrcBufAddr(XAxiCdma_Bd* BdPtr, u32 Addr)
* @note None.
*
*****************************************************************************/
u32 XAxiCdma_BdGetSrcBufAddr(XAxiCdma_Bd* BdPtr)
LONG XAxiCdma_BdGetSrcBufAddr(XAxiCdma_Bd* BdPtr)
{
u32 addrlen;
addrlen = XAxiCdma_BdGetAddrLength(BdPtr);
return (u32)(XAxiCdma_BdRead(BdPtr, XAXICDMA_BD_BUFSRC_OFFSET));
if (addrlen > 32)
return (u64)((XAxiCdma_BdRead(BdPtr, XAXICDMA_BD_BUFSRC_OFFSET)) |
((uint64_t)(XAxiCdma_BdRead(BdPtr, XAXICDMA_BD_BUFSRC_MSB_OFFSET))
<< 32U));
else
return (u32)(XAxiCdma_BdRead(BdPtr, XAXICDMA_BD_BUFSRC_OFFSET));
}
/*****************************************************************************/
@ -246,8 +271,11 @@ u32 XAxiCdma_BdGetSrcBufAddr(XAxiCdma_Bd* BdPtr)
* @note None.
*
*****************************************************************************/
int XAxiCdma_BdSetDstBufAddr(XAxiCdma_Bd* BdPtr, u32 Addr)
u32 XAxiCdma_BdSetDstBufAddr(XAxiCdma_Bd* BdPtr, UINTPTR Addr)
{
u32 addrlen;
addrlen = XAxiCdma_BdGetAddrLength(BdPtr);
if (XAxiCdma_BdRead(BdPtr, XAXICDMA_BD_HASDRE_OFFSET) == 0) {
if (Addr &
@ -260,7 +288,10 @@ int XAxiCdma_BdSetDstBufAddr(XAxiCdma_Bd* BdPtr, u32 Addr)
}
}
XAxiCdma_BdWrite(BdPtr, XAXICDMA_BD_BUFDST_OFFSET, Addr);
XAxiCdma_BdWrite(BdPtr, XAXICDMA_BD_BUFDST_OFFSET, LOWER_32_BITS(Addr));
if (addrlen > 32)
XAxiCdma_BdWrite(BdPtr, XAXICDMA_BD_BUFDST_MSB_OFFSET,
UPPER_32_BITS(Addr));
return XST_SUCCESS;
}
@ -276,10 +307,16 @@ int XAxiCdma_BdSetDstBufAddr(XAxiCdma_Bd* BdPtr, u32 Addr)
* @note None
*
*****************************************************************************/
u32 XAxiCdma_BdGetDstBufAddr(XAxiCdma_Bd* BdPtr)
LONG XAxiCdma_BdGetDstBufAddr(XAxiCdma_Bd* BdPtr)
{
u32 addrlen;
addrlen = XAxiCdma_BdGetAddrLength(BdPtr);
return (u32)(XAxiCdma_BdRead(BdPtr, XAXICDMA_BD_BUFDST_OFFSET));
if (addrlen > 32)
return (u64) (XAxiCdma_BdRead(BdPtr, XAXICDMA_BD_BUFDST_OFFSET) |
((uint64_t)(XAxiCdma_BdRead(BdPtr, XAXICDMA_BD_BUFDST_MSB_OFFSET)) << 32U));
else
return (u32)(XAxiCdma_BdRead(BdPtr, XAXICDMA_BD_BUFDST_OFFSET));
}
/*****************************************************************************/
@ -300,7 +337,7 @@ u32 XAxiCdma_BdGetDstBufAddr(XAxiCdma_Bd* BdPtr)
* slave error if the hardware is built in lite mode.
*
*****************************************************************************/
int XAxiCdma_BdSetLength(XAxiCdma_Bd* BdPtr, int LenBytes)
u32 XAxiCdma_BdSetLength(XAxiCdma_Bd* BdPtr, int LenBytes)
{
int MaxLen;
@ -326,7 +363,7 @@ int XAxiCdma_BdSetLength(XAxiCdma_Bd* BdPtr, int LenBytes)
* @note None
*
*****************************************************************************/
int XAxiCdma_BdGetLength(XAxiCdma_Bd* BdPtr)
u32 XAxiCdma_BdGetLength(XAxiCdma_Bd* BdPtr)
{
return (u32)(XAxiCdma_BdRead(BdPtr, XAXICDMA_BD_CTRL_LEN_OFFSET));
@ -344,10 +381,15 @@ int XAxiCdma_BdGetLength(XAxiCdma_Bd* BdPtr)
* @note None
*
*****************************************************************************/
void XAxiCdma_BdSetPhysAddr(XAxiCdma_Bd* BdPtr, u32 PhysAddr)
void XAxiCdma_BdSetPhysAddr(XAxiCdma_Bd* BdPtr, UINTPTR PhysAddr)
{
u32 addrlen;
addrlen = XAxiCdma_BdGetAddrLength(BdPtr);
XAxiCdma_BdWrite(BdPtr, XAXICDMA_BD_PHYS_ADDR_OFFSET, PhysAddr);
if (addrlen > 32)
XAxiCdma_BdWrite(BdPtr, XAXICDMA_BD_PHYS_ADDR_MSB_OFFSET,
UPPER_32_BITS(PhysAddr));
return;
}
@ -443,10 +485,17 @@ void XAxiCdma_BdSetMaxLen(XAxiCdma_Bd* BdPtr, int MaxLen)
* @note None
*
*****************************************************************************/
u32 XAxiCdma_BdGetPhysAddr(XAxiCdma_Bd* BdPtr)
LONG XAxiCdma_BdGetPhysAddr(XAxiCdma_Bd* BdPtr)
{
u32 addrlen;
addrlen = XAxiCdma_BdGetAddrLength(BdPtr);
return (u32)(XAxiCdma_BdRead(BdPtr, XAXICDMA_BD_PHYS_ADDR_OFFSET));
if (addrlen > 32)
return (u64)((XAxiCdma_BdRead(BdPtr, XAXICDMA_BD_PHYS_ADDR_OFFSET)) |
((uint64_t)(XAxiCdma_BdRead(BdPtr, XAXICDMA_BD_PHYS_ADDR_MSB_OFFSET))
<< 32U));
else
return (u32)(XAxiCdma_BdRead(BdPtr, XAXICDMA_BD_PHYS_ADDR_OFFSET));
}
/*****************************************************************************/
@ -462,7 +511,7 @@ u32 XAxiCdma_BdGetPhysAddr(XAxiCdma_Bd* BdPtr)
*****************************************************************************/
void XAxiCdma_DumpBd(XAxiCdma_Bd* BdPtr)
{
xil_printf("\r\nDump BD %x:\r\n", (unsigned int)BdPtr);
xil_printf("\r\nDump BD %x:\r\n", (UINTPTR)BdPtr);
xil_printf("Next BD ptr \t%x\r\n",
(unsigned int)XAxiCdma_BdGetNextPtr(BdPtr));

View file

@ -71,19 +71,20 @@ extern "C" {
* inside a BD:
*
* u32 NextBdPtr;
* u32 Pad1; -- This is always 0
* u32 NextBdPtrMsb;
* u32 SrcAddr;
* u32 Pad2; -- This is always 0
* u32 SrcAddrMsb;
* u32 DstAddr;
* u32 Pad3; -- This is always 0
* u32 DstAddrMsb;
* int Length;
* u32 Status;
* u32 PhysAddr;
* u32 IsLite;
* u32 HasDRE;
* u32 WordLen;
* u32 Addrlen;
*/
typedef u32 XAxiCdma_Bd[XAXICDMA_BD_NUM_WORDS];
typedef UINTPTR XAxiCdma_Bd[XAXICDMA_BD_NUM_WORDS];
/**************************** Macros (Inline Functions) Definitions **********/
@ -95,7 +96,7 @@ typedef u32 XAxiCdma_Bd[XAXICDMA_BD_NUM_WORDS];
* u32 XAxiCdma_BdRead(XAxiCdma_Bd* BdPtr, int Offset);
*****************************************************************************/
#define XAxiCdma_BdRead(BdPtr, Offset) \
*(u32 *)((u32)(BdPtr) + (u32)(Offset))
(*(u32 *)((UINTPTR)((void *)(BdPtr)) + (u32)(Offset)))
/*****************************************************************************/
/* Macros to write to a word in a BD
@ -105,29 +106,57 @@ typedef u32 XAxiCdma_Bd[XAXICDMA_BD_NUM_WORDS];
* u32 XAxiCdma_BdWrite(XAxiCdma_Bd* BdPtr, int Offset, u32 Value )
*****************************************************************************/
#define XAxiCdma_BdWrite(BdPtr, Offset, Value) \
*(u32 *)((u32)(BdPtr) + (u32)(Offset)) = (u32)(Value)
(*(u32 *)((UINTPTR)(void *)(BdPtr) + (u32)(Offset))) = (u32)(Value)
/*****************************************************************************/
/* Set the Addrelen field of the BD.
*
* @param BdPtr is the BD to operate on
* @param Addrlen is the Address width of the CDMA
*
* @note
* C-style signature:
* u32 XAxiCdma_BdSetAddrLen(XAxiCdma_Bd* BdPtr, int AddrLen)
*****************************************************************************/
#define XAxiCdma_BdSetAddrLen(BdPtr, AddrLen) \
XAxiCdma_BdWrite(BdPtr, XAXICDMA_BD_ADDRLEN_OFFSET, AddrLen);
/*****************************************************************************/
/* Get the BD's Address length
*
* @param BdPtr is the BD to operate on
*
* @return None
*
* @note
* C-style signature:
* u32 XAxiCdma_BdGetAddrLength(XAxiCdma_Bd* BdPtr)
*
*****************************************************************************/
#define XAxiCdma_BdGetAddrLength(BdPtr) \
XAxiCdma_BdRead(BdPtr, XAXICDMA_BD_ADDRLEN_OFFSET);
/************************** Function Prototypes ******************************/
void XAxiCdma_BdClear(XAxiCdma_Bd *BdPtr);
void XAxiCdma_BdClone(XAxiCdma_Bd *BdPtr, XAxiCdma_Bd *TmpBd);
u32 XAxiCdma_BdGetNextPtr(XAxiCdma_Bd *BdPtr);
void XAxiCdma_BdSetNextPtr(XAxiCdma_Bd *BdPtr, u32 NextBdPtr);
LONG XAxiCdma_BdGetNextPtr(XAxiCdma_Bd *BdPtr);
void XAxiCdma_BdSetNextPtr(XAxiCdma_Bd *BdPtr, UINTPTR NextBdPtr);
u32 XAxiCdma_BdGetSts(XAxiCdma_Bd *BdPtr);
void XAxiCdma_BdClearSts(XAxiCdma_Bd *BdPtr);
int XAxiCdma_BdSetSrcBufAddr(XAxiCdma_Bd *BdPtr, u32 Addr);
u32 XAxiCdma_BdGetSrcBufAddr(XAxiCdma_Bd *BdPtr);
int XAxiCdma_BdSetDstBufAddr(XAxiCdma_Bd *BdPtr, u32 Addr);
u32 XAxiCdma_BdGetDstBufAddr(XAxiCdma_Bd *BdPtr);
int XAxiCdma_BdSetLength(XAxiCdma_Bd *BdPtr, int LenBytes);
int XAxiCdma_BdGetLength(XAxiCdma_Bd *BdPtr);
void XAxiCdma_BdSetPhysAddr(XAxiCdma_Bd *BdPtr, u32 PhysAddr);
u32 XAxiCdma_BdSetSrcBufAddr(XAxiCdma_Bd *BdPtr, UINTPTR Addr);
LONG XAxiCdma_BdGetSrcBufAddr(XAxiCdma_Bd *BdPtr);
u32 XAxiCdma_BdSetDstBufAddr(XAxiCdma_Bd *BdPtr, UINTPTR Addr);
LONG XAxiCdma_BdGetDstBufAddr(XAxiCdma_Bd *BdPtr);
u32 XAxiCdma_BdSetLength(XAxiCdma_Bd *BdPtr, int LenBytes);
u32 XAxiCdma_BdGetLength(XAxiCdma_Bd *BdPtr);
void XAxiCdma_BdSetPhysAddr(XAxiCdma_Bd *BdPtr, UINTPTR PhysAddr);
void XAxiCdma_BdSetIsLite(XAxiCdma_Bd *BdPtr, int IsLite);
void XAxiCdma_BdSetHasDRE(XAxiCdma_Bd *BdPtr, int HasDRE);
void XAxiCdma_BdSetWordLen(XAxiCdma_Bd *BdPtr, int WordLen);
void XAxiCdma_BdSetMaxLen(XAxiCdma_Bd *BdPtr, int MaxLen);
u32 XAxiCdma_BdGetPhysAddr(XAxiCdma_Bd *BdPtr);
LONG XAxiCdma_BdGetPhysAddr(XAxiCdma_Bd *BdPtr);
void XAxiCdma_DumpBd(XAxiCdma_Bd* BdPtr);

View file

@ -73,14 +73,14 @@
*****************************************************************************/
#define XAXICDMA_RING_SEEKAHEAD(InstancePtr, BdPtr, NumBd) \
{ \
u32 Addr = (u32)(BdPtr); \
UINTPTR Addr = (UINTPTR)(void *)(BdPtr); \
\
Addr += ((InstancePtr)->BdSeparation * (NumBd)); \
if (Addr > (InstancePtr)->LastBdAddr) { \
Addr -= (InstancePtr)->BdRingTotalLen; \
} \
\
(BdPtr) = (XAxiCdma_Bd*)Addr; \
(BdPtr) = (XAxiCdma_Bd *)(void *)Addr; \
}
/******************************************************************************
@ -100,14 +100,14 @@
*****************************************************************************/
#define XAXICDMA_RING_SEEKBACK(InstancePtr, BdPtr, NumBd) \
{ \
u32 Addr = (u32)(BdPtr); \
UINTPTR Addr = (UINTPTR)(void *)(BdPtr); \
\
Addr -= ((InstancePtr)->BdSeparation * (NumBd)); \
if (Addr < (InstancePtr)->FirstBdAddr) { \
Addr += (InstancePtr)->BdRingTotalLen; \
} \
\
(BdPtr) = (XAxiCdma_Bd*)Addr; \
(BdPtr) = (XAxiCdma_Bd*)(void *)Addr; \
}
/*****************************************************************************/
@ -129,7 +129,7 @@
* it to this function.
*
*****************************************************************************/
int XAxiCdma_BdRingCntCalc(u32 Alignment, u32 Bytes, u32 BdBuffAddr)
u32 XAxiCdma_BdRingCntCalc(u32 Alignment, u32 Bytes, u32 BdBuffAddr)
{
/* The buffer alignment has to be taken account of. An unaligned buffer
@ -141,7 +141,7 @@ int XAxiCdma_BdRingCntCalc(u32 Alignment, u32 Bytes, u32 BdBuffAddr)
return 0;
}
return ((int)(Bytes) / ((sizeof(XAxiCdma_Bd) + (Alignment - 1)) &
return ((uint32_t)(Bytes) / ((sizeof(XAxiCdma_Bd) + (Alignment - 1)) &
~(Alignment - 1)));
}
@ -158,12 +158,56 @@ int XAxiCdma_BdRingCntCalc(u32 Alignment, u32 Bytes, u32 BdBuffAddr)
* @note None.
*
*****************************************************************************/
int XAxiCdma_BdRingMemCalc(u32 Alignment, int NumBd)
u32 XAxiCdma_BdRingMemCalc(u32 Alignment, int NumBd)
{
return (int)(((sizeof(XAxiCdma_Bd) + (Alignment - 1)) &
return (uint32_t)(((sizeof(XAxiCdma_Bd) + (Alignment - 1)) &
~(Alignment - 1)) * NumBd);
}
/*****************************************************************************/
/**
* This function set the Current BD ptr of a BD
*
* @param BdPtr is the pointer to the BD to set the Next BD ptr
* @param CurBdPtr is the valud of Current BD ptr
*
* @return None
*
* @note None.
*
*****************************************************************************/
void XAxiCdma_BdSetCurBdPtr(XAxiCdma *InstancePtr, UINTPTR CurBdPtr)
{
XAxiCdma_WriteReg(InstancePtr->BaseAddr, XAXICDMA_CDESC_OFFSET,
(CurBdPtr & XAXICDMA_DESC_LSB_MASK));
if (InstancePtr->AddrWidth > 32)
XAxiCdma_WriteReg(InstancePtr->BaseAddr, XAXICDMA_CDESC_MSB_OFFSET,
UPPER_32_BITS(CurBdPtr));
return;
}
/*****************************************************************************/
/**
* This function grabs a copy of the current BD pointer from the hardware.
*
* @param InstancePtr is the driver instance we are working on
*
* @return The BD pointer in CDESC register
*
* @note None.
*
*****************************************************************************/
XAxiCdma_Bd *XAxiCdma_BdRingGetCurrBd(XAxiCdma *InstancePtr)
{
if (InstancePtr->AddrWidth > 32) {
return (XAxiCdma_Bd *)((XAxiCdma_BdRead(InstancePtr->BaseAddr, XAXICDMA_CDESC_OFFSET)) |
((uint64_t)(XAxiCdma_BdRead(InstancePtr->BaseAddr, XAXICDMA_CDESC_MSB_OFFSET)) << 32U));
} else {
return (XAxiCdma_Bd *)(UINTPTR)(XAxiCdma_BdRead(InstancePtr->BaseAddr, XAXICDMA_CDESC_OFFSET));
}
}
/*****************************************************************************/
/**
* This function gets the total number of BDs in the BD ring.
@ -175,9 +219,9 @@ int XAxiCdma_BdRingMemCalc(u32 Alignment, int NumBd)
* @note None.
*
*****************************************************************************/
int XAxiCdma_BdRingGetCnt(XAxiCdma *InstancePtr)
u32 XAxiCdma_BdRingGetCnt(XAxiCdma *InstancePtr)
{
return InstancePtr->AllBdCnt;
return (uint32_t)InstancePtr->AllBdCnt;
}
/*****************************************************************************/
@ -191,7 +235,7 @@ int XAxiCdma_BdRingGetCnt(XAxiCdma *InstancePtr)
* @note None.
*
*****************************************************************************/
int XAxiCdma_BdRingGetFreeCnt(XAxiCdma *InstancePtr)
u32 XAxiCdma_BdRingGetFreeCnt(XAxiCdma *InstancePtr)
{
return InstancePtr->FreeBdCnt;
}
@ -213,9 +257,7 @@ void XAxiCdma_BdRingSnapShotCurrBd(XAxiCdma *InstancePtr)
{
XAxiCdma_Bd *BdPtr;
BdPtr = (XAxiCdma_Bd *)XAxiCdma_ReadReg(InstancePtr->BaseAddr,
XAXICDMA_CDESC_OFFSET);
BdPtr = XAxiCdma_BdRingGetCurrBd(InstancePtr);
InstancePtr->BdaRestart = XAxiCdma_BdRingNext(InstancePtr, BdPtr);
@ -224,21 +266,27 @@ void XAxiCdma_BdRingSnapShotCurrBd(XAxiCdma *InstancePtr)
/*****************************************************************************/
/**
* This function grabs a copy of the current BD pointer from the hardware.
* This function set the Tail BD ptr of a BD
*
* @param InstancePtr is the driver instance we are working on
* @param BdPtr is the pointer to the BD to set the Next BD ptr
* @param Tail Bd is the value of Tail BD ptr
*
* @return The BD pointer in CDESC register
* @return None
*
* @note None.
* @note None.
*
*****************************************************************************/
XAxiCdma_Bd *XAxiCdma_BdRingGetCurrBd(XAxiCdma *InstancePtr)
void XAxiCdma_BdSetTailBdPtr(XAxiCdma *InstancePtr, UINTPTR TailBdPtr)
{
return (XAxiCdma_Bd *)XAxiCdma_ReadReg(InstancePtr->BaseAddr,
XAXICDMA_CDESC_OFFSET);
XAxiCdma_WriteReg(InstancePtr->BaseAddr, XAXICDMA_TDESC_OFFSET,
TailBdPtr & XAXICDMA_DESC_LSB_MASK);
if (InstancePtr->AddrWidth > 32)
XAxiCdma_WriteReg(InstancePtr->BaseAddr, XAXICDMA_TDESC_MSB_OFFSET,
UPPER_32_BITS(TailBdPtr));
return;
}
/*****************************************************************************/
/**
* This function gets the next BD of the current BD on the BD ring.
@ -254,31 +302,31 @@ XAxiCdma_Bd *XAxiCdma_BdRingGetCurrBd(XAxiCdma *InstancePtr)
*****************************************************************************/
XAxiCdma_Bd *XAxiCdma_BdRingNext(XAxiCdma *InstancePtr, XAxiCdma_Bd *BdPtr)
{
u32 ReturnBd;
UINTPTR ReturnBd;
/* Check whether the BD ptr is valid
* A BD ptr is not valid if:
* - It is outside of the BD memory range
* - It has invalid alignment
*/
if (((u32)BdPtr > InstancePtr->LastBdAddr) ||
((u32)BdPtr < InstancePtr->FirstBdAddr) ||
((u32)BdPtr & (InstancePtr->BdSeparation - 1))) {
if (((UINTPTR)BdPtr > InstancePtr->LastBdAddr) ||
((UINTPTR)BdPtr < InstancePtr->FirstBdAddr) ||
((UINTPTR)BdPtr & (InstancePtr->BdSeparation - 1))) {
xdbg_printf(XDBG_DEBUG_ERROR, "Invalid BdPtr %x: %x/%x/%x\r\n",
(unsigned int)BdPtr, (unsigned int)InstancePtr->FirstBdAddr,
(unsigned int)InstancePtr->LastBdAddr,
(UINTPTR)BdPtr, (UINTPTR)InstancePtr->FirstBdAddr,
(UINTPTR)InstancePtr->LastBdAddr,
(unsigned int)XAXICDMA_BD_MINIMUM_ALIGNMENT);
ReturnBd = 0x0;
}
/* If the current BD is the last BD in the ring, return the first BD
*/
else if ((u32)BdPtr == InstancePtr->LastBdAddr) {
else if ((UINTPTR)BdPtr == InstancePtr->LastBdAddr) {
ReturnBd = InstancePtr->FirstBdAddr;
}
else {
ReturnBd = (u32)BdPtr + InstancePtr->BdSeparation;
ReturnBd = (UINTPTR)BdPtr + InstancePtr->BdSeparation;
}
return (XAxiCdma_Bd *)ReturnBd;
@ -298,31 +346,31 @@ XAxiCdma_Bd *XAxiCdma_BdRingNext(XAxiCdma *InstancePtr, XAxiCdma_Bd *BdPtr)
*****************************************************************************/
XAxiCdma_Bd *XAxiCdma_BdRingPrev(XAxiCdma *InstancePtr, XAxiCdma_Bd *BdPtr)
{
u32 ReturnBd;
UINTPTR ReturnBd;
/* Check whether the BD ptr is valid
* A BD ptr is not valid if:
* - It is outside of the BD memory range
* - It has invalid alignment
*/
if (((u32)BdPtr > InstancePtr->LastBdAddr) ||
((u32)BdPtr < InstancePtr->FirstBdAddr) ||
((u32)BdPtr & (InstancePtr->BdSeparation - 1))) {
if (((UINTPTR)BdPtr > InstancePtr->LastBdAddr) ||
((UINTPTR)BdPtr < InstancePtr->FirstBdAddr) ||
((UINTPTR)BdPtr & (InstancePtr->BdSeparation - 1))) {
xdbg_printf(XDBG_DEBUG_ERROR, "Invalid BdPtr %x: %x/%x/%x\r\n",
(unsigned int)BdPtr, (unsigned int)InstancePtr->FirstBdAddr,
(unsigned int)InstancePtr->LastBdAddr,
(UINTPTR)BdPtr, (UINTPTR)InstancePtr->FirstBdAddr,
(UINTPTR)InstancePtr->LastBdAddr,
(unsigned int)XAXICDMA_BD_MINIMUM_ALIGNMENT);
ReturnBd = 0x0;
}
/* If the current BD is the first BD in the ring, return the last BD
*/
else if ((u32)BdPtr == InstancePtr->FirstBdAddr) {
else if ((UINTPTR)BdPtr == InstancePtr->FirstBdAddr) {
ReturnBd = InstancePtr->LastBdAddr;
}
else {
ReturnBd = (u32)BdPtr - InstancePtr->BdSeparation;
ReturnBd = (UINTPTR)BdPtr - InstancePtr->BdSeparation;
}
return (XAxiCdma_Bd *)ReturnBd;
@ -349,12 +397,12 @@ XAxiCdma_Bd *XAxiCdma_BdRingPrev(XAxiCdma *InstancePtr, XAxiCdma_Bd *BdPtr)
* and the VirtAddr are the same.
*
*****************************************************************************/
int XAxiCdma_BdRingCreate(XAxiCdma *InstancePtr, u32 PhysAddr,
u32 VirtAddr, u32 Alignment, int BdCount)
LONG XAxiCdma_BdRingCreate(XAxiCdma *InstancePtr, UINTPTR PhysAddr,
UINTPTR VirtAddr, u32 Alignment, int BdCount)
{
u32 BdVirtAddr;
u32 BdNxtPhysAddr;
u32 BdPhysAddr;
UINTPTR BdVirtAddr;
UINTPTR BdNxtPhysAddr;
UINTPTR BdPhysAddr;
int Index;
if (InstancePtr->SimpleOnlyBuild) {
@ -438,7 +486,8 @@ int XAxiCdma_BdRingCreate(XAxiCdma *InstancePtr, u32 PhysAddr,
BdPhysAddr = PhysAddr;
for (Index = 1; Index < BdCount; Index++) {
XAxiCdma_BdSetAddrLen((XAxiCdma_Bd *)BdVirtAddr,
InstancePtr->AddrWidth);
XAxiCdma_BdSetNextPtr((XAxiCdma_Bd *)BdVirtAddr, BdNxtPhysAddr);
XAxiCdma_BdSetPhysAddr((XAxiCdma_Bd *)BdVirtAddr, BdPhysAddr);
XAxiCdma_BdSetIsLite((XAxiCdma_Bd *)BdVirtAddr,
@ -459,6 +508,8 @@ int XAxiCdma_BdRingCreate(XAxiCdma *InstancePtr, u32 PhysAddr,
/* At the end of the ring, link the last BD back to the top,
* and set its fields
*/
XAxiCdma_BdSetAddrLen((XAxiCdma_Bd *)BdVirtAddr,
InstancePtr->AddrWidth);
XAxiCdma_BdSetNextPtr((XAxiCdma_Bd *)BdVirtAddr, PhysAddr);
XAxiCdma_BdSetPhysAddr((XAxiCdma_Bd *)BdVirtAddr, BdPhysAddr);
XAxiCdma_BdSetIsLite((XAxiCdma_Bd *)BdVirtAddr,
@ -478,14 +529,14 @@ int XAxiCdma_BdRingCreate(XAxiCdma *InstancePtr, u32 PhysAddr,
InstancePtr->FirstBdAddr + InstancePtr->BdSeparation;
InstancePtr->AllBdCnt = BdCount;
InstancePtr->FreeBdCnt = BdCount;
InstancePtr->FreeBdHead = (XAxiCdma_Bd *) VirtAddr;
InstancePtr->FreeBdHead = (XAxiCdma_Bd *) (void *)VirtAddr;
InstancePtr->PreBdHead = (XAxiCdma_Bd *) VirtAddr;
InstancePtr->HwBdHead = (XAxiCdma_Bd *) VirtAddr;
InstancePtr->HwBdTail = (XAxiCdma_Bd *) VirtAddr;
InstancePtr->PostBdHead = (XAxiCdma_Bd *) VirtAddr;
InstancePtr->BdaRestart = (XAxiCdma_Bd *) PhysAddr;
InstancePtr->BdaRestart = (XAxiCdma_Bd *) (void *)PhysAddr;
return XST_SUCCESS;
return (XST_SUCCESS);
}
/*****************************************************************************/
@ -505,10 +556,10 @@ int XAxiCdma_BdRingCreate(XAxiCdma *InstancePtr, u32 PhysAddr,
* @note None.
*
*****************************************************************************/
int XAxiCdma_BdRingClone(XAxiCdma *InstancePtr, XAxiCdma_Bd * TemplateBdPtr)
LONG XAxiCdma_BdRingClone(XAxiCdma *InstancePtr, XAxiCdma_Bd * TemplateBdPtr)
{
int Index;
u32 CurBd;
UINTPTR CurBd;
XAxiCdma_Bd TmpBd;
/* Can't do this function if there isn't a ring */
@ -574,7 +625,7 @@ int XAxiCdma_BdRingClone(XAxiCdma *InstancePtr, XAxiCdma_Bd * TemplateBdPtr)
* @note None.
*
*****************************************************************************/
int XAxiCdma_BdRingAlloc(XAxiCdma *InstancePtr, int NumBd,
LONG XAxiCdma_BdRingAlloc(XAxiCdma *InstancePtr, int NumBd,
XAxiCdma_Bd ** BdSetPtr)
{
if (NumBd <= 0) {
@ -615,7 +666,7 @@ int XAxiCdma_BdRingAlloc(XAxiCdma *InstancePtr, int NumBd,
* @note None.
*
*****************************************************************************/
int XAxiCdma_BdRingUnAlloc(XAxiCdma *InstancePtr, int NumBd,
LONG XAxiCdma_BdRingUnAlloc(XAxiCdma *InstancePtr, int NumBd,
XAxiCdma_Bd * BdSetPtr)
{
XAxiCdma_Bd *TmpBd;
@ -719,7 +770,7 @@ static void StubCallBackFn(void *CallBackRef, u32 IrqMask, int *NumBdPtr)
* @note None.
*
*****************************************************************************/
int XAxiCdma_BdRingToHw(XAxiCdma *InstancePtr, int NumBd,
LONG XAxiCdma_BdRingToHw(XAxiCdma *InstancePtr, int NumBd,
XAxiCdma_Bd *BdSetPtr, XAxiCdma_CallBackFn CallBackFn,
void *CallBackRef)
{
@ -780,7 +831,7 @@ int XAxiCdma_BdRingToHw(XAxiCdma *InstancePtr, int NumBd,
if (XAxiCdma_BdGetLength(CurBdPtr) == 0) {
xdbg_printf(XDBG_DEBUG_ERROR,
"0 length bd %x\r\n", (unsigned int)CurBdPtr);
"0 length bd %x\r\n", (UINTPTR)CurBdPtr);
return XST_INVALID_PARAM;
}
@ -788,7 +839,7 @@ int XAxiCdma_BdRingToHw(XAxiCdma *InstancePtr, int NumBd,
XAxiCdma_BdClearSts(CurBdPtr);
/* Flush the current BD so DMA core could see the updates */
XAXICDMA_CACHE_FLUSH((unsigned int)CurBdPtr);
XAXICDMA_CACHE_FLUSH((UINTPTR)CurBdPtr);
CurBdPtr = XAxiCdma_BdRingNext(InstancePtr, CurBdPtr);
}
@ -853,8 +904,9 @@ int XAxiCdma_BdRingToHw(XAxiCdma *InstancePtr, int NumBd,
/* The hardware is in SG mode, update the tail BD pointer register
* so that hardware will process the transfer
*/
XAxiCdma_WriteReg(InstancePtr->BaseAddr, XAXICDMA_TDESC_OFFSET,
XAxiCdma_BdGetPhysAddr((XAxiCdma_Bd *)InstancePtr->HwBdTail));
XAxiCdma_BdSetTailBdPtr(InstancePtr,
XAxiCdma_BdGetPhysAddr((XAxiCdma_Bd *)InstancePtr->HwBdTail));
return XST_SUCCESS;
}
@ -872,7 +924,7 @@ int XAxiCdma_BdRingToHw(XAxiCdma *InstancePtr, int NumBd,
* @note None.
*
*****************************************************************************/
int XAxiCdma_BdRingFromHw(XAxiCdma *InstancePtr, int BdLimit,
u32 XAxiCdma_BdRingFromHw(XAxiCdma *InstancePtr, int BdLimit,
XAxiCdma_Bd ** BdSetPtr)
{
XAxiCdma_Bd *CurBdPtr;
@ -903,7 +955,7 @@ int XAxiCdma_BdRingFromHw(XAxiCdma *InstancePtr, int BdLimit,
*/
while (BdCount < BdLimit) {
/* Read the status */
XAXICDMA_CACHE_INVALIDATE((unsigned int)CurBdPtr);
XAXICDMA_CACHE_INVALIDATE((UINTPTR)CurBdPtr);
BdSts = XAxiCdma_BdGetSts(CurBdPtr);
/* If the hardware still hasn't processed this BD then we are
@ -961,7 +1013,7 @@ int XAxiCdma_BdRingFromHw(XAxiCdma *InstancePtr, int BdLimit,
* @note None.
*
*****************************************************************************/
int XAxiCdma_BdRingFree(XAxiCdma *InstancePtr, int NumBd,
u32 XAxiCdma_BdRingFree(XAxiCdma *InstancePtr, int NumBd,
XAxiCdma_Bd * BdSetPtr)
{
if (NumBd < 0) {
@ -985,8 +1037,8 @@ int XAxiCdma_BdRingFree(XAxiCdma *InstancePtr, int NumBd,
xdbg_printf(XDBG_DEBUG_ERROR, "BdRingFree: Error free BDs: "
"post count %d to free %d, PostBdHead %x to free ptr %x\r\n",
InstancePtr->PostBdCnt, NumBd,
(unsigned int)InstancePtr->PostBdHead,
(unsigned int)BdSetPtr);
(UINTPTR)InstancePtr->PostBdHead,
(UINTPTR)BdSetPtr);
return XST_DMA_SG_LIST_ERROR;
}
@ -1046,8 +1098,9 @@ int XAxiCdma_BdRingStartTransfer(XAxiCdma *InstancePtr)
/* Now it is in SG mode, update the tail pointer to start the
* SG transfer
*/
XAxiCdma_WriteReg(InstancePtr->BaseAddr, XAXICDMA_TDESC_OFFSET,
XAxiCdma_BdGetPhysAddr((XAxiCdma_Bd *)InstancePtr->HwBdTail));
XAxiCdma_BdSetTailBdPtr(InstancePtr,
XAxiCdma_BdGetPhysAddr((XAxiCdma_Bd *)InstancePtr->HwBdTail));
InstancePtr->SGWaiting = 0;

View file

@ -82,13 +82,40 @@ extern "C" {
* Register accesses are 32-bit.
* @{
*/
#define XAXICDMA_CR_OFFSET 0x00000000 /**< Control register */
#define XAXICDMA_SR_OFFSET 0x00000004 /**< Status register */
#define XAXICDMA_CDESC_OFFSET 0x00000008 /**< Current descriptor pointer */
#define XAXICDMA_TDESC_OFFSET 0x00000010 /**< Tail descriptor pointer */
#define XAXICDMA_SRCADDR_OFFSET 0x00000018 /**< Source address register */
#define XAXICDMA_DSTADDR_OFFSET 0x00000020 /**< Destination address register */
#define XAXICDMA_BTT_OFFSET 0x00000028 /**< Bytes to transfer */
#define XAXICDMA_CR_OFFSET 0x00000000 /**< Control register */
#define XAXICDMA_SR_OFFSET 0x00000004 /**< Status register */
#define XAXICDMA_CDESC_OFFSET 0x00000008 /**< Current descriptor
pointer */
#define XAXICDMA_CDESC_MSB_OFFSET 0x0000000C /**< Current descriptor pointer */
#define XAXICDMA_TDESC_OFFSET 0x00000010 /**< Tail descriptor pointer */
#define XAXICDMA_TDESC_MSB_OFFSET 0x00000014 /**< Tail descriptor pointer */
#define XAXICDMA_SRCADDR_OFFSET 0x00000018 /**< Source address register */
#define XAXICDMA_SRCADDR_MSB_OFFSET 0x0000001C /**< Source address register */
#define XAXICDMA_DSTADDR_OFFSET 0x00000020 /**< Destination address
register */
#define XAXICDMA_DSTADDR_MSB_OFFSET 0x00000024 /**< Destination address
register */
#define XAXICDMA_BTT_OFFSET 0x00000028 /**< Bytes to transfer */
/*@}*/
/** @name Bitmasks of XAXICDMA_CR_OFFSET register
* @{
*/
#define XAXICDMA_CR_RESET_MASK 0x00000004 /**< Reset DMA engine */
#define XAXICDMA_CR_SGMODE_MASK 0x00000008 /**< Scatter gather mode */
#define XAXICDMA_CR_KHOLE_RD_MASK 0x00000010 /**< Keyhole Read */
#define XAXICDMA_CR_KHOLE_WR_MASK 0x00000020 /**< Keyhole Write */
/*@}*/
/** @name Bitmasks of XAXICDMA_SR_OFFSET register
* This register reports status of a DMA channel, including
* idle state, errors, and interrupts
* @{
*/
#define XAXICDMA_SR_IDLE_MASK 0x00000002 /**< DMA channel idle */
#define XAXICDMA_SR_SGINCLD_MASK 0x00000008 /**< Hybrid build */
#define XAXICDMA_SR_ERR_INTERNAL_MASK 0x00000010 /**< Datamover internal err */
#define XAXICDMA_BTT_OFFSET 0x00000028 /**< Bytes to transfer */
/*@}*/
/** @name Bitmasks of XAXICDMA_CR_OFFSET register
@ -116,6 +143,13 @@ extern "C" {
#define XAXICDMA_SR_ERR_ALL_MASK 0x00000770 /**< All errors */
/*@}*/
/** @name Bitmask for descriptor
* @{
*/
#define XAXICDMA_DESC_LSB_MASK (0xFFFFFFC0U) /**< LSB Address mask */
/*@}*/
/** @name Bitmask for interrupts
* These masks are shared by XAXICDMA_CR_OFFSET register and
* XAXICDMA_SR_OFFSET register
@ -156,19 +190,24 @@ extern "C" {
* @{
*/
#define XAXICDMA_BD_NDESC_OFFSET 0x00 /**< Next descriptor pointer */
#define XAXICDMA_BD_NDESC_MSB_OFFSET 0x04 /**< Next descriptor pointer */
#define XAXICDMA_BD_BUFSRC_OFFSET 0x08 /**< Buffer source address */
#define XAXICDMA_BD_BUFSRC_MSB_OFFSET 0x0C /**< Buffer source address */
#define XAXICDMA_BD_BUFDST_OFFSET 0x10 /**< Buffer destination address */
#define XAXICDMA_BD_BUFDST_MSB_OFFSET 0x14 /**< Buffer destination address */
#define XAXICDMA_BD_CTRL_LEN_OFFSET 0x18 /**< Control/buffer length */
#define XAXICDMA_BD_STS_OFFSET 0x1C /**< Status */
#define XAXICDMA_BD_PHYS_ADDR_OFFSET 0x20 /**< Physical address of the BD */
#define XAXICDMA_BD_ISLITE_OFFSET 0x24 /**< Lite mode hardware build? */
#define XAXICDMA_BD_HASDRE_OFFSET 0x28 /**< Support unaligned transfers? */
#define XAXICDMA_BD_WORDLEN_OFFSET 0x2C /**< Word length in bytes */
#define XAXICDMA_BD_MAX_LEN_OFFSET 0x30 /**< Word length in bytes */
#define XAXICDMA_BD_PHYS_ADDR_MSB_OFFSET 0x24 /**< Physical address of the BD */
#define XAXICDMA_BD_ISLITE_OFFSET 0x28 /**< Lite mode hardware build? */
#define XAXICDMA_BD_HASDRE_OFFSET 0x2C /**< Support unaligned transfers? */
#define XAXICDMA_BD_WORDLEN_OFFSET 0x30 /**< Word length in bytes */
#define XAXICDMA_BD_MAX_LEN_OFFSET 0x34 /**< Word length in bytes */
#define XAXICDMA_BD_ADDRLEN_OFFSET 0x38 /**< Word length in bytes */
#define XAXICDMA_BD_START_CLEAR 8 /**< Offset to start clear */
#define XAXICDMA_BD_TO_CLEAR 24 /**< BD specific bytes to be cleared */
#define XAXICDMA_BD_NUM_WORDS 16 /**< Total number of words for one BD*/
#define XAXICDMA_BD_NUM_WORDS 16U /**< Total number of words for one BD*/
#define XAXICDMA_BD_HW_NUM_BYTES 32 /**< Number of bytes hw used */
/*@}*/
@ -213,7 +252,7 @@ extern "C" {
*
******************************************************************************/
#define XAxiCdma_ReadReg(BaseAddress, RegOffset) \
XAxiCdma_In32((BaseAddress) + (RegOffset))
XAxiCdma_In32((BaseAddress) + (u32)(RegOffset))
/*****************************************************************************/
/**
@ -232,7 +271,7 @@ extern "C" {
*
******************************************************************************/
#define XAxiCdma_WriteReg(BaseAddress, RegOffset, Data) \
XAxiCdma_Out32((BaseAddress) + (RegOffset), (Data))
XAxiCdma_Out32((BaseAddress) + (u32)(RegOffset), (u32)(Data))
#ifdef __cplusplus
}