loadtask.c 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  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 <mpc8220.h>
  10. /* Multichannel DMA microcode */
  11. extern int taskTable;
  12. void loadtask (int basetask, int tasks)
  13. {
  14. int *sram = (int *) (MMAP_SRAM + 512);
  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 *) MMAP_DMA = (MMAP_SRAM + 512);
  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 -
  50. (unsigned int) sram);
  51. start /= 4;
  52. end /= 4;
  53. for (i = start; i < end; i++) {
  54. sram[i] = task_org[i];
  55. }
  56. /* relocate function decriptors */
  57. start = ((sram[basetask * 8 + 3] & 0xfffffffc) - (unsigned int) sram);
  58. end = ((sram[(basetask + tasks - 1) * 8 + 3] & 0xfffffffc) + 256 -
  59. (unsigned int) sram);
  60. start /= 4;
  61. end /= 4;
  62. for (i = start; i < end; i++) {
  63. sram[i] = task_org[i];
  64. }
  65. asm volatile ("sync");
  66. }