|
@@ -117,6 +117,33 @@ static const struct dcn10_input_csc_matrix dcn10_input_csc_matrix[] = {
|
|
|
0x2568, 0x43ee, 0xdbb2} }
|
|
|
};
|
|
|
|
|
|
+struct output_csc_matrix {
|
|
|
+ enum dc_color_space color_space;
|
|
|
+ uint16_t regval[12];
|
|
|
+};
|
|
|
+
|
|
|
+static const struct output_csc_matrix output_csc_matrix[] = {
|
|
|
+ { COLOR_SPACE_SRGB,
|
|
|
+ { 0x2000, 0, 0, 0, 0, 0x2000, 0, 0, 0, 0, 0x2000, 0} },
|
|
|
+ { COLOR_SPACE_SRGB_LIMITED,
|
|
|
+ { 0x1B60, 0, 0, 0x200, 0, 0x1B60, 0, 0x200, 0, 0, 0x1B60, 0x200} },
|
|
|
+ { COLOR_SPACE_YCBCR601,
|
|
|
+ { 0xE00, 0xF447, 0xFDB9, 0x1000, 0x82F, 0x1012, 0x31F, 0x200, 0xFB47,
|
|
|
+ 0xF6B9, 0xE00, 0x1000} },
|
|
|
+ { COLOR_SPACE_YCBCR709,
|
|
|
+ { 0xE00, 0xF349, 0xFEB7, 0x1000, 0x5D2, 0x1394, 0x1FA,
|
|
|
+ 0x200, 0xFCCB, 0xF535, 0xE00, 0x1000} },
|
|
|
+
|
|
|
+ /* TODO: correct values below */
|
|
|
+ { COLOR_SPACE_YCBCR601_LIMITED,
|
|
|
+ { 0xE00, 0xF447, 0xFDB9, 0x1000, 0x991,
|
|
|
+ 0x12C9, 0x3A6, 0x200, 0xFB47, 0xF6B9, 0xE00, 0x1000} },
|
|
|
+ { COLOR_SPACE_YCBCR709_LIMITED,
|
|
|
+ { 0xE00, 0xF349, 0xFEB7, 0x1000, 0x6CE, 0x16E3,
|
|
|
+ 0x24F, 0x200, 0xFCCB, 0xF535, 0xE00, 0x1000} },
|
|
|
+ { COLOR_SPACE_UNKNOWN,
|
|
|
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} }
|
|
|
+};
|
|
|
|
|
|
|
|
|
static void program_gamut_remap(
|
|
@@ -223,68 +250,6 @@ void dpp1_cm_set_gamut_remap(
|
|
|
}
|
|
|
}
|
|
|
|
|
|
-void dpp1_cm_set_output_csc_default(
|
|
|
- struct dpp *dpp_base,
|
|
|
- enum dc_color_space colorspace)
|
|
|
-{
|
|
|
-
|
|
|
- struct dcn10_dpp *dpp = TO_DCN10_DPP(dpp_base);
|
|
|
- uint32_t ocsc_mode = 0;
|
|
|
-
|
|
|
- switch (colorspace) {
|
|
|
- case COLOR_SPACE_SRGB:
|
|
|
- case COLOR_SPACE_2020_RGB_FULLRANGE:
|
|
|
- ocsc_mode = 0;
|
|
|
- break;
|
|
|
- case COLOR_SPACE_SRGB_LIMITED:
|
|
|
- case COLOR_SPACE_2020_RGB_LIMITEDRANGE:
|
|
|
- ocsc_mode = 1;
|
|
|
- break;
|
|
|
- case COLOR_SPACE_YCBCR601:
|
|
|
- case COLOR_SPACE_YCBCR601_LIMITED:
|
|
|
- ocsc_mode = 2;
|
|
|
- break;
|
|
|
- case COLOR_SPACE_YCBCR709:
|
|
|
- case COLOR_SPACE_YCBCR709_LIMITED:
|
|
|
- case COLOR_SPACE_2020_YCBCR:
|
|
|
- ocsc_mode = 3;
|
|
|
- break;
|
|
|
- case COLOR_SPACE_UNKNOWN:
|
|
|
- default:
|
|
|
- break;
|
|
|
- }
|
|
|
-
|
|
|
- REG_SET(CM_OCSC_CONTROL, 0, CM_OCSC_MODE, ocsc_mode);
|
|
|
-
|
|
|
-}
|
|
|
-
|
|
|
-static void dpp1_cm_get_reg_field(
|
|
|
- struct dcn10_dpp *dpp,
|
|
|
- struct xfer_func_reg *reg)
|
|
|
-{
|
|
|
- reg->shifts.exp_region0_lut_offset = dpp->tf_shift->CM_RGAM_RAMA_EXP_REGION0_LUT_OFFSET;
|
|
|
- reg->masks.exp_region0_lut_offset = dpp->tf_mask->CM_RGAM_RAMA_EXP_REGION0_LUT_OFFSET;
|
|
|
- reg->shifts.exp_region0_num_segments = dpp->tf_shift->CM_RGAM_RAMA_EXP_REGION0_NUM_SEGMENTS;
|
|
|
- reg->masks.exp_region0_num_segments = dpp->tf_mask->CM_RGAM_RAMA_EXP_REGION0_NUM_SEGMENTS;
|
|
|
- reg->shifts.exp_region1_lut_offset = dpp->tf_shift->CM_RGAM_RAMA_EXP_REGION1_LUT_OFFSET;
|
|
|
- reg->masks.exp_region1_lut_offset = dpp->tf_mask->CM_RGAM_RAMA_EXP_REGION1_LUT_OFFSET;
|
|
|
- reg->shifts.exp_region1_num_segments = dpp->tf_shift->CM_RGAM_RAMA_EXP_REGION1_NUM_SEGMENTS;
|
|
|
- reg->masks.exp_region1_num_segments = dpp->tf_mask->CM_RGAM_RAMA_EXP_REGION1_NUM_SEGMENTS;
|
|
|
-
|
|
|
- reg->shifts.field_region_end = dpp->tf_shift->CM_RGAM_RAMB_EXP_REGION_END_B;
|
|
|
- reg->masks.field_region_end = dpp->tf_mask->CM_RGAM_RAMB_EXP_REGION_END_B;
|
|
|
- reg->shifts.field_region_end_slope = dpp->tf_shift->CM_RGAM_RAMB_EXP_REGION_END_SLOPE_B;
|
|
|
- reg->masks.field_region_end_slope = dpp->tf_mask->CM_RGAM_RAMB_EXP_REGION_END_SLOPE_B;
|
|
|
- reg->shifts.field_region_end_base = dpp->tf_shift->CM_RGAM_RAMB_EXP_REGION_END_BASE_B;
|
|
|
- reg->masks.field_region_end_base = dpp->tf_mask->CM_RGAM_RAMB_EXP_REGION_END_BASE_B;
|
|
|
- reg->shifts.field_region_linear_slope = dpp->tf_shift->CM_RGAM_RAMB_EXP_REGION_LINEAR_SLOPE_B;
|
|
|
- reg->masks.field_region_linear_slope = dpp->tf_mask->CM_RGAM_RAMB_EXP_REGION_LINEAR_SLOPE_B;
|
|
|
- reg->shifts.exp_region_start = dpp->tf_shift->CM_RGAM_RAMB_EXP_REGION_START_B;
|
|
|
- reg->masks.exp_region_start = dpp->tf_mask->CM_RGAM_RAMB_EXP_REGION_START_B;
|
|
|
- reg->shifts.exp_resion_start_segment = dpp->tf_shift->CM_RGAM_RAMB_EXP_REGION_START_SEGMENT_B;
|
|
|
- reg->masks.exp_resion_start_segment = dpp->tf_mask->CM_RGAM_RAMB_EXP_REGION_START_SEGMENT_B;
|
|
|
-}
|
|
|
-
|
|
|
static void dpp1_cm_program_color_matrix(
|
|
|
struct dcn10_dpp *dpp,
|
|
|
const struct out_csc_color_matrix *tbl_entry)
|
|
@@ -326,6 +291,57 @@ static void dpp1_cm_program_color_matrix(
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+void dpp1_cm_set_output_csc_default(
|
|
|
+ struct dpp *dpp_base,
|
|
|
+ enum dc_color_space colorspace)
|
|
|
+{
|
|
|
+
|
|
|
+ struct dcn10_dpp *dpp = TO_DCN10_DPP(dpp_base);
|
|
|
+ struct out_csc_color_matrix tbl_entry;
|
|
|
+ int i, j;
|
|
|
+ int arr_size = sizeof(output_csc_matrix) / sizeof(struct output_csc_matrix);
|
|
|
+ uint32_t ocsc_mode = 4;
|
|
|
+
|
|
|
+ tbl_entry.color_space = colorspace;
|
|
|
+
|
|
|
+ for (i = 0; i < arr_size; i++)
|
|
|
+ if (output_csc_matrix[i].color_space == colorspace) {
|
|
|
+ for (j = 0; j < 12; j++)
|
|
|
+ tbl_entry.regval[j] = output_csc_matrix[i].regval[j];
|
|
|
+ break;
|
|
|
+ }
|
|
|
+
|
|
|
+ REG_SET(CM_OCSC_CONTROL, 0, CM_OCSC_MODE, ocsc_mode);
|
|
|
+ dpp1_cm_program_color_matrix(dpp, &tbl_entry);
|
|
|
+}
|
|
|
+
|
|
|
+static void dpp1_cm_get_reg_field(
|
|
|
+ struct dcn10_dpp *dpp,
|
|
|
+ struct xfer_func_reg *reg)
|
|
|
+{
|
|
|
+ reg->shifts.exp_region0_lut_offset = dpp->tf_shift->CM_RGAM_RAMA_EXP_REGION0_LUT_OFFSET;
|
|
|
+ reg->masks.exp_region0_lut_offset = dpp->tf_mask->CM_RGAM_RAMA_EXP_REGION0_LUT_OFFSET;
|
|
|
+ reg->shifts.exp_region0_num_segments = dpp->tf_shift->CM_RGAM_RAMA_EXP_REGION0_NUM_SEGMENTS;
|
|
|
+ reg->masks.exp_region0_num_segments = dpp->tf_mask->CM_RGAM_RAMA_EXP_REGION0_NUM_SEGMENTS;
|
|
|
+ reg->shifts.exp_region1_lut_offset = dpp->tf_shift->CM_RGAM_RAMA_EXP_REGION1_LUT_OFFSET;
|
|
|
+ reg->masks.exp_region1_lut_offset = dpp->tf_mask->CM_RGAM_RAMA_EXP_REGION1_LUT_OFFSET;
|
|
|
+ reg->shifts.exp_region1_num_segments = dpp->tf_shift->CM_RGAM_RAMA_EXP_REGION1_NUM_SEGMENTS;
|
|
|
+ reg->masks.exp_region1_num_segments = dpp->tf_mask->CM_RGAM_RAMA_EXP_REGION1_NUM_SEGMENTS;
|
|
|
+
|
|
|
+ reg->shifts.field_region_end = dpp->tf_shift->CM_RGAM_RAMB_EXP_REGION_END_B;
|
|
|
+ reg->masks.field_region_end = dpp->tf_mask->CM_RGAM_RAMB_EXP_REGION_END_B;
|
|
|
+ reg->shifts.field_region_end_slope = dpp->tf_shift->CM_RGAM_RAMB_EXP_REGION_END_SLOPE_B;
|
|
|
+ reg->masks.field_region_end_slope = dpp->tf_mask->CM_RGAM_RAMB_EXP_REGION_END_SLOPE_B;
|
|
|
+ reg->shifts.field_region_end_base = dpp->tf_shift->CM_RGAM_RAMB_EXP_REGION_END_BASE_B;
|
|
|
+ reg->masks.field_region_end_base = dpp->tf_mask->CM_RGAM_RAMB_EXP_REGION_END_BASE_B;
|
|
|
+ reg->shifts.field_region_linear_slope = dpp->tf_shift->CM_RGAM_RAMB_EXP_REGION_LINEAR_SLOPE_B;
|
|
|
+ reg->masks.field_region_linear_slope = dpp->tf_mask->CM_RGAM_RAMB_EXP_REGION_LINEAR_SLOPE_B;
|
|
|
+ reg->shifts.exp_region_start = dpp->tf_shift->CM_RGAM_RAMB_EXP_REGION_START_B;
|
|
|
+ reg->masks.exp_region_start = dpp->tf_mask->CM_RGAM_RAMB_EXP_REGION_START_B;
|
|
|
+ reg->shifts.exp_resion_start_segment = dpp->tf_shift->CM_RGAM_RAMB_EXP_REGION_START_SEGMENT_B;
|
|
|
+ reg->masks.exp_resion_start_segment = dpp->tf_mask->CM_RGAM_RAMB_EXP_REGION_START_SEGMENT_B;
|
|
|
+}
|
|
|
+
|
|
|
void dpp1_cm_set_output_csc_adjustment(
|
|
|
struct dpp *dpp_base,
|
|
|
const struct out_csc_color_matrix *tbl_entry)
|