static int allocate_predication_buf(struct vdec_h264_inst *inst) { int err = 0; inst->pred_buf.size = BUF_PREDICTION_SZ; err = mtk_vcodec_mem_alloc(inst->ctx, &inst->pred_buf); if (err) { mtk_vcodec_err(inst, "failed to allocate ppl buf"); return err; } inst->vsi->pred_buf_dma = inst->pred_buf.dma_addr; return 0; }
static int alloc_mv_buf(struct vdec_h264_inst *inst, struct vdec_pic_info *pic) { int i; int err; struct mtk_vcodec_mem *mem = NULL; unsigned int buf_sz = get_mv_buf_size(pic->buf_w, pic->buf_h); for (i = 0; i < H264_MAX_FB_NUM; i++) { mem = &inst->mv_buf[i]; if (mem->va) mtk_vcodec_mem_free(inst->ctx, mem); mem->size = buf_sz; err = mtk_vcodec_mem_alloc(inst->ctx, mem); if (err) { mtk_vcodec_err(inst, "failed to allocate mv buf"); return err; } inst->vsi->mv_buf_dma[i] = mem->dma_addr; } return 0; }
static int h264_enc_alloc_work_buf(struct venc_h264_inst *inst) { int i; int ret = 0; struct venc_h264_vpu_buf *wb = inst->vsi->work_bufs; mtk_vcodec_debug_enter(inst); for (i = 0; i < VENC_H264_VPU_WORK_BUF_MAX; i++) { /* * This 'wb' structure is set by VPU side and shared to AP for * buffer allocation and IO virtual addr mapping. For most of * the buffers, AP will allocate the buffer according to 'size' * field and store the IO virtual addr in 'iova' field. There * are two exceptions: * (1) RC_CODE buffer, it's pre-allocated in the VPU side, and * save the VPU addr in the 'vpua' field. The AP will translate * the VPU addr to the corresponding IO virtual addr and store * in 'iova' field for reg setting in VPU side. * (2) SKIP_FRAME buffer, it's pre-allocated in the VPU side, * and save the VPU addr in the 'vpua' field. The AP will * translate the VPU addr to the corresponding AP side virtual * address and do some memcpy access to move to bitstream buffer * assigned by v4l2 layer. */ inst->work_bufs[i].size = wb[i].size; if (i == VENC_H264_VPU_WORK_BUF_SKIP_FRAME) { inst->work_bufs[i].va = vpu_mapping_dm_addr( inst->vpu_inst.dev, wb[i].vpua); inst->work_bufs[i].dma_addr = 0; } else { ret = mtk_vcodec_mem_alloc(inst->ctx, &inst->work_bufs[i]); if (ret) { mtk_vcodec_err(inst, "cannot allocate buf %d", i); goto err_alloc; } /* * This RC_CODE is pre-allocated by VPU and saved in VPU * addr. So we need use memcpy to copy RC_CODE from VPU * addr into IO virtual addr in 'iova' field for reg * setting in VPU side. */ if (i == VENC_H264_VPU_WORK_BUF_RC_CODE) { void *tmp_va; tmp_va = vpu_mapping_dm_addr(inst->vpu_inst.dev, wb[i].vpua); memcpy(inst->work_bufs[i].va, tmp_va, wb[i].size); } } wb[i].iova = inst->work_bufs[i].dma_addr; mtk_vcodec_debug(inst, "work_buf[%d] va=0x%p iova=%pad size=%zu", i, inst->work_bufs[i].va, &inst->work_bufs[i].dma_addr, inst->work_bufs[i].size); } /* the pps_buf is used by AP side only */ inst->pps_buf.size = 128; ret = mtk_vcodec_mem_alloc(inst->ctx, &inst->pps_buf); if (ret) { mtk_vcodec_err(inst, "cannot allocate pps_buf"); goto err_alloc; } mtk_vcodec_debug_leave(inst); return ret; err_alloc: h264_enc_free_work_buf(inst); return ret; }