Add memory move function in cmdq helper functions which helps copy value between physical address. Signed-off-by: Dennis YC Hsieh <dennis-yc.hsieh@xxxxxxxxxxxx> --- drivers/soc/mediatek/mtk-cmdq-helper.c | 26 ++++++++++++++++++++++++++ include/linux/soc/mediatek/mtk-cmdq.h | 13 +++++++++++++ 2 files changed, 39 insertions(+) diff --git a/drivers/soc/mediatek/mtk-cmdq-helper.c b/drivers/soc/mediatek/mtk-cmdq-helper.c index 4c90fed..4235cf8 100644 --- a/drivers/soc/mediatek/mtk-cmdq-helper.c +++ b/drivers/soc/mediatek/mtk-cmdq-helper.c @@ -282,6 +282,32 @@ int cmdq_pkt_write_s(struct cmdq_pkt *pkt, dma_addr_t addr, } EXPORT_SYMBOL(cmdq_pkt_write_s); +int cmdq_pkt_mem_move(struct cmdq_pkt *pkt, phys_addr_t src_addr, + phys_addr_t dst_addr) +{ + struct cmdq_instruction inst = { {0} }; + const u16 dst_reg_idx = CMDQ_SPR_TEMP; + const u16 swap_reg_idx = CMDQ_SPR1; + int err; + + err = cmdq_pkt_read_s(pkt, src_addr, swap_reg_idx); + if (err < 0) + return err; + + err = cmdq_pkt_assign(pkt, dst_reg_idx, CMDQ_ADDR_HIGH(dst_addr)); + if (err < 0) + return err; + + inst.op = CMDQ_CODE_WRITE_S; + inst.arg_b_t = CMDQ_REG_TYPE; + inst.sop = dst_reg_idx; + inst.offset = CMDQ_ADDR_LOW(dst_addr); + inst.arg_b = swap_reg_idx; + + return cmdq_pkt_append_command(pkt, inst); +} +EXPORT_SYMBOL(cmdq_pkt_mem_move); + int cmdq_pkt_wfe(struct cmdq_pkt *pkt, u16 event) { struct cmdq_instruction inst = { {0} }; diff --git a/include/linux/soc/mediatek/mtk-cmdq.h b/include/linux/soc/mediatek/mtk-cmdq.h index fb48d3c..b3474f2 100644 --- a/include/linux/soc/mediatek/mtk-cmdq.h +++ b/include/linux/soc/mediatek/mtk-cmdq.h @@ -13,6 +13,7 @@ #define CMDQ_NO_TIMEOUT 0xffffffffu #define CMDQ_SPR_TEMP 0 +#define CMDQ_SPR1 1 struct cmdq_pkt; @@ -126,6 +127,18 @@ int cmdq_pkt_write_s(struct cmdq_pkt *pkt, dma_addr_t addr, u32 value, u32 mask); /** + * cmdq_pkt_mem_move() - append read and write commands to copy data from + * source address to destination address. + * @pkt: the CMDQ packet + * @src_addr: the source physical address + * @dst_addr: the destination physical address + * + * Return: 0 for success; else the error code is returned + */ +int cmdq_pkt_mem_move(struct cmdq_pkt *pkt, phys_addr_t src_addr, + phys_addr_t dst_addr); + +/** * cmdq_pkt_wfe() - append wait for event command to the CMDQ packet * @pkt: the CMDQ packet * @event: the desired event type to "wait and CLEAR" -- 1.7.9.5