mirror of
https://github.com/hardkernel/linux.git
synced 2026-06-07 19:30:30 +09:00
video: rockchip: rga3: add align check for policy
Signed-off-by: Li Huang <putin.li@rock-chips.com> Change-Id: I7792c28ec3bce0bb8822db47d5f4d8f6c3d48bf4
This commit is contained in:
@@ -20,6 +20,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);
|
||||
|
||||
const char *rga_get_format_name(uint32_t format);
|
||||
const char *rga_get_render_mode_str(uint8_t mode);
|
||||
|
||||
@@ -46,6 +46,8 @@ struct rga_hw_data {
|
||||
unsigned int max_upscale_factor;
|
||||
unsigned int max_downscale_factor;
|
||||
|
||||
uint32_t byte_stride;
|
||||
|
||||
const struct rga_win_data *win;
|
||||
unsigned int win_size;
|
||||
};
|
||||
|
||||
@@ -347,6 +347,76 @@ const char *rga_get_format_name(uint32_t format)
|
||||
}
|
||||
}
|
||||
|
||||
uint32_t rga_get_pixel_stride_from_format(uint32_t format)
|
||||
{
|
||||
uint32_t pixel_stride = 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:
|
||||
pixel_stride = 32;
|
||||
break;
|
||||
case RGA_FORMAT_RGB_888:
|
||||
case RGA_FORMAT_BGR_888:
|
||||
pixel_stride = 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_YVYU_422:
|
||||
case RGA_FORMAT_YVYU_420:
|
||||
case RGA_FORMAT_VYUY_422:
|
||||
case RGA_FORMAT_VYUY_420:
|
||||
case RGA_FORMAT_YUYV_422:
|
||||
case RGA_FORMAT_YUYV_420:
|
||||
case RGA_FORMAT_UYVY_422:
|
||||
case RGA_FORMAT_UYVY_420:
|
||||
pixel_stride = 16;
|
||||
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:
|
||||
pixel_stride = 10;
|
||||
break;
|
||||
case RGA_FORMAT_BPP1:
|
||||
case RGA_FORMAT_BPP2:
|
||||
case RGA_FORMAT_BPP4:
|
||||
case RGA_FORMAT_BPP8:
|
||||
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_YCbCr_422_SP:
|
||||
case RGA_FORMAT_YCbCr_422_P:
|
||||
case RGA_FORMAT_YCrCb_422_SP:
|
||||
case RGA_FORMAT_YCrCb_422_P:
|
||||
pixel_stride = 8;
|
||||
break;
|
||||
case RGA_FORMAT_Y4:
|
||||
pixel_stride = 4;
|
||||
break;
|
||||
default:
|
||||
pr_err("unknown format [0x%x]\n", format);
|
||||
return -1;
|
||||
}
|
||||
|
||||
return pixel_stride;
|
||||
}
|
||||
|
||||
const char *rga_get_render_mode_str(uint8_t mode)
|
||||
{
|
||||
switch (mode) {
|
||||
|
||||
@@ -264,6 +264,8 @@ const struct rga_hw_data rga3_data = {
|
||||
.max_upscale_factor = 3,
|
||||
.max_downscale_factor = 3,
|
||||
|
||||
.byte_stride = 16,
|
||||
|
||||
.feature = RGA_COLOR_KEY,
|
||||
.csc_r2y_mode = RGA_MODE_CSC_BT601L |
|
||||
RGA_MODE_CSC_BT601F | RGA_MODE_CSC_BT709 |
|
||||
@@ -286,6 +288,8 @@ const struct rga_hw_data rga2e_data = {
|
||||
.max_upscale_factor = 4,
|
||||
.max_downscale_factor = 4,
|
||||
|
||||
.byte_stride = 4,
|
||||
|
||||
.feature = RGA_COLOR_FILL | RGA_COLOR_PALETTE |
|
||||
RGA_COLOR_KEY | RGA_ROP_CALCULATE |
|
||||
RGA_NN_QUANTIZE | RGA_DITHER,
|
||||
@@ -308,6 +312,8 @@ const struct rga_hw_data rga2e_1106_data = {
|
||||
.max_upscale_factor = 4,
|
||||
.max_downscale_factor = 4,
|
||||
|
||||
.byte_stride = 4,
|
||||
|
||||
.feature = RGA_COLOR_FILL | RGA_COLOR_PALETTE |
|
||||
RGA_COLOR_KEY | RGA_ROP_CALCULATE |
|
||||
RGA_NN_QUANTIZE | RGA_DITHER | RGA_MOSAIC |
|
||||
|
||||
@@ -11,6 +11,17 @@
|
||||
#include "rga_common.h"
|
||||
#include "rga_hw_config.h"
|
||||
|
||||
#define GET_GCD(n1, n2) \
|
||||
({ \
|
||||
int i; \
|
||||
for (i = 1; i <= (n1) && i <= (n2); i++) { \
|
||||
if ((n1) % i == 0 && (n2) % i == 0) \
|
||||
gcd = i; \
|
||||
} \
|
||||
gcd; \
|
||||
})
|
||||
#define GET_LCM(n1, n2, gcd) (((n1) * (n2)) / gcd)
|
||||
|
||||
static int rga_set_feature(struct rga_req *rga_base)
|
||||
{
|
||||
int feature = 0;
|
||||
@@ -65,6 +76,28 @@ static bool rga_check_format(const struct rga_hw_data *data,
|
||||
return matched;
|
||||
}
|
||||
|
||||
static bool rga_check_align(uint32_t byte_stride, uint32_t format, uint16_t w_stride)
|
||||
{
|
||||
uint32_t bit_stride = 0, pixel_stride = 0, align = 0, gcd = 0;
|
||||
|
||||
pixel_stride = rga_get_pixel_stride_from_format(format);
|
||||
if (pixel_stride <= 0)
|
||||
return false;
|
||||
|
||||
bit_stride = pixel_stride * w_stride;
|
||||
|
||||
if (bit_stride % (byte_stride * 8) == 0)
|
||||
return true;
|
||||
|
||||
gcd = GET_GCD(pixel_stride, byte_stride * 8);
|
||||
align = GET_LCM(pixel_stride, byte_stride * 8, gcd) / pixel_stride;
|
||||
if (DEBUGGER_EN(MSG))
|
||||
pr_info("unsupported width stride %d, 0x%x should be %d aligned!",
|
||||
w_stride, format, align);
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
static bool rga_check_src0(const struct rga_hw_data *data,
|
||||
struct rga_img_info_t *src0)
|
||||
{
|
||||
@@ -79,6 +112,9 @@ static bool rga_check_src0(const struct rga_hw_data *data,
|
||||
if (!rga_check_format(data, src0->rd_mode, src0->format, 0))
|
||||
return false;
|
||||
|
||||
if (!rga_check_align(data->byte_stride, src0->format, src0->vir_w))
|
||||
return false;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -96,6 +132,9 @@ static bool rga_check_src1(const struct rga_hw_data *data,
|
||||
if (!rga_check_format(data, src1->rd_mode, src1->format, 1))
|
||||
return false;
|
||||
|
||||
if (!rga_check_align(data->byte_stride, src1->format, src1->vir_w))
|
||||
return false;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -113,6 +152,9 @@ static bool rga_check_dst(const struct rga_hw_data *data,
|
||||
if (!rga_check_format(data, dst->rd_mode, dst->format, 2))
|
||||
return false;
|
||||
|
||||
if (!rga_check_align(data->byte_stride, dst->format, dst->vir_w))
|
||||
return false;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user