aboutsummaryrefslogtreecommitdiffstats
path: root/common/recipes-kernel/linux/files/0728-drm-amd-dal-OPP-refactoring.patch
diff options
context:
space:
mode:
Diffstat (limited to 'common/recipes-kernel/linux/files/0728-drm-amd-dal-OPP-refactoring.patch')
-rw-r--r--common/recipes-kernel/linux/files/0728-drm-amd-dal-OPP-refactoring.patch524
1 files changed, 524 insertions, 0 deletions
diff --git a/common/recipes-kernel/linux/files/0728-drm-amd-dal-OPP-refactoring.patch b/common/recipes-kernel/linux/files/0728-drm-amd-dal-OPP-refactoring.patch
new file mode 100644
index 00000000..1e4199fa
--- /dev/null
+++ b/common/recipes-kernel/linux/files/0728-drm-amd-dal-OPP-refactoring.patch
@@ -0,0 +1,524 @@
+From a8dbea4b89559bc636b7f78c23a61738a3b87ee5 Mon Sep 17 00:00:00 2001
+From: Andrey Grodzovsky <Andrey.Grodzovsky@amd.com>
+Date: Fri, 22 Jan 2016 10:58:47 -0500
+Subject: [PATCH 0728/1110] drm/amd/dal: OPP refactoring
+
+Signed-off-by: Andrey Grodzovsky <Andrey.Grodzovsky@amd.com>
+Acked-by: Harry Wentland <harry.wentland@amd.com>
+---
+ .../gpu/drm/amd/dal/dc/dce100/dce100_resource.c | 77 +++++++++++++++++-
+ .../gpu/drm/amd/dal/dc/dce100/dce100_resource.h | 1 +
+ .../drm/amd/dal/dc/dce110/dce110_hw_sequencer.c | 19 ++---
+ drivers/gpu/drm/amd/dal/dc/dce110/dce110_opp.c | 93 +++++++---------------
+ drivers/gpu/drm/amd/dal/dc/dce110/dce110_opp.h | 11 +--
+ .../gpu/drm/amd/dal/dc/dce110/dce110_resource.c | 55 ++++++++++++-
+ drivers/gpu/drm/amd/dal/dc/inc/opp.h | 42 ++++++++++
+ 7 files changed, 214 insertions(+), 84 deletions(-)
+
+diff --git a/drivers/gpu/drm/amd/dal/dc/dce100/dce100_resource.c b/drivers/gpu/drm/amd/dal/dc/dce100/dce100_resource.c
+index 5e43d4d..2bf66c6 100644
+--- a/drivers/gpu/drm/amd/dal/dc/dce100/dce100_resource.c
++++ b/drivers/gpu/drm/amd/dal/dc/dce100/dce100_resource.c
+@@ -276,6 +276,38 @@ static const struct dce110_stream_enc_registers stream_enc_regs[] = {
+ stream_enc_regs(2)
+ };
+
++#define DCFE_MEM_PWR_CTRL_REG_BASE 0x1b03
++
++static const struct dce110_opp_reg_offsets dce100_opp_reg_offsets[] = {
++{
++ .fmt_offset = (mmFMT0_FMT_CONTROL - mmFMT_CONTROL),
++ .dcfe_offset = (mmCRTC0_DCFE_MEM_PWR_CTRL - DCFE_MEM_PWR_CTRL_REG_BASE),
++ .dcp_offset = (mmDCP0_GRPH_CONTROL - mmGRPH_CONTROL),
++},
++{ .fmt_offset = (mmFMT1_FMT_CONTROL - mmFMT0_FMT_CONTROL),
++ .dcfe_offset = (mmCRTC1_DCFE_MEM_PWR_CTRL - DCFE_MEM_PWR_CTRL_REG_BASE),
++ .dcp_offset = (mmDCP1_GRPH_CONTROL - mmDCP0_GRPH_CONTROL),
++},
++{ .fmt_offset = (mmFMT2_FMT_CONTROL - mmFMT0_FMT_CONTROL),
++ .dcfe_offset = (mmCRTC2_DCFE_MEM_PWR_CTRL - DCFE_MEM_PWR_CTRL_REG_BASE),
++ .dcp_offset = (mmDCP2_GRPH_CONTROL - mmDCP0_GRPH_CONTROL),
++},
++{
++ .fmt_offset = (mmFMT3_FMT_CONTROL - mmFMT0_FMT_CONTROL),
++ .dcfe_offset = (mmCRTC3_DCFE_MEM_PWR_CTRL - DCFE_MEM_PWR_CTRL_REG_BASE),
++ .dcp_offset = (mmDCP3_GRPH_CONTROL - mmDCP0_GRPH_CONTROL),
++},
++{ .fmt_offset = (mmFMT4_FMT_CONTROL - mmFMT0_FMT_CONTROL),
++ .dcfe_offset = (mmCRTC4_DCFE_MEM_PWR_CTRL - DCFE_MEM_PWR_CTRL_REG_BASE),
++ .dcp_offset = (mmDCP4_GRPH_CONTROL - mmDCP0_GRPH_CONTROL),
++},
++{ .fmt_offset = (mmFMT5_FMT_CONTROL - mmFMT0_FMT_CONTROL),
++ .dcfe_offset = (mmCRTC5_DCFE_MEM_PWR_CTRL - DCFE_MEM_PWR_CTRL_REG_BASE),
++ .dcp_offset = (mmDCP5_GRPH_CONTROL - mmDCP0_GRPH_CONTROL),
++}
++};
++
++
+ static struct timing_generator *dce100_timing_generator_create(
+ struct adapter_service *as,
+ struct dc_context *ctx,
+@@ -405,8 +437,47 @@ struct link_encoder *dce100_link_encoder_create(
+ return NULL;
+ }
+
++
++struct output_pixel_processor *dce100_opp_create(
++ struct dc_context *ctx,
++ uint32_t inst,
++ const struct dce110_opp_reg_offsets *offset)
++{
++ struct dce110_opp *opp =
++ dc_service_alloc(ctx, sizeof(struct dce110_opp));
++
++ if (!opp)
++ return NULL;
++
++ if (dce110_opp_construct(opp,
++ ctx, inst, offset))
++ return &opp->base;
++
++ BREAK_TO_DEBUGGER();
++ dc_service_free(ctx, opp);
++ return NULL;
++}
++
++
++void dce100_opp_destroy(struct output_pixel_processor **opp)
++{
++ dc_service_free((*opp)->ctx, FROM_DCE11_OPP(*opp)->regamma.coeff128_dx);
++ dc_service_free((*opp)->ctx, FROM_DCE11_OPP(*opp)->regamma.coeff128_oem);
++ dc_service_free((*opp)->ctx, FROM_DCE11_OPP(*opp)->regamma.coeff128);
++ dc_service_free((*opp)->ctx, FROM_DCE11_OPP(*opp)->regamma.axis_x_1025);
++ dc_service_free((*opp)->ctx, FROM_DCE11_OPP(*opp)->regamma.axis_x_256);
++ dc_service_free((*opp)->ctx, FROM_DCE11_OPP(*opp)->regamma.coordinates_x);
++ dc_service_free((*opp)->ctx, FROM_DCE11_OPP(*opp)->regamma.rgb_regamma);
++ dc_service_free((*opp)->ctx, FROM_DCE11_OPP(*opp)->regamma.rgb_resulted);
++ dc_service_free((*opp)->ctx, FROM_DCE11_OPP(*opp)->regamma.rgb_oem);
++ dc_service_free((*opp)->ctx, FROM_DCE11_OPP(*opp)->regamma.rgb_user);
++ dc_service_free((*opp)->ctx, FROM_DCE11_OPP(*opp));
++ *opp = NULL;
++}
++
+ bool dce100_construct_resource_pool(
+ struct adapter_service *adapter_serv,
++ uint8_t num_virtual_links,
+ struct dc *dc,
+ struct resource_pool *pool)
+ {
+@@ -518,7 +589,7 @@ bool dce100_construct_resource_pool(
+ pool->transforms[i],
+ pool->scaler_filter);
+
+- pool->opps[i] = dce110_opp_create(ctx, i);
++ pool->opps[i] = dce100_opp_create(ctx, i, &dce100_opp_reg_offsets[i]);
+ if (pool->opps[i] == NULL) {
+ BREAK_TO_DEBUGGER();
+ dal_error(
+@@ -583,7 +654,7 @@ audio_create_fail:
+ controller_create_fail:
+ for (i = 0; i < pool->controller_count; i++) {
+ if (pool->opps[i] != NULL)
+- dce110_opp_destroy(&pool->opps[i]);
++ dce100_opp_destroy(&pool->opps[i]);
+
+ if (pool->transforms[i] != NULL)
+ dce100_transform_destroy(&pool->transforms[i]);
+@@ -625,7 +696,7 @@ void dce100_destruct_resource_pool(struct resource_pool *pool)
+
+ for (i = 0; i < pool->controller_count; i++) {
+ if (pool->opps[i] != NULL)
+- dce110_opp_destroy(&pool->opps[i]);
++ dce100_opp_destroy(&pool->opps[i]);
+
+ if (pool->transforms[i] != NULL)
+ dce100_transform_destroy(&pool->transforms[i]);
+diff --git a/drivers/gpu/drm/amd/dal/dc/dce100/dce100_resource.h b/drivers/gpu/drm/amd/dal/dc/dce100/dce100_resource.h
+index 1ae3ecc..a70bfee 100644
+--- a/drivers/gpu/drm/amd/dal/dc/dce100/dce100_resource.h
++++ b/drivers/gpu/drm/amd/dal/dc/dce100/dce100_resource.h
+@@ -16,6 +16,7 @@ struct dc_validation_set;
+
+ bool dce100_construct_resource_pool(
+ struct adapter_service *adapter_serv,
++ uint8_t num_virtual_links,
+ struct dc *dc,
+ struct resource_pool *pool);
+
+diff --git a/drivers/gpu/drm/amd/dal/dc/dce110/dce110_hw_sequencer.c b/drivers/gpu/drm/amd/dal/dc/dce110/dce110_hw_sequencer.c
+index 674e795..1fc4c07 100644
+--- a/drivers/gpu/drm/amd/dal/dc/dce110/dce110_hw_sequencer.c
++++ b/drivers/gpu/drm/amd/dal/dc/dce110/dce110_hw_sequencer.c
+@@ -182,7 +182,8 @@ static bool set_gamma_ramp(
+ const struct gamma_parameters *params)
+ {
+ /*Power on LUT memory*/
+- dce110_opp_power_on_regamma_lut(opp, true);
++ opp->funcs->opp_power_on_regamma_lut(opp, true);
++
+
+ if (params->surface_pixel_format == PIXEL_FORMAT_INDEX8 ||
+ params->selected_gamma_lut == GRAPHICS_GAMMA_LUT_LEGACY) {
+@@ -197,10 +198,10 @@ static bool set_gamma_ramp(
+
+ ipp->funcs->ipp_set_degamma(ipp, params, true);
+
+- dce110_opp_set_regamma(opp, ramp, params, true);
++ opp->funcs->opp_set_regamma(opp, ramp, params, true);
+ } else if (params->selected_gamma_lut ==
+ GRAPHICS_GAMMA_LUT_LEGACY_AND_REGAMMA) {
+- if (!dce110_opp_map_legacy_and_regamma_hw_to_x_user(
++ if (!opp->funcs->opp_map_legacy_and_regamma_hw_to_x_user(
+ opp, ramp, params)) {
+ BREAK_TO_DEBUGGER();
+ /* invalid parameters or bug */
+@@ -224,11 +225,11 @@ static bool set_gamma_ramp(
+ * For FP16 or no degamma do by pass */
+ ipp->funcs->ipp_set_degamma(ipp, params, false);
+
+- dce110_opp_set_regamma(opp, ramp, params, false);
++ opp->funcs->opp_set_regamma(opp, ramp, params, false);
+ }
+
+ /*re-enable low power mode for LUT memory*/
+- dce110_opp_power_on_regamma_lut(opp, false);
++ opp->funcs->opp_power_on_regamma_lut(opp, false);
+
+ return true;
+ }
+@@ -299,11 +300,11 @@ static void program_fmt(
+ /* dithering is affected by <CrtcSourceSelect>, hence should be
+ * programmed afterwards */
+
+- dce110_opp_program_bit_depth_reduction(
++ opp->funcs->opp_program_bit_depth_reduction(
+ opp,
+ fmt_bit_depth);
+
+- dce110_opp_program_clamping_and_pixel_encoding(
++ opp->funcs->opp_program_clamping_and_pixel_encoding(
+ opp,
+ clamping);
+
+@@ -840,7 +841,7 @@ static enum dc_status apply_single_controller_ctx_to_hw(uint8_t controller_idx,
+ return DC_ERROR_UNEXPECTED;
+ }
+
+- dce110_opp_set_dyn_expansion(
++ opp->funcs->opp_set_dyn_expansion(
+ opp,
+ COLOR_SPACE_YCBCR601,
+ stream->public.timing.display_color_depth,
+@@ -1411,7 +1412,7 @@ static void set_default_colors(
+ build_params->
+ line_buffer_params[path_id][plane_id].depth);*/
+
+- dce110_opp_set_csc_default(opp, &default_adjust);
++ opp->funcs->opp_set_csc_default(opp, &default_adjust);
+ }
+
+ static void program_scaler(
+diff --git a/drivers/gpu/drm/amd/dal/dc/dce110/dce110_opp.c b/drivers/gpu/drm/amd/dal/dc/dce110/dce110_opp.c
+index 3fd12eb..5003c89 100644
+--- a/drivers/gpu/drm/amd/dal/dc/dce110/dce110_opp.c
++++ b/drivers/gpu/drm/amd/dal/dc/dce110/dce110_opp.c
+@@ -31,43 +31,11 @@
+
+ #include "dce110_opp.h"
+
+-#define FROM_OPP(opp)\
+- container_of(opp, struct dce110_opp, base)
+-
+ enum {
+ MAX_LUT_ENTRY = 256,
+ MAX_NUMBER_OF_ENTRIES = 256
+ };
+
+-static const struct dce110_opp_reg_offsets reg_offsets[] = {
+-{
+- .fmt_offset = (mmFMT0_FMT_CONTROL - mmFMT0_FMT_CONTROL),
+- .dcfe_offset = (mmDCFE0_DCFE_MEM_PWR_CTRL - mmDCFE0_DCFE_MEM_PWR_CTRL),
+- .dcp_offset = (mmDCP0_GRPH_CONTROL - mmDCP0_GRPH_CONTROL),
+-},
+-{ .fmt_offset = (mmFMT1_FMT_CONTROL - mmFMT0_FMT_CONTROL),
+- .dcfe_offset = (mmDCFE1_DCFE_MEM_PWR_CTRL - mmDCFE0_DCFE_MEM_PWR_CTRL),
+- .dcp_offset = (mmDCP1_GRPH_CONTROL - mmDCP0_GRPH_CONTROL),
+-},
+-{ .fmt_offset = (mmFMT2_FMT_CONTROL - mmFMT0_FMT_CONTROL),
+- .dcfe_offset = (mmDCFE2_DCFE_MEM_PWR_CTRL - mmDCFE0_DCFE_MEM_PWR_CTRL),
+- .dcp_offset = (mmDCP2_GRPH_CONTROL - mmDCP0_GRPH_CONTROL),
+-},
+-{
+- .fmt_offset = (mmFMT3_FMT_CONTROL - mmFMT0_FMT_CONTROL),
+- .dcfe_offset = (mmDCFE3_DCFE_MEM_PWR_CTRL - mmDCFE0_DCFE_MEM_PWR_CTRL),
+- .dcp_offset = (mmDCP3_GRPH_CONTROL - mmDCP0_GRPH_CONTROL),
+-},
+-{ .fmt_offset = (mmFMT4_FMT_CONTROL - mmFMT0_FMT_CONTROL),
+- .dcfe_offset = (mmDCFE4_DCFE_MEM_PWR_CTRL - mmDCFE0_DCFE_MEM_PWR_CTRL),
+- .dcp_offset = (mmDCP4_GRPH_CONTROL - mmDCP0_GRPH_CONTROL),
+-},
+-{ .fmt_offset = (mmFMT5_FMT_CONTROL - mmFMT0_FMT_CONTROL),
+- .dcfe_offset = (mmDCFE5_DCFE_MEM_PWR_CTRL - mmDCFE0_DCFE_MEM_PWR_CTRL),
+- .dcp_offset = (mmDCP5_GRPH_CONTROL - mmDCP0_GRPH_CONTROL),
+-}
+-};
+-
+ static void build_evenly_distributed_points(
+ struct gamma_pixel *points,
+ uint32_t numberof_points,
+@@ -115,18 +83,30 @@ static void build_evenly_distributed_points(
+ /* Constructor, Destructor */
+ /*****************************************/
+
++struct opp_funcs funcs = {
++ .opp_map_legacy_and_regamma_hw_to_x_user = dce110_opp_map_legacy_and_regamma_hw_to_x_user,
++ .opp_power_on_regamma_lut = dce110_opp_power_on_regamma_lut,
++ .opp_program_bit_depth_reduction = dce110_opp_program_bit_depth_reduction,
++ .opp_program_clamping_and_pixel_encoding = dce110_opp_program_clamping_and_pixel_encoding,
++ .opp_set_csc_adjustment = dce110_opp_set_csc_adjustment,
++ .opp_set_csc_default = dce110_opp_set_csc_default,
++ .opp_set_dyn_expansion = dce110_opp_set_dyn_expansion,
++ .opp_set_regamma = dce110_opp_set_regamma
++};
++
+ bool dce110_opp_construct(struct dce110_opp *opp110,
+ struct dc_context *ctx,
+- uint32_t inst)
++ uint32_t inst,
++ const struct dce110_opp_reg_offsets *offsets)
+ {
+- if (inst >= ARRAY_SIZE(reg_offsets))
+- return false;
++
++ opp110->base.funcs = &funcs;
+
+ opp110->base.ctx = ctx;
+
+ opp110->base.inst = inst;
+
+- opp110->offsets = reg_offsets[inst];
++ opp110->offsets = *offsets;
+
+ opp110->regamma.hw_points_num = 128;
+ opp110->regamma.coordinates_x = NULL;
+@@ -274,36 +254,17 @@ failure_1:
+
+ void dce110_opp_destroy(struct output_pixel_processor **opp)
+ {
+- dc_service_free((*opp)->ctx, FROM_OPP(*opp)->regamma.coeff128_dx);
+- dc_service_free((*opp)->ctx, FROM_OPP(*opp)->regamma.coeff128_oem);
+- dc_service_free((*opp)->ctx, FROM_OPP(*opp)->regamma.coeff128);
+- dc_service_free((*opp)->ctx, FROM_OPP(*opp)->regamma.axis_x_1025);
+- dc_service_free((*opp)->ctx, FROM_OPP(*opp)->regamma.axis_x_256);
+- dc_service_free((*opp)->ctx, FROM_OPP(*opp)->regamma.coordinates_x);
+- dc_service_free((*opp)->ctx, FROM_OPP(*opp)->regamma.rgb_regamma);
+- dc_service_free((*opp)->ctx, FROM_OPP(*opp)->regamma.rgb_resulted);
+- dc_service_free((*opp)->ctx, FROM_OPP(*opp)->regamma.rgb_oem);
+- dc_service_free((*opp)->ctx, FROM_OPP(*opp)->regamma.rgb_user);
+- dc_service_free((*opp)->ctx, FROM_OPP(*opp));
++ dc_service_free((*opp)->ctx, FROM_DCE11_OPP(*opp)->regamma.coeff128_dx);
++ dc_service_free((*opp)->ctx, FROM_DCE11_OPP(*opp)->regamma.coeff128_oem);
++ dc_service_free((*opp)->ctx, FROM_DCE11_OPP(*opp)->regamma.coeff128);
++ dc_service_free((*opp)->ctx, FROM_DCE11_OPP(*opp)->regamma.axis_x_1025);
++ dc_service_free((*opp)->ctx, FROM_DCE11_OPP(*opp)->regamma.axis_x_256);
++ dc_service_free((*opp)->ctx, FROM_DCE11_OPP(*opp)->regamma.coordinates_x);
++ dc_service_free((*opp)->ctx, FROM_DCE11_OPP(*opp)->regamma.rgb_regamma);
++ dc_service_free((*opp)->ctx, FROM_DCE11_OPP(*opp)->regamma.rgb_resulted);
++ dc_service_free((*opp)->ctx, FROM_DCE11_OPP(*opp)->regamma.rgb_oem);
++ dc_service_free((*opp)->ctx, FROM_DCE11_OPP(*opp)->regamma.rgb_user);
++ dc_service_free((*opp)->ctx, FROM_DCE11_OPP(*opp));
+ *opp = NULL;
+ }
+
+-struct output_pixel_processor *dce110_opp_create(
+- struct dc_context *ctx,
+- uint32_t inst)
+-{
+- struct dce110_opp *opp =
+- dc_service_alloc(ctx, sizeof(struct dce110_opp));
+-
+- if (!opp)
+- return NULL;
+-
+- if (dce110_opp_construct(opp,
+- ctx, inst))
+- return &opp->base;
+-
+- BREAK_TO_DEBUGGER();
+- dc_service_free(ctx, opp);
+- return NULL;
+-}
+-
+diff --git a/drivers/gpu/drm/amd/dal/dc/dce110/dce110_opp.h b/drivers/gpu/drm/amd/dal/dc/dce110/dce110_opp.h
+index 71fe624..f9b828c 100644
+--- a/drivers/gpu/drm/amd/dal/dc/dce110/dce110_opp.h
++++ b/drivers/gpu/drm/amd/dal/dc/dce110/dce110_opp.h
+@@ -28,6 +28,10 @@
+ #include "dc_types.h"
+ #include "inc/opp.h"
+
++
++#define FROM_DCE11_OPP(opp)\
++ container_of(opp, struct dce110_opp, base)
++
+ enum dce110_opp_reg_type {
+ DCE110_OPP_REG_DCP = 0,
+ DCE110_OPP_REG_DCFE,
+@@ -89,14 +93,11 @@ struct dce110_opp {
+
+ bool dce110_opp_construct(struct dce110_opp *opp110,
+ struct dc_context *ctx,
+- uint32_t inst);
++ uint32_t inst,
++ const struct dce110_opp_reg_offsets *offsets);
+
+ void dce110_opp_destroy(struct output_pixel_processor **opp);
+
+-struct output_pixel_processor *dce110_opp_create(
+- struct dc_context *ctx,
+- uint32_t inst);
+-
+ /* REGAMMA RELATED */
+ void dce110_opp_power_on_regamma_lut(
+ struct output_pixel_processor *opp,
+diff --git a/drivers/gpu/drm/amd/dal/dc/dce110/dce110_resource.c b/drivers/gpu/drm/amd/dal/dc/dce110/dce110_resource.c
+index d2970f8..44558d5 100644
+--- a/drivers/gpu/drm/amd/dal/dc/dce110/dce110_resource.c
++++ b/drivers/gpu/drm/amd/dal/dc/dce110/dce110_resource.c
+@@ -240,6 +240,38 @@ static const struct dce110_stream_enc_registers stream_enc_regs[] = {
+ stream_enc_regs(2)
+ };
+
++
++/* AG TBD Needs to be reduced back to 3 pipes once dce10 hw sequencer implemented. */
++static const struct dce110_opp_reg_offsets dce110_opp_reg_offsets[] = {
++{
++ .fmt_offset = (mmFMT0_FMT_CONTROL - mmFMT0_FMT_CONTROL),
++ .dcfe_offset = (mmDCFE0_DCFE_MEM_PWR_CTRL - mmDCFE0_DCFE_MEM_PWR_CTRL),
++ .dcp_offset = (mmDCP0_GRPH_CONTROL - mmDCP0_GRPH_CONTROL),
++},
++{ .fmt_offset = (mmFMT1_FMT_CONTROL - mmFMT0_FMT_CONTROL),
++ .dcfe_offset = (mmDCFE1_DCFE_MEM_PWR_CTRL - mmDCFE0_DCFE_MEM_PWR_CTRL),
++ .dcp_offset = (mmDCP1_GRPH_CONTROL - mmDCP0_GRPH_CONTROL),
++},
++{ .fmt_offset = (mmFMT2_FMT_CONTROL - mmFMT0_FMT_CONTROL),
++ .dcfe_offset = (mmDCFE2_DCFE_MEM_PWR_CTRL - mmDCFE0_DCFE_MEM_PWR_CTRL),
++ .dcp_offset = (mmDCP2_GRPH_CONTROL - mmDCP0_GRPH_CONTROL),
++},
++{
++ .fmt_offset = (mmFMT3_FMT_CONTROL - mmFMT0_FMT_CONTROL),
++ .dcfe_offset = (mmDCFE3_DCFE_MEM_PWR_CTRL - mmDCFE0_DCFE_MEM_PWR_CTRL),
++ .dcp_offset = (mmDCP3_GRPH_CONTROL - mmDCP0_GRPH_CONTROL),
++},
++{ .fmt_offset = (mmFMT4_FMT_CONTROL - mmFMT0_FMT_CONTROL),
++ .dcfe_offset = (mmDCFE4_DCFE_MEM_PWR_CTRL - mmDCFE0_DCFE_MEM_PWR_CTRL),
++ .dcp_offset = (mmDCP4_GRPH_CONTROL - mmDCP0_GRPH_CONTROL),
++},
++{ .fmt_offset = (mmFMT5_FMT_CONTROL - mmFMT0_FMT_CONTROL),
++ .dcfe_offset = (mmDCFE5_DCFE_MEM_PWR_CTRL - mmDCFE0_DCFE_MEM_PWR_CTRL),
++ .dcp_offset = (mmDCP5_GRPH_CONTROL - mmDCP0_GRPH_CONTROL),
++}
++};
++
++
+ static struct timing_generator *dce110_timing_generator_create(
+ struct adapter_service *as,
+ struct dc_context *ctx,
+@@ -374,6 +406,27 @@ void dce110_link_encoder_destroy(struct link_encoder **enc)
+ *enc = NULL;
+ }
+
++
++static struct output_pixel_processor *dce110_opp_create(
++ struct dc_context *ctx,
++ uint32_t inst,
++ const struct dce110_opp_reg_offsets *offsets)
++{
++ struct dce110_opp *opp =
++ dc_service_alloc(ctx, sizeof(struct dce110_opp));
++
++ if (!opp)
++ return NULL;
++
++ if (dce110_opp_construct(opp,
++ ctx, inst, offsets))
++ return &opp->base;
++
++ BREAK_TO_DEBUGGER();
++ dc_service_free(ctx, opp);
++ return NULL;
++}
++
+ bool dce110_construct_resource_pool(
+ struct adapter_service *adapter_serv,
+ uint8_t num_virtual_links,
+@@ -485,7 +538,7 @@ bool dce110_construct_resource_pool(
+ pool->transforms[i],
+ pool->scaler_filter);
+
+- pool->opps[i] = dce110_opp_create(ctx, i);
++ pool->opps[i] = dce110_opp_create(ctx, i, &dce110_opp_reg_offsets[i]);
+ if (pool->opps[i] == NULL) {
+ BREAK_TO_DEBUGGER();
+ dal_error(
+diff --git a/drivers/gpu/drm/amd/dal/dc/inc/opp.h b/drivers/gpu/drm/amd/dal/dc/inc/opp.h
+index 3293e3b..543848a 100644
+--- a/drivers/gpu/drm/amd/dal/dc/inc/opp.h
++++ b/drivers/gpu/drm/amd/dal/dc/inc/opp.h
+@@ -195,6 +195,7 @@ enum opp_regamma {
+ struct output_pixel_processor {
+ struct dc_context *ctx;
+ uint32_t inst;
++ struct opp_funcs *funcs;
+ };
+
+ enum fmt_stereo_action {
+@@ -203,4 +204,45 @@ enum fmt_stereo_action {
+ FMT_STEREO_ACTION_UPDATE_POLARITY
+ };
+
++struct opp_funcs {
++ void (*opp_power_on_regamma_lut)(
++ struct output_pixel_processor *opp,
++ bool power_on);
++
++ bool (*opp_set_regamma)(
++ struct output_pixel_processor *opp,
++ const struct gamma_ramp *ramp,
++ const struct gamma_parameters *params,
++ bool force_bypass);
++
++ bool (*opp_map_legacy_and_regamma_hw_to_x_user)(
++ struct output_pixel_processor *opp,
++ const struct gamma_ramp *gamma_ramp,
++ const struct gamma_parameters *params);
++
++ void (*opp_set_csc_adjustment)(
++ struct output_pixel_processor *opp,
++ const struct grph_csc_adjustment *adjust);
++
++ void (*opp_set_csc_default)(
++ struct output_pixel_processor *opp,
++ const struct default_adjustment *default_adjust);
++
++ /* FORMATTER RELATED */
++ void (*opp_program_bit_depth_reduction)(
++ struct output_pixel_processor *opp,
++ const struct bit_depth_reduction_params *params);
++
++ void (*opp_program_clamping_and_pixel_encoding)(
++ struct output_pixel_processor *opp,
++ const struct clamping_and_pixel_encoding_params *params);
++
++
++ void (*opp_set_dyn_expansion)(
++ struct output_pixel_processor *opp,
++ enum color_space color_sp,
++ enum dc_color_depth color_dpth,
++ enum signal_type signal);
++};
++
+ #endif
+--
+2.7.4
+