9
9
#include <linux/mailbox_controller.h>
10
10
#include <linux/soc/mediatek/mtk-cmdq.h>
11
11
12
- #define CMDQ_ARG_A_WRITE_MASK 0xffff
13
12
#define CMDQ_WRITE_ENABLE_MASK BIT(0)
14
13
#define CMDQ_EOC_IRQ_EN BIT(0)
15
14
#define CMDQ_EOC_CMD ((u64)((CMDQ_CODE_EOC << CMDQ_OP_CODE_SHIFT)) \
16
15
<< 32 | CMDQ_EOC_IRQ_EN)
17
16
17
+ struct cmdq_instruction {
18
+ union {
19
+ u32 value ;
20
+ u32 mask ;
21
+ };
22
+ union {
23
+ u16 offset ;
24
+ u16 event ;
25
+ };
26
+ u8 subsys ;
27
+ u8 op ;
28
+ };
29
+
18
30
static void cmdq_client_timeout (struct timer_list * t )
19
31
{
20
32
struct cmdq_client * client = from_timer (client , t , timer );
@@ -110,10 +122,10 @@ void cmdq_pkt_destroy(struct cmdq_pkt *pkt)
110
122
}
111
123
EXPORT_SYMBOL (cmdq_pkt_destroy );
112
124
113
- static int cmdq_pkt_append_command (struct cmdq_pkt * pkt , enum cmdq_code code ,
114
- u32 arg_a , u32 arg_b )
125
+ static int cmdq_pkt_append_command (struct cmdq_pkt * pkt ,
126
+ struct cmdq_instruction inst )
115
127
{
116
- u64 * cmd_ptr ;
128
+ struct cmdq_instruction * cmd_ptr ;
117
129
118
130
if (unlikely (pkt -> cmd_buf_size + CMDQ_INST_SIZE > pkt -> buf_size )) {
119
131
/*
@@ -129,30 +141,38 @@ static int cmdq_pkt_append_command(struct cmdq_pkt *pkt, enum cmdq_code code,
129
141
__func__ , (u32 )pkt -> buf_size );
130
142
return - ENOMEM ;
131
143
}
144
+
132
145
cmd_ptr = pkt -> va_base + pkt -> cmd_buf_size ;
133
- ( * cmd_ptr ) = ( u64 )(( code << CMDQ_OP_CODE_SHIFT ) | arg_a ) << 32 | arg_b ;
146
+ * cmd_ptr = inst ;
134
147
pkt -> cmd_buf_size += CMDQ_INST_SIZE ;
135
148
136
149
return 0 ;
137
150
}
138
151
139
152
int cmdq_pkt_write (struct cmdq_pkt * pkt , u8 subsys , u16 offset , u32 value )
140
153
{
141
- u32 arg_a = (offset & CMDQ_ARG_A_WRITE_MASK ) |
142
- (subsys << CMDQ_SUBSYS_SHIFT );
154
+ struct cmdq_instruction inst ;
143
155
144
- return cmdq_pkt_append_command (pkt , CMDQ_CODE_WRITE , arg_a , value );
156
+ inst .op = CMDQ_CODE_WRITE ;
157
+ inst .value = value ;
158
+ inst .offset = offset ;
159
+ inst .subsys = subsys ;
160
+
161
+ return cmdq_pkt_append_command (pkt , inst );
145
162
}
146
163
EXPORT_SYMBOL (cmdq_pkt_write );
147
164
148
165
int cmdq_pkt_write_mask (struct cmdq_pkt * pkt , u8 subsys ,
149
166
u16 offset , u32 value , u32 mask )
150
167
{
151
- u32 offset_mask = offset ;
168
+ struct cmdq_instruction inst = { {0 } };
169
+ u16 offset_mask = offset ;
152
170
int err ;
153
171
154
172
if (mask != 0xffffffff ) {
155
- err = cmdq_pkt_append_command (pkt , CMDQ_CODE_MASK , 0 , ~mask );
173
+ inst .op = CMDQ_CODE_MASK ;
174
+ inst .mask = ~mask ;
175
+ err = cmdq_pkt_append_command (pkt , inst );
156
176
if (err < 0 )
157
177
return err ;
158
178
@@ -166,45 +186,50 @@ EXPORT_SYMBOL(cmdq_pkt_write_mask);
166
186
167
187
int cmdq_pkt_wfe (struct cmdq_pkt * pkt , u16 event )
168
188
{
169
- u32 arg_b ;
189
+ struct cmdq_instruction inst = { { 0 } } ;
170
190
171
191
if (event >= CMDQ_MAX_EVENT )
172
192
return - EINVAL ;
173
193
174
- /*
175
- * WFE arg_b
176
- * bit 0-11: wait value
177
- * bit 15: 1 - wait, 0 - no wait
178
- * bit 16-27: update value
179
- * bit 31: 1 - update, 0 - no update
180
- */
181
- arg_b = CMDQ_WFE_UPDATE | CMDQ_WFE_WAIT | CMDQ_WFE_WAIT_VALUE ;
194
+ inst .op = CMDQ_CODE_WFE ;
195
+ inst .value = CMDQ_WFE_OPTION ;
196
+ inst .event = event ;
182
197
183
- return cmdq_pkt_append_command (pkt , CMDQ_CODE_WFE , event , arg_b );
198
+ return cmdq_pkt_append_command (pkt , inst );
184
199
}
185
200
EXPORT_SYMBOL (cmdq_pkt_wfe );
186
201
187
202
int cmdq_pkt_clear_event (struct cmdq_pkt * pkt , u16 event )
188
203
{
204
+ struct cmdq_instruction inst = { {0 } };
205
+
189
206
if (event >= CMDQ_MAX_EVENT )
190
207
return - EINVAL ;
191
208
192
- return cmdq_pkt_append_command (pkt , CMDQ_CODE_WFE , event ,
193
- CMDQ_WFE_UPDATE );
209
+ inst .op = CMDQ_CODE_WFE ;
210
+ inst .value = CMDQ_WFE_UPDATE ;
211
+ inst .event = event ;
212
+
213
+ return cmdq_pkt_append_command (pkt , inst );
194
214
}
195
215
EXPORT_SYMBOL (cmdq_pkt_clear_event );
196
216
197
217
static int cmdq_pkt_finalize (struct cmdq_pkt * pkt )
198
218
{
219
+ struct cmdq_instruction inst = { {0 } };
199
220
int err ;
200
221
201
222
/* insert EOC and generate IRQ for each command iteration */
202
- err = cmdq_pkt_append_command (pkt , CMDQ_CODE_EOC , 0 , CMDQ_EOC_IRQ_EN );
223
+ inst .op = CMDQ_CODE_EOC ;
224
+ inst .value = CMDQ_EOC_IRQ_EN ;
225
+ err = cmdq_pkt_append_command (pkt , inst );
203
226
if (err < 0 )
204
227
return err ;
205
228
206
229
/* JUMP to end */
207
- err = cmdq_pkt_append_command (pkt , CMDQ_CODE_JUMP , 0 , CMDQ_JUMP_PASS );
230
+ inst .op = CMDQ_CODE_JUMP ;
231
+ inst .value = CMDQ_JUMP_PASS ;
232
+ err = cmdq_pkt_append_command (pkt , inst );
208
233
209
234
return err ;
210
235
}
0 commit comments