media: marvell-ccic: fix DMA s/g desc number calculation [Linux 4.4.187]

This Linux kernel change "media: marvell-ccic: fix DMA s/g desc number calculation" is included in the Linux 4.4.187 release. This change is authored by Lubomir Rintel <lkundrak [at]> on Sun May 5 10:00:23 2019 -0400. The commit for this change in Linux stable tree is 102981b (patch) which is from upstream commit 0c7aa32. The same Linux upstream change may have been applied to various maintained Linux releases and you can find all Linux releases containing changes from upstream 0c7aa32.

media: marvell-ccic: fix DMA s/g desc number calculation

[ Upstream commit 0c7aa32966dab0b8a7424e1b34c7f206817953ec ]

The commit d790b7eda953 ("[media] vb2-dma-sg: move dma_(un)map_sg here")
left dma_desc_nent unset. It previously contained the number of DMA
descriptors as returned from dma_map_sg().

We can now (since the commit referred to above) obtain the same value from
the sg_table and drop dma_desc_nent altogether.

Tested on OLPC XO-1.75 machine. Doesn't affect the OLPC XO-1's Cafe
driver, since that one doesn't do DMA.

[ fix a checkpatch warning]

Fixes: d790b7eda953 ("[media] vb2-dma-sg: move dma_(un)map_sg here")
Signed-off-by: Lubomir Rintel <>
Signed-off-by: Sakari Ailus <>
Signed-off-by: Mauro Carvalho Chehab <>
Signed-off-by: Sasha Levin <>

There are 5 lines of Linux source code added/deleted in this change. Code changes to Linux kernel are as follows.

 drivers/media/platform/marvell-ccic/mcam-core.c | 5 +++--
 1 file changed, 3 insertions(+), 2 deletions(-)

diff --git a/drivers/media/platform/marvell-ccic/mcam-core.c b/drivers/media/platform/marvell-ccic/mcam-core.c
index aa2b440..22fe771 100644
--- a/drivers/media/platform/marvell-ccic/mcam-core.c
+++ b/drivers/media/platform/marvell-ccic/mcam-core.c
@@ -209,7 +209,6 @@ struct mcam_vb_buffer {
    struct list_head queue;
    struct mcam_dma_desc *dma_desc; /* Descriptor virtual address */
    dma_addr_t dma_desc_pa;     /* Descriptor physical address */
-   int dma_desc_nent;      /* Number of mapped descriptors */

 static inline struct mcam_vb_buffer *vb_to_mvb(struct vb2_v4l2_buffer *vb)
@@ -616,9 +615,11 @@ static void mcam_dma_contig_done(struct mcam_camera *cam, int frame)
 static void mcam_sg_next_buffer(struct mcam_camera *cam)
    struct mcam_vb_buffer *buf;
+   struct sg_table *sg_table;

    buf = list_first_entry(&cam->buffers, struct mcam_vb_buffer, queue);
+   sg_table = vb2_dma_sg_plane_desc(&buf->vb_buf.vb2_buf, 0);
     * Very Bad Not Good Things happen if you don't clear
     * C1_DESC_ENA before making any descriptor changes.
@@ -626,7 +627,7 @@ static void mcam_sg_next_buffer(struct mcam_camera *cam)
    mcam_reg_clear_bit(cam, REG_CTRL1, C1_DESC_ENA);
    mcam_reg_write(cam, REG_DMA_DESC_Y, buf->dma_desc_pa);
    mcam_reg_write(cam, REG_DESC_LEN_Y,
-           buf->dma_desc_nent*sizeof(struct mcam_dma_desc));
+           sg_table->nents * sizeof(struct mcam_dma_desc));
    mcam_reg_write(cam, REG_DESC_LEN_U, 0);
    mcam_reg_write(cam, REG_DESC_LEN_V, 0);
    mcam_reg_set_bit(cam, REG_CTRL1, C1_DESC_ENA);

Leave a Reply

Your email address will not be published. Required fields are marked *