Mercurial > hg > Game > Cerium
annotate TaskManager/Fifo/FifoDmaManager.cc @ 1245:a97b4dd4574c draft
Added tag real_matrix for changeset cd50c48f45e7
author | Kakeru TAMASIRO <e095736@ie.u-ryukyu.ac.jp> |
---|---|
date | Fri, 11 Nov 2011 17:04:13 +0900 |
parents | a49c02dffe6f |
children | 2fa31362ead0 |
rev | line source |
---|---|
109 | 1 #include <stdio.h> |
2 #include <stdlib.h> | |
3 #include <string.h> | |
4 #include "FifoDmaManager.h" | |
1213
a49c02dffe6f
DMA connector reogranization
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
1111
diff
changeset
|
5 #include "Scheduler.h" |
a49c02dffe6f
DMA connector reogranization
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
1111
diff
changeset
|
6 #include "TaskManagerImpl.h" |
109 | 7 |
1213
a49c02dffe6f
DMA connector reogranization
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
1111
diff
changeset
|
8 void * |
a49c02dffe6f
DMA connector reogranization
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
1111
diff
changeset
|
9 FifoDmaManager::dma_load(Scheduler *s, void *buf, memaddr addr, uint32 size, uint32 mask) |
109 | 10 { |
1213
a49c02dffe6f
DMA connector reogranization
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
1111
diff
changeset
|
11 if (size == 0) return buf; |
a49c02dffe6f
DMA connector reogranization
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
1111
diff
changeset
|
12 if (s) buf = s->manager->allocate(size); |
109 | 13 memcpy(buf, (void*)addr, size); |
1213
a49c02dffe6f
DMA connector reogranization
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
1111
diff
changeset
|
14 return buf; |
109 | 15 } |
16 | |
1213
a49c02dffe6f
DMA connector reogranization
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
1111
diff
changeset
|
17 void * |
a49c02dffe6f
DMA connector reogranization
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
1111
diff
changeset
|
18 FifoDmaManager::get_writebuf(Scheduler *s,memaddr addr, uint32 size) |
a49c02dffe6f
DMA connector reogranization
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
1111
diff
changeset
|
19 { |
a49c02dffe6f
DMA connector reogranization
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
1111
diff
changeset
|
20 void *b = s->manager->allocate(size); |
a49c02dffe6f
DMA connector reogranization
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
1111
diff
changeset
|
21 return b; |
a49c02dffe6f
DMA connector reogranization
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
1111
diff
changeset
|
22 } |
a49c02dffe6f
DMA connector reogranization
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
1111
diff
changeset
|
23 |
a49c02dffe6f
DMA connector reogranization
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
1111
diff
changeset
|
24 void * |
603
57ec231bc8ac
long -> memaddr (64 or 32)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
602
diff
changeset
|
25 FifoDmaManager::dma_store(void *buf, memaddr addr, uint32 size, uint32 mask) |
109 | 26 { |
1213
a49c02dffe6f
DMA connector reogranization
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
1111
diff
changeset
|
27 if (size == 0) return buf; |
109 | 28 memcpy((void*)addr, buf, size); |
1213
a49c02dffe6f
DMA connector reogranization
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
1111
diff
changeset
|
29 return buf; |
109 | 30 } |
31 | |
32 /** | |
321 | 33 * mask で設定した DMA 転送の完了を待つ |
109 | 34 */ |
35 void | |
36 FifoDmaManager::dma_wait(uint32 mask) | |
37 { | |
38 } | |
39 | |
40 | |
1213
a49c02dffe6f
DMA connector reogranization
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
1111
diff
changeset
|
41 void * |
a49c02dffe6f
DMA connector reogranization
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
1111
diff
changeset
|
42 FifoDmaManager::dma_loadList(Scheduler *s, ListDataPtr list, void *buff, uint32 mask) |
109 | 43 { |
44 int list_size = list->length; | |
602
92b0d490e839
64bit mode try... not worked.
e075740@nw0740.st.ie.u-ryukyu.ac.jp
parents:
321
diff
changeset
|
45 long bound; |
109 | 46 |
1213
a49c02dffe6f
DMA connector reogranization
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
1111
diff
changeset
|
47 buff = s->manager->allocate(list->size); |
602
92b0d490e839
64bit mode try... not worked.
e075740@nw0740.st.ie.u-ryukyu.ac.jp
parents:
321
diff
changeset
|
48 bound = (long)(buff); |
109 | 49 |
50 for (int i = 0; i < list_size; i++) { | |
51 ListElementPtr elm = &list->element[i]; | |
52 memcpy((void*)bound, (void*)elm->addr, elm->size); | |
53 bound += elm->size; | |
54 } | |
1213
a49c02dffe6f
DMA connector reogranization
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
1111
diff
changeset
|
55 return buff; |
109 | 56 } |
57 | |
58 | |
1213
a49c02dffe6f
DMA connector reogranization
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
1111
diff
changeset
|
59 void * |
a49c02dffe6f
DMA connector reogranization
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
1111
diff
changeset
|
60 FifoDmaManager::get_writebuf(Scheduler *s,ListDataPtr addr, uint32 size) |
a49c02dffe6f
DMA connector reogranization
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
1111
diff
changeset
|
61 { |
a49c02dffe6f
DMA connector reogranization
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
1111
diff
changeset
|
62 void *b = s->manager->allocate(addr->size); |
a49c02dffe6f
DMA connector reogranization
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
1111
diff
changeset
|
63 return b; |
a49c02dffe6f
DMA connector reogranization
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
1111
diff
changeset
|
64 } |
a49c02dffe6f
DMA connector reogranization
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
1111
diff
changeset
|
65 |
109 | 66 void |
67 FifoDmaManager::dma_storeList(ListDataPtr list, void *buff, uint32 mask) | |
68 { | |
69 int list_size = list->length; | |
603
57ec231bc8ac
long -> memaddr (64 or 32)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
602
diff
changeset
|
70 memaddr bound; |
109 | 71 |
603
57ec231bc8ac
long -> memaddr (64 or 32)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
602
diff
changeset
|
72 bound = (memaddr)(buff); |
109 | 73 |
74 for (int i = 0; i < list_size; i++) { | |
75 ListElementPtr elm = &list->element[i]; | |
76 memcpy((void*)elm->addr, (void*)bound, elm->size); | |
77 bound += elm->size; | |
1111 | 78 } |
109 | 79 } |
643 | 80 |
1213
a49c02dffe6f
DMA connector reogranization
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
1111
diff
changeset
|
81 uint32 |
a49c02dffe6f
DMA connector reogranization
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
1111
diff
changeset
|
82 FifoDmaManager::get_tag() |
a49c02dffe6f
DMA connector reogranization
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
1111
diff
changeset
|
83 { |
a49c02dffe6f
DMA connector reogranization
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
1111
diff
changeset
|
84 static int tag = 16; |
a49c02dffe6f
DMA connector reogranization
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
1111
diff
changeset
|
85 tag ++; |
a49c02dffe6f
DMA connector reogranization
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
1111
diff
changeset
|
86 tag &= 0x0f; |
a49c02dffe6f
DMA connector reogranization
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
1111
diff
changeset
|
87 return tag+16; |
a49c02dffe6f
DMA connector reogranization
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
1111
diff
changeset
|
88 } |
a49c02dffe6f
DMA connector reogranization
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
1111
diff
changeset
|
89 |
a49c02dffe6f
DMA connector reogranization
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
1111
diff
changeset
|
90 /** |
a49c02dffe6f
DMA connector reogranization
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
1111
diff
changeset
|
91 * DMA buffer offset in rbuf |
a49c02dffe6f
DMA connector reogranization
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
1111
diff
changeset
|
92 */ |
a49c02dffe6f
DMA connector reogranization
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
1111
diff
changeset
|
93 void |
a49c02dffe6f
DMA connector reogranization
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
1111
diff
changeset
|
94 FifoDmaManager::bound(ListData *list) |
a49c02dffe6f
DMA connector reogranization
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
1111
diff
changeset
|
95 { |
a49c02dffe6f
DMA connector reogranization
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
1111
diff
changeset
|
96 ListElement *elm = list->element; |
a49c02dffe6f
DMA connector reogranization
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
1111
diff
changeset
|
97 int *bound = list->bound; |
a49c02dffe6f
DMA connector reogranization
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
1111
diff
changeset
|
98 int offset=0; |
a49c02dffe6f
DMA connector reogranization
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
1111
diff
changeset
|
99 for(int i=0;i<list->length;i++) { |
a49c02dffe6f
DMA connector reogranization
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
1111
diff
changeset
|
100 bound[i] = offset; |
a49c02dffe6f
DMA connector reogranization
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
1111
diff
changeset
|
101 offset += elm[i].size; |
a49c02dffe6f
DMA connector reogranization
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
1111
diff
changeset
|
102 } |
a49c02dffe6f
DMA connector reogranization
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
1111
diff
changeset
|
103 } |
a49c02dffe6f
DMA connector reogranization
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
1111
diff
changeset
|
104 |
643 | 105 /* end */ |