From 6bc70d79c0d4cd362d4ce2110539364cf53c0e22 Mon Sep 17 00:00:00 2001 From: "renjiang.han" Date: Tue, 3 Dec 2019 14:28:26 +0800 Subject: [PATCH] ppmgr: Vf canvas configuration finishing. [2/2] PD#SWPL-17670 Problem: The vf structure is too large, causing the function to exceed the stack size limit. Solution: Vf canvas configuration finishing. Verify: on U212 Change-Id: Id8b2c23001ae3c11d9c3824837cd1342c36dce25 Signed-off-by: renjiang.han --- .../media/video_processor/ppmgr/ppmgr_vpp.c | 143 +++++++++--------- 1 file changed, 75 insertions(+), 68 deletions(-) diff --git a/drivers/amlogic/media/video_processor/ppmgr/ppmgr_vpp.c b/drivers/amlogic/media/video_processor/ppmgr/ppmgr_vpp.c index 5acc63e0d533..f0d9caf36274 100644 --- a/drivers/amlogic/media/video_processor/ppmgr/ppmgr_vpp.c +++ b/drivers/amlogic/media/video_processor/ppmgr/ppmgr_vpp.c @@ -953,7 +953,7 @@ static int process_vf_tb_detect(struct vframe_s *vf, { struct canvas_s cs0, cs1, cs2, cd; int interlace_mode; - struct vframe_s src_vf; + u32 canvas_id; u32 format = GE2D_FORMAT_M24_YUV420; u32 h_scale_coef_type = context->config.h_scale_coef_type; @@ -1000,46 +1000,55 @@ static int process_vf_tb_detect(struct vframe_s *vf, ge2d_config->src1_gb_alpha = 0;/* 0xff; */ ge2d_config->dst_xy_swap = 0; - src_vf = *vf; - if (vf->canvas0Addr == (u32)-1) { canvas_config_config( tb_src_canvas[0] & 0xff, - &src_vf.canvas0_config[0]); - if (src_vf.plane_num == 2) { - canvas_config_config( - tb_src_canvas[1] & 0xff, - &src_vf.canvas0_config[1]); - } else if (src_vf.plane_num == 3) { - canvas_config_config( - tb_src_canvas[2] & 0xff, - &src_vf.canvas0_config[2]); + &vf->canvas0_config[0]); + ge2d_config->src_planes[0].addr = + vf->canvas0_config[0].phy_addr; + ge2d_config->src_planes[0].w = vf->canvas0_config[0].width; + ge2d_config->src_planes[0].h = vf->canvas0_config[0].height; + + if (vf->plane_num == 2) { + canvas_config_config(tb_src_canvas[1] & 0xff, + &vf->canvas0_config[1]); + ge2d_config->src_planes[1].addr = + vf->canvas0_config[1].phy_addr; + ge2d_config->src_planes[1].w = + vf->canvas0_config[1].width; + ge2d_config->src_planes[1].h = + vf->canvas0_config[1].height >> 1; + } else if (vf->plane_num == 3) { + canvas_config_config(tb_src_canvas[2] & 0xff, + &vf->canvas0_config[2]); + ge2d_config->src_planes[2].addr = + vf->canvas0_config[2].phy_addr; + ge2d_config->src_planes[2].w = + vf->canvas0_config[2].width; + ge2d_config->src_planes[2].h = + vf->canvas0_config[2].height >> 1; } - src_vf.canvas0Addr = + canvas_id = (tb_src_canvas[0] & 0xff) | ((tb_src_canvas[1] & 0xff) << 8) | ((tb_src_canvas[2] & 0xff) << 16); + ge2d_config->src_para.canvas_index = canvas_id; - canvas_read( - src_vf.canvas0Addr & 0xff, &cs0); - canvas_read( - (src_vf.canvas0Addr >> 8) & 0xff, &cs1); - canvas_read( - (src_vf.canvas0Addr >> 16) & 0xff, &cs2); } else { canvas_read(vf->canvas0Addr & 0xff, &cs0); canvas_read((vf->canvas0Addr >> 8) & 0xff, &cs1); canvas_read((vf->canvas0Addr >> 16) & 0xff, &cs2); + ge2d_config->src_planes[0].addr = cs0.addr; + ge2d_config->src_planes[0].w = cs0.width; + ge2d_config->src_planes[0].h = cs0.height; + ge2d_config->src_planes[1].addr = cs1.addr; + ge2d_config->src_planes[1].w = cs1.width; + ge2d_config->src_planes[1].h = cs1.height; + ge2d_config->src_planes[2].addr = cs2.addr; + ge2d_config->src_planes[2].w = cs2.width; + ge2d_config->src_planes[2].h = cs2.height; + ge2d_config->src_para.canvas_index = vf->canvas0Addr; } - ge2d_config->src_planes[0].addr = cs0.addr; - ge2d_config->src_planes[0].w = cs0.width; - ge2d_config->src_planes[0].h = cs0.height; - ge2d_config->src_planes[1].addr = cs1.addr; - ge2d_config->src_planes[1].w = cs1.width; - ge2d_config->src_planes[1].h = cs1.height; - ge2d_config->src_planes[2].addr = cs2.addr; - ge2d_config->src_planes[2].w = cs2.width; - ge2d_config->src_planes[2].h = cs2.height; canvas_read(tb_canvas & 0xff, &cd); ge2d_config->dst_planes[0].addr = cd.addr; ge2d_config->dst_planes[0].w = cd.width; @@ -1047,7 +1056,6 @@ static int process_vf_tb_detect(struct vframe_s *vf, ge2d_config->src_key.key_enable = 0; ge2d_config->src_key.key_mask = 0; ge2d_config->src_key.key_mode = 0; - ge2d_config->src_para.canvas_index = src_vf.canvas0Addr; ge2d_config->src_para.mem_type = CANVAS_TYPE_INVALID; ge2d_config->src_para.format = format; ge2d_config->src_para.fill_color_en = 0; @@ -1140,7 +1148,7 @@ static void process_vf_rotate(struct vframe_s *vf, struct vframe_s *new_vf; struct ppframe_s *pp_vf; struct canvas_s cs0, cs1, cs2, cd; - static struct vframe_s src_vf; + u32 canvas_id; int ret = 0; unsigned int cur_angle = 0; int interlace_mode; @@ -1238,7 +1246,7 @@ static void process_vf_rotate(struct vframe_s *vf, ppmgr_src_canvas[2], &vf->canvas0_config[2]); } - vf->canvas0Addr = + canvas_id = ppmgr_src_canvas[0] | (ppmgr_src_canvas[1] << 8) | (ppmgr_src_canvas[2] << 16); @@ -1441,44 +1449,44 @@ static void process_vf_rotate(struct vframe_s *vf, ge2d_config->src1_gb_alpha = 0;/*0xff;*/ ge2d_config->dst_xy_swap = 0; - src_vf = *vf; if (vf->canvas0Addr == (u32)-1) { canvas_config_config(ppmgr_src_canvas[0], - &src_vf.canvas0_config[0]); - if (src_vf.plane_num == 2) { + &vf->canvas0_config[0]); + if (vf->plane_num == 2) { canvas_config_config( ppmgr_src_canvas[1], - &src_vf.canvas0_config[1]); - } else if (src_vf.plane_num == 3) { + &vf->canvas0_config[1]); + } else if (vf->plane_num == 3) { canvas_config_config( ppmgr_src_canvas[2], - &src_vf.canvas0_config[2]); + &vf->canvas0_config[2]); } - src_vf.canvas0Addr = + canvas_id = ppmgr_src_canvas[0] | (ppmgr_src_canvas[1] << 8) | (ppmgr_src_canvas[2] << 16); ge2d_config->src_planes[0].addr = - src_vf.canvas0_config[0].phy_addr; + vf->canvas0_config[0].phy_addr; ge2d_config->src_planes[0].w = - src_vf.canvas0_config[0].width; + vf->canvas0_config[0].width; ge2d_config->src_planes[0].h = - src_vf.canvas0_config[0].height; + vf->canvas0_config[0].height; ge2d_config->src_planes[1].addr = - src_vf.canvas0_config[1].phy_addr; + vf->canvas0_config[1].phy_addr; ge2d_config->src_planes[1].w = - src_vf.canvas0_config[1].width; + vf->canvas0_config[1].width; ge2d_config->src_planes[1].h = - src_vf.canvas0_config[1].height >> 1; - if (src_vf.plane_num == 3) { + vf->canvas0_config[1].height >> 1; + if (vf->plane_num == 3) { ge2d_config->src_planes[2].addr = - src_vf.canvas0_config[2].phy_addr; + vf->canvas0_config[2].phy_addr; ge2d_config->src_planes[2].w = - src_vf.canvas0_config[2].width; + vf->canvas0_config[2].width; ge2d_config->src_planes[2].h = - src_vf.canvas0_config[2].height >> 1; + vf->canvas0_config[2].height >> 1; } + ge2d_config->src_para.canvas_index = canvas_id; } else { canvas_read(vf->canvas0Addr & 0xff, &cs0); canvas_read((vf->canvas0Addr >> 8) & 0xff, &cs1); @@ -1492,6 +1500,8 @@ static void process_vf_rotate(struct vframe_s *vf, ge2d_config->src_planes[2].addr = cs2.addr; ge2d_config->src_planes[2].w = cs2.width; ge2d_config->src_planes[2].h = cs2.height; + ge2d_config->src_para.canvas_index = vf->canvas0Addr; + } canvas_read(new_vf->canvas0Addr & 0xff, &cd); @@ -1502,8 +1512,6 @@ static void process_vf_rotate(struct vframe_s *vf, ge2d_config->src_key.key_enable = 0; ge2d_config->src_key.key_mask = 0; ge2d_config->src_key.key_mode = 0; - - ge2d_config->src_para.canvas_index = vf->canvas0Addr; ge2d_config->src_para.mem_type = CANVAS_TYPE_INVALID; ge2d_config->src_para.format = get_input_format(vf); @@ -1569,45 +1577,44 @@ static void process_vf_rotate(struct vframe_s *vf, ge2d_config->src_key.key_mode = 0; ge2d_config->src_para.mem_type = CANVAS_TYPE_INVALID; - src_vf = *vf; if (vf->canvas0Addr == (u32)-1) { canvas_config_config(ppmgr_src_canvas[0], - &src_vf.canvas0_config[0]); - if (src_vf.plane_num == 2) { + &vf->canvas0_config[0]); + if (vf->plane_num == 2) { canvas_config_config( ppmgr_src_canvas[1], - &src_vf.canvas0_config[1]); - } else if (src_vf.plane_num == 3) { + &vf->canvas0_config[1]); + } else if (vf->plane_num == 3) { canvas_config_config( ppmgr_src_canvas[2], - &src_vf.canvas0_config[2]); + &vf->canvas0_config[2]); } - src_vf.canvas0Addr = + canvas_id = ppmgr_src_canvas[0] | (ppmgr_src_canvas[1] << 8) | (ppmgr_src_canvas[2] << 16); ge2d_config->src_planes[0].addr = - src_vf.canvas0_config[0].phy_addr; + vf->canvas0_config[0].phy_addr; ge2d_config->src_planes[0].w = - src_vf.canvas0_config[0].width; + vf->canvas0_config[0].width; ge2d_config->src_planes[0].h = - src_vf.canvas0_config[0].height; + vf->canvas0_config[0].height; ge2d_config->src_planes[1].addr = - src_vf.canvas0_config[1].phy_addr; + vf->canvas0_config[1].phy_addr; ge2d_config->src_planes[1].w = - src_vf.canvas0_config[1].width; + vf->canvas0_config[1].width; ge2d_config->src_planes[1].h = - src_vf.canvas0_config[1].height >> 1; - if (src_vf.plane_num == 3) { + vf->canvas0_config[1].height >> 1; + if (vf->plane_num == 3) { ge2d_config->src_planes[2].addr = - src_vf.canvas0_config[2].phy_addr; + vf->canvas0_config[2].phy_addr; ge2d_config->src_planes[2].w = - src_vf.canvas0_config[2].width; + vf->canvas0_config[2].width; ge2d_config->src_planes[2].h = - src_vf.canvas0_config[2].height >> 1; + vf->canvas0_config[2].height >> 1; } - ge2d_config->src_para.canvas_index = src_vf.canvas0Addr; + ge2d_config->src_para.canvas_index = canvas_id; } else { canvas_read(vf->canvas0Addr & 0xff, &cs0); canvas_read((vf->canvas0Addr >> 8) & 0xff, &cs1);