/******************************************************************************* * mvDmaInit - Initialize IDMA engine * * DESCRIPTION: * This function initialize IDMA unit. It set the default address decode * windows of the unit. * * INPUT: * None. * * OUTPUT: * None. * * RETURN: * MV_ERROR if setting fail. *******************************************************************************/ MV_STATUS mvDmaInit (MV_VOID) { MV_U32 winNum, status; MV_DMA_DEC_WIN idmaWin; MV_CPU_DEC_WIN cpuAddrDecWin; MV_U32 winPrioIndex=0; /* Initiate IDMA address decode */ /* First disable all address decode windows */ MV_REG_WRITE(IDMA_BASE_ADDR_ENABLE_REG, IBAER_ENABLE_MASK); /* Go through all windows in user table until table terminator */ for (winNum = 0; ((dmaAddrDecPrioTap[winPrioIndex] != TBL_TERM) && (winNum < IDMA_MAX_ADDR_DEC_WIN)); ) { /* first get attributes from CPU If */ status = mvCpuIfTargetWinGet(dmaAddrDecPrioTap[winPrioIndex], &cpuAddrDecWin); if(MV_NO_SUCH == status) { winPrioIndex++; continue; } if (MV_OK != status) { mvOsPrintf("mvDmaInit: ERR. mvCpuIfTargetWinGet failed\n"); return MV_ERROR; } if (cpuAddrDecWin.enable == MV_TRUE) { idmaWin.addrWin.baseHigh = cpuAddrDecWin.addrWin.baseHigh; idmaWin.addrWin.baseLow = cpuAddrDecWin.addrWin.baseLow; idmaWin.addrWin.size = cpuAddrDecWin.addrWin.size; idmaWin.enable = MV_TRUE; idmaWin.target = dmaAddrDecPrioTap[winPrioIndex]; if(MV_OK != mvDmaWinSet(winNum, &idmaWin)) { return MV_ERROR; } winNum++; } winPrioIndex++; } mvDmaHalInit(MV_IDMA_MAX_CHAN); return MV_OK; }
/******************************************************************************* * mvDmaInit - Initialize IDMA engine * * DESCRIPTION: * This function initialize IDMA unit. It set the default address decode * windows of the unit. * * INPUT: * None. * * OUTPUT: * None. * * RETURN: * MV_ERROR if setting fail. *******************************************************************************/ MV_STATUS mvDmaInit (MV_VOID) { MV_U32 winNum, status; MV_U32 dmaChanNum; MV_DMA_DEC_WIN idmaWin; MV_CPU_DEC_WIN cpuAddrDecWin; MV_U32 winPrioIndex=0; /* Initiate IDMA address decode */ /* First disable all address decode windows */ MV_REG_WRITE(IDMA_BASE_ADDR_ENABLE_REG, IBAER_ENABLE_MASK); /* Go through all windows in user table until table terminator */ for (winNum = 0; ((dmaAddrDecPrioTap[winPrioIndex] != TBL_TERM) && (winNum < IDMA_MAX_ADDR_DEC_WIN)); ) { /* first get attributes from CPU If */ status = mvCpuIfTargetWinGet(dmaAddrDecPrioTap[winPrioIndex], &cpuAddrDecWin); if(MV_NO_SUCH == status) { winPrioIndex++; continue; } if (MV_OK != status) { mvOsPrintf("mvDmaInit: ERR. mvCpuIfTargetWinGet failed\n"); return MV_ERROR; } if (cpuAddrDecWin.enable == MV_TRUE) { idmaWin.addrWin.baseHigh = cpuAddrDecWin.addrWin.baseHigh; idmaWin.addrWin.baseLow = cpuAddrDecWin.addrWin.baseLow; idmaWin.addrWin.size = cpuAddrDecWin.addrWin.size; idmaWin.enable = MV_TRUE; idmaWin.target = dmaAddrDecPrioTap[winPrioIndex]; if(MV_OK != mvDmaWinSet(winNum, &idmaWin)) { return MV_ERROR; } winNum++; } winPrioIndex++; } /* Abort any DMA activity */ for(dmaChanNum = 0; dmaChanNum < MV_IDMA_MAX_CHAN; dmaChanNum++) { mvDmaCommandSet(dmaChanNum, MV_STOP); #if defined(MV_CPU_LE) /* The following must be set */ mvDmaCtrlHighSet(dmaChanNum, (ICCHR_ENDIAN_LITTLE | ICCHR_DESC_BYTE_SWAP_EN)); #endif } MV_REG_WRITE( IDMA_CAUSE_REG, 0); return MV_OK; }