struct mv_cesa_op_ctx *mv_cesa_dma_add_op(struct mv_cesa_tdma_chain *chain, const struct mv_cesa_op_ctx *op_templ, bool skip_ctx, gfp_t flags) { struct mv_cesa_tdma_desc *tdma; struct mv_cesa_op_ctx *op; dma_addr_t dma_handle; unsigned int size; tdma = mv_cesa_dma_add_desc(chain, flags); if (IS_ERR(tdma)) return ERR_CAST(tdma); op = dma_pool_alloc(cesa_dev->dma->op_pool, flags, &dma_handle); if (!op) return ERR_PTR(-ENOMEM); *op = *op_templ; size = skip_ctx ? sizeof(op->desc) : sizeof(*op); tdma = chain->last; tdma->op = op; tdma->byte_cnt = cpu_to_le32(size | BIT(31)); tdma->src = cpu_to_le32(dma_handle); tdma->flags = CESA_TDMA_DST_IN_SRAM | CESA_TDMA_OP; return op; }
int mv_cesa_dma_add_iv_op(struct mv_cesa_tdma_chain *chain, dma_addr_t src, u32 size, u32 flags, gfp_t gfp_flags) { struct mv_cesa_tdma_desc *tdma; u8 *iv; dma_addr_t dma_handle; tdma = mv_cesa_dma_add_desc(chain, gfp_flags); if (IS_ERR(tdma)) return PTR_ERR(tdma); iv = dma_pool_alloc(cesa_dev->dma->iv_pool, gfp_flags, &dma_handle); if (!iv) return -ENOMEM; tdma->byte_cnt = cpu_to_le32(size | BIT(31)); tdma->src = src; tdma->dst = cpu_to_le32(dma_handle); tdma->data = iv; flags &= (CESA_TDMA_DST_IN_SRAM | CESA_TDMA_SRC_IN_SRAM); tdma->flags = flags | CESA_TDMA_IV; return 0; }
int mv_cesa_dma_add_dummy_launch(struct mv_cesa_tdma_chain *chain, gfp_t flags) { struct mv_cesa_tdma_desc *tdma; tdma = mv_cesa_dma_add_desc(chain, flags); if (IS_ERR(tdma)) return PTR_ERR(tdma); return 0; }
int mv_cesa_dma_add_dummy_end(struct mv_cesa_tdma_chain *chain, gfp_t flags) { struct mv_cesa_tdma_desc *tdma; tdma = mv_cesa_dma_add_desc(chain, flags); if (IS_ERR(tdma)) return PTR_ERR(tdma); tdma->byte_cnt = cpu_to_le32(BIT(31)); return 0; }
int mv_cesa_dma_add_data_transfer(struct mv_cesa_tdma_chain *chain, dma_addr_t dst, dma_addr_t src, u32 size, u32 flags, gfp_t gfp_flags) { struct mv_cesa_tdma_desc *tdma; tdma = mv_cesa_dma_add_desc(chain, gfp_flags); if (IS_ERR(tdma)) return PTR_ERR(tdma); tdma->byte_cnt = cpu_to_le32(size | BIT(31)); tdma->src = src; tdma->dst = dst; flags &= (CESA_TDMA_DST_IN_SRAM | CESA_TDMA_SRC_IN_SRAM); tdma->flags = flags | CESA_TDMA_DATA; return 0; }