From 004ba6e22a40a17f0150cb51dbba9cf0338702f2 Mon Sep 17 00:00:00 2001 From: Yu Qiaowei Date: Tue, 5 Jul 2022 10:42:05 +0800 Subject: [PATCH] video: rockchip: rga3: Fix some formats cannot match core Signed-off-by: Yu Qiaowei Change-Id: Ia6f6e43342f7a77d1bcf5e4cd4ed64b4d567d5f8 --- .../video/rockchip/rga3/include/rga_common.h | 2 +- drivers/video/rockchip/rga3/rga_common.c | 137 ++++++++++-------- drivers/video/rockchip/rga3/rga_policy.c | 12 +- 3 files changed, 88 insertions(+), 63 deletions(-) diff --git a/drivers/video/rockchip/rga3/include/rga_common.h b/drivers/video/rockchip/rga3/include/rga_common.h index e66e44448254..875dd8731709 100644 --- a/drivers/video/rockchip/rga3/include/rga_common.h +++ b/drivers/video/rockchip/rga3/include/rga_common.h @@ -24,7 +24,7 @@ bool rga_is_yuv422p_format(uint32_t format); bool rga_is_only_y_format(uint32_t format); int rga_get_format_bits(uint32_t format); -uint32_t rga_get_pixel_stride_from_format(uint32_t format); +int rga_get_pixel_stride_from_format(uint32_t format); const char *rga_get_format_name(uint32_t format); const char *rga_get_render_mode_str(uint8_t mode); diff --git a/drivers/video/rockchip/rga3/rga_common.c b/drivers/video/rockchip/rga3/rga_common.c index 60483aeb1a89..204895905310 100644 --- a/drivers/video/rockchip/rga3/rga_common.c +++ b/drivers/video/rockchip/rga3/rga_common.c @@ -184,61 +184,6 @@ bool rga_is_only_y_format(uint32_t format) } } -int rga_get_format_bits(uint32_t format) -{ - int bits = 0; - - switch (format) { - case RGA_FORMAT_RGBA_8888: - case RGA_FORMAT_RGBX_8888: - case RGA_FORMAT_BGRA_8888: - case RGA_FORMAT_BGRX_8888: - case RGA_FORMAT_ARGB_8888: - case RGA_FORMAT_XRGB_8888: - case RGA_FORMAT_ABGR_8888: - case RGA_FORMAT_XBGR_8888: - bits = 32; - break; - case RGA_FORMAT_RGB_888: - case RGA_FORMAT_BGR_888: - bits = 24; - break; - case RGA_FORMAT_RGB_565: - case RGA_FORMAT_RGBA_5551: - case RGA_FORMAT_RGBA_4444: - case RGA_FORMAT_BGR_565: - case RGA_FORMAT_YCbCr_422_SP: - case RGA_FORMAT_YCbCr_422_P: - case RGA_FORMAT_YCrCb_422_SP: - case RGA_FORMAT_YCrCb_422_P: - case RGA_FORMAT_BGRA_5551: - case RGA_FORMAT_BGRA_4444: - case RGA_FORMAT_ARGB_5551: - case RGA_FORMAT_ARGB_4444: - case RGA_FORMAT_ABGR_5551: - case RGA_FORMAT_ABGR_4444: - bits = 16; - break; - case RGA_FORMAT_YCbCr_420_SP: - case RGA_FORMAT_YCbCr_420_P: - case RGA_FORMAT_YCrCb_420_SP: - case RGA_FORMAT_YCrCb_420_P: - bits = 12; - break; - case RGA_FORMAT_YCbCr_420_SP_10B: - case RGA_FORMAT_YCrCb_420_SP_10B: - case RGA_FORMAT_YCbCr_422_SP_10B: - case RGA_FORMAT_YCrCb_422_SP_10B: - bits = 15; - break; - default: - pr_err("unknown format [%d]\n", format); - return -1; - } - - return bits; -} - const char *rga_get_format_name(uint32_t format) { switch (format) { @@ -347,9 +292,86 @@ const char *rga_get_format_name(uint32_t format) } } -uint32_t rga_get_pixel_stride_from_format(uint32_t format) +int rga_get_format_bits(uint32_t format) { - uint32_t pixel_stride = 0; + int bits = 0; + + switch (format) { + case RGA_FORMAT_RGBA_8888: + case RGA_FORMAT_RGBX_8888: + case RGA_FORMAT_BGRA_8888: + case RGA_FORMAT_BGRX_8888: + case RGA_FORMAT_ARGB_8888: + case RGA_FORMAT_XRGB_8888: + case RGA_FORMAT_ABGR_8888: + case RGA_FORMAT_XBGR_8888: + bits = 32; + break; + case RGA_FORMAT_RGB_888: + case RGA_FORMAT_BGR_888: + bits = 24; + break; + case RGA_FORMAT_RGB_565: + case RGA_FORMAT_RGBA_5551: + case RGA_FORMAT_RGBA_4444: + case RGA_FORMAT_BGR_565: + case RGA_FORMAT_BGRA_5551: + case RGA_FORMAT_BGRA_4444: + case RGA_FORMAT_ARGB_5551: + case RGA_FORMAT_ARGB_4444: + case RGA_FORMAT_ABGR_5551: + case RGA_FORMAT_ABGR_4444: + case RGA_FORMAT_YCbCr_422_SP: + case RGA_FORMAT_YCbCr_422_P: + case RGA_FORMAT_YCrCb_422_SP: + case RGA_FORMAT_YCrCb_422_P: + case RGA_FORMAT_YUYV_422: + case RGA_FORMAT_YVYU_422: + case RGA_FORMAT_UYVY_422: + case RGA_FORMAT_VYUY_422: + bits = 16; + break; + case RGA_FORMAT_YCbCr_420_SP: + case RGA_FORMAT_YCbCr_420_P: + case RGA_FORMAT_YCrCb_420_SP: + case RGA_FORMAT_YCrCb_420_P: + case RGA_FORMAT_YUYV_420: + case RGA_FORMAT_YVYU_420: + case RGA_FORMAT_UYVY_420: + case RGA_FORMAT_VYUY_420: + bits = 12; + break; + case RGA_FORMAT_YCbCr_420_SP_10B: + case RGA_FORMAT_YCrCb_420_SP_10B: + case RGA_FORMAT_YCbCr_422_SP_10B: + case RGA_FORMAT_YCrCb_422_SP_10B: + bits = 15; + break; + case RGA_FORMAT_YCbCr_400: + case RGA_FORMAT_BPP8: + bits = 8; + break; + case RGA_FORMAT_Y4: + case RGA_FORMAT_BPP4: + bits = 4; + break; + case RGA_FORMAT_BPP2: + bits = 2; + break; + case RGA_FORMAT_BPP1: + bits = 1; + break; + default: + pr_err("unknown format [0x%x]\n", format); + return -1; + } + + return bits; +} + +int rga_get_pixel_stride_from_format(uint32_t format) +{ + int pixel_stride = 0; switch (format) { case RGA_FORMAT_RGBA_8888: @@ -396,6 +418,7 @@ uint32_t rga_get_pixel_stride_from_format(uint32_t format) case RGA_FORMAT_BPP2: case RGA_FORMAT_BPP4: case RGA_FORMAT_BPP8: + case RGA_FORMAT_YCbCr_400: case RGA_FORMAT_YCbCr_420_SP: case RGA_FORMAT_YCbCr_420_P: case RGA_FORMAT_YCrCb_420_SP: diff --git a/drivers/video/rockchip/rga3/rga_policy.c b/drivers/video/rockchip/rga3/rga_policy.c index 16564891e7d3..493083655fb0 100644 --- a/drivers/video/rockchip/rga3/rga_policy.c +++ b/drivers/video/rockchip/rga3/rga_policy.c @@ -15,6 +15,7 @@ #define GET_GCD(n1, n2) \ ({ \ int i; \ + int gcd = 0; \ for (i = 1; i <= (n1) && i <= (n2); i++) { \ if ((n1) % i == 0 && (n2) % i == 0) \ gcd = i; \ @@ -90,7 +91,7 @@ static bool rga_check_format(const struct rga_hw_data *data, static bool rga_check_align(uint32_t byte_stride_align, uint32_t format, uint16_t w_stride) { - uint32_t bit_stride = 0, pixel_stride = 0, align = 0, gcd = 0; + int bit_stride, pixel_stride, align, gcd; pixel_stride = rga_get_pixel_stride_from_format(format); if (pixel_stride <= 0) @@ -101,11 +102,12 @@ static bool rga_check_align(uint32_t byte_stride_align, uint32_t format, uint16_ if (bit_stride % (byte_stride_align * 8) == 0) return true; - gcd = GET_GCD(pixel_stride, byte_stride_align * 8); - align = GET_LCM(pixel_stride, byte_stride_align * 8, gcd) / pixel_stride; - if (DEBUGGER_EN(MSG)) + if (DEBUGGER_EN(MSG)) { + gcd = GET_GCD(pixel_stride, byte_stride_align * 8); + align = GET_LCM(pixel_stride, byte_stride_align * 8, gcd) / pixel_stride; pr_info("unsupported width stride %d, 0x%x should be %d aligned!", - w_stride, format, align); + w_stride, format, align); + } return false; }