]> Gitweb @ Texas Instruments - Open Source Git Repositories - git.TI.com/gitweb - android-sdk/kernel-video.git/commitdiff
v4l: ti-vps: vip: Set max width height as capture size
authorNikhil Devshatwar <nikhil.nd@ti.com>
Sat, 5 Apr 2014 06:31:23 +0000 (12:01 +0530)
committerSundar Raman <sunds@ti.com>
Wed, 9 Apr 2014 22:07:31 +0000 (17:07 -0500)
When an outbound descriptor is created, max width and height for
VPDMA are set to 1920x1080
When cameras give out data more than the size allocated, it may lead
to buffer corruption.

This patch uses different max width & height sets for different slices
and overrides the descriptor with width & height same as capture size.

Change-Id: I55b8c3098abb8841d4aba26e01a30ff612424f20
Signed-off-by: Nikhil Devshatwar <nikhil.nd@ti.com>
drivers/media/platform/ti-vps/vip.c
drivers/media/platform/ti-vps/vpdma.c
drivers/media/platform/ti-vps/vpdma.h

index 7e052ebd885e8b3918e888991481341d7fcd1a24..648baceb3cfab98c44a243e7d55ada2f51b927c7 100644 (file)
@@ -755,6 +755,7 @@ static int add_out_dtd(struct vip_stream *stream, int srce_type)
        struct vb2_buffer *vb = &stream->cur_buf->vb;
        struct v4l2_rect *c_rect = &port->c_rect;
        struct vip_fmt *fmt = port->fmt;
+       struct vpdma_dtd *dtd;
        int channel, plane = 0;
        dma_addr_t dma_addr;
        u32 flags;
@@ -794,8 +795,30 @@ static int add_out_dtd(struct vip_stream *stream, int srce_type)
                return -1;
        }
 
-       vpdma_vip_set_max_size(dev->shared->vpdma, 1);
-       vpdma_add_out_dtd(&dev->desc_list, c_rect, fmt->vpdma_fmt[plane], dma_addr, channel, flags);
+       vpdma_add_out_dtd(&dev->desc_list, c_rect->width,
+               fmt->vpdma_fmt[plane], dma_addr, channel, flags);
+
+       /*
+        * add_out_dtd sets the max WIDTH and HEIGHT to be 1920x1080
+        * Change this later so that max WIDTH and HEIGHT are taken from
+        * VPDMA_MAX_SIZE1 or VPDMA_MAX_SIZE2 register
+        * This allows to use different sets for different slices
+        */
+
+       dtd = dev->desc_list.buf.addr;
+       if (dev->slice_id == VIP_SLICE1) {
+               vpdma_set_max_size(dev->shared->vpdma, VPDMA_MAX_SIZE1,
+                       stream->width, stream->height);
+
+               dtd_set_max_width_height(dtd,
+                       MAX_OUT_WIDTH_REG1, MAX_OUT_HEIGHT_REG1);
+       } else {
+               vpdma_set_max_size(dev->shared->vpdma, VPDMA_MAX_SIZE2,
+                       stream->width, stream->height);
+
+               dtd_set_max_width_height(dtd,
+                       MAX_OUT_WIDTH_REG2, MAX_OUT_HEIGHT_REG2);
+       }
 
        return 0;
 }
index 2bd13645325aae1edc00ea366ef96f805e28ccc8..9c4f03f128f71b00fe20ae3c74483eca0f4bb719 100644 (file)
@@ -441,17 +441,24 @@ void vpdma_update_dma_addr(struct vpdma_data *vpdma,
 }
 EXPORT_SYMBOL(vpdma_update_dma_addr);
 
-void vpdma_vip_set_max_size(struct vpdma_data *vpdma, int vip_num)
+void vpdma_set_max_size(struct vpdma_data *vpdma, int reg_addr,
+               u32 width, u32 height)
 {
        u32 val = 0;
 
-       if (vip_num == 1) {
-               insert_field(&val, 1919, VPDMA_MAX_SIZE_WIDTH_MASK, VPDMA_MAX_SIZE_WIDTH_SHFT);
-               insert_field(&val, 1079, VPDMA_MAX_SIZE_HEIGHT_MASK, VPDMA_MAX_SIZE_HEIGHT_SHFT);
-               write_reg(vpdma, VPDMA_MAX_SIZE1, val);
-       }
+       insert_field(&val, width - 1 ,
+               VPDMA_MAX_SIZE_WIDTH_MASK, VPDMA_MAX_SIZE_WIDTH_SHFT);
+
+       insert_field(&val, height - 1 ,
+               VPDMA_MAX_SIZE_HEIGHT_MASK, VPDMA_MAX_SIZE_HEIGHT_SHFT);
+
+       if (reg_addr != VPDMA_MAX_SIZE1 || reg_addr != VPDMA_MAX_SIZE2
+               || reg_addr != VPDMA_MAX_SIZE3)
+                       reg_addr = VPDMA_MAX_SIZE1;
+
+       write_reg(vpdma, reg_addr, val);
 }
-EXPORT_SYMBOL(vpdma_vip_set_max_size);
+EXPORT_SYMBOL(vpdma_set_max_size);
 
 #ifdef VPDMA_DEBUG
 static void dump_cfd(struct vpdma_cfd *cfd)
index 6cf060950ff7b7d6cdadf3504b3f4a9bca862391..6c2a781a23fc934868639b4eb72d9062c3819c6a 100644 (file)
@@ -181,7 +181,8 @@ void vpdma_update_dma_addr(struct vpdma_data *vpdma,
                struct vpdma_desc_list *list, dma_addr_t dma_addr, int drop);
 
 void vpdma_enable_channel_3_irq(struct vpdma_data *vpdma, bool enable);
-void vpdma_vip_set_max_size(struct vpdma_data *vpdma, int vip_num);
+void vpdma_set_max_size(struct vpdma_data *vpdma, int reg_addr,
+               u32 width, u32 height);
 
 
 void vpdma_enable_list_complete_irq(struct vpdma_data *vpdma, int irq_num,