Skip to content

Commit

Permalink
vdin: add new interface for passing dma-buf to vdin [1/1]
Browse files Browse the repository at this point in the history
PD#TV-3863

Problem:
gpu cann't get vdin buf directly

Solution:
vdin write data to the addr passed by upper layer

Verify:
verified by t962x2_x301

Change-Id: I495b78c419e10a6dacb9b9f29c0f8e87339ac195
Signed-off-by: zhiwei.yuan <zhiwei.yuan@amlogic.com>
  • Loading branch information
zhiwei.yuan authored and kongsuozt committed May 14, 2019
1 parent 0504a9a commit 768c100
Show file tree
Hide file tree
Showing 16 changed files with 350 additions and 68 deletions.
6 changes: 4 additions & 2 deletions arch/arm/boot/dts/amlogic/tl1_pxp.dts
Original file line number Diff line number Diff line change
Expand Up @@ -99,8 +99,10 @@
vdin1_cma_reserved:linux,vdin1_cma {
compatible = "shared-dma-pool";
reusable;
/* 1920x1080x2x4 =16 M */
size = <0x1400000>;
/*keystone need 4 buffers,each has 1920*1080*3
*for keystone, change to 0x1800000(24M)
*/
size = <0x1400000>;/*20M*/
alignment = <0x400000>;
};

Expand Down
6 changes: 4 additions & 2 deletions arch/arm/boot/dts/amlogic/tl1_t962x2_skt.dts
Original file line number Diff line number Diff line change
Expand Up @@ -114,8 +114,10 @@
vdin1_cma_reserved:linux,vdin1_cma {
compatible = "shared-dma-pool";
reusable;
/* 1920x1080x2x4 =16 M */
size = <0x1400000>;
/*keystone need 4 buffers,each has 1920*1080*3
*for keystone, change to 0x1800000(24M)
*/
size = <0x1400000>;/*20M*/
alignment = <0x400000>;
};

Expand Down
6 changes: 4 additions & 2 deletions arch/arm/boot/dts/amlogic/tl1_t962x2_t309.dts
Original file line number Diff line number Diff line change
Expand Up @@ -122,8 +122,10 @@
vdin1_cma_reserved:linux,vdin1_cma {
compatible = "shared-dma-pool";
reusable;
/* 1920x1080x2x4 =16 M */
size = <0x1400000>;
/*keystone need 4 buffers,each has 1920*1080*3
*for keystone, change to 0x1800000(24M)
*/
size = <0x1400000>;/*20M*/
alignment = <0x400000>;
};

Expand Down
6 changes: 4 additions & 2 deletions arch/arm/boot/dts/amlogic/tl1_t962x2_x301_1g.dts
Original file line number Diff line number Diff line change
Expand Up @@ -125,8 +125,10 @@
vdin1_cma_reserved:linux,vdin1_cma {
compatible = "shared-dma-pool";
reusable;
/* 1920x1080x2x4 =16 M */
size = <0x1400000>;
/*keystone need 4 buffers,each has 1920*1080*3
*for keystone, change to 0x1800000(24M)
*/
size = <0x1400000>;/*20M*/
alignment = <0x400000>;
alloc-ranges = <0x30000000 0x10000000>;
};
Expand Down
6 changes: 4 additions & 2 deletions arch/arm/boot/dts/amlogic/tl1_t962x2_x301_2g.dts
Original file line number Diff line number Diff line change
Expand Up @@ -124,8 +124,10 @@
vdin1_cma_reserved:linux,vdin1_cma {
compatible = "shared-dma-pool";
reusable;
/* 1920x1080x2x4 =16 M */
size = <0x1400000>;
/*keystone need 4 buffers,each has 1920*1080*3
*for keystone, change to 0x1800000(24M)
*/
size = <0x1400000>;/*20M*/
alignment = <0x400000>;
};

Expand Down
6 changes: 4 additions & 2 deletions arch/arm64/boot/dts/amlogic/tl1_t962x2_t309.dts
Original file line number Diff line number Diff line change
Expand Up @@ -121,8 +121,10 @@
vdin1_cma_reserved:linux,vdin1_cma {
compatible = "shared-dma-pool";
reusable;
/* 1920x1080x2x4 =16 M */
size = <0x0 0x1400000>;
/*keystone need 4 buffers,each has 1920*1080*3
*for keystone, change to 0x1800000(24M)
*/
size = <0x0 0x1400000>;/*20M*/
alignment = <0x0 0x400000>;
};

Expand Down
6 changes: 4 additions & 2 deletions arch/arm64/boot/dts/amlogic/tl1_t962x2_x301_1g.dts
Original file line number Diff line number Diff line change
Expand Up @@ -123,8 +123,10 @@
vdin1_cma_reserved:linux,vdin1_cma {
compatible = "shared-dma-pool";
reusable;
/* 1920x1080x2x4 =16 M */
size = <0x0 0x1400000>;
/*keystone need 4 buffers,each has 1920*1080*3
*for keystone, change to 0x1800000(24M)
*/
size = <0x0 0x1400000>;/*20M*/
alignment = <0x0 0x400000>;
alloc-ranges = <0x0 0x30000000 0x0 0x10000000>;
};
Expand Down
6 changes: 4 additions & 2 deletions arch/arm64/boot/dts/amlogic/tl1_t962x2_x301_2g.dts
Original file line number Diff line number Diff line change
Expand Up @@ -121,8 +121,10 @@
vdin1_cma_reserved:linux,vdin1_cma {
compatible = "shared-dma-pool";
reusable;
/* 1920x1080x2x4 =16 M */
size = <0x0 0x1400000>;
/*keystone need 4 buffers,each has 1920*1080*3
*for keystone, change to 0x1800000(24M)
*/
size = <0x0 0x1400000>;/*20M*/
alignment = <0x0 0x400000>;
};

Expand Down
33 changes: 33 additions & 0 deletions drivers/amlogic/media/vin/tvin/vdin/vdin_canvas.c
Original file line number Diff line number Diff line change
Expand Up @@ -332,6 +332,23 @@ void vdin_canvas_auto_config(struct vdin_dev_s *devp)
pr_err("\nvdin%d canvas_max_num %d less than vfmem_max_cnt %d\n",
devp->index, devp->canvas_max_num, devp->vfmem_max_cnt);
}

if (devp->set_canvas_manual == 1) {
for (i = 0; i < 4; i++) {
canvas_id =
vdin_canvas_ids[devp->index][i * canvas_step];
canvas_addr = vdin_set_canvas_addr[i].paddr;
canvas_config(canvas_id, canvas_addr,
devp->canvas_w, devp->canvas_h,
CANVAS_ADDR_NOWRAP, CANVAS_BLKMODE_LINEAR);
pr_info("canvas index=%d- %3d: 0x%lx-0x%lx %ux%u\n",
i, canvas_id, canvas_addr,
canvas_addr + devp->canvas_max_size,
devp->canvas_w, devp->canvas_h);
}
return;
}

if ((devp->cma_config_en != 1) || !(devp->cma_config_flag & 0x100)) {
/*use_reserved_mem or alloc_from_contiguous*/
devp->mem_start = roundup(devp->mem_start, devp->canvas_align);
Expand Down Expand Up @@ -503,9 +520,25 @@ unsigned int vdin_cma_alloc(struct vdin_dev_s *devp)
devp->vfmem_size = PAGE_ALIGN(mem_size) + dolby_size_byte;
devp->vfmem_size = (devp->vfmem_size/PAGE_SIZE + 1)*PAGE_SIZE;

if (devp->set_canvas_manual == 1) {
for (i = 0; i < VDIN_CANVAS_MAX_CNT; i++) {
if (vdin_set_canvas_addr[i].dmabuff == NULL)
break;

vdin_set_canvas_addr[i].paddr =
roundup(vdin_set_canvas_addr[i].paddr,
devp->canvas_align);
}

devp->canvas_max_num = max_buffer_num = i;
devp->vfmem_max_cnt = max_buffer_num;
}


mem_size = PAGE_ALIGN(mem_size) * max_buffer_num +
dolby_size_byte * max_buffer_num;
mem_size = (mem_size/PAGE_SIZE + 1)*PAGE_SIZE;

if (mem_size > devp->cma_mem_size) {
mem_size = devp->cma_mem_size;
pr_err("\nvdin%d cma_mem_size is not enough!!!\n", devp->index);
Expand Down
35 changes: 31 additions & 4 deletions drivers/amlogic/media/vin/tvin/vdin/vdin_ctl.c
Original file line number Diff line number Diff line change
Expand Up @@ -750,7 +750,7 @@ static void vdin_set_meas_mux(unsigned int offset, enum tvin_port_e port_,
b.BT_PATH_GPIO_B:gxtvbb & gxbb
c.txl and txlx don't support bt656
*/
void vdin_set_top(unsigned int offset,
void vdin_set_top(struct vdin_dev_s *devp, unsigned int offset,
enum tvin_port_e port,
enum tvin_color_fmt_e input_cfmt, unsigned int h,
enum bt_path_e bt_path)
Expand Down Expand Up @@ -873,6 +873,7 @@ void vdin_set_top(unsigned int offset,
vdin_mux = VDIN_MUX_NULL;
break;
}

switch (input_cfmt) {
case TVIN_YVYU422:
vdin_data_bus_1 = VDIN_MAP_RCR;
Expand All @@ -888,6 +889,14 @@ void vdin_set_top(unsigned int offset,
vdin_data_bus_1 = VDIN_MAP_RCR;
vdin_data_bus_2 = VDIN_MAP_Y_G;
break;
case TVIN_RGB444:
/*RGB mapping*/
if (devp->set_canvas_manual == 1) {
vdin_data_bus_0 = VDIN_MAP_RCR;
vdin_data_bus_1 = VDIN_MAP_BPB;
vdin_data_bus_2 = VDIN_MAP_Y_G;
}
break;
default:
break;
}
Expand Down Expand Up @@ -1996,7 +2005,14 @@ static inline void vdin_set_wr_ctrl(struct vdin_dev_s *devp,
VDIN_WRCTRLREG_PAUSE_BIT, 1);
/* swap the 2 64bits word in 128 words */
/*if (is_meson_gxbb_cpu())*/
wr_bits(offset, VDIN_WR_CTRL, 1, 19, 1);
if (devp->set_canvas_manual == 1) {
/*not swap 2 64bits words in 128 words */
wr_bits(offset, VDIN_WR_CTRL, 0, 19, 1);
/*little endian*/
wr_bits(offset, VDIN_WR_H_START_END, 1, 30, 1);
} else
wr_bits(offset, VDIN_WR_CTRL, 1, 19, 1);

}
void vdin_set_wr_ctrl_vsync(struct vdin_dev_s *devp,
unsigned int offset, enum vdin_format_convert_e format_convert,
Expand Down Expand Up @@ -2577,15 +2593,14 @@ void vdin_set_all_regs(struct vdin_dev_s *devp)
devp->color_depth_mode, devp->source_bitdepth);

/* top sub-module */
vdin_set_top(devp->addr_offset, devp->parm.port,
vdin_set_top(devp, devp->addr_offset, devp->parm.port,
devp->prop.color_format, devp->h_active,
devp->bt_path);

/* */

vdin_set_meas_mux(devp->addr_offset, devp->parm.port,
devp->bt_path);

}

static void vdin_delay_line(unsigned short num, unsigned int offset)
Expand Down Expand Up @@ -2969,6 +2984,18 @@ unsigned int vdin_get_field_type(unsigned int offset)
{
return rd_bits(offset, VDIN_COM_STATUS0, 0, 1);
}

bool vdin_check_vdi6_afifo_overflow(unsigned int offset)
{
return rd_bits(offset, VDIN_COM_STATUS2, 15, 1);
}

void vdin_clear_vdi6_afifo_overflow_flg(unsigned int offset)
{
wr_bits(offset, VDIN_ASFIFO_CTRL3, 0x1, 1, 1);
wr_bits(offset, VDIN_ASFIFO_CTRL3, 0x0, 1, 1);
}

static unsigned int vdin_reset_flag;
inline int vdin_vsync_reset_mif(int index)
{
Expand Down
4 changes: 3 additions & 1 deletion drivers/amlogic/media/vin/tvin/vdin/vdin_ctl.h
Original file line number Diff line number Diff line change
Expand Up @@ -145,6 +145,8 @@ extern void vdin_hw_enable(unsigned int offset);
extern void vdin_hw_disable(unsigned int offset);
extern unsigned int vdin_get_field_type(unsigned int offset);
extern int vdin_vsync_reset_mif(int index);
extern bool vdin_check_vdi6_afifo_overflow(unsigned int offset);
extern void vdin_clear_vdi6_afifo_overflow_flg(unsigned int offset);
extern void vdin_set_cutwin(struct vdin_dev_s *devp);
extern void vdin_set_decimation(struct vdin_dev_s *devp);
extern void vdin_fix_nonstd_vsync(struct vdin_dev_s *devp);
Expand Down Expand Up @@ -187,7 +189,7 @@ extern void vdin_dolby_addr_alloc(struct vdin_dev_s *devp, unsigned int size);
extern void vdin_dolby_addr_release(struct vdin_dev_s *devp, unsigned int size);
extern int vdin_event_cb(int type, void *data, void *op_arg);
extern void vdin_hdmiin_patch(struct vdin_dev_s *devp);
extern void vdin_set_top(unsigned int offset,
extern void vdin_set_top(struct vdin_dev_s *devp, unsigned int offset,
enum tvin_port_e port,
enum tvin_color_fmt_e input_cfmt, unsigned int h,
enum bt_path_e bt_path);
Expand Down
21 changes: 10 additions & 11 deletions drivers/amlogic/media/vin/tvin/vdin/vdin_debug.c
Original file line number Diff line number Diff line change
Expand Up @@ -2101,15 +2101,9 @@ static ssize_t vdin_attr_store(struct device *dev,
pr_info("urgent_en (%d):%d\n", devp->index,
devp->urgent_en);
}
} else if (!strcmp(parm[0], "irq_flag")) {
if (!parm[1])
pr_err("miss parameters .\n");
else if (kstrtoul(parm[1], 10, &val) == 0) {
devp->vdin_irq_flag = val;
pr_info("vdin(%d) irq_flag: %d\n", devp->index,
devp->vdin_irq_flag);
}
} else if (!strcmp(parm[0], "skip_vf_num")) {
} else if (!strcmp(parm[0], "irq_cnt"))
pr_info("vdin(%d) irq_cnt: %d\n", devp->index, devp->irq_cnt);
else if (!strcmp(parm[0], "skip_vf_num")) {
if (!parm[1])
pr_err("miss parameters .\n");
else if ((kstrtoul(parm[1], 10, &val) == 0) && (devp->vfp)) {
Expand Down Expand Up @@ -2198,9 +2192,14 @@ static ssize_t vdin_attr_store(struct device *dev,
} else {
pr_info("vdin_afbce_mode: %d\n", devp->afbce_mode);
}
} else {
} else if (!strcmp(parm[0], "vdi6_afifo_overflow"))
pr_info("%d\n",
vdin_check_vdi6_afifo_overflow(devp->addr_offset));
else if (!strcmp(parm[0], "vdi6_afifo_clear"))
vdin_clear_vdi6_afifo_overflow_flg(devp->addr_offset);
else
pr_info("unknown command\n");
}

kfree(buf_orig);
return len;
}
Expand Down
Loading

0 comments on commit 768c100

Please sign in to comment.