]>
Commit | Line | Data |
---|---|---|
983fda83 WD |
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 | } |