* COP2 testing in progress.
[deliverable/binutils-gdb.git] / sim / testsuite / sky / t-dma.c
CommitLineData
fc609c6c
JL
1#include <stdio.h>
2#include <string.h>
3
4#define error(x) { printf(x); exit( 999); }
5
6void wrtest( unsigned *reg, unsigned w, unsigned e)
7{
8 unsigned r;
9
10 *reg = w;
11 r = *reg;
12 if( r != e)
13 {
14 printf( "wrtest: at 0x%08lx wrote=0x%08x read=0x%08x expected=0x%08x\n",
15 reg, w, r, e);
16 exit( 999);
17 }
18}
19
20/*
21DMA tag in target format (LE).
22BE=0x00000000_00000000_aaaaaaa0_ip00cccc
23*/
24typedef struct { unsigned tagL __attribute__ ((aligned (16))), tagH, pke1, pke0; } quad;
25
26 quad data0 = { 3, 2, 1, 0};
27
28/* DMArefe 1, data0 */ quad dma_refe = { 0x0c000001, 000, 0, 0};
29/* DMAcnt 2 */ quad dma_cnt = { 0x10000002, 0, 0, 0};
30 quad data1 = { 7, 6, 5, 4};
31 quad data2 = { 11, 10, 9, 8};
32/* DMAnext 3,dma_ref */ quad dma_next = { 0x20000003, 000, 0, 0};
33 quad data3 = { 15, 14, 13, 12};
34 quad data4 = { 19, 18, 17, 16};
35 quad data5 = { 23, 22, 21, 20};
36
37 quad data6 = { 27, 26, 25, 24};
38 quad data7 = { 31, 30, 29, 28};
39 quad data8 = { 35, 34, 33, 32};
40/* DMAref 1,data6 */ quad dma_ref = { 0x30000001, 000, 0, 0};
41/* DMArefs 2,data7 */ quad dma_refs = { 0x40000002, 000, 0, 0};
42/* DMAcall 3,dma_cal2 */quad dma_call = { 0x50000003, 000, 0, 0};
43 quad data9 = { 39, 38, 37, 36};
44 quad dataA = { 43, 42, 41, 40};
45 quad dataB = { 47, 46, 45, 44};
46/* DMAend 1 */ quad dma_end = { 0x78000001, 0, 0, 0};
47 quad dataE = { 59, 58, 57, 56};
48
49/* DMAcall 1,dma_rt2 */ quad dma_cal2 = { 0x50000001, 000, 0, 0 };
50 quad dataC = { 51, 50, 49, 48};
51/* DMAret 0 */ quad dma_ret = { 0x60000000, 0, 0, 0};
52
53/* DMAret 1 */ quad dma_rt2 = { 0x60000001, 0, 0, 0};
54 quad dataD = { 55, 54, 53, 52};
55
56int main()
57{
58
59#define DMA_D0_START 0x10008000
60#define DMA_D0_CHCR (unsigned*) 0x10008000
61#define DMA_Dn_CHCR__STR 0x00000100
62#define DMA_Dn_CHCR__TIE 0x00000080
63#define DMA_Dn_CHCR__TTE 0x00000040
64#define DMA_Dn_CHCR__MOD 0x0000000c
65#define DMA_Dn_CHCR__MOD_NORM 0x00000000
66#define DMA_Dn_CHCR__MOD_CHAIN 0x00000004
67#define DMA_Dn_CHCR__DIR 0x00000001
68#define DMA_D0_MADR (unsigned*) 0x10008010
69#define DMA_D0_QWC (unsigned*) 0x10008020
70#define DMA_D0_TADR (unsigned*) 0x10008030
71#define DMA_D0_ASR0 (unsigned*) 0x10008040
72#define DMA_D0_ASR1 (unsigned*) 0x10008050
73#define DMA_D0_PKTFLAG (unsigned*) 0x10008060 /* virtual reg to indicate presence of tag in data */
74#define DMA_D0_END 0x10008070
75
76#define DMA_D1_START 0x10009000
77#define DMA_D1_CHCR (unsigned*) 0x10009000
78#define DMA_D1_MADR (unsigned*) 0x10009010
79#define DMA_D1_QWC (unsigned*) 0x10009020
80#define DMA_D1_TADR (unsigned*) 0x10009030
81#define DMA_D1_ASR0 (unsigned*) 0x10009040
82#define DMA_D1_ASR1 (unsigned*) 0x10009050
83#define DMA_D1_PKTFLAG (unsigned*) 0x10009060 /* virtual reg to indicate presence of tag in data */
84#define DMA_D1_END 0x10009070
85
86#define DMA_D2_START 0x1000a000
87#define DMA_D2_CHCR (unsigned*) 0x1000a000
88#define DMA_D2_MADR (unsigned*) 0x1000a010
89#define DMA_D2_QWC (unsigned*) 0x1000a020
90#define DMA_D2_TADR (unsigned*) 0x1000a030
91#define DMA_D2_ASR0 (unsigned*) 0x1000a040
92#define DMA_D2_ASR1 (unsigned*) 0x1000a050
93#define DMA_D2_PKTFLAG (unsigned*) 0x1000a060 /* virtual reg to indicate presence of tag in data */
94#define DMA_D2_END 0x1000a070
95
96#define DMA_D_CTRL (unsigned*) 0x1000e000
97#define DMA_D_CTRL__DMAE 0x00000001
98#define DMA_D_STAT (unsigned*) 0x1000e010
99#define DMA_D_STAT__TOGGLE 0x63ff0000
100#define DMA_D_STAT__CLEAR 0x0000e3ff
101#define DMA_D_PCR (unsigned*) 0x1000e020
102#define DMA_D_PCR__PCE 0x80000000
103#define DMA_D_PCR__CDE 0x03ff0000
104#define DMA_D_PCR__CDE0 0x00010000
105#define DMA_D_PCR__CDE1 0x00020000
106#define DMA_D_PCR__CDE2 0x00040000
107#define DMA_D_SQWC (unsigned*) 0x1000e030
108#define DMA_D_RBSR (unsigned*) 0x1000e040
109#define DMA_D_RBOR (unsigned*) 0x1000e050
110#define DMA_D_STADR (unsigned*) 0x1000e060
111
112#define DMA_TAG_IRQ 0x80000000;
113
114
115 unsigned *reg, temp;
116
117 printf( "Testing DMA_D_CTRL...\n");
118 reg = DMA_D_CTRL;
119 if( *reg) error( "Not initialized to zero.\n");
120 wrtest( reg, 0x00000555, 0x00000555);
121 wrtest( reg, 0x000002aa, 0x000002aa);
122 *reg = 0;
123
124 printf( "Testing DMA_D_STAT...\n");
125 reg = DMA_D_STAT;
126 if( *reg) error( "Not initialized to zero.\n");
127 wrtest( reg, 0xffffffff, 0x63ff0000);
128 wrtest( reg, 0x63ff0000, 0x00000000);
129
130 printf( "Testing DMA_D_PCR...\n");
131 reg = DMA_D_PCR;
132 if( *reg) error( "Not initialized to zero.\n");
133 wrtest( reg, 0x80000000, 0x83ff0000);
134 wrtest( reg, 0x8fff0000, 0x83ff0000);
135 wrtest( reg, 0x05550000, 0x01550000);
136 wrtest( reg, 0x0155aaaa, 0x015502aa);
137 wrtest( reg, 0x00005555, 0x00000155);
138 *reg = 0;
139
140 printf( "Testing DMA_D_SQWC...\n");
141 reg = DMA_D_SQWC;
142 if( *reg) error( "Not initialized to zero.\n");
143 wrtest( reg, 0x5555aaaa, 0x005500aa);
144 wrtest( reg, 0xaaaa5555, 0x00aa0055);
145 *reg = 0;
146
147 printf( "Testing DMA_D_RBOR...\n");
148 reg = DMA_D_RBOR;
149 if( *reg) error( "Not initialized to zero.\n");
150 wrtest( reg, 0x5555aaaa, 0x5555aaa0);
151 wrtest( reg, 0xaaaa5555, 0x2aaa5550);
152 *reg = 0;
153
154 printf( "Testing DMA_D_RBSR...\n");
155 reg = DMA_D_RBSR;
156 if( *reg) error( "Not initialized to zero.\n");
157 wrtest( reg, 0x5555aaaa, 0x5555aaa0);
158 wrtest( reg, 0xaaaa5555, 0x2aaa5550);
159 *reg = 0;
160
161 printf( "Testing DMA_D_STADR...\n");
162 reg = DMA_D_STADR;
163 if( *reg) error( "Not initialized to zero.\n");
164 wrtest( reg, 0x5555aaaa, 0x5555aaa0);
165 wrtest( reg, 0xaaaa5555, 0x2aaa5550);
166 *reg = 0;
167
168 printf( "Testing DMA_D0_CHCR...\n");
169 reg = DMA_D0_CHCR;
170 if( *reg) error( "Not initialized to zero.\n");
171 wrtest( reg, 0x5555aaaa, 0x000000aa);
172 wrtest( reg, 0xaaaa5555, 0x00000155);
173 *reg = 0;
174
175 printf( "Testing DMA_D0_MADR...\n");
176 reg = DMA_D0_MADR;
177 if( *reg) error( "Not initialized to zero.\n");
178 wrtest( reg, 0x5555aaaa, 0x5555aaa0);
179 wrtest( reg, 0x2aaa5555, 0x2aaa5550);
180 *reg = 0;
181
182 printf( "Testing DMA_D0_TADR...\n");
183 reg = DMA_D0_TADR;
184 if( *reg) error( "Not initialized to zero.\n");
185 wrtest( reg, 0x5555aaaa, 0x5555aaa0);
186 wrtest( reg, 0x2aaa5555, 0x2aaa5550);
187 *reg = 0;
188
189 printf( "Testing DMA_D0_ASR0...\n");
190 reg = DMA_D0_ASR0;
191 if( *reg) error( "Not initialized to zero.\n");
192 wrtest( reg, 0x5555aaaa, 0x5555aaa0);
193 wrtest( reg, 0x2aaa5555, 0x2aaa5550);
194 *reg = 0;
195
196 printf( "Testing DMA_D0_ASR1...\n");
197 reg = DMA_D0_ASR1;
198 if( *reg) error( "Not initialized to zero.\n");
199 wrtest( reg, 0x5555aaaa, 0x5555aaa0);
200 wrtest( reg, 0x2aaa5555, 0x2aaa5550);
201 *reg = 0;
202
203 printf( "Testing DMA_D0_QWC...\n");
204 reg = DMA_D0_QWC;
205 if( *reg) error( "Not initialized to zero.\n");
206 wrtest( reg, 0x5555aaaa, 0x0000aaaa);
207 wrtest( reg, 0xaaaa5555, 0x00005555);
208 *reg = 0;
209
210 printf( "Testing DMA_D0_PKTFLAG...\n");
211 reg = DMA_D0_PKTFLAG;
212 if( *reg) error( "Not initialized to zero.\n");
213 wrtest( reg, 0x5555aaaa, 0x5555aaaa);
214 wrtest( reg, 0xaaaa5555, 0xaaaa5555);
215 *reg = 0;
216
217 printf( "Testing DMA_D1_CHCR...\n");
218 reg = DMA_D1_CHCR;
219 if( *reg) error( "Not initialized to zero.\n");
220 wrtest( reg, 0x5555aaaa, 0x000000aa);
221 wrtest( reg, 0xaaaa5555, 0x00000155);
222 *reg = 0;
223
224 printf( "Testing DMA_D1_MADR...\n");
225 reg = DMA_D1_MADR;
226 if( *reg) error( "Not initialized to zero.\n");
227 wrtest( reg, 0x5555aaaa, 0x5555aaa0);
228 wrtest( reg, 0x2aaa5555, 0x2aaa5550);
229 *reg = 0;
230
231 printf( "Testing DMA_D1_TADR...\n");
232 reg = DMA_D1_TADR;
233 if( *reg) error( "Not initialized to zero.\n");
234 wrtest( reg, 0x5555aaaa, 0x5555aaa0);
235 wrtest( reg, 0x2aaa5555, 0x2aaa5550);
236 *reg = 0;
237
238 printf( "Testing DMA_D1_ASR0...\n");
239 reg = DMA_D1_ASR0;
240 if( *reg) error( "Not initialized to zero.\n");
241 wrtest( reg, 0x5555aaaa, 0x5555aaa0);
242 wrtest( reg, 0x2aaa5555, 0x2aaa5550);
243 *reg = 0;
244
245 printf( "Testing DMA_D1_ASR1...\n");
246 reg = DMA_D1_ASR1;
247 if( *reg) error( "Not initialized to zero.\n");
248 wrtest( reg, 0x5555aaaa, 0x5555aaa0);
249 wrtest( reg, 0x2aaa5555, 0x2aaa5550);
250 *reg = 0;
251
252 printf( "Testing DMA_D1_QWC...\n");
253 reg = DMA_D1_QWC;
254 if( *reg) error( "Not initialized to zero.\n");
255 wrtest( reg, 0x5555aaaa, 0x0000aaaa);
256 wrtest( reg, 0xaaaa5555, 0x00005555);
257 *reg = 0;
258
259 printf( "Testing DMA_D1_PKTFLAG...\n");
260 reg = DMA_D1_PKTFLAG;
261 if( *reg) error( "Not initialized to zero.\n");
262 wrtest( reg, 0x5555aaaa, 0x5555aaaa);
263 wrtest( reg, 0xaaaa5555, 0xaaaa5555);
264 *reg = 0;
265
266 printf( "Testing DMA_D2_CHCR...\n");
267 reg = DMA_D2_CHCR;
268 if( *reg) error( "Not initialized to zero.\n");
269 wrtest( reg, 0x5555aaaa, 0x000000aa);
270 wrtest( reg, 0xaaaa5555, 0x00000155);
271 *reg = 0;
272
273 printf( "Testing DMA_D2_MADR...\n");
274 reg = DMA_D2_MADR;
275 if( *reg) error( "Not initialized to zero.\n");
276 wrtest( reg, 0x5555aaaa, 0x5555aaa0);
277 wrtest( reg, 0x2aaa5555, 0x2aaa5550);
278 *reg = 0;
279
280 printf( "Testing DMA_D2_TADR...\n");
281 reg = DMA_D2_TADR;
282 if( *reg) error( "Not initialized to zero.\n");
283 wrtest( reg, 0x5555aaaa, 0x5555aaa0);
284 wrtest( reg, 0x2aaa5555, 0x2aaa5550);
285 *reg = 0;
286
287 printf( "Testing DMA_D2_ASR0...\n");
288 reg = DMA_D2_ASR0;
289 if( *reg) error( "Not initialized to zero.\n");
290 wrtest( reg, 0x5555aaaa, 0x5555aaa0);
291 wrtest( reg, 0x2aaa5555, 0x2aaa5550);
292 *reg = 0;
293
294 printf( "Testing DMA_D2_ASR1...\n");
295 reg = DMA_D2_ASR1;
296 if( *reg) error( "Not initialized to zero.\n");
297 wrtest( reg, 0x5555aaaa, 0x5555aaa0);
298 wrtest( reg, 0x2aaa5555, 0x2aaa5550);
299 *reg = 0;
300
301 printf( "Testing DMA_D2_QWC...\n");
302 reg = DMA_D2_QWC;
303 if( *reg)
304 {
305 printf ("Not initialized to zero (0x%08x).\n", *reg);
306 exit (999);
307 }
308 wrtest( reg, 0x5555aaaa, 0x0000aaaa);
309 wrtest( reg, 0xaaaa5555, 0x00005555);
310 *reg = 0;
311
312 printf( "Testing DMA_D2_PKTFLAG...\n");
313 reg = DMA_D2_PKTFLAG;
314 if( *reg) error( "Not initialized to zero.\n");
315 wrtest( reg, 0x5555aaaa, 0x5555aaaa);
316 wrtest( reg, 0xaaaa5555, 0xaaaa5555);
317 *reg = 0;
318
319 /* Initiate a non-chained 0-length transfer. */
320 printf ("\nPreparing for a DMA1 NORM transfer...\n");
321 reg = DMA_D_CTRL; /* enable DMA */
322 *reg = DMA_D_CTRL__DMAE;
323 reg = DMA_D1_QWC; /* set # of quad words to xfr */
324 *reg = 0;
325 reg = DMA_D1_MADR; /* set data address */
326 *reg = 0x00012340;
327 reg = DMA_D1_CHCR;
328 printf ("Ready...\n");
329 *reg = DMA_Dn_CHCR__STR | DMA_Dn_CHCR__MOD_NORM;
330
331 reg = DMA_D1_QWC;
332 if (*reg)
333 {
334 printf ("D1_QWC is not zero after transfer.\n");
335 exit (999);
336 }
337 reg = DMA_D1_MADR;
338 if (*reg != 0x00012340)
339 {
340 printf ("D1_MADR value is wrong after transfer.\n");
341 exit (999);
342 }
343 reg = DMA_D1_CHCR;
344 if ((*reg & DMA_Dn_CHCR__STR) != 0)
345 {
346 printf ("D1_CHCR.STR is not reset after transfer.\n");
347 exit (999);
348 }
349 printf ("Completed OK...\n");
350
351 /* Initiate a chained transfer. */
352
353 /* Some of the "tag" fields couldn't be initialised statically. */
354 /* The first address is unaligned to force a warning. */
355 dma_refe.tagH = (unsigned)&data0 + 1;
356 dma_next.tagH = (unsigned)&dma_ref;
357 dma_ref.tagH = (unsigned)&data6;
358 dma_refs.tagH = (unsigned)&data7;
359 dma_call.tagH = (unsigned)&dma_cal2;
360 dma_cal2.tagH = (unsigned)&dma_rt2;
361
362 printf ("\nPreparing for a DMA0 TAG transfer...\n");
363 reg = DMA_D_PCR; /* disable DMA0 */
364 *reg &= ~DMA_D_PCR__CDE0;
365 *reg |= DMA_D_PCR__PCE;
366 reg = DMA_D_CTRL; /* enable DMA */
367 *reg = DMA_D_CTRL__DMAE;
368 reg = DMA_D0_TADR; /* set tag address */
369 *reg = (unsigned) & dma_refe;
370 reg = DMA_D0_QWC; /* set fictitious count */
371 *reg = 51;
372 printf ("Ready...\n");
373 reg = DMA_D0_CHCR;
374 *reg = DMA_Dn_CHCR__STR | DMA_Dn_CHCR__TTE | DMA_Dn_CHCR__MOD_CHAIN;
375
376 reg = DMA_D0_QWC;
377 if (*reg != 51)
378 {
379 printf ("DMA0 transfer not inhibited by DMA_D_PCR__CDE0 (%d).\n", *reg);
380 exit (999);
381 }
382 reg = DMA_D_PCR; /* enable DMA0 */
383 *reg &= ~DMA_D_PCR__PCE;
384
385 reg = DMA_D0_QWC;
386 if (*reg)
387 {
388 printf ("D0_QWC is not zero after transfer.\n");
389 exit (999);
390 }
391 reg = DMA_D0_MADR;
392 if (*reg != (unsigned)&dma_cal2)
393 {
394 printf ("D0_MADR value is wrong after transfer.\n");
395 exit (999);
396 }
397 reg = DMA_D0_CHCR;
398 if ((*reg & DMA_Dn_CHCR__STR) != 0)
399 {
400 printf ("D0_CHCR.STR is not reset after transfer.\n");
401 exit (999);
402 }
403 printf ("Completed OK...\n");
404
405 /* Initiate a chained transfer that will be suspended
406 and restarted. */
407
408 /* Request suspension part way through. */
409 dma_ref.tagL |= DMA_TAG_IRQ;
410
411 printf ("\nPreparing for a DMA2 TAG transfer with suspension...\n");
412 reg = DMA_D_CTRL; /* enable DMA */
413 *reg = DMA_D_CTRL__DMAE;
414 reg = DMA_D2_TADR; /* set tag address */
415 *reg = (unsigned) & dma_refe;
416 printf ("Ready...\n");
417 reg = DMA_D2_CHCR;
418 *reg = DMA_Dn_CHCR__STR | DMA_Dn_CHCR__MOD_CHAIN;
419 printf ("returns...\n");
420
421 reg = DMA_D2_QWC;
422 if (*reg)
423 {
424 printf ("D2_QWC (0x%08x) is not zero after suspension.\n", *reg);
425 exit (999);
426 }
427 reg = DMA_D2_MADR;
428 if (*reg != (unsigned)&data7)
429 {
430 printf ("D2_MADR value (0x%08x) is wrong after suspension.\n", *reg);
431 exit (999);
432 }
433 reg = DMA_D2_TADR;
434 if (*reg != (unsigned)&dma_refs)
435 {
436 printf ("D2_TADR value (0x%08x) is wrong after suspension.\n", *reg);
437 exit (999);
438 }
439 reg = DMA_D2_CHCR;
440 if ((*reg & DMA_Dn_CHCR__STR) != 0)
441 {
442 printf ("D2_CHCR.STR (0x%08x) is not reset after suspension.\n", *reg);
443 exit (999);
444 }
445 reg = DMA_D_PCR;
446 if ((*reg & DMA_D_PCR__PCE) == 0)
447 {
448 printf ("DMA_D_PCR__PCE not set by transfer.\n");
449 exit (999);
450 }
451 printf ("Suspended OK...\n");
452
453 /* Reset the suspension request and continue. */
454 dma_ref.tagL &= ~DMA_TAG_IRQ;
455 reg = DMA_D2_CHCR;
456 *reg |= DMA_Dn_CHCR__STR;
457
458 reg = DMA_D2_QWC;
459 if (*reg)
460 {
461 printf ("D2_QWC (0x%08x) is not zero after transfer.\n", *reg);
462 exit (999);
463 }
464 reg = DMA_D2_MADR;
465 if (*reg != (unsigned)&dma_cal2)
466 {
467 printf ("D2_MADR value (0x%08x) is wrong after transfer.\n", *reg);
468 exit (999);
469 }
470 reg = DMA_D2_CHCR;
471 if ((*reg & DMA_Dn_CHCR__STR) != 0)
472 {
473 printf ("D2_CHCR.STR (0x%08x) is not reset after transfer.\n", *reg);
474 exit (999);
475 }
476 reg = DMA_D_PCR;
477 if (*reg & DMA_D_PCR__PCE)
478 {
479 printf ("DMA_D_PCR__PCE not reset by transfer.\n");
480 exit (999);
481 }
482 printf ("Completed OK...\n");
483
484 exit (0);
485}
This page took 0.060089 seconds and 4 git commands to generate.