loadtask.c 1.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  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. #include <common.h>
  9. #include <mpc5xxx.h>
  10. /* BestComm/SmartComm microcode */
  11. extern int taskTable;
  12. void loadtask(int basetask, int tasks)
  13. {
  14. int *sram = (int *)MPC5XXX_SRAM;
  15. int *task_org = &taskTable;
  16. unsigned int start, offset, end;
  17. int i;
  18. #ifdef DEBUG
  19. printf("basetask = %d, tasks = %d\n", basetask, tasks);
  20. printf("task_org = 0x%08x\n", (unsigned int)task_org);
  21. #endif
  22. /* setup TaskBAR register */
  23. *(vu_long *)MPC5XXX_SDMA = MPC5XXX_SRAM;
  24. /* relocate task table entries */
  25. offset = (unsigned int)sram;
  26. for (i = basetask; i < basetask + tasks; i++) {
  27. sram[i * 8 + 0] = task_org[i * 8 + 0] + offset;
  28. sram[i * 8 + 1] = task_org[i * 8 + 1] + offset;
  29. sram[i * 8 + 2] = task_org[i * 8 + 2] + offset;
  30. sram[i * 8 + 3] = task_org[i * 8 + 3] + offset;
  31. sram[i * 8 + 4] = task_org[i * 8 + 4];
  32. sram[i * 8 + 5] = task_org[i * 8 + 5];
  33. sram[i * 8 + 6] = task_org[i * 8 + 6] + offset;
  34. sram[i * 8 + 7] = task_org[i * 8 + 7];
  35. }
  36. /* relocate task descriptors */
  37. start = (sram[basetask * 8] - (unsigned int)sram);
  38. end = (sram[(basetask + tasks - 1) * 8 + 1] - (unsigned int)sram);
  39. #ifdef DEBUG
  40. printf ("TDT start = 0x%08x, end = 0x%08x\n", start, end);
  41. #endif
  42. start /= 4;
  43. end /= 4;
  44. for (i = start; i <= end; i++) {
  45. sram[i] = task_org[i];
  46. }
  47. /* relocate variables */
  48. start = (sram[basetask * 8 + 2] - (unsigned int)sram);
  49. end = (sram[(basetask + tasks - 1) * 8 + 2] + 256 - (unsigned int)sram);
  50. start /= 4;
  51. end /= 4;
  52. for (i = start; i < end; i++) {
  53. sram[i] = task_org[i];
  54. }
  55. /* relocate function decriptors */
  56. start = ((sram[basetask * 8 + 3] & 0xfffffffc) - (unsigned int)sram);
  57. end = ((sram[(basetask + tasks - 1) * 8 + 3] & 0xfffffffc) + 256 - (unsigned int)sram);
  58. start /= 4;
  59. end /= 4;
  60. for (i = start; i < end; i++) {
  61. sram[i] = task_org[i];
  62. }
  63. asm volatile ("sync");
  64. }