1313#define CMDQ_POLL_ENABLE_MASK BIT(0)
1414#define CMDQ_EOC_IRQ_EN BIT(0)
1515#define CMDQ_REG_TYPE 1
16+ #define CMDQ_JUMP_RELATIVE 1
1617
1718struct cmdq_instruction {
1819 union {
1920 u32 value ;
2021 u32 mask ;
22+ struct {
23+ u16 arg_c ;
24+ u16 src_reg ;
25+ };
2126 };
2227 union {
2328 u16 offset ;
@@ -223,15 +228,104 @@ int cmdq_pkt_write_mask(struct cmdq_pkt *pkt, u8 subsys,
223228}
224229EXPORT_SYMBOL (cmdq_pkt_write_mask );
225230
226- int cmdq_pkt_wfe (struct cmdq_pkt * pkt , u16 event )
231+ int cmdq_pkt_read_s (struct cmdq_pkt * pkt , u16 high_addr_reg_idx , u16 addr_low ,
232+ u16 reg_idx )
233+ {
234+ struct cmdq_instruction inst = {};
235+
236+ inst .op = CMDQ_CODE_READ_S ;
237+ inst .dst_t = CMDQ_REG_TYPE ;
238+ inst .sop = high_addr_reg_idx ;
239+ inst .reg_dst = reg_idx ;
240+ inst .src_reg = addr_low ;
241+
242+ return cmdq_pkt_append_command (pkt , inst );
243+ }
244+ EXPORT_SYMBOL (cmdq_pkt_read_s );
245+
246+ int cmdq_pkt_write_s (struct cmdq_pkt * pkt , u16 high_addr_reg_idx ,
247+ u16 addr_low , u16 src_reg_idx )
248+ {
249+ struct cmdq_instruction inst = {};
250+
251+ inst .op = CMDQ_CODE_WRITE_S ;
252+ inst .src_t = CMDQ_REG_TYPE ;
253+ inst .sop = high_addr_reg_idx ;
254+ inst .offset = addr_low ;
255+ inst .src_reg = src_reg_idx ;
256+
257+ return cmdq_pkt_append_command (pkt , inst );
258+ }
259+ EXPORT_SYMBOL (cmdq_pkt_write_s );
260+
261+ int cmdq_pkt_write_s_mask (struct cmdq_pkt * pkt , u16 high_addr_reg_idx ,
262+ u16 addr_low , u16 src_reg_idx , u32 mask )
263+ {
264+ struct cmdq_instruction inst = {};
265+ int err ;
266+
267+ inst .op = CMDQ_CODE_MASK ;
268+ inst .mask = ~mask ;
269+ err = cmdq_pkt_append_command (pkt , inst );
270+ if (err < 0 )
271+ return err ;
272+
273+ inst .mask = 0 ;
274+ inst .op = CMDQ_CODE_WRITE_S_MASK ;
275+ inst .src_t = CMDQ_REG_TYPE ;
276+ inst .sop = high_addr_reg_idx ;
277+ inst .offset = addr_low ;
278+ inst .src_reg = src_reg_idx ;
279+
280+ return cmdq_pkt_append_command (pkt , inst );
281+ }
282+ EXPORT_SYMBOL (cmdq_pkt_write_s_mask );
283+
284+ int cmdq_pkt_write_s_value (struct cmdq_pkt * pkt , u8 high_addr_reg_idx ,
285+ u16 addr_low , u32 value )
286+ {
287+ struct cmdq_instruction inst = {};
288+
289+ inst .op = CMDQ_CODE_WRITE_S ;
290+ inst .sop = high_addr_reg_idx ;
291+ inst .offset = addr_low ;
292+ inst .value = value ;
293+
294+ return cmdq_pkt_append_command (pkt , inst );
295+ }
296+ EXPORT_SYMBOL (cmdq_pkt_write_s_value );
297+
298+ int cmdq_pkt_write_s_mask_value (struct cmdq_pkt * pkt , u8 high_addr_reg_idx ,
299+ u16 addr_low , u32 value , u32 mask )
300+ {
301+ struct cmdq_instruction inst = {};
302+ int err ;
303+
304+ inst .op = CMDQ_CODE_MASK ;
305+ inst .mask = ~mask ;
306+ err = cmdq_pkt_append_command (pkt , inst );
307+ if (err < 0 )
308+ return err ;
309+
310+ inst .op = CMDQ_CODE_WRITE_S_MASK ;
311+ inst .sop = high_addr_reg_idx ;
312+ inst .offset = addr_low ;
313+ inst .value = value ;
314+
315+ return cmdq_pkt_append_command (pkt , inst );
316+ }
317+ EXPORT_SYMBOL (cmdq_pkt_write_s_mask_value );
318+
319+ int cmdq_pkt_wfe (struct cmdq_pkt * pkt , u16 event , bool clear )
227320{
228321 struct cmdq_instruction inst = { {0 } };
322+ u32 clear_option = clear ? CMDQ_WFE_UPDATE : 0 ;
229323
230324 if (event >= CMDQ_MAX_EVENT )
231325 return - EINVAL ;
232326
233327 inst .op = CMDQ_CODE_WFE ;
234- inst .value = CMDQ_WFE_OPTION ;
328+ inst .value = CMDQ_WFE_OPTION | clear_option ;
235329 inst .event = event ;
236330
237331 return cmdq_pkt_append_command (pkt , inst );
@@ -315,6 +409,18 @@ int cmdq_pkt_assign(struct cmdq_pkt *pkt, u16 reg_idx, u32 value)
315409}
316410EXPORT_SYMBOL (cmdq_pkt_assign );
317411
412+ int cmdq_pkt_jump (struct cmdq_pkt * pkt , dma_addr_t addr )
413+ {
414+ struct cmdq_instruction inst = {};
415+
416+ inst .op = CMDQ_CODE_JUMP ;
417+ inst .offset = CMDQ_JUMP_RELATIVE ;
418+ inst .value = addr >>
419+ cmdq_get_shift_pa (((struct cmdq_client * )pkt -> cl )-> chan );
420+ return cmdq_pkt_append_command (pkt , inst );
421+ }
422+ EXPORT_SYMBOL (cmdq_pkt_jump );
423+
318424int cmdq_pkt_finalize (struct cmdq_pkt * pkt )
319425{
320426 struct cmdq_instruction inst = { {0 } };
@@ -329,7 +435,8 @@ int cmdq_pkt_finalize(struct cmdq_pkt *pkt)
329435
330436 /* JUMP to end */
331437 inst .op = CMDQ_CODE_JUMP ;
332- inst .value = CMDQ_JUMP_PASS ;
438+ inst .value = CMDQ_JUMP_PASS >>
439+ cmdq_get_shift_pa (((struct cmdq_client * )pkt -> cl )-> chan );
333440 err = cmdq_pkt_append_command (pkt , inst );
334441
335442 return err ;
0 commit comments