dol: initial dol commit
[jump.git] / dol / src / dol / visitor / cell / lib / spu_mfcio_ext.h
1 // -------------------------------------------------------------- \r
2 // (C)Copyright 2007,                                         \r
3 // International Business Machines Corporation, \r
4 // All Rights Reserved.\r
5 // -------------------------------------------------------------- \r
6  \r
7 #ifndef _spu_mfcio_ext_h_\r
8 #define _spu_mfcio_ext_h_\r
9 \r
10 #include <stdint.h>\r
11 #include <stdio.h>\r
12 #include <ctype.h>\r
13 \r
14 #include <spu_intrinsics.h>\r
15 #include <spu_mfcio.h>\r
16 \r
17 static uint32_t msg[4]__attribute__ ((aligned (16)));\r
18 \r
19 // ==========================================================================\r
20 // Definitions\r
21 // ==========================================================================\r
22 #define SPU_IN_MBOX_OFFSET                      0x0C // offset of mailbox status register from control area base\r
23 #define SPU_IN_MBOX_OFFSET_SLOT         0x3  // 16B alignment of mailbox status register = (SPU_MBOX_STAT_OFFSET&0xF)>>2\r
24 #define SPU_MBOX_STAT_OFFSET            0x14 // offset of mailbox status register from control area base\r
25 #define SPU_MBOX_STAT_OFFSET_SLOT       0x1  // 16B alignment of mailbox status register = (SPU_MBOX_STAT_OFFSET&0xF)>>2\r
26 \r
27 #define SPU_SIG_NOTIFY_OFFSET           0x0C // offset of signal notify 1 or 2 registera from signal notify 1 or 2 areas base\r
28 #define SPU_SIG_NOTIFY_OFFSET_SLOT      0x3  // 16B alignment of signal notify 1 or 2 register = (SPU_SIG_NOTIFY_OFFSET&0xF)>>2\r
29 \r
30 // ==========================================================================\r
31 // Functions definitions\r
32 // ==========================================================================\r
33 \r
34 inline int status_mbox(uint64_t ea_mfc, uint32_t tag_id);\r
35 inline int status_in_mbox(uint64_t ea_mfc, uint32_t tag_id);\r
36 inline int status_out_mbox(uint64_t ea_mfc, uint32_t tag_id);\r
37 inline int status_outintr_mbox(uint64_t ea_mfc, uint32_t tag_id);\r
38 \r
39 int write_in_mbox(uint32_t data, uint64_t ea_mfc, uint32_t tag_id);\r
40 int write_signal1(uint32_t data, uint64_t ea_mfc, uint32_t tag_id);\r
41 int write_signal2(uint32_t data, uint64_t ea_mfc, uint32_t tag_id);\r
42 \r
43 // returns the value of mailbox status register of remote SPE\r
44 inline int status_mbox(uint64_t ea_mfc, uint32_t tag_id)\r
45 {\r
46         uint32_t status[4], idx;        \r
47         uint64_t ea_stat_mbox = ea_mfc + SPU_MBOX_STAT_OFFSET;\r
48 \r
49         //printf("<SPE: ea_mfc=0x%llx, ea_stat_mbox=0x%llx\n", ea_mfc, ea_stat_mbox );\r
50         \r
51         idx = SPU_MBOX_STAT_OFFSET_SLOT;\r
52         \r
53         mfc_get((void *)&status[idx], ea_stat_mbox, sizeof(uint32_t), tag_id, 0, 0);\r
54         mfc_write_tag_mask(1<<tag_id);\r
55         mfc_read_tag_status_any();\r
56 \r
57     //printf("<SPE: Status=0x%x: OutIntrCnt=0x%x, InCnt=0x%x, OutCnt=0x%x\n", status[idx], \r
58         //              (status[idx]&0xffff0000)>>16, (status[idx]&0x0000ff00)>>8, (status[idx]&0x000000ff) );\r
59         //printf("<SPE: status_mbox=%d\n", status[idx] );\r
60         \r
61         return status[idx];\r
62 }\r
63 \r
64 // returns the status (counter) of inbound_mailbox of remote SPE\r
65 inline int status_in_mbox(uint64_t ea_mfc, uint32_t tag_id)\r
66 {\r
67         int status = status_mbox( ea_mfc, tag_id);\r
68         \r
69         status = (status&0x0000ff00)>>8;\r
70                         \r
71         //printf("<SPE: status_in_mbox=%d\n", status );\r
72         \r
73         return status;\r
74 }\r
75 \r
76 // returns the status (counter) of outbound_mailbox of remote SPE\r
77 inline int status_out_mbox(uint64_t ea_mfc, uint32_t tag_id)\r
78 {\r
79         int status = status_mbox( ea_mfc, tag_id);\r
80 \r
81         status = (status&0x000000ff);\r
82                         \r
83         //printf("<SPE: status_out_mbox=%d\n", status[idx] );\r
84         \r
85         return status;\r
86 }\r
87 \r
88 // returns the status (counter) of inbound_interrupt_mailbox of remote SPE\r
89 inline int status_outintr_mbox(uint64_t ea_mfc, uint32_t tag_id)\r
90 {\r
91         int status = status_mbox( ea_mfc, tag_id);\r
92 \r
93         status = (status&0xffff0000)>>16;\r
94                         \r
95         //printf("<SPE: status_outintr_mbox=%d\n", status[idx] );\r
96         \r
97         return status;\r
98 }\r
99 \r
100 // writing to a remote SPE�s inbound mailbox\r
101 inline int write_in_mbox(uint32_t data, uint64_t ea_mfc, uint32_t tag_id){\r
102 \r
103         int status;\r
104         uint64_t ea_in_mbox = ea_mfc + SPU_IN_MBOX_OFFSET;      \r
105         uint32_t mbx[4], idx;\r
106 \r
107         idx = SPU_IN_MBOX_OFFSET_SLOT;\r
108         mbx[idx] = data;\r
109         \r
110         while( (status= status_in_mbox(ea_mfc, tag_id))<1);\r
111         \r
112         mfc_put((void *)&mbx[idx], ea_in_mbox, sizeof(uint32_t), tag_id, 0, 0);\r
113         mfc_write_tag_mask(1<<tag_id);\r
114         mfc_read_tag_status_any();\r
115 \r
116         //printf("<SPE: write_in_mbox: complete\n" );   \r
117         \r
118         return 1; // number of mailbox being written\r
119 }\r
120 \r
121 // signal a remote SPE�s signal1 register\r
122 inline int write_signal1(uint32_t data, uint64_t ea_sig1, uint32_t tag_id)\r
123 {\r
124         uint64_t ea_sig1_notify = ea_sig1 + SPU_SIG_NOTIFY_OFFSET;      \r
125         uint32_t idx;\r
126 \r
127         //printf("<SPE: write_signal1: starts\n" );\r
128         \r
129         //printf("<SPE: write_signal1:  ea_mfc=0x%llx, ea_in_mbox=0x%llx\n", ea_sig1, ea_sig1_notify );\r
130         \r
131         idx = SPU_SIG_NOTIFY_OFFSET_SLOT;\r
132         msg[idx] = data;\r
133         \r
134         mfc_sndsig( &msg[idx], ea_sig1_notify, tag_id, 0,0)     ;\r
135         mfc_write_tag_mask(1<<tag_id);\r
136         mfc_read_tag_status_any();\r
137 \r
138         //printf("<SPE: write_in_mbox: complete\n" );   \r
139         \r
140         return 1; // number of mailbox being written\r
141 }\r
142 \r
143 // signal a remote SPE�s signal1 register\r
144 inline int write_signal2(uint32_t data, uint64_t ea_sig2, uint32_t tag_id)\r
145 {\r
146         uint64_t ea_sig2_notify = ea_sig2 + SPU_SIG_NOTIFY_OFFSET;      \r
147         uint32_t idx;\r
148 \r
149         //printf("<SPE: write_signal2: starts\n" );\r
150         \r
151         //printf("<SPE: write_signal2:  ea_mfc=0x%llx, ea_in_mbox=0x%llx\n", ea_sig2, ea_sig2_notify );\r
152         \r
153         idx = SPU_SIG_NOTIFY_OFFSET_SLOT;\r
154         msg[idx] = data;\r
155         \r
156         mfc_sndsig( &msg[idx], ea_sig2_notify, tag_id, 0,0)     ;\r
157         mfc_write_tag_mask(1<<tag_id);\r
158         mfc_read_tag_status_any();\r
159 \r
160         //printf("<SPE: write_in_mbox: complete\n" );   \r
161         \r
162         return 1; // number of mailbox being written\r
163 }\r
164 \r
165 \r
166 \r
167 \r
168 \r
169 \r
170 \r
171 \r
172 #endif\r
173 \r