Re: [PATCH 2/2] videobuf2-dma-sg: Replace vb2_dma_sg_desc with sg_table

2013-08-02 Thread Marek Szyprowski

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

2013-07-19 Thread Ricardo Ribalda Delgado
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