mirror of
https://github.com/hardkernel/linux.git
synced 2026-06-07 19:30:30 +09:00
video: rockchip: rga3: optimize struct rga_hw_data
Signed-off-by: Yu Qiaowei <cerf.yu@rock-chips.com> Change-Id: If48f4748409226dc73bdf0822eb832ca09bca86e
This commit is contained in:
@@ -16,11 +16,6 @@ enum rga_mmu {
|
||||
RGA_IOMMU = 2,
|
||||
};
|
||||
|
||||
struct rga_rect {
|
||||
int w;
|
||||
int h;
|
||||
};
|
||||
|
||||
struct rga_win_data {
|
||||
const char *name;
|
||||
const uint32_t *raster_formats;
|
||||
@@ -37,6 +32,16 @@ struct rga_win_data {
|
||||
|
||||
};
|
||||
|
||||
struct rga_rect {
|
||||
int width;
|
||||
int height;
|
||||
};
|
||||
|
||||
struct rga_rect_range {
|
||||
struct rga_rect min;
|
||||
struct rga_rect max;
|
||||
};
|
||||
|
||||
struct rga_hw_data {
|
||||
uint32_t version;
|
||||
uint32_t feature;
|
||||
@@ -44,15 +49,13 @@ struct rga_hw_data {
|
||||
uint32_t csc_r2y_mode;
|
||||
uint32_t csc_y2r_mode;
|
||||
|
||||
struct rga_rect max_input;
|
||||
struct rga_rect max_output;
|
||||
struct rga_rect min_input;
|
||||
struct rga_rect min_output;
|
||||
struct rga_rect_range input_range;
|
||||
struct rga_rect_range output_range;
|
||||
|
||||
unsigned int max_upscale_factor;
|
||||
unsigned int max_downscale_factor;
|
||||
|
||||
uint32_t byte_stride;
|
||||
uint32_t byte_stride_align;
|
||||
|
||||
const struct rga_win_data *win;
|
||||
unsigned int win_size;
|
||||
|
||||
@@ -253,10 +253,8 @@ const struct rga_win_data rga2e_win_data[] = {
|
||||
|
||||
const struct rga_hw_data rga3_data = {
|
||||
.version = 0,
|
||||
.min_input = { 68, 2 },
|
||||
.min_output = { 68, 2 },
|
||||
.max_input = { 8176, 8176 },
|
||||
.max_output = { 8128, 8128 },
|
||||
.input_range = {{68, 2}, {8176, 8176}},
|
||||
.output_range = {{68, 2}, {8128, 8128}},
|
||||
|
||||
.win = rga3_win_data,
|
||||
.win_size = ARRAY_SIZE(rga3_win_data),
|
||||
@@ -264,24 +262,20 @@ const struct rga_hw_data rga3_data = {
|
||||
.max_upscale_factor = 3,
|
||||
.max_downscale_factor = 3,
|
||||
|
||||
.byte_stride = 16,
|
||||
.byte_stride_align = 16,
|
||||
|
||||
.feature = RGA_COLOR_KEY,
|
||||
.csc_r2y_mode = RGA_MODE_CSC_BT601L |
|
||||
RGA_MODE_CSC_BT601F | RGA_MODE_CSC_BT709 |
|
||||
RGA_MODE_CSC_BT2020,
|
||||
.csc_y2r_mode = RGA_MODE_CSC_BT601L |
|
||||
RGA_MODE_CSC_BT601F | RGA_MODE_CSC_BT709 |
|
||||
RGA_MODE_CSC_BT2020,
|
||||
.csc_r2y_mode = RGA_MODE_CSC_BT601L | RGA_MODE_CSC_BT601F |
|
||||
RGA_MODE_CSC_BT709 | RGA_MODE_CSC_BT2020,
|
||||
.csc_y2r_mode = RGA_MODE_CSC_BT601L | RGA_MODE_CSC_BT601F |
|
||||
RGA_MODE_CSC_BT709 | RGA_MODE_CSC_BT2020,
|
||||
.mmu = RGA_IOMMU,
|
||||
};
|
||||
|
||||
const struct rga_hw_data rga2e_data = {
|
||||
.version = 0,
|
||||
.min_input = { 2, 2 },
|
||||
.min_output = { 2, 2 },
|
||||
.max_input = { 8192, 8192 },
|
||||
.max_output = { 4096, 4096 },
|
||||
.input_range = {{2, 2}, {8192, 8192}},
|
||||
.output_range = {{2, 2}, {4096, 4096}},
|
||||
|
||||
.win = rga2e_win_data,
|
||||
.win_size = ARRAY_SIZE(rga2e_win_data),
|
||||
@@ -289,24 +283,22 @@ const struct rga_hw_data rga2e_data = {
|
||||
.max_upscale_factor = 4,
|
||||
.max_downscale_factor = 4,
|
||||
|
||||
.byte_stride = 4,
|
||||
.byte_stride_align = 4,
|
||||
|
||||
.feature = RGA_COLOR_FILL | RGA_COLOR_PALETTE |
|
||||
RGA_COLOR_KEY | RGA_ROP_CALCULATE |
|
||||
RGA_NN_QUANTIZE | RGA_DITHER,
|
||||
RGA_COLOR_KEY | RGA_ROP_CALCULATE |
|
||||
RGA_NN_QUANTIZE | RGA_DITHER,
|
||||
.csc_r2y_mode = RGA_MODE_CSC_BT601L | RGA_MODE_CSC_BT601F |
|
||||
RGA_MODE_CSC_BT709,
|
||||
RGA_MODE_CSC_BT709,
|
||||
.csc_y2r_mode = RGA_MODE_CSC_BT601L | RGA_MODE_CSC_BT601F |
|
||||
RGA_MODE_CSC_BT709,
|
||||
RGA_MODE_CSC_BT709,
|
||||
.mmu = RGA_MMU,
|
||||
};
|
||||
|
||||
const struct rga_hw_data rga2e_1106_data = {
|
||||
.version = 0,
|
||||
.min_input = { 2, 2 },
|
||||
.min_output = { 2, 2 },
|
||||
.max_input = { 8192, 8192 },
|
||||
.max_output = { 4096, 4096 },
|
||||
.input_range = {{2, 2}, {8192, 8192}},
|
||||
.output_range = {{2, 2}, {4096, 4096}},
|
||||
|
||||
.win = rga2e_win_data,
|
||||
.win_size = ARRAY_SIZE(rga2e_win_data),
|
||||
@@ -314,7 +306,7 @@ const struct rga_hw_data rga2e_1106_data = {
|
||||
.max_upscale_factor = 4,
|
||||
.max_downscale_factor = 4,
|
||||
|
||||
.byte_stride = 4,
|
||||
.byte_stride_align = 4,
|
||||
|
||||
.feature = RGA_COLOR_FILL | RGA_COLOR_PALETTE |
|
||||
RGA_COLOR_KEY | RGA_ROP_CALCULATE |
|
||||
|
||||
@@ -45,6 +45,17 @@ static int rga_set_feature(struct rga_req *rga_base)
|
||||
return feature;
|
||||
}
|
||||
|
||||
static bool rga_check_resolution(const struct rga_rect_range *range, int width, int height)
|
||||
{
|
||||
if (width > range->max.width || height > range->max.height)
|
||||
return false;
|
||||
|
||||
if (width < range->min.width || height < range->min.height)
|
||||
return false;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
static bool rga_check_format(const struct rga_hw_data *data,
|
||||
int rd_mode, int format, int win_num)
|
||||
{
|
||||
@@ -77,7 +88,7 @@ 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)
|
||||
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;
|
||||
|
||||
@@ -87,11 +98,11 @@ static bool rga_check_align(uint32_t byte_stride, uint32_t format, uint16_t w_st
|
||||
|
||||
bit_stride = pixel_stride * w_stride;
|
||||
|
||||
if (bit_stride % (byte_stride * 8) == 0)
|
||||
if (bit_stride % (byte_stride_align * 8) == 0)
|
||||
return true;
|
||||
|
||||
gcd = GET_GCD(pixel_stride, byte_stride * 8);
|
||||
align = GET_LCM(pixel_stride, byte_stride * 8, gcd) / pixel_stride;
|
||||
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))
|
||||
pr_info("unsupported width stride %d, 0x%x should be %d aligned!",
|
||||
w_stride, format, align);
|
||||
@@ -102,18 +113,13 @@ static bool rga_check_align(uint32_t byte_stride, uint32_t format, uint16_t w_st
|
||||
static bool rga_check_src0(const struct rga_hw_data *data,
|
||||
struct rga_img_info_t *src0)
|
||||
{
|
||||
if (src0->act_w < data->min_input.w ||
|
||||
src0->act_h < data->min_input.h)
|
||||
return false;
|
||||
|
||||
if (src0->act_w > data->max_input.w ||
|
||||
src0->act_h > data->max_input.h)
|
||||
if (!rga_check_resolution(&data->input_range, src0->act_w, src0->act_h))
|
||||
return false;
|
||||
|
||||
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))
|
||||
if (!rga_check_align(data->byte_stride_align, src0->format, src0->vir_w))
|
||||
return false;
|
||||
|
||||
return true;
|
||||
@@ -122,18 +128,13 @@ static bool rga_check_src0(const struct rga_hw_data *data,
|
||||
static bool rga_check_src1(const struct rga_hw_data *data,
|
||||
struct rga_img_info_t *src1)
|
||||
{
|
||||
if (src1->act_w < data->min_input.w ||
|
||||
src1->act_h < data->min_input.h)
|
||||
return false;
|
||||
|
||||
if (src1->act_w > data->max_input.w ||
|
||||
src1->act_h > data->max_input.h)
|
||||
if (!rga_check_resolution(&data->input_range, src1->act_w, src1->act_h))
|
||||
return false;
|
||||
|
||||
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))
|
||||
if (!rga_check_align(data->byte_stride_align, src1->format, src1->vir_w))
|
||||
return false;
|
||||
|
||||
return true;
|
||||
@@ -142,18 +143,13 @@ static bool rga_check_src1(const struct rga_hw_data *data,
|
||||
static bool rga_check_dst(const struct rga_hw_data *data,
|
||||
struct rga_img_info_t *dst)
|
||||
{
|
||||
if (dst->act_w < data->min_output.w ||
|
||||
dst->act_h < data->min_output.h)
|
||||
return false;
|
||||
|
||||
if (dst->act_w > data->max_output.w ||
|
||||
dst->act_h > data->max_output.h)
|
||||
if (!rga_check_resolution(&data->output_range, dst->act_w, dst->act_h))
|
||||
return false;
|
||||
|
||||
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))
|
||||
if (!rga_check_align(data->byte_stride_align, dst->format, dst->vir_w))
|
||||
return false;
|
||||
|
||||
return true;
|
||||
|
||||
Reference in New Issue
Block a user