From 67bc8600cb3f518fbf6fb2109446dca2bdcef0a6 Mon Sep 17 00:00:00 2001 From: sky zhou Date: Fri, 5 Jul 2019 16:37:36 +0800 Subject: [PATCH] vdin: remove hardcode manual buffer cnt. [1/3] 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 --- .../amlogic/media/vin/tvin/vdin/vdin_canvas.c | 7 +++++-- .../amlogic/media/vin/tvin/vdin/vdin_drv.c | 20 ++++++++++++++----- 2 files changed, 20 insertions(+), 7 deletions(-) diff --git a/drivers/amlogic/media/vin/tvin/vdin/vdin_canvas.c b/drivers/amlogic/media/vin/tvin/vdin/vdin_canvas.c index a25e12e8b634..5c42353adbcb 100644 --- a/drivers/amlogic/media/vin/tvin/vdin/vdin_canvas.c +++ b/drivers/amlogic/media/vin/tvin/vdin/vdin_canvas.c @@ -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 = diff --git a/drivers/amlogic/media/vin/tvin/vdin/vdin_drv.c b/drivers/amlogic/media/vin/tvin/vdin/vdin_drv.c index c2a5659df50c..ac9d704b7211 100644 --- a/drivers/amlogic/media/vin/tvin/vdin/vdin_drv.c +++ b/drivers/amlogic/media/vin/tvin/vdin/vdin_drv.c @@ -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;