Mercurial > hg > Game > Cerium
annotate TaskManager/Cell/spe/CellDmaManager.cc @ 924:1640b14ec15a draft
show dma wait format
author | Shinji KONO <kono@ie.u-ryukyu.ac.jp> |
---|---|
date | Fri, 30 Jul 2010 16:40:30 +0900 |
parents | d30617ef4b20 |
children | 292bb8c79cdb |
rev | line source |
---|---|
61 | 1 #include <stdio.h> |
88 | 2 #include <stdlib.h> |
59 | 3 #include "CellDmaManager.h" |
736 | 4 #include "Scheduler.h" |
672 | 5 |
6 | |
180
e3b7776b1420
いろいろ fix 。詳しくは TaskManager/Changelog、test_render/Changelog を
gongo@localhost.localdomain
parents:
109
diff
changeset
|
7 /** |
e3b7776b1420
いろいろ fix 。詳しくは TaskManager/Changelog、test_render/Changelog を
gongo@localhost.localdomain
parents:
109
diff
changeset
|
8 * DMA Load |
e3b7776b1420
いろいろ fix 。詳しくは TaskManager/Changelog、test_render/Changelog を
gongo@localhost.localdomain
parents:
109
diff
changeset
|
9 * |
e3b7776b1420
いろいろ fix 。詳しくは TaskManager/Changelog、test_render/Changelog を
gongo@localhost.localdomain
parents:
109
diff
changeset
|
10 * @param[in] buf Buffer of Load Data |
e3b7776b1420
いろいろ fix 。詳しくは TaskManager/Changelog、test_render/Changelog を
gongo@localhost.localdomain
parents:
109
diff
changeset
|
11 * @param[in] addr Address of Load Data at Main Memory |
e3b7776b1420
いろいろ fix 。詳しくは TaskManager/Changelog、test_render/Changelog を
gongo@localhost.localdomain
parents:
109
diff
changeset
|
12 * @param[in] size Size of Load Data |
e3b7776b1420
いろいろ fix 。詳しくは TaskManager/Changelog、test_render/Changelog を
gongo@localhost.localdomain
parents:
109
diff
changeset
|
13 * @param[in] mask DMA tag |
e3b7776b1420
いろいろ fix 。詳しくは TaskManager/Changelog、test_render/Changelog を
gongo@localhost.localdomain
parents:
109
diff
changeset
|
14 */ |
672 | 15 void CellDmaManager::dma_load(void *buf, memaddr addr, uint32 size, uint32 mask) |
59 | 16 { |
88 | 17 if (size == 0) return ; |
180
e3b7776b1420
いろいろ fix 。詳しくは TaskManager/Changelog、test_render/Changelog を
gongo@localhost.localdomain
parents:
109
diff
changeset
|
18 mfc_get((volatile void *)buf, addr, size, mask, 0, 0); |
59 | 19 } |
20 | |
180
e3b7776b1420
いろいろ fix 。詳しくは TaskManager/Changelog、test_render/Changelog を
gongo@localhost.localdomain
parents:
109
diff
changeset
|
21 /** |
e3b7776b1420
いろいろ fix 。詳しくは TaskManager/Changelog、test_render/Changelog を
gongo@localhost.localdomain
parents:
109
diff
changeset
|
22 * DMA Store |
e3b7776b1420
いろいろ fix 。詳しくは TaskManager/Changelog、test_render/Changelog を
gongo@localhost.localdomain
parents:
109
diff
changeset
|
23 * |
e3b7776b1420
いろいろ fix 。詳しくは TaskManager/Changelog、test_render/Changelog を
gongo@localhost.localdomain
parents:
109
diff
changeset
|
24 * @param[in] buf Buffer of Store Data at SPE |
e3b7776b1420
いろいろ fix 。詳しくは TaskManager/Changelog、test_render/Changelog を
gongo@localhost.localdomain
parents:
109
diff
changeset
|
25 * @param[in] addr Address of Store Data at Main Memory |
e3b7776b1420
いろいろ fix 。詳しくは TaskManager/Changelog、test_render/Changelog を
gongo@localhost.localdomain
parents:
109
diff
changeset
|
26 * @param[in] size Size of Store Data |
e3b7776b1420
いろいろ fix 。詳しくは TaskManager/Changelog、test_render/Changelog を
gongo@localhost.localdomain
parents:
109
diff
changeset
|
27 * @param[in] mask DMA tag |
e3b7776b1420
いろいろ fix 。詳しくは TaskManager/Changelog、test_render/Changelog を
gongo@localhost.localdomain
parents:
109
diff
changeset
|
28 */ |
672 | 29 void CellDmaManager::dma_store(void *buf, memaddr addr, uint32 size, uint32 mask) |
59 | 30 { |
88 | 31 if (size == 0) return ; |
180
e3b7776b1420
いろいろ fix 。詳しくは TaskManager/Changelog、test_render/Changelog を
gongo@localhost.localdomain
parents:
109
diff
changeset
|
32 mfc_put((volatile void *)buf, addr, size, mask, 0, 0); |
59 | 33 } |
34 | |
672 | 35 void CellDmaManager::dma_wait(uint32 mask) |
36 { | |
37 (this->*start_dmawait_profile)(); | |
38 mfc_write_tag_mask(1 << mask); | |
39 mfc_write_tag_update_all(); | |
40 mfc_read_tag_status(); | |
871
d30617ef4b20
fix get segment dma tag zero problem
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
736
diff
changeset
|
41 __asm__ __volatile__(" sync"); |
675 | 42 (this->*end_dmawait_profile)(&global_wait_time); |
672 | 43 } |
44 | |
45 void CellDmaManager::mail_write(memaddr data) | |
46 { | |
47 (this->*start_dmawait_profile)(); | |
48 spu_write_out_mbox((uint32)data); | |
871
d30617ef4b20
fix get segment dma tag zero problem
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
736
diff
changeset
|
49 #if 0 |
672 | 50 if (ABIBIT>32) { |
51 unsigned long data0 = (unsigned long)data; | |
871
d30617ef4b20
fix get segment dma tag zero problem
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
736
diff
changeset
|
52 spu_write_out_mbox((uint32)(data0>>32)); |
672 | 53 } |
871
d30617ef4b20
fix get segment dma tag zero problem
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
736
diff
changeset
|
54 #endif |
675 | 55 (this->*end_dmawait_profile)(&global_mail_time); |
672 | 56 } |
57 | |
58 memaddr CellDmaManager::mail_read() | |
59 { | |
60 (this->*start_dmawait_profile)(); | |
61 memaddr data = (memaddr)spu_read_in_mbox(); | |
871
d30617ef4b20
fix get segment dma tag zero problem
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
736
diff
changeset
|
62 #if 0 |
672 | 63 if (ABIBIT>32) { |
871
d30617ef4b20
fix get segment dma tag zero problem
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
736
diff
changeset
|
64 data += (spu_read_in_mbox()<<32); |
672 | 65 } |
871
d30617ef4b20
fix get segment dma tag zero problem
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
736
diff
changeset
|
66 #endif |
675 | 67 (this->*end_dmawait_profile)(&global_mail_time); |
672 | 68 return data; |
69 } | |
70 | |
71 void CellDmaManager::dma_loadList(ListDataPtr list, void *buff, uint32 mask) | |
72 { | |
73 mfc_getl(buff, 0, list->element, sizeof(mfc_list_element_t)*list->length, | |
74 mask, 0, 0); | |
75 } | |
76 | |
77 void CellDmaManager::dma_storeList(ListDataPtr list, void *buff, uint32 mask) | |
78 { | |
79 mfc_putl(buff, 0, list->element, sizeof(mfc_list_element_t)*list->length, | |
80 mask, 0, 0); | |
81 } | |
82 | |
83 | |
84 CellDmaManager::CellDmaManager() | |
85 { | |
86 stop_profile(); | |
87 } | |
88 | |
89 void | |
90 CellDmaManager::start_profile() | |
91 { | |
92 start_dmawait_profile = &CellDmaManager::do_start_dmawait_profile; | |
93 end_dmawait_profile = &CellDmaManager::do_end_dmawait_profile; | |
94 } | |
95 | |
96 void | |
97 CellDmaManager::stop_profile() | |
98 { | |
99 start_dmawait_profile = &CellDmaManager::null_start_dmawait_profile; | |
100 end_dmawait_profile = &CellDmaManager::null_end_dmawait_profile; | |
101 } | |
102 | |
59 | 103 /** |
180
e3b7776b1420
いろいろ fix 。詳しくは TaskManager/Changelog、test_render/Changelog を
gongo@localhost.localdomain
parents:
109
diff
changeset
|
104 * DMA Wait |
e3b7776b1420
いろいろ fix 。詳しくは TaskManager/Changelog、test_render/Changelog を
gongo@localhost.localdomain
parents:
109
diff
changeset
|
105 * |
e3b7776b1420
いろいろ fix 。詳しくは TaskManager/Changelog、test_render/Changelog を
gongo@localhost.localdomain
parents:
109
diff
changeset
|
106 * @param[in] mask Tag for Wait DMA process |
59 | 107 */ |
275 | 108 void |
672 | 109 CellDmaManager::do_start_dmawait_profile() |
242 | 110 { |
111 wait_time = spu_readch(SPU_RdDec); | |
112 global_busy_time += busy_time - wait_time; | |
113 spu_writech(SPU_WrDec, 0xffffffff); | |
114 } | |
115 | |
275 | 116 void |
676 | 117 CellDmaManager::do_end_dmawait_profile(unsigned long long *counter) |
242 | 118 { |
119 wait_time = spu_readch(SPU_RdDec); | |
675 | 120 *counter += 0xffffffff - wait_time; |
242 | 121 busy_time = wait_time; |
122 } | |
239 | 123 |
672 | 124 void CellDmaManager::null_start_dmawait_profile() {} |
676 | 125 void CellDmaManager::null_end_dmawait_profile(unsigned long long *counter) {} |
672 | 126 |
239 | 127 void |
736 | 128 CellDmaManager::show_dma_wait(Scheduler *s, int cpu) |
255 | 129 { |
130 | |
675 | 131 double r = ((double)global_busy_time)/((double)( |
132 global_busy_time+global_wait_time+global_mail_time | |
676 | 133 ))*100.0; |
924 | 134 |
135 double d = ((double)global_wait_time)/((double)( | |
136 global_busy_time+global_wait_time+global_mail_time | |
137 ))*100.0; | |
138 | |
139 double m = ((double)global_mail_time)/((double)( | |
140 global_busy_time+global_wait_time+global_mail_time | |
141 ))*100.0; | |
142 | |
736 | 143 s->printf("spu%d: busy_time = %lld" |
924 | 144 " wait_time = %lld(%.3g%%), " |
145 " mail_time = %lld(%.3g%%), " | |
146 " busy_ratio = %.3g%%\n", cpu, global_busy_time, | |
147 global_wait_time, d, global_mail_time, m, r); | |
255 | 148 } |
149 | |
604 | 150 |
151 /* end */ |