|
@@ -554,7 +554,7 @@ static void s5p_mfc_get_enc_frame_buffer_v6(struct s5p_mfc_ctx *ctx,
|
|
enc_recon_y_addr = readl(mfc_regs->e_recon_luma_dpb_addr);
|
|
enc_recon_y_addr = readl(mfc_regs->e_recon_luma_dpb_addr);
|
|
enc_recon_c_addr = readl(mfc_regs->e_recon_chroma_dpb_addr);
|
|
enc_recon_c_addr = readl(mfc_regs->e_recon_chroma_dpb_addr);
|
|
|
|
|
|
- mfc_debug(2, "recon y addr: 0x%08lx\n", enc_recon_y_addr);
|
|
|
|
|
|
+ mfc_debug(2, "recon y addr: 0x%08lx y_addr: 0x%08lx\n", enc_recon_y_addr, *y_addr);
|
|
mfc_debug(2, "recon c addr: 0x%08lx\n", enc_recon_c_addr);
|
|
mfc_debug(2, "recon c addr: 0x%08lx\n", enc_recon_c_addr);
|
|
}
|
|
}
|
|
|
|
|
|
@@ -1483,6 +1483,7 @@ static int s5p_mfc_encode_one_frame_v6(struct s5p_mfc_ctx *ctx)
|
|
{
|
|
{
|
|
struct s5p_mfc_dev *dev = ctx->dev;
|
|
struct s5p_mfc_dev *dev = ctx->dev;
|
|
const struct s5p_mfc_regs *mfc_regs = dev->mfc_regs;
|
|
const struct s5p_mfc_regs *mfc_regs = dev->mfc_regs;
|
|
|
|
+ int cmd;
|
|
|
|
|
|
mfc_debug(2, "++\n");
|
|
mfc_debug(2, "++\n");
|
|
|
|
|
|
@@ -1493,9 +1494,13 @@ static int s5p_mfc_encode_one_frame_v6(struct s5p_mfc_ctx *ctx)
|
|
|
|
|
|
s5p_mfc_set_slice_mode(ctx);
|
|
s5p_mfc_set_slice_mode(ctx);
|
|
|
|
|
|
|
|
+ if (ctx->state != MFCINST_FINISHING)
|
|
|
|
+ cmd = S5P_FIMV_CH_FRAME_START_V6;
|
|
|
|
+ else
|
|
|
|
+ cmd = S5P_FIMV_CH_LAST_FRAME_V6;
|
|
|
|
+
|
|
writel(ctx->inst_no, mfc_regs->instance_id);
|
|
writel(ctx->inst_no, mfc_regs->instance_id);
|
|
- s5p_mfc_hw_call_void(dev->mfc_cmds, cmd_host2risc, dev,
|
|
|
|
- S5P_FIMV_CH_FRAME_START_V6, NULL);
|
|
|
|
|
|
+ s5p_mfc_hw_call_void(dev->mfc_cmds, cmd_host2risc, dev, cmd, NULL);
|
|
|
|
|
|
mfc_debug(2, "--\n");
|
|
mfc_debug(2, "--\n");
|
|
|
|
|
|
@@ -1563,8 +1568,8 @@ static inline int s5p_mfc_run_dec_frame(struct s5p_mfc_ctx *ctx)
|
|
temp_vb->flags |= MFC_BUF_FLAG_USED;
|
|
temp_vb->flags |= MFC_BUF_FLAG_USED;
|
|
s5p_mfc_set_dec_stream_buffer_v6(ctx,
|
|
s5p_mfc_set_dec_stream_buffer_v6(ctx,
|
|
vb2_dma_contig_plane_dma_addr(&temp_vb->b->vb2_buf, 0),
|
|
vb2_dma_contig_plane_dma_addr(&temp_vb->b->vb2_buf, 0),
|
|
- ctx->consumed_stream,
|
|
|
|
- temp_vb->b->vb2_buf.planes[0].bytesused);
|
|
|
|
|
|
+ ctx->consumed_stream,
|
|
|
|
+ temp_vb->b->vb2_buf.planes[0].bytesused);
|
|
spin_unlock_irqrestore(&dev->irqlock, flags);
|
|
spin_unlock_irqrestore(&dev->irqlock, flags);
|
|
|
|
|
|
dev->curr_ctx = ctx->num;
|
|
dev->curr_ctx = ctx->num;
|
|
@@ -1592,7 +1597,7 @@ static inline int s5p_mfc_run_enc_frame(struct s5p_mfc_ctx *ctx)
|
|
|
|
|
|
spin_lock_irqsave(&dev->irqlock, flags);
|
|
spin_lock_irqsave(&dev->irqlock, flags);
|
|
|
|
|
|
- if (list_empty(&ctx->src_queue)) {
|
|
|
|
|
|
+ if (list_empty(&ctx->src_queue) && ctx->state != MFCINST_FINISHING) {
|
|
mfc_debug(2, "no src buffers.\n");
|
|
mfc_debug(2, "no src buffers.\n");
|
|
spin_unlock_irqrestore(&dev->irqlock, flags);
|
|
spin_unlock_irqrestore(&dev->irqlock, flags);
|
|
return -EAGAIN;
|
|
return -EAGAIN;
|
|
@@ -1604,15 +1609,28 @@ static inline int s5p_mfc_run_enc_frame(struct s5p_mfc_ctx *ctx)
|
|
return -EAGAIN;
|
|
return -EAGAIN;
|
|
}
|
|
}
|
|
|
|
|
|
- src_mb = list_entry(ctx->src_queue.next, struct s5p_mfc_buf, list);
|
|
|
|
- src_mb->flags |= MFC_BUF_FLAG_USED;
|
|
|
|
- src_y_addr = vb2_dma_contig_plane_dma_addr(&src_mb->b->vb2_buf, 0);
|
|
|
|
- src_c_addr = vb2_dma_contig_plane_dma_addr(&src_mb->b->vb2_buf, 1);
|
|
|
|
|
|
+ if (list_empty(&ctx->src_queue)) {
|
|
|
|
+ /* send null frame */
|
|
|
|
+ s5p_mfc_set_enc_frame_buffer_v6(ctx, 0, 0);
|
|
|
|
+ src_mb = NULL;
|
|
|
|
+ } else {
|
|
|
|
+ src_mb = list_entry(ctx->src_queue.next, struct s5p_mfc_buf, list);
|
|
|
|
+ src_mb->flags |= MFC_BUF_FLAG_USED;
|
|
|
|
+ if (src_mb->b->vb2_buf.planes[0].bytesused == 0) {
|
|
|
|
+ s5p_mfc_set_enc_frame_buffer_v6(ctx, 0, 0);
|
|
|
|
+ ctx->state = MFCINST_FINISHING;
|
|
|
|
+ } else {
|
|
|
|
+ src_y_addr = vb2_dma_contig_plane_dma_addr(&src_mb->b->vb2_buf, 0);
|
|
|
|
+ src_c_addr = vb2_dma_contig_plane_dma_addr(&src_mb->b->vb2_buf, 1);
|
|
|
|
|
|
- mfc_debug(2, "enc src y addr: 0x%08lx\n", src_y_addr);
|
|
|
|
- mfc_debug(2, "enc src c addr: 0x%08lx\n", src_c_addr);
|
|
|
|
|
|
+ mfc_debug(2, "enc src y addr: 0x%08lx\n", src_y_addr);
|
|
|
|
+ mfc_debug(2, "enc src c addr: 0x%08lx\n", src_c_addr);
|
|
|
|
|
|
- s5p_mfc_set_enc_frame_buffer_v6(ctx, src_y_addr, src_c_addr);
|
|
|
|
|
|
+ s5p_mfc_set_enc_frame_buffer_v6(ctx, src_y_addr, src_c_addr);
|
|
|
|
+ if (src_mb->flags & MFC_BUF_FLAG_EOS)
|
|
|
|
+ ctx->state = MFCINST_FINISHING;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
|
|
dst_mb = list_entry(ctx->dst_queue.next, struct s5p_mfc_buf, list);
|
|
dst_mb = list_entry(ctx->dst_queue.next, struct s5p_mfc_buf, list);
|
|
dst_mb->flags |= MFC_BUF_FLAG_USED;
|
|
dst_mb->flags |= MFC_BUF_FLAG_USED;
|
|
@@ -1639,11 +1657,10 @@ static inline void s5p_mfc_run_init_dec(struct s5p_mfc_ctx *ctx)
|
|
spin_lock_irqsave(&dev->irqlock, flags);
|
|
spin_lock_irqsave(&dev->irqlock, flags);
|
|
mfc_debug(2, "Preparing to init decoding.\n");
|
|
mfc_debug(2, "Preparing to init decoding.\n");
|
|
temp_vb = list_entry(ctx->src_queue.next, struct s5p_mfc_buf, list);
|
|
temp_vb = list_entry(ctx->src_queue.next, struct s5p_mfc_buf, list);
|
|
- mfc_debug(2, "Header size: %d\n",
|
|
|
|
- temp_vb->b->vb2_buf.planes[0].bytesused);
|
|
|
|
|
|
+ mfc_debug(2, "Header size: %d\n", temp_vb->b->vb2_buf.planes[0].bytesused);
|
|
s5p_mfc_set_dec_stream_buffer_v6(ctx,
|
|
s5p_mfc_set_dec_stream_buffer_v6(ctx,
|
|
vb2_dma_contig_plane_dma_addr(&temp_vb->b->vb2_buf, 0), 0,
|
|
vb2_dma_contig_plane_dma_addr(&temp_vb->b->vb2_buf, 0), 0,
|
|
- temp_vb->b->vb2_buf.planes[0].bytesused);
|
|
|
|
|
|
+ temp_vb->b->vb2_buf.planes[0].bytesused);
|
|
spin_unlock_irqrestore(&dev->irqlock, flags);
|
|
spin_unlock_irqrestore(&dev->irqlock, flags);
|
|
dev->curr_ctx = ctx->num;
|
|
dev->curr_ctx = ctx->num;
|
|
s5p_mfc_init_decode_v6(ctx);
|
|
s5p_mfc_init_decode_v6(ctx);
|