]> git.kernelconcepts.de Git - karo-tx-uboot.git/blob - drivers/dma/MCD_tasksInit.c
Merge branch 'master' of git://git.denx.de/u-boot-mips
[karo-tx-uboot.git] / drivers / dma / MCD_tasksInit.c
1 /*
2  * Copyright (C) 2004-2007 Freescale Semiconductor, Inc.
3  *
4  * See file CREDITS for list of people who contributed to this
5  * project.
6  *
7  * This program is free software; you can redistribute it and/or
8  * modify it under the terms of the GNU General Public License as
9  * published by the Free Software Foundation; either version 2 of
10  * the License, or (at your option) any later version.
11  *
12  * This program is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15  * GNU General Public License for more details.
16  *
17  * You should have received a copy of the GNU General Public License
18  * along with this program; if not, write to the Free Software
19  * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
20  * MA 02111-1307 USA
21  */
22
23 #include <common.h>
24
25 /* Functions for initializing variable tables of different types of tasks. */
26
27 /*
28  * Do not edit!
29  */
30
31 #include <MCD_dma.h>
32
33 extern dmaRegs *MCD_dmaBar;
34
35 /* Task 0 */
36
37 void MCD_startDmaChainNoEu(int *currBD, short srcIncr, short destIncr,
38                            int xferSize, short xferSizeIncr, int *cSave,
39                            volatile TaskTableEntry * taskTable, int channel)
40 {
41         volatile TaskTableEntry *taskChan = taskTable + channel;
42
43         MCD_SET_VAR(taskChan, 2, (u32) currBD); /* var[2] */
44         MCD_SET_VAR(taskChan, 25, (u32) (0xe000 << 16) | (0xffff & srcIncr));   /* inc[1] */
45         MCD_SET_VAR(taskChan, 24, (u32) (0xe000 << 16) | (0xffff & destIncr));  /* inc[0] */
46         MCD_SET_VAR(taskChan, 11, (u32) xferSize);      /* var[11] */
47         MCD_SET_VAR(taskChan, 26, (u32) (0x2000 << 16) | (0xffff & xferSizeIncr));      /* inc[2] */
48         MCD_SET_VAR(taskChan, 0, (u32) cSave);  /* var[0] */
49         MCD_SET_VAR(taskChan, 1, (u32) 0x00000000);     /* var[1] */
50         MCD_SET_VAR(taskChan, 3, (u32) 0x00000000);     /* var[3] */
51         MCD_SET_VAR(taskChan, 4, (u32) 0x00000000);     /* var[4] */
52         MCD_SET_VAR(taskChan, 5, (u32) 0x00000000);     /* var[5] */
53         MCD_SET_VAR(taskChan, 6, (u32) 0x00000000);     /* var[6] */
54         MCD_SET_VAR(taskChan, 7, (u32) 0x00000000);     /* var[7] */
55         MCD_SET_VAR(taskChan, 8, (u32) 0x00000000);     /* var[8] */
56         MCD_SET_VAR(taskChan, 9, (u32) 0x00000000);     /* var[9] */
57         MCD_SET_VAR(taskChan, 10, (u32) 0x00000000);    /* var[10] */
58         MCD_SET_VAR(taskChan, 12, (u32) 0x00000000);    /* var[12] */
59         MCD_SET_VAR(taskChan, 13, (u32) 0x80000000);    /* var[13] */
60         MCD_SET_VAR(taskChan, 14, (u32) 0x00000010);    /* var[14] */
61         MCD_SET_VAR(taskChan, 15, (u32) 0x00000004);    /* var[15] */
62         MCD_SET_VAR(taskChan, 16, (u32) 0x08000000);    /* var[16] */
63         MCD_SET_VAR(taskChan, 27, (u32) 0x00000000);    /* inc[3] */
64         MCD_SET_VAR(taskChan, 28, (u32) 0x80000000);    /* inc[4] */
65         MCD_SET_VAR(taskChan, 29, (u32) 0x80000001);    /* inc[5] */
66         MCD_SET_VAR(taskChan, 30, (u32) 0x40000000);    /* inc[6] */
67
68         /* Set the task's Enable bit in its Task Control Register */
69         MCD_dmaBar->taskControl[channel] |= (u16) 0x8000;
70 }
71
72 /* Task 1 */
73
74 void MCD_startDmaSingleNoEu(char *srcAddr, short srcIncr, char *destAddr,
75                             short destIncr, int dmaSize, short xferSizeIncr,
76                             int flags, int *currBD, int *cSave,
77                             volatile TaskTableEntry * taskTable, int channel)
78 {
79         volatile TaskTableEntry *taskChan = taskTable + channel;
80
81         MCD_SET_VAR(taskChan, 7, (u32) srcAddr);        /* var[7] */
82         MCD_SET_VAR(taskChan, 25, (u32) (0xe000 << 16) | (0xffff & srcIncr));   /* inc[1] */
83         MCD_SET_VAR(taskChan, 2, (u32) destAddr);       /* var[2] */
84         MCD_SET_VAR(taskChan, 24, (u32) (0xe000 << 16) | (0xffff & destIncr));  /* inc[0] */
85         MCD_SET_VAR(taskChan, 3, (u32) dmaSize);        /* var[3] */
86         MCD_SET_VAR(taskChan, 26, (u32) (0x2000 << 16) | (0xffff & xferSizeIncr));      /* inc[2] */
87         MCD_SET_VAR(taskChan, 5, (u32) flags);  /* var[5] */
88         MCD_SET_VAR(taskChan, 1, (u32) currBD); /* var[1] */
89         MCD_SET_VAR(taskChan, 0, (u32) cSave);  /* var[0] */
90         MCD_SET_VAR(taskChan, 4, (u32) 0x00000000);     /* var[4] */
91         MCD_SET_VAR(taskChan, 6, (u32) 0x00000000);     /* var[6] */
92         MCD_SET_VAR(taskChan, 8, (u32) 0x00000000);     /* var[8] */
93         MCD_SET_VAR(taskChan, 9, (u32) 0x00000004);     /* var[9] */
94         MCD_SET_VAR(taskChan, 10, (u32) 0x08000000);    /* var[10] */
95         MCD_SET_VAR(taskChan, 27, (u32) 0x00000000);    /* inc[3] */
96         MCD_SET_VAR(taskChan, 28, (u32) 0x80000001);    /* inc[4] */
97         MCD_SET_VAR(taskChan, 29, (u32) 0x40000000);    /* inc[5] */
98
99         /* Set the task's Enable bit in its Task Control Register */
100         MCD_dmaBar->taskControl[channel] |= (u16) 0x8000;
101 }
102
103 /* Task 2 */
104
105 void MCD_startDmaChainEu(int *currBD, short srcIncr, short destIncr,
106                          int xferSize, short xferSizeIncr, int *cSave,
107                          volatile TaskTableEntry * taskTable, int channel)
108 {
109         volatile TaskTableEntry *taskChan = taskTable + channel;
110
111         MCD_SET_VAR(taskChan, 3, (u32) currBD); /* var[3] */
112         MCD_SET_VAR(taskChan, 25, (u32) (0xe000 << 16) | (0xffff & srcIncr));   /* inc[1] */
113         MCD_SET_VAR(taskChan, 24, (u32) (0xe000 << 16) | (0xffff & destIncr));  /* inc[0] */
114         MCD_SET_VAR(taskChan, 12, (u32) xferSize);      /* var[12] */
115         MCD_SET_VAR(taskChan, 26, (u32) (0x2000 << 16) | (0xffff & xferSizeIncr));      /* inc[2] */
116         MCD_SET_VAR(taskChan, 0, (u32) cSave);  /* var[0] */
117         MCD_SET_VAR(taskChan, 1, (u32) 0x00000000);     /* var[1] */
118         MCD_SET_VAR(taskChan, 2, (u32) 0x00000000);     /* var[2] */
119         MCD_SET_VAR(taskChan, 4, (u32) 0x00000000);     /* var[4] */
120         MCD_SET_VAR(taskChan, 5, (u32) 0x00000000);     /* var[5] */
121         MCD_SET_VAR(taskChan, 6, (u32) 0x00000000);     /* var[6] */
122         MCD_SET_VAR(taskChan, 7, (u32) 0x00000000);     /* var[7] */
123         MCD_SET_VAR(taskChan, 8, (u32) 0x00000000);     /* var[8] */
124         MCD_SET_VAR(taskChan, 9, (u32) 0x00000000);     /* var[9] */
125         MCD_SET_VAR(taskChan, 10, (u32) 0x00000000);    /* var[10] */
126         MCD_SET_VAR(taskChan, 11, (u32) 0x00000000);    /* var[11] */
127         MCD_SET_VAR(taskChan, 13, (u32) 0x00000000);    /* var[13] */
128         MCD_SET_VAR(taskChan, 14, (u32) 0x80000000);    /* var[14] */
129         MCD_SET_VAR(taskChan, 15, (u32) 0x00000010);    /* var[15] */
130         MCD_SET_VAR(taskChan, 16, (u32) 0x00000001);    /* var[16] */
131         MCD_SET_VAR(taskChan, 17, (u32) 0x00000004);    /* var[17] */
132         MCD_SET_VAR(taskChan, 18, (u32) 0x08000000);    /* var[18] */
133         MCD_SET_VAR(taskChan, 27, (u32) 0x00000000);    /* inc[3] */
134         MCD_SET_VAR(taskChan, 28, (u32) 0x80000000);    /* inc[4] */
135         MCD_SET_VAR(taskChan, 29, (u32) 0xc0000000);    /* inc[5] */
136         MCD_SET_VAR(taskChan, 30, (u32) 0x80000001);    /* inc[6] */
137         MCD_SET_VAR(taskChan, 31, (u32) 0x40000000);    /* inc[7] */
138
139         /* Set the task's Enable bit in its Task Control Register */
140         MCD_dmaBar->taskControl[channel] |= (u16) 0x8000;
141 }
142
143 /* Task 3 */
144
145 void MCD_startDmaSingleEu(char *srcAddr, short srcIncr, char *destAddr,
146                           short destIncr, int dmaSize, short xferSizeIncr,
147                           int flags, int *currBD, int *cSave,
148                           volatile TaskTableEntry * taskTable, int channel)
149 {
150         volatile TaskTableEntry *taskChan = taskTable + channel;
151
152         MCD_SET_VAR(taskChan, 8, (u32) srcAddr);        /* var[8] */
153         MCD_SET_VAR(taskChan, 25, (u32) (0xe000 << 16) | (0xffff & srcIncr));   /* inc[1] */
154         MCD_SET_VAR(taskChan, 3, (u32) destAddr);       /* var[3] */
155         MCD_SET_VAR(taskChan, 24, (u32) (0xe000 << 16) | (0xffff & destIncr));  /* inc[0] */
156         MCD_SET_VAR(taskChan, 4, (u32) dmaSize);        /* var[4] */
157         MCD_SET_VAR(taskChan, 26, (u32) (0x2000 << 16) | (0xffff & xferSizeIncr));      /* inc[2] */
158         MCD_SET_VAR(taskChan, 6, (u32) flags);  /* var[6] */
159         MCD_SET_VAR(taskChan, 2, (u32) currBD); /* var[2] */
160         MCD_SET_VAR(taskChan, 0, (u32) cSave);  /* var[0] */
161         MCD_SET_VAR(taskChan, 1, (u32) 0x00000000);     /* var[1] */
162         MCD_SET_VAR(taskChan, 5, (u32) 0x00000000);     /* var[5] */
163         MCD_SET_VAR(taskChan, 7, (u32) 0x00000000);     /* var[7] */
164         MCD_SET_VAR(taskChan, 9, (u32) 0x00000000);     /* var[9] */
165         MCD_SET_VAR(taskChan, 10, (u32) 0x00000001);    /* var[10] */
166         MCD_SET_VAR(taskChan, 11, (u32) 0x00000004);    /* var[11] */
167         MCD_SET_VAR(taskChan, 12, (u32) 0x08000000);    /* var[12] */
168         MCD_SET_VAR(taskChan, 27, (u32) 0x00000000);    /* inc[3] */
169         MCD_SET_VAR(taskChan, 28, (u32) 0xc0000000);    /* inc[4] */
170         MCD_SET_VAR(taskChan, 29, (u32) 0x80000000);    /* inc[5] */
171         MCD_SET_VAR(taskChan, 30, (u32) 0x80000001);    /* inc[6] */
172         MCD_SET_VAR(taskChan, 31, (u32) 0x40000000);    /* inc[7] */
173
174         /* Set the task's Enable bit in its Task Control Register */
175         MCD_dmaBar->taskControl[channel] |= (u16) 0x8000;
176 }
177
178 /* Task 4 */
179
180 void MCD_startDmaENetRcv(char *bDBase, char *currBD, char *rcvFifoPtr,
181                          volatile TaskTableEntry * taskTable, int channel)
182 {
183         volatile TaskTableEntry *taskChan = taskTable + channel;
184
185         MCD_SET_VAR(taskChan, 0, (u32) bDBase); /* var[0] */
186         MCD_SET_VAR(taskChan, 3, (u32) currBD); /* var[3] */
187         MCD_SET_VAR(taskChan, 6, (u32) rcvFifoPtr);     /* var[6] */
188         MCD_SET_VAR(taskChan, 1, (u32) 0x00000000);     /* var[1] */
189         MCD_SET_VAR(taskChan, 2, (u32) 0x00000000);     /* var[2] */
190         MCD_SET_VAR(taskChan, 4, (u32) 0x00000000);     /* var[4] */
191         MCD_SET_VAR(taskChan, 5, (u32) 0x00000000);     /* var[5] */
192         MCD_SET_VAR(taskChan, 7, (u32) 0x00000000);     /* var[7] */
193         MCD_SET_VAR(taskChan, 8, (u32) 0x00000000);     /* var[8] */
194         MCD_SET_VAR(taskChan, 9, (u32) 0x0000ffff);     /* var[9] */
195         MCD_SET_VAR(taskChan, 10, (u32) 0x30000000);    /* var[10] */
196         MCD_SET_VAR(taskChan, 11, (u32) 0x0fffffff);    /* var[11] */
197         MCD_SET_VAR(taskChan, 12, (u32) 0x00000008);    /* var[12] */
198         MCD_SET_VAR(taskChan, 24, (u32) 0x00000000);    /* inc[0] */
199         MCD_SET_VAR(taskChan, 25, (u32) 0x60000000);    /* inc[1] */
200         MCD_SET_VAR(taskChan, 26, (u32) 0x20000004);    /* inc[2] */
201         MCD_SET_VAR(taskChan, 27, (u32) 0x40000000);    /* inc[3] */
202
203         /* Set the task's Enable bit in its Task Control Register */
204         MCD_dmaBar->taskControl[channel] |= (u16) 0x8000;
205 }
206
207 /* Task 5 */
208
209 void MCD_startDmaENetXmit(char *bDBase, char *currBD, char *xmitFifoPtr,
210                           volatile TaskTableEntry * taskTable, int channel)
211 {
212         volatile TaskTableEntry *taskChan = taskTable + channel;
213
214         MCD_SET_VAR(taskChan, 0, (u32) bDBase); /* var[0] */
215         MCD_SET_VAR(taskChan, 3, (u32) currBD); /* var[3] */
216         MCD_SET_VAR(taskChan, 11, (u32) xmitFifoPtr);   /* var[11] */
217         MCD_SET_VAR(taskChan, 1, (u32) 0x00000000);     /* var[1] */
218         MCD_SET_VAR(taskChan, 2, (u32) 0x00000000);     /* var[2] */
219         MCD_SET_VAR(taskChan, 4, (u32) 0x00000000);     /* var[4] */
220         MCD_SET_VAR(taskChan, 5, (u32) 0x00000000);     /* var[5] */
221         MCD_SET_VAR(taskChan, 6, (u32) 0x00000000);     /* var[6] */
222         MCD_SET_VAR(taskChan, 7, (u32) 0x00000000);     /* var[7] */
223         MCD_SET_VAR(taskChan, 8, (u32) 0x00000000);     /* var[8] */
224         MCD_SET_VAR(taskChan, 9, (u32) 0x00000000);     /* var[9] */
225         MCD_SET_VAR(taskChan, 10, (u32) 0x00000000);    /* var[10] */
226         MCD_SET_VAR(taskChan, 12, (u32) 0x00000000);    /* var[12] */
227         MCD_SET_VAR(taskChan, 13, (u32) 0x0000ffff);    /* var[13] */
228         MCD_SET_VAR(taskChan, 14, (u32) 0xffffffff);    /* var[14] */
229         MCD_SET_VAR(taskChan, 15, (u32) 0x00000004);    /* var[15] */
230         MCD_SET_VAR(taskChan, 16, (u32) 0x00000008);    /* var[16] */
231         MCD_SET_VAR(taskChan, 24, (u32) 0x00000000);    /* inc[0] */
232         MCD_SET_VAR(taskChan, 25, (u32) 0x60000000);    /* inc[1] */
233         MCD_SET_VAR(taskChan, 26, (u32) 0x40000000);    /* inc[2] */
234         MCD_SET_VAR(taskChan, 27, (u32) 0xc000fffc);    /* inc[3] */
235         MCD_SET_VAR(taskChan, 28, (u32) 0xe0000004);    /* inc[4] */
236         MCD_SET_VAR(taskChan, 29, (u32) 0x80000000);    /* inc[5] */
237         MCD_SET_VAR(taskChan, 30, (u32) 0x4000ffff);    /* inc[6] */
238         MCD_SET_VAR(taskChan, 31, (u32) 0xe0000001);    /* inc[7] */
239
240         /* Set the task's Enable bit in its Task Control Register */
241         MCD_dmaBar->taskControl[channel] |= (u16) 0x8000;
242 }