These changes are the raw update to linux-4.4.6-rt14. Kernel sources
[kvmfornfv.git] / kernel / drivers / media / platform / s5p-mfc / s5p_mfc_opr_v6.c
index cefad18..b958453 100644 (file)
@@ -239,7 +239,8 @@ static int s5p_mfc_alloc_codec_buffers_v6(struct s5p_mfc_ctx *ctx)
 
        /* Allocate only if memory from bank 1 is necessary */
        if (ctx->bank1.size > 0) {
-               ret = s5p_mfc_alloc_priv_buf(dev->mem_dev_l, &ctx->bank1);
+               ret = s5p_mfc_alloc_priv_buf(dev->mem_dev_l, dev->bank1,
+                                            &ctx->bank1);
                if (ret) {
                        mfc_err("Failed to allocate Bank1 memory\n");
                        return ret;
@@ -291,7 +292,7 @@ static int s5p_mfc_alloc_instance_buffer_v6(struct s5p_mfc_ctx *ctx)
                break;
        }
 
-       ret = s5p_mfc_alloc_priv_buf(dev->mem_dev_l, &ctx->ctx);
+       ret = s5p_mfc_alloc_priv_buf(dev->mem_dev_l, dev->bank1, &ctx->ctx);
        if (ret) {
                mfc_err("Failed to allocate instance buffer\n");
                return ret;
@@ -320,7 +321,8 @@ static int s5p_mfc_alloc_dev_context_buffer_v6(struct s5p_mfc_dev *dev)
        mfc_debug_enter();
 
        dev->ctx_buf.size = buf_size->dev_ctx;
-       ret = s5p_mfc_alloc_priv_buf(dev->mem_dev_l, &dev->ctx_buf);
+       ret = s5p_mfc_alloc_priv_buf(dev->mem_dev_l, dev->bank1,
+                                    &dev->ctx_buf);
        if (ret) {
                mfc_err("Failed to allocate device context buffer\n");
                return ret;
@@ -520,7 +522,7 @@ static int s5p_mfc_set_enc_stream_buffer_v6(struct s5p_mfc_ctx *ctx,
        writel(addr, mfc_regs->e_stream_buffer_addr); /* 16B align */
        writel(size, mfc_regs->e_stream_buffer_size);
 
-       mfc_debug(2, "stream buf addr: 0x%08lx, size: 0x%d\n",
+       mfc_debug(2, "stream buf addr: 0x%08lx, size: 0x%x\n",
                  addr, size);
 
        return 0;
@@ -552,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_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);
 }
 
@@ -1481,6 +1483,7 @@ static int s5p_mfc_encode_one_frame_v6(struct s5p_mfc_ctx *ctx)
 {
        struct s5p_mfc_dev *dev = ctx->dev;
        const struct s5p_mfc_regs *mfc_regs = dev->mfc_regs;
+       int cmd;
 
        mfc_debug(2, "++\n");
 
@@ -1491,9 +1494,13 @@ static int s5p_mfc_encode_one_frame_v6(struct s5p_mfc_ctx *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);
-       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");
 
@@ -1560,13 +1567,13 @@ static inline int s5p_mfc_run_dec_frame(struct s5p_mfc_ctx *ctx)
        temp_vb = list_entry(ctx->src_queue.next, struct s5p_mfc_buf, list);
        temp_vb->flags |= MFC_BUF_FLAG_USED;
        s5p_mfc_set_dec_stream_buffer_v6(ctx,
-               vb2_dma_contig_plane_dma_addr(temp_vb->b, 0),
+               vb2_dma_contig_plane_dma_addr(&temp_vb->b->vb2_buf, 0),
                        ctx->consumed_stream,
-                       temp_vb->b->v4l2_planes[0].bytesused);
+                       temp_vb->b->vb2_buf.planes[0].bytesused);
        spin_unlock_irqrestore(&dev->irqlock, flags);
 
        dev->curr_ctx = ctx->num;
-       if (temp_vb->b->v4l2_planes[0].bytesused == 0) {
+       if (temp_vb->b->vb2_buf.planes[0].bytesused == 0) {
                last_frame = 1;
                mfc_debug(2, "Setting ctx->state to FINISHING\n");
                ctx->state = MFCINST_FINISHING;
@@ -1590,7 +1597,7 @@ static inline int s5p_mfc_run_enc_frame(struct s5p_mfc_ctx *ctx)
 
        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");
                spin_unlock_irqrestore(&dev->irqlock, flags);
                return -EAGAIN;
@@ -1602,20 +1609,33 @@ static inline int s5p_mfc_run_enc_frame(struct s5p_mfc_ctx *ctx)
                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, 0);
-       src_c_addr = vb2_dma_contig_plane_dma_addr(src_mb->b, 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->flags |= MFC_BUF_FLAG_USED;
-       dst_addr = vb2_dma_contig_plane_dma_addr(dst_mb->b, 0);
-       dst_size = vb2_plane_size(dst_mb->b, 0);
+       dst_addr = vb2_dma_contig_plane_dma_addr(&dst_mb->b->vb2_buf, 0);
+       dst_size = vb2_plane_size(&dst_mb->b->vb2_buf, 0);
 
        s5p_mfc_set_enc_stream_buffer_v6(ctx, dst_addr, dst_size);
 
@@ -1637,10 +1657,10 @@ static inline void s5p_mfc_run_init_dec(struct s5p_mfc_ctx *ctx)
        spin_lock_irqsave(&dev->irqlock, flags);
        mfc_debug(2, "Preparing to init decoding.\n");
        temp_vb = list_entry(ctx->src_queue.next, struct s5p_mfc_buf, list);
-       mfc_debug(2, "Header size: %d\n", temp_vb->b->v4l2_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,
-               vb2_dma_contig_plane_dma_addr(temp_vb->b, 0), 0,
-                       temp_vb->b->v4l2_planes[0].bytesused);
+               vb2_dma_contig_plane_dma_addr(&temp_vb->b->vb2_buf, 0), 0,
+                       temp_vb->b->vb2_buf.planes[0].bytesused);
        spin_unlock_irqrestore(&dev->irqlock, flags);
        dev->curr_ctx = ctx->num;
        s5p_mfc_init_decode_v6(ctx);
@@ -1657,8 +1677,8 @@ static inline void s5p_mfc_run_init_enc(struct s5p_mfc_ctx *ctx)
        spin_lock_irqsave(&dev->irqlock, flags);
 
        dst_mb = list_entry(ctx->dst_queue.next, struct s5p_mfc_buf, list);
-       dst_addr = vb2_dma_contig_plane_dma_addr(dst_mb->b, 0);
-       dst_size = vb2_plane_size(dst_mb->b, 0);
+       dst_addr = vb2_dma_contig_plane_dma_addr(&dst_mb->b->vb2_buf, 0);
+       dst_size = vb2_plane_size(&dst_mb->b->vb2_buf, 0);
        s5p_mfc_set_enc_stream_buffer_v6(ctx, dst_addr, dst_size);
        spin_unlock_irqrestore(&dev->irqlock, flags);
        dev->curr_ctx = ctx->num;
@@ -1734,7 +1754,7 @@ static void s5p_mfc_try_run_v6(struct s5p_mfc_dev *dev)
 
        mfc_debug(1, "New context: %d\n", new_ctx);
        ctx = dev->ctx[new_ctx];
-       mfc_debug(1, "Seting new context to %p\n", ctx);
+       mfc_debug(1, "Setting new context to %p\n", ctx);
        /* Got context to run in ctx */
        mfc_debug(1, "ctx->dst_queue_cnt=%d ctx->dpb_count=%d ctx->src_queue_cnt=%d\n",
                ctx->dst_queue_cnt, ctx->pb_count, ctx->src_queue_cnt);
@@ -1834,9 +1854,9 @@ static void s5p_mfc_cleanup_queue_v6(struct list_head *lh, struct vb2_queue *vq)
 
        while (!list_empty(lh)) {
                b = list_entry(lh->next, struct s5p_mfc_buf, list);
-               for (i = 0; i < b->b->num_planes; i++)
-                       vb2_set_plane_payload(b->b, i, 0);
-               vb2_buffer_done(b->b, VB2_BUF_STATE_ERROR);
+               for (i = 0; i < b->b->vb2_buf.num_planes; i++)
+                       vb2_set_plane_payload(&b->b->vb2_buf, i, 0);
+               vb2_buffer_done(&b->b->vb2_buf, VB2_BUF_STATE_ERROR);
                list_del(&b->list);
        }
 }
@@ -1852,7 +1872,7 @@ static void s5p_mfc_write_info_v6(struct s5p_mfc_ctx *ctx, unsigned int data,
                unsigned int ofs)
 {
        s5p_mfc_clock_on();
-       writel(data, (void *)((unsigned long)ofs));
+       writel(data, (void __iomem *)((unsigned long)ofs));
        s5p_mfc_clock_off();
 }
 
@@ -1862,7 +1882,7 @@ s5p_mfc_read_info_v6(struct s5p_mfc_ctx *ctx, unsigned long ofs)
        int ret;
 
        s5p_mfc_clock_on();
-       ret = readl((void *)ofs);
+       ret = readl((void __iomem *)ofs);
        s5p_mfc_clock_off();
 
        return ret;