mirror of
https://github.com/torvalds/linux.git
synced 2026-05-23 14:42:08 +02:00
drm/amd/display: Add dpp_get_gamut_remap functions
We want to be able to read the DPP's gamut remap matrix. v2: - code-style and doc comments clean-up (Melissa) Signed-off-by: Harry Wentland <harry.wentland@amd.com> Signed-off-by: Melissa Wen <mwen@igalia.com> Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
This commit is contained in:
parent
efbfc987a3
commit
07b2483ee1
|
|
@ -101,6 +101,40 @@ void convert_float_matrix(
|
|||
}
|
||||
}
|
||||
|
||||
static struct fixed31_32 int_frac_to_fixed_point(uint16_t arg,
|
||||
uint8_t integer_bits,
|
||||
uint8_t fractional_bits)
|
||||
{
|
||||
struct fixed31_32 result;
|
||||
uint16_t sign_mask = 1 << (fractional_bits + integer_bits);
|
||||
uint16_t value_mask = sign_mask - 1;
|
||||
|
||||
result.value = (long long)(arg & value_mask) <<
|
||||
(FIXED31_32_BITS_PER_FRACTIONAL_PART - fractional_bits);
|
||||
|
||||
if (arg & sign_mask)
|
||||
result = dc_fixpt_neg(result);
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
/**
|
||||
* convert_hw_matrix - converts HW values into fixed31_32 matrix.
|
||||
* @matrix: fixed point 31.32 matrix
|
||||
* @reg: array of register values
|
||||
* @buffer_size: size of the array of register values
|
||||
*
|
||||
* Converts HW register spec defined format S2D13 into a fixed-point 31.32
|
||||
* matrix.
|
||||
*/
|
||||
void convert_hw_matrix(struct fixed31_32 *matrix,
|
||||
uint16_t *reg,
|
||||
uint32_t buffer_size)
|
||||
{
|
||||
for (int i = 0; i < buffer_size; ++i)
|
||||
matrix[i] = int_frac_to_fixed_point(reg[i], 2, 13);
|
||||
}
|
||||
|
||||
static uint32_t find_gcd(uint32_t a, uint32_t b)
|
||||
{
|
||||
uint32_t remainder;
|
||||
|
|
|
|||
|
|
@ -41,6 +41,10 @@ void convert_float_matrix(
|
|||
void reduce_fraction(uint32_t num, uint32_t den,
|
||||
uint32_t *out_num, uint32_t *out_den);
|
||||
|
||||
void convert_hw_matrix(struct fixed31_32 *matrix,
|
||||
uint16_t *reg,
|
||||
uint32_t buffer_size);
|
||||
|
||||
static inline unsigned int log_2(unsigned int num)
|
||||
{
|
||||
return ilog2(num);
|
||||
|
|
|
|||
|
|
@ -62,6 +62,26 @@ void cm_helper_program_color_matrices(
|
|||
|
||||
}
|
||||
|
||||
void cm_helper_read_color_matrices(struct dc_context *ctx,
|
||||
uint16_t *regval,
|
||||
const struct color_matrices_reg *reg)
|
||||
{
|
||||
uint32_t cur_csc_reg, regval0, regval1;
|
||||
unsigned int i = 0;
|
||||
|
||||
for (cur_csc_reg = reg->csc_c11_c12;
|
||||
cur_csc_reg <= reg->csc_c33_c34; cur_csc_reg++) {
|
||||
REG_GET_2(cur_csc_reg,
|
||||
csc_c11, ®val0,
|
||||
csc_c12, ®val1);
|
||||
|
||||
regval[2 * i] = regval0;
|
||||
regval[(2 * i) + 1] = regval1;
|
||||
|
||||
i++;
|
||||
}
|
||||
}
|
||||
|
||||
void cm_helper_program_xfer_func(
|
||||
struct dc_context *ctx,
|
||||
const struct pwl_params *params,
|
||||
|
|
|
|||
|
|
@ -114,5 +114,7 @@ bool cm_helper_translate_curve_to_degamma_hw_format(
|
|||
const struct dc_transfer_func *output_tf,
|
||||
struct pwl_params *lut_params);
|
||||
|
||||
|
||||
void cm_helper_read_color_matrices(struct dc_context *ctx,
|
||||
uint16_t *regval,
|
||||
const struct color_matrices_reg *reg);
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -543,7 +543,8 @@ static const struct dpp_funcs dcn10_dpp_funcs = {
|
|||
.dpp_set_hdr_multiplier = dpp1_set_hdr_multiplier,
|
||||
.dpp_program_blnd_lut = NULL,
|
||||
.dpp_program_shaper_lut = NULL,
|
||||
.dpp_program_3dlut = NULL
|
||||
.dpp_program_3dlut = NULL,
|
||||
.dpp_get_gamut_remap = dpp1_cm_get_gamut_remap,
|
||||
};
|
||||
|
||||
static struct dpp_caps dcn10_dpp_cap = {
|
||||
|
|
|
|||
|
|
@ -1521,4 +1521,7 @@ void dpp1_construct(struct dcn10_dpp *dpp1,
|
|||
const struct dcn_dpp_registers *tf_regs,
|
||||
const struct dcn_dpp_shift *tf_shift,
|
||||
const struct dcn_dpp_mask *tf_mask);
|
||||
|
||||
void dpp1_cm_get_gamut_remap(struct dpp *dpp_base,
|
||||
struct dpp_grph_csc_adjustment *adjust);
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -98,7 +98,7 @@ static void program_gamut_remap(
|
|||
|
||||
if (regval == NULL || select == GAMUT_REMAP_BYPASS) {
|
||||
REG_SET(CM_GAMUT_REMAP_CONTROL, 0,
|
||||
CM_GAMUT_REMAP_MODE, 0);
|
||||
CM_GAMUT_REMAP_MODE, 0);
|
||||
return;
|
||||
}
|
||||
switch (select) {
|
||||
|
|
@ -181,6 +181,74 @@ void dpp1_cm_set_gamut_remap(
|
|||
}
|
||||
}
|
||||
|
||||
static void read_gamut_remap(struct dcn10_dpp *dpp,
|
||||
uint16_t *regval,
|
||||
enum gamut_remap_select *select)
|
||||
{
|
||||
struct color_matrices_reg gam_regs;
|
||||
uint32_t selection;
|
||||
|
||||
REG_GET(CM_GAMUT_REMAP_CONTROL,
|
||||
CM_GAMUT_REMAP_MODE, &selection);
|
||||
|
||||
*select = selection;
|
||||
|
||||
gam_regs.shifts.csc_c11 = dpp->tf_shift->CM_GAMUT_REMAP_C11;
|
||||
gam_regs.masks.csc_c11 = dpp->tf_mask->CM_GAMUT_REMAP_C11;
|
||||
gam_regs.shifts.csc_c12 = dpp->tf_shift->CM_GAMUT_REMAP_C12;
|
||||
gam_regs.masks.csc_c12 = dpp->tf_mask->CM_GAMUT_REMAP_C12;
|
||||
|
||||
if (*select == GAMUT_REMAP_COEFF) {
|
||||
|
||||
gam_regs.csc_c11_c12 = REG(CM_GAMUT_REMAP_C11_C12);
|
||||
gam_regs.csc_c33_c34 = REG(CM_GAMUT_REMAP_C33_C34);
|
||||
|
||||
cm_helper_read_color_matrices(
|
||||
dpp->base.ctx,
|
||||
regval,
|
||||
&gam_regs);
|
||||
|
||||
} else if (*select == GAMUT_REMAP_COMA_COEFF) {
|
||||
|
||||
gam_regs.csc_c11_c12 = REG(CM_COMA_C11_C12);
|
||||
gam_regs.csc_c33_c34 = REG(CM_COMA_C33_C34);
|
||||
|
||||
cm_helper_read_color_matrices(
|
||||
dpp->base.ctx,
|
||||
regval,
|
||||
&gam_regs);
|
||||
|
||||
} else if (*select == GAMUT_REMAP_COMB_COEFF) {
|
||||
|
||||
gam_regs.csc_c11_c12 = REG(CM_COMB_C11_C12);
|
||||
gam_regs.csc_c33_c34 = REG(CM_COMB_C33_C34);
|
||||
|
||||
cm_helper_read_color_matrices(
|
||||
dpp->base.ctx,
|
||||
regval,
|
||||
&gam_regs);
|
||||
}
|
||||
}
|
||||
|
||||
void dpp1_cm_get_gamut_remap(struct dpp *dpp_base,
|
||||
struct dpp_grph_csc_adjustment *adjust)
|
||||
{
|
||||
struct dcn10_dpp *dpp = TO_DCN10_DPP(dpp_base);
|
||||
uint16_t arr_reg_val[12];
|
||||
enum gamut_remap_select select;
|
||||
|
||||
read_gamut_remap(dpp, arr_reg_val, &select);
|
||||
|
||||
if (select == GAMUT_REMAP_BYPASS) {
|
||||
adjust->gamut_adjust_type = GRAPHICS_GAMUT_ADJUST_TYPE_BYPASS;
|
||||
return;
|
||||
}
|
||||
|
||||
adjust->gamut_adjust_type = GRAPHICS_GAMUT_ADJUST_TYPE_SW;
|
||||
convert_hw_matrix(adjust->temperature_matrix,
|
||||
arr_reg_val, ARRAY_SIZE(arr_reg_val));
|
||||
}
|
||||
|
||||
static void dpp1_cm_program_color_matrix(
|
||||
struct dcn10_dpp *dpp,
|
||||
const uint16_t *regval)
|
||||
|
|
|
|||
|
|
@ -393,6 +393,7 @@ static struct dpp_funcs dcn20_dpp_funcs = {
|
|||
.set_optional_cursor_attributes = dpp1_cnv_set_optional_cursor_attributes,
|
||||
.dpp_dppclk_control = dpp1_dppclk_control,
|
||||
.dpp_set_hdr_multiplier = dpp2_set_hdr_multiplier,
|
||||
.dpp_get_gamut_remap = dpp2_cm_get_gamut_remap,
|
||||
};
|
||||
|
||||
static struct dpp_caps dcn20_dpp_cap = {
|
||||
|
|
|
|||
|
|
@ -775,4 +775,7 @@ bool dpp2_construct(struct dcn20_dpp *dpp2,
|
|||
void dpp2_power_on_obuf(
|
||||
struct dpp *dpp_base,
|
||||
bool power_on);
|
||||
|
||||
void dpp2_cm_get_gamut_remap(struct dpp *dpp_base,
|
||||
struct dpp_grph_csc_adjustment *adjust);
|
||||
#endif /* __DC_HWSS_DCN20_H__ */
|
||||
|
|
|
|||
|
|
@ -234,6 +234,61 @@ void dpp2_cm_set_gamut_remap(
|
|||
}
|
||||
}
|
||||
|
||||
static void read_gamut_remap(struct dcn20_dpp *dpp,
|
||||
uint16_t *regval,
|
||||
enum dcn20_gamut_remap_select *select)
|
||||
{
|
||||
struct color_matrices_reg gam_regs;
|
||||
uint32_t selection;
|
||||
|
||||
IX_REG_GET(CM_TEST_DEBUG_INDEX, CM_TEST_DEBUG_DATA,
|
||||
CM_TEST_DEBUG_DATA_STATUS_IDX,
|
||||
CM_TEST_DEBUG_DATA_GAMUT_REMAP_MODE, &selection);
|
||||
|
||||
*select = selection;
|
||||
|
||||
gam_regs.shifts.csc_c11 = dpp->tf_shift->CM_GAMUT_REMAP_C11;
|
||||
gam_regs.masks.csc_c11 = dpp->tf_mask->CM_GAMUT_REMAP_C11;
|
||||
gam_regs.shifts.csc_c12 = dpp->tf_shift->CM_GAMUT_REMAP_C12;
|
||||
gam_regs.masks.csc_c12 = dpp->tf_mask->CM_GAMUT_REMAP_C12;
|
||||
|
||||
if (*select == DCN2_GAMUT_REMAP_COEF_A) {
|
||||
gam_regs.csc_c11_c12 = REG(CM_GAMUT_REMAP_C11_C12);
|
||||
gam_regs.csc_c33_c34 = REG(CM_GAMUT_REMAP_C33_C34);
|
||||
|
||||
cm_helper_read_color_matrices(dpp->base.ctx,
|
||||
regval,
|
||||
&gam_regs);
|
||||
|
||||
} else if (*select == DCN2_GAMUT_REMAP_COEF_B) {
|
||||
gam_regs.csc_c11_c12 = REG(CM_GAMUT_REMAP_B_C11_C12);
|
||||
gam_regs.csc_c33_c34 = REG(CM_GAMUT_REMAP_B_C33_C34);
|
||||
|
||||
cm_helper_read_color_matrices(dpp->base.ctx,
|
||||
regval,
|
||||
&gam_regs);
|
||||
}
|
||||
}
|
||||
|
||||
void dpp2_cm_get_gamut_remap(struct dpp *dpp_base,
|
||||
struct dpp_grph_csc_adjustment *adjust)
|
||||
{
|
||||
struct dcn20_dpp *dpp = TO_DCN20_DPP(dpp_base);
|
||||
uint16_t arr_reg_val[12];
|
||||
enum dcn20_gamut_remap_select select;
|
||||
|
||||
read_gamut_remap(dpp, arr_reg_val, &select);
|
||||
|
||||
if (select == DCN2_GAMUT_REMAP_BYPASS) {
|
||||
adjust->gamut_adjust_type = GRAPHICS_GAMUT_ADJUST_TYPE_BYPASS;
|
||||
return;
|
||||
}
|
||||
|
||||
adjust->gamut_adjust_type = GRAPHICS_GAMUT_ADJUST_TYPE_SW;
|
||||
convert_hw_matrix(adjust->temperature_matrix,
|
||||
arr_reg_val, ARRAY_SIZE(arr_reg_val));
|
||||
}
|
||||
|
||||
void dpp2_program_input_csc(
|
||||
struct dpp *dpp_base,
|
||||
enum dc_color_space color_space,
|
||||
|
|
|
|||
|
|
@ -275,6 +275,7 @@ static struct dpp_funcs dcn201_dpp_funcs = {
|
|||
.set_optional_cursor_attributes = dpp1_cnv_set_optional_cursor_attributes,
|
||||
.dpp_dppclk_control = dpp1_dppclk_control,
|
||||
.dpp_set_hdr_multiplier = dpp2_set_hdr_multiplier,
|
||||
.dpp_get_gamut_remap = dpp2_cm_get_gamut_remap,
|
||||
};
|
||||
|
||||
static struct dpp_caps dcn201_dpp_cap = {
|
||||
|
|
|
|||
|
|
@ -1462,6 +1462,7 @@ static struct dpp_funcs dcn30_dpp_funcs = {
|
|||
.set_optional_cursor_attributes = dpp1_cnv_set_optional_cursor_attributes,
|
||||
.dpp_dppclk_control = dpp1_dppclk_control,
|
||||
.dpp_set_hdr_multiplier = dpp3_set_hdr_multiplier,
|
||||
.dpp_get_gamut_remap = dpp3_cm_get_gamut_remap,
|
||||
};
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -637,4 +637,6 @@ void dpp3_program_cm_dealpha(
|
|||
struct dpp *dpp_base,
|
||||
uint32_t enable, uint32_t additive_blending);
|
||||
|
||||
void dpp3_cm_get_gamut_remap(struct dpp *dpp_base,
|
||||
struct dpp_grph_csc_adjustment *adjust);
|
||||
#endif /* __DC_HWSS_DCN30_H__ */
|
||||
|
|
|
|||
|
|
@ -408,3 +408,57 @@ void dpp3_cm_set_gamut_remap(
|
|||
program_gamut_remap(dpp, arr_reg_val, gamut_mode);
|
||||
}
|
||||
}
|
||||
|
||||
static void read_gamut_remap(struct dcn3_dpp *dpp,
|
||||
uint16_t *regval,
|
||||
int *select)
|
||||
{
|
||||
struct color_matrices_reg gam_regs;
|
||||
uint32_t selection;
|
||||
|
||||
//current coefficient set in use
|
||||
REG_GET(CM_GAMUT_REMAP_CONTROL, CM_GAMUT_REMAP_MODE_CURRENT, &selection);
|
||||
|
||||
*select = selection;
|
||||
|
||||
gam_regs.shifts.csc_c11 = dpp->tf_shift->CM_GAMUT_REMAP_C11;
|
||||
gam_regs.masks.csc_c11 = dpp->tf_mask->CM_GAMUT_REMAP_C11;
|
||||
gam_regs.shifts.csc_c12 = dpp->tf_shift->CM_GAMUT_REMAP_C12;
|
||||
gam_regs.masks.csc_c12 = dpp->tf_mask->CM_GAMUT_REMAP_C12;
|
||||
|
||||
if (*select == GAMUT_REMAP_COEFF) {
|
||||
gam_regs.csc_c11_c12 = REG(CM_GAMUT_REMAP_C11_C12);
|
||||
gam_regs.csc_c33_c34 = REG(CM_GAMUT_REMAP_C33_C34);
|
||||
|
||||
cm_helper_read_color_matrices(dpp->base.ctx,
|
||||
regval,
|
||||
&gam_regs);
|
||||
|
||||
} else if (*select == GAMUT_REMAP_COMA_COEFF) {
|
||||
gam_regs.csc_c11_c12 = REG(CM_GAMUT_REMAP_B_C11_C12);
|
||||
gam_regs.csc_c33_c34 = REG(CM_GAMUT_REMAP_B_C33_C34);
|
||||
|
||||
cm_helper_read_color_matrices(dpp->base.ctx,
|
||||
regval,
|
||||
&gam_regs);
|
||||
}
|
||||
}
|
||||
|
||||
void dpp3_cm_get_gamut_remap(struct dpp *dpp_base,
|
||||
struct dpp_grph_csc_adjustment *adjust)
|
||||
{
|
||||
struct dcn3_dpp *dpp = TO_DCN30_DPP(dpp_base);
|
||||
uint16_t arr_reg_val[12];
|
||||
int select;
|
||||
|
||||
read_gamut_remap(dpp, arr_reg_val, &select);
|
||||
|
||||
if (select == GAMUT_REMAP_BYPASS) {
|
||||
adjust->gamut_adjust_type = GRAPHICS_GAMUT_ADJUST_TYPE_BYPASS;
|
||||
return;
|
||||
}
|
||||
|
||||
adjust->gamut_adjust_type = GRAPHICS_GAMUT_ADJUST_TYPE_SW;
|
||||
convert_hw_matrix(adjust->temperature_matrix,
|
||||
arr_reg_val, ARRAY_SIZE(arr_reg_val));
|
||||
}
|
||||
|
|
|
|||
|
|
@ -133,6 +133,7 @@ static struct dpp_funcs dcn32_dpp_funcs = {
|
|||
.set_optional_cursor_attributes = dpp1_cnv_set_optional_cursor_attributes,
|
||||
.dpp_dppclk_control = dpp1_dppclk_control,
|
||||
.dpp_set_hdr_multiplier = dpp3_set_hdr_multiplier,
|
||||
.dpp_get_gamut_remap = dpp3_cm_get_gamut_remap,
|
||||
};
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -290,6 +290,9 @@ struct dpp_funcs {
|
|||
void (*dpp_cnv_set_alpha_keyer)(
|
||||
struct dpp *dpp_base,
|
||||
struct cnv_color_keyer_params *color_keyer);
|
||||
|
||||
void (*dpp_get_gamut_remap)(struct dpp *dpp_base,
|
||||
struct dpp_grph_csc_adjustment *adjust);
|
||||
};
|
||||
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user