summaryrefslogtreecommitdiff
path: root/drivers/video/b2r2/b2r2_generic.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/video/b2r2/b2r2_generic.c')
-rw-r--r--drivers/video/b2r2/b2r2_generic.c358
1 files changed, 115 insertions, 243 deletions
diff --git a/drivers/video/b2r2/b2r2_generic.c b/drivers/video/b2r2/b2r2_generic.c
index 1a27adbaadf..4191e497e13 100644
--- a/drivers/video/b2r2/b2r2_generic.c
+++ b/drivers/video/b2r2/b2r2_generic.c
@@ -18,6 +18,7 @@
#include "b2r2_global.h"
#include "b2r2_debug.h"
#include "b2r2_filters.h"
+#include "b2r2_hw_convert.h"
/*
* Debug printing
@@ -499,6 +500,8 @@ static void setup_fill_input_stage(const struct b2r2_blt_request *req,
u32 src_color = req->user_req.src_color;
const struct b2r2_blt_img *dst_img = &(req->user_req.dst_img);
struct b2r2_control *cont = req->instance->control;
+ bool fullrange = (req->user_req.flags &
+ B2R2_BLT_FLAG_FULL_RANGE_YUV) != 0;
b2r2_log_info(cont->dev, "%s ENTRY\n", __func__);
@@ -525,17 +528,7 @@ static void setup_fill_input_stage(const struct b2r2_blt_request *req,
* where it is stored in ABGR format.
* Set up IVMX.
*/
- node->node.GROUP0.B2R2_INS |=
- B2R2_INS_IVMX_ENABLED;
- node->node.GROUP0.B2R2_CIC |= B2R2_CIC_IVMX;
- node->node.GROUP15.B2R2_VMX0 =
- B2R2_VMX0_RGB_TO_BGR;
- node->node.GROUP15.B2R2_VMX1 =
- B2R2_VMX1_RGB_TO_BGR;
- node->node.GROUP15.B2R2_VMX2 =
- B2R2_VMX2_RGB_TO_BGR;
- node->node.GROUP15.B2R2_VMX3 =
- B2R2_VMX3_RGB_TO_BGR;
+ b2r2_setup_ivmx(node, B2R2_CC_RGB_TO_BGR);
}
}
break;
@@ -568,16 +561,10 @@ static void setup_fill_input_stage(const struct b2r2_blt_request *req,
* Format of the supplied src_color is
* B2R2_BLT_FMT_32_BIT_AYUV8888.
*/
- node->node.GROUP0.B2R2_INS |= B2R2_INS_IVMX_ENABLED;
- node->node.GROUP0.B2R2_CIC |= B2R2_CIC_IVMX;
- node->node.GROUP15.B2R2_VMX0 =
- B2R2_VMX0_BLT_YUV888_TO_RGB_601_VIDEO;
- node->node.GROUP15.B2R2_VMX1 =
- B2R2_VMX1_BLT_YUV888_TO_RGB_601_VIDEO;
- node->node.GROUP15.B2R2_VMX2 =
- B2R2_VMX2_BLT_YUV888_TO_RGB_601_VIDEO;
- node->node.GROUP15.B2R2_VMX3 =
- B2R2_VMX3_BLT_YUV888_TO_RGB_601_VIDEO;
+ if (fullrange)
+ b2r2_setup_ivmx(node, B2R2_CC_BLT_YUV888_FULL_TO_RGB);
+ else
+ b2r2_setup_ivmx(node, B2R2_CC_BLT_YUV888_TO_RGB);
} else {
/* SOURCE_FILL_RAW */
bool dst_yuv_planar =
@@ -623,17 +610,12 @@ static void setup_fill_input_stage(const struct b2r2_blt_request *req,
case B2R2_BLT_FMT_32_BIT_AYUV8888:
case B2R2_BLT_FMT_24_BIT_VUY888:
case B2R2_BLT_FMT_32_BIT_VUYA8888:
- node->node.GROUP0.B2R2_INS |=
- B2R2_INS_IVMX_ENABLED;
- node->node.GROUP0.B2R2_CIC |= B2R2_CIC_IVMX;
- node->node.GROUP15.B2R2_VMX0 =
- B2R2_VMX0_BLT_YUV888_TO_RGB_601_VIDEO;
- node->node.GROUP15.B2R2_VMX1 =
- B2R2_VMX1_BLT_YUV888_TO_RGB_601_VIDEO;
- node->node.GROUP15.B2R2_VMX2 =
- B2R2_VMX2_BLT_YUV888_TO_RGB_601_VIDEO;
- node->node.GROUP15.B2R2_VMX3 =
- B2R2_VMX3_BLT_YUV888_TO_RGB_601_VIDEO;
+ if (fullrange)
+ b2r2_setup_ivmx(node,
+ B2R2_CC_BLT_YUV888_FULL_TO_RGB);
+ else
+ b2r2_setup_ivmx(node,
+ B2R2_CC_BLT_YUV888_TO_RGB);
/*
* Re-arrange the color components from
* VUY(A) to (A)YUV
@@ -663,14 +645,11 @@ static void setup_fill_input_stage(const struct b2r2_blt_request *req,
* Chroma components are swapped so
* it is YVU and not YUV.
*/
- node->node.GROUP15.B2R2_VMX0 =
- B2R2_VMX0_YVU_TO_RGB_601_VIDEO;
- node->node.GROUP15.B2R2_VMX1 =
- B2R2_VMX1_YVU_TO_RGB_601_VIDEO;
- node->node.GROUP15.B2R2_VMX2 =
- B2R2_VMX2_YVU_TO_RGB_601_VIDEO;
- node->node.GROUP15.B2R2_VMX3 =
- B2R2_VMX3_YVU_TO_RGB_601_VIDEO;
+ if (fullrange)
+ b2r2_setup_ivmx(node,
+ B2R2_CC_YVU_FULL_TO_RGB);
+ else
+ b2r2_setup_ivmx(node, B2R2_CC_YVU_TO_RGB);
break;
default:
/*
@@ -680,17 +659,11 @@ static void setup_fill_input_stage(const struct b2r2_blt_request *req,
* an intermediate buffer which is RGB.
* Hence the conversion from YUV to RGB.
*/
- node->node.GROUP0.B2R2_INS |=
- B2R2_INS_IVMX_ENABLED;
- node->node.GROUP0.B2R2_CIC |= B2R2_CIC_IVMX;
- node->node.GROUP15.B2R2_VMX0 =
- B2R2_VMX0_YUV_TO_RGB_601_VIDEO;
- node->node.GROUP15.B2R2_VMX1 =
- B2R2_VMX1_YUV_TO_RGB_601_VIDEO;
- node->node.GROUP15.B2R2_VMX2 =
- B2R2_VMX2_YUV_TO_RGB_601_VIDEO;
- node->node.GROUP15.B2R2_VMX3 =
- B2R2_VMX3_YUV_TO_RGB_601_VIDEO;
+ if (fullrange)
+ b2r2_setup_ivmx(node,
+ B2R2_CC_YUV_FULL_TO_RGB);
+ else
+ b2r2_setup_ivmx(node, B2R2_CC_YUV_TO_RGB);
break;
}
}
@@ -766,6 +739,8 @@ static void setup_input_stage(const struct b2r2_blt_request *req,
bool use_v_filter = false;
struct b2r2_control *cont = req->instance->control;
+ bool fullrange = (req->user_req.flags &
+ B2R2_BLT_FLAG_FULL_RANGE_YUV) != 0;
b2r2_log_info(cont->dev, "%s ENTRY\n", __func__);
@@ -837,14 +812,7 @@ static void setup_input_stage(const struct b2r2_blt_request *req,
/* Adjustments that depend on the source format */
switch (src_img->fmt) {
case B2R2_BLT_FMT_32_BIT_ABGR8888:
- /* Set up IVMX */
- node->node.GROUP0.B2R2_INS |= B2R2_INS_IVMX_ENABLED;
- node->node.GROUP0.B2R2_CIC |= B2R2_CIC_IVMX;
-
- node->node.GROUP15.B2R2_VMX0 = B2R2_VMX0_RGB_TO_BGR;
- node->node.GROUP15.B2R2_VMX1 = B2R2_VMX1_RGB_TO_BGR;
- node->node.GROUP15.B2R2_VMX2 = B2R2_VMX2_RGB_TO_BGR;
- node->node.GROUP15.B2R2_VMX3 = B2R2_VMX3_RGB_TO_BGR;
+ b2r2_setup_ivmx(node, B2R2_CC_RGB_TO_BGR);
break;
case B2R2_BLT_FMT_Y_CB_Y_CR:
/*
@@ -852,29 +820,16 @@ static void setup_input_stage(const struct b2r2_blt_request *req,
* Chroma components are swapped so
* it is YVU and not YUV.
*/
- node->node.GROUP0.B2R2_INS |= B2R2_INS_IVMX_ENABLED;
- node->node.GROUP0.B2R2_CIC |= B2R2_CIC_IVMX;
- node->node.GROUP15.B2R2_VMX0 =
- B2R2_VMX0_YVU_TO_RGB_601_VIDEO;
- node->node.GROUP15.B2R2_VMX1 =
- B2R2_VMX1_YVU_TO_RGB_601_VIDEO;
- node->node.GROUP15.B2R2_VMX2 =
- B2R2_VMX2_YVU_TO_RGB_601_VIDEO;
- node->node.GROUP15.B2R2_VMX3 =
- B2R2_VMX3_YVU_TO_RGB_601_VIDEO;
+ if (fullrange)
+ b2r2_setup_ivmx(node, B2R2_CC_YVU_FULL_TO_RGB);
+ else
+ b2r2_setup_ivmx(node, B2R2_CC_YVU_TO_RGB);
break;
case B2R2_BLT_FMT_CB_Y_CR_Y:
- /* Set up IVMX */
- node->node.GROUP0.B2R2_INS |= B2R2_INS_IVMX_ENABLED;
- node->node.GROUP0.B2R2_CIC |= B2R2_CIC_IVMX;
- node->node.GROUP15.B2R2_VMX0 =
- B2R2_VMX0_YUV_TO_RGB_601_VIDEO;
- node->node.GROUP15.B2R2_VMX1 =
- B2R2_VMX1_YUV_TO_RGB_601_VIDEO;
- node->node.GROUP15.B2R2_VMX2 =
- B2R2_VMX2_YUV_TO_RGB_601_VIDEO;
- node->node.GROUP15.B2R2_VMX3 =
- B2R2_VMX3_YUV_TO_RGB_601_VIDEO;
+ if (fullrange)
+ b2r2_setup_ivmx(node, B2R2_CC_YUV_FULL_TO_RGB);
+ else
+ b2r2_setup_ivmx(node, B2R2_CC_YUV_TO_RGB);
break;
case B2R2_BLT_FMT_24_BIT_YUV888:
case B2R2_BLT_FMT_32_BIT_AYUV8888:
@@ -889,16 +844,10 @@ static void setup_input_stage(const struct b2r2_blt_request *req,
* B2R2 expects them to be as U, Y, V, (A)
* with U at the first byte.
*/
- node->node.GROUP0.B2R2_INS |= B2R2_INS_IVMX_ENABLED;
- node->node.GROUP0.B2R2_CIC |= B2R2_CIC_IVMX;
- node->node.GROUP15.B2R2_VMX0 =
- B2R2_VMX0_BLT_YUV888_TO_RGB_601_VIDEO;
- node->node.GROUP15.B2R2_VMX1 =
- B2R2_VMX1_BLT_YUV888_TO_RGB_601_VIDEO;
- node->node.GROUP15.B2R2_VMX2 =
- B2R2_VMX2_BLT_YUV888_TO_RGB_601_VIDEO;
- node->node.GROUP15.B2R2_VMX3 =
- B2R2_VMX3_BLT_YUV888_TO_RGB_601_VIDEO;
+ if (fullrange)
+ b2r2_setup_ivmx(node, B2R2_CC_BLT_YUV888_FULL_TO_RGB);
+ else
+ b2r2_setup_ivmx(node, B2R2_CC_BLT_YUV888_TO_RGB);
/*
* Re-arrange color components from VUY(A) to (A)YUV
@@ -927,32 +876,21 @@ static void setup_input_stage(const struct b2r2_blt_request *req,
u32 rsf_luma = 0;
u32 rzi_luma = 0;
- /* Set up IVMX */
- node->node.GROUP0.B2R2_INS |=
- B2R2_INS_IVMX_ENABLED | B2R2_INS_RESCALE2D_ENABLED;
- node->node.GROUP0.B2R2_CIC |=
- B2R2_CIC_IVMX | B2R2_CIC_RESIZE_LUMA;
+ node->node.GROUP0.B2R2_INS |= B2R2_INS_RESCALE2D_ENABLED;
+ node->node.GROUP0.B2R2_CIC |= B2R2_CIC_RESIZE_LUMA;
if (src_img->fmt == B2R2_BLT_FMT_YVU420_PACKED_SEMI_PLANAR ||
src_img->fmt ==
B2R2_BLT_FMT_YVU422_PACKED_SEMI_PLANAR) {
- node->node.GROUP15.B2R2_VMX0 =
- B2R2_VMX0_YVU_TO_RGB_601_VIDEO;
- node->node.GROUP15.B2R2_VMX1 =
- B2R2_VMX1_YVU_TO_RGB_601_VIDEO;
- node->node.GROUP15.B2R2_VMX2 =
- B2R2_VMX2_YVU_TO_RGB_601_VIDEO;
- node->node.GROUP15.B2R2_VMX3 =
- B2R2_VMX3_YVU_TO_RGB_601_VIDEO;
+ if (fullrange)
+ b2r2_setup_ivmx(node, B2R2_CC_YVU_FULL_TO_RGB);
+ else
+ b2r2_setup_ivmx(node, B2R2_CC_YVU_TO_RGB);
} else {
- node->node.GROUP15.B2R2_VMX0 =
- B2R2_VMX0_YUV_TO_RGB_601_VIDEO;
- node->node.GROUP15.B2R2_VMX1 =
- B2R2_VMX1_YUV_TO_RGB_601_VIDEO;
- node->node.GROUP15.B2R2_VMX2 =
- B2R2_VMX2_YUV_TO_RGB_601_VIDEO;
- node->node.GROUP15.B2R2_VMX3 =
- B2R2_VMX3_YUV_TO_RGB_601_VIDEO;
+ if (fullrange)
+ b2r2_setup_ivmx(node, B2R2_CC_YUV_FULL_TO_RGB);
+ else
+ b2r2_setup_ivmx(node, B2R2_CC_YUV_TO_RGB);
}
fctl |= B2R2_FCTL_LUMA_HF2D_MODE_ENABLE_RESIZER |
@@ -1316,6 +1254,8 @@ static void setup_dst_read_stage(const struct b2r2_blt_request *req,
u32 dst_pitch = 0;
struct b2r2_control *cont = req->instance->control;
+ bool fullrange = (req->user_req.flags &
+ B2R2_BLT_FLAG_FULL_RANGE_YUV) != 0;
if (dst_img->pitch == 0) {
/* Determine pitch based on format and width of the image. */
@@ -1329,37 +1269,24 @@ static void setup_dst_read_stage(const struct b2r2_blt_request *req,
/* Adjustments that depend on the destination format */
switch (dst_img->fmt) {
case B2R2_BLT_FMT_32_BIT_ABGR8888:
- /* Set up IVMX */
- node->node.GROUP0.B2R2_INS |= B2R2_INS_IVMX_ENABLED;
- node->node.GROUP0.B2R2_CIC |= B2R2_CIC_IVMX;
-
- node->node.GROUP15.B2R2_VMX0 = B2R2_VMX0_RGB_TO_BGR;
- node->node.GROUP15.B2R2_VMX1 = B2R2_VMX1_RGB_TO_BGR;
- node->node.GROUP15.B2R2_VMX2 = B2R2_VMX2_RGB_TO_BGR;
- node->node.GROUP15.B2R2_VMX3 = B2R2_VMX3_RGB_TO_BGR;
+ b2r2_setup_ivmx(node, B2R2_CC_RGB_TO_BGR);
break;
case B2R2_BLT_FMT_Y_CB_Y_CR:
- /* Set up IVMX */
- node->node.GROUP0.B2R2_INS |= B2R2_INS_IVMX_ENABLED;
- node->node.GROUP0.B2R2_CIC |= B2R2_CIC_IVMX;
/*
* Setup input VMX to convert YVU to RGB 601 VIDEO
* Chroma components are swapped
* so it is YVU and not YUV.
*/
- node->node.GROUP15.B2R2_VMX0 = B2R2_VMX0_YVU_TO_RGB_601_VIDEO;
- node->node.GROUP15.B2R2_VMX1 = B2R2_VMX1_YVU_TO_RGB_601_VIDEO;
- node->node.GROUP15.B2R2_VMX2 = B2R2_VMX2_YVU_TO_RGB_601_VIDEO;
- node->node.GROUP15.B2R2_VMX3 = B2R2_VMX3_YVU_TO_RGB_601_VIDEO;
+ if (fullrange)
+ b2r2_setup_ivmx(node, B2R2_CC_YVU_FULL_TO_RGB);
+ else
+ b2r2_setup_ivmx(node, B2R2_CC_YVU_TO_RGB);
break;
case B2R2_BLT_FMT_CB_Y_CR_Y:
- /* Set up IVMX */
- node->node.GROUP0.B2R2_INS |= B2R2_INS_IVMX_ENABLED;
- node->node.GROUP0.B2R2_CIC |= B2R2_CIC_IVMX;
- node->node.GROUP15.B2R2_VMX0 = B2R2_VMX0_YUV_TO_RGB_601_VIDEO;
- node->node.GROUP15.B2R2_VMX1 = B2R2_VMX1_YUV_TO_RGB_601_VIDEO;
- node->node.GROUP15.B2R2_VMX2 = B2R2_VMX2_YUV_TO_RGB_601_VIDEO;
- node->node.GROUP15.B2R2_VMX3 = B2R2_VMX3_YUV_TO_RGB_601_VIDEO;
+ if (fullrange)
+ b2r2_setup_ivmx(node, B2R2_CC_YUV_FULL_TO_RGB);
+ else
+ b2r2_setup_ivmx(node, B2R2_CC_YUV_TO_RGB);
break;
case B2R2_BLT_FMT_24_BIT_YUV888:
case B2R2_BLT_FMT_32_BIT_AYUV8888:
@@ -1374,16 +1301,10 @@ static void setup_dst_read_stage(const struct b2r2_blt_request *req,
* B2R2 expects them to be as U, Y, V, (A)
* with U at the first byte.
*/
- node->node.GROUP0.B2R2_INS |= B2R2_INS_IVMX_ENABLED;
- node->node.GROUP0.B2R2_CIC |= B2R2_CIC_IVMX;
- node->node.GROUP15.B2R2_VMX0 =
- B2R2_VMX0_BLT_YUV888_TO_RGB_601_VIDEO;
- node->node.GROUP15.B2R2_VMX1 =
- B2R2_VMX1_BLT_YUV888_TO_RGB_601_VIDEO;
- node->node.GROUP15.B2R2_VMX2 =
- B2R2_VMX2_BLT_YUV888_TO_RGB_601_VIDEO;
- node->node.GROUP15.B2R2_VMX3 =
- B2R2_VMX3_BLT_YUV888_TO_RGB_601_VIDEO;
+ if (fullrange)
+ b2r2_setup_ivmx(node, B2R2_CC_BLT_YUV888_FULL_TO_RGB);
+ else
+ b2r2_setup_ivmx(node, B2R2_CC_BLT_YUV888_TO_RGB);
/*
* Re-arrange color components from VUY(A) to (A)YUV
@@ -1404,30 +1325,18 @@ static void setup_dst_read_stage(const struct b2r2_blt_request *req,
case B2R2_BLT_FMT_YVU422_PACKED_SEMI_PLANAR:
case B2R2_BLT_FMT_YUV420_PACKED_SEMIPLANAR_MB_STE:
case B2R2_BLT_FMT_YUV422_PACKED_SEMIPLANAR_MB_STE: {
- /* Set up IVMX */
- node->node.GROUP0.B2R2_INS |= B2R2_INS_IVMX_ENABLED;
- node->node.GROUP0.B2R2_CIC |= B2R2_CIC_IVMX;
-
if (dst_img->fmt == B2R2_BLT_FMT_YVU420_PACKED_SEMI_PLANAR ||
dst_img->fmt ==
B2R2_BLT_FMT_YVU422_PACKED_SEMI_PLANAR) {
- node->node.GROUP15.B2R2_VMX0 =
- B2R2_VMX0_YVU_TO_RGB_601_VIDEO;
- node->node.GROUP15.B2R2_VMX1 =
- B2R2_VMX1_YVU_TO_RGB_601_VIDEO;
- node->node.GROUP15.B2R2_VMX2 =
- B2R2_VMX2_YVU_TO_RGB_601_VIDEO;
- node->node.GROUP15.B2R2_VMX3 =
- B2R2_VMX3_YVU_TO_RGB_601_VIDEO;
+ if (fullrange)
+ b2r2_setup_ivmx(node, B2R2_CC_YVU_FULL_TO_RGB);
+ else
+ b2r2_setup_ivmx(node, B2R2_CC_YVU_TO_RGB);
} else {
- node->node.GROUP15.B2R2_VMX0 =
- B2R2_VMX0_YUV_TO_RGB_601_VIDEO;
- node->node.GROUP15.B2R2_VMX1 =
- B2R2_VMX1_YUV_TO_RGB_601_VIDEO;
- node->node.GROUP15.B2R2_VMX2 =
- B2R2_VMX2_YUV_TO_RGB_601_VIDEO;
- node->node.GROUP15.B2R2_VMX3 =
- B2R2_VMX3_YUV_TO_RGB_601_VIDEO;
+ if (fullrange)
+ b2r2_setup_ivmx(node, B2R2_CC_YUV_FULL_TO_RGB);
+ else
+ b2r2_setup_ivmx(node, B2R2_CC_YUV_TO_RGB);
}
switch (dst_img->fmt) {
@@ -1781,6 +1690,8 @@ static void setup_writeback_stage(const struct b2r2_blt_request *req,
u32 endianness = 0;
struct b2r2_control *cont = req->instance->control;
+ bool fullrange = (req->user_req.flags &
+ B2R2_BLT_FLAG_FULL_RANGE_YUV) != 0;
b2r2_log_info(cont->dev, "%s ENTRY\n", __func__);
@@ -1803,12 +1714,10 @@ static void setup_writeback_stage(const struct b2r2_blt_request *req,
u32 rsf = 0;
const u32 group0_b2r2_ins =
B2R2_INS_SOURCE_2_FETCH_FROM_MEM |
- B2R2_INS_RECT_CLIP_ENABLED |
- B2R2_INS_IVMX_ENABLED;
+ B2R2_INS_RECT_CLIP_ENABLED;
const u32 group0_b2r2_cic =
B2R2_CIC_SOURCE_2 |
- B2R2_CIC_CLIP_WINDOW |
- B2R2_CIC_IVMX;
+ B2R2_CIC_CLIP_WINDOW;
u32 cb_addr = 0;
u32 cr_addr = 0;
@@ -1891,10 +1800,10 @@ static void setup_writeback_stage(const struct b2r2_blt_request *req,
B2R2_TY_VSO_TOP_TO_BOTTOM |
dst_dither;
- node->node.GROUP15.B2R2_VMX0 = B2R2_VMX0_RGB_TO_YUV_601_VIDEO;
- node->node.GROUP15.B2R2_VMX1 = B2R2_VMX1_RGB_TO_YUV_601_VIDEO;
- node->node.GROUP15.B2R2_VMX2 = B2R2_VMX2_RGB_TO_YUV_601_VIDEO;
- node->node.GROUP15.B2R2_VMX3 = B2R2_VMX3_RGB_TO_YUV_601_VIDEO;
+ if (fullrange)
+ b2r2_setup_ivmx(node, B2R2_CC_RGB_TO_YUV_FULL);
+ else
+ b2r2_setup_ivmx(node, B2R2_CC_RGB_TO_YUV);
/* bypass ALU, no blending here. Handled in its own stage. */
node->node.GROUP0.B2R2_ACK = B2R2_ACK_MODE_BYPASS_S2_S3;
@@ -1916,10 +1825,10 @@ static void setup_writeback_stage(const struct b2r2_blt_request *req,
dst_dither |
B2R2_TTY_CHROMA_NOT_LUMA;
- node->node.GROUP15.B2R2_VMX0 = B2R2_VMX0_RGB_TO_YUV_601_VIDEO;
- node->node.GROUP15.B2R2_VMX1 = B2R2_VMX1_RGB_TO_YUV_601_VIDEO;
- node->node.GROUP15.B2R2_VMX2 = B2R2_VMX2_RGB_TO_YUV_601_VIDEO;
- node->node.GROUP15.B2R2_VMX3 = B2R2_VMX3_RGB_TO_YUV_601_VIDEO;
+ if (fullrange)
+ b2r2_setup_ivmx(node, B2R2_CC_RGB_TO_YUV_FULL);
+ else
+ b2r2_setup_ivmx(node, B2R2_CC_RGB_TO_YUV);
node->node.GROUP0.B2R2_ACK = B2R2_ACK_MODE_BYPASS_S2_S3;
node->node.GROUP0.B2R2_INS = group0_b2r2_ins;
@@ -1959,10 +1868,10 @@ static void setup_writeback_stage(const struct b2r2_blt_request *req,
dst_dither |
B2R2_TTY_CHROMA_NOT_LUMA;
- node->node.GROUP15.B2R2_VMX0 = B2R2_VMX0_RGB_TO_YUV_601_VIDEO;
- node->node.GROUP15.B2R2_VMX1 = B2R2_VMX1_RGB_TO_YUV_601_VIDEO;
- node->node.GROUP15.B2R2_VMX2 = B2R2_VMX2_RGB_TO_YUV_601_VIDEO;
- node->node.GROUP15.B2R2_VMX3 = B2R2_VMX3_RGB_TO_YUV_601_VIDEO;
+ if (fullrange)
+ b2r2_setup_ivmx(node, B2R2_CC_RGB_TO_YUV_FULL);
+ else
+ b2r2_setup_ivmx(node, B2R2_CC_RGB_TO_YUV);
node->node.GROUP0.B2R2_ACK = B2R2_ACK_MODE_BYPASS_S2_S3;
node->node.GROUP0.B2R2_INS = group0_b2r2_ins;
@@ -1993,12 +1902,10 @@ static void setup_writeback_stage(const struct b2r2_blt_request *req,
u32 rsf = 0;
const u32 group0_b2r2_ins =
B2R2_INS_SOURCE_2_FETCH_FROM_MEM |
- B2R2_INS_RECT_CLIP_ENABLED |
- B2R2_INS_IVMX_ENABLED;
+ B2R2_INS_RECT_CLIP_ENABLED;
const u32 group0_b2r2_cic =
B2R2_CIC_SOURCE_2 |
- B2R2_CIC_CLIP_WINDOW |
- B2R2_CIC_IVMX;
+ B2R2_CIC_CLIP_WINDOW;
u32 chroma_addr = req->dst_resolved.physical_address +
dst_pitch * dst_img->height;
@@ -2047,23 +1954,15 @@ static void setup_writeback_stage(const struct b2r2_blt_request *req,
if (dst_fmt == B2R2_BLT_FMT_YVU420_PACKED_SEMI_PLANAR ||
dst_fmt == B2R2_BLT_FMT_YVU422_PACKED_SEMI_PLANAR) {
- node->node.GROUP15.B2R2_VMX0 =
- B2R2_VMX0_RGB_TO_YVU_601_VIDEO;
- node->node.GROUP15.B2R2_VMX1 =
- B2R2_VMX1_RGB_TO_YVU_601_VIDEO;
- node->node.GROUP15.B2R2_VMX2 =
- B2R2_VMX2_RGB_TO_YVU_601_VIDEO;
- node->node.GROUP15.B2R2_VMX3 =
- B2R2_VMX3_RGB_TO_YVU_601_VIDEO;
+ if (fullrange)
+ b2r2_setup_ivmx(node, B2R2_CC_RGB_TO_YVU_FULL);
+ else
+ b2r2_setup_ivmx(node, B2R2_CC_RGB_TO_YVU);
} else {
- node->node.GROUP15.B2R2_VMX0 =
- B2R2_VMX0_RGB_TO_YUV_601_VIDEO;
- node->node.GROUP15.B2R2_VMX1 =
- B2R2_VMX1_RGB_TO_YUV_601_VIDEO;
- node->node.GROUP15.B2R2_VMX2 =
- B2R2_VMX2_RGB_TO_YUV_601_VIDEO;
- node->node.GROUP15.B2R2_VMX3 =
- B2R2_VMX3_RGB_TO_YUV_601_VIDEO;
+ if (fullrange)
+ b2r2_setup_ivmx(node, B2R2_CC_RGB_TO_YUV_FULL);
+ else
+ b2r2_setup_ivmx(node, B2R2_CC_RGB_TO_YUV);
}
/* bypass ALU, no blending here. Handled in its own stage. */
@@ -2088,23 +1987,15 @@ static void setup_writeback_stage(const struct b2r2_blt_request *req,
if (dst_fmt == B2R2_BLT_FMT_YVU420_PACKED_SEMI_PLANAR ||
dst_fmt == B2R2_BLT_FMT_YVU422_PACKED_SEMI_PLANAR) {
- node->node.GROUP15.B2R2_VMX0 =
- B2R2_VMX0_RGB_TO_YVU_601_VIDEO;
- node->node.GROUP15.B2R2_VMX1 =
- B2R2_VMX1_RGB_TO_YVU_601_VIDEO;
- node->node.GROUP15.B2R2_VMX2 =
- B2R2_VMX2_RGB_TO_YVU_601_VIDEO;
- node->node.GROUP15.B2R2_VMX3 =
- B2R2_VMX3_RGB_TO_YVU_601_VIDEO;
+ if (fullrange)
+ b2r2_setup_ivmx(node, B2R2_CC_RGB_TO_YVU_FULL);
+ else
+ b2r2_setup_ivmx(node, B2R2_CC_RGB_TO_YVU);
} else {
- node->node.GROUP15.B2R2_VMX0 =
- B2R2_VMX0_RGB_TO_YUV_601_VIDEO;
- node->node.GROUP15.B2R2_VMX1 =
- B2R2_VMX1_RGB_TO_YUV_601_VIDEO;
- node->node.GROUP15.B2R2_VMX2 =
- B2R2_VMX2_RGB_TO_YUV_601_VIDEO;
- node->node.GROUP15.B2R2_VMX3 =
- B2R2_VMX3_RGB_TO_YUV_601_VIDEO;
+ if (fullrange)
+ b2r2_setup_ivmx(node, B2R2_CC_RGB_TO_YUV_FULL);
+ else
+ b2r2_setup_ivmx(node, B2R2_CC_RGB_TO_YUV);
}
node->node.GROUP0.B2R2_ACK = B2R2_ACK_MODE_BYPASS_S2_S3;
@@ -2126,43 +2017,24 @@ static void setup_writeback_stage(const struct b2r2_blt_request *req,
} else {
/* single buffer target */
- /* Set up OVMX */
switch (dst_fmt) {
case B2R2_BLT_FMT_32_BIT_ABGR8888:
- node->node.GROUP0.B2R2_INS |= B2R2_INS_OVMX_ENABLED;
- node->node.GROUP0.B2R2_CIC |= B2R2_CIC_OVMX;
- node->node.GROUP16.B2R2_VMX0 = B2R2_VMX0_RGB_TO_BGR;
- node->node.GROUP16.B2R2_VMX1 = B2R2_VMX1_RGB_TO_BGR;
- node->node.GROUP16.B2R2_VMX2 = B2R2_VMX2_RGB_TO_BGR;
- node->node.GROUP16.B2R2_VMX3 = B2R2_VMX3_RGB_TO_BGR;
+ b2r2_setup_ovmx(node, B2R2_CC_RGB_TO_BGR);
break;
case B2R2_BLT_FMT_Y_CB_Y_CR:
- node->node.GROUP0.B2R2_INS |= B2R2_INS_OVMX_ENABLED;
- node->node.GROUP0.B2R2_CIC |= B2R2_CIC_OVMX;
- node->node.GROUP16.B2R2_VMX0 =
- B2R2_VMX0_RGB_TO_YVU_601_VIDEO;
- node->node.GROUP16.B2R2_VMX1 =
- B2R2_VMX1_RGB_TO_YVU_601_VIDEO;
- node->node.GROUP16.B2R2_VMX2 =
- B2R2_VMX2_RGB_TO_YVU_601_VIDEO;
- node->node.GROUP16.B2R2_VMX3 =
- B2R2_VMX3_RGB_TO_YVU_601_VIDEO;
+ if (fullrange)
+ b2r2_setup_ovmx(node, B2R2_CC_RGB_TO_YVU_FULL);
+ else
+ b2r2_setup_ovmx(node, B2R2_CC_RGB_TO_YVU);
break;
case B2R2_BLT_FMT_24_BIT_YUV888: /* fall through */
case B2R2_BLT_FMT_32_BIT_AYUV8888: /* fall through */
case B2R2_BLT_FMT_24_BIT_VUY888: /* fall through */
case B2R2_BLT_FMT_32_BIT_VUYA8888:
- node->node.GROUP0.B2R2_INS |= B2R2_INS_OVMX_ENABLED;
- node->node.GROUP0.B2R2_CIC |= B2R2_CIC_OVMX;
- node->node.GROUP16.B2R2_VMX0 =
- B2R2_VMX0_RGB_TO_BLT_YUV888_601_VIDEO;
- node->node.GROUP16.B2R2_VMX1 =
- B2R2_VMX1_RGB_TO_BLT_YUV888_601_VIDEO;
- node->node.GROUP16.B2R2_VMX2 =
- B2R2_VMX2_RGB_TO_BLT_YUV888_601_VIDEO;
- node->node.GROUP16.B2R2_VMX3 =
- B2R2_VMX3_RGB_TO_BLT_YUV888_601_VIDEO;
-
+ if (fullrange)
+ b2r2_setup_ovmx(node, B2R2_CC_RGB_TO_BLT_YUV888_FULL);
+ else
+ b2r2_setup_ovmx(node, B2R2_CC_RGB_TO_BLT_YUV888);
/*
* Re-arrange color components from (A)YUV to VUY(A)
* when bytes are stored in memory.