annotate TaskManager/Cell/spe/CellDmaManager.cc @ 675:45ddb28c592d

fix
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Sun, 06 Dec 2009 01:20:41 +0900
parents 3b6290c05f9f
children a06eef665c45
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
61
6bc72fde6615 *** empty log message ***
gongo
parents: 59
diff changeset
1 #include <stdio.h>
88
504899860e66 *** empty log message ***
gongo
parents: 61
diff changeset
2 #include <stdlib.h>
59
16f9f6251f49 *** empty log message ***
gongo
parents:
diff changeset
3 #include "CellDmaManager.h"
16f9f6251f49 *** empty log message ***
gongo
parents:
diff changeset
4
672
3b6290c05f9f add profiling code
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 647
diff changeset
5
3b6290c05f9f add profiling code
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 647
diff changeset
6
180
5cde66c926b4 いろいろ fix 。詳しくは TaskManager/Changelog、test_render/Changelog を
gongo@localhost.localdomain
parents: 109
diff changeset
7 /**
5cde66c926b4 いろいろ fix 。詳しくは TaskManager/Changelog、test_render/Changelog を
gongo@localhost.localdomain
parents: 109
diff changeset
8 * DMA Load
5cde66c926b4 いろいろ fix 。詳しくは TaskManager/Changelog、test_render/Changelog を
gongo@localhost.localdomain
parents: 109
diff changeset
9 *
5cde66c926b4 いろいろ fix 。詳しくは TaskManager/Changelog、test_render/Changelog を
gongo@localhost.localdomain
parents: 109
diff changeset
10 * @param[in] buf Buffer of Load Data
5cde66c926b4 いろいろ fix 。詳しくは TaskManager/Changelog、test_render/Changelog を
gongo@localhost.localdomain
parents: 109
diff changeset
11 * @param[in] addr Address of Load Data at Main Memory
5cde66c926b4 いろいろ fix 。詳しくは TaskManager/Changelog、test_render/Changelog を
gongo@localhost.localdomain
parents: 109
diff changeset
12 * @param[in] size Size of Load Data
5cde66c926b4 いろいろ fix 。詳しくは TaskManager/Changelog、test_render/Changelog を
gongo@localhost.localdomain
parents: 109
diff changeset
13 * @param[in] mask DMA tag
5cde66c926b4 いろいろ fix 。詳しくは TaskManager/Changelog、test_render/Changelog を
gongo@localhost.localdomain
parents: 109
diff changeset
14 */
672
3b6290c05f9f add profiling code
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 647
diff changeset
15 void CellDmaManager::dma_load(void *buf, memaddr addr, uint32 size, uint32 mask)
59
16f9f6251f49 *** empty log message ***
gongo
parents:
diff changeset
16 {
88
504899860e66 *** empty log message ***
gongo
parents: 61
diff changeset
17 if (size == 0) return ;
180
5cde66c926b4 いろいろ 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
16f9f6251f49 *** empty log message ***
gongo
parents:
diff changeset
19 }
16f9f6251f49 *** empty log message ***
gongo
parents:
diff changeset
20
180
5cde66c926b4 いろいろ fix 。詳しくは TaskManager/Changelog、test_render/Changelog を
gongo@localhost.localdomain
parents: 109
diff changeset
21 /**
5cde66c926b4 いろいろ fix 。詳しくは TaskManager/Changelog、test_render/Changelog を
gongo@localhost.localdomain
parents: 109
diff changeset
22 * DMA Store
5cde66c926b4 いろいろ fix 。詳しくは TaskManager/Changelog、test_render/Changelog を
gongo@localhost.localdomain
parents: 109
diff changeset
23 *
5cde66c926b4 いろいろ fix 。詳しくは TaskManager/Changelog、test_render/Changelog を
gongo@localhost.localdomain
parents: 109
diff changeset
24 * @param[in] buf Buffer of Store Data at SPE
5cde66c926b4 いろいろ fix 。詳しくは TaskManager/Changelog、test_render/Changelog を
gongo@localhost.localdomain
parents: 109
diff changeset
25 * @param[in] addr Address of Store Data at Main Memory
5cde66c926b4 いろいろ fix 。詳しくは TaskManager/Changelog、test_render/Changelog を
gongo@localhost.localdomain
parents: 109
diff changeset
26 * @param[in] size Size of Store Data
5cde66c926b4 いろいろ fix 。詳しくは TaskManager/Changelog、test_render/Changelog を
gongo@localhost.localdomain
parents: 109
diff changeset
27 * @param[in] mask DMA tag
5cde66c926b4 いろいろ fix 。詳しくは TaskManager/Changelog、test_render/Changelog を
gongo@localhost.localdomain
parents: 109
diff changeset
28 */
672
3b6290c05f9f add profiling code
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 647
diff changeset
29 void CellDmaManager::dma_store(void *buf, memaddr addr, uint32 size, uint32 mask)
59
16f9f6251f49 *** empty log message ***
gongo
parents:
diff changeset
30 {
88
504899860e66 *** empty log message ***
gongo
parents: 61
diff changeset
31 if (size == 0) return ;
180
5cde66c926b4 いろいろ 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
16f9f6251f49 *** empty log message ***
gongo
parents:
diff changeset
33 }
16f9f6251f49 *** empty log message ***
gongo
parents:
diff changeset
34
672
3b6290c05f9f add profiling code
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 647
diff changeset
35 void CellDmaManager::dma_wait(uint32 mask)
3b6290c05f9f add profiling code
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 647
diff changeset
36 {
3b6290c05f9f add profiling code
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 647
diff changeset
37 (this->*start_dmawait_profile)();
3b6290c05f9f add profiling code
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 647
diff changeset
38 mfc_write_tag_mask(1 << mask);
3b6290c05f9f add profiling code
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 647
diff changeset
39 mfc_write_tag_update_all();
3b6290c05f9f add profiling code
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 647
diff changeset
40 mfc_read_tag_status();
675
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 672
diff changeset
41 (this->*end_dmawait_profile)(&global_wait_time);
672
3b6290c05f9f add profiling code
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 647
diff changeset
42 }
3b6290c05f9f add profiling code
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 647
diff changeset
43
3b6290c05f9f add profiling code
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 647
diff changeset
44 void CellDmaManager::mail_write(memaddr data)
3b6290c05f9f add profiling code
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 647
diff changeset
45 {
3b6290c05f9f add profiling code
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 647
diff changeset
46 (this->*start_dmawait_profile)();
3b6290c05f9f add profiling code
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 647
diff changeset
47 spu_write_out_mbox((uint32)data);
3b6290c05f9f add profiling code
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 647
diff changeset
48 if (ABIBIT>32) {
3b6290c05f9f add profiling code
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 647
diff changeset
49 unsigned long data0 = (unsigned long)data;
3b6290c05f9f add profiling code
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 647
diff changeset
50 spu_write_out_mbox((uint32)(data0>>4));
3b6290c05f9f add profiling code
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 647
diff changeset
51 }
675
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 672
diff changeset
52 (this->*end_dmawait_profile)(&global_mail_time);
672
3b6290c05f9f add profiling code
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 647
diff changeset
53 }
3b6290c05f9f add profiling code
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 647
diff changeset
54
3b6290c05f9f add profiling code
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 647
diff changeset
55 memaddr CellDmaManager::mail_read()
3b6290c05f9f add profiling code
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 647
diff changeset
56 {
3b6290c05f9f add profiling code
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 647
diff changeset
57 (this->*start_dmawait_profile)();
3b6290c05f9f add profiling code
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 647
diff changeset
58 memaddr data = (memaddr)spu_read_in_mbox();
3b6290c05f9f add profiling code
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 647
diff changeset
59 if (ABIBIT>32) {
3b6290c05f9f add profiling code
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 647
diff changeset
60 data += (spu_read_in_mbox()<<4);
3b6290c05f9f add profiling code
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 647
diff changeset
61 }
675
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 672
diff changeset
62 (this->*end_dmawait_profile)(&global_mail_time);
672
3b6290c05f9f add profiling code
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 647
diff changeset
63 return data;
3b6290c05f9f add profiling code
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 647
diff changeset
64 }
3b6290c05f9f add profiling code
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 647
diff changeset
65
3b6290c05f9f add profiling code
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 647
diff changeset
66 void CellDmaManager::dma_loadList(ListDataPtr list, void *buff, uint32 mask)
3b6290c05f9f add profiling code
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 647
diff changeset
67 {
3b6290c05f9f add profiling code
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 647
diff changeset
68 mfc_getl(buff, 0, list->element, sizeof(mfc_list_element_t)*list->length,
3b6290c05f9f add profiling code
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 647
diff changeset
69 mask, 0, 0);
3b6290c05f9f add profiling code
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 647
diff changeset
70 }
3b6290c05f9f add profiling code
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 647
diff changeset
71
3b6290c05f9f add profiling code
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 647
diff changeset
72 void CellDmaManager::dma_storeList(ListDataPtr list, void *buff, uint32 mask)
3b6290c05f9f add profiling code
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 647
diff changeset
73 {
3b6290c05f9f add profiling code
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 647
diff changeset
74 mfc_putl(buff, 0, list->element, sizeof(mfc_list_element_t)*list->length,
3b6290c05f9f add profiling code
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 647
diff changeset
75 mask, 0, 0);
3b6290c05f9f add profiling code
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 647
diff changeset
76 }
3b6290c05f9f add profiling code
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 647
diff changeset
77
3b6290c05f9f add profiling code
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 647
diff changeset
78
3b6290c05f9f add profiling code
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 647
diff changeset
79 CellDmaManager::CellDmaManager()
3b6290c05f9f add profiling code
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 647
diff changeset
80 {
3b6290c05f9f add profiling code
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 647
diff changeset
81 stop_profile();
3b6290c05f9f add profiling code
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 647
diff changeset
82 }
3b6290c05f9f add profiling code
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 647
diff changeset
83
3b6290c05f9f add profiling code
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 647
diff changeset
84 void
3b6290c05f9f add profiling code
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 647
diff changeset
85 CellDmaManager::start_profile()
3b6290c05f9f add profiling code
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 647
diff changeset
86 {
3b6290c05f9f add profiling code
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 647
diff changeset
87 start_dmawait_profile = &CellDmaManager::do_start_dmawait_profile;
3b6290c05f9f add profiling code
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 647
diff changeset
88 end_dmawait_profile = &CellDmaManager::do_end_dmawait_profile;
3b6290c05f9f add profiling code
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 647
diff changeset
89 }
3b6290c05f9f add profiling code
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 647
diff changeset
90
3b6290c05f9f add profiling code
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 647
diff changeset
91 void
3b6290c05f9f add profiling code
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 647
diff changeset
92 CellDmaManager::stop_profile()
3b6290c05f9f add profiling code
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 647
diff changeset
93 {
3b6290c05f9f add profiling code
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 647
diff changeset
94 start_dmawait_profile = &CellDmaManager::null_start_dmawait_profile;
3b6290c05f9f add profiling code
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 647
diff changeset
95 end_dmawait_profile = &CellDmaManager::null_end_dmawait_profile;
3b6290c05f9f add profiling code
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 647
diff changeset
96 }
3b6290c05f9f add profiling code
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 647
diff changeset
97
59
16f9f6251f49 *** empty log message ***
gongo
parents:
diff changeset
98 /**
180
5cde66c926b4 いろいろ fix 。詳しくは TaskManager/Changelog、test_render/Changelog を
gongo@localhost.localdomain
parents: 109
diff changeset
99 * DMA Wait
5cde66c926b4 いろいろ fix 。詳しくは TaskManager/Changelog、test_render/Changelog を
gongo@localhost.localdomain
parents: 109
diff changeset
100 *
5cde66c926b4 いろいろ fix 。詳しくは TaskManager/Changelog、test_render/Changelog を
gongo@localhost.localdomain
parents: 109
diff changeset
101 * @param[in] mask Tag for Wait DMA process
59
16f9f6251f49 *** empty log message ***
gongo
parents:
diff changeset
102 */
273
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 271
diff changeset
103 void
672
3b6290c05f9f add profiling code
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 647
diff changeset
104 CellDmaManager::do_start_dmawait_profile()
242
8382f0f8c0b4 dma_wait
e065746@localhost.localdomain
parents: 240
diff changeset
105 {
8382f0f8c0b4 dma_wait
e065746@localhost.localdomain
parents: 240
diff changeset
106 wait_time = spu_readch(SPU_RdDec);
8382f0f8c0b4 dma_wait
e065746@localhost.localdomain
parents: 240
diff changeset
107 global_busy_time += busy_time - wait_time;
8382f0f8c0b4 dma_wait
e065746@localhost.localdomain
parents: 240
diff changeset
108 spu_writech(SPU_WrDec, 0xffffffff);
8382f0f8c0b4 dma_wait
e065746@localhost.localdomain
parents: 240
diff changeset
109 }
8382f0f8c0b4 dma_wait
e065746@localhost.localdomain
parents: 240
diff changeset
110
273
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 271
diff changeset
111 void
675
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 672
diff changeset
112 CellDmaManager::do_end_dmawait_profile(long long *counter)
242
8382f0f8c0b4 dma_wait
e065746@localhost.localdomain
parents: 240
diff changeset
113 {
8382f0f8c0b4 dma_wait
e065746@localhost.localdomain
parents: 240
diff changeset
114 wait_time = spu_readch(SPU_RdDec);
675
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 672
diff changeset
115 *counter += 0xffffffff - wait_time;
242
8382f0f8c0b4 dma_wait
e065746@localhost.localdomain
parents: 240
diff changeset
116 busy_time = wait_time;
8382f0f8c0b4 dma_wait
e065746@localhost.localdomain
parents: 240
diff changeset
117 }
239
admin@mcbk.cr.ie.u-ryukyu.ac.jp
parents: 180
diff changeset
118
672
3b6290c05f9f add profiling code
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 647
diff changeset
119 void CellDmaManager::null_start_dmawait_profile() {}
3b6290c05f9f add profiling code
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 647
diff changeset
120 void CellDmaManager::null_end_dmawait_profile() {}
3b6290c05f9f add profiling code
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 647
diff changeset
121
239
admin@mcbk.cr.ie.u-ryukyu.ac.jp
parents: 180
diff changeset
122 void
255
6bb8725e60ae show dma wait
tkaito@localhost.localdomain
parents: 242
diff changeset
123 CellDmaManager::show_dma_wait(int cpu)
6bb8725e60ae show dma wait
tkaito@localhost.localdomain
parents: 242
diff changeset
124 {
6bb8725e60ae show dma wait
tkaito@localhost.localdomain
parents: 242
diff changeset
125
675
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 672
diff changeset
126 double r = ((double)global_busy_time)/((double)(
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 672
diff changeset
127 global_busy_time+global_wait_time+global_mail_time
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 672
diff changeset
128 ))*100.0);
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 672
diff changeset
129 printf("spu%d: busy_time = %lld",cpu, global_busy_time);
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 672
diff changeset
130 printf(" wait_time = %lld", global_wait_time);
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 672
diff changeset
131 printf(" mail_time = %lld", global_mail_time);
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 672
diff changeset
132 printf(" busy_ratio = %g%%\n",r);
255
6bb8725e60ae show dma wait
tkaito@localhost.localdomain
parents: 242
diff changeset
133 }
6bb8725e60ae show dma wait
tkaito@localhost.localdomain
parents: 242
diff changeset
134
604
7a41d2cb0a84 fix mail box size
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 364
diff changeset
135
7a41d2cb0a84 fix mail box size
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 364
diff changeset
136 /* end */