vdin: remove hardcode manual buffer cnt. [1/3]
authorsky zhou <sky.zhou@amlogic.com>
Fri, 5 Jul 2019 08:37:36 +0000 (16:37 +0800)
committerTao Zeng <tao.zeng@amlogic.com>
Wed, 17 Jul 2019 06:43:55 +0000 (23:43 -0700)
PD#TV-7344

Problem:
current vdin1 use hardcode buffer cnt 4, it
is not good for user space program.

Solution:
Check passed buffer fd arry, so we can read variable
fd num.

Verify:
verified on macroni

Change-Id: I9bc07e45a3716423dc037a5d966c9b6b5eafcdfe
Signed-off-by: sky zhou <sky.zhou@amlogic.com>
drivers/amlogic/media/vin/tvin/vdin/vdin_canvas.c
drivers/amlogic/media/vin/tvin/vdin/vdin_drv.c

index a25e12e..5c42353 100644 (file)
@@ -336,7 +336,10 @@ void vdin_canvas_auto_config(struct vdin_dev_s *devp)
        devp->vfmem_max_cnt = min(devp->vfmem_max_cnt, devp->canvas_max_num);
 
        if (devp->set_canvas_manual == 1) {
-               for (i = 0; i < 4; i++) {
+               for (i = 0; i < VDIN_CANVAS_MAX_CNT; i++) {
+                       if (vdin_set_canvas_addr[i].dmabuff == 0)
+                               break;
+
                        canvas_id =
                                vdin_canvas_ids[devp->index][i * canvas_step];
                        canvas_addr = vdin_set_canvas_addr[i].paddr;
@@ -524,7 +527,7 @@ unsigned int vdin_cma_alloc(struct vdin_dev_s *devp)
 
        if (devp->set_canvas_manual == 1) {
                for (i = 0; i < VDIN_CANVAS_MAX_CNT; i++) {
-                       if (vdin_set_canvas_addr[i].dmabuff == NULL)
+                       if (vdin_set_canvas_addr[i].dmabuff == 0)
                                break;
 
                        vdin_set_canvas_addr[i].paddr =
index c2a5659..ac9d704 100644 (file)
@@ -2872,9 +2872,9 @@ static long vdin_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
 
                /*release manual set dma-bufs*/
                if (devp->set_canvas_manual == 1) {
-                       for (i = 0; i < 4; i++) {
+                       for (i = 0; i < VDIN_CANVAS_MAX_CNT; i++) {
                                if (vdin_set_canvas_addr[i].dmabuff == 0)
-                                       continue;
+                                       break;
 
                                dma_buf_unmap_attachment(
                                        vdin_set_canvas_addr[i].dmabufattach,
@@ -2884,11 +2884,13 @@ static long vdin_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
                                        vdin_set_canvas_addr[i].dmabuff,
                                        vdin_set_canvas_addr[i].dmabufattach);
                                dma_buf_put(vdin_set_canvas_addr[i].dmabuff);
-                               devp->keystone_entry[i] = NULL;
                        }
                        memset(vdin_set_canvas_addr, 0,
                                sizeof(struct vdin_set_canvas_addr_s) *
                                VDIN_CANVAS_MAX_CNT);
+                       memset(devp->keystone_entry, 0,
+                               sizeof(struct vf_entry *) *
+                               VDIN_CANVAS_MAX_CNT);
                }
                break;
 
@@ -2899,12 +2901,20 @@ static long vdin_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
                }
 
                if (copy_from_user(vdinsetcanvas, argp,
-                       sizeof(struct vdin_set_canvas_s) * 4)) {
+                       sizeof(struct vdin_set_canvas_s) *
+                       VDIN_CANVAS_MAX_CNT)) {
                        pr_info("TVIN_IOC_S_CANVAS_ADDR copy fail\n");
                        return -EFAULT;
                }
 
-               for (i = 0; i < 4; i++) {
+               memset(vdin_set_canvas_addr, 0,
+                       sizeof(struct vdin_set_canvas_addr_s) *
+                       VDIN_CANVAS_MAX_CNT);
+               memset(devp->keystone_entry, 0,
+                       sizeof(struct vf_entry *) *
+                       VDIN_CANVAS_MAX_CNT);
+
+               for (i = 0; i < VDIN_CANVAS_MAX_CNT; i++) {
                        /*when fd means, the canvas list reaches end*/
                        if (vdinsetcanvas[i].fd < 0)
                                break;