Re: [PATCH 2/2] videobuf2-dma-sg: Replace vb2_dma_sg_desc with sg_table
Hello, On 7/19/2013 7:02 PM, Ricardo Ribalda Delgado wrote: Replace the private struct vb2_dma_sg_desc with the struct sg_table so we can benefit from all the helping functions in lib/scatterlist.c for things like allocating the sg or compacting the descriptor marvel-ccic and solo6x10 drivers, that uses this api has been updated Signed-off-by: Ricardo Ribalda Delgado ricardo.riba...@gmail.com Acked-by: Marek Szyprowski m.szyprow...@samsung.com --- drivers/media/platform/marvell-ccic/mcam-core.c| 14 +-- drivers/media/v4l2-core/videobuf2-dma-sg.c | 103 drivers/staging/media/solo6x10/solo6x10-v4l2-enc.c | 20 ++-- include/media/videobuf2-dma-sg.h | 10 +- 4 files changed, 63 insertions(+), 84 deletions(-) diff --git a/drivers/media/platform/marvell-ccic/mcam-core.c b/drivers/media/platform/marvell-ccic/mcam-core.c index 64ab91e..0ac51bd 100644 --- a/drivers/media/platform/marvell-ccic/mcam-core.c +++ b/drivers/media/platform/marvell-ccic/mcam-core.c @@ -1040,16 +1040,16 @@ static int mcam_vb_sg_buf_prepare(struct vb2_buffer *vb) { struct mcam_vb_buffer *mvb = vb_to_mvb(vb); struct mcam_camera *cam = vb2_get_drv_priv(vb-vb2_queue); - struct vb2_dma_sg_desc *sgd = vb2_dma_sg_plane_desc(vb, 0); + struct sg_table *sg_table = vb2_dma_sg_plane_desc(vb, 0); struct mcam_dma_desc *desc = mvb-dma_desc; struct scatterlist *sg; int i; - mvb-dma_desc_nent = dma_map_sg(cam-dev, sgd-sglist, sgd-num_pages, - DMA_FROM_DEVICE); + mvb-dma_desc_nent = dma_map_sg(cam-dev, sg_table-sgl, + sg_table-nents, DMA_FROM_DEVICE); if (mvb-dma_desc_nent = 0) return -EIO; /* Not sure what's right here */ - for_each_sg(sgd-sglist, sg, mvb-dma_desc_nent, i) { + for_each_sg(sg_table-sgl, sg, mvb-dma_desc_nent, i) { desc-dma_addr = sg_dma_address(sg); desc-segment_len = sg_dma_len(sg); desc++; @@ -1060,9 +1060,11 @@ static int mcam_vb_sg_buf_prepare(struct vb2_buffer *vb) static int mcam_vb_sg_buf_finish(struct vb2_buffer *vb) { struct mcam_camera *cam = vb2_get_drv_priv(vb-vb2_queue); - struct vb2_dma_sg_desc *sgd = vb2_dma_sg_plane_desc(vb, 0); + struct sg_table *sg_table = vb2_dma_sg_plane_desc(vb, 0); - dma_unmap_sg(cam-dev, sgd-sglist, sgd-num_pages, DMA_FROM_DEVICE); + if (sg_table) + dma_unmap_sg(cam-dev, sg_table-sgl, + sg_table-nents, DMA_FROM_DEVICE); return 0; } diff --git a/drivers/media/v4l2-core/videobuf2-dma-sg.c b/drivers/media/v4l2-core/videobuf2-dma-sg.c index c053605..4b30ad5 100644 --- a/drivers/media/v4l2-core/videobuf2-dma-sg.c +++ b/drivers/media/v4l2-core/videobuf2-dma-sg.c @@ -35,7 +35,9 @@ struct vb2_dma_sg_buf { struct page **pages; int write; int offset; - struct vb2_dma_sg_desc sg_desc; + struct sg_table sg_table; + size_t size; + unsigned intnum_pages; atomic_trefcount; struct vb2_vmarea_handler handler; }; @@ -46,7 +48,7 @@ static int vb2_dma_sg_alloc_compacted(struct vb2_dma_sg_buf *buf, gfp_t gfp_flags) { unsigned int last_page = 0; - int size = buf-sg_desc.size; + int size = buf-size; while (size 0) { struct page *pages; @@ -74,12 +76,8 @@ static int vb2_dma_sg_alloc_compacted(struct vb2_dma_sg_buf *buf, } split_page(pages, order); - for (i = 0; i (1order); i++) { - buf-pages[last_page] = pages[i]; - sg_set_page(buf-sg_desc.sglist[last_page], - buf-pages[last_page], PAGE_SIZE, 0); - last_page++; - } + for (i = 0; i (1order); i++) + buf-pages[last_page++] = pages[i]; size -= PAGE_SIZE order; } @@ -91,6 +89,7 @@ static void *vb2_dma_sg_alloc(void *alloc_ctx, unsigned long size, gfp_t gfp_fla { struct vb2_dma_sg_buf *buf; int ret; + int num_pages; buf = kzalloc(sizeof *buf, GFP_KERNEL); if (!buf) @@ -99,17 +98,11 @@ static void *vb2_dma_sg_alloc(void *alloc_ctx, unsigned long size, gfp_t gfp_fla buf-vaddr = NULL; buf-write = 0; buf-offset = 0; - buf-sg_desc.size = size; + buf-size = size; /* size is already page aligned */ - buf-sg_desc.num_pages = size PAGE_SHIFT; - - buf-sg_desc.sglist = vzalloc(buf-sg_desc.num_pages * - sizeof(*buf-sg_desc.sglist)); - if (!buf-sg_desc.sglist) - goto
[PATCH 2/2] videobuf2-dma-sg: Replace vb2_dma_sg_desc with sg_table
Replace the private struct vb2_dma_sg_desc with the struct sg_table so we can benefit from all the helping functions in lib/scatterlist.c for things like allocating the sg or compacting the descriptor marvel-ccic and solo6x10 drivers, that uses this api has been updated Signed-off-by: Ricardo Ribalda Delgado ricardo.riba...@gmail.com --- drivers/media/platform/marvell-ccic/mcam-core.c| 14 +-- drivers/media/v4l2-core/videobuf2-dma-sg.c | 103 drivers/staging/media/solo6x10/solo6x10-v4l2-enc.c | 20 ++-- include/media/videobuf2-dma-sg.h | 10 +- 4 files changed, 63 insertions(+), 84 deletions(-) diff --git a/drivers/media/platform/marvell-ccic/mcam-core.c b/drivers/media/platform/marvell-ccic/mcam-core.c index 64ab91e..0ac51bd 100644 --- a/drivers/media/platform/marvell-ccic/mcam-core.c +++ b/drivers/media/platform/marvell-ccic/mcam-core.c @@ -1040,16 +1040,16 @@ static int mcam_vb_sg_buf_prepare(struct vb2_buffer *vb) { struct mcam_vb_buffer *mvb = vb_to_mvb(vb); struct mcam_camera *cam = vb2_get_drv_priv(vb-vb2_queue); - struct vb2_dma_sg_desc *sgd = vb2_dma_sg_plane_desc(vb, 0); + struct sg_table *sg_table = vb2_dma_sg_plane_desc(vb, 0); struct mcam_dma_desc *desc = mvb-dma_desc; struct scatterlist *sg; int i; - mvb-dma_desc_nent = dma_map_sg(cam-dev, sgd-sglist, sgd-num_pages, - DMA_FROM_DEVICE); + mvb-dma_desc_nent = dma_map_sg(cam-dev, sg_table-sgl, + sg_table-nents, DMA_FROM_DEVICE); if (mvb-dma_desc_nent = 0) return -EIO; /* Not sure what's right here */ - for_each_sg(sgd-sglist, sg, mvb-dma_desc_nent, i) { + for_each_sg(sg_table-sgl, sg, mvb-dma_desc_nent, i) { desc-dma_addr = sg_dma_address(sg); desc-segment_len = sg_dma_len(sg); desc++; @@ -1060,9 +1060,11 @@ static int mcam_vb_sg_buf_prepare(struct vb2_buffer *vb) static int mcam_vb_sg_buf_finish(struct vb2_buffer *vb) { struct mcam_camera *cam = vb2_get_drv_priv(vb-vb2_queue); - struct vb2_dma_sg_desc *sgd = vb2_dma_sg_plane_desc(vb, 0); + struct sg_table *sg_table = vb2_dma_sg_plane_desc(vb, 0); - dma_unmap_sg(cam-dev, sgd-sglist, sgd-num_pages, DMA_FROM_DEVICE); + if (sg_table) + dma_unmap_sg(cam-dev, sg_table-sgl, + sg_table-nents, DMA_FROM_DEVICE); return 0; } diff --git a/drivers/media/v4l2-core/videobuf2-dma-sg.c b/drivers/media/v4l2-core/videobuf2-dma-sg.c index c053605..4b30ad5 100644 --- a/drivers/media/v4l2-core/videobuf2-dma-sg.c +++ b/drivers/media/v4l2-core/videobuf2-dma-sg.c @@ -35,7 +35,9 @@ struct vb2_dma_sg_buf { struct page **pages; int write; int offset; - struct vb2_dma_sg_desc sg_desc; + struct sg_table sg_table; + size_t size; + unsigned intnum_pages; atomic_trefcount; struct vb2_vmarea_handler handler; }; @@ -46,7 +48,7 @@ static int vb2_dma_sg_alloc_compacted(struct vb2_dma_sg_buf *buf, gfp_t gfp_flags) { unsigned int last_page = 0; - int size = buf-sg_desc.size; + int size = buf-size; while (size 0) { struct page *pages; @@ -74,12 +76,8 @@ static int vb2_dma_sg_alloc_compacted(struct vb2_dma_sg_buf *buf, } split_page(pages, order); - for (i = 0; i (1order); i++) { - buf-pages[last_page] = pages[i]; - sg_set_page(buf-sg_desc.sglist[last_page], - buf-pages[last_page], PAGE_SIZE, 0); - last_page++; - } + for (i = 0; i (1order); i++) + buf-pages[last_page++] = pages[i]; size -= PAGE_SIZE order; } @@ -91,6 +89,7 @@ static void *vb2_dma_sg_alloc(void *alloc_ctx, unsigned long size, gfp_t gfp_fla { struct vb2_dma_sg_buf *buf; int ret; + int num_pages; buf = kzalloc(sizeof *buf, GFP_KERNEL); if (!buf) @@ -99,17 +98,11 @@ static void *vb2_dma_sg_alloc(void *alloc_ctx, unsigned long size, gfp_t gfp_fla buf-vaddr = NULL; buf-write = 0; buf-offset = 0; - buf-sg_desc.size = size; + buf-size = size; /* size is already page aligned */ - buf-sg_desc.num_pages = size PAGE_SHIFT; - - buf-sg_desc.sglist = vzalloc(buf-sg_desc.num_pages * - sizeof(*buf-sg_desc.sglist)); - if (!buf-sg_desc.sglist) - goto fail_sglist_alloc; - sg_init_table(buf-sg_desc.sglist, buf-sg_desc.num_pages); + buf-num_pages = size