Skip to content

Commit 263801f

Browse files
Jason-JH.LinAngeloGioacchino Del Regno
authored andcommitted
soc: mediatek: mtk-cmdq: Add cmdq_pkt_mem_move() function
Add cmdq_pkt_mem_move() function to support CMDQ user making an instruction for moving a value from a source address to a destination address. Signed-off-by: Jason-JH.Lin <jason-jh.lin@mediatek.com> Reviewed-by: AngeloGioacchino Del Regno <angelogioacchino.delregno@collabora.com> Link: https://lore.kernel.org/r/20240307013458.23550-3-jason-jh.lin@mediatek.com Signed-off-by: AngeloGioacchino Del Regno <angelogioacchino.delregno@collabora.com>
1 parent 49ddaa4 commit 263801f

2 files changed

Lines changed: 38 additions & 0 deletions

File tree

drivers/soc/mediatek/mtk-cmdq-helper.c

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -290,6 +290,32 @@ int cmdq_pkt_write_s_mask_value(struct cmdq_pkt *pkt, u8 high_addr_reg_idx,
290290
}
291291
EXPORT_SYMBOL(cmdq_pkt_write_s_mask_value);
292292

293+
int cmdq_pkt_mem_move(struct cmdq_pkt *pkt, dma_addr_t src_addr, dma_addr_t dst_addr)
294+
{
295+
const u16 high_addr_reg_idx = CMDQ_THR_SPR_IDX0;
296+
const u16 value_reg_idx = CMDQ_THR_SPR_IDX1;
297+
int ret;
298+
299+
/* read the value of src_addr into high_addr_reg_idx */
300+
ret = cmdq_pkt_assign(pkt, high_addr_reg_idx, CMDQ_ADDR_HIGH(src_addr));
301+
if (ret < 0)
302+
return ret;
303+
ret = cmdq_pkt_read_s(pkt, high_addr_reg_idx, CMDQ_ADDR_LOW(src_addr), value_reg_idx);
304+
if (ret < 0)
305+
return ret;
306+
307+
/* write the value of value_reg_idx into dst_addr */
308+
ret = cmdq_pkt_assign(pkt, high_addr_reg_idx, CMDQ_ADDR_HIGH(dst_addr));
309+
if (ret < 0)
310+
return ret;
311+
ret = cmdq_pkt_write_s(pkt, high_addr_reg_idx, CMDQ_ADDR_LOW(dst_addr), value_reg_idx);
312+
if (ret < 0)
313+
return ret;
314+
315+
return 0;
316+
}
317+
EXPORT_SYMBOL(cmdq_pkt_mem_move);
318+
293319
int cmdq_pkt_wfe(struct cmdq_pkt *pkt, u16 event, bool clear)
294320
{
295321
struct cmdq_instruction inst = { {0} };

include/linux/soc/mediatek/mtk-cmdq.h

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -184,6 +184,18 @@ int cmdq_pkt_write_s_value(struct cmdq_pkt *pkt, u8 high_addr_reg_idx,
184184
int cmdq_pkt_write_s_mask_value(struct cmdq_pkt *pkt, u8 high_addr_reg_idx,
185185
u16 addr_low, u32 value, u32 mask);
186186

187+
/**
188+
* cmdq_pkt_mem_move() - append memory move command to the CMDQ packet
189+
* @pkt: the CMDQ packet
190+
* @src_addr: source address
191+
* @dst_addr: destination address
192+
*
193+
* Appends a CMDQ command to copy the value found in `src_addr` to `dst_addr`.
194+
*
195+
* Return: 0 for success; else the error code is returned
196+
*/
197+
int cmdq_pkt_mem_move(struct cmdq_pkt *pkt, dma_addr_t src_addr, dma_addr_t dst_addr);
198+
187199
/**
188200
* cmdq_pkt_wfe() - append wait for event command to the CMDQ packet
189201
* @pkt: the CMDQ packet

0 commit comments

Comments
 (0)