1*72f56adcSTsiChungLiew /* 2*72f56adcSTsiChungLiew * Copyright (C) 2004-2007 Freescale Semiconductor, Inc. 3*72f56adcSTsiChungLiew * 4*72f56adcSTsiChungLiew * See file CREDITS for list of people who contributed to this 5*72f56adcSTsiChungLiew * project. 6*72f56adcSTsiChungLiew * 7*72f56adcSTsiChungLiew * This program is free software; you can redistribute it and/or 8*72f56adcSTsiChungLiew * modify it under the terms of the GNU General Public License as 9*72f56adcSTsiChungLiew * published by the Free Software Foundation; either version 2 of 10*72f56adcSTsiChungLiew * the License, or (at your option) any later version. 11*72f56adcSTsiChungLiew * 12*72f56adcSTsiChungLiew * This program is distributed in the hope that it will be useful, 13*72f56adcSTsiChungLiew * but WITHOUT ANY WARRANTY; without even the implied warranty of 14*72f56adcSTsiChungLiew * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15*72f56adcSTsiChungLiew * GNU General Public License for more details. 16*72f56adcSTsiChungLiew * 17*72f56adcSTsiChungLiew * You should have received a copy of the GNU General Public License 18*72f56adcSTsiChungLiew * along with this program; if not, write to the Free Software 19*72f56adcSTsiChungLiew * Foundation, Inc., 59 Temple Place, Suite 330, Boston, 20*72f56adcSTsiChungLiew * MA 02111-1307 USA 21*72f56adcSTsiChungLiew */ 22*72f56adcSTsiChungLiew 23*72f56adcSTsiChungLiew #ifndef _MCD_API_H 24*72f56adcSTsiChungLiew #define _MCD_API_H 25*72f56adcSTsiChungLiew 26*72f56adcSTsiChungLiew /* Turn Execution Unit tasks ON (#define) or OFF (#undef) */ 27*72f56adcSTsiChungLiew #undef MCD_INCLUDE_EU 28*72f56adcSTsiChungLiew 29*72f56adcSTsiChungLiew /* Number of DMA channels */ 30*72f56adcSTsiChungLiew #define NCHANNELS 16 31*72f56adcSTsiChungLiew 32*72f56adcSTsiChungLiew /* Total number of variants */ 33*72f56adcSTsiChungLiew #ifdef MCD_INCLUDE_EU 34*72f56adcSTsiChungLiew #define NUMOFVARIANTS 6 35*72f56adcSTsiChungLiew #else 36*72f56adcSTsiChungLiew #define NUMOFVARIANTS 4 37*72f56adcSTsiChungLiew #endif 38*72f56adcSTsiChungLiew 39*72f56adcSTsiChungLiew /* Define sizes of the various tables */ 40*72f56adcSTsiChungLiew #define TASK_TABLE_SIZE (NCHANNELS*32) 41*72f56adcSTsiChungLiew #define VAR_TAB_SIZE (128) 42*72f56adcSTsiChungLiew #define CONTEXT_SAVE_SIZE (128) 43*72f56adcSTsiChungLiew #define FUNCDESC_TAB_SIZE (256) 44*72f56adcSTsiChungLiew 45*72f56adcSTsiChungLiew #ifdef MCD_INCLUDE_EU 46*72f56adcSTsiChungLiew #define FUNCDESC_TAB_NUM 16 47*72f56adcSTsiChungLiew #else 48*72f56adcSTsiChungLiew #define FUNCDESC_TAB_NUM 1 49*72f56adcSTsiChungLiew #endif 50*72f56adcSTsiChungLiew 51*72f56adcSTsiChungLiew #ifndef DEFINESONLY 52*72f56adcSTsiChungLiew 53*72f56adcSTsiChungLiew /* Portability typedefs */ 54*72f56adcSTsiChungLiew #if 1 55*72f56adcSTsiChungLiew #include "common.h" 56*72f56adcSTsiChungLiew #else 57*72f56adcSTsiChungLiew #ifndef s32 58*72f56adcSTsiChungLiew typedef int s32; 59*72f56adcSTsiChungLiew #endif 60*72f56adcSTsiChungLiew #ifndef u32 61*72f56adcSTsiChungLiew typedef unsigned int u32; 62*72f56adcSTsiChungLiew #endif 63*72f56adcSTsiChungLiew #ifndef s16 64*72f56adcSTsiChungLiew typedef short s16; 65*72f56adcSTsiChungLiew #endif 66*72f56adcSTsiChungLiew #ifndef u16 67*72f56adcSTsiChungLiew typedef unsigned short u16; 68*72f56adcSTsiChungLiew #endif 69*72f56adcSTsiChungLiew #ifndef s8 70*72f56adcSTsiChungLiew typedef char s8; 71*72f56adcSTsiChungLiew #endif 72*72f56adcSTsiChungLiew #ifndef u8 73*72f56adcSTsiChungLiew typedef unsigned char u8; 74*72f56adcSTsiChungLiew #endif 75*72f56adcSTsiChungLiew #endif 76*72f56adcSTsiChungLiew 77*72f56adcSTsiChungLiew /* 78*72f56adcSTsiChungLiew * These structures represent the internal registers of the 79*72f56adcSTsiChungLiew * multi-channel DMA 80*72f56adcSTsiChungLiew */ 81*72f56adcSTsiChungLiew struct dmaRegs_s { 82*72f56adcSTsiChungLiew u32 taskbar; /* task table base address */ 83*72f56adcSTsiChungLiew u32 currPtr; 84*72f56adcSTsiChungLiew u32 endPtr; 85*72f56adcSTsiChungLiew u32 varTablePtr; 86*72f56adcSTsiChungLiew u16 dma_rsvd0; 87*72f56adcSTsiChungLiew u16 ptdControl; /* ptd control */ 88*72f56adcSTsiChungLiew u32 intPending; /* interrupt pending */ 89*72f56adcSTsiChungLiew u32 intMask; /* interrupt mask */ 90*72f56adcSTsiChungLiew u16 taskControl[16]; /* task control */ 91*72f56adcSTsiChungLiew u8 priority[32]; /* priority */ 92*72f56adcSTsiChungLiew u32 initiatorMux; /* initiator mux control */ 93*72f56adcSTsiChungLiew u32 taskSize0; /* task size control 0. */ 94*72f56adcSTsiChungLiew u32 taskSize1; /* task size control 1. */ 95*72f56adcSTsiChungLiew u32 dma_rsvd1; /* reserved */ 96*72f56adcSTsiChungLiew u32 dma_rsvd2; /* reserved */ 97*72f56adcSTsiChungLiew u32 debugComp1; /* debug comparator 1 */ 98*72f56adcSTsiChungLiew u32 debugComp2; /* debug comparator 2 */ 99*72f56adcSTsiChungLiew u32 debugControl; /* debug control */ 100*72f56adcSTsiChungLiew u32 debugStatus; /* debug status */ 101*72f56adcSTsiChungLiew u32 ptdDebug; /* priority task decode debug */ 102*72f56adcSTsiChungLiew u32 dma_rsvd3[31]; /* reserved */ 103*72f56adcSTsiChungLiew }; 104*72f56adcSTsiChungLiew typedef volatile struct dmaRegs_s dmaRegs; 105*72f56adcSTsiChungLiew 106*72f56adcSTsiChungLiew #endif 107*72f56adcSTsiChungLiew 108*72f56adcSTsiChungLiew /* PTD contrl reg bits */ 109*72f56adcSTsiChungLiew #define PTD_CTL_TSK_PRI 0x8000 110*72f56adcSTsiChungLiew #define PTD_CTL_COMM_PREFETCH 0x0001 111*72f56adcSTsiChungLiew 112*72f56adcSTsiChungLiew /* Task Control reg bits and field masks */ 113*72f56adcSTsiChungLiew #define TASK_CTL_EN 0x8000 114*72f56adcSTsiChungLiew #define TASK_CTL_VALID 0x4000 115*72f56adcSTsiChungLiew #define TASK_CTL_ALWAYS 0x2000 116*72f56adcSTsiChungLiew #define TASK_CTL_INIT_MASK 0x1f00 117*72f56adcSTsiChungLiew #define TASK_CTL_ASTRT 0x0080 118*72f56adcSTsiChungLiew #define TASK_CTL_HIPRITSKEN 0x0040 119*72f56adcSTsiChungLiew #define TASK_CTL_HLDINITNUM 0x0020 120*72f56adcSTsiChungLiew #define TASK_CTL_ASTSKNUM_MASK 0x000f 121*72f56adcSTsiChungLiew 122*72f56adcSTsiChungLiew /* Priority reg bits and field masks */ 123*72f56adcSTsiChungLiew #define PRIORITY_HLD 0x80 124*72f56adcSTsiChungLiew #define PRIORITY_PRI_MASK 0x07 125*72f56adcSTsiChungLiew 126*72f56adcSTsiChungLiew /* Debug Control reg bits and field masks */ 127*72f56adcSTsiChungLiew #define DBG_CTL_BLOCK_TASKS_MASK 0xffff0000 128*72f56adcSTsiChungLiew #define DBG_CTL_AUTO_ARM 0x00008000 129*72f56adcSTsiChungLiew #define DBG_CTL_BREAK 0x00004000 130*72f56adcSTsiChungLiew #define DBG_CTL_COMP1_TYP_MASK 0x00003800 131*72f56adcSTsiChungLiew #define DBG_CTL_COMP2_TYP_MASK 0x00000070 132*72f56adcSTsiChungLiew #define DBG_CTL_EXT_BREAK 0x00000004 133*72f56adcSTsiChungLiew #define DBG_CTL_INT_BREAK 0x00000002 134*72f56adcSTsiChungLiew 135*72f56adcSTsiChungLiew /* 136*72f56adcSTsiChungLiew * PTD Debug reg selector addresses 137*72f56adcSTsiChungLiew * This reg must be written with a value to show the contents of 138*72f56adcSTsiChungLiew * one of the desired internal register. 139*72f56adcSTsiChungLiew */ 140*72f56adcSTsiChungLiew #define PTD_DBG_REQ 0x00 /* shows the state of 31 initiators */ 141*72f56adcSTsiChungLiew #define PTD_DBG_TSK_VLD_INIT 0x01 /* shows which 16 tasks are valid and 142*72f56adcSTsiChungLiew have initiators asserted */ 143*72f56adcSTsiChungLiew 144*72f56adcSTsiChungLiew /* General return values */ 145*72f56adcSTsiChungLiew #define MCD_OK 0 146*72f56adcSTsiChungLiew #define MCD_ERROR -1 147*72f56adcSTsiChungLiew #define MCD_TABLE_UNALIGNED -2 148*72f56adcSTsiChungLiew #define MCD_CHANNEL_INVALID -3 149*72f56adcSTsiChungLiew 150*72f56adcSTsiChungLiew /* MCD_initDma input flags */ 151*72f56adcSTsiChungLiew #define MCD_RELOC_TASKS 0x00000001 152*72f56adcSTsiChungLiew #define MCD_NO_RELOC_TASKS 0x00000000 153*72f56adcSTsiChungLiew #define MCD_COMM_PREFETCH_EN 0x00000002 /* MCF547x/548x ONLY */ 154*72f56adcSTsiChungLiew 155*72f56adcSTsiChungLiew /* 156*72f56adcSTsiChungLiew * MCD_dmaStatus Status Values for each channel: 157*72f56adcSTsiChungLiew * MCD_NO_DMA - No DMA has been requested since reset 158*72f56adcSTsiChungLiew * MCD_IDLE - DMA active, but the initiator is currently inactive 159*72f56adcSTsiChungLiew * MCD_RUNNING - DMA active, and the initiator is currently active 160*72f56adcSTsiChungLiew * MCD_PAUSED - DMA active but it is currently paused 161*72f56adcSTsiChungLiew * MCD_HALTED - the most recent DMA has been killed with MCD_killTask() 162*72f56adcSTsiChungLiew * MCD_DONE - the most recent DMA has completed 163*72f56adcSTsiChungLiew */ 164*72f56adcSTsiChungLiew #define MCD_NO_DMA 1 165*72f56adcSTsiChungLiew #define MCD_IDLE 2 166*72f56adcSTsiChungLiew #define MCD_RUNNING 3 167*72f56adcSTsiChungLiew #define MCD_PAUSED 4 168*72f56adcSTsiChungLiew #define MCD_HALTED 5 169*72f56adcSTsiChungLiew #define MCD_DONE 6 170*72f56adcSTsiChungLiew 171*72f56adcSTsiChungLiew /* MCD_startDma parameter defines */ 172*72f56adcSTsiChungLiew 173*72f56adcSTsiChungLiew /* Constants for the funcDesc parameter */ 174*72f56adcSTsiChungLiew /* 175*72f56adcSTsiChungLiew * MCD_NO_BYTE_SWAP - to disable byte swapping 176*72f56adcSTsiChungLiew * MCD_BYTE_REVERSE - to reverse the bytes of each u32 of the DMAed data 177*72f56adcSTsiChungLiew * MCD_U16_REVERSE - to reverse the 16-bit halves of each 32-bit data 178*72f56adcSTsiChungLiew * value being DMAed 179*72f56adcSTsiChungLiew * MCD_U16_BYTE_REVERSE - to reverse the byte halves of each 16-bit half of 180*72f56adcSTsiChungLiew * each 32-bit data value DMAed 181*72f56adcSTsiChungLiew * MCD_NO_BIT_REV - do not reverse the bits of each byte DMAed 182*72f56adcSTsiChungLiew * MCD_BIT_REV - reverse the bits of each byte DMAed 183*72f56adcSTsiChungLiew * MCD_CRC16 - to perform CRC-16 on DMAed data 184*72f56adcSTsiChungLiew * MCD_CRCCCITT - to perform CRC-CCITT on DMAed data 185*72f56adcSTsiChungLiew * MCD_CRC32 - to perform CRC-32 on DMAed data 186*72f56adcSTsiChungLiew * MCD_CSUMINET - to perform internet checksums on DMAed data 187*72f56adcSTsiChungLiew * MCD_NO_CSUM - to perform no checksumming 188*72f56adcSTsiChungLiew */ 189*72f56adcSTsiChungLiew #define MCD_NO_BYTE_SWAP 0x00045670 190*72f56adcSTsiChungLiew #define MCD_BYTE_REVERSE 0x00076540 191*72f56adcSTsiChungLiew #define MCD_U16_REVERSE 0x00067450 192*72f56adcSTsiChungLiew #define MCD_U16_BYTE_REVERSE 0x00054760 193*72f56adcSTsiChungLiew #define MCD_NO_BIT_REV 0x00000000 194*72f56adcSTsiChungLiew #define MCD_BIT_REV 0x00088880 195*72f56adcSTsiChungLiew /* CRCing: */ 196*72f56adcSTsiChungLiew #define MCD_CRC16 0xc0100000 197*72f56adcSTsiChungLiew #define MCD_CRCCCITT 0xc0200000 198*72f56adcSTsiChungLiew #define MCD_CRC32 0xc0300000 199*72f56adcSTsiChungLiew #define MCD_CSUMINET 0xc0400000 200*72f56adcSTsiChungLiew #define MCD_NO_CSUM 0xa0000000 201*72f56adcSTsiChungLiew 202*72f56adcSTsiChungLiew #define MCD_FUNC_NOEU1 (MCD_NO_BYTE_SWAP | MCD_NO_BIT_REV | \ 203*72f56adcSTsiChungLiew MCD_NO_CSUM) 204*72f56adcSTsiChungLiew #define MCD_FUNC_NOEU2 (MCD_NO_BYTE_SWAP | MCD_NO_CSUM) 205*72f56adcSTsiChungLiew 206*72f56adcSTsiChungLiew /* Constants for the flags parameter */ 207*72f56adcSTsiChungLiew #define MCD_TT_FLAGS_RL 0x00000001 /* Read line */ 208*72f56adcSTsiChungLiew #define MCD_TT_FLAGS_CW 0x00000002 /* Combine Writes */ 209*72f56adcSTsiChungLiew #define MCD_TT_FLAGS_SP 0x00000004 /* MCF547x/548x ONLY */ 210*72f56adcSTsiChungLiew #define MCD_TT_FLAGS_MASK 0x000000ff 211*72f56adcSTsiChungLiew #define MCD_TT_FLAGS_DEF (MCD_TT_FLAGS_RL | MCD_TT_FLAGS_CW) 212*72f56adcSTsiChungLiew 213*72f56adcSTsiChungLiew #define MCD_SINGLE_DMA 0x00000100 /* Unchained DMA */ 214*72f56adcSTsiChungLiew #define MCD_CHAIN_DMA /* TBD */ 215*72f56adcSTsiChungLiew #define MCD_EU_DMA /* TBD */ 216*72f56adcSTsiChungLiew #define MCD_FECTX_DMA 0x00001000 /* FEC TX ring DMA */ 217*72f56adcSTsiChungLiew #define MCD_FECRX_DMA 0x00002000 /* FEC RX ring DMA */ 218*72f56adcSTsiChungLiew 219*72f56adcSTsiChungLiew /* these flags are valid for MCD_startDma and the chained buffer descriptors */ 220*72f56adcSTsiChungLiew /* 221*72f56adcSTsiChungLiew * MCD_BUF_READY - indicates that this buf is now under the DMA's ctrl 222*72f56adcSTsiChungLiew * MCD_WRAP - to tell the FEC Dmas to wrap to the first BD 223*72f56adcSTsiChungLiew * MCD_INTERRUPT - to generate an interrupt after completion of the DMA 224*72f56adcSTsiChungLiew * MCD_END_FRAME - tell the DMA to end the frame when transferring 225*72f56adcSTsiChungLiew * last byte of data in buffer 226*72f56adcSTsiChungLiew * MCD_CRC_RESTART - to empty out the accumulated checksum prior to 227*72f56adcSTsiChungLiew * performing the DMA 228*72f56adcSTsiChungLiew */ 229*72f56adcSTsiChungLiew #define MCD_BUF_READY 0x80000000 230*72f56adcSTsiChungLiew #define MCD_WRAP 0x20000000 231*72f56adcSTsiChungLiew #define MCD_INTERRUPT 0x10000000 232*72f56adcSTsiChungLiew #define MCD_END_FRAME 0x08000000 233*72f56adcSTsiChungLiew #define MCD_CRC_RESTART 0x40000000 234*72f56adcSTsiChungLiew 235*72f56adcSTsiChungLiew /* Defines for the FEC buffer descriptor control/status word*/ 236*72f56adcSTsiChungLiew #define MCD_FEC_BUF_READY 0x8000 237*72f56adcSTsiChungLiew #define MCD_FEC_WRAP 0x2000 238*72f56adcSTsiChungLiew #define MCD_FEC_INTERRUPT 0x1000 239*72f56adcSTsiChungLiew #define MCD_FEC_END_FRAME 0x0800 240*72f56adcSTsiChungLiew 241*72f56adcSTsiChungLiew /* Defines for general intuitiveness */ 242*72f56adcSTsiChungLiew 243*72f56adcSTsiChungLiew #define MCD_TRUE 1 244*72f56adcSTsiChungLiew #define MCD_FALSE 0 245*72f56adcSTsiChungLiew 246*72f56adcSTsiChungLiew /* Three different cases for destination and source. */ 247*72f56adcSTsiChungLiew #define MINUS1 -1 248*72f56adcSTsiChungLiew #define ZERO 0 249*72f56adcSTsiChungLiew #define PLUS1 1 250*72f56adcSTsiChungLiew 251*72f56adcSTsiChungLiew #ifndef DEFINESONLY 252*72f56adcSTsiChungLiew 253*72f56adcSTsiChungLiew /* Task Table Entry struct*/ 254*72f56adcSTsiChungLiew typedef struct { 255*72f56adcSTsiChungLiew u32 TDTstart; /* task descriptor table start */ 256*72f56adcSTsiChungLiew u32 TDTend; /* task descriptor table end */ 257*72f56adcSTsiChungLiew u32 varTab; /* variable table start */ 258*72f56adcSTsiChungLiew u32 FDTandFlags; /* function descriptor table start & flags */ 259*72f56adcSTsiChungLiew volatile u32 descAddrAndStatus; 260*72f56adcSTsiChungLiew volatile u32 modifiedVarTab; 261*72f56adcSTsiChungLiew u32 contextSaveSpace; /* context save space start */ 262*72f56adcSTsiChungLiew u32 literalBases; 263*72f56adcSTsiChungLiew } TaskTableEntry; 264*72f56adcSTsiChungLiew 265*72f56adcSTsiChungLiew /* Chained buffer descriptor: 266*72f56adcSTsiChungLiew * flags - flags describing the DMA 267*72f56adcSTsiChungLiew * csumResult - checksum performed since last checksum reset 268*72f56adcSTsiChungLiew * srcAddr - the address to move data from 269*72f56adcSTsiChungLiew * destAddr - the address to move data to 270*72f56adcSTsiChungLiew * lastDestAddr - the last address written to 271*72f56adcSTsiChungLiew * dmaSize - the no of bytes to xfer independent of the xfer sz 272*72f56adcSTsiChungLiew * next - next buffer descriptor in chain 273*72f56adcSTsiChungLiew * info - private info about this descriptor; DMA does not affect it 274*72f56adcSTsiChungLiew */ 275*72f56adcSTsiChungLiew typedef volatile struct MCD_bufDesc_struct MCD_bufDesc; 276*72f56adcSTsiChungLiew struct MCD_bufDesc_struct { 277*72f56adcSTsiChungLiew u32 flags; 278*72f56adcSTsiChungLiew u32 csumResult; 279*72f56adcSTsiChungLiew s8 *srcAddr; 280*72f56adcSTsiChungLiew s8 *destAddr; 281*72f56adcSTsiChungLiew s8 *lastDestAddr; 282*72f56adcSTsiChungLiew u32 dmaSize; 283*72f56adcSTsiChungLiew MCD_bufDesc *next; 284*72f56adcSTsiChungLiew u32 info; 285*72f56adcSTsiChungLiew }; 286*72f56adcSTsiChungLiew 287*72f56adcSTsiChungLiew /* Progress Query struct: 288*72f56adcSTsiChungLiew * lastSrcAddr - the most-recent or last, post-increment source address 289*72f56adcSTsiChungLiew * lastDestAddr - the most-recent or last, post-increment destination address 290*72f56adcSTsiChungLiew * dmaSize - the amount of data transferred for the current buffer 291*72f56adcSTsiChungLiew * currBufDesc - pointer to the current buffer descriptor being DMAed 292*72f56adcSTsiChungLiew */ 293*72f56adcSTsiChungLiew 294*72f56adcSTsiChungLiew typedef volatile struct MCD_XferProg_struct { 295*72f56adcSTsiChungLiew s8 *lastSrcAddr; 296*72f56adcSTsiChungLiew s8 *lastDestAddr; 297*72f56adcSTsiChungLiew u32 dmaSize; 298*72f56adcSTsiChungLiew MCD_bufDesc *currBufDesc; 299*72f56adcSTsiChungLiew } MCD_XferProg; 300*72f56adcSTsiChungLiew 301*72f56adcSTsiChungLiew /* FEC buffer descriptor */ 302*72f56adcSTsiChungLiew typedef volatile struct MCD_bufDescFec_struct { 303*72f56adcSTsiChungLiew u16 statCtrl; 304*72f56adcSTsiChungLiew u16 length; 305*72f56adcSTsiChungLiew u32 dataPointer; 306*72f56adcSTsiChungLiew } MCD_bufDescFec; 307*72f56adcSTsiChungLiew 308*72f56adcSTsiChungLiew /*************************************************************************/ 309*72f56adcSTsiChungLiew /* API function Prototypes - see MCD_dmaApi.c for further notes */ 310*72f56adcSTsiChungLiew 311*72f56adcSTsiChungLiew /* MCD_startDma starts a particular kind of DMA: 312*72f56adcSTsiChungLiew * srcAddr - the channel on which to run the DMA 313*72f56adcSTsiChungLiew * srcIncr - the address to move data from, or buffer-descriptor address 314*72f56adcSTsiChungLiew * destAddr - the amount to increment the source address per transfer 315*72f56adcSTsiChungLiew * destIncr - the address to move data to 316*72f56adcSTsiChungLiew * dmaSize - the amount to increment the destination address per transfer 317*72f56adcSTsiChungLiew * xferSize - the number bytes in of each data movement (1, 2, or 4) 318*72f56adcSTsiChungLiew * initiator - what device initiates the DMA 319*72f56adcSTsiChungLiew * priority - priority of the DMA 320*72f56adcSTsiChungLiew * flags - flags describing the DMA 321*72f56adcSTsiChungLiew * funcDesc - description of byte swapping, bit swapping, and CRC actions 322*72f56adcSTsiChungLiew */ 323*72f56adcSTsiChungLiew int MCD_startDma(int channel, s8 * srcAddr, s16 srcIncr, s8 * destAddr, 324*72f56adcSTsiChungLiew s16 destIncr, u32 dmaSize, u32 xferSize, u32 initiator, 325*72f56adcSTsiChungLiew int priority, u32 flags, u32 funcDesc); 326*72f56adcSTsiChungLiew 327*72f56adcSTsiChungLiew /* 328*72f56adcSTsiChungLiew * MCD_initDma() initializes the DMA API by setting up a pointer to the DMA 329*72f56adcSTsiChungLiew * registers, relocating and creating the appropriate task structures, and 330*72f56adcSTsiChungLiew * setting up some global settings 331*72f56adcSTsiChungLiew */ 332*72f56adcSTsiChungLiew int MCD_initDma(dmaRegs * sDmaBarAddr, void *taskTableDest, u32 flags); 333*72f56adcSTsiChungLiew 334*72f56adcSTsiChungLiew /* MCD_dmaStatus() returns the status of the DMA on the requested channel. */ 335*72f56adcSTsiChungLiew int MCD_dmaStatus(int channel); 336*72f56adcSTsiChungLiew 337*72f56adcSTsiChungLiew /* MCD_XferProgrQuery() returns progress of DMA on requested channel */ 338*72f56adcSTsiChungLiew int MCD_XferProgrQuery(int channel, MCD_XferProg * progRep); 339*72f56adcSTsiChungLiew 340*72f56adcSTsiChungLiew /* 341*72f56adcSTsiChungLiew * MCD_killDma() halts the DMA on the requested channel, without any 342*72f56adcSTsiChungLiew * intention of resuming the DMA. 343*72f56adcSTsiChungLiew */ 344*72f56adcSTsiChungLiew int MCD_killDma(int channel); 345*72f56adcSTsiChungLiew 346*72f56adcSTsiChungLiew /* 347*72f56adcSTsiChungLiew * MCD_continDma() continues a DMA which as stopped due to encountering an 348*72f56adcSTsiChungLiew * unready buffer descriptor. 349*72f56adcSTsiChungLiew */ 350*72f56adcSTsiChungLiew int MCD_continDma(int channel); 351*72f56adcSTsiChungLiew 352*72f56adcSTsiChungLiew /* 353*72f56adcSTsiChungLiew * MCD_pauseDma() pauses the DMA on the given channel ( if any DMA is 354*72f56adcSTsiChungLiew * running on that channel). 355*72f56adcSTsiChungLiew */ 356*72f56adcSTsiChungLiew int MCD_pauseDma(int channel); 357*72f56adcSTsiChungLiew 358*72f56adcSTsiChungLiew /* 359*72f56adcSTsiChungLiew * MCD_resumeDma() resumes the DMA on a given channel (if any DMA is 360*72f56adcSTsiChungLiew * running on that channel). 361*72f56adcSTsiChungLiew */ 362*72f56adcSTsiChungLiew int MCD_resumeDma(int channel); 363*72f56adcSTsiChungLiew 364*72f56adcSTsiChungLiew /* MCD_csumQuery provides the checksum/CRC after performing a non-chained DMA */ 365*72f56adcSTsiChungLiew int MCD_csumQuery(int channel, u32 * csum); 366*72f56adcSTsiChungLiew 367*72f56adcSTsiChungLiew /* 368*72f56adcSTsiChungLiew * MCD_getCodeSize provides the packed size required by the microcoded task 369*72f56adcSTsiChungLiew * and structures. 370*72f56adcSTsiChungLiew */ 371*72f56adcSTsiChungLiew int MCD_getCodeSize(void); 372*72f56adcSTsiChungLiew 373*72f56adcSTsiChungLiew /* 374*72f56adcSTsiChungLiew * MCD_getVersion provides a pointer to a version string and returns a 375*72f56adcSTsiChungLiew * version number. 376*72f56adcSTsiChungLiew */ 377*72f56adcSTsiChungLiew int MCD_getVersion(char **longVersion); 378*72f56adcSTsiChungLiew 379*72f56adcSTsiChungLiew /* macro for setting a location in the variable table */ 380*72f56adcSTsiChungLiew #define MCD_SET_VAR(taskTab,idx,value) ((u32 *)(taskTab)->varTab)[idx] = value 381*72f56adcSTsiChungLiew /* Note that MCD_SET_VAR() is invoked many times in firing up a DMA function, 382*72f56adcSTsiChungLiew so I'm avoiding surrounding it with "do {} while(0)" */ 383*72f56adcSTsiChungLiew 384*72f56adcSTsiChungLiew #endif /* DEFINESONLY */ 385*72f56adcSTsiChungLiew 386*72f56adcSTsiChungLiew #endif /* _MCD_API_H */ 387