]> git.kernelconcepts.de Git - karo-tx-uboot.git/blob - arch/ppc/cpu/mpc8220/loadtask.c
Merge branch 'master' of git://git.denx.de/u-boot-arm
[karo-tx-uboot.git] / arch / ppc / cpu / mpc8220 / loadtask.c
1 /*
2  * (C) Copyright 2003
3  * Wolfgang Denk, DENX Software Engineering, wd@denx.de.
4  *
5  * This file is based on code
6  * (C) Copyright Motorola, Inc., 2000
7  */
8
9 #include <common.h>
10 #include <mpc8220.h>
11
12 /* Multichannel DMA microcode */
13 extern int taskTable;
14
15 void loadtask (int basetask, int tasks)
16 {
17         int *sram = (int *) (MMAP_SRAM + 512);
18         int *task_org = &taskTable;
19         unsigned int start, offset, end;
20         int i;
21
22 #ifdef DEBUG
23         printf ("basetask = %d, tasks = %d\n", basetask, tasks);
24         printf ("task_org = 0x%08x\n", (unsigned int) task_org);
25 #endif
26
27         /* setup TaskBAR register */
28         *(vu_long *) MMAP_DMA = (MMAP_SRAM + 512);
29
30         /* relocate task table entries */
31         offset = (unsigned int) sram;
32         for (i = basetask; i < basetask + tasks; i++) {
33                 sram[i * 8 + 0] = task_org[i * 8 + 0] + offset;
34                 sram[i * 8 + 1] = task_org[i * 8 + 1] + offset;
35                 sram[i * 8 + 2] = task_org[i * 8 + 2] + offset;
36                 sram[i * 8 + 3] = task_org[i * 8 + 3] + offset;
37                 sram[i * 8 + 4] = task_org[i * 8 + 4];
38                 sram[i * 8 + 5] = task_org[i * 8 + 5];
39                 sram[i * 8 + 6] = task_org[i * 8 + 6] + offset;
40                 sram[i * 8 + 7] = task_org[i * 8 + 7];
41         }
42
43         /* relocate task descriptors */
44         start = (sram[basetask * 8] - (unsigned int) sram);
45         end = (sram[(basetask + tasks - 1) * 8 + 1] - (unsigned int) sram);
46
47 #ifdef DEBUG
48         printf ("TDT start = 0x%08x, end = 0x%08x\n", start, end);
49 #endif
50
51         start /= 4;
52         end /= 4;
53         for (i = start; i <= end; i++) {
54                 sram[i] = task_org[i];
55         }
56
57         /* relocate variables */
58         start = (sram[basetask * 8 + 2] - (unsigned int) sram);
59         end = (sram[(basetask + tasks - 1) * 8 + 2] + 256 -
60                (unsigned int) sram);
61         start /= 4;
62         end /= 4;
63         for (i = start; i < end; i++) {
64                 sram[i] = task_org[i];
65         }
66
67         /* relocate function decriptors */
68         start = ((sram[basetask * 8 + 3] & 0xfffffffc) - (unsigned int) sram);
69         end = ((sram[(basetask + tasks - 1) * 8 + 3] & 0xfffffffc) + 256 -
70                (unsigned int) sram);
71         start /= 4;
72         end /= 4;
73         for (i = start; i < end; i++) {
74                 sram[i] = task_org[i];
75         }
76
77         asm volatile ("sync");
78 }