]> Gitweb @ Texas Instruments - Open Source Git Repositories - git.TI.com/gitweb - glsdk/glsdk-u-boot.git/blob - arch/powerpc/cpu/mpc5xxx/loadtask.c
nios2: Move individual board linker scripts to common script in cpu tree.
[glsdk/glsdk-u-boot.git] / arch / powerpc / cpu / mpc5xxx / 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  */
9 #include <common.h>
10 #include <mpc5xxx.h>
12 /* BestComm/SmartComm microcode */
13 extern int taskTable;
15 void loadtask(int basetask, int tasks)
16 {
17         int *sram = (int *)MPC5XXX_SRAM;
18         int *task_org = &taskTable;
19         unsigned int start, offset, end;
20         int i;
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
27         /* setup TaskBAR register */
28         *(vu_long *)MPC5XXX_SDMA = MPC5XXX_SRAM;
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         }
43         /* relocate task descriptors */
44         start = (sram[basetask * 8] - (unsigned int)sram);
45         end = (sram[(basetask + tasks - 1) * 8 + 1] - (unsigned int)sram);
47 #ifdef DEBUG
48         printf ("TDT start = 0x%08x, end = 0x%08x\n", start, end);
49 #endif
51         start /= 4;
52         end /= 4;
53         for (i = start; i <= end; i++) {
54                 sram[i] = task_org[i];
55         }
57         /* relocate variables */
58         start = (sram[basetask * 8 + 2] - (unsigned int)sram);
59         end = (sram[(basetask + tasks - 1) * 8 + 2] + 256 - (unsigned int)sram);
60         start /= 4;
61         end /= 4;
62         for (i = start; i < end; i++) {
63                 sram[i] = task_org[i];
64         }
66         /* relocate function decriptors */
67         start = ((sram[basetask * 8 + 3] & 0xfffffffc) - (unsigned int)sram);
68         end = ((sram[(basetask + tasks - 1) * 8 + 3] & 0xfffffffc) + 256 - (unsigned int)sram);
69         start /= 4;
70         end /= 4;
71         for (i = start; i < end; i++) {
72                 sram[i] = task_org[i];
73         }
75         asm volatile ("sync");
76 }