From 1543e317f1da31b75942316931e8f491a8920811 Mon Sep 17 00:00:00 2001 From: hc <hc@nodka.com> Date: Thu, 04 Jan 2024 10:08:02 +0000 Subject: [PATCH] disable FB --- kernel/drivers/video/rockchip/rga3/rga_policy.c | 122 ++++++++++++++++++++++++++++++++-------- 1 files changed, 98 insertions(+), 24 deletions(-) diff --git a/kernel/drivers/video/rockchip/rga3/rga_policy.c b/kernel/drivers/video/rockchip/rga3/rga_policy.c index 4e26797..c87ce18 100644 --- a/kernel/drivers/video/rockchip/rga3/rga_policy.c +++ b/kernel/drivers/video/rockchip/rga3/rga_policy.c @@ -15,7 +15,7 @@ #define GET_GCD(n1, n2) \ ({ \ int i; \ - int gcd = 0; \ + int gcd = 1; \ for (i = 1; i <= (n1) && i <= (n2); i++) { \ if ((n1) % i == 0 && (n2) % i == 0) \ gcd = i; \ @@ -46,6 +46,53 @@ return feature; } +static bool rga_check_csc_constant(const struct rga_hw_data *data, struct rga_req *rga_base, + uint32_t mode, uint32_t flag) +{ + if (mode & flag) + return true; + + if ((rga_base->full_csc.flag & 0x1) && (data->feature & RGA_FULL_CSC)) + return true; + + return false; +} + +static bool rga_check_csc(const struct rga_hw_data *data, struct rga_req *rga_base) +{ + switch (rga_base->yuv2rgb_mode) { + case 0x1: + return rga_check_csc_constant(data, rga_base, + data->csc_y2r_mode, RGA_MODE_CSC_BT601L); + case 0x2: + return rga_check_csc_constant(data, rga_base, + data->csc_y2r_mode, RGA_MODE_CSC_BT601F); + case 0x3: + return rga_check_csc_constant(data, rga_base, + data->csc_y2r_mode, RGA_MODE_CSC_BT709); + case 0x1 << 2: + return rga_check_csc_constant(data, rga_base, + data->csc_r2y_mode, RGA_MODE_CSC_BT601F); + case 0x2 << 2: + return rga_check_csc_constant(data, rga_base, + data->csc_r2y_mode, RGA_MODE_CSC_BT601L); + case 0x3 << 2: + return rga_check_csc_constant(data, rga_base, + data->csc_r2y_mode, RGA_MODE_CSC_BT709); + default: + break; + } + + if ((rga_base->full_csc.flag & 0x1)) { + if (data->feature & RGA_FULL_CSC) + return true; + else + return false; + } + + return true; +} + static bool rga_check_resolution(const struct rga_rect_range *range, int width, int height) { if (width > range->max.width || height > range->max.height) @@ -61,32 +108,34 @@ int rd_mode, int format, int win_num) { int i; - bool matched = false; + const uint32_t *formats; + uint32_t format_count; - if (rd_mode == RGA_RASTER_MODE) { - for (i = 0; i < data->win[win_num].num_of_raster_formats; i++) { - if (format == data->win[win_num].raster_formats[i]) { - matched = true; - break; - } - } - } else if (rd_mode == RGA_FBC_MODE) { - for (i = 0; i < data->win[win_num].num_of_fbc_formats; i++) { - if (format == data->win[win_num].fbc_formats[i]) { - matched = true; - break; - } - } - } else if (rd_mode == RGA_TILE_MODE) { - for (i = 0; i < data->win[win_num].num_of_tile_formats; i++) { - if (format == data->win[win_num].tile_formats[i]) { - matched = true; - break; - } - } + switch (rd_mode) { + case RGA_RASTER_MODE: + formats = data->win[win_num].formats[RGA_RASTER_INDEX]; + format_count = data->win[win_num].formats_count[RGA_RASTER_INDEX]; + break; + case RGA_FBC_MODE: + formats = data->win[win_num].formats[RGA_AFBC16x16_INDEX]; + format_count = data->win[win_num].formats_count[RGA_AFBC16x16_INDEX]; + break; + case RGA_TILE_MODE: + formats = data->win[win_num].formats[RGA_TILE8x8_INDEX]; + format_count = data->win[win_num].formats_count[RGA_TILE8x8_INDEX]; + break; + default: + return false; } - return matched; + if (formats == NULL || format_count == 0) + return false; + + for (i = 0; i < format_count; i++) + if (format == formats[i]) + return true; + + return false; } static bool rga_check_align(uint32_t byte_stride_align, uint32_t format, uint16_t w_stride) @@ -118,6 +167,12 @@ if (!rga_check_resolution(&data->input_range, src0->act_w, src0->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)) + return false; + if (!rga_check_format(data, src0->rd_mode, src0->format, 0)) return false; @@ -133,6 +188,12 @@ 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; @@ -146,6 +207,12 @@ 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)) @@ -306,6 +373,13 @@ continue; } + if (!rga_check_csc(data, rga_base)) { + if (DEBUGGER_EN(MSG)) + pr_info("core = %d, break on rga_check_csc", + scheduler->core); + continue; + } + optional_cores |= scheduler->core; } -- Gitblit v1.6.2