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 <sky.zhou@amlogic.com>
This commit is contained in:
sky zhou
2019-07-05 16:37:36 +08:00
committed by Tao Zeng
parent e4d73cadd7
commit 67bc8600cb
2 changed files with 20 additions and 7 deletions

View 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 =

View 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;