soc: mediatek: mtk-cmdq: Add cmdq_pkt_mem_move() function
[linux-2.6-block.git] / drivers / soc / mediatek / mtk-cmdq-helper.c
index 1a1f1b260a064299cefb09d06ac61fc5ba0c7d94..4cd1a25866a9a8b3998aaa2600df79b977ef15b0 100644 (file)
@@ -290,6 +290,32 @@ int cmdq_pkt_write_s_mask_value(struct cmdq_pkt *pkt, u8 high_addr_reg_idx,
 }
 EXPORT_SYMBOL(cmdq_pkt_write_s_mask_value);
 
+int cmdq_pkt_mem_move(struct cmdq_pkt *pkt, dma_addr_t src_addr, dma_addr_t dst_addr)
+{
+       const u16 high_addr_reg_idx  = CMDQ_THR_SPR_IDX0;
+       const u16 value_reg_idx = CMDQ_THR_SPR_IDX1;
+       int ret;
+
+       /* read the value of src_addr into high_addr_reg_idx */
+       ret = cmdq_pkt_assign(pkt, high_addr_reg_idx, CMDQ_ADDR_HIGH(src_addr));
+       if (ret < 0)
+               return ret;
+       ret = cmdq_pkt_read_s(pkt, high_addr_reg_idx, CMDQ_ADDR_LOW(src_addr), value_reg_idx);
+       if (ret < 0)
+               return ret;
+
+       /* write the value of value_reg_idx into dst_addr */
+       ret = cmdq_pkt_assign(pkt, high_addr_reg_idx, CMDQ_ADDR_HIGH(dst_addr));
+       if (ret < 0)
+               return ret;
+       ret = cmdq_pkt_write_s(pkt, high_addr_reg_idx, CMDQ_ADDR_LOW(dst_addr), value_reg_idx);
+       if (ret < 0)
+               return ret;
+
+       return 0;
+}
+EXPORT_SYMBOL(cmdq_pkt_mem_move);
+
 int cmdq_pkt_wfe(struct cmdq_pkt *pkt, u16 event, bool clear)
 {
        struct cmdq_instruction inst = { {0} };