From 14e857ea061292cf1e6a4fdc14f8bce8849284c8 Mon Sep 17 00:00:00 2001 From: Yu Qiaowei Date: Mon, 29 Jan 2024 14:33:20 +0800 Subject: [PATCH] video: rockchip: rga3: Add debug log when assign cores Change-Id: I9e601fa14da96224acb68ced88ac4580b32b6822 Signed-off-by: Yu Qiaowei --- drivers/video/rockchip/rga3/rga3_reg_info.c | 12 +- drivers/video/rockchip/rga3/rga_policy.c | 153 +++++++++++--------- 2 files changed, 92 insertions(+), 73 deletions(-) diff --git a/drivers/video/rockchip/rga3/rga3_reg_info.c b/drivers/video/rockchip/rga3/rga3_reg_info.c index 2b61833aa4a3..0ea4e8b2f6dd 100644 --- a/drivers/video/rockchip/rga3/rga3_reg_info.c +++ b/drivers/video/rockchip/rga3/rga3_reg_info.c @@ -1761,11 +1761,13 @@ static int rga3_scale_check(const struct rga3_req *req) win0_dah = req->win0.dst_act_h; if (((win0_saw >> 3) > win0_daw) || ((win0_sah >> 3) > win0_dah)) { - pr_info("win0 unsupported to scaling less than 1/8 times.\n"); + pr_info("win0 unsupported to scaling less than 1/8 times. src[%d, %d], dst[%d, %d]\n", + win0_saw, win0_sah, win0_daw, win0_dah); return -EINVAL; } if (((win0_daw >> 3) > win0_saw) || ((win0_dah >> 3) > win0_sah)) { - pr_info("win0 unsupported to scaling more than 8 times.\n"); + pr_info("win0 unsupported to scaling more than 8 times. src[%d, %d], dst[%d, %d]\n", + win0_saw, win0_sah, win0_daw, win0_dah); return -EINVAL; } @@ -1776,11 +1778,13 @@ static int rga3_scale_check(const struct rga3_req *req) win1_dah = req->win1.dst_act_h; if (((win1_saw >> 3) > win1_daw) || ((win1_sah >> 3) > win1_dah)) { - pr_info("win1 unsupported to scaling less than 1/8 times.\n"); + pr_info("win1 unsupported to scaling less than 1/8 times. src[%d, %d], dst[%d, %d]\n", + win1_saw, win1_sah, win1_daw, win1_dah); return -EINVAL; } if (((win1_daw >> 3) > win1_saw) || ((win1_dah >> 3) > win1_sah)) { - pr_info("win1 unsupported to scaling more than 8 times.\n"); + pr_info("win1 unsupported to scaling more than 8 times. src[%d, %d], dst[%d, %d]\n", + win1_saw, win1_sah, win1_daw, win1_dah); return -EINVAL; } } diff --git a/drivers/video/rockchip/rga3/rga_policy.c b/drivers/video/rockchip/rga3/rga_policy.c index c87ce1881cff..5aaeda5bbbf1 100644 --- a/drivers/video/rockchip/rga3/rga_policy.c +++ b/drivers/video/rockchip/rga3/rga_policy.c @@ -161,65 +161,55 @@ static bool rga_check_align(uint32_t byte_stride_align, uint32_t format, uint16_ return false; } -static bool rga_check_src0(const struct rga_hw_data *data, - struct rga_img_info_t *src0) +static bool rga_check_channel(const struct rga_hw_data *data, + struct rga_img_info_t *img, + const char *name, int input, int win_num) { - if (!rga_check_resolution(&data->input_range, src0->act_w, src0->act_h)) + const struct rga_rect_range *range; + + if (input) + range = &data->input_range; + else + range = &data->output_range; + + if (!rga_check_resolution(range, img->act_w, img->act_h)) { + if (DEBUGGER_EN(MSG)) + pr_info("%s resolution check error, input range[%dx%d ~ %dx%d], [w,h] = [%d, %d]\n", + name, + data->input_range.min.width, data->input_range.min.height, + data->input_range.max.width, data->input_range.max.height, + img->act_w, img->act_h); + return false; + } if (data == &rga3_data && !rga_check_resolution(&data->input_range, - src0->act_w + src0->x_offset, - src0->act_h + src0->y_offset)) + img->act_w + img->x_offset, + img->act_h + img->y_offset)) { + if (DEBUGGER_EN(MSG)) + pr_info("%s RGA3 resolution check error, input range[%dx%d ~ %dx%d], [w+x,h+y] = [%d, %d]\n", + name, + data->input_range.min.width, data->input_range.min.height, + data->input_range.max.width, data->input_range.max.height, + img->act_w + img->x_offset, + img->act_h + img->y_offset); return false; + } - if (!rga_check_format(data, src0->rd_mode, src0->format, 0)) + if (!rga_check_format(data, img->rd_mode, img->format, win_num)) { + if (DEBUGGER_EN(MSG)) + pr_info("%s format check error, mode = %#x, format = %#x\n", + name, img->rd_mode, img->format); return false; + } - if (!rga_check_align(data->byte_stride_align, src0->format, src0->vir_w)) - return false; - - return true; -} - -static bool rga_check_src1(const struct rga_hw_data *data, - struct rga_img_info_t *src1) -{ - if (!rga_check_resolution(&data->input_range, src1->act_w, src1->act_h)) - return false; - - if (data == &rga3_data && - !rga_check_resolution(&data->input_range, - src1->act_w + src1->x_offset, - src1->act_h + src1->y_offset)) - return false; - - if (!rga_check_format(data, src1->rd_mode, src1->format, 1)) - return false; - - if (!rga_check_align(data->byte_stride_align, src1->format, src1->vir_w)) - return false; - - return true; -} - -static bool rga_check_dst(const struct rga_hw_data *data, - struct rga_img_info_t *dst) -{ - if (!rga_check_resolution(&data->output_range, dst->act_w, dst->act_h)) - return false; - - if (data == &rga3_data && - !rga_check_resolution(&data->output_range, - dst->act_w + dst->x_offset, - dst->act_h + dst->y_offset)) - return false; - - if (!rga_check_format(data, dst->rd_mode, dst->format, 2)) - return false; - - if (!rga_check_align(data->byte_stride_align, dst->format, dst->vir_w)) + if (!rga_check_align(data->byte_stride_align, img->format, img->vir_w)) { + if (DEBUGGER_EN(MSG)) + pr_info("%s align check error, byte_stride_align[%d], format[%#x], vir_w[%d]\n", + name, data->byte_stride_align, img->format, img->vir_w); return false; + } return true; } @@ -247,21 +237,28 @@ static bool rga_check_scale(const struct rga_hw_data *data, if (sw > dw) { if ((sw >> data->max_downscale_factor) > dw) - return false; + goto check_error; } else if (sw < dw) { if ((sw << data->max_upscale_factor) < dw) - return false; + goto check_error; } if (sh > dh) { if ((sh >> data->max_downscale_factor) > dh) - return false; + goto check_error; } else if (sh < dh) { if ((sh << data->max_upscale_factor) < dh) - return false; + goto check_error; } return true; +check_error: + if (DEBUGGER_EN(MSG)) + pr_info("scale check error, scale limit[1/%d ~ %d], src[%d, %d], dst[%d, %d]\n", + (1 << data->max_downscale_factor), (1 << data->max_upscale_factor), + sw, sh, dw, dh); + + return false; } int rga_job_assign(struct rga_job *job) @@ -315,7 +312,7 @@ int rga_job_assign(struct rga_job *job) if (feature > 0) { if (!(feature & data->feature)) { if (DEBUGGER_EN(MSG)) - pr_info("core = %d, break on feature", + pr_info("core = %d, break on feature\n", scheduler->core); continue; } @@ -324,20 +321,38 @@ int rga_job_assign(struct rga_job *job) /* only colorfill need single win (colorpalette?) */ if (!(feature & 1)) { if (src1->yrgb_addr > 0) { - if ((!(src0->rd_mode & data->win[0].rd_mode)) || - (!(src1->rd_mode & data->win[1].rd_mode)) || - (!(dst->rd_mode & data->win[2].rd_mode))) { + if (!(src0->rd_mode & data->win[0].rd_mode)) { if (DEBUGGER_EN(MSG)) - pr_info("core = %d, ABC break on rd_mode", - scheduler->core); + pr_info("core[%#x], src0 break on rd_mode[%#x]\n", + scheduler->core, src0->rd_mode); + continue; + } + + if (!(src1->rd_mode & data->win[1].rd_mode)) { + if (DEBUGGER_EN(MSG)) + pr_info("core[%#x], src1 break on rd_mode[%#x]\n", + scheduler->core, src1->rd_mode); + continue; + } + + if (!(dst->rd_mode & data->win[2].rd_mode)) { + if (DEBUGGER_EN(MSG)) + pr_info("core[%#x], dst break on rd_mode[%#x]\n", + scheduler->core, dst->rd_mode); continue; } } else { - if ((!(src0->rd_mode & data->win[0].rd_mode)) || - (!(dst->rd_mode & data->win[2].rd_mode))) { + if (!(src0->rd_mode & data->win[0].rd_mode)) { if (DEBUGGER_EN(MSG)) - pr_info("core = %d, ABB break on rd_mode", - scheduler->core); + pr_info("core[%#x], src break on rd_mode[%#x]\n", + scheduler->core, src0->rd_mode); + continue; + } + + if (!(dst->rd_mode & data->win[2].rd_mode)) { + if (DEBUGGER_EN(MSG)) + pr_info("core[%#x], dst break on rd_mode[%#x]\n", + scheduler->core, dst->rd_mode); continue; } } @@ -349,26 +364,26 @@ int rga_job_assign(struct rga_job *job) continue; } - if (!rga_check_src0(data, src0)) { + if (!rga_check_channel(data, src0, "src0", true, 0)) { if (DEBUGGER_EN(MSG)) - pr_info("core = %d, break on rga_check_src0", + pr_info("core = %d, break on src0", scheduler->core); continue; } if (src1->yrgb_addr > 0) { - if (!rga_check_src1(data, src1)) { + if (!rga_check_channel(data, src1, "src1", true, 1)) { if (DEBUGGER_EN(MSG)) - pr_info("core = %d, break on rga_check_src1", + pr_info("core = %d, break on src1", scheduler->core); continue; } } } - if (!rga_check_dst(data, dst)) { + if (!rga_check_channel(data, dst, "dst", false, 2)) { if (DEBUGGER_EN(MSG)) - pr_info("core = %d, break on rga_check_dst", + pr_info("core = %d, break on dst", scheduler->core); continue; }