172f56adcSTsiChungLiew /* 272f56adcSTsiChungLiew * Copyright (C) 2004-2007 Freescale Semiconductor, Inc. 372f56adcSTsiChungLiew * 4*1a459660SWolfgang Denk * SPDX-License-Identifier: GPL-2.0+ 572f56adcSTsiChungLiew */ 672f56adcSTsiChungLiew 772f56adcSTsiChungLiew #include <common.h> 872f56adcSTsiChungLiew 972f56adcSTsiChungLiew /* Functions for initializing variable tables of different types of tasks. */ 1072f56adcSTsiChungLiew 1172f56adcSTsiChungLiew /* 1272f56adcSTsiChungLiew * Do not edit! 1372f56adcSTsiChungLiew */ 1472f56adcSTsiChungLiew 1572f56adcSTsiChungLiew #include <MCD_dma.h> 1672f56adcSTsiChungLiew 1772f56adcSTsiChungLiew extern dmaRegs *MCD_dmaBar; 1872f56adcSTsiChungLiew 1972f56adcSTsiChungLiew /* Task 0 */ 2072f56adcSTsiChungLiew 2172f56adcSTsiChungLiew void MCD_startDmaChainNoEu(int *currBD, short srcIncr, short destIncr, 2272f56adcSTsiChungLiew int xferSize, short xferSizeIncr, int *cSave, 2372f56adcSTsiChungLiew volatile TaskTableEntry * taskTable, int channel) 2472f56adcSTsiChungLiew { 2572f56adcSTsiChungLiew volatile TaskTableEntry *taskChan = taskTable + channel; 2672f56adcSTsiChungLiew 2772f56adcSTsiChungLiew MCD_SET_VAR(taskChan, 2, (u32) currBD); /* var[2] */ 2872f56adcSTsiChungLiew MCD_SET_VAR(taskChan, 25, (u32) (0xe000 << 16) | (0xffff & srcIncr)); /* inc[1] */ 2972f56adcSTsiChungLiew MCD_SET_VAR(taskChan, 24, (u32) (0xe000 << 16) | (0xffff & destIncr)); /* inc[0] */ 3072f56adcSTsiChungLiew MCD_SET_VAR(taskChan, 11, (u32) xferSize); /* var[11] */ 3172f56adcSTsiChungLiew MCD_SET_VAR(taskChan, 26, (u32) (0x2000 << 16) | (0xffff & xferSizeIncr)); /* inc[2] */ 3272f56adcSTsiChungLiew MCD_SET_VAR(taskChan, 0, (u32) cSave); /* var[0] */ 3372f56adcSTsiChungLiew MCD_SET_VAR(taskChan, 1, (u32) 0x00000000); /* var[1] */ 3472f56adcSTsiChungLiew MCD_SET_VAR(taskChan, 3, (u32) 0x00000000); /* var[3] */ 3572f56adcSTsiChungLiew MCD_SET_VAR(taskChan, 4, (u32) 0x00000000); /* var[4] */ 3672f56adcSTsiChungLiew MCD_SET_VAR(taskChan, 5, (u32) 0x00000000); /* var[5] */ 3772f56adcSTsiChungLiew MCD_SET_VAR(taskChan, 6, (u32) 0x00000000); /* var[6] */ 3872f56adcSTsiChungLiew MCD_SET_VAR(taskChan, 7, (u32) 0x00000000); /* var[7] */ 3972f56adcSTsiChungLiew MCD_SET_VAR(taskChan, 8, (u32) 0x00000000); /* var[8] */ 4072f56adcSTsiChungLiew MCD_SET_VAR(taskChan, 9, (u32) 0x00000000); /* var[9] */ 4172f56adcSTsiChungLiew MCD_SET_VAR(taskChan, 10, (u32) 0x00000000); /* var[10] */ 4272f56adcSTsiChungLiew MCD_SET_VAR(taskChan, 12, (u32) 0x00000000); /* var[12] */ 4372f56adcSTsiChungLiew MCD_SET_VAR(taskChan, 13, (u32) 0x80000000); /* var[13] */ 4472f56adcSTsiChungLiew MCD_SET_VAR(taskChan, 14, (u32) 0x00000010); /* var[14] */ 4572f56adcSTsiChungLiew MCD_SET_VAR(taskChan, 15, (u32) 0x00000004); /* var[15] */ 4672f56adcSTsiChungLiew MCD_SET_VAR(taskChan, 16, (u32) 0x08000000); /* var[16] */ 4772f56adcSTsiChungLiew MCD_SET_VAR(taskChan, 27, (u32) 0x00000000); /* inc[3] */ 4872f56adcSTsiChungLiew MCD_SET_VAR(taskChan, 28, (u32) 0x80000000); /* inc[4] */ 4972f56adcSTsiChungLiew MCD_SET_VAR(taskChan, 29, (u32) 0x80000001); /* inc[5] */ 5072f56adcSTsiChungLiew MCD_SET_VAR(taskChan, 30, (u32) 0x40000000); /* inc[6] */ 5172f56adcSTsiChungLiew 5272f56adcSTsiChungLiew /* Set the task's Enable bit in its Task Control Register */ 5372f56adcSTsiChungLiew MCD_dmaBar->taskControl[channel] |= (u16) 0x8000; 5472f56adcSTsiChungLiew } 5572f56adcSTsiChungLiew 5672f56adcSTsiChungLiew /* Task 1 */ 5772f56adcSTsiChungLiew 5872f56adcSTsiChungLiew void MCD_startDmaSingleNoEu(char *srcAddr, short srcIncr, char *destAddr, 5972f56adcSTsiChungLiew short destIncr, int dmaSize, short xferSizeIncr, 6072f56adcSTsiChungLiew int flags, int *currBD, int *cSave, 6172f56adcSTsiChungLiew volatile TaskTableEntry * taskTable, int channel) 6272f56adcSTsiChungLiew { 6372f56adcSTsiChungLiew volatile TaskTableEntry *taskChan = taskTable + channel; 6472f56adcSTsiChungLiew 6572f56adcSTsiChungLiew MCD_SET_VAR(taskChan, 7, (u32) srcAddr); /* var[7] */ 6672f56adcSTsiChungLiew MCD_SET_VAR(taskChan, 25, (u32) (0xe000 << 16) | (0xffff & srcIncr)); /* inc[1] */ 6772f56adcSTsiChungLiew MCD_SET_VAR(taskChan, 2, (u32) destAddr); /* var[2] */ 6872f56adcSTsiChungLiew MCD_SET_VAR(taskChan, 24, (u32) (0xe000 << 16) | (0xffff & destIncr)); /* inc[0] */ 6972f56adcSTsiChungLiew MCD_SET_VAR(taskChan, 3, (u32) dmaSize); /* var[3] */ 7072f56adcSTsiChungLiew MCD_SET_VAR(taskChan, 26, (u32) (0x2000 << 16) | (0xffff & xferSizeIncr)); /* inc[2] */ 7172f56adcSTsiChungLiew MCD_SET_VAR(taskChan, 5, (u32) flags); /* var[5] */ 7272f56adcSTsiChungLiew MCD_SET_VAR(taskChan, 1, (u32) currBD); /* var[1] */ 7372f56adcSTsiChungLiew MCD_SET_VAR(taskChan, 0, (u32) cSave); /* var[0] */ 7472f56adcSTsiChungLiew MCD_SET_VAR(taskChan, 4, (u32) 0x00000000); /* var[4] */ 7572f56adcSTsiChungLiew MCD_SET_VAR(taskChan, 6, (u32) 0x00000000); /* var[6] */ 7672f56adcSTsiChungLiew MCD_SET_VAR(taskChan, 8, (u32) 0x00000000); /* var[8] */ 7772f56adcSTsiChungLiew MCD_SET_VAR(taskChan, 9, (u32) 0x00000004); /* var[9] */ 7872f56adcSTsiChungLiew MCD_SET_VAR(taskChan, 10, (u32) 0x08000000); /* var[10] */ 7972f56adcSTsiChungLiew MCD_SET_VAR(taskChan, 27, (u32) 0x00000000); /* inc[3] */ 8072f56adcSTsiChungLiew MCD_SET_VAR(taskChan, 28, (u32) 0x80000001); /* inc[4] */ 8172f56adcSTsiChungLiew MCD_SET_VAR(taskChan, 29, (u32) 0x40000000); /* inc[5] */ 8272f56adcSTsiChungLiew 8372f56adcSTsiChungLiew /* Set the task's Enable bit in its Task Control Register */ 8472f56adcSTsiChungLiew MCD_dmaBar->taskControl[channel] |= (u16) 0x8000; 8572f56adcSTsiChungLiew } 8672f56adcSTsiChungLiew 8772f56adcSTsiChungLiew /* Task 2 */ 8872f56adcSTsiChungLiew 8972f56adcSTsiChungLiew void MCD_startDmaChainEu(int *currBD, short srcIncr, short destIncr, 9072f56adcSTsiChungLiew int xferSize, short xferSizeIncr, int *cSave, 9172f56adcSTsiChungLiew volatile TaskTableEntry * taskTable, int channel) 9272f56adcSTsiChungLiew { 9372f56adcSTsiChungLiew volatile TaskTableEntry *taskChan = taskTable + channel; 9472f56adcSTsiChungLiew 9572f56adcSTsiChungLiew MCD_SET_VAR(taskChan, 3, (u32) currBD); /* var[3] */ 9672f56adcSTsiChungLiew MCD_SET_VAR(taskChan, 25, (u32) (0xe000 << 16) | (0xffff & srcIncr)); /* inc[1] */ 9772f56adcSTsiChungLiew MCD_SET_VAR(taskChan, 24, (u32) (0xe000 << 16) | (0xffff & destIncr)); /* inc[0] */ 9872f56adcSTsiChungLiew MCD_SET_VAR(taskChan, 12, (u32) xferSize); /* var[12] */ 9972f56adcSTsiChungLiew MCD_SET_VAR(taskChan, 26, (u32) (0x2000 << 16) | (0xffff & xferSizeIncr)); /* inc[2] */ 10072f56adcSTsiChungLiew MCD_SET_VAR(taskChan, 0, (u32) cSave); /* var[0] */ 10172f56adcSTsiChungLiew MCD_SET_VAR(taskChan, 1, (u32) 0x00000000); /* var[1] */ 10272f56adcSTsiChungLiew MCD_SET_VAR(taskChan, 2, (u32) 0x00000000); /* var[2] */ 10372f56adcSTsiChungLiew MCD_SET_VAR(taskChan, 4, (u32) 0x00000000); /* var[4] */ 10472f56adcSTsiChungLiew MCD_SET_VAR(taskChan, 5, (u32) 0x00000000); /* var[5] */ 10572f56adcSTsiChungLiew MCD_SET_VAR(taskChan, 6, (u32) 0x00000000); /* var[6] */ 10672f56adcSTsiChungLiew MCD_SET_VAR(taskChan, 7, (u32) 0x00000000); /* var[7] */ 10772f56adcSTsiChungLiew MCD_SET_VAR(taskChan, 8, (u32) 0x00000000); /* var[8] */ 10872f56adcSTsiChungLiew MCD_SET_VAR(taskChan, 9, (u32) 0x00000000); /* var[9] */ 10972f56adcSTsiChungLiew MCD_SET_VAR(taskChan, 10, (u32) 0x00000000); /* var[10] */ 11072f56adcSTsiChungLiew MCD_SET_VAR(taskChan, 11, (u32) 0x00000000); /* var[11] */ 11172f56adcSTsiChungLiew MCD_SET_VAR(taskChan, 13, (u32) 0x00000000); /* var[13] */ 11272f56adcSTsiChungLiew MCD_SET_VAR(taskChan, 14, (u32) 0x80000000); /* var[14] */ 11372f56adcSTsiChungLiew MCD_SET_VAR(taskChan, 15, (u32) 0x00000010); /* var[15] */ 11472f56adcSTsiChungLiew MCD_SET_VAR(taskChan, 16, (u32) 0x00000001); /* var[16] */ 11572f56adcSTsiChungLiew MCD_SET_VAR(taskChan, 17, (u32) 0x00000004); /* var[17] */ 11672f56adcSTsiChungLiew MCD_SET_VAR(taskChan, 18, (u32) 0x08000000); /* var[18] */ 11772f56adcSTsiChungLiew MCD_SET_VAR(taskChan, 27, (u32) 0x00000000); /* inc[3] */ 11872f56adcSTsiChungLiew MCD_SET_VAR(taskChan, 28, (u32) 0x80000000); /* inc[4] */ 11972f56adcSTsiChungLiew MCD_SET_VAR(taskChan, 29, (u32) 0xc0000000); /* inc[5] */ 12072f56adcSTsiChungLiew MCD_SET_VAR(taskChan, 30, (u32) 0x80000001); /* inc[6] */ 12172f56adcSTsiChungLiew MCD_SET_VAR(taskChan, 31, (u32) 0x40000000); /* inc[7] */ 12272f56adcSTsiChungLiew 12372f56adcSTsiChungLiew /* Set the task's Enable bit in its Task Control Register */ 12472f56adcSTsiChungLiew MCD_dmaBar->taskControl[channel] |= (u16) 0x8000; 12572f56adcSTsiChungLiew } 12672f56adcSTsiChungLiew 12772f56adcSTsiChungLiew /* Task 3 */ 12872f56adcSTsiChungLiew 12972f56adcSTsiChungLiew void MCD_startDmaSingleEu(char *srcAddr, short srcIncr, char *destAddr, 13072f56adcSTsiChungLiew short destIncr, int dmaSize, short xferSizeIncr, 13172f56adcSTsiChungLiew int flags, int *currBD, int *cSave, 13272f56adcSTsiChungLiew volatile TaskTableEntry * taskTable, int channel) 13372f56adcSTsiChungLiew { 13472f56adcSTsiChungLiew volatile TaskTableEntry *taskChan = taskTable + channel; 13572f56adcSTsiChungLiew 13672f56adcSTsiChungLiew MCD_SET_VAR(taskChan, 8, (u32) srcAddr); /* var[8] */ 13772f56adcSTsiChungLiew MCD_SET_VAR(taskChan, 25, (u32) (0xe000 << 16) | (0xffff & srcIncr)); /* inc[1] */ 13872f56adcSTsiChungLiew MCD_SET_VAR(taskChan, 3, (u32) destAddr); /* var[3] */ 13972f56adcSTsiChungLiew MCD_SET_VAR(taskChan, 24, (u32) (0xe000 << 16) | (0xffff & destIncr)); /* inc[0] */ 14072f56adcSTsiChungLiew MCD_SET_VAR(taskChan, 4, (u32) dmaSize); /* var[4] */ 14172f56adcSTsiChungLiew MCD_SET_VAR(taskChan, 26, (u32) (0x2000 << 16) | (0xffff & xferSizeIncr)); /* inc[2] */ 14272f56adcSTsiChungLiew MCD_SET_VAR(taskChan, 6, (u32) flags); /* var[6] */ 14372f56adcSTsiChungLiew MCD_SET_VAR(taskChan, 2, (u32) currBD); /* var[2] */ 14472f56adcSTsiChungLiew MCD_SET_VAR(taskChan, 0, (u32) cSave); /* var[0] */ 14572f56adcSTsiChungLiew MCD_SET_VAR(taskChan, 1, (u32) 0x00000000); /* var[1] */ 14672f56adcSTsiChungLiew MCD_SET_VAR(taskChan, 5, (u32) 0x00000000); /* var[5] */ 14772f56adcSTsiChungLiew MCD_SET_VAR(taskChan, 7, (u32) 0x00000000); /* var[7] */ 14872f56adcSTsiChungLiew MCD_SET_VAR(taskChan, 9, (u32) 0x00000000); /* var[9] */ 14972f56adcSTsiChungLiew MCD_SET_VAR(taskChan, 10, (u32) 0x00000001); /* var[10] */ 15072f56adcSTsiChungLiew MCD_SET_VAR(taskChan, 11, (u32) 0x00000004); /* var[11] */ 15172f56adcSTsiChungLiew MCD_SET_VAR(taskChan, 12, (u32) 0x08000000); /* var[12] */ 15272f56adcSTsiChungLiew MCD_SET_VAR(taskChan, 27, (u32) 0x00000000); /* inc[3] */ 15372f56adcSTsiChungLiew MCD_SET_VAR(taskChan, 28, (u32) 0xc0000000); /* inc[4] */ 15472f56adcSTsiChungLiew MCD_SET_VAR(taskChan, 29, (u32) 0x80000000); /* inc[5] */ 15572f56adcSTsiChungLiew MCD_SET_VAR(taskChan, 30, (u32) 0x80000001); /* inc[6] */ 15672f56adcSTsiChungLiew MCD_SET_VAR(taskChan, 31, (u32) 0x40000000); /* inc[7] */ 15772f56adcSTsiChungLiew 15872f56adcSTsiChungLiew /* Set the task's Enable bit in its Task Control Register */ 15972f56adcSTsiChungLiew MCD_dmaBar->taskControl[channel] |= (u16) 0x8000; 16072f56adcSTsiChungLiew } 16172f56adcSTsiChungLiew 16272f56adcSTsiChungLiew /* Task 4 */ 16372f56adcSTsiChungLiew 16472f56adcSTsiChungLiew void MCD_startDmaENetRcv(char *bDBase, char *currBD, char *rcvFifoPtr, 16572f56adcSTsiChungLiew volatile TaskTableEntry * taskTable, int channel) 16672f56adcSTsiChungLiew { 16772f56adcSTsiChungLiew volatile TaskTableEntry *taskChan = taskTable + channel; 16872f56adcSTsiChungLiew 16972f56adcSTsiChungLiew MCD_SET_VAR(taskChan, 0, (u32) bDBase); /* var[0] */ 17072f56adcSTsiChungLiew MCD_SET_VAR(taskChan, 3, (u32) currBD); /* var[3] */ 17172f56adcSTsiChungLiew MCD_SET_VAR(taskChan, 6, (u32) rcvFifoPtr); /* var[6] */ 17272f56adcSTsiChungLiew MCD_SET_VAR(taskChan, 1, (u32) 0x00000000); /* var[1] */ 17372f56adcSTsiChungLiew MCD_SET_VAR(taskChan, 2, (u32) 0x00000000); /* var[2] */ 17472f56adcSTsiChungLiew MCD_SET_VAR(taskChan, 4, (u32) 0x00000000); /* var[4] */ 17572f56adcSTsiChungLiew MCD_SET_VAR(taskChan, 5, (u32) 0x00000000); /* var[5] */ 17672f56adcSTsiChungLiew MCD_SET_VAR(taskChan, 7, (u32) 0x00000000); /* var[7] */ 17772f56adcSTsiChungLiew MCD_SET_VAR(taskChan, 8, (u32) 0x00000000); /* var[8] */ 17872f56adcSTsiChungLiew MCD_SET_VAR(taskChan, 9, (u32) 0x0000ffff); /* var[9] */ 17972f56adcSTsiChungLiew MCD_SET_VAR(taskChan, 10, (u32) 0x30000000); /* var[10] */ 18072f56adcSTsiChungLiew MCD_SET_VAR(taskChan, 11, (u32) 0x0fffffff); /* var[11] */ 18172f56adcSTsiChungLiew MCD_SET_VAR(taskChan, 12, (u32) 0x00000008); /* var[12] */ 18272f56adcSTsiChungLiew MCD_SET_VAR(taskChan, 24, (u32) 0x00000000); /* inc[0] */ 18372f56adcSTsiChungLiew MCD_SET_VAR(taskChan, 25, (u32) 0x60000000); /* inc[1] */ 18472f56adcSTsiChungLiew MCD_SET_VAR(taskChan, 26, (u32) 0x20000004); /* inc[2] */ 18572f56adcSTsiChungLiew MCD_SET_VAR(taskChan, 27, (u32) 0x40000000); /* inc[3] */ 18672f56adcSTsiChungLiew 18772f56adcSTsiChungLiew /* Set the task's Enable bit in its Task Control Register */ 18872f56adcSTsiChungLiew MCD_dmaBar->taskControl[channel] |= (u16) 0x8000; 18972f56adcSTsiChungLiew } 19072f56adcSTsiChungLiew 19172f56adcSTsiChungLiew /* Task 5 */ 19272f56adcSTsiChungLiew 19372f56adcSTsiChungLiew void MCD_startDmaENetXmit(char *bDBase, char *currBD, char *xmitFifoPtr, 19472f56adcSTsiChungLiew volatile TaskTableEntry * taskTable, int channel) 19572f56adcSTsiChungLiew { 19672f56adcSTsiChungLiew volatile TaskTableEntry *taskChan = taskTable + channel; 19772f56adcSTsiChungLiew 19872f56adcSTsiChungLiew MCD_SET_VAR(taskChan, 0, (u32) bDBase); /* var[0] */ 19972f56adcSTsiChungLiew MCD_SET_VAR(taskChan, 3, (u32) currBD); /* var[3] */ 20072f56adcSTsiChungLiew MCD_SET_VAR(taskChan, 11, (u32) xmitFifoPtr); /* var[11] */ 20172f56adcSTsiChungLiew MCD_SET_VAR(taskChan, 1, (u32) 0x00000000); /* var[1] */ 20272f56adcSTsiChungLiew MCD_SET_VAR(taskChan, 2, (u32) 0x00000000); /* var[2] */ 20372f56adcSTsiChungLiew MCD_SET_VAR(taskChan, 4, (u32) 0x00000000); /* var[4] */ 20472f56adcSTsiChungLiew MCD_SET_VAR(taskChan, 5, (u32) 0x00000000); /* var[5] */ 20572f56adcSTsiChungLiew MCD_SET_VAR(taskChan, 6, (u32) 0x00000000); /* var[6] */ 20672f56adcSTsiChungLiew MCD_SET_VAR(taskChan, 7, (u32) 0x00000000); /* var[7] */ 20772f56adcSTsiChungLiew MCD_SET_VAR(taskChan, 8, (u32) 0x00000000); /* var[8] */ 20872f56adcSTsiChungLiew MCD_SET_VAR(taskChan, 9, (u32) 0x00000000); /* var[9] */ 20972f56adcSTsiChungLiew MCD_SET_VAR(taskChan, 10, (u32) 0x00000000); /* var[10] */ 21072f56adcSTsiChungLiew MCD_SET_VAR(taskChan, 12, (u32) 0x00000000); /* var[12] */ 21172f56adcSTsiChungLiew MCD_SET_VAR(taskChan, 13, (u32) 0x0000ffff); /* var[13] */ 21272f56adcSTsiChungLiew MCD_SET_VAR(taskChan, 14, (u32) 0xffffffff); /* var[14] */ 21372f56adcSTsiChungLiew MCD_SET_VAR(taskChan, 15, (u32) 0x00000004); /* var[15] */ 21472f56adcSTsiChungLiew MCD_SET_VAR(taskChan, 16, (u32) 0x00000008); /* var[16] */ 21572f56adcSTsiChungLiew MCD_SET_VAR(taskChan, 24, (u32) 0x00000000); /* inc[0] */ 21672f56adcSTsiChungLiew MCD_SET_VAR(taskChan, 25, (u32) 0x60000000); /* inc[1] */ 21772f56adcSTsiChungLiew MCD_SET_VAR(taskChan, 26, (u32) 0x40000000); /* inc[2] */ 21872f56adcSTsiChungLiew MCD_SET_VAR(taskChan, 27, (u32) 0xc000fffc); /* inc[3] */ 21972f56adcSTsiChungLiew MCD_SET_VAR(taskChan, 28, (u32) 0xe0000004); /* inc[4] */ 22072f56adcSTsiChungLiew MCD_SET_VAR(taskChan, 29, (u32) 0x80000000); /* inc[5] */ 22172f56adcSTsiChungLiew MCD_SET_VAR(taskChan, 30, (u32) 0x4000ffff); /* inc[6] */ 22272f56adcSTsiChungLiew MCD_SET_VAR(taskChan, 31, (u32) 0xe0000001); /* inc[7] */ 22372f56adcSTsiChungLiew 22472f56adcSTsiChungLiew /* Set the task's Enable bit in its Task Control Register */ 22572f56adcSTsiChungLiew MCD_dmaBar->taskControl[channel] |= (u16) 0x8000; 22672f56adcSTsiChungLiew } 227