drm/amd/display: Refactor DCN3X into component folder
authorMounika Adhuri <moadhuri@amd.com>
Wed, 5 Jun 2024 10:38:24 +0000 (16:08 +0530)
committerAlex Deucher <alexander.deucher@amd.com>
Fri, 14 Jun 2024 20:18:55 +0000 (16:18 -0400)
[why]
Move DCN3X files to unique component folder.

[how]
Create respective component folder in dc, move the DCN3X files into
corresponding new folders and made appropriate changes for compilation
in Makefiles.

Reviewed-by: Martin Leung <martin.leung@amd.com>
Acked-by: Hamza Mahfooz <hamza.mahfooz@amd.com>
Signed-off-by: Mounika Adhuri <moadhuri@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
75 files changed:
drivers/gpu/drm/amd/display/Makefile
drivers/gpu/drm/amd/display/dc/Makefile
drivers/gpu/drm/amd/display/dc/dcn32/Makefile [deleted file]
drivers/gpu/drm/amd/display/dc/dcn32/dcn32_dio_link_encoder.c [deleted file]
drivers/gpu/drm/amd/display/dc/dcn32/dcn32_dio_link_encoder.h [deleted file]
drivers/gpu/drm/amd/display/dc/dcn32/dcn32_dio_stream_encoder.c [deleted file]
drivers/gpu/drm/amd/display/dc/dcn32/dcn32_dio_stream_encoder.h [deleted file]
drivers/gpu/drm/amd/display/dc/dcn32/dcn32_hpo_dp_link_encoder.c [deleted file]
drivers/gpu/drm/amd/display/dc/dcn32/dcn32_hpo_dp_link_encoder.h [deleted file]
drivers/gpu/drm/amd/display/dc/dcn32/dcn32_mmhubbub.c [deleted file]
drivers/gpu/drm/amd/display/dc/dcn32/dcn32_mmhubbub.h [deleted file]
drivers/gpu/drm/amd/display/dc/dcn32/dcn32_mpc.c [deleted file]
drivers/gpu/drm/amd/display/dc/dcn32/dcn32_mpc.h [deleted file]
drivers/gpu/drm/amd/display/dc/dcn32/dcn32_resource_helpers.c [deleted file]
drivers/gpu/drm/amd/display/dc/dcn321/Makefile [deleted file]
drivers/gpu/drm/amd/display/dc/dcn321/dcn321_dio_link_encoder.c [deleted file]
drivers/gpu/drm/amd/display/dc/dcn321/dcn321_dio_link_encoder.h [deleted file]
drivers/gpu/drm/amd/display/dc/dcn35/Makefile [deleted file]
drivers/gpu/drm/amd/display/dc/dcn35/dcn35_dio_link_encoder.c [deleted file]
drivers/gpu/drm/amd/display/dc/dcn35/dcn35_dio_link_encoder.h [deleted file]
drivers/gpu/drm/amd/display/dc/dcn35/dcn35_dio_stream_encoder.c [deleted file]
drivers/gpu/drm/amd/display/dc/dcn35/dcn35_dio_stream_encoder.h [deleted file]
drivers/gpu/drm/amd/display/dc/dcn35/dcn35_dwb.c [deleted file]
drivers/gpu/drm/amd/display/dc/dcn35/dcn35_dwb.h [deleted file]
drivers/gpu/drm/amd/display/dc/dcn35/dcn35_mmhubbub.c [deleted file]
drivers/gpu/drm/amd/display/dc/dcn35/dcn35_mmhubbub.h [deleted file]
drivers/gpu/drm/amd/display/dc/dcn35/dcn35_opp.c [deleted file]
drivers/gpu/drm/amd/display/dc/dcn35/dcn35_opp.h [deleted file]
drivers/gpu/drm/amd/display/dc/dcn35/dcn35_pg_cntl.c [deleted file]
drivers/gpu/drm/amd/display/dc/dcn35/dcn35_pg_cntl.h [deleted file]
drivers/gpu/drm/amd/display/dc/dcn401/dcn401_dio_link_encoder.c [deleted file]
drivers/gpu/drm/amd/display/dc/dcn401/dcn401_dio_link_encoder.h [deleted file]
drivers/gpu/drm/amd/display/dc/dcn401/dcn401_dio_stream_encoder.c [deleted file]
drivers/gpu/drm/amd/display/dc/dcn401/dcn401_dio_stream_encoder.h [deleted file]
drivers/gpu/drm/amd/display/dc/dcn401/dcn401_mpc.c [deleted file]
drivers/gpu/drm/amd/display/dc/dcn401/dcn401_mpc.h [deleted file]
drivers/gpu/drm/amd/display/dc/dio/Makefile [new file with mode: 0644]
drivers/gpu/drm/amd/display/dc/dio/dcn32/dcn32_dio_link_encoder.c [new file with mode: 0644]
drivers/gpu/drm/amd/display/dc/dio/dcn32/dcn32_dio_link_encoder.h [new file with mode: 0644]
drivers/gpu/drm/amd/display/dc/dio/dcn32/dcn32_dio_stream_encoder.c [new file with mode: 0644]
drivers/gpu/drm/amd/display/dc/dio/dcn32/dcn32_dio_stream_encoder.h [new file with mode: 0644]
drivers/gpu/drm/amd/display/dc/dio/dcn321/dcn321_dio_link_encoder.c [new file with mode: 0644]
drivers/gpu/drm/amd/display/dc/dio/dcn321/dcn321_dio_link_encoder.h [new file with mode: 0644]
drivers/gpu/drm/amd/display/dc/dio/dcn35/dcn35_dio_link_encoder.c [new file with mode: 0644]
drivers/gpu/drm/amd/display/dc/dio/dcn35/dcn35_dio_link_encoder.h [new file with mode: 0644]
drivers/gpu/drm/amd/display/dc/dio/dcn35/dcn35_dio_stream_encoder.c [new file with mode: 0644]
drivers/gpu/drm/amd/display/dc/dio/dcn35/dcn35_dio_stream_encoder.h [new file with mode: 0644]
drivers/gpu/drm/amd/display/dc/dio/dcn401/dcn401_dio_link_encoder.c [new file with mode: 0644]
drivers/gpu/drm/amd/display/dc/dio/dcn401/dcn401_dio_link_encoder.h [new file with mode: 0644]
drivers/gpu/drm/amd/display/dc/dio/dcn401/dcn401_dio_stream_encoder.c [new file with mode: 0644]
drivers/gpu/drm/amd/display/dc/dio/dcn401/dcn401_dio_stream_encoder.h [new file with mode: 0644]
drivers/gpu/drm/amd/display/dc/dwb/Makefile [new file with mode: 0644]
drivers/gpu/drm/amd/display/dc/dwb/dcn35/dcn35_dwb.c [new file with mode: 0644]
drivers/gpu/drm/amd/display/dc/dwb/dcn35/dcn35_dwb.h [new file with mode: 0644]
drivers/gpu/drm/amd/display/dc/hpo/Makefile [new file with mode: 0644]
drivers/gpu/drm/amd/display/dc/hpo/dcn32/dcn32_hpo_dp_link_encoder.c [new file with mode: 0644]
drivers/gpu/drm/amd/display/dc/hpo/dcn32/dcn32_hpo_dp_link_encoder.h [new file with mode: 0644]
drivers/gpu/drm/amd/display/dc/mmhubbub/Makefile [new file with mode: 0644]
drivers/gpu/drm/amd/display/dc/mmhubbub/dcn32/dcn32_mmhubbub.c [new file with mode: 0644]
drivers/gpu/drm/amd/display/dc/mmhubbub/dcn32/dcn32_mmhubbub.h [new file with mode: 0644]
drivers/gpu/drm/amd/display/dc/mmhubbub/dcn35/dcn35_mmhubbub.c [new file with mode: 0644]
drivers/gpu/drm/amd/display/dc/mmhubbub/dcn35/dcn35_mmhubbub.h [new file with mode: 0644]
drivers/gpu/drm/amd/display/dc/mpc/Makefile [new file with mode: 0644]
drivers/gpu/drm/amd/display/dc/mpc/dcn32/dcn32_mpc.c [new file with mode: 0644]
drivers/gpu/drm/amd/display/dc/mpc/dcn32/dcn32_mpc.h [new file with mode: 0644]
drivers/gpu/drm/amd/display/dc/mpc/dcn401/dcn401_mpc.c [new file with mode: 0644]
drivers/gpu/drm/amd/display/dc/mpc/dcn401/dcn401_mpc.h [new file with mode: 0644]
drivers/gpu/drm/amd/display/dc/opp/Makefile [new file with mode: 0644]
drivers/gpu/drm/amd/display/dc/opp/dcn35/dcn35_opp.c [new file with mode: 0644]
drivers/gpu/drm/amd/display/dc/opp/dcn35/dcn35_opp.h [new file with mode: 0644]
drivers/gpu/drm/amd/display/dc/pg/Makefile [new file with mode: 0644]
drivers/gpu/drm/amd/display/dc/pg/dcn35/dcn35_pg_cntl.c [new file with mode: 0644]
drivers/gpu/drm/amd/display/dc/pg/dcn35/dcn35_pg_cntl.h [new file with mode: 0644]
drivers/gpu/drm/amd/display/dc/resource/Makefile
drivers/gpu/drm/amd/display/dc/resource/dcn32/dcn32_resource_helpers.c [new file with mode: 0644]

index 8297fbc..89d605d 100644 (file)
@@ -37,6 +37,13 @@ subdir-ccflags-y += -I$(FULL_AMD_DISPLAY_PATH)/dc/dpp
 subdir-ccflags-y += -I$(FULL_AMD_DISPLAY_PATH)/dc/hubbub
 subdir-ccflags-y += -I$(FULL_AMD_DISPLAY_PATH)/dc/dccg
 subdir-ccflags-y += -I$(FULL_AMD_DISPLAY_PATH)/dc/hubp
+subdir-ccflags-y += -I$(FULL_AMD_DISPLAY_PATH)/dc/dio
+subdir-ccflags-y += -I$(FULL_AMD_DISPLAY_PATH)/dc/dwb
+subdir-ccflags-y += -I$(FULL_AMD_DISPLAY_PATH)/dc/hpo
+subdir-ccflags-y += -I$(FULL_AMD_DISPLAY_PATH)/dc/mmhubbub
+subdir-ccflags-y += -I$(FULL_AMD_DISPLAY_PATH)/dc/mpc
+subdir-ccflags-y += -I$(FULL_AMD_DISPLAY_PATH)/dc/opp
+subdir-ccflags-y += -I$(FULL_AMD_DISPLAY_PATH)/dc/pg
 subdir-ccflags-y += -I$(FULL_AMD_DISPLAY_PATH)/modules/inc
 subdir-ccflags-y += -I$(FULL_AMD_DISPLAY_PATH)/modules/freesync
 subdir-ccflags-y += -I$(FULL_AMD_DISPLAY_PATH)/modules/color
index 9c2f932..8006965 100644 (file)
@@ -22,7 +22,7 @@
 #
 # Makefile for Display Core (dc) component.
 
-DC_LIBS = basics bios dml clk_mgr dce gpio hwss irq link virtual dsc resource optc dpp hubbub dccg hubp
+DC_LIBS = basics bios dml clk_mgr dce gpio hwss irq link virtual dsc resource optc dpp hubbub dccg hubp dio dwb hpo mmhubbub mpc opp pg
 
 ifdef CONFIG_DRM_AMD_DC_FP
 
@@ -36,10 +36,6 @@ DC_LIBS += dcn30
 DC_LIBS += dcn301
 DC_LIBS += dcn31
 DC_LIBS += dcn314
-DC_LIBS += dcn32
-DC_LIBS += dcn321
-DC_LIBS += dcn35
-DC_LIBS += dcn401
 DC_LIBS += dml
 DC_LIBS += dml2
 endif
diff --git a/drivers/gpu/drm/amd/display/dc/dcn32/Makefile b/drivers/gpu/drm/amd/display/dc/dcn32/Makefile
deleted file mode 100644 (file)
index 2d0eb20..0000000
+++ /dev/null
@@ -1,19 +0,0 @@
-#
-# (c) Copyright 2022 Advanced Micro Devices, Inc. All the rights reserved
-#
-#  All rights reserved.  This notice is intended as a precaution against
-#  inadvertent publication and does not imply publication or any waiver
-#  of confidentiality.  The year included in the foregoing notice is the
-#  year of creation of the work.
-#
-#  Authors: AMD
-#
-# Makefile for dcn32.
-
-DCN32 = dcn32_mmhubbub.o dcn32_mpc.o \
-               dcn32_dio_stream_encoder.o dcn32_dio_link_encoder.o dcn32_resource_helpers.o \
-               dcn32_hpo_dp_link_encoder.o
-
-AMD_DAL_DCN32 = $(addprefix $(AMDDALPATH)/dc/dcn32/,$(DCN32))
-
-AMD_DISPLAY_FILES += $(AMD_DAL_DCN32)
diff --git a/drivers/gpu/drm/amd/display/dc/dcn32/dcn32_dio_link_encoder.c b/drivers/gpu/drm/amd/display/dc/dcn32/dcn32_dio_link_encoder.c
deleted file mode 100644 (file)
index 06907e8..0000000
+++ /dev/null
@@ -1,328 +0,0 @@
-/*
- * Copyright 2021 Advanced Micro Devices, Inc.
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the "Software"),
- * to deal in the Software without restriction, including without limitation
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
- * and/or sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
- * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
- * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
- * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
- * OTHER DEALINGS IN THE SOFTWARE.
- *
- * Authors: AMD
- *
- */
-
-
-#include "reg_helper.h"
-
-#include "core_types.h"
-#include "link_encoder.h"
-#include "dcn31/dcn31_dio_link_encoder.h"
-#include "dcn32_dio_link_encoder.h"
-#include "stream_encoder.h"
-#include "dc_bios_types.h"
-#include "link_enc_cfg.h"
-
-#include "dc_dmub_srv.h"
-#include "gpio_service_interface.h"
-
-#ifndef MIN
-#define MIN(X, Y) ((X) < (Y) ? (X) : (Y))
-#endif
-
-#define CTX \
-       enc10->base.ctx
-#define DC_LOGGER \
-       enc10->base.ctx->logger
-
-#define REG(reg)\
-       (enc10->link_regs->reg)
-
-#undef FN
-#define FN(reg_name, field_name) \
-       enc10->link_shift->field_name, enc10->link_mask->field_name
-
-#define AUX_REG(reg)\
-       (enc10->aux_regs->reg)
-
-#define AUX_REG_READ(reg_name) \
-               dm_read_reg(CTX, AUX_REG(reg_name))
-
-#define AUX_REG_WRITE(reg_name, val) \
-                       dm_write_reg(CTX, AUX_REG(reg_name), val)
-
-static uint8_t phy_id_from_transmitter(enum transmitter t)
-{
-       uint8_t phy_id;
-
-       switch (t) {
-       case TRANSMITTER_UNIPHY_A:
-               phy_id = 0;
-               break;
-       case TRANSMITTER_UNIPHY_B:
-               phy_id = 1;
-               break;
-       case TRANSMITTER_UNIPHY_C:
-               phy_id = 2;
-               break;
-       case TRANSMITTER_UNIPHY_D:
-               phy_id = 3;
-               break;
-       case TRANSMITTER_UNIPHY_E:
-               phy_id = 4;
-               break;
-       case TRANSMITTER_UNIPHY_F:
-               phy_id = 5;
-               break;
-       case TRANSMITTER_UNIPHY_G:
-               phy_id = 6;
-               break;
-       default:
-               phy_id = 0;
-               break;
-       }
-       return phy_id;
-}
-
-void enc32_hw_init(struct link_encoder *enc)
-{
-       struct dcn10_link_encoder *enc10 = TO_DCN10_LINK_ENC(enc);
-
-/*
-       00 - DP_AUX_DPHY_RX_DETECTION_THRESHOLD__1to2 : 1/2
-       01 - DP_AUX_DPHY_RX_DETECTION_THRESHOLD__3to4 : 3/4
-       02 - DP_AUX_DPHY_RX_DETECTION_THRESHOLD__7to8 : 7/8
-       03 - DP_AUX_DPHY_RX_DETECTION_THRESHOLD__15to16 : 15/16
-       04 - DP_AUX_DPHY_RX_DETECTION_THRESHOLD__31to32 : 31/32
-       05 - DP_AUX_DPHY_RX_DETECTION_THRESHOLD__63to64 : 63/64
-       06 - DP_AUX_DPHY_RX_DETECTION_THRESHOLD__127to128 : 127/128
-       07 - DP_AUX_DPHY_RX_DETECTION_THRESHOLD__255to256 : 255/256
-*/
-
-/*
-       AUX_REG_UPDATE_5(AUX_DPHY_RX_CONTROL0,
-       AUX_RX_START_WINDOW = 1 [6:4]
-       AUX_RX_RECEIVE_WINDOW = 1 default is 2 [10:8]
-       AUX_RX_HALF_SYM_DETECT_LEN  = 1 [13:12] default is 1
-       AUX_RX_TRANSITION_FILTER_EN = 1 [16] default is 1
-       AUX_RX_ALLOW_BELOW_THRESHOLD_PHASE_DETECT [17] is 0  default is 0
-       AUX_RX_ALLOW_BELOW_THRESHOLD_START [18] is 1  default is 1
-       AUX_RX_ALLOW_BELOW_THRESHOLD_STOP [19] is 1  default is 1
-       AUX_RX_PHASE_DETECT_LEN,  [21,20] = 0x3 default is 3
-       AUX_RX_DETECTION_THRESHOLD [30:28] = 1
-*/
-       AUX_REG_WRITE(AUX_DPHY_RX_CONTROL0, 0x103d1110);
-
-       AUX_REG_WRITE(AUX_DPHY_TX_CONTROL, 0x21c7a);
-
-       //AUX_DPHY_TX_REF_CONTROL'AUX_TX_REF_DIV HW default is 0x32;
-       // Set AUX_TX_REF_DIV Divider to generate 2 MHz reference from refclk
-       // 27MHz -> 0xd
-       // 100MHz -> 0x32
-       // 48MHz -> 0x18
-
-       // Set TMDS_CTL0 to 1.  This is a legacy setting.
-       REG_UPDATE(TMDS_CTL_BITS, TMDS_CTL0, 1);
-
-       dcn10_aux_initialize(enc10);
-}
-
-
-void dcn32_link_encoder_enable_dp_output(
-       struct link_encoder *enc,
-       const struct dc_link_settings *link_settings,
-       enum clock_source_id clock_source)
-{
-       if (!enc->ctx->dc->debug.avoid_vbios_exec_table) {
-               dcn10_link_encoder_enable_dp_output(enc, link_settings, clock_source);
-               return;
-       }
-}
-
-static bool query_dp_alt_from_dmub(struct link_encoder *enc,
-       union dmub_rb_cmd *cmd)
-{
-       struct dcn10_link_encoder *enc10 = TO_DCN10_LINK_ENC(enc);
-
-       memset(cmd, 0, sizeof(*cmd));
-       cmd->query_dp_alt.header.type = DMUB_CMD__VBIOS;
-       cmd->query_dp_alt.header.sub_type =
-               DMUB_CMD__VBIOS_TRANSMITTER_QUERY_DP_ALT;
-       cmd->query_dp_alt.header.payload_bytes = sizeof(cmd->query_dp_alt.data);
-       cmd->query_dp_alt.data.phy_id = phy_id_from_transmitter(enc10->base.transmitter);
-
-       if (!dc_wake_and_execute_dmub_cmd(enc->ctx, cmd, DM_DMUB_WAIT_TYPE_WAIT_WITH_REPLY))
-               return false;
-
-       return true;
-}
-
-bool dcn32_link_encoder_is_in_alt_mode(struct link_encoder *enc)
-{
-       union dmub_rb_cmd cmd;
-
-       if (!query_dp_alt_from_dmub(enc, &cmd))
-               return false;
-
-       return (cmd.query_dp_alt.data.is_dp_alt_disable == 0);
-}
-
-void dcn32_link_encoder_get_max_link_cap(struct link_encoder *enc,
-       struct dc_link_settings *link_settings)
-{
-       union dmub_rb_cmd cmd;
-
-       dcn10_link_encoder_get_max_link_cap(enc, link_settings);
-
-       if (!query_dp_alt_from_dmub(enc, &cmd))
-               return;
-
-       if (cmd.query_dp_alt.data.is_usb &&
-                       cmd.query_dp_alt.data.is_dp4 == 0)
-               link_settings->lane_count = MIN(LANE_COUNT_TWO, link_settings->lane_count);
-}
-
-
-static const struct link_encoder_funcs dcn32_link_enc_funcs = {
-       .read_state = link_enc2_read_state,
-       .validate_output_with_stream =
-                       dcn30_link_encoder_validate_output_with_stream,
-       .hw_init = enc32_hw_init,
-       .setup = dcn10_link_encoder_setup,
-       .enable_tmds_output = dcn10_link_encoder_enable_tmds_output,
-       .enable_dp_output = dcn32_link_encoder_enable_dp_output,
-       .enable_dp_mst_output = dcn10_link_encoder_enable_dp_mst_output,
-       .disable_output = dcn10_link_encoder_disable_output,
-       .dp_set_lane_settings = dcn10_link_encoder_dp_set_lane_settings,
-       .dp_set_phy_pattern = dcn10_link_encoder_dp_set_phy_pattern,
-       .update_mst_stream_allocation_table =
-               dcn10_link_encoder_update_mst_stream_allocation_table,
-       .psr_program_dp_dphy_fast_training =
-                       dcn10_psr_program_dp_dphy_fast_training,
-       .psr_program_secondary_packet = dcn10_psr_program_secondary_packet,
-       .connect_dig_be_to_fe = dcn10_link_encoder_connect_dig_be_to_fe,
-       .enable_hpd = dcn10_link_encoder_enable_hpd,
-       .disable_hpd = dcn10_link_encoder_disable_hpd,
-       .is_dig_enabled = dcn10_is_dig_enabled,
-       .destroy = dcn10_link_encoder_destroy,
-       .fec_set_enable = enc2_fec_set_enable,
-       .fec_set_ready = enc2_fec_set_ready,
-       .fec_is_active = enc2_fec_is_active,
-       .get_dig_frontend = dcn10_get_dig_frontend,
-       .get_dig_mode = dcn10_get_dig_mode,
-       .is_in_alt_mode = dcn32_link_encoder_is_in_alt_mode,
-       .get_max_link_cap = dcn32_link_encoder_get_max_link_cap,
-       .set_dio_phy_mux = dcn31_link_encoder_set_dio_phy_mux,
-};
-
-void dcn32_link_encoder_construct(
-       struct dcn20_link_encoder *enc20,
-       const struct encoder_init_data *init_data,
-       const struct encoder_feature_support *enc_features,
-       const struct dcn10_link_enc_registers *link_regs,
-       const struct dcn10_link_enc_aux_registers *aux_regs,
-       const struct dcn10_link_enc_hpd_registers *hpd_regs,
-       const struct dcn10_link_enc_shift *link_shift,
-       const struct dcn10_link_enc_mask *link_mask)
-{
-       struct bp_connector_speed_cap_info bp_cap_info = {0};
-       const struct dc_vbios_funcs *bp_funcs = init_data->ctx->dc_bios->funcs;
-       enum bp_result result = BP_RESULT_OK;
-       struct dcn10_link_encoder *enc10 = &enc20->enc10;
-
-       enc10->base.funcs = &dcn32_link_enc_funcs;
-       enc10->base.ctx = init_data->ctx;
-       enc10->base.id = init_data->encoder;
-
-       enc10->base.hpd_source = init_data->hpd_source;
-       enc10->base.connector = init_data->connector;
-
-       enc10->base.preferred_engine = ENGINE_ID_UNKNOWN;
-
-       enc10->base.features = *enc_features;
-
-       enc10->base.transmitter = init_data->transmitter;
-
-       /* set the flag to indicate whether driver poll the I2C data pin
-        * while doing the DP sink detect
-        */
-
-/*     if (dal_adapter_service_is_feature_supported(as,
-               FEATURE_DP_SINK_DETECT_POLL_DATA_PIN))
-               enc10->base.features.flags.bits.
-                       DP_SINK_DETECT_POLL_DATA_PIN = true;*/
-
-       enc10->base.output_signals =
-               SIGNAL_TYPE_DVI_SINGLE_LINK |
-               SIGNAL_TYPE_DVI_DUAL_LINK |
-               SIGNAL_TYPE_LVDS |
-               SIGNAL_TYPE_DISPLAY_PORT |
-               SIGNAL_TYPE_DISPLAY_PORT_MST |
-               SIGNAL_TYPE_EDP |
-               SIGNAL_TYPE_HDMI_TYPE_A;
-
-       enc10->link_regs = link_regs;
-       enc10->aux_regs = aux_regs;
-       enc10->hpd_regs = hpd_regs;
-       enc10->link_shift = link_shift;
-       enc10->link_mask = link_mask;
-
-       switch (enc10->base.transmitter) {
-       case TRANSMITTER_UNIPHY_A:
-               enc10->base.preferred_engine = ENGINE_ID_DIGA;
-       break;
-       case TRANSMITTER_UNIPHY_B:
-               enc10->base.preferred_engine = ENGINE_ID_DIGB;
-       break;
-       case TRANSMITTER_UNIPHY_C:
-               enc10->base.preferred_engine = ENGINE_ID_DIGC;
-       break;
-       case TRANSMITTER_UNIPHY_D:
-               enc10->base.preferred_engine = ENGINE_ID_DIGD;
-       break;
-       case TRANSMITTER_UNIPHY_E:
-               enc10->base.preferred_engine = ENGINE_ID_DIGE;
-       break;
-       default:
-               ASSERT_CRITICAL(false);
-               enc10->base.preferred_engine = ENGINE_ID_UNKNOWN;
-       }
-
-       /* default to one to mirror Windows behavior */
-       enc10->base.features.flags.bits.HDMI_6GB_EN = 1;
-
-       if (bp_funcs->get_connector_speed_cap_info)
-               result = bp_funcs->get_connector_speed_cap_info(enc10->base.ctx->dc_bios,
-                                               enc10->base.connector, &bp_cap_info);
-
-       /* Override features with DCE-specific values */
-       if (result == BP_RESULT_OK) {
-               enc10->base.features.flags.bits.IS_HBR2_CAPABLE =
-                               bp_cap_info.DP_HBR2_EN;
-               enc10->base.features.flags.bits.IS_HBR3_CAPABLE =
-                               bp_cap_info.DP_HBR3_EN;
-               enc10->base.features.flags.bits.HDMI_6GB_EN = bp_cap_info.HDMI_6GB_EN;
-               enc10->base.features.flags.bits.IS_DP2_CAPABLE = 1;
-               enc10->base.features.flags.bits.IS_UHBR10_CAPABLE = bp_cap_info.DP_UHBR10_EN;
-               enc10->base.features.flags.bits.IS_UHBR13_5_CAPABLE = bp_cap_info.DP_UHBR13_5_EN;
-               enc10->base.features.flags.bits.IS_UHBR20_CAPABLE = bp_cap_info.DP_UHBR20_EN;
-       } else {
-               DC_LOG_WARNING("%s: Failed to get encoder_cap_info from VBIOS with error code %d!\n",
-                               __func__,
-                               result);
-       }
-       if (enc10->base.ctx->dc->debug.hdmi20_disable) {
-               enc10->base.features.flags.bits.HDMI_6GB_EN = 0;
-       }
-}
diff --git a/drivers/gpu/drm/amd/display/dc/dcn32/dcn32_dio_link_encoder.h b/drivers/gpu/drm/amd/display/dc/dcn32/dcn32_dio_link_encoder.h
deleted file mode 100644 (file)
index 35d23d9..0000000
+++ /dev/null
@@ -1,53 +0,0 @@
-/*
- * Copyright 2021 Advanced Micro Devices, Inc.
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the "Software"),
- * to deal in the Software without restriction, including without limitation
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
- *  and/or sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
- * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
- * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
- * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
- * OTHER DEALINGS IN THE SOFTWARE.
- *
- * Authors: AMD
- *
- */
-
-#ifndef __DC_LINK_ENCODER__DCN32_H__
-#define __DC_LINK_ENCODER__DCN32_H__
-
-#include "dcn30/dcn30_dio_link_encoder.h"
-
-void dcn32_link_encoder_construct(
-       struct dcn20_link_encoder *enc20,
-       const struct encoder_init_data *init_data,
-       const struct encoder_feature_support *enc_features,
-       const struct dcn10_link_enc_registers *link_regs,
-       const struct dcn10_link_enc_aux_registers *aux_regs,
-       const struct dcn10_link_enc_hpd_registers *hpd_regs,
-       const struct dcn10_link_enc_shift *link_shift,
-       const struct dcn10_link_enc_mask *link_mask);
-
-void enc32_hw_init(struct link_encoder *enc);
-
-void dcn32_link_encoder_enable_dp_output(
-       struct link_encoder *enc,
-       const struct dc_link_settings *link_settings,
-       enum clock_source_id clock_source);
-
-bool dcn32_link_encoder_is_in_alt_mode(struct link_encoder *enc);
-
-void dcn32_link_encoder_get_max_link_cap(struct link_encoder *enc,
-       struct dc_link_settings *link_settings);
-
-#endif /* __DC_LINK_ENCODER__DCN32_H__ */
diff --git a/drivers/gpu/drm/amd/display/dc/dcn32/dcn32_dio_stream_encoder.c b/drivers/gpu/drm/amd/display/dc/dcn32/dcn32_dio_stream_encoder.c
deleted file mode 100644 (file)
index 1a9bb61..0000000
+++ /dev/null
@@ -1,493 +0,0 @@
-/*
- * Copyright 2021 Advanced Micro Devices, Inc.
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the "Software"),
- * to deal in the Software without restriction, including without limitation
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
- *  and/or sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
- * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
- * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
- * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
- * OTHER DEALINGS IN THE SOFTWARE.
- *
- * Authors: AMD
- *
- */
-
-
-#include "dc_bios_types.h"
-#include "dcn30/dcn30_dio_stream_encoder.h"
-#include "dcn32_dio_stream_encoder.h"
-#include "reg_helper.h"
-#include "hw_shared.h"
-#include "link.h"
-#include "dpcd_defs.h"
-
-#define DC_LOGGER \
-               enc1->base.ctx->logger
-
-#define REG(reg)\
-       (enc1->regs->reg)
-
-#undef FN
-#define FN(reg_name, field_name) \
-       enc1->se_shift->field_name, enc1->se_mask->field_name
-
-#define VBI_LINE_0 0
-#define HDMI_CLOCK_CHANNEL_RATE_MORE_340M 340000
-
-#define CTX \
-       enc1->base.ctx
-
-
-
-static void enc32_dp_set_odm_combine(
-       struct stream_encoder *enc,
-       bool two_pixel_per_cyle)
-{
-       struct dcn10_stream_encoder *enc1 = DCN10STRENC_FROM_STRENC(enc);
-
-       REG_UPDATE(DP_PIXEL_FORMAT, DP_PIXEL_PER_CYCLE_PROCESSING_MODE, two_pixel_per_cyle ? 1 : 0);
-}
-
-/* setup stream encoder in dvi mode */
-static void enc32_stream_encoder_dvi_set_stream_attribute(
-       struct stream_encoder *enc,
-       struct dc_crtc_timing *crtc_timing,
-       bool is_dual_link)
-{
-       struct dcn10_stream_encoder *enc1 = DCN10STRENC_FROM_STRENC(enc);
-
-       if (!enc->ctx->dc->debug.avoid_vbios_exec_table) {
-               struct bp_encoder_control cntl = {0};
-
-               cntl.action = ENCODER_CONTROL_SETUP;
-               cntl.engine_id = enc1->base.id;
-               cntl.signal = is_dual_link ?
-                       SIGNAL_TYPE_DVI_DUAL_LINK : SIGNAL_TYPE_DVI_SINGLE_LINK;
-               cntl.enable_dp_audio = false;
-               cntl.pixel_clock = crtc_timing->pix_clk_100hz / 10;
-               cntl.lanes_number = (is_dual_link) ? LANE_COUNT_EIGHT : LANE_COUNT_FOUR;
-
-               if (enc1->base.bp->funcs->encoder_control(
-                               enc1->base.bp, &cntl) != BP_RESULT_OK)
-                       return;
-
-       } else {
-
-               //Set pattern for clock channel, default vlue 0x63 does not work
-               REG_UPDATE(DIG_CLOCK_PATTERN, DIG_CLOCK_PATTERN, 0x1F);
-
-               //DIG_BE_TMDS_DVI_MODE : TMDS-DVI mode is already set in link_encoder_setup
-
-               //DIG_SOURCE_SELECT is already set in dig_connect_to_otg
-
-               /* DIG_START is removed from the register spec */
-       }
-
-       ASSERT(crtc_timing->pixel_encoding == PIXEL_ENCODING_RGB);
-       ASSERT(crtc_timing->display_color_depth == COLOR_DEPTH_888);
-       enc1_stream_encoder_set_stream_attribute_helper(enc1, crtc_timing);
-}
-
-/* setup stream encoder in hdmi mode */
-static void enc32_stream_encoder_hdmi_set_stream_attribute(
-       struct stream_encoder *enc,
-       struct dc_crtc_timing *crtc_timing,
-       int actual_pix_clk_khz,
-       bool enable_audio)
-{
-       struct dcn10_stream_encoder *enc1 = DCN10STRENC_FROM_STRENC(enc);
-
-       if (!enc->ctx->dc->debug.avoid_vbios_exec_table) {
-               struct bp_encoder_control cntl = {0};
-
-               cntl.action = ENCODER_CONTROL_SETUP;
-               cntl.engine_id = enc1->base.id;
-               cntl.signal = SIGNAL_TYPE_HDMI_TYPE_A;
-               cntl.enable_dp_audio = enable_audio;
-               cntl.pixel_clock = actual_pix_clk_khz;
-               cntl.lanes_number = LANE_COUNT_FOUR;
-
-               if (enc1->base.bp->funcs->encoder_control(
-                               enc1->base.bp, &cntl) != BP_RESULT_OK)
-                       return;
-
-       } else {
-
-               //Set pattern for clock channel, default vlue 0x63 does not work
-               REG_UPDATE(DIG_CLOCK_PATTERN, DIG_CLOCK_PATTERN, 0x1F);
-
-               //DIG_BE_TMDS_HDMI_MODE : TMDS-HDMI mode is already set in link_encoder_setup
-
-               //DIG_SOURCE_SELECT is already set in dig_connect_to_otg
-
-               /* DIG_START is removed from the register spec */
-       }
-
-       /* Configure pixel encoding */
-       enc1_stream_encoder_set_stream_attribute_helper(enc1, crtc_timing);
-
-       /* setup HDMI engine */
-       REG_UPDATE_6(HDMI_CONTROL,
-               HDMI_PACKET_GEN_VERSION, 1,
-               HDMI_KEEPOUT_MODE, 1,
-               HDMI_DEEP_COLOR_ENABLE, 0,
-               HDMI_DATA_SCRAMBLE_EN, 0,
-               HDMI_NO_EXTRA_NULL_PACKET_FILLED, 1,
-               HDMI_CLOCK_CHANNEL_RATE, 0);
-
-       /* Configure color depth */
-       switch (crtc_timing->display_color_depth) {
-       case COLOR_DEPTH_888:
-               REG_UPDATE(HDMI_CONTROL, HDMI_DEEP_COLOR_DEPTH, 0);
-               break;
-       case COLOR_DEPTH_101010:
-               if (crtc_timing->pixel_encoding == PIXEL_ENCODING_YCBCR422) {
-                       REG_UPDATE_2(HDMI_CONTROL,
-                                       HDMI_DEEP_COLOR_DEPTH, 1,
-                                       HDMI_DEEP_COLOR_ENABLE, 0);
-               } else {
-                       REG_UPDATE_2(HDMI_CONTROL,
-                                       HDMI_DEEP_COLOR_DEPTH, 1,
-                                       HDMI_DEEP_COLOR_ENABLE, 1);
-                       }
-               break;
-       case COLOR_DEPTH_121212:
-               if (crtc_timing->pixel_encoding == PIXEL_ENCODING_YCBCR422) {
-                       REG_UPDATE_2(HDMI_CONTROL,
-                                       HDMI_DEEP_COLOR_DEPTH, 2,
-                                       HDMI_DEEP_COLOR_ENABLE, 0);
-               } else {
-                       REG_UPDATE_2(HDMI_CONTROL,
-                                       HDMI_DEEP_COLOR_DEPTH, 2,
-                                       HDMI_DEEP_COLOR_ENABLE, 1);
-                       }
-               break;
-       case COLOR_DEPTH_161616:
-               REG_UPDATE_2(HDMI_CONTROL,
-                               HDMI_DEEP_COLOR_DEPTH, 3,
-                               HDMI_DEEP_COLOR_ENABLE, 1);
-               break;
-       default:
-               break;
-       }
-
-       if (actual_pix_clk_khz >= HDMI_CLOCK_CHANNEL_RATE_MORE_340M) {
-               /* enable HDMI data scrambler
-                * HDMI_CLOCK_CHANNEL_RATE_MORE_340M
-                * Clock channel frequency is 1/4 of character rate.
-                */
-               REG_UPDATE_2(HDMI_CONTROL,
-                       HDMI_DATA_SCRAMBLE_EN, 1,
-                       HDMI_CLOCK_CHANNEL_RATE, 1);
-       } else if (crtc_timing->flags.LTE_340MCSC_SCRAMBLE) {
-
-               /* TODO: New feature for DCE11, still need to implement */
-
-               /* enable HDMI data scrambler
-                * HDMI_CLOCK_CHANNEL_FREQ_EQUAL_TO_CHAR_RATE
-                * Clock channel frequency is the same
-                * as character rate
-                */
-               REG_UPDATE_2(HDMI_CONTROL,
-                       HDMI_DATA_SCRAMBLE_EN, 1,
-                       HDMI_CLOCK_CHANNEL_RATE, 0);
-       }
-
-
-       /* Enable transmission of General Control packet on every frame */
-       REG_UPDATE_3(HDMI_VBI_PACKET_CONTROL,
-               HDMI_GC_CONT, 1,
-               HDMI_GC_SEND, 1,
-               HDMI_NULL_SEND, 1);
-
-       /* Disable Audio Content Protection packet transmission */
-       REG_UPDATE(HDMI_VBI_PACKET_CONTROL, HDMI_ACP_SEND, 0);
-
-       /* following belongs to audio */
-       /* Enable Audio InfoFrame packet transmission. */
-       REG_UPDATE(HDMI_INFOFRAME_CONTROL0, HDMI_AUDIO_INFO_SEND, 1);
-
-       /* update double-buffered AUDIO_INFO registers immediately */
-       ASSERT(enc->afmt);
-       enc->afmt->funcs->audio_info_immediate_update(enc->afmt);
-
-       /* Select line number on which to send Audio InfoFrame packets */
-       REG_UPDATE(HDMI_INFOFRAME_CONTROL1, HDMI_AUDIO_INFO_LINE,
-                               VBI_LINE_0 + 2);
-
-       /* set HDMI GC AVMUTE */
-       REG_UPDATE(HDMI_GC, HDMI_GC_AVMUTE, 0);
-}
-
-
-
-static bool is_two_pixels_per_containter(const struct dc_crtc_timing *timing)
-{
-       bool two_pix = timing->pixel_encoding == PIXEL_ENCODING_YCBCR420;
-
-       two_pix = two_pix || (timing->flags.DSC && timing->pixel_encoding == PIXEL_ENCODING_YCBCR422
-                       && !timing->dsc_cfg.ycbcr422_simple);
-       return two_pix;
-}
-
-void enc32_stream_encoder_dp_unblank(
-       struct dc_link *link,
-       struct stream_encoder *enc,
-       const struct encoder_unblank_param *param)
-{
-       struct dcn10_stream_encoder *enc1 = DCN10STRENC_FROM_STRENC(enc);
-
-       if (param->link_settings.link_rate != LINK_RATE_UNKNOWN) {
-               uint32_t n_vid = 0x8000;
-               uint32_t m_vid;
-               uint32_t n_multiply = 0;
-               uint32_t pix_per_cycle = 0;
-               uint64_t m_vid_l = n_vid;
-
-               /* YCbCr 4:2:0 : Computed VID_M will be 2X the input rate */
-               if (is_two_pixels_per_containter(&param->timing) || param->opp_cnt > 1
-                       || param->pix_per_cycle > 1) {
-                       /*this logic should be the same in get_pixel_clock_parameters() */
-                       n_multiply = 1;
-                       pix_per_cycle = 1;
-               }
-               /* M / N = Fstream / Flink
-                * m_vid / n_vid = pixel rate / link rate
-                */
-
-               m_vid_l *= param->timing.pix_clk_100hz / 10;
-               m_vid_l = div_u64(m_vid_l,
-                       param->link_settings.link_rate
-                               * LINK_RATE_REF_FREQ_IN_KHZ);
-
-               m_vid = (uint32_t) m_vid_l;
-
-               /* enable auto measurement */
-
-               REG_UPDATE(DP_VID_TIMING, DP_VID_M_N_GEN_EN, 0);
-
-               /* auto measurement need 1 full 0x8000 symbol cycle to kick in,
-                * therefore program initial value for Mvid and Nvid
-                */
-
-               REG_UPDATE(DP_VID_N, DP_VID_N, n_vid);
-
-               REG_UPDATE(DP_VID_M, DP_VID_M, m_vid);
-
-               REG_UPDATE_2(DP_VID_TIMING,
-                               DP_VID_M_N_GEN_EN, 1,
-                               DP_VID_N_MUL, n_multiply);
-
-               REG_UPDATE(DP_PIXEL_FORMAT,
-                               DP_PIXEL_PER_CYCLE_PROCESSING_MODE,
-                               pix_per_cycle);
-       }
-
-       /* make sure stream is disabled before resetting steer fifo */
-       REG_UPDATE(DP_VID_STREAM_CNTL, DP_VID_STREAM_ENABLE, false);
-       REG_WAIT(DP_VID_STREAM_CNTL, DP_VID_STREAM_STATUS, 0, 10, 5000);
-
-       /* DIG_START is removed from the register spec */
-
-       /* switch DP encoder to CRTC data, but reset it the fifo first. It may happen
-        * that it overflows during mode transition, and sometimes doesn't recover.
-        */
-       REG_UPDATE(DP_STEER_FIFO, DP_STEER_FIFO_RESET, 1);
-       udelay(10);
-
-       REG_UPDATE(DP_STEER_FIFO, DP_STEER_FIFO_RESET, 0);
-
-       /* DIG Resync FIFO now needs to be explicitly enabled
-        */
-       // TODO: Confirm if we need to wait for DIG_SYMCLK_FE_ON
-       REG_WAIT(DIG_FE_CNTL, DIG_SYMCLK_FE_ON, 1, 10, 5000);
-
-       /* read start level = 0 will bring underflow / overflow and DIG_FIFO_ERROR = 1
-        * so set it to 1/2 full = 7 before reset as suggested by hardware team.
-        */
-       REG_UPDATE(DIG_FIFO_CTRL0, DIG_FIFO_READ_START_LEVEL, 0x7);
-
-       REG_UPDATE(DIG_FIFO_CTRL0, DIG_FIFO_RESET, 1);
-
-       REG_WAIT(DIG_FIFO_CTRL0, DIG_FIFO_RESET_DONE, 1, 10, 5000);
-
-       REG_UPDATE(DIG_FIFO_CTRL0, DIG_FIFO_RESET, 0);
-
-       REG_WAIT(DIG_FIFO_CTRL0, DIG_FIFO_RESET_DONE, 0, 10, 5000);
-
-       REG_UPDATE(DIG_FIFO_CTRL0, DIG_FIFO_ENABLE, 1);
-
-       /* wait 100us for DIG/DP logic to prime
-        * (i.e. a few video lines)
-        */
-       udelay(100);
-
-       /* the hardware would start sending video at the start of the next DP
-        * frame (i.e. rising edge of the vblank).
-        * NOTE: We used to program DP_VID_STREAM_DIS_DEFER = 2 here, but this
-        * register has no effect on enable transition! HW always guarantees
-        * VID_STREAM enable at start of next frame, and this is not
-        * programmable
-        */
-
-       REG_UPDATE(DP_VID_STREAM_CNTL, DP_VID_STREAM_ENABLE, true);
-
-       link->dc->link_srv->dp_trace_source_sequence(link, DPCD_SOURCE_SEQ_AFTER_ENABLE_DP_VID_STREAM);
-}
-
-/* Set DSC-related configuration.
- *   dsc_mode: 0 disables DSC, other values enable DSC in specified format
- *   sc_bytes_per_pixel: DP_DSC_BYTES_PER_PIXEL removed in DCN32
- *   dsc_slice_width: DP_DSC_SLICE_WIDTH removed in DCN32
- */
-static void enc32_dp_set_dsc_config(struct stream_encoder *enc,
-                                       enum optc_dsc_mode dsc_mode,
-                                       uint32_t dsc_bytes_per_pixel,
-                                       uint32_t dsc_slice_width)
-{
-       struct dcn10_stream_encoder *enc1 = DCN10STRENC_FROM_STRENC(enc);
-
-       REG_UPDATE(DP_DSC_CNTL, DP_DSC_MODE, dsc_mode == OPTC_DSC_DISABLED ? 0 : 1);
-}
-
-/* this function read dsc related register fields to be logged later in dcn10_log_hw_state
- * into a dcn_dsc_state struct.
- */
-static void enc32_read_state(struct stream_encoder *enc, struct enc_state *s)
-{
-       struct dcn10_stream_encoder *enc1 = DCN10STRENC_FROM_STRENC(enc);
-
-       //if dsc is enabled, continue to read
-       REG_GET(DP_DSC_CNTL, DP_DSC_MODE, &s->dsc_mode);
-       if (s->dsc_mode) {
-               REG_GET(DP_GSP11_CNTL, DP_SEC_GSP11_LINE_NUM, &s->sec_gsp_pps_line_num);
-
-               REG_GET(DP_MSA_VBID_MISC, DP_VBID6_LINE_REFERENCE, &s->vbid6_line_reference);
-               REG_GET(DP_MSA_VBID_MISC, DP_VBID6_LINE_NUM, &s->vbid6_line_num);
-
-               REG_GET(DP_GSP11_CNTL, DP_SEC_GSP11_ENABLE, &s->sec_gsp_pps_enable);
-               REG_GET(DP_SEC_CNTL, DP_SEC_STREAM_ENABLE, &s->sec_stream_enable);
-       }
-}
-
-static void enc32_set_dig_input_mode(struct stream_encoder *enc, unsigned int pix_per_container)
-{
-       struct dcn10_stream_encoder *enc1 = DCN10STRENC_FROM_STRENC(enc);
-
-       /* The naming of this field is confusing, what it means is the output mode of otg, which
-        * is the input mode of the dig
-        */
-       REG_UPDATE(DIG_FIFO_CTRL0, DIG_FIFO_OUTPUT_PIXEL_MODE, pix_per_container == 2 ? 0x1 : 0x0);
-}
-
-static void enc32_reset_fifo(struct stream_encoder *enc, bool reset)
-{
-       struct dcn10_stream_encoder *enc1 = DCN10STRENC_FROM_STRENC(enc);
-       uint32_t reset_val = reset ? 1 : 0;
-       uint32_t is_symclk_on;
-
-       REG_UPDATE(DIG_FIFO_CTRL0, DIG_FIFO_RESET, reset_val);
-       REG_GET(DIG_FE_CNTL, DIG_SYMCLK_FE_ON, &is_symclk_on);
-
-       if (is_symclk_on)
-               REG_WAIT(DIG_FIFO_CTRL0, DIG_FIFO_RESET_DONE, reset_val, 10, 5000);
-       else
-               udelay(10);
-}
-
-void enc32_enable_fifo(struct stream_encoder *enc)
-{
-       struct dcn10_stream_encoder *enc1 = DCN10STRENC_FROM_STRENC(enc);
-
-       REG_UPDATE(DIG_FIFO_CTRL0, DIG_FIFO_READ_START_LEVEL, 0x7);
-
-       enc32_reset_fifo(enc, true);
-       enc32_reset_fifo(enc, false);
-
-       REG_UPDATE(DIG_FIFO_CTRL0, DIG_FIFO_ENABLE, 1);
-}
-
-static const struct stream_encoder_funcs dcn32_str_enc_funcs = {
-       .dp_set_odm_combine =
-               enc32_dp_set_odm_combine,
-       .dp_set_stream_attribute =
-               enc2_stream_encoder_dp_set_stream_attribute,
-       .hdmi_set_stream_attribute =
-               enc32_stream_encoder_hdmi_set_stream_attribute,
-       .dvi_set_stream_attribute =
-               enc32_stream_encoder_dvi_set_stream_attribute,
-       .set_throttled_vcp_size =
-               enc1_stream_encoder_set_throttled_vcp_size,
-       .update_hdmi_info_packets =
-               enc3_stream_encoder_update_hdmi_info_packets,
-       .stop_hdmi_info_packets =
-               enc3_stream_encoder_stop_hdmi_info_packets,
-       .update_dp_info_packets_sdp_line_num =
-               enc3_stream_encoder_update_dp_info_packets_sdp_line_num,
-       .update_dp_info_packets =
-               enc3_stream_encoder_update_dp_info_packets,
-       .stop_dp_info_packets =
-               enc1_stream_encoder_stop_dp_info_packets,
-       .dp_blank =
-               enc1_stream_encoder_dp_blank,
-       .dp_unblank =
-               enc32_stream_encoder_dp_unblank,
-       .audio_mute_control = enc3_audio_mute_control,
-
-       .dp_audio_setup = enc3_se_dp_audio_setup,
-       .dp_audio_enable = enc3_se_dp_audio_enable,
-       .dp_audio_disable = enc1_se_dp_audio_disable,
-
-       .hdmi_audio_setup = enc3_se_hdmi_audio_setup,
-       .hdmi_audio_disable = enc1_se_hdmi_audio_disable,
-       .setup_stereo_sync  = enc1_setup_stereo_sync,
-       .set_avmute = enc1_stream_encoder_set_avmute,
-       .dig_connect_to_otg = enc1_dig_connect_to_otg,
-       .dig_source_otg = enc1_dig_source_otg,
-
-       .dp_get_pixel_format  = enc1_stream_encoder_dp_get_pixel_format,
-
-       .enc_read_state = enc32_read_state,
-       .dp_set_dsc_config = enc32_dp_set_dsc_config,
-       .dp_set_dsc_pps_info_packet = enc3_dp_set_dsc_pps_info_packet,
-       .set_dynamic_metadata = enc2_set_dynamic_metadata,
-       .hdmi_reset_stream_attribute = enc1_reset_hdmi_stream_attribute,
-
-       .set_input_mode = enc32_set_dig_input_mode,
-       .enable_fifo = enc32_enable_fifo,
-};
-
-void dcn32_dio_stream_encoder_construct(
-       struct dcn10_stream_encoder *enc1,
-       struct dc_context *ctx,
-       struct dc_bios *bp,
-       enum engine_id eng_id,
-       struct vpg *vpg,
-       struct afmt *afmt,
-       const struct dcn10_stream_enc_registers *regs,
-       const struct dcn10_stream_encoder_shift *se_shift,
-       const struct dcn10_stream_encoder_mask *se_mask)
-{
-       enc1->base.funcs = &dcn32_str_enc_funcs;
-       enc1->base.ctx = ctx;
-       enc1->base.id = eng_id;
-       enc1->base.bp = bp;
-       enc1->base.vpg = vpg;
-       enc1->base.afmt = afmt;
-       enc1->regs = regs;
-       enc1->se_shift = se_shift;
-       enc1->se_mask = se_mask;
-       enc1->base.stream_enc_inst = vpg->inst;
-}
-
diff --git a/drivers/gpu/drm/amd/display/dc/dcn32/dcn32_dio_stream_encoder.h b/drivers/gpu/drm/amd/display/dc/dcn32/dcn32_dio_stream_encoder.h
deleted file mode 100644 (file)
index ca53d39..0000000
+++ /dev/null
@@ -1,206 +0,0 @@
-/*
- * Copyright 2021 - Advanced Micro Devices, Inc.
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the "Software"),
- * to deal in the Software without restriction, including without limitation
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
- *  and/or sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
- * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
- * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
- * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
- * OTHER DEALINGS IN THE SOFTWARE.
- *
- * Authors: AMD
- *
- */
-
-#ifndef __DC_DIO_STREAM_ENCODER_DCN32_H__
-#define __DC_DIO_STREAM_ENCODER_DCN32_H__
-
-#include "dcn30/dcn30_vpg.h"
-#include "dcn30/dcn30_afmt.h"
-#include "stream_encoder.h"
-#include "dcn20/dcn20_stream_encoder.h"
-
-#define SE_COMMON_MASK_SH_LIST_DCN32(mask_sh)\
-       SE_SF(DP0_DP_PIXEL_FORMAT, DP_PIXEL_ENCODING, mask_sh),\
-       SE_SF(DP0_DP_PIXEL_FORMAT, DP_COMPONENT_DEPTH, mask_sh),\
-       SE_SF(DP0_DP_PIXEL_FORMAT, DP_PIXEL_PER_CYCLE_PROCESSING_MODE, mask_sh),\
-       SE_SF(DIG0_HDMI_CONTROL, HDMI_PACKET_GEN_VERSION, mask_sh),\
-       SE_SF(DIG0_HDMI_CONTROL, HDMI_KEEPOUT_MODE, mask_sh),\
-       SE_SF(DIG0_HDMI_CONTROL, HDMI_DEEP_COLOR_ENABLE, mask_sh),\
-       SE_SF(DIG0_HDMI_CONTROL, HDMI_DEEP_COLOR_DEPTH, mask_sh),\
-       SE_SF(DIG0_HDMI_CONTROL, HDMI_DATA_SCRAMBLE_EN, mask_sh),\
-       SE_SF(DIG0_HDMI_CONTROL, HDMI_NO_EXTRA_NULL_PACKET_FILLED, mask_sh),\
-       SE_SF(DIG0_HDMI_VBI_PACKET_CONTROL, HDMI_GC_CONT, mask_sh),\
-       SE_SF(DIG0_HDMI_VBI_PACKET_CONTROL, HDMI_GC_SEND, mask_sh),\
-       SE_SF(DIG0_HDMI_VBI_PACKET_CONTROL, HDMI_NULL_SEND, mask_sh),\
-       SE_SF(DIG0_HDMI_VBI_PACKET_CONTROL, HDMI_ACP_SEND, mask_sh),\
-       SE_SF(DIG0_HDMI_INFOFRAME_CONTROL0, HDMI_AUDIO_INFO_SEND, mask_sh),\
-       SE_SF(DIG0_HDMI_INFOFRAME_CONTROL1, HDMI_AUDIO_INFO_LINE, mask_sh),\
-       SE_SF(DIG0_HDMI_GC, HDMI_GC_AVMUTE, mask_sh),\
-       SE_SF(DP0_DP_MSE_RATE_CNTL, DP_MSE_RATE_X, mask_sh),\
-       SE_SF(DP0_DP_MSE_RATE_CNTL, DP_MSE_RATE_Y, mask_sh),\
-       SE_SF(DP0_DP_MSE_RATE_UPDATE, DP_MSE_RATE_UPDATE_PENDING, mask_sh),\
-       SE_SF(DP0_DP_SEC_CNTL, DP_SEC_GSP0_ENABLE, mask_sh),\
-       SE_SF(DP0_DP_SEC_CNTL, DP_SEC_STREAM_ENABLE, mask_sh),\
-       SE_SF(DP0_DP_SEC_CNTL, DP_SEC_GSP1_ENABLE, mask_sh),\
-       SE_SF(DP0_DP_SEC_CNTL, DP_SEC_GSP2_ENABLE, mask_sh),\
-       SE_SF(DP0_DP_SEC_CNTL, DP_SEC_GSP3_ENABLE, mask_sh),\
-       SE_SF(DP0_DP_SEC_CNTL, DP_SEC_MPG_ENABLE, mask_sh),\
-       SE_SF(DP0_DP_SEC_CNTL1, DP_SEC_GSP5_LINE_REFERENCE, mask_sh),\
-       SE_SF(DP0_DP_SEC_CNTL2, DP_SEC_GSP4_SEND, mask_sh),\
-       SE_SF(DP0_DP_SEC_CNTL2, DP_SEC_GSP4_SEND_PENDING, mask_sh),\
-       SE_SF(DP0_DP_SEC_CNTL4, DP_SEC_GSP4_LINE_NUM, mask_sh),\
-       SE_SF(DP0_DP_SEC_CNTL5, DP_SEC_GSP5_LINE_NUM, mask_sh),\
-       SE_SF(DP0_DP_SEC_CNTL2, DP_SEC_GSP4_SEND_ANY_LINE, mask_sh),\
-       SE_SF(DP0_DP_VID_STREAM_CNTL, DP_VID_STREAM_DIS_DEFER, mask_sh),\
-       SE_SF(DP0_DP_VID_STREAM_CNTL, DP_VID_STREAM_ENABLE, mask_sh),\
-       SE_SF(DP0_DP_VID_STREAM_CNTL, DP_VID_STREAM_STATUS, mask_sh),\
-       SE_SF(DP0_DP_STEER_FIFO, DP_STEER_FIFO_RESET, mask_sh),\
-       SE_SF(DP0_DP_VID_TIMING, DP_VID_M_N_GEN_EN, mask_sh),\
-       SE_SF(DP0_DP_VID_N, DP_VID_N, mask_sh),\
-       SE_SF(DP0_DP_VID_M, DP_VID_M, mask_sh),\
-       SE_SF(DIG0_HDMI_AUDIO_PACKET_CONTROL, HDMI_AUDIO_DELAY_EN, mask_sh),\
-       SE_SF(DIG0_HDMI_ACR_PACKET_CONTROL, HDMI_ACR_AUTO_SEND, mask_sh),\
-       SE_SF(DIG0_HDMI_ACR_PACKET_CONTROL, HDMI_ACR_SOURCE, mask_sh),\
-       SE_SF(DIG0_HDMI_ACR_PACKET_CONTROL, HDMI_ACR_AUDIO_PRIORITY, mask_sh),\
-       SE_SF(DIG0_HDMI_ACR_32_0, HDMI_ACR_CTS_32, mask_sh),\
-       SE_SF(DIG0_HDMI_ACR_32_1, HDMI_ACR_N_32, mask_sh),\
-       SE_SF(DIG0_HDMI_ACR_44_0, HDMI_ACR_CTS_44, mask_sh),\
-       SE_SF(DIG0_HDMI_ACR_44_1, HDMI_ACR_N_44, mask_sh),\
-       SE_SF(DIG0_HDMI_ACR_48_0, HDMI_ACR_CTS_48, mask_sh),\
-       SE_SF(DIG0_HDMI_ACR_48_1, HDMI_ACR_N_48, mask_sh),\
-       SE_SF(DP0_DP_SEC_AUD_N, DP_SEC_AUD_N, mask_sh),\
-       SE_SF(DP0_DP_SEC_TIMESTAMP, DP_SEC_TIMESTAMP_MODE, mask_sh),\
-       SE_SF(DP0_DP_SEC_CNTL, DP_SEC_ASP_ENABLE, mask_sh),\
-       SE_SF(DP0_DP_SEC_CNTL, DP_SEC_ATP_ENABLE, mask_sh),\
-       SE_SF(DP0_DP_SEC_CNTL, DP_SEC_AIP_ENABLE, mask_sh),\
-       SE_SF(DP0_DP_SEC_CNTL, DP_SEC_ACM_ENABLE, mask_sh),\
-       SE_SF(DIG0_AFMT_CNTL, AFMT_AUDIO_CLOCK_EN, mask_sh),\
-       SE_SF(DIG0_HDMI_CONTROL, HDMI_CLOCK_CHANNEL_RATE, mask_sh),\
-       SE_SF(DIG0_DIG_FE_CNTL, TMDS_PIXEL_ENCODING, mask_sh),\
-       SE_SF(DIG0_DIG_FE_CNTL, TMDS_COLOR_FORMAT, mask_sh),\
-       SE_SF(DIG0_DIG_FE_CNTL, DIG_STEREOSYNC_SELECT, mask_sh),\
-       SE_SF(DIG0_DIG_FE_CNTL, DIG_STEREOSYNC_GATE_EN, mask_sh),\
-       SE_SF(DP0_DP_SEC_CNTL, DP_SEC_GSP4_ENABLE, mask_sh),\
-       SE_SF(DP0_DP_SEC_CNTL, DP_SEC_GSP5_ENABLE, mask_sh),\
-       SE_SF(DP0_DP_SEC_CNTL, DP_SEC_GSP6_ENABLE, mask_sh),\
-       SE_SF(DP0_DP_SEC_CNTL, DP_SEC_GSP7_ENABLE, mask_sh),\
-       SE_SF(DP0_DP_SEC_CNTL2, DP_SEC_GSP7_SEND, mask_sh),\
-       SE_SF(DP0_DP_SEC_CNTL6, DP_SEC_GSP7_LINE_NUM, mask_sh),\
-       SE_SF(DP0_DP_SEC_CNTL2, DP_SEC_GSP11_PPS, mask_sh),\
-       SE_SF(DP0_DP_GSP11_CNTL, DP_SEC_GSP11_ENABLE, mask_sh),\
-       SE_SF(DP0_DP_GSP11_CNTL, DP_SEC_GSP11_LINE_NUM, mask_sh),\
-       SE_SF(DP0_DP_DB_CNTL, DP_DB_DISABLE, mask_sh),\
-       SE_SF(DP0_DP_MSA_COLORIMETRY, DP_MSA_MISC0, mask_sh),\
-       SE_SF(DP0_DP_MSA_TIMING_PARAM1, DP_MSA_HTOTAL, mask_sh),\
-       SE_SF(DP0_DP_MSA_TIMING_PARAM1, DP_MSA_VTOTAL, mask_sh),\
-       SE_SF(DP0_DP_MSA_TIMING_PARAM2, DP_MSA_HSTART, mask_sh),\
-       SE_SF(DP0_DP_MSA_TIMING_PARAM2, DP_MSA_VSTART, mask_sh),\
-       SE_SF(DP0_DP_MSA_TIMING_PARAM3, DP_MSA_HSYNCWIDTH, mask_sh),\
-       SE_SF(DP0_DP_MSA_TIMING_PARAM3, DP_MSA_HSYNCPOLARITY, mask_sh),\
-       SE_SF(DP0_DP_MSA_TIMING_PARAM3, DP_MSA_VSYNCWIDTH, mask_sh),\
-       SE_SF(DP0_DP_MSA_TIMING_PARAM3, DP_MSA_VSYNCPOLARITY, mask_sh),\
-       SE_SF(DP0_DP_MSA_TIMING_PARAM4, DP_MSA_HWIDTH, mask_sh),\
-       SE_SF(DP0_DP_MSA_TIMING_PARAM4, DP_MSA_VHEIGHT, mask_sh),\
-       SE_SF(DIG0_HDMI_DB_CONTROL, HDMI_DB_DISABLE, mask_sh),\
-       SE_SF(DP0_DP_VID_TIMING, DP_VID_N_MUL, mask_sh),\
-       SE_SF(DIG0_DIG_FE_CNTL, DIG_SOURCE_SELECT, mask_sh), \
-       SE_SF(DIG0_HDMI_GENERIC_PACKET_CONTROL0, HDMI_GENERIC0_CONT, mask_sh),\
-       SE_SF(DIG0_HDMI_GENERIC_PACKET_CONTROL0, HDMI_GENERIC0_SEND, mask_sh),\
-       SE_SF(DIG0_HDMI_GENERIC_PACKET_CONTROL0, HDMI_GENERIC1_CONT, mask_sh),\
-       SE_SF(DIG0_HDMI_GENERIC_PACKET_CONTROL0, HDMI_GENERIC1_SEND, mask_sh),\
-       SE_SF(DIG0_HDMI_GENERIC_PACKET_CONTROL0, HDMI_GENERIC2_CONT, mask_sh),\
-       SE_SF(DIG0_HDMI_GENERIC_PACKET_CONTROL0, HDMI_GENERIC2_SEND, mask_sh),\
-       SE_SF(DIG0_HDMI_GENERIC_PACKET_CONTROL0, HDMI_GENERIC3_CONT, mask_sh),\
-       SE_SF(DIG0_HDMI_GENERIC_PACKET_CONTROL0, HDMI_GENERIC3_SEND, mask_sh),\
-       SE_SF(DIG0_HDMI_GENERIC_PACKET_CONTROL0, HDMI_GENERIC4_CONT, mask_sh),\
-       SE_SF(DIG0_HDMI_GENERIC_PACKET_CONTROL0, HDMI_GENERIC4_SEND, mask_sh),\
-       SE_SF(DIG0_HDMI_GENERIC_PACKET_CONTROL0, HDMI_GENERIC5_CONT, mask_sh),\
-       SE_SF(DIG0_HDMI_GENERIC_PACKET_CONTROL0, HDMI_GENERIC5_SEND, mask_sh),\
-       SE_SF(DIG0_HDMI_GENERIC_PACKET_CONTROL0, HDMI_GENERIC6_CONT, mask_sh),\
-       SE_SF(DIG0_HDMI_GENERIC_PACKET_CONTROL0, HDMI_GENERIC6_SEND, mask_sh),\
-       SE_SF(DIG0_HDMI_GENERIC_PACKET_CONTROL0, HDMI_GENERIC7_CONT, mask_sh),\
-       SE_SF(DIG0_HDMI_GENERIC_PACKET_CONTROL0, HDMI_GENERIC7_SEND, mask_sh),\
-       SE_SF(DIG0_HDMI_GENERIC_PACKET_CONTROL6, HDMI_GENERIC8_CONT, mask_sh),\
-       SE_SF(DIG0_HDMI_GENERIC_PACKET_CONTROL6, HDMI_GENERIC8_SEND, mask_sh),\
-       SE_SF(DIG0_HDMI_GENERIC_PACKET_CONTROL6, HDMI_GENERIC9_CONT, mask_sh),\
-       SE_SF(DIG0_HDMI_GENERIC_PACKET_CONTROL6, HDMI_GENERIC9_SEND, mask_sh),\
-       SE_SF(DIG0_HDMI_GENERIC_PACKET_CONTROL6, HDMI_GENERIC10_CONT, mask_sh),\
-       SE_SF(DIG0_HDMI_GENERIC_PACKET_CONTROL6, HDMI_GENERIC10_SEND, mask_sh),\
-       SE_SF(DIG0_HDMI_GENERIC_PACKET_CONTROL6, HDMI_GENERIC11_CONT, mask_sh),\
-       SE_SF(DIG0_HDMI_GENERIC_PACKET_CONTROL6, HDMI_GENERIC11_SEND, mask_sh),\
-       SE_SF(DIG0_HDMI_GENERIC_PACKET_CONTROL6, HDMI_GENERIC12_CONT, mask_sh),\
-       SE_SF(DIG0_HDMI_GENERIC_PACKET_CONTROL6, HDMI_GENERIC12_SEND, mask_sh),\
-       SE_SF(DIG0_HDMI_GENERIC_PACKET_CONTROL6, HDMI_GENERIC13_CONT, mask_sh),\
-       SE_SF(DIG0_HDMI_GENERIC_PACKET_CONTROL6, HDMI_GENERIC13_SEND, mask_sh),\
-       SE_SF(DIG0_HDMI_GENERIC_PACKET_CONTROL6, HDMI_GENERIC14_CONT, mask_sh),\
-       SE_SF(DIG0_HDMI_GENERIC_PACKET_CONTROL6, HDMI_GENERIC14_SEND, mask_sh),\
-       SE_SF(DIG0_HDMI_GENERIC_PACKET_CONTROL1, HDMI_GENERIC0_LINE, mask_sh),\
-       SE_SF(DIG0_HDMI_GENERIC_PACKET_CONTROL1, HDMI_GENERIC1_LINE, mask_sh),\
-       SE_SF(DIG0_HDMI_GENERIC_PACKET_CONTROL2, HDMI_GENERIC2_LINE, mask_sh),\
-       SE_SF(DIG0_HDMI_GENERIC_PACKET_CONTROL2, HDMI_GENERIC3_LINE, mask_sh),\
-       SE_SF(DIG0_HDMI_GENERIC_PACKET_CONTROL3, HDMI_GENERIC4_LINE, mask_sh),\
-       SE_SF(DIG0_HDMI_GENERIC_PACKET_CONTROL3, HDMI_GENERIC5_LINE, mask_sh),\
-       SE_SF(DIG0_HDMI_GENERIC_PACKET_CONTROL4, HDMI_GENERIC6_LINE, mask_sh),\
-       SE_SF(DIG0_HDMI_GENERIC_PACKET_CONTROL4, HDMI_GENERIC7_LINE, mask_sh),\
-       SE_SF(DIG0_HDMI_GENERIC_PACKET_CONTROL7, HDMI_GENERIC8_LINE, mask_sh),\
-       SE_SF(DIG0_HDMI_GENERIC_PACKET_CONTROL7, HDMI_GENERIC9_LINE, mask_sh),\
-       SE_SF(DIG0_HDMI_GENERIC_PACKET_CONTROL8, HDMI_GENERIC10_LINE, mask_sh),\
-       SE_SF(DIG0_HDMI_GENERIC_PACKET_CONTROL8, HDMI_GENERIC11_LINE, mask_sh),\
-       SE_SF(DIG0_HDMI_GENERIC_PACKET_CONTROL9, HDMI_GENERIC12_LINE, mask_sh),\
-       SE_SF(DIG0_HDMI_GENERIC_PACKET_CONTROL9, HDMI_GENERIC13_LINE, mask_sh),\
-       SE_SF(DIG0_HDMI_GENERIC_PACKET_CONTROL10, HDMI_GENERIC14_LINE, mask_sh),\
-       SE_SF(DP0_DP_DSC_CNTL, DP_DSC_MODE, mask_sh),\
-       SE_SF(DP0_DP_MSA_VBID_MISC, DP_VBID6_LINE_REFERENCE, mask_sh),\
-       SE_SF(DP0_DP_MSA_VBID_MISC, DP_VBID6_LINE_NUM, mask_sh),\
-       SE_SF(DME0_DME_CONTROL, METADATA_ENGINE_EN, mask_sh),\
-       SE_SF(DME0_DME_CONTROL, METADATA_HUBP_REQUESTOR_ID, mask_sh),\
-       SE_SF(DME0_DME_CONTROL, METADATA_STREAM_TYPE, mask_sh),\
-       SE_SF(DP0_DP_SEC_METADATA_TRANSMISSION, DP_SEC_METADATA_PACKET_ENABLE, mask_sh),\
-       SE_SF(DP0_DP_SEC_METADATA_TRANSMISSION, DP_SEC_METADATA_PACKET_LINE_REFERENCE, mask_sh),\
-       SE_SF(DP0_DP_SEC_METADATA_TRANSMISSION, DP_SEC_METADATA_PACKET_LINE, mask_sh),\
-       SE_SF(DIG0_HDMI_METADATA_PACKET_CONTROL, HDMI_METADATA_PACKET_ENABLE, mask_sh),\
-       SE_SF(DIG0_HDMI_METADATA_PACKET_CONTROL, HDMI_METADATA_PACKET_LINE_REFERENCE, mask_sh),\
-       SE_SF(DIG0_HDMI_METADATA_PACKET_CONTROL, HDMI_METADATA_PACKET_LINE, mask_sh),\
-       SE_SF(DIG0_DIG_FE_CNTL, DOLBY_VISION_EN, mask_sh),\
-       SE_SF(DIG0_DIG_FE_CNTL, DIG_SYMCLK_FE_ON, mask_sh),\
-       SE_SF(DP0_DP_SEC_FRAMING4, DP_SST_SDP_SPLITTING, mask_sh),\
-       SE_SF(DIG0_DIG_CLOCK_PATTERN, DIG_CLOCK_PATTERN, mask_sh),\
-       SE_SF(DIG0_DIG_FIFO_CTRL0, DIG_FIFO_OUTPUT_PIXEL_MODE, mask_sh),\
-       SE_SF(DIG0_DIG_FIFO_CTRL0, DIG_FIFO_READ_START_LEVEL, mask_sh),\
-       SE_SF(DIG0_DIG_FIFO_CTRL0, DIG_FIFO_ENABLE, mask_sh),\
-       SE_SF(DIG0_DIG_FIFO_CTRL0, DIG_FIFO_RESET, mask_sh),\
-       SE_SF(DIG0_DIG_FIFO_CTRL0, DIG_FIFO_RESET_DONE, mask_sh)
-
-
-void dcn32_dio_stream_encoder_construct(
-       struct dcn10_stream_encoder *enc1,
-       struct dc_context *ctx,
-       struct dc_bios *bp,
-       enum engine_id eng_id,
-       struct vpg *vpg,
-       struct afmt *afmt,
-       const struct dcn10_stream_enc_registers *regs,
-       const struct dcn10_stream_encoder_shift *se_shift,
-       const struct dcn10_stream_encoder_mask *se_mask);
-
-
-void enc32_enable_fifo(struct stream_encoder *enc);
-
-void enc32_stream_encoder_dp_unblank(
-               struct dc_link *link,
-               struct stream_encoder *enc,
-               const struct encoder_unblank_param *param);
-
-#endif /* __DC_DIO_STREAM_ENCODER_DCN32_H__ */
diff --git a/drivers/gpu/drm/amd/display/dc/dcn32/dcn32_hpo_dp_link_encoder.c b/drivers/gpu/drm/amd/display/dc/dcn32/dcn32_hpo_dp_link_encoder.c
deleted file mode 100644 (file)
index 8af01f5..0000000
+++ /dev/null
@@ -1,89 +0,0 @@
-/*
- * Copyright 2019 Advanced Micro Devices, Inc.
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the "Software"),
- * to deal in the Software without restriction, including without limitation
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
- *  and/or sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
- * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
- * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
- * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
- * OTHER DEALINGS IN THE SOFTWARE.
- *
- * Authors: AMD
- *
- */
-#include "dc_bios_types.h"
-#include "dcn31/dcn31_hpo_dp_link_encoder.h"
-#include "dcn32_hpo_dp_link_encoder.h"
-#include "reg_helper.h"
-#include "stream_encoder.h"
-
-#define DC_LOGGER \
-               enc3->base.ctx->logger
-
-#define REG(reg)\
-       (enc3->regs->reg)
-
-#undef FN
-#define FN(reg_name, field_name) \
-       enc3->hpo_le_shift->field_name, enc3->hpo_le_mask->field_name
-
-#define CTX \
-       enc3->base.ctx
-
-static bool dcn32_hpo_dp_link_enc_is_in_alt_mode(
-               struct hpo_dp_link_encoder *enc)
-{
-       struct dcn31_hpo_dp_link_encoder *enc3 = DCN3_1_HPO_DP_LINK_ENC_FROM_HPO_LINK_ENC(enc);
-       uint32_t dp_alt_mode_disable = 0;
-
-       ASSERT((enc->transmitter >= TRANSMITTER_UNIPHY_A) && (enc->transmitter <= TRANSMITTER_UNIPHY_E));
-
-       /* if value == 1 alt mode is disabled, otherwise it is enabled */
-       REG_GET(RDPCSTX_PHY_CNTL6[enc->transmitter], RDPCS_PHY_DPALT_DISABLE, &dp_alt_mode_disable);
-       return (dp_alt_mode_disable == 0);
-}
-
-
-
-static struct hpo_dp_link_encoder_funcs dcn32_hpo_dp_link_encoder_funcs = {
-       .enable_link_phy = dcn31_hpo_dp_link_enc_enable_dp_output,
-       .disable_link_phy = dcn31_hpo_dp_link_enc_disable_output,
-       .link_enable = dcn31_hpo_dp_link_enc_enable,
-       .link_disable = dcn31_hpo_dp_link_enc_disable,
-       .set_link_test_pattern = dcn31_hpo_dp_link_enc_set_link_test_pattern,
-       .update_stream_allocation_table = dcn31_hpo_dp_link_enc_update_stream_allocation_table,
-       .set_throttled_vcp_size = dcn31_hpo_dp_link_enc_set_throttled_vcp_size,
-       .is_in_alt_mode = dcn32_hpo_dp_link_enc_is_in_alt_mode,
-       .read_state = dcn31_hpo_dp_link_enc_read_state,
-       .set_ffe = dcn31_hpo_dp_link_enc_set_ffe,
-};
-
-void hpo_dp_link_encoder32_construct(struct dcn31_hpo_dp_link_encoder *enc31,
-               struct dc_context *ctx,
-               uint32_t inst,
-               const struct dcn31_hpo_dp_link_encoder_registers *hpo_le_regs,
-               const struct dcn31_hpo_dp_link_encoder_shift *hpo_le_shift,
-               const struct dcn31_hpo_dp_link_encoder_mask *hpo_le_mask)
-{
-       enc31->base.ctx = ctx;
-
-       enc31->base.inst = inst;
-       enc31->base.funcs = &dcn32_hpo_dp_link_encoder_funcs;
-       enc31->base.hpd_source = HPD_SOURCEID_UNKNOWN;
-       enc31->base.transmitter = TRANSMITTER_UNKNOWN;
-
-       enc31->regs = hpo_le_regs;
-       enc31->hpo_le_shift = hpo_le_shift;
-       enc31->hpo_le_mask = hpo_le_mask;
-}
diff --git a/drivers/gpu/drm/amd/display/dc/dcn32/dcn32_hpo_dp_link_encoder.h b/drivers/gpu/drm/amd/display/dc/dcn32/dcn32_hpo_dp_link_encoder.h
deleted file mode 100644 (file)
index 176b153..0000000
+++ /dev/null
@@ -1,64 +0,0 @@
-/*
- * Copyright 2021 Advanced Micro Devices, Inc.
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the "Software"),
- * to deal in the Software without restriction, including without limitation
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
- * and/or sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
- * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
- * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
- * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
- * OTHER DEALINGS IN THE SOFTWARE.
- *
- * Authors: AMD
- *
- */
-
-#ifndef __DAL_DCN32_HPO_DP_LINK_ENCODER_H__
-#define __DAL_DCN32_HPO_DP_LINK_ENCODER_H__
-
-#include "link_encoder.h"
-
-#define DCN3_2_HPO_DP_LINK_ENC_MASK_SH_LIST(mask_sh)\
-       SE_SF(DP_LINK_ENC0_DP_LINK_ENC_CLOCK_CONTROL, DP_LINK_ENC_CLOCK_EN, mask_sh),\
-       SE_SF(DP_DPHY_SYM320_DP_DPHY_SYM32_CONTROL, DPHY_RESET, mask_sh),\
-       SE_SF(DP_DPHY_SYM320_DP_DPHY_SYM32_CONTROL, DPHY_ENABLE, mask_sh),\
-       SE_SF(DP_DPHY_SYM320_DP_DPHY_SYM32_CONTROL, PRECODER_ENABLE, mask_sh),\
-       SE_SF(DP_DPHY_SYM320_DP_DPHY_SYM32_CONTROL, MODE, mask_sh),\
-       SE_SF(DP_DPHY_SYM320_DP_DPHY_SYM32_CONTROL, NUM_LANES, mask_sh),\
-       SE_SF(DP_DPHY_SYM320_DP_DPHY_SYM32_STATUS, STATUS, mask_sh),\
-       SE_SF(DP_DPHY_SYM320_DP_DPHY_SYM32_STATUS, SAT_UPDATE_PENDING, mask_sh),\
-       SE_SF(DP_DPHY_SYM320_DP_DPHY_SYM32_STATUS, RATE_UPDATE_PENDING, mask_sh),\
-       SE_SF(DP_DPHY_SYM320_DP_DPHY_SYM32_TP_CUSTOM0, TP_CUSTOM, mask_sh),\
-       SE_SF(DP_DPHY_SYM320_DP_DPHY_SYM32_TP_CONFIG, TP_SELECT0, mask_sh),\
-       SE_SF(DP_DPHY_SYM320_DP_DPHY_SYM32_TP_CONFIG, TP_SELECT1, mask_sh),\
-       SE_SF(DP_DPHY_SYM320_DP_DPHY_SYM32_TP_CONFIG, TP_SELECT2, mask_sh),\
-       SE_SF(DP_DPHY_SYM320_DP_DPHY_SYM32_TP_CONFIG, TP_SELECT3, mask_sh),\
-       SE_SF(DP_DPHY_SYM320_DP_DPHY_SYM32_TP_CONFIG, TP_PRBS_SEL0, mask_sh),\
-       SE_SF(DP_DPHY_SYM320_DP_DPHY_SYM32_TP_CONFIG, TP_PRBS_SEL1, mask_sh),\
-       SE_SF(DP_DPHY_SYM320_DP_DPHY_SYM32_TP_CONFIG, TP_PRBS_SEL2, mask_sh),\
-       SE_SF(DP_DPHY_SYM320_DP_DPHY_SYM32_TP_CONFIG, TP_PRBS_SEL3, mask_sh),\
-       SE_SF(DP_DPHY_SYM320_DP_DPHY_SYM32_TP_SQ_PULSE, TP_SQ_PULSE_WIDTH, mask_sh),\
-       SE_SF(DP_DPHY_SYM320_DP_DPHY_SYM32_SAT_VC0, SAT_STREAM_SOURCE, mask_sh),\
-       SE_SF(DP_DPHY_SYM320_DP_DPHY_SYM32_SAT_VC0, SAT_SLOT_COUNT, mask_sh),\
-       SE_SF(DP_DPHY_SYM320_DP_DPHY_SYM32_VC_RATE_CNTL0, STREAM_VC_RATE_X, mask_sh),\
-       SE_SF(DP_DPHY_SYM320_DP_DPHY_SYM32_VC_RATE_CNTL0, STREAM_VC_RATE_Y, mask_sh),\
-       SE_SF(DP_DPHY_SYM320_DP_DPHY_SYM32_SAT_UPDATE, SAT_UPDATE, mask_sh)
-
-void hpo_dp_link_encoder32_construct(struct dcn31_hpo_dp_link_encoder *enc31,
-       struct dc_context *ctx,
-       uint32_t inst,
-       const struct dcn31_hpo_dp_link_encoder_registers *hpo_le_regs,
-       const struct dcn31_hpo_dp_link_encoder_shift *hpo_le_shift,
-       const struct dcn31_hpo_dp_link_encoder_mask *hpo_le_mask);
-
-#endif   // __DAL_DCN32_HPO_DP_LINK_ENCODER_H__
diff --git a/drivers/gpu/drm/amd/display/dc/dcn32/dcn32_mmhubbub.c b/drivers/gpu/drm/amd/display/dc/dcn32/dcn32_mmhubbub.c
deleted file mode 100644 (file)
index c3b089b..0000000
+++ /dev/null
@@ -1,239 +0,0 @@
-/*
- * Copyright 2022 Advanced Micro Devices, Inc.
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the "Software"),
- * to deal in the Software without restriction, including without limitation
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
- * and/or sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
- * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
- * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
- * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
- * OTHER DEALINGS IN THE SOFTWARE.
- *
- * Authors: AMD
- *
- */
-
-
-#include "reg_helper.h"
-#include "resource.h"
-#include "mcif_wb.h"
-#include "dcn32_mmhubbub.h"
-
-
-#define REG(reg)\
-       mcif_wb30->mcif_wb_regs->reg
-
-#define CTX \
-       mcif_wb30->base.ctx
-
-#undef FN
-#define FN(reg_name, field_name) \
-       mcif_wb30->mcif_wb_shift->field_name, mcif_wb30->mcif_wb_mask->field_name
-
-#define MCIF_ADDR(addr) (((unsigned long long)addr & 0xffffffffff) + 0xFE) >> 8
-#define MCIF_ADDR_HIGH(addr) (unsigned long long)addr >> 40
-
-/* wbif programming guide:
- * 1. set up wbif parameter:
- *    unsigned long long   luma_address[4];       //4 frame buffer
- *    unsigned long long   chroma_address[4];
- *    unsigned int        luma_pitch;
- *    unsigned int        chroma_pitch;
- *    unsigned int         warmup_pitch=0x10;     //256B align, the page size is 4KB when it is 0x10
- *    unsigned int        slice_lines;           //slice size
- *    unsigned int         time_per_pixel;        // time per pixel, in ns
- *    unsigned int         arbitration_slice;     // 0: 2048 bytes 1: 4096 bytes 2: 8192 Bytes
- *    unsigned int         max_scaled_time;       // used for QOS generation
- *    unsigned int         swlock=0x0;
- *    unsigned int         cli_watermark[4];      //4 group urgent watermark
- *    unsigned int         pstate_watermark[4];   //4 group pstate watermark
- *    unsigned int         sw_int_en;             // Software interrupt enable, frame end and overflow
- *    unsigned int         sw_slice_int_en;       // slice end interrupt enable
- *    unsigned int         sw_overrun_int_en;     // overrun error interrupt enable
- *    unsigned int         vce_int_en;            // VCE interrupt enable, frame end and overflow
- *    unsigned int         vce_slice_int_en;      // VCE slice end interrupt enable, frame end and overflow
- *
- * 2. configure wbif register
- *    a. call mmhubbub_config_wbif()
- *
- * 3. Enable wbif
- *    call set_wbif_bufmgr_enable();
- *
- * 4. wbif_dump_status(), option, for debug purpose
- *    the bufmgr status can show the progress of write back, can be used for debug purpose
- */
-
-static void mmhubbub32_warmup_mcif(struct mcif_wb *mcif_wb,
-               struct mcif_warmup_params *params)
-{
-       struct dcn30_mmhubbub *mcif_wb30 = TO_DCN30_MMHUBBUB(mcif_wb);
-       union large_integer start_address_shift = {.quad_part = params->start_address.quad_part >> 5};
-
-       /* Set base address and region size for warmup */
-       REG_SET(MMHUBBUB_WARMUP_BASE_ADDR_HIGH, 0, MMHUBBUB_WARMUP_BASE_ADDR_HIGH, start_address_shift.high_part);
-       REG_SET(MMHUBBUB_WARMUP_BASE_ADDR_LOW, 0, MMHUBBUB_WARMUP_BASE_ADDR_LOW, start_address_shift.low_part);
-       REG_SET(MMHUBBUB_WARMUP_ADDR_REGION, 0, MMHUBBUB_WARMUP_ADDR_REGION, params->region_size >> 5);
-//     REG_SET(MMHUBBUB_WARMUP_P_VMID, 0, MMHUBBUB_WARMUP_P_VMID, params->p_vmid);
-
-       /* Set address increment and enable warmup */
-       REG_SET_3(MMHUBBUB_WARMUP_CONTROL_STATUS, 0, MMHUBBUB_WARMUP_EN, true,
-                       MMHUBBUB_WARMUP_SW_INT_EN, true,
-                       MMHUBBUB_WARMUP_INC_ADDR, params->address_increment >> 5);
-
-       /* Wait for an interrupt to signal warmup is completed */
-       REG_WAIT(MMHUBBUB_WARMUP_CONTROL_STATUS, MMHUBBUB_WARMUP_SW_INT_STATUS, 1, 20, 100);
-
-       /* Acknowledge interrupt */
-       REG_UPDATE(MMHUBBUB_WARMUP_CONTROL_STATUS, MMHUBBUB_WARMUP_SW_INT_ACK, 1);
-
-       /* Disable warmup */
-       REG_UPDATE(MMHUBBUB_WARMUP_CONTROL_STATUS, MMHUBBUB_WARMUP_EN, false);
-}
-
-static void mmhubbub32_config_mcif_buf(struct mcif_wb *mcif_wb,
-               struct mcif_buf_params *params,
-               unsigned int dest_height)
-{
-       struct dcn30_mmhubbub *mcif_wb30 = TO_DCN30_MMHUBBUB(mcif_wb);
-
-       /* buffer address for packing mode or Luma in planar mode */
-       REG_UPDATE(MCIF_WB_BUF_1_ADDR_Y, MCIF_WB_BUF_1_ADDR_Y, MCIF_ADDR(params->luma_address[0]));
-       REG_UPDATE(MCIF_WB_BUF_1_ADDR_Y_HIGH, MCIF_WB_BUF_1_ADDR_Y_HIGH, MCIF_ADDR_HIGH(params->luma_address[0]));
-
-       /* buffer address for Chroma in planar mode (unused in packing mode) */
-       REG_UPDATE(MCIF_WB_BUF_1_ADDR_C, MCIF_WB_BUF_1_ADDR_C, MCIF_ADDR(params->chroma_address[0]));
-       REG_UPDATE(MCIF_WB_BUF_1_ADDR_C_HIGH, MCIF_WB_BUF_1_ADDR_C_HIGH, MCIF_ADDR_HIGH(params->chroma_address[0]));
-
-       /* buffer address for packing mode or Luma in planar mode */
-       REG_UPDATE(MCIF_WB_BUF_2_ADDR_Y, MCIF_WB_BUF_2_ADDR_Y, MCIF_ADDR(params->luma_address[1]));
-       REG_UPDATE(MCIF_WB_BUF_2_ADDR_Y_HIGH, MCIF_WB_BUF_2_ADDR_Y_HIGH, MCIF_ADDR_HIGH(params->luma_address[1]));
-
-       /* buffer address for Chroma in planar mode (unused in packing mode) */
-       REG_UPDATE(MCIF_WB_BUF_2_ADDR_C, MCIF_WB_BUF_2_ADDR_C, MCIF_ADDR(params->chroma_address[1]));
-       REG_UPDATE(MCIF_WB_BUF_2_ADDR_C_HIGH, MCIF_WB_BUF_2_ADDR_C_HIGH, MCIF_ADDR_HIGH(params->chroma_address[1]));
-
-       /* buffer address for packing mode or Luma in planar mode */
-       REG_UPDATE(MCIF_WB_BUF_3_ADDR_Y, MCIF_WB_BUF_3_ADDR_Y, MCIF_ADDR(params->luma_address[2]));
-       REG_UPDATE(MCIF_WB_BUF_3_ADDR_Y_HIGH, MCIF_WB_BUF_3_ADDR_Y_HIGH, MCIF_ADDR_HIGH(params->luma_address[2]));
-
-       /* buffer address for Chroma in planar mode (unused in packing mode) */
-       REG_UPDATE(MCIF_WB_BUF_3_ADDR_C, MCIF_WB_BUF_3_ADDR_C, MCIF_ADDR(params->chroma_address[2]));
-       REG_UPDATE(MCIF_WB_BUF_3_ADDR_C_HIGH, MCIF_WB_BUF_3_ADDR_C_HIGH, MCIF_ADDR_HIGH(params->chroma_address[2]));
-
-       /* buffer address for packing mode or Luma in planar mode */
-       REG_UPDATE(MCIF_WB_BUF_4_ADDR_Y, MCIF_WB_BUF_4_ADDR_Y, MCIF_ADDR(params->luma_address[3]));
-       REG_UPDATE(MCIF_WB_BUF_4_ADDR_Y_HIGH, MCIF_WB_BUF_4_ADDR_Y_HIGH, MCIF_ADDR_HIGH(params->luma_address[3]));
-
-       /* buffer address for Chroma in planar mode (unused in packing mode) */
-       REG_UPDATE(MCIF_WB_BUF_4_ADDR_C, MCIF_WB_BUF_4_ADDR_C, MCIF_ADDR(params->chroma_address[3]));
-       REG_UPDATE(MCIF_WB_BUF_4_ADDR_C_HIGH, MCIF_WB_BUF_4_ADDR_C_HIGH, MCIF_ADDR_HIGH(params->chroma_address[3]));
-
-       /* setup luma & chroma size
-        * should be enough to contain a whole frame Luma data,
-        * the programmed value is frame buffer size [27:8], 256-byte aligned
-        */
-       REG_UPDATE(MCIF_WB_BUF_LUMA_SIZE, MCIF_WB_BUF_LUMA_SIZE, (params->luma_pitch>>8) * dest_height);
-       REG_UPDATE(MCIF_WB_BUF_CHROMA_SIZE, MCIF_WB_BUF_CHROMA_SIZE, (params->chroma_pitch>>8) * dest_height);
-
-       /* enable address fence */
-       REG_UPDATE(MCIF_WB_BUFMGR_SW_CONTROL, MCIF_WB_BUF_ADDR_FENCE_EN, 1);
-
-       /* setup pitch, the programmed value is [15:8], 256B align */
-       REG_UPDATE_2(MCIF_WB_BUF_PITCH, MCIF_WB_BUF_LUMA_PITCH, params->luma_pitch >> 8,
-                       MCIF_WB_BUF_CHROMA_PITCH, params->chroma_pitch >> 8);
-}
-
-static void mmhubbub32_config_mcif_arb(struct mcif_wb *mcif_wb,
-               struct mcif_arb_params *params)
-{
-       struct dcn30_mmhubbub *mcif_wb30 = TO_DCN30_MMHUBBUB(mcif_wb);
-
-       /* Programmed by the video driver based on the CRTC timing (for DWB) */
-       REG_UPDATE(MCIF_WB_ARBITRATION_CONTROL, MCIF_WB_TIME_PER_PIXEL, params->time_per_pixel);
-
-       /* Programming dwb watermark */
-       /* Watermark to generate urgent in MCIF_WB_CLI, value is determined by MCIF_WB_CLI_WATERMARK_MASK. */
-       /* Program in ns. A formula will be provided in the pseudo code to calculate the value. */
-       REG_UPDATE(MCIF_WB_WATERMARK, MCIF_WB_CLI_WATERMARK_MASK, 0x0);
-       /* urgent_watermarkA */
-       REG_UPDATE(MCIF_WB_WATERMARK, MCIF_WB_CLI_WATERMARK,  params->cli_watermark[0]);
-       REG_UPDATE(MCIF_WB_WATERMARK, MCIF_WB_CLI_WATERMARK_MASK, 0x1);
-       /* urgent_watermarkB */
-       REG_UPDATE(MCIF_WB_WATERMARK, MCIF_WB_CLI_WATERMARK,  params->cli_watermark[1]);
-       REG_UPDATE(MCIF_WB_WATERMARK, MCIF_WB_CLI_WATERMARK_MASK, 0x2);
-       /* urgent_watermarkC */
-       REG_UPDATE(MCIF_WB_WATERMARK, MCIF_WB_CLI_WATERMARK,  params->cli_watermark[2]);
-       REG_UPDATE(MCIF_WB_WATERMARK, MCIF_WB_CLI_WATERMARK_MASK, 0x3);
-       /* urgent_watermarkD */
-       REG_UPDATE(MCIF_WB_WATERMARK, MCIF_WB_CLI_WATERMARK,  params->cli_watermark[3]);
-
-       /* Programming nb pstate watermark */
-       /* nbp_state_change_watermarkA */
-       REG_UPDATE(MCIF_WB_NB_PSTATE_LATENCY_WATERMARK, NB_PSTATE_CHANGE_WATERMARK_MASK, 0x0);
-       REG_UPDATE(MCIF_WB_NB_PSTATE_LATENCY_WATERMARK,
-                       NB_PSTATE_CHANGE_REFRESH_WATERMARK, params->pstate_watermark[0]);
-       /* nbp_state_change_watermarkB */
-       REG_UPDATE(MCIF_WB_NB_PSTATE_LATENCY_WATERMARK, NB_PSTATE_CHANGE_WATERMARK_MASK, 0x1);
-       REG_UPDATE(MCIF_WB_NB_PSTATE_LATENCY_WATERMARK,
-                       NB_PSTATE_CHANGE_REFRESH_WATERMARK, params->pstate_watermark[1]);
-       /* nbp_state_change_watermarkC */
-       REG_UPDATE(MCIF_WB_NB_PSTATE_LATENCY_WATERMARK, NB_PSTATE_CHANGE_WATERMARK_MASK, 0x2);
-       REG_UPDATE(MCIF_WB_NB_PSTATE_LATENCY_WATERMARK,
-                       NB_PSTATE_CHANGE_REFRESH_WATERMARK, params->pstate_watermark[2]);
-       /* nbp_state_change_watermarkD */
-       REG_UPDATE(MCIF_WB_NB_PSTATE_LATENCY_WATERMARK, NB_PSTATE_CHANGE_WATERMARK_MASK, 0x3);
-       REG_UPDATE(MCIF_WB_NB_PSTATE_LATENCY_WATERMARK,
-                       NB_PSTATE_CHANGE_REFRESH_WATERMARK, params->pstate_watermark[3]);
-
-       /* dram_speed_change_duration - register removed */
-       //REG_UPDATE(MCIF_WB_DRAM_SPEED_CHANGE_DURATION_VBI,
-       //              MCIF_WB_DRAM_SPEED_CHANGE_DURATION_VBI, params->dram_speed_change_duration);
-
-       /* max_scaled_time */
-       REG_UPDATE(MULTI_LEVEL_QOS_CTRL, MAX_SCALED_TIME_TO_URGENT, params->max_scaled_time);
-
-       /* slice_lines */
-       REG_UPDATE(MCIF_WB_BUFMGR_VCE_CONTROL, MCIF_WB_BUFMGR_SLICE_SIZE, params->slice_lines-1);
-
-       /* Set arbitration unit for Luma/Chroma */
-       /* arb_unit=2 should be chosen for more efficiency */
-       /* Arbitration size, 0: 2048 bytes 1: 4096 bytes 2: 8192 Bytes */
-       REG_UPDATE(MCIF_WB_ARBITRATION_CONTROL, MCIF_WB_CLIENT_ARBITRATION_SLICE,  params->arbitration_slice);
-}
-
-static const struct mcif_wb_funcs dcn32_mmhubbub_funcs = {
-       .warmup_mcif            = mmhubbub32_warmup_mcif,
-       .enable_mcif            = mmhubbub2_enable_mcif,
-       .disable_mcif           = mmhubbub2_disable_mcif,
-       .config_mcif_buf        = mmhubbub32_config_mcif_buf,
-       .config_mcif_arb        = mmhubbub32_config_mcif_arb,
-       .config_mcif_irq        = mmhubbub2_config_mcif_irq,
-       .dump_frame                     = mcifwb2_dump_frame,
-};
-
-void dcn32_mmhubbub_construct(struct dcn30_mmhubbub *mcif_wb30,
-               struct dc_context *ctx,
-               const struct dcn30_mmhubbub_registers *mcif_wb_regs,
-               const struct dcn30_mmhubbub_shift *mcif_wb_shift,
-               const struct dcn30_mmhubbub_mask *mcif_wb_mask,
-               int inst)
-{
-       mcif_wb30->base.ctx = ctx;
-
-       mcif_wb30->base.inst = inst;
-       mcif_wb30->base.funcs = &dcn32_mmhubbub_funcs;
-
-       mcif_wb30->mcif_wb_regs = mcif_wb_regs;
-       mcif_wb30->mcif_wb_shift = mcif_wb_shift;
-       mcif_wb30->mcif_wb_mask = mcif_wb_mask;
-}
diff --git a/drivers/gpu/drm/amd/display/dc/dcn32/dcn32_mmhubbub.h b/drivers/gpu/drm/amd/display/dc/dcn32/dcn32_mmhubbub.h
deleted file mode 100644 (file)
index ef15b4f..0000000
+++ /dev/null
@@ -1,211 +0,0 @@
-/*
- * Copyright 2021 Advanced Micro Devices, Inc.
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the "Software"),
- * to deal in the Software without restriction, including without limitation
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
- * and/or sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
- * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
- * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
- * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
- * OTHER DEALINGS IN THE SOFTWARE.
- *
- * Authors: AMD
- *
- */
-
-#ifndef __DC_MCIF_WB_DCN32_H__
-#define __DC_MCIF_WB_DCN32_H__
-
-#include "dcn20/dcn20_mmhubbub.h"
-#include "dcn30/dcn30_mmhubbub.h"
-
-#define MCIF_WB_COMMON_REG_LIST_DCN32(inst) \
-       SRI2(MCIF_WB_BUFMGR_SW_CONTROL, MCIF_WB, inst),\
-       SRI2(MCIF_WB_BUFMGR_STATUS, MCIF_WB, inst),\
-       SRI2(MCIF_WB_BUF_PITCH, MCIF_WB, inst),\
-       SRI2(MCIF_WB_BUF_1_STATUS, MCIF_WB, inst),\
-       SRI2(MCIF_WB_BUF_1_STATUS2, MCIF_WB, inst),\
-       SRI2(MCIF_WB_BUF_2_STATUS, MCIF_WB, inst),\
-       SRI2(MCIF_WB_BUF_2_STATUS2, MCIF_WB, inst),\
-       SRI2(MCIF_WB_BUF_3_STATUS, MCIF_WB, inst),\
-       SRI2(MCIF_WB_BUF_3_STATUS2, MCIF_WB, inst),\
-       SRI2(MCIF_WB_BUF_4_STATUS, MCIF_WB, inst),\
-       SRI2(MCIF_WB_BUF_4_STATUS2, MCIF_WB, inst),\
-       SRI2(MCIF_WB_ARBITRATION_CONTROL, MCIF_WB, inst),\
-       SRI2(MCIF_WB_SCLK_CHANGE, MCIF_WB, inst),\
-       SRI2(MCIF_WB_BUF_1_ADDR_Y, MCIF_WB, inst),\
-       SRI2(MCIF_WB_BUF_1_ADDR_C, MCIF_WB, inst),\
-       SRI2(MCIF_WB_BUF_2_ADDR_Y, MCIF_WB, inst),\
-       SRI2(MCIF_WB_BUF_2_ADDR_C, MCIF_WB, inst),\
-       SRI2(MCIF_WB_BUF_3_ADDR_Y, MCIF_WB, inst),\
-       SRI2(MCIF_WB_BUF_3_ADDR_C, MCIF_WB, inst),\
-       SRI2(MCIF_WB_BUF_4_ADDR_Y, MCIF_WB, inst),\
-       SRI2(MCIF_WB_BUF_4_ADDR_C, MCIF_WB, inst),\
-       SRI2(MCIF_WB_BUFMGR_VCE_CONTROL, MCIF_WB, inst),\
-       SRI2(MCIF_WB_NB_PSTATE_LATENCY_WATERMARK, MMHUBBUB, inst),\
-       SRI2(MCIF_WB_NB_PSTATE_CONTROL, MCIF_WB, inst),\
-       SRI2(MCIF_WB_WATERMARK, MMHUBBUB, inst),\
-       SRI2(MCIF_WB_CLOCK_GATER_CONTROL, MCIF_WB, inst),\
-       SRI2(MCIF_WB_SELF_REFRESH_CONTROL, MCIF_WB, inst),\
-       SRI2(MULTI_LEVEL_QOS_CTRL, MCIF_WB, inst),\
-       SRI2(MCIF_WB_SECURITY_LEVEL, MCIF_WB, inst),\
-       SRI2(MCIF_WB_BUF_LUMA_SIZE, MCIF_WB, inst),\
-       SRI2(MCIF_WB_BUF_CHROMA_SIZE, MCIF_WB, inst),\
-       SRI2(MCIF_WB_BUF_1_ADDR_Y_HIGH, MCIF_WB, inst),\
-       SRI2(MCIF_WB_BUF_1_ADDR_C_HIGH, MCIF_WB, inst),\
-       SRI2(MCIF_WB_BUF_2_ADDR_Y_HIGH, MCIF_WB, inst),\
-       SRI2(MCIF_WB_BUF_2_ADDR_C_HIGH, MCIF_WB, inst),\
-       SRI2(MCIF_WB_BUF_3_ADDR_Y_HIGH, MCIF_WB, inst),\
-       SRI2(MCIF_WB_BUF_3_ADDR_C_HIGH, MCIF_WB, inst),\
-       SRI2(MCIF_WB_BUF_4_ADDR_Y_HIGH, MCIF_WB, inst),\
-       SRI2(MCIF_WB_BUF_4_ADDR_C_HIGH, MCIF_WB, inst),\
-       SRI2(MCIF_WB_BUF_1_RESOLUTION, MCIF_WB, inst),\
-       SRI2(MCIF_WB_BUF_2_RESOLUTION, MCIF_WB, inst),\
-       SRI2(MCIF_WB_BUF_3_RESOLUTION, MCIF_WB, inst),\
-       SRI2(MCIF_WB_BUF_4_RESOLUTION, MCIF_WB, inst),\
-       SRI2(MMHUBBUB_MEM_PWR_CNTL, MMHUBBUB, inst),\
-       SRI2(MMHUBBUB_WARMUP_ADDR_REGION, MMHUBBUB, inst),\
-       SRI2(MMHUBBUB_WARMUP_BASE_ADDR_HIGH, MMHUBBUB, inst),\
-       SRI2(MMHUBBUB_WARMUP_BASE_ADDR_LOW, MMHUBBUB, inst),\
-       SRI2(MMHUBBUB_WARMUP_CONTROL_STATUS, MMHUBBUB, inst)
-
-
-#define MCIF_WB_COMMON_MASK_SH_LIST_DCN32(mask_sh) \
-       SF(MCIF_WB_BUFMGR_SW_CONTROL, MCIF_WB_BUFMGR_ENABLE, mask_sh),\
-       SF(MCIF_WB_BUFMGR_SW_CONTROL, MCIF_WB_BUFMGR_SW_INT_EN, mask_sh),\
-       SF(MCIF_WB_BUFMGR_SW_CONTROL, MCIF_WB_BUFMGR_SW_INT_ACK, mask_sh),\
-       SF(MCIF_WB_BUFMGR_SW_CONTROL, MCIF_WB_BUFMGR_SW_SLICE_INT_EN, mask_sh),\
-       SF(MCIF_WB_BUFMGR_SW_CONTROL, MCIF_WB_BUFMGR_SW_OVERRUN_INT_EN, mask_sh),\
-       SF(MCIF_WB_BUFMGR_SW_CONTROL, MCIF_WB_BUFMGR_SW_LOCK, mask_sh),\
-       SF(MCIF_WB_BUFMGR_SW_CONTROL, MCIF_WB_BUF_ADDR_FENCE_EN, mask_sh),\
-       SF(MCIF_WB_BUFMGR_STATUS, MCIF_WB_BUFMGR_SW_INT_STATUS, mask_sh),\
-       SF(MCIF_WB_BUFMGR_STATUS, MCIF_WB_BUFMGR_SW_OVERRUN_INT_STATUS, mask_sh),\
-       SF(MCIF_WB_BUFMGR_STATUS, MCIF_WB_BUFMGR_CUR_BUF, mask_sh),\
-       SF(MCIF_WB_BUFMGR_STATUS, MCIF_WB_BUFMGR_BUFTAG, mask_sh),\
-       SF(MCIF_WB_BUFMGR_STATUS, MCIF_WB_BUFMGR_CUR_LINE_L, mask_sh),\
-       SF(MCIF_WB_BUFMGR_STATUS, MCIF_WB_BUFMGR_NEXT_BUF, mask_sh),\
-       SF(MCIF_WB_BUF_PITCH, MCIF_WB_BUF_LUMA_PITCH, mask_sh),\
-       SF(MCIF_WB_BUF_PITCH, MCIF_WB_BUF_CHROMA_PITCH, mask_sh),\
-       SF(MCIF_WB_BUF_1_STATUS, MCIF_WB_BUF_1_ACTIVE, mask_sh),\
-       SF(MCIF_WB_BUF_1_STATUS, MCIF_WB_BUF_1_SW_LOCKED, mask_sh),\
-       SF(MCIF_WB_BUF_1_STATUS, MCIF_WB_BUF_1_OVERFLOW, mask_sh),\
-       SF(MCIF_WB_BUF_1_STATUS, MCIF_WB_BUF_1_DISABLE, mask_sh),\
-       SF(MCIF_WB_BUF_1_STATUS, MCIF_WB_BUF_1_MODE, mask_sh),\
-       SF(MCIF_WB_BUF_1_STATUS, MCIF_WB_BUF_1_BUFTAG, mask_sh),\
-       SF(MCIF_WB_BUF_1_STATUS, MCIF_WB_BUF_1_NXT_BUF, mask_sh),\
-       SF(MCIF_WB_BUF_1_STATUS, MCIF_WB_BUF_1_CUR_LINE_L, mask_sh),\
-       SF(MCIF_WB_BUF_1_STATUS2, MCIF_WB_BUF_1_NEW_CONTENT, mask_sh),\
-       SF(MCIF_WB_BUF_1_STATUS2, MCIF_WB_BUF_1_COLOR_DEPTH, mask_sh),\
-       SF(MCIF_WB_BUF_1_STATUS2, MCIF_WB_BUF_1_TMZ_BLACK_PIXEL, mask_sh),\
-       SF(MCIF_WB_BUF_1_STATUS2, MCIF_WB_BUF_1_TMZ, mask_sh),\
-       SF(MCIF_WB_BUF_1_STATUS2, MCIF_WB_BUF_1_Y_OVERRUN, mask_sh),\
-       SF(MCIF_WB_BUF_1_STATUS2, MCIF_WB_BUF_1_C_OVERRUN, mask_sh),\
-       SF(MCIF_WB_BUF_2_STATUS, MCIF_WB_BUF_2_ACTIVE, mask_sh),\
-       SF(MCIF_WB_BUF_2_STATUS, MCIF_WB_BUF_2_SW_LOCKED, mask_sh),\
-       SF(MCIF_WB_BUF_2_STATUS, MCIF_WB_BUF_2_OVERFLOW, mask_sh),\
-       SF(MCIF_WB_BUF_2_STATUS, MCIF_WB_BUF_2_DISABLE, mask_sh),\
-       SF(MCIF_WB_BUF_2_STATUS, MCIF_WB_BUF_2_MODE, mask_sh),\
-       SF(MCIF_WB_BUF_2_STATUS, MCIF_WB_BUF_2_BUFTAG, mask_sh),\
-       SF(MCIF_WB_BUF_2_STATUS, MCIF_WB_BUF_2_NXT_BUF, mask_sh),\
-       SF(MCIF_WB_BUF_2_STATUS, MCIF_WB_BUF_2_CUR_LINE_L, mask_sh),\
-       SF(MCIF_WB_BUF_2_STATUS2, MCIF_WB_BUF_2_NEW_CONTENT, mask_sh),\
-       SF(MCIF_WB_BUF_2_STATUS2, MCIF_WB_BUF_2_COLOR_DEPTH, mask_sh),\
-       SF(MCIF_WB_BUF_2_STATUS2, MCIF_WB_BUF_2_TMZ_BLACK_PIXEL, mask_sh),\
-       SF(MCIF_WB_BUF_2_STATUS2, MCIF_WB_BUF_2_TMZ, mask_sh),\
-       SF(MCIF_WB_BUF_2_STATUS2, MCIF_WB_BUF_2_Y_OVERRUN, mask_sh),\
-       SF(MCIF_WB_BUF_2_STATUS2, MCIF_WB_BUF_2_C_OVERRUN, mask_sh),\
-       SF(MCIF_WB_BUF_3_STATUS, MCIF_WB_BUF_3_ACTIVE, mask_sh),\
-       SF(MCIF_WB_BUF_3_STATUS, MCIF_WB_BUF_3_SW_LOCKED, mask_sh),\
-       SF(MCIF_WB_BUF_3_STATUS, MCIF_WB_BUF_3_OVERFLOW, mask_sh),\
-       SF(MCIF_WB_BUF_3_STATUS, MCIF_WB_BUF_3_DISABLE, mask_sh),\
-       SF(MCIF_WB_BUF_3_STATUS, MCIF_WB_BUF_3_MODE, mask_sh),\
-       SF(MCIF_WB_BUF_3_STATUS, MCIF_WB_BUF_3_BUFTAG, mask_sh),\
-       SF(MCIF_WB_BUF_3_STATUS, MCIF_WB_BUF_3_NXT_BUF, mask_sh),\
-       SF(MCIF_WB_BUF_3_STATUS, MCIF_WB_BUF_3_CUR_LINE_L, mask_sh),\
-       SF(MCIF_WB_BUF_3_STATUS2, MCIF_WB_BUF_3_NEW_CONTENT, mask_sh),\
-       SF(MCIF_WB_BUF_3_STATUS2, MCIF_WB_BUF_3_COLOR_DEPTH, mask_sh),\
-       SF(MCIF_WB_BUF_3_STATUS2, MCIF_WB_BUF_3_TMZ_BLACK_PIXEL, mask_sh),\
-       SF(MCIF_WB_BUF_3_STATUS2, MCIF_WB_BUF_3_TMZ, mask_sh),\
-       SF(MCIF_WB_BUF_3_STATUS2, MCIF_WB_BUF_3_Y_OVERRUN, mask_sh),\
-       SF(MCIF_WB_BUF_3_STATUS2, MCIF_WB_BUF_3_C_OVERRUN, mask_sh),\
-       SF(MCIF_WB_BUF_4_STATUS, MCIF_WB_BUF_4_ACTIVE, mask_sh),\
-       SF(MCIF_WB_BUF_4_STATUS, MCIF_WB_BUF_4_SW_LOCKED, mask_sh),\
-       SF(MCIF_WB_BUF_4_STATUS, MCIF_WB_BUF_4_OVERFLOW, mask_sh),\
-       SF(MCIF_WB_BUF_4_STATUS, MCIF_WB_BUF_4_DISABLE, mask_sh),\
-       SF(MCIF_WB_BUF_4_STATUS, MCIF_WB_BUF_4_MODE, mask_sh),\
-       SF(MCIF_WB_BUF_4_STATUS, MCIF_WB_BUF_4_BUFTAG, mask_sh),\
-       SF(MCIF_WB_BUF_4_STATUS, MCIF_WB_BUF_4_NXT_BUF, mask_sh),\
-       SF(MCIF_WB_BUF_4_STATUS, MCIF_WB_BUF_4_CUR_LINE_L, mask_sh),\
-       SF(MCIF_WB_BUF_4_STATUS2, MCIF_WB_BUF_4_NEW_CONTENT, mask_sh),\
-       SF(MCIF_WB_BUF_4_STATUS2, MCIF_WB_BUF_4_COLOR_DEPTH, mask_sh),\
-       SF(MCIF_WB_BUF_4_STATUS2, MCIF_WB_BUF_4_TMZ_BLACK_PIXEL, mask_sh),\
-       SF(MCIF_WB_BUF_4_STATUS2, MCIF_WB_BUF_4_TMZ, mask_sh),\
-       SF(MCIF_WB_BUF_4_STATUS2, MCIF_WB_BUF_4_Y_OVERRUN, mask_sh),\
-       SF(MCIF_WB_BUF_4_STATUS2, MCIF_WB_BUF_4_C_OVERRUN, mask_sh),\
-       SF(MCIF_WB_ARBITRATION_CONTROL, MCIF_WB_CLIENT_ARBITRATION_SLICE, mask_sh),\
-       SF(MCIF_WB_ARBITRATION_CONTROL, MCIF_WB_TIME_PER_PIXEL, mask_sh),\
-       SF(MCIF_WB_SCLK_CHANGE, WM_CHANGE_ACK_FORCE_ON, mask_sh),\
-       SF(MCIF_WB_BUF_1_ADDR_Y, MCIF_WB_BUF_1_ADDR_Y, mask_sh),\
-       SF(MCIF_WB_BUF_1_ADDR_C, MCIF_WB_BUF_1_ADDR_C, mask_sh),\
-       SF(MCIF_WB_BUF_2_ADDR_Y, MCIF_WB_BUF_2_ADDR_Y, mask_sh),\
-       SF(MCIF_WB_BUF_2_ADDR_C, MCIF_WB_BUF_2_ADDR_C, mask_sh),\
-       SF(MCIF_WB_BUF_3_ADDR_Y, MCIF_WB_BUF_3_ADDR_Y, mask_sh),\
-       SF(MCIF_WB_BUF_3_ADDR_C, MCIF_WB_BUF_3_ADDR_C, mask_sh),\
-       SF(MCIF_WB_BUF_4_ADDR_Y, MCIF_WB_BUF_4_ADDR_Y, mask_sh),\
-       SF(MCIF_WB_BUF_4_ADDR_C, MCIF_WB_BUF_4_ADDR_C, mask_sh),\
-       SF(MCIF_WB_BUFMGR_VCE_CONTROL, MCIF_WB_BUFMGR_SLICE_SIZE, mask_sh),\
-       SF(MCIF_WB_NB_PSTATE_LATENCY_WATERMARK, NB_PSTATE_CHANGE_REFRESH_WATERMARK, mask_sh),\
-       SF(MCIF_WB_NB_PSTATE_LATENCY_WATERMARK, NB_PSTATE_CHANGE_WATERMARK_MASK, mask_sh),\
-       SF(MCIF_WB_NB_PSTATE_CONTROL, NB_PSTATE_CHANGE_FORCE_ON, mask_sh),\
-       SF(MCIF_WB_WATERMARK, MCIF_WB_CLI_WATERMARK, mask_sh),\
-       SF(MCIF_WB_WATERMARK, MCIF_WB_CLI_WATERMARK_MASK, mask_sh),\
-       SF(MCIF_WB_CLOCK_GATER_CONTROL, MCIF_WB_CLI_CLOCK_GATER_OVERRIDE, mask_sh),\
-       SF(MCIF_WB_SELF_REFRESH_CONTROL, PERFRAME_SELF_REFRESH, mask_sh),\
-       SF(MULTI_LEVEL_QOS_CTRL, MAX_SCALED_TIME_TO_URGENT, mask_sh),\
-       SF(MCIF_WB_SECURITY_LEVEL, MCIF_WB_SECURITY_LEVEL, mask_sh),\
-       SF(MCIF_WB_BUF_LUMA_SIZE, MCIF_WB_BUF_LUMA_SIZE, mask_sh),\
-       SF(MCIF_WB_BUF_CHROMA_SIZE, MCIF_WB_BUF_CHROMA_SIZE, mask_sh),\
-       SF(MCIF_WB_BUF_1_ADDR_Y_HIGH, MCIF_WB_BUF_1_ADDR_Y_HIGH, mask_sh),\
-       SF(MCIF_WB_BUF_1_ADDR_C_HIGH, MCIF_WB_BUF_1_ADDR_C_HIGH, mask_sh),\
-       SF(MCIF_WB_BUF_2_ADDR_Y_HIGH, MCIF_WB_BUF_2_ADDR_Y_HIGH, mask_sh),\
-       SF(MCIF_WB_BUF_2_ADDR_C_HIGH, MCIF_WB_BUF_2_ADDR_C_HIGH, mask_sh),\
-       SF(MCIF_WB_BUF_3_ADDR_Y_HIGH, MCIF_WB_BUF_3_ADDR_Y_HIGH, mask_sh),\
-       SF(MCIF_WB_BUF_3_ADDR_C_HIGH, MCIF_WB_BUF_3_ADDR_C_HIGH, mask_sh),\
-       SF(MCIF_WB_BUF_4_ADDR_Y_HIGH, MCIF_WB_BUF_4_ADDR_Y_HIGH, mask_sh),\
-       SF(MCIF_WB_BUF_4_ADDR_C_HIGH, MCIF_WB_BUF_4_ADDR_C_HIGH, mask_sh),\
-       SF(MCIF_WB_BUF_1_RESOLUTION, MCIF_WB_BUF_1_RESOLUTION_WIDTH, mask_sh),\
-       SF(MCIF_WB_BUF_1_RESOLUTION, MCIF_WB_BUF_1_RESOLUTION_HEIGHT, mask_sh),\
-       SF(MCIF_WB_BUF_2_RESOLUTION, MCIF_WB_BUF_2_RESOLUTION_WIDTH, mask_sh),\
-       SF(MCIF_WB_BUF_2_RESOLUTION, MCIF_WB_BUF_2_RESOLUTION_HEIGHT, mask_sh),\
-       SF(MCIF_WB_BUF_3_RESOLUTION, MCIF_WB_BUF_3_RESOLUTION_WIDTH, mask_sh),\
-       SF(MCIF_WB_BUF_3_RESOLUTION, MCIF_WB_BUF_3_RESOLUTION_HEIGHT, mask_sh),\
-       SF(MCIF_WB_BUF_4_RESOLUTION, MCIF_WB_BUF_4_RESOLUTION_WIDTH, mask_sh),\
-       SF(MCIF_WB_BUF_4_RESOLUTION, MCIF_WB_BUF_4_RESOLUTION_HEIGHT, mask_sh),\
-       SF(MMHUBBUB_WARMUP_ADDR_REGION, MMHUBBUB_WARMUP_ADDR_REGION, mask_sh),\
-       SF(MMHUBBUB_WARMUP_BASE_ADDR_HIGH, MMHUBBUB_WARMUP_BASE_ADDR_HIGH, mask_sh),\
-       SF(MMHUBBUB_WARMUP_BASE_ADDR_LOW, MMHUBBUB_WARMUP_BASE_ADDR_LOW, mask_sh),\
-       SF(MMHUBBUB_WARMUP_CONTROL_STATUS, MMHUBBUB_WARMUP_EN, mask_sh),\
-       SF(MMHUBBUB_WARMUP_CONTROL_STATUS, MMHUBBUB_WARMUP_SW_INT_EN, mask_sh),\
-       SF(MMHUBBUB_WARMUP_CONTROL_STATUS, MMHUBBUB_WARMUP_SW_INT_STATUS, mask_sh),\
-       SF(MMHUBBUB_WARMUP_CONTROL_STATUS, MMHUBBUB_WARMUP_SW_INT_ACK, mask_sh),\
-       SF(MMHUBBUB_WARMUP_CONTROL_STATUS, MMHUBBUB_WARMUP_INC_ADDR, mask_sh)
-
-
-void dcn32_mmhubbub_construct(struct dcn30_mmhubbub *mcif_wb30,
-       struct dc_context *ctx,
-       const struct dcn30_mmhubbub_registers *mcif_wb_regs,
-       const struct dcn30_mmhubbub_shift *mcif_wb_shift,
-       const struct dcn30_mmhubbub_mask *mcif_wb_mask,
-       int inst);
-
-#endif //__DC_MCIF_WB_DCN32_H__
diff --git a/drivers/gpu/drm/amd/display/dc/dcn32/dcn32_mpc.c b/drivers/gpu/drm/amd/display/dc/dcn32/dcn32_mpc.c
deleted file mode 100644 (file)
index a0e9e9f..0000000
+++ /dev/null
@@ -1,1050 +0,0 @@
-/*
- * Copyright 2021 Advanced Micro Devices, Inc.
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the "Software"),
- * to deal in the Software without restriction, including without limitation
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
- * and/or sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
- * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
- * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
- * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
- * OTHER DEALINGS IN THE SOFTWARE.
- *
- * Authors: AMD
- *
- */
-
-#include "reg_helper.h"
-#include "dcn30/dcn30_mpc.h"
-#include "dcn30/dcn30_cm_common.h"
-#include "dcn32_mpc.h"
-#include "basics/conversion.h"
-#include "dcn10/dcn10_cm_common.h"
-#include "dc.h"
-#include "dcn401/dcn401_mpc.h"
-
-#define REG(reg)\
-       mpc30->mpc_regs->reg
-
-#define CTX \
-       mpc30->base.ctx
-
-#undef FN
-#define FN(reg_name, field_name) \
-       mpc30->mpc_shift->field_name, mpc30->mpc_mask->field_name
-
-
-void mpc32_mpc_init(struct mpc *mpc)
-{
-       struct dcn30_mpc *mpc30 = TO_DCN30_MPC(mpc);
-       int mpcc_id;
-
-       mpc3_mpc_init(mpc);
-
-       if (mpc->ctx->dc->debug.enable_mem_low_power.bits.mpc) {
-               if (mpc30->mpc_mask->MPCC_MCM_SHAPER_MEM_LOW_PWR_MODE && mpc30->mpc_mask->MPCC_MCM_3DLUT_MEM_LOW_PWR_MODE) {
-                       for (mpcc_id = 0; mpcc_id < mpc30->num_mpcc; mpcc_id++) {
-                               REG_UPDATE(MPCC_MCM_MEM_PWR_CTRL[mpcc_id], MPCC_MCM_SHAPER_MEM_LOW_PWR_MODE, 3);
-                               REG_UPDATE(MPCC_MCM_MEM_PWR_CTRL[mpcc_id], MPCC_MCM_3DLUT_MEM_LOW_PWR_MODE, 3);
-                               REG_UPDATE(MPCC_MCM_MEM_PWR_CTRL[mpcc_id], MPCC_MCM_1DLUT_MEM_LOW_PWR_MODE, 3);
-                       }
-               }
-               if (mpc30->mpc_mask->MPCC_OGAM_MEM_LOW_PWR_MODE) {
-                       for (mpcc_id = 0; mpcc_id < mpc30->num_mpcc; mpcc_id++)
-                               REG_UPDATE(MPCC_MEM_PWR_CTRL[mpcc_id], MPCC_OGAM_MEM_LOW_PWR_MODE, 3);
-               }
-       }
-}
-
-void mpc32_power_on_blnd_lut(
-       struct mpc *mpc,
-       uint32_t mpcc_id,
-       bool power_on)
-{
-       struct dcn30_mpc *mpc30 = TO_DCN30_MPC(mpc);
-
-       REG_SET(MPCC_MCM_MEM_PWR_CTRL[mpcc_id], 0, MPCC_MCM_1DLUT_MEM_PWR_DIS, power_on);
-
-       if (mpc->ctx->dc->debug.enable_mem_low_power.bits.cm) {
-               if (power_on) {
-                       REG_UPDATE(MPCC_MCM_MEM_PWR_CTRL[mpcc_id], MPCC_MCM_1DLUT_MEM_PWR_FORCE, 0);
-                       REG_WAIT(MPCC_MCM_MEM_PWR_CTRL[mpcc_id], MPCC_MCM_1DLUT_MEM_PWR_STATE, 0, 1, 5);
-               } else if (!mpc->ctx->dc->debug.disable_mem_low_power) {
-                       /* TODO: change to mpc
-                        *  dpp_base->ctx->dc->optimized_required = true;
-                        *  dpp_base->deferred_reg_writes.bits.disable_blnd_lut = true;
-                        */
-               }
-       } else {
-               REG_SET(MPCC_MCM_MEM_PWR_CTRL[mpcc_id], 0,
-                               MPCC_MCM_1DLUT_MEM_PWR_FORCE, power_on == true ? 0 : 1);
-       }
-}
-
-static enum dc_lut_mode mpc32_get_post1dlut_current(struct mpc *mpc, uint32_t mpcc_id)
-{
-       enum dc_lut_mode mode;
-       uint32_t mode_current = 0;
-       uint32_t in_use = 0;
-
-       struct dcn30_mpc *mpc30 = TO_DCN30_MPC(mpc);
-
-       REG_GET(MPCC_MCM_1DLUT_CONTROL[mpcc_id],
-                       MPCC_MCM_1DLUT_MODE_CURRENT, &mode_current);
-       REG_GET(MPCC_MCM_1DLUT_CONTROL[mpcc_id],
-                       MPCC_MCM_1DLUT_SELECT_CURRENT, &in_use);
-
-       switch (mode_current) {
-       case 0:
-       case 1:
-               mode = LUT_BYPASS;
-               break;
-
-       case 2:
-               if (in_use == 0)
-                       mode = LUT_RAM_A;
-               else
-                       mode = LUT_RAM_B;
-               break;
-       default:
-               mode = LUT_BYPASS;
-               break;
-       }
-       return mode;
-}
-
-void mpc32_configure_post1dlut(
-               struct mpc *mpc,
-               uint32_t mpcc_id,
-               bool is_ram_a)
-{
-       struct dcn30_mpc *mpc30 = TO_DCN30_MPC(mpc);
-
-       //TODO: this
-       REG_UPDATE_2(MPCC_MCM_1DLUT_LUT_CONTROL[mpcc_id],
-                       MPCC_MCM_1DLUT_LUT_WRITE_COLOR_MASK, 7,
-                       MPCC_MCM_1DLUT_LUT_HOST_SEL, is_ram_a == true ? 0 : 1);
-
-       REG_SET(MPCC_MCM_1DLUT_LUT_INDEX[mpcc_id], 0, MPCC_MCM_1DLUT_LUT_INDEX, 0);
-}
-
-static void mpc32_post1dlut_get_reg_field(
-               struct dcn30_mpc *mpc,
-               struct dcn3_xfer_func_reg *reg)
-{
-       reg->shifts.exp_region0_lut_offset = mpc->mpc_shift->MPCC_MCM_1DLUT_RAMA_EXP_REGION0_LUT_OFFSET;
-       reg->masks.exp_region0_lut_offset = mpc->mpc_mask->MPCC_MCM_1DLUT_RAMA_EXP_REGION0_LUT_OFFSET;
-       reg->shifts.exp_region0_num_segments = mpc->mpc_shift->MPCC_MCM_1DLUT_RAMA_EXP_REGION0_NUM_SEGMENTS;
-       reg->masks.exp_region0_num_segments = mpc->mpc_mask->MPCC_MCM_1DLUT_RAMA_EXP_REGION0_NUM_SEGMENTS;
-       reg->shifts.exp_region1_lut_offset = mpc->mpc_shift->MPCC_MCM_1DLUT_RAMA_EXP_REGION1_LUT_OFFSET;
-       reg->masks.exp_region1_lut_offset = mpc->mpc_mask->MPCC_MCM_1DLUT_RAMA_EXP_REGION1_LUT_OFFSET;
-       reg->shifts.exp_region1_num_segments = mpc->mpc_shift->MPCC_MCM_1DLUT_RAMA_EXP_REGION1_NUM_SEGMENTS;
-       reg->masks.exp_region1_num_segments = mpc->mpc_mask->MPCC_MCM_1DLUT_RAMA_EXP_REGION1_NUM_SEGMENTS;
-
-       reg->shifts.field_region_end = mpc->mpc_shift->MPCC_MCM_1DLUT_RAMA_EXP_REGION_END_B;
-       reg->masks.field_region_end = mpc->mpc_mask->MPCC_MCM_1DLUT_RAMA_EXP_REGION_END_B;
-       reg->shifts.field_region_end_slope = mpc->mpc_shift->MPCC_MCM_1DLUT_RAMA_EXP_REGION_END_SLOPE_B;
-       reg->masks.field_region_end_slope = mpc->mpc_mask->MPCC_MCM_1DLUT_RAMA_EXP_REGION_END_SLOPE_B;
-       reg->shifts.field_region_end_base = mpc->mpc_shift->MPCC_MCM_1DLUT_RAMA_EXP_REGION_END_BASE_B;
-       reg->masks.field_region_end_base = mpc->mpc_mask->MPCC_MCM_1DLUT_RAMA_EXP_REGION_END_BASE_B;
-       reg->shifts.field_region_linear_slope = mpc->mpc_shift->MPCC_MCM_1DLUT_RAMA_EXP_REGION_START_SLOPE_B;
-       reg->masks.field_region_linear_slope = mpc->mpc_mask->MPCC_MCM_1DLUT_RAMA_EXP_REGION_START_SLOPE_B;
-       reg->shifts.exp_region_start = mpc->mpc_shift->MPCC_MCM_1DLUT_RAMA_EXP_REGION_START_B;
-       reg->masks.exp_region_start = mpc->mpc_mask->MPCC_MCM_1DLUT_RAMA_EXP_REGION_START_B;
-       reg->shifts.exp_resion_start_segment = mpc->mpc_shift->MPCC_MCM_1DLUT_RAMA_EXP_REGION_START_SEGMENT_B;
-       reg->masks.exp_resion_start_segment = mpc->mpc_mask->MPCC_MCM_1DLUT_RAMA_EXP_REGION_START_SEGMENT_B;
-}
-
-/*program blnd lut RAM A*/
-void mpc32_program_post1dluta_settings(
-               struct mpc *mpc,
-               uint32_t mpcc_id,
-               const struct pwl_params *params)
-{
-       struct dcn30_mpc *mpc30 = TO_DCN30_MPC(mpc);
-       struct dcn3_xfer_func_reg gam_regs;
-
-       mpc32_post1dlut_get_reg_field(mpc30, &gam_regs);
-
-       gam_regs.start_cntl_b = REG(MPCC_MCM_1DLUT_RAMA_START_CNTL_B[mpcc_id]);
-       gam_regs.start_cntl_g = REG(MPCC_MCM_1DLUT_RAMA_START_CNTL_G[mpcc_id]);
-       gam_regs.start_cntl_r = REG(MPCC_MCM_1DLUT_RAMA_START_CNTL_R[mpcc_id]);
-       gam_regs.start_slope_cntl_b = REG(MPCC_MCM_1DLUT_RAMA_START_SLOPE_CNTL_B[mpcc_id]);
-       gam_regs.start_slope_cntl_g = REG(MPCC_MCM_1DLUT_RAMA_START_SLOPE_CNTL_G[mpcc_id]);
-       gam_regs.start_slope_cntl_r = REG(MPCC_MCM_1DLUT_RAMA_START_SLOPE_CNTL_R[mpcc_id]);
-       gam_regs.start_end_cntl1_b = REG(MPCC_MCM_1DLUT_RAMA_END_CNTL1_B[mpcc_id]);
-       gam_regs.start_end_cntl2_b = REG(MPCC_MCM_1DLUT_RAMA_END_CNTL2_B[mpcc_id]);
-       gam_regs.start_end_cntl1_g = REG(MPCC_MCM_1DLUT_RAMA_END_CNTL1_G[mpcc_id]);
-       gam_regs.start_end_cntl2_g = REG(MPCC_MCM_1DLUT_RAMA_END_CNTL2_G[mpcc_id]);
-       gam_regs.start_end_cntl1_r = REG(MPCC_MCM_1DLUT_RAMA_END_CNTL1_R[mpcc_id]);
-       gam_regs.start_end_cntl2_r = REG(MPCC_MCM_1DLUT_RAMA_END_CNTL2_R[mpcc_id]);
-       gam_regs.region_start = REG(MPCC_MCM_1DLUT_RAMA_REGION_0_1[mpcc_id]);
-       gam_regs.region_end = REG(MPCC_MCM_1DLUT_RAMA_REGION_32_33[mpcc_id]);
-
-       cm_helper_program_gamcor_xfer_func(mpc->ctx, params, &gam_regs);
-}
-
-/*program blnd lut RAM B*/
-void mpc32_program_post1dlutb_settings(
-               struct mpc *mpc,
-               uint32_t mpcc_id,
-               const struct pwl_params *params)
-{
-       struct dcn30_mpc *mpc30 = TO_DCN30_MPC(mpc);
-       struct dcn3_xfer_func_reg gam_regs;
-
-       mpc32_post1dlut_get_reg_field(mpc30, &gam_regs);
-
-       gam_regs.start_cntl_b = REG(MPCC_MCM_1DLUT_RAMB_START_CNTL_B[mpcc_id]);
-       gam_regs.start_cntl_g = REG(MPCC_MCM_1DLUT_RAMB_START_CNTL_G[mpcc_id]);
-       gam_regs.start_cntl_r = REG(MPCC_MCM_1DLUT_RAMB_START_CNTL_R[mpcc_id]);
-       gam_regs.start_slope_cntl_b = REG(MPCC_MCM_1DLUT_RAMB_START_SLOPE_CNTL_B[mpcc_id]);
-       gam_regs.start_slope_cntl_g = REG(MPCC_MCM_1DLUT_RAMB_START_SLOPE_CNTL_G[mpcc_id]);
-       gam_regs.start_slope_cntl_r = REG(MPCC_MCM_1DLUT_RAMB_START_SLOPE_CNTL_R[mpcc_id]);
-       gam_regs.start_end_cntl1_b = REG(MPCC_MCM_1DLUT_RAMB_END_CNTL1_B[mpcc_id]);
-       gam_regs.start_end_cntl2_b = REG(MPCC_MCM_1DLUT_RAMB_END_CNTL2_B[mpcc_id]);
-       gam_regs.start_end_cntl1_g = REG(MPCC_MCM_1DLUT_RAMB_END_CNTL1_G[mpcc_id]);
-       gam_regs.start_end_cntl2_g = REG(MPCC_MCM_1DLUT_RAMB_END_CNTL2_G[mpcc_id]);
-       gam_regs.start_end_cntl1_r = REG(MPCC_MCM_1DLUT_RAMB_END_CNTL1_R[mpcc_id]);
-       gam_regs.start_end_cntl2_r = REG(MPCC_MCM_1DLUT_RAMB_END_CNTL2_R[mpcc_id]);
-       gam_regs.region_start = REG(MPCC_MCM_1DLUT_RAMB_REGION_0_1[mpcc_id]);
-       gam_regs.region_end = REG(MPCC_MCM_1DLUT_RAMB_REGION_32_33[mpcc_id]);
-
-       cm_helper_program_gamcor_xfer_func(mpc->ctx, params, &gam_regs);
-}
-
-void mpc32_program_post1dlut_pwl(
-               struct mpc *mpc,
-               uint32_t mpcc_id,
-               const struct pwl_result_data *rgb,
-               uint32_t num)
-{
-       uint32_t i;
-       struct dcn30_mpc *mpc30 = TO_DCN30_MPC(mpc);
-       uint32_t last_base_value_red = rgb[num-1].red_reg + rgb[num-1].delta_red_reg;
-       uint32_t last_base_value_green = rgb[num-1].green_reg + rgb[num-1].delta_green_reg;
-       uint32_t last_base_value_blue = rgb[num-1].blue_reg + rgb[num-1].delta_blue_reg;
-
-       if (is_rgb_equal(rgb, num)) {
-               for (i = 0 ; i < num; i++)
-                       REG_SET(MPCC_MCM_1DLUT_LUT_DATA[mpcc_id], 0, MPCC_MCM_1DLUT_LUT_DATA, rgb[i].red_reg);
-               REG_SET(MPCC_MCM_1DLUT_LUT_DATA[mpcc_id], 0, MPCC_MCM_1DLUT_LUT_DATA, last_base_value_red);
-       } else {
-               REG_SET(MPCC_MCM_1DLUT_LUT_INDEX[mpcc_id], 0, MPCC_MCM_1DLUT_LUT_INDEX, 0);
-               REG_UPDATE(MPCC_MCM_1DLUT_LUT_CONTROL[mpcc_id], MPCC_MCM_1DLUT_LUT_WRITE_COLOR_MASK, 4);
-               for (i = 0 ; i < num; i++)
-                       REG_SET(MPCC_MCM_1DLUT_LUT_DATA[mpcc_id], 0, MPCC_MCM_1DLUT_LUT_DATA, rgb[i].red_reg);
-               REG_SET(MPCC_MCM_1DLUT_LUT_DATA[mpcc_id], 0, MPCC_MCM_1DLUT_LUT_DATA, last_base_value_red);
-
-               REG_SET(MPCC_MCM_1DLUT_LUT_INDEX[mpcc_id], 0, MPCC_MCM_1DLUT_LUT_INDEX, 0);
-               REG_UPDATE(MPCC_MCM_1DLUT_LUT_CONTROL[mpcc_id], MPCC_MCM_1DLUT_LUT_WRITE_COLOR_MASK, 2);
-               for (i = 0 ; i < num; i++)
-                       REG_SET(MPCC_MCM_1DLUT_LUT_DATA[mpcc_id], 0, MPCC_MCM_1DLUT_LUT_DATA, rgb[i].green_reg);
-               REG_SET(MPCC_MCM_1DLUT_LUT_DATA[mpcc_id], 0, MPCC_MCM_1DLUT_LUT_DATA, last_base_value_green);
-
-               REG_SET(MPCC_MCM_1DLUT_LUT_INDEX[mpcc_id], 0, MPCC_MCM_1DLUT_LUT_INDEX, 0);
-               REG_UPDATE(MPCC_MCM_1DLUT_LUT_CONTROL[mpcc_id], MPCC_MCM_1DLUT_LUT_WRITE_COLOR_MASK, 1);
-               for (i = 0 ; i < num; i++)
-                       REG_SET(MPCC_MCM_1DLUT_LUT_DATA[mpcc_id], 0, MPCC_MCM_1DLUT_LUT_DATA, rgb[i].blue_reg);
-               REG_SET(MPCC_MCM_1DLUT_LUT_DATA[mpcc_id], 0, MPCC_MCM_1DLUT_LUT_DATA, last_base_value_blue);
-       }
-}
-
-bool mpc32_program_post1dlut(
-               struct mpc *mpc,
-               const struct pwl_params *params,
-               uint32_t mpcc_id)
-{
-       enum dc_lut_mode current_mode;
-       enum dc_lut_mode next_mode;
-       struct dcn30_mpc *mpc30 = TO_DCN30_MPC(mpc);
-
-       if (params == NULL) {
-               REG_SET(MPCC_MCM_1DLUT_CONTROL[mpcc_id], 0, MPCC_MCM_1DLUT_MODE, 0);
-               if (mpc->ctx->dc->debug.enable_mem_low_power.bits.cm)
-                       mpc32_power_on_blnd_lut(mpc, mpcc_id, false);
-               return false;
-       }
-
-       current_mode = mpc32_get_post1dlut_current(mpc, mpcc_id);
-       if (current_mode == LUT_BYPASS || current_mode == LUT_RAM_B)
-               next_mode = LUT_RAM_A;
-       else
-               next_mode = LUT_RAM_B;
-
-       mpc32_power_on_blnd_lut(mpc, mpcc_id, true);
-       mpc32_configure_post1dlut(mpc, mpcc_id, next_mode == LUT_RAM_A);
-
-       if (next_mode == LUT_RAM_A)
-               mpc32_program_post1dluta_settings(mpc, mpcc_id, params);
-       else
-               mpc32_program_post1dlutb_settings(mpc, mpcc_id, params);
-
-       mpc32_program_post1dlut_pwl(
-                       mpc, mpcc_id, params->rgb_resulted, params->hw_points_num);
-
-       REG_UPDATE_2(MPCC_MCM_1DLUT_CONTROL[mpcc_id],
-                       MPCC_MCM_1DLUT_MODE, 2,
-                       MPCC_MCM_1DLUT_SELECT, next_mode == LUT_RAM_A ? 0 : 1);
-
-       return true;
-}
-
-static enum dc_lut_mode mpc32_get_shaper_current(struct mpc *mpc, uint32_t mpcc_id)
-{
-       enum dc_lut_mode mode;
-       uint32_t state_mode;
-       struct dcn30_mpc *mpc30 = TO_DCN30_MPC(mpc);
-
-       REG_GET(MPCC_MCM_SHAPER_CONTROL[mpcc_id], MPCC_MCM_SHAPER_MODE_CURRENT, &state_mode);
-
-       switch (state_mode) {
-       case 0:
-               mode = LUT_BYPASS;
-               break;
-       case 1:
-               mode = LUT_RAM_A;
-               break;
-       case 2:
-               mode = LUT_RAM_B;
-               break;
-       default:
-               mode = LUT_BYPASS;
-               break;
-       }
-
-       return mode;
-}
-
-
-void mpc32_configure_shaper_lut(
-               struct mpc *mpc,
-               bool is_ram_a,
-               uint32_t mpcc_id)
-{
-       struct dcn30_mpc *mpc30 = TO_DCN30_MPC(mpc);
-
-       REG_UPDATE(MPCC_MCM_SHAPER_LUT_WRITE_EN_MASK[mpcc_id],
-                       MPCC_MCM_SHAPER_LUT_WRITE_EN_MASK, 7);
-       REG_UPDATE(MPCC_MCM_SHAPER_LUT_WRITE_EN_MASK[mpcc_id],
-                       MPCC_MCM_SHAPER_LUT_WRITE_SEL, is_ram_a == true ? 0:1);
-       REG_SET(MPCC_MCM_SHAPER_LUT_INDEX[mpcc_id], 0, MPCC_MCM_SHAPER_LUT_INDEX, 0);
-}
-
-
-void mpc32_program_shaper_luta_settings(
-               struct mpc *mpc,
-               const struct pwl_params *params,
-               uint32_t mpcc_id)
-{
-       const struct gamma_curve *curve;
-       struct dcn30_mpc *mpc30 = TO_DCN30_MPC(mpc);
-
-       REG_SET_2(MPCC_MCM_SHAPER_RAMA_START_CNTL_B[mpcc_id], 0,
-               MPCC_MCM_SHAPER_RAMA_EXP_REGION_START_B, params->corner_points[0].blue.custom_float_x,
-               MPCC_MCM_SHAPER_RAMA_EXP_REGION_START_SEGMENT_B, 0);
-       REG_SET_2(MPCC_MCM_SHAPER_RAMA_START_CNTL_G[mpcc_id], 0,
-                       MPCC_MCM_SHAPER_RAMA_EXP_REGION_START_B, params->corner_points[0].green.custom_float_x,
-                       MPCC_MCM_SHAPER_RAMA_EXP_REGION_START_SEGMENT_B, 0);
-       REG_SET_2(MPCC_MCM_SHAPER_RAMA_START_CNTL_R[mpcc_id], 0,
-                       MPCC_MCM_SHAPER_RAMA_EXP_REGION_START_B, params->corner_points[0].red.custom_float_x,
-                       MPCC_MCM_SHAPER_RAMA_EXP_REGION_START_SEGMENT_B, 0);
-
-       REG_SET_2(MPCC_MCM_SHAPER_RAMA_END_CNTL_B[mpcc_id], 0,
-                       MPCC_MCM_SHAPER_RAMA_EXP_REGION_END_B, params->corner_points[1].blue.custom_float_x,
-                       MPCC_MCM_SHAPER_RAMA_EXP_REGION_END_BASE_B, params->corner_points[1].blue.custom_float_y);
-       REG_SET_2(MPCC_MCM_SHAPER_RAMA_END_CNTL_G[mpcc_id], 0,
-                       MPCC_MCM_SHAPER_RAMA_EXP_REGION_END_B, params->corner_points[1].green.custom_float_x,
-                       MPCC_MCM_SHAPER_RAMA_EXP_REGION_END_BASE_B, params->corner_points[1].green.custom_float_y);
-       REG_SET_2(MPCC_MCM_SHAPER_RAMA_END_CNTL_R[mpcc_id], 0,
-                       MPCC_MCM_SHAPER_RAMA_EXP_REGION_END_B, params->corner_points[1].red.custom_float_x,
-                       MPCC_MCM_SHAPER_RAMA_EXP_REGION_END_BASE_B, params->corner_points[1].red.custom_float_y);
-
-       curve = params->arr_curve_points;
-       REG_SET_4(MPCC_MCM_SHAPER_RAMA_REGION_0_1[mpcc_id], 0,
-               MPCC_MCM_SHAPER_RAMA_EXP_REGION0_LUT_OFFSET, curve[0].offset,
-               MPCC_MCM_SHAPER_RAMA_EXP_REGION0_NUM_SEGMENTS, curve[0].segments_num,
-               MPCC_MCM_SHAPER_RAMA_EXP_REGION1_LUT_OFFSET, curve[1].offset,
-               MPCC_MCM_SHAPER_RAMA_EXP_REGION1_NUM_SEGMENTS, curve[1].segments_num);
-
-       curve += 2;
-       REG_SET_4(MPCC_MCM_SHAPER_RAMA_REGION_2_3[mpcc_id], 0,
-               MPCC_MCM_SHAPER_RAMA_EXP_REGION0_LUT_OFFSET, curve[0].offset,
-               MPCC_MCM_SHAPER_RAMA_EXP_REGION0_NUM_SEGMENTS, curve[0].segments_num,
-               MPCC_MCM_SHAPER_RAMA_EXP_REGION1_LUT_OFFSET, curve[1].offset,
-               MPCC_MCM_SHAPER_RAMA_EXP_REGION1_NUM_SEGMENTS, curve[1].segments_num);
-
-       curve += 2;
-       REG_SET_4(MPCC_MCM_SHAPER_RAMA_REGION_4_5[mpcc_id], 0,
-               MPCC_MCM_SHAPER_RAMA_EXP_REGION0_LUT_OFFSET, curve[0].offset,
-               MPCC_MCM_SHAPER_RAMA_EXP_REGION0_NUM_SEGMENTS, curve[0].segments_num,
-               MPCC_MCM_SHAPER_RAMA_EXP_REGION1_LUT_OFFSET, curve[1].offset,
-               MPCC_MCM_SHAPER_RAMA_EXP_REGION1_NUM_SEGMENTS, curve[1].segments_num);
-
-       curve += 2;
-       REG_SET_4(MPCC_MCM_SHAPER_RAMA_REGION_6_7[mpcc_id], 0,
-               MPCC_MCM_SHAPER_RAMA_EXP_REGION0_LUT_OFFSET, curve[0].offset,
-               MPCC_MCM_SHAPER_RAMA_EXP_REGION0_NUM_SEGMENTS, curve[0].segments_num,
-               MPCC_MCM_SHAPER_RAMA_EXP_REGION1_LUT_OFFSET, curve[1].offset,
-               MPCC_MCM_SHAPER_RAMA_EXP_REGION1_NUM_SEGMENTS, curve[1].segments_num);
-
-       curve += 2;
-       REG_SET_4(MPCC_MCM_SHAPER_RAMA_REGION_8_9[mpcc_id], 0,
-               MPCC_MCM_SHAPER_RAMA_EXP_REGION0_LUT_OFFSET, curve[0].offset,
-               MPCC_MCM_SHAPER_RAMA_EXP_REGION0_NUM_SEGMENTS, curve[0].segments_num,
-               MPCC_MCM_SHAPER_RAMA_EXP_REGION1_LUT_OFFSET, curve[1].offset,
-               MPCC_MCM_SHAPER_RAMA_EXP_REGION1_NUM_SEGMENTS, curve[1].segments_num);
-
-       curve += 2;
-       REG_SET_4(MPCC_MCM_SHAPER_RAMA_REGION_10_11[mpcc_id], 0,
-               MPCC_MCM_SHAPER_RAMA_EXP_REGION0_LUT_OFFSET, curve[0].offset,
-               MPCC_MCM_SHAPER_RAMA_EXP_REGION0_NUM_SEGMENTS, curve[0].segments_num,
-               MPCC_MCM_SHAPER_RAMA_EXP_REGION1_LUT_OFFSET, curve[1].offset,
-               MPCC_MCM_SHAPER_RAMA_EXP_REGION1_NUM_SEGMENTS, curve[1].segments_num);
-
-       curve += 2;
-       REG_SET_4(MPCC_MCM_SHAPER_RAMA_REGION_12_13[mpcc_id], 0,
-               MPCC_MCM_SHAPER_RAMA_EXP_REGION0_LUT_OFFSET, curve[0].offset,
-               MPCC_MCM_SHAPER_RAMA_EXP_REGION0_NUM_SEGMENTS, curve[0].segments_num,
-               MPCC_MCM_SHAPER_RAMA_EXP_REGION1_LUT_OFFSET, curve[1].offset,
-               MPCC_MCM_SHAPER_RAMA_EXP_REGION1_NUM_SEGMENTS, curve[1].segments_num);
-
-       curve += 2;
-       REG_SET_4(MPCC_MCM_SHAPER_RAMA_REGION_14_15[mpcc_id], 0,
-               MPCC_MCM_SHAPER_RAMA_EXP_REGION0_LUT_OFFSET, curve[0].offset,
-               MPCC_MCM_SHAPER_RAMA_EXP_REGION0_NUM_SEGMENTS, curve[0].segments_num,
-               MPCC_MCM_SHAPER_RAMA_EXP_REGION1_LUT_OFFSET, curve[1].offset,
-               MPCC_MCM_SHAPER_RAMA_EXP_REGION1_NUM_SEGMENTS, curve[1].segments_num);
-
-
-       curve += 2;
-       REG_SET_4(MPCC_MCM_SHAPER_RAMA_REGION_16_17[mpcc_id], 0,
-               MPCC_MCM_SHAPER_RAMA_EXP_REGION0_LUT_OFFSET, curve[0].offset,
-               MPCC_MCM_SHAPER_RAMA_EXP_REGION0_NUM_SEGMENTS, curve[0].segments_num,
-               MPCC_MCM_SHAPER_RAMA_EXP_REGION1_LUT_OFFSET, curve[1].offset,
-               MPCC_MCM_SHAPER_RAMA_EXP_REGION1_NUM_SEGMENTS, curve[1].segments_num);
-
-       curve += 2;
-       REG_SET_4(MPCC_MCM_SHAPER_RAMA_REGION_18_19[mpcc_id], 0,
-               MPCC_MCM_SHAPER_RAMA_EXP_REGION0_LUT_OFFSET, curve[0].offset,
-               MPCC_MCM_SHAPER_RAMA_EXP_REGION0_NUM_SEGMENTS, curve[0].segments_num,
-               MPCC_MCM_SHAPER_RAMA_EXP_REGION1_LUT_OFFSET, curve[1].offset,
-               MPCC_MCM_SHAPER_RAMA_EXP_REGION1_NUM_SEGMENTS, curve[1].segments_num);
-
-       curve += 2;
-       REG_SET_4(MPCC_MCM_SHAPER_RAMA_REGION_20_21[mpcc_id], 0,
-               MPCC_MCM_SHAPER_RAMA_EXP_REGION0_LUT_OFFSET, curve[0].offset,
-               MPCC_MCM_SHAPER_RAMA_EXP_REGION0_NUM_SEGMENTS, curve[0].segments_num,
-               MPCC_MCM_SHAPER_RAMA_EXP_REGION1_LUT_OFFSET, curve[1].offset,
-               MPCC_MCM_SHAPER_RAMA_EXP_REGION1_NUM_SEGMENTS, curve[1].segments_num);
-
-       curve += 2;
-       REG_SET_4(MPCC_MCM_SHAPER_RAMA_REGION_22_23[mpcc_id], 0,
-               MPCC_MCM_SHAPER_RAMA_EXP_REGION0_LUT_OFFSET, curve[0].offset,
-               MPCC_MCM_SHAPER_RAMA_EXP_REGION0_NUM_SEGMENTS, curve[0].segments_num,
-               MPCC_MCM_SHAPER_RAMA_EXP_REGION1_LUT_OFFSET, curve[1].offset,
-               MPCC_MCM_SHAPER_RAMA_EXP_REGION1_NUM_SEGMENTS, curve[1].segments_num);
-
-       curve += 2;
-       REG_SET_4(MPCC_MCM_SHAPER_RAMA_REGION_24_25[mpcc_id], 0,
-               MPCC_MCM_SHAPER_RAMA_EXP_REGION0_LUT_OFFSET, curve[0].offset,
-               MPCC_MCM_SHAPER_RAMA_EXP_REGION0_NUM_SEGMENTS, curve[0].segments_num,
-               MPCC_MCM_SHAPER_RAMA_EXP_REGION1_LUT_OFFSET, curve[1].offset,
-               MPCC_MCM_SHAPER_RAMA_EXP_REGION1_NUM_SEGMENTS, curve[1].segments_num);
-
-       curve += 2;
-       REG_SET_4(MPCC_MCM_SHAPER_RAMA_REGION_26_27[mpcc_id], 0,
-                       MPCC_MCM_SHAPER_RAMA_EXP_REGION0_LUT_OFFSET, curve[0].offset,
-                       MPCC_MCM_SHAPER_RAMA_EXP_REGION0_NUM_SEGMENTS, curve[0].segments_num,
-                       MPCC_MCM_SHAPER_RAMA_EXP_REGION1_LUT_OFFSET, curve[1].offset,
-                       MPCC_MCM_SHAPER_RAMA_EXP_REGION1_NUM_SEGMENTS, curve[1].segments_num);
-
-       curve += 2;
-       REG_SET_4(MPCC_MCM_SHAPER_RAMA_REGION_28_29[mpcc_id], 0,
-               MPCC_MCM_SHAPER_RAMA_EXP_REGION0_LUT_OFFSET, curve[0].offset,
-               MPCC_MCM_SHAPER_RAMA_EXP_REGION0_NUM_SEGMENTS, curve[0].segments_num,
-               MPCC_MCM_SHAPER_RAMA_EXP_REGION1_LUT_OFFSET, curve[1].offset,
-               MPCC_MCM_SHAPER_RAMA_EXP_REGION1_NUM_SEGMENTS, curve[1].segments_num);
-
-       curve += 2;
-       REG_SET_4(MPCC_MCM_SHAPER_RAMA_REGION_30_31[mpcc_id], 0,
-               MPCC_MCM_SHAPER_RAMA_EXP_REGION0_LUT_OFFSET, curve[0].offset,
-               MPCC_MCM_SHAPER_RAMA_EXP_REGION0_NUM_SEGMENTS, curve[0].segments_num,
-               MPCC_MCM_SHAPER_RAMA_EXP_REGION1_LUT_OFFSET, curve[1].offset,
-               MPCC_MCM_SHAPER_RAMA_EXP_REGION1_NUM_SEGMENTS, curve[1].segments_num);
-
-       curve += 2;
-       REG_SET_4(MPCC_MCM_SHAPER_RAMA_REGION_32_33[mpcc_id], 0,
-               MPCC_MCM_SHAPER_RAMA_EXP_REGION0_LUT_OFFSET, curve[0].offset,
-               MPCC_MCM_SHAPER_RAMA_EXP_REGION0_NUM_SEGMENTS, curve[0].segments_num,
-               MPCC_MCM_SHAPER_RAMA_EXP_REGION1_LUT_OFFSET, curve[1].offset,
-               MPCC_MCM_SHAPER_RAMA_EXP_REGION1_NUM_SEGMENTS, curve[1].segments_num);
-}
-
-
-void mpc32_program_shaper_lutb_settings(
-               struct mpc *mpc,
-               const struct pwl_params *params,
-               uint32_t mpcc_id)
-{
-       const struct gamma_curve *curve;
-       struct dcn30_mpc *mpc30 = TO_DCN30_MPC(mpc);
-
-       REG_SET_2(MPCC_MCM_SHAPER_RAMB_START_CNTL_B[mpcc_id], 0,
-               MPCC_MCM_SHAPER_RAMA_EXP_REGION_START_B, params->corner_points[0].blue.custom_float_x,
-               MPCC_MCM_SHAPER_RAMA_EXP_REGION_START_SEGMENT_B, 0);
-       REG_SET_2(MPCC_MCM_SHAPER_RAMB_START_CNTL_G[mpcc_id], 0,
-                       MPCC_MCM_SHAPER_RAMA_EXP_REGION_START_B, params->corner_points[0].green.custom_float_x,
-                       MPCC_MCM_SHAPER_RAMA_EXP_REGION_START_SEGMENT_B, 0);
-       REG_SET_2(MPCC_MCM_SHAPER_RAMB_START_CNTL_R[mpcc_id], 0,
-                       MPCC_MCM_SHAPER_RAMA_EXP_REGION_START_B, params->corner_points[0].red.custom_float_x,
-                       MPCC_MCM_SHAPER_RAMA_EXP_REGION_START_SEGMENT_B, 0);
-
-       REG_SET_2(MPCC_MCM_SHAPER_RAMB_END_CNTL_B[mpcc_id], 0,
-                       MPCC_MCM_SHAPER_RAMA_EXP_REGION_END_B, params->corner_points[1].blue.custom_float_x,
-                       MPCC_MCM_SHAPER_RAMA_EXP_REGION_END_BASE_B, params->corner_points[1].blue.custom_float_y);
-       REG_SET_2(MPCC_MCM_SHAPER_RAMB_END_CNTL_G[mpcc_id], 0,
-                       MPCC_MCM_SHAPER_RAMA_EXP_REGION_END_B, params->corner_points[1].green.custom_float_x,
-                       MPCC_MCM_SHAPER_RAMA_EXP_REGION_END_BASE_B, params->corner_points[1].green.custom_float_y);
-       REG_SET_2(MPCC_MCM_SHAPER_RAMB_END_CNTL_R[mpcc_id], 0,
-                       MPCC_MCM_SHAPER_RAMA_EXP_REGION_END_B, params->corner_points[1].red.custom_float_x,
-                       MPCC_MCM_SHAPER_RAMA_EXP_REGION_END_BASE_B, params->corner_points[1].red.custom_float_y);
-
-       curve = params->arr_curve_points;
-       REG_SET_4(MPCC_MCM_SHAPER_RAMB_REGION_0_1[mpcc_id], 0,
-               MPCC_MCM_SHAPER_RAMA_EXP_REGION0_LUT_OFFSET, curve[0].offset,
-               MPCC_MCM_SHAPER_RAMA_EXP_REGION0_NUM_SEGMENTS, curve[0].segments_num,
-               MPCC_MCM_SHAPER_RAMA_EXP_REGION1_LUT_OFFSET, curve[1].offset,
-               MPCC_MCM_SHAPER_RAMA_EXP_REGION1_NUM_SEGMENTS, curve[1].segments_num);
-
-       curve += 2;
-       REG_SET_4(MPCC_MCM_SHAPER_RAMB_REGION_2_3[mpcc_id], 0,
-                       MPCC_MCM_SHAPER_RAMA_EXP_REGION0_LUT_OFFSET, curve[0].offset,
-                       MPCC_MCM_SHAPER_RAMA_EXP_REGION0_NUM_SEGMENTS, curve[0].segments_num,
-                       MPCC_MCM_SHAPER_RAMA_EXP_REGION1_LUT_OFFSET, curve[1].offset,
-                       MPCC_MCM_SHAPER_RAMA_EXP_REGION1_NUM_SEGMENTS, curve[1].segments_num);
-
-
-       curve += 2;
-       REG_SET_4(MPCC_MCM_SHAPER_RAMB_REGION_4_5[mpcc_id], 0,
-                       MPCC_MCM_SHAPER_RAMA_EXP_REGION0_LUT_OFFSET, curve[0].offset,
-                       MPCC_MCM_SHAPER_RAMA_EXP_REGION0_NUM_SEGMENTS, curve[0].segments_num,
-                       MPCC_MCM_SHAPER_RAMA_EXP_REGION1_LUT_OFFSET, curve[1].offset,
-                       MPCC_MCM_SHAPER_RAMA_EXP_REGION1_NUM_SEGMENTS, curve[1].segments_num);
-
-       curve += 2;
-       REG_SET_4(MPCC_MCM_SHAPER_RAMB_REGION_6_7[mpcc_id], 0,
-                       MPCC_MCM_SHAPER_RAMA_EXP_REGION0_LUT_OFFSET, curve[0].offset,
-                       MPCC_MCM_SHAPER_RAMA_EXP_REGION0_NUM_SEGMENTS, curve[0].segments_num,
-                       MPCC_MCM_SHAPER_RAMA_EXP_REGION1_LUT_OFFSET, curve[1].offset,
-                       MPCC_MCM_SHAPER_RAMA_EXP_REGION1_NUM_SEGMENTS, curve[1].segments_num);
-
-       curve += 2;
-       REG_SET_4(MPCC_MCM_SHAPER_RAMB_REGION_8_9[mpcc_id], 0,
-               MPCC_MCM_SHAPER_RAMA_EXP_REGION0_LUT_OFFSET, curve[0].offset,
-               MPCC_MCM_SHAPER_RAMA_EXP_REGION0_NUM_SEGMENTS, curve[0].segments_num,
-               MPCC_MCM_SHAPER_RAMA_EXP_REGION1_LUT_OFFSET, curve[1].offset,
-               MPCC_MCM_SHAPER_RAMA_EXP_REGION1_NUM_SEGMENTS, curve[1].segments_num);
-
-       curve += 2;
-       REG_SET_4(MPCC_MCM_SHAPER_RAMB_REGION_10_11[mpcc_id], 0,
-                       MPCC_MCM_SHAPER_RAMA_EXP_REGION0_LUT_OFFSET, curve[0].offset,
-                       MPCC_MCM_SHAPER_RAMA_EXP_REGION0_NUM_SEGMENTS, curve[0].segments_num,
-                       MPCC_MCM_SHAPER_RAMA_EXP_REGION1_LUT_OFFSET, curve[1].offset,
-                       MPCC_MCM_SHAPER_RAMA_EXP_REGION1_NUM_SEGMENTS, curve[1].segments_num);
-
-       curve += 2;
-       REG_SET_4(MPCC_MCM_SHAPER_RAMB_REGION_12_13[mpcc_id], 0,
-                       MPCC_MCM_SHAPER_RAMA_EXP_REGION0_LUT_OFFSET, curve[0].offset,
-                       MPCC_MCM_SHAPER_RAMA_EXP_REGION0_NUM_SEGMENTS, curve[0].segments_num,
-                       MPCC_MCM_SHAPER_RAMA_EXP_REGION1_LUT_OFFSET, curve[1].offset,
-                       MPCC_MCM_SHAPER_RAMA_EXP_REGION1_NUM_SEGMENTS, curve[1].segments_num);
-
-       curve += 2;
-       REG_SET_4(MPCC_MCM_SHAPER_RAMB_REGION_14_15[mpcc_id], 0,
-                       MPCC_MCM_SHAPER_RAMA_EXP_REGION0_LUT_OFFSET, curve[0].offset,
-                       MPCC_MCM_SHAPER_RAMA_EXP_REGION0_NUM_SEGMENTS, curve[0].segments_num,
-                       MPCC_MCM_SHAPER_RAMA_EXP_REGION1_LUT_OFFSET, curve[1].offset,
-                       MPCC_MCM_SHAPER_RAMA_EXP_REGION1_NUM_SEGMENTS, curve[1].segments_num);
-
-
-       curve += 2;
-       REG_SET_4(MPCC_MCM_SHAPER_RAMB_REGION_16_17[mpcc_id], 0,
-                       MPCC_MCM_SHAPER_RAMA_EXP_REGION0_LUT_OFFSET, curve[0].offset,
-                       MPCC_MCM_SHAPER_RAMA_EXP_REGION0_NUM_SEGMENTS, curve[0].segments_num,
-                       MPCC_MCM_SHAPER_RAMA_EXP_REGION1_LUT_OFFSET, curve[1].offset,
-                       MPCC_MCM_SHAPER_RAMA_EXP_REGION1_NUM_SEGMENTS, curve[1].segments_num);
-
-       curve += 2;
-       REG_SET_4(MPCC_MCM_SHAPER_RAMB_REGION_18_19[mpcc_id], 0,
-                       MPCC_MCM_SHAPER_RAMA_EXP_REGION0_LUT_OFFSET, curve[0].offset,
-                       MPCC_MCM_SHAPER_RAMA_EXP_REGION0_NUM_SEGMENTS, curve[0].segments_num,
-                       MPCC_MCM_SHAPER_RAMA_EXP_REGION1_LUT_OFFSET, curve[1].offset,
-                       MPCC_MCM_SHAPER_RAMA_EXP_REGION1_NUM_SEGMENTS, curve[1].segments_num);
-
-       curve += 2;
-       REG_SET_4(MPCC_MCM_SHAPER_RAMB_REGION_20_21[mpcc_id], 0,
-                       MPCC_MCM_SHAPER_RAMA_EXP_REGION0_LUT_OFFSET, curve[0].offset,
-                       MPCC_MCM_SHAPER_RAMA_EXP_REGION0_NUM_SEGMENTS, curve[0].segments_num,
-                       MPCC_MCM_SHAPER_RAMA_EXP_REGION1_LUT_OFFSET, curve[1].offset,
-                       MPCC_MCM_SHAPER_RAMA_EXP_REGION1_NUM_SEGMENTS, curve[1].segments_num);
-
-       curve += 2;
-       REG_SET_4(MPCC_MCM_SHAPER_RAMB_REGION_22_23[mpcc_id], 0,
-                       MPCC_MCM_SHAPER_RAMA_EXP_REGION0_LUT_OFFSET, curve[0].offset,
-                       MPCC_MCM_SHAPER_RAMA_EXP_REGION0_NUM_SEGMENTS, curve[0].segments_num,
-                       MPCC_MCM_SHAPER_RAMA_EXP_REGION1_LUT_OFFSET, curve[1].offset,
-                       MPCC_MCM_SHAPER_RAMA_EXP_REGION1_NUM_SEGMENTS, curve[1].segments_num);
-
-       curve += 2;
-       REG_SET_4(MPCC_MCM_SHAPER_RAMB_REGION_24_25[mpcc_id], 0,
-                       MPCC_MCM_SHAPER_RAMA_EXP_REGION0_LUT_OFFSET, curve[0].offset,
-                       MPCC_MCM_SHAPER_RAMA_EXP_REGION0_NUM_SEGMENTS, curve[0].segments_num,
-                       MPCC_MCM_SHAPER_RAMA_EXP_REGION1_LUT_OFFSET, curve[1].offset,
-                       MPCC_MCM_SHAPER_RAMA_EXP_REGION1_NUM_SEGMENTS, curve[1].segments_num);
-
-       curve += 2;
-       REG_SET_4(MPCC_MCM_SHAPER_RAMB_REGION_26_27[mpcc_id], 0,
-                       MPCC_MCM_SHAPER_RAMA_EXP_REGION0_LUT_OFFSET, curve[0].offset,
-                       MPCC_MCM_SHAPER_RAMA_EXP_REGION0_NUM_SEGMENTS, curve[0].segments_num,
-                       MPCC_MCM_SHAPER_RAMA_EXP_REGION1_LUT_OFFSET, curve[1].offset,
-                       MPCC_MCM_SHAPER_RAMA_EXP_REGION1_NUM_SEGMENTS, curve[1].segments_num);
-
-       curve += 2;
-       REG_SET_4(MPCC_MCM_SHAPER_RAMB_REGION_28_29[mpcc_id], 0,
-                       MPCC_MCM_SHAPER_RAMA_EXP_REGION0_LUT_OFFSET, curve[0].offset,
-                       MPCC_MCM_SHAPER_RAMA_EXP_REGION0_NUM_SEGMENTS, curve[0].segments_num,
-                       MPCC_MCM_SHAPER_RAMA_EXP_REGION1_LUT_OFFSET, curve[1].offset,
-                       MPCC_MCM_SHAPER_RAMA_EXP_REGION1_NUM_SEGMENTS, curve[1].segments_num);
-
-       curve += 2;
-       REG_SET_4(MPCC_MCM_SHAPER_RAMB_REGION_30_31[mpcc_id], 0,
-                       MPCC_MCM_SHAPER_RAMA_EXP_REGION0_LUT_OFFSET, curve[0].offset,
-                       MPCC_MCM_SHAPER_RAMA_EXP_REGION0_NUM_SEGMENTS, curve[0].segments_num,
-                       MPCC_MCM_SHAPER_RAMA_EXP_REGION1_LUT_OFFSET, curve[1].offset,
-                       MPCC_MCM_SHAPER_RAMA_EXP_REGION1_NUM_SEGMENTS, curve[1].segments_num);
-
-       curve += 2;
-       REG_SET_4(MPCC_MCM_SHAPER_RAMB_REGION_32_33[mpcc_id], 0,
-                       MPCC_MCM_SHAPER_RAMA_EXP_REGION0_LUT_OFFSET, curve[0].offset,
-                       MPCC_MCM_SHAPER_RAMA_EXP_REGION0_NUM_SEGMENTS, curve[0].segments_num,
-                       MPCC_MCM_SHAPER_RAMA_EXP_REGION1_LUT_OFFSET, curve[1].offset,
-                       MPCC_MCM_SHAPER_RAMA_EXP_REGION1_NUM_SEGMENTS, curve[1].segments_num);
-}
-
-
-void mpc32_program_shaper_lut(
-               struct mpc *mpc,
-               const struct pwl_result_data *rgb,
-               uint32_t num,
-               uint32_t mpcc_id)
-{
-       uint32_t i, red, green, blue;
-       uint32_t  red_delta, green_delta, blue_delta;
-       uint32_t  red_value, green_value, blue_value;
-
-       struct dcn30_mpc *mpc30 = TO_DCN30_MPC(mpc);
-
-       for (i = 0 ; i < num; i++) {
-
-               red   = rgb[i].red_reg;
-               green = rgb[i].green_reg;
-               blue  = rgb[i].blue_reg;
-
-               red_delta   = rgb[i].delta_red_reg;
-               green_delta = rgb[i].delta_green_reg;
-               blue_delta  = rgb[i].delta_blue_reg;
-
-               red_value   = ((red_delta   & 0x3ff) << 14) | (red   & 0x3fff);
-               green_value = ((green_delta & 0x3ff) << 14) | (green & 0x3fff);
-               blue_value  = ((blue_delta  & 0x3ff) << 14) | (blue  & 0x3fff);
-
-               REG_SET(MPCC_MCM_SHAPER_LUT_DATA[mpcc_id], 0, MPCC_MCM_SHAPER_LUT_DATA, red_value);
-               REG_SET(MPCC_MCM_SHAPER_LUT_DATA[mpcc_id], 0, MPCC_MCM_SHAPER_LUT_DATA, green_value);
-               REG_SET(MPCC_MCM_SHAPER_LUT_DATA[mpcc_id], 0, MPCC_MCM_SHAPER_LUT_DATA, blue_value);
-       }
-
-}
-
-
-void mpc32_power_on_shaper_3dlut(
-               struct mpc *mpc,
-               uint32_t mpcc_id,
-               bool power_on)
-{
-       uint32_t power_status_shaper = 2;
-       uint32_t power_status_3dlut  = 2;
-       struct dcn30_mpc *mpc30 = TO_DCN30_MPC(mpc);
-       int max_retries = 10;
-
-       REG_SET(MPCC_MCM_MEM_PWR_CTRL[mpcc_id], 0,
-       MPCC_MCM_3DLUT_MEM_PWR_DIS, power_on == true ? 1:0);
-       /* wait for memory to fully power up */
-       if (power_on && mpc->ctx->dc->debug.enable_mem_low_power.bits.mpc) {
-               REG_WAIT(MPCC_MCM_MEM_PWR_CTRL[mpcc_id], MPCC_MCM_SHAPER_MEM_PWR_STATE, 0, 1, max_retries);
-               REG_WAIT(MPCC_MCM_MEM_PWR_CTRL[mpcc_id], MPCC_MCM_3DLUT_MEM_PWR_STATE, 0, 1, max_retries);
-       }
-
-       /*read status is not mandatory, it is just for debugging*/
-       REG_GET(MPCC_MCM_MEM_PWR_CTRL[mpcc_id], MPCC_MCM_SHAPER_MEM_PWR_STATE, &power_status_shaper);
-       REG_GET(MPCC_MCM_MEM_PWR_CTRL[mpcc_id], MPCC_MCM_3DLUT_MEM_PWR_STATE, &power_status_3dlut);
-
-       if (power_status_shaper != 0 && power_on == true)
-               BREAK_TO_DEBUGGER();
-
-       if (power_status_3dlut != 0 && power_on == true)
-               BREAK_TO_DEBUGGER();
-}
-
-
-bool mpc32_program_shaper(
-               struct mpc *mpc,
-               const struct pwl_params *params,
-               uint32_t mpcc_id)
-{
-       enum dc_lut_mode current_mode;
-       enum dc_lut_mode next_mode;
-
-       struct dcn30_mpc *mpc30 = TO_DCN30_MPC(mpc);
-
-       if (params == NULL) {
-               REG_SET(MPCC_MCM_SHAPER_CONTROL[mpcc_id], 0, MPCC_MCM_SHAPER_LUT_MODE, 0);
-               return false;
-       }
-
-       if (mpc->ctx->dc->debug.enable_mem_low_power.bits.mpc)
-               mpc32_power_on_shaper_3dlut(mpc, mpcc_id, true);
-
-       current_mode = mpc32_get_shaper_current(mpc, mpcc_id);
-
-       if (current_mode == LUT_BYPASS || current_mode == LUT_RAM_A)
-               next_mode = LUT_RAM_B;
-       else
-               next_mode = LUT_RAM_A;
-
-       mpc32_configure_shaper_lut(mpc, next_mode == LUT_RAM_A, mpcc_id);
-
-       if (next_mode == LUT_RAM_A)
-               mpc32_program_shaper_luta_settings(mpc, params, mpcc_id);
-       else
-               mpc32_program_shaper_lutb_settings(mpc, params, mpcc_id);
-
-       mpc32_program_shaper_lut(
-                       mpc, params->rgb_resulted, params->hw_points_num, mpcc_id);
-
-       REG_SET(MPCC_MCM_SHAPER_CONTROL[mpcc_id], 0, MPCC_MCM_SHAPER_LUT_MODE, next_mode == LUT_RAM_A ? 1:2);
-       mpc32_power_on_shaper_3dlut(mpc, mpcc_id, false);
-
-       return true;
-}
-
-
-static enum dc_lut_mode get3dlut_config(
-                       struct mpc *mpc,
-                       bool *is_17x17x17,
-                       bool *is_12bits_color_channel,
-                       int mpcc_id)
-{
-       uint32_t i_mode, i_enable_10bits, lut_size;
-       enum dc_lut_mode mode;
-       struct dcn30_mpc *mpc30 = TO_DCN30_MPC(mpc);
-
-       REG_GET(MPCC_MCM_3DLUT_MODE[mpcc_id],
-                       MPCC_MCM_3DLUT_MODE_CURRENT,  &i_mode);
-
-       REG_GET(MPCC_MCM_3DLUT_READ_WRITE_CONTROL[mpcc_id],
-                       MPCC_MCM_3DLUT_30BIT_EN, &i_enable_10bits);
-
-       switch (i_mode) {
-       case 0:
-               mode = LUT_BYPASS;
-               break;
-       case 1:
-               mode = LUT_RAM_A;
-               break;
-       case 2:
-               mode = LUT_RAM_B;
-               break;
-       default:
-               mode = LUT_BYPASS;
-               break;
-       }
-       if (i_enable_10bits > 0)
-               *is_12bits_color_channel = false;
-       else
-               *is_12bits_color_channel = true;
-
-       REG_GET(MPCC_MCM_3DLUT_MODE[mpcc_id], MPCC_MCM_3DLUT_SIZE, &lut_size);
-
-       if (lut_size == 0)
-               *is_17x17x17 = true;
-       else
-               *is_17x17x17 = false;
-
-       return mode;
-}
-
-
-void mpc32_select_3dlut_ram(
-               struct mpc *mpc,
-               enum dc_lut_mode mode,
-               bool is_color_channel_12bits,
-               uint32_t mpcc_id)
-{
-       struct dcn30_mpc *mpc30 = TO_DCN30_MPC(mpc);
-
-       REG_UPDATE_2(MPCC_MCM_3DLUT_READ_WRITE_CONTROL[mpcc_id],
-               MPCC_MCM_3DLUT_RAM_SEL, mode == LUT_RAM_A ? 0 : 1,
-               MPCC_MCM_3DLUT_30BIT_EN, is_color_channel_12bits == true ? 0:1);
-}
-
-
-void mpc32_select_3dlut_ram_mask(
-               struct mpc *mpc,
-               uint32_t ram_selection_mask,
-               uint32_t mpcc_id)
-{
-       struct dcn30_mpc *mpc30 = TO_DCN30_MPC(mpc);
-
-       REG_UPDATE(MPCC_MCM_3DLUT_READ_WRITE_CONTROL[mpcc_id], MPCC_MCM_3DLUT_WRITE_EN_MASK,
-                       ram_selection_mask);
-       REG_SET(MPCC_MCM_3DLUT_INDEX[mpcc_id], 0, MPCC_MCM_3DLUT_INDEX, 0);
-}
-
-
-void mpc32_set3dlut_ram12(
-               struct mpc *mpc,
-               const struct dc_rgb *lut,
-               uint32_t entries,
-               uint32_t mpcc_id)
-{
-       uint32_t i, red, green, blue, red1, green1, blue1;
-       struct dcn30_mpc *mpc30 = TO_DCN30_MPC(mpc);
-
-       for (i = 0 ; i < entries; i += 2) {
-               red   = lut[i].red<<4;
-               green = lut[i].green<<4;
-               blue  = lut[i].blue<<4;
-               red1   = lut[i+1].red<<4;
-               green1 = lut[i+1].green<<4;
-               blue1  = lut[i+1].blue<<4;
-
-               REG_SET_2(MPCC_MCM_3DLUT_DATA[mpcc_id], 0,
-                               MPCC_MCM_3DLUT_DATA0, red,
-                               MPCC_MCM_3DLUT_DATA1, red1);
-
-               REG_SET_2(MPCC_MCM_3DLUT_DATA[mpcc_id], 0,
-                               MPCC_MCM_3DLUT_DATA0, green,
-                               MPCC_MCM_3DLUT_DATA1, green1);
-
-               REG_SET_2(MPCC_MCM_3DLUT_DATA[mpcc_id], 0,
-                               MPCC_MCM_3DLUT_DATA0, blue,
-                               MPCC_MCM_3DLUT_DATA1, blue1);
-       }
-}
-
-
-void mpc32_set3dlut_ram10(
-               struct mpc *mpc,
-               const struct dc_rgb *lut,
-               uint32_t entries,
-               uint32_t mpcc_id)
-{
-       uint32_t i, red, green, blue, value;
-       struct dcn30_mpc *mpc30 = TO_DCN30_MPC(mpc);
-
-       for (i = 0; i < entries; i++) {
-               red   = lut[i].red;
-               green = lut[i].green;
-               blue  = lut[i].blue;
-               //should we shift red 22bit and green 12?
-               value = (red<<20) | (green<<10) | blue;
-
-               REG_SET(MPCC_MCM_3DLUT_DATA_30BIT[mpcc_id], 0, MPCC_MCM_3DLUT_DATA_30BIT, value);
-       }
-
-}
-
-
-static void mpc32_set_3dlut_mode(
-               struct mpc *mpc,
-               enum dc_lut_mode mode,
-               bool is_color_channel_12bits,
-               bool is_lut_size17x17x17,
-               uint32_t mpcc_id)
-{
-       uint32_t lut_mode;
-       struct dcn30_mpc *mpc30 = TO_DCN30_MPC(mpc);
-
-       // set default 3DLUT to pre-blend
-       // TODO: implement movable CM location
-       REG_UPDATE(MPCC_MOVABLE_CM_LOCATION_CONTROL[mpcc_id], MPCC_MOVABLE_CM_LOCATION_CNTL, 0);
-
-       if (mode == LUT_BYPASS)
-               lut_mode = 0;
-       else if (mode == LUT_RAM_A)
-               lut_mode = 1;
-       else
-               lut_mode = 2;
-
-       REG_UPDATE_2(MPCC_MCM_3DLUT_MODE[mpcc_id],
-                       MPCC_MCM_3DLUT_MODE, lut_mode,
-                       MPCC_MCM_3DLUT_SIZE, is_lut_size17x17x17 == true ? 0 : 1);
-}
-
-
-bool mpc32_program_3dlut(
-               struct mpc *mpc,
-               const struct tetrahedral_params *params,
-               int mpcc_id)
-{
-       enum dc_lut_mode mode;
-       bool is_17x17x17;
-       bool is_12bits_color_channel;
-       const struct dc_rgb *lut0;
-       const struct dc_rgb *lut1;
-       const struct dc_rgb *lut2;
-       const struct dc_rgb *lut3;
-       int lut_size0;
-       int lut_size;
-
-       if (params == NULL) {
-               mpc32_set_3dlut_mode(mpc, LUT_BYPASS, false, false, mpcc_id);
-               return false;
-       }
-       mpc32_power_on_shaper_3dlut(mpc, mpcc_id, true);
-
-       mode = get3dlut_config(mpc, &is_17x17x17, &is_12bits_color_channel, mpcc_id);
-
-       if (mode == LUT_BYPASS || mode == LUT_RAM_B)
-               mode = LUT_RAM_A;
-       else
-               mode = LUT_RAM_B;
-
-       is_17x17x17 = !params->use_tetrahedral_9;
-       is_12bits_color_channel = params->use_12bits;
-       if (is_17x17x17) {
-               lut0 = params->tetrahedral_17.lut0;
-               lut1 = params->tetrahedral_17.lut1;
-               lut2 = params->tetrahedral_17.lut2;
-               lut3 = params->tetrahedral_17.lut3;
-               lut_size0 = sizeof(params->tetrahedral_17.lut0)/
-                                       sizeof(params->tetrahedral_17.lut0[0]);
-               lut_size  = sizeof(params->tetrahedral_17.lut1)/
-                                       sizeof(params->tetrahedral_17.lut1[0]);
-       } else {
-               lut0 = params->tetrahedral_9.lut0;
-               lut1 = params->tetrahedral_9.lut1;
-               lut2 = params->tetrahedral_9.lut2;
-               lut3 = params->tetrahedral_9.lut3;
-               lut_size0 = sizeof(params->tetrahedral_9.lut0)/
-                               sizeof(params->tetrahedral_9.lut0[0]);
-               lut_size  = sizeof(params->tetrahedral_9.lut1)/
-                               sizeof(params->tetrahedral_9.lut1[0]);
-               }
-
-       mpc32_select_3dlut_ram(mpc, mode,
-                               is_12bits_color_channel, mpcc_id);
-       mpc32_select_3dlut_ram_mask(mpc, 0x1, mpcc_id);
-       if (is_12bits_color_channel)
-               mpc32_set3dlut_ram12(mpc, lut0, lut_size0, mpcc_id);
-       else
-               mpc32_set3dlut_ram10(mpc, lut0, lut_size0, mpcc_id);
-
-       mpc32_select_3dlut_ram_mask(mpc, 0x2, mpcc_id);
-       if (is_12bits_color_channel)
-               mpc32_set3dlut_ram12(mpc, lut1, lut_size, mpcc_id);
-       else
-               mpc32_set3dlut_ram10(mpc, lut1, lut_size, mpcc_id);
-
-       mpc32_select_3dlut_ram_mask(mpc, 0x4, mpcc_id);
-       if (is_12bits_color_channel)
-               mpc32_set3dlut_ram12(mpc, lut2, lut_size, mpcc_id);
-       else
-               mpc32_set3dlut_ram10(mpc, lut2, lut_size, mpcc_id);
-
-       mpc32_select_3dlut_ram_mask(mpc, 0x8, mpcc_id);
-       if (is_12bits_color_channel)
-               mpc32_set3dlut_ram12(mpc, lut3, lut_size, mpcc_id);
-       else
-               mpc32_set3dlut_ram10(mpc, lut3, lut_size, mpcc_id);
-
-       mpc32_set_3dlut_mode(mpc, mode, is_12bits_color_channel,
-                                       is_17x17x17, mpcc_id);
-
-       if (mpc->ctx->dc->debug.enable_mem_low_power.bits.mpc)
-               mpc32_power_on_shaper_3dlut(mpc, mpcc_id, false);
-
-       return true;
-}
-
-static const struct mpc_funcs dcn32_mpc_funcs = {
-       .read_mpcc_state = mpc1_read_mpcc_state,
-       .insert_plane = mpc1_insert_plane,
-       .remove_mpcc = mpc1_remove_mpcc,
-       .mpc_init = mpc32_mpc_init,
-       .mpc_init_single_inst = mpc3_mpc_init_single_inst,
-       .update_blending = mpc2_update_blending,
-       .cursor_lock = mpc1_cursor_lock,
-       .get_mpcc_for_dpp = mpc1_get_mpcc_for_dpp,
-       .wait_for_idle = mpc2_assert_idle_mpcc,
-       .assert_mpcc_idle_before_connect = mpc2_assert_mpcc_idle_before_connect,
-       .init_mpcc_list_from_hw = mpc1_init_mpcc_list_from_hw,
-       .set_denorm =  mpc3_set_denorm,
-       .set_denorm_clamp = mpc3_set_denorm_clamp,
-       .set_output_csc = mpc3_set_output_csc,
-       .set_ocsc_default = mpc3_set_ocsc_default,
-       .set_output_gamma = mpc3_set_output_gamma,
-       .insert_plane_to_secondary = NULL,
-       .remove_mpcc_from_secondary =  NULL,
-       .set_dwb_mux = mpc3_set_dwb_mux,
-       .disable_dwb_mux = mpc3_disable_dwb_mux,
-       .is_dwb_idle = mpc3_is_dwb_idle,
-       .set_gamut_remap = mpc3_set_gamut_remap,
-       .program_shaper = mpc32_program_shaper,
-       .program_3dlut = mpc32_program_3dlut,
-       .program_1dlut = mpc32_program_post1dlut,
-       .acquire_rmu = NULL,
-       .release_rmu = NULL,
-       .power_on_mpc_mem_pwr = mpc3_power_on_ogam_lut,
-       .get_mpc_out_mux = mpc1_get_mpc_out_mux,
-       .set_bg_color = mpc1_set_bg_color,
-       .set_movable_cm_location = mpc401_set_movable_cm_location,
-       .populate_lut = mpc401_populate_lut,
-};
-
-
-void dcn32_mpc_construct(struct dcn30_mpc *mpc30,
-       struct dc_context *ctx,
-       const struct dcn30_mpc_registers *mpc_regs,
-       const struct dcn30_mpc_shift *mpc_shift,
-       const struct dcn30_mpc_mask *mpc_mask,
-       int num_mpcc,
-       int num_rmu)
-{
-       int i;
-
-       mpc30->base.ctx = ctx;
-
-       mpc30->base.funcs = &dcn32_mpc_funcs;
-
-       mpc30->mpc_regs = mpc_regs;
-       mpc30->mpc_shift = mpc_shift;
-       mpc30->mpc_mask = mpc_mask;
-
-       mpc30->mpcc_in_use_mask = 0;
-       mpc30->num_mpcc = num_mpcc;
-       mpc30->num_rmu = num_rmu;
-
-       for (i = 0; i < MAX_MPCC; i++)
-               mpc3_init_mpcc(&mpc30->base.mpcc_array[i], i);
-}
diff --git a/drivers/gpu/drm/amd/display/dc/dcn32/dcn32_mpc.h b/drivers/gpu/drm/amd/display/dc/dcn32/dcn32_mpc.h
deleted file mode 100644 (file)
index 9622518..0000000
+++ /dev/null
@@ -1,394 +0,0 @@
-/* Copyright 2021 Advanced Micro Devices, Inc.
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the "Software"),
- * to deal in the Software without restriction, including without limitation
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
- * and/or sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
- * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
- * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
- * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
- * OTHER DEALINGS IN THE SOFTWARE.
- *
- * Authors: AMD
- *
- */
-
-#ifndef __DC_MPCC_DCN32_H__
-#define __DC_MPCC_DCN32_H__
-
-#include "dcn20/dcn20_mpc.h"
-#include "dcn30/dcn30_mpc.h"
-
-#define TO_DCN32_MPC(mpc_base) \
-       container_of(mpc_base, struct dcn32_mpc, base)
-
-#define MPC_REG_LIST_DCN3_2(inst) \
-       MPC_REG_LIST_DCN3_0(inst),\
-       SRII(MPCC_MOVABLE_CM_LOCATION_CONTROL, MPCC, inst),\
-       SRII(MPCC_MCM_SHAPER_CONTROL, MPCC_MCM, inst),\
-       SRII(MPCC_MCM_SHAPER_OFFSET_R, MPCC_MCM, inst),\
-       SRII(MPCC_MCM_SHAPER_OFFSET_G, MPCC_MCM, inst),\
-       SRII(MPCC_MCM_SHAPER_OFFSET_B, MPCC_MCM, inst),\
-       SRII(MPCC_MCM_SHAPER_SCALE_R, MPCC_MCM, inst),\
-       SRII(MPCC_MCM_SHAPER_SCALE_G_B, MPCC_MCM, inst),\
-       SRII(MPCC_MCM_SHAPER_LUT_INDEX, MPCC_MCM, inst),\
-       SRII(MPCC_MCM_SHAPER_LUT_DATA, MPCC_MCM, inst),\
-       SRII(MPCC_MCM_SHAPER_LUT_WRITE_EN_MASK, MPCC_MCM, inst),\
-       SRII(MPCC_MCM_SHAPER_RAMA_START_CNTL_B, MPCC_MCM, inst),\
-       SRII(MPCC_MCM_SHAPER_RAMA_START_CNTL_G, MPCC_MCM, inst),\
-       SRII(MPCC_MCM_SHAPER_RAMA_START_CNTL_R, MPCC_MCM, inst),\
-       SRII(MPCC_MCM_SHAPER_RAMA_END_CNTL_B, MPCC_MCM, inst),\
-       SRII(MPCC_MCM_SHAPER_RAMA_END_CNTL_G, MPCC_MCM, inst),\
-       SRII(MPCC_MCM_SHAPER_RAMA_END_CNTL_R, MPCC_MCM, inst),\
-       SRII(MPCC_MCM_SHAPER_RAMA_REGION_0_1, MPCC_MCM, inst),\
-       SRII(MPCC_MCM_SHAPER_RAMA_REGION_2_3, MPCC_MCM, inst),\
-       SRII(MPCC_MCM_SHAPER_RAMA_REGION_4_5, MPCC_MCM, inst),\
-       SRII(MPCC_MCM_SHAPER_RAMA_REGION_6_7, MPCC_MCM, inst),\
-       SRII(MPCC_MCM_SHAPER_RAMA_REGION_8_9, MPCC_MCM, inst),\
-       SRII(MPCC_MCM_SHAPER_RAMA_REGION_10_11, MPCC_MCM, inst),\
-       SRII(MPCC_MCM_SHAPER_RAMA_REGION_12_13, MPCC_MCM, inst),\
-       SRII(MPCC_MCM_SHAPER_RAMA_REGION_14_15, MPCC_MCM, inst),\
-       SRII(MPCC_MCM_SHAPER_RAMA_REGION_16_17, MPCC_MCM, inst),\
-       SRII(MPCC_MCM_SHAPER_RAMA_REGION_18_19, MPCC_MCM, inst),\
-       SRII(MPCC_MCM_SHAPER_RAMA_REGION_20_21, MPCC_MCM, inst),\
-       SRII(MPCC_MCM_SHAPER_RAMA_REGION_22_23, MPCC_MCM, inst),\
-       SRII(MPCC_MCM_SHAPER_RAMA_REGION_24_25, MPCC_MCM, inst),\
-       SRII(MPCC_MCM_SHAPER_RAMA_REGION_26_27, MPCC_MCM, inst),\
-       SRII(MPCC_MCM_SHAPER_RAMA_REGION_28_29, MPCC_MCM, inst),\
-       SRII(MPCC_MCM_SHAPER_RAMA_REGION_30_31, MPCC_MCM, inst),\
-       SRII(MPCC_MCM_SHAPER_RAMA_REGION_32_33, MPCC_MCM, inst),\
-       SRII(MPCC_MCM_SHAPER_RAMB_START_CNTL_B, MPCC_MCM, inst),\
-       SRII(MPCC_MCM_SHAPER_RAMB_START_CNTL_G, MPCC_MCM, inst),\
-       SRII(MPCC_MCM_SHAPER_RAMB_START_CNTL_R, MPCC_MCM, inst),\
-       SRII(MPCC_MCM_SHAPER_RAMB_END_CNTL_B, MPCC_MCM, inst),\
-       SRII(MPCC_MCM_SHAPER_RAMB_END_CNTL_G, MPCC_MCM, inst),\
-       SRII(MPCC_MCM_SHAPER_RAMB_END_CNTL_R, MPCC_MCM, inst),\
-       SRII(MPCC_MCM_SHAPER_RAMB_REGION_0_1, MPCC_MCM, inst),\
-       SRII(MPCC_MCM_SHAPER_RAMB_REGION_2_3, MPCC_MCM, inst),\
-       SRII(MPCC_MCM_SHAPER_RAMB_REGION_4_5, MPCC_MCM, inst),\
-       SRII(MPCC_MCM_SHAPER_RAMB_REGION_6_7, MPCC_MCM, inst),\
-       SRII(MPCC_MCM_SHAPER_RAMB_REGION_8_9, MPCC_MCM, inst),\
-       SRII(MPCC_MCM_SHAPER_RAMB_REGION_10_11, MPCC_MCM, inst),\
-       SRII(MPCC_MCM_SHAPER_RAMB_REGION_12_13, MPCC_MCM, inst),\
-       SRII(MPCC_MCM_SHAPER_RAMB_REGION_14_15, MPCC_MCM, inst),\
-       SRII(MPCC_MCM_SHAPER_RAMB_REGION_16_17, MPCC_MCM, inst),\
-       SRII(MPCC_MCM_SHAPER_RAMB_REGION_18_19, MPCC_MCM, inst),\
-       SRII(MPCC_MCM_SHAPER_RAMB_REGION_20_21, MPCC_MCM, inst),\
-       SRII(MPCC_MCM_SHAPER_RAMB_REGION_22_23, MPCC_MCM, inst),\
-       SRII(MPCC_MCM_SHAPER_RAMB_REGION_24_25, MPCC_MCM, inst),\
-       SRII(MPCC_MCM_SHAPER_RAMB_REGION_26_27, MPCC_MCM, inst),\
-       SRII(MPCC_MCM_SHAPER_RAMB_REGION_28_29, MPCC_MCM, inst),\
-       SRII(MPCC_MCM_SHAPER_RAMB_REGION_30_31, MPCC_MCM, inst),\
-       SRII(MPCC_MCM_SHAPER_RAMB_REGION_32_33, MPCC_MCM, inst),\
-       SRII(MPCC_MCM_3DLUT_MODE, MPCC_MCM, inst), /*TODO: may need to add other 3DLUT regs*/\
-       SRII(MPCC_MCM_3DLUT_INDEX, MPCC_MCM, inst),\
-       SRII(MPCC_MCM_3DLUT_DATA, MPCC_MCM, inst),\
-       SRII(MPCC_MCM_3DLUT_DATA_30BIT, MPCC_MCM, inst),\
-       SRII(MPCC_MCM_3DLUT_READ_WRITE_CONTROL, MPCC_MCM, inst),\
-       SRII(MPCC_MCM_3DLUT_OUT_NORM_FACTOR, MPCC_MCM, inst),\
-       SRII(MPCC_MCM_3DLUT_OUT_OFFSET_R, MPCC_MCM, inst),\
-       SRII(MPCC_MCM_3DLUT_OUT_OFFSET_G, MPCC_MCM, inst),\
-       SRII(MPCC_MCM_3DLUT_OUT_OFFSET_B, MPCC_MCM, inst),\
-       SRII(MPCC_MCM_1DLUT_CONTROL, MPCC_MCM, inst),\
-       SRII(MPCC_MCM_1DLUT_LUT_INDEX, MPCC_MCM, inst),\
-       SRII(MPCC_MCM_1DLUT_LUT_DATA, MPCC_MCM, inst),\
-       SRII(MPCC_MCM_1DLUT_LUT_CONTROL, MPCC_MCM, inst),\
-       SRII(MPCC_MCM_1DLUT_RAMA_START_CNTL_B, MPCC_MCM, inst),\
-       SRII(MPCC_MCM_1DLUT_RAMA_START_CNTL_G, MPCC_MCM, inst),\
-       SRII(MPCC_MCM_1DLUT_RAMA_START_CNTL_R, MPCC_MCM, inst),\
-       SRII(MPCC_MCM_1DLUT_RAMA_START_SLOPE_CNTL_B, MPCC_MCM, inst),\
-       SRII(MPCC_MCM_1DLUT_RAMA_START_SLOPE_CNTL_G, MPCC_MCM, inst),\
-       SRII(MPCC_MCM_1DLUT_RAMA_START_SLOPE_CNTL_R, MPCC_MCM, inst),\
-       SRII(MPCC_MCM_1DLUT_RAMA_START_BASE_CNTL_B, MPCC_MCM, inst),\
-       SRII(MPCC_MCM_1DLUT_RAMA_START_BASE_CNTL_G, MPCC_MCM, inst),\
-       SRII(MPCC_MCM_1DLUT_RAMA_START_BASE_CNTL_R, MPCC_MCM, inst),\
-       SRII(MPCC_MCM_1DLUT_RAMA_END_CNTL1_B, MPCC_MCM, inst),\
-       SRII(MPCC_MCM_1DLUT_RAMA_END_CNTL2_B, MPCC_MCM, inst),\
-       SRII(MPCC_MCM_1DLUT_RAMA_END_CNTL1_G, MPCC_MCM, inst),\
-       SRII(MPCC_MCM_1DLUT_RAMA_END_CNTL2_G, MPCC_MCM, inst),\
-       SRII(MPCC_MCM_1DLUT_RAMA_END_CNTL1_R, MPCC_MCM, inst),\
-       SRII(MPCC_MCM_1DLUT_RAMA_END_CNTL2_R, MPCC_MCM, inst),\
-       SRII(MPCC_MCM_1DLUT_RAMA_OFFSET_B, MPCC_MCM, inst),\
-       SRII(MPCC_MCM_1DLUT_RAMA_OFFSET_G, MPCC_MCM, inst),\
-       SRII(MPCC_MCM_1DLUT_RAMA_OFFSET_R, MPCC_MCM, inst),\
-       SRII(MPCC_MCM_1DLUT_RAMA_REGION_0_1, MPCC_MCM, inst),\
-       SRII(MPCC_MCM_1DLUT_RAMA_REGION_2_3, MPCC_MCM, inst),\
-       SRII(MPCC_MCM_1DLUT_RAMA_REGION_4_5, MPCC_MCM, inst),\
-       SRII(MPCC_MCM_1DLUT_RAMA_REGION_6_7, MPCC_MCM, inst),\
-       SRII(MPCC_MCM_1DLUT_RAMA_REGION_8_9, MPCC_MCM, inst),\
-       SRII(MPCC_MCM_1DLUT_RAMA_REGION_10_11, MPCC_MCM, inst),\
-       SRII(MPCC_MCM_1DLUT_RAMA_REGION_12_13, MPCC_MCM, inst),\
-       SRII(MPCC_MCM_1DLUT_RAMA_REGION_14_15, MPCC_MCM, inst),\
-       SRII(MPCC_MCM_1DLUT_RAMA_REGION_16_17, MPCC_MCM, inst),\
-       SRII(MPCC_MCM_1DLUT_RAMA_REGION_18_19, MPCC_MCM, inst),\
-       SRII(MPCC_MCM_1DLUT_RAMA_REGION_20_21, MPCC_MCM, inst),\
-       SRII(MPCC_MCM_1DLUT_RAMA_REGION_22_23, MPCC_MCM, inst),\
-       SRII(MPCC_MCM_1DLUT_RAMA_REGION_24_25, MPCC_MCM, inst),\
-       SRII(MPCC_MCM_1DLUT_RAMA_REGION_26_27, MPCC_MCM, inst),\
-       SRII(MPCC_MCM_1DLUT_RAMA_REGION_28_29, MPCC_MCM, inst),\
-       SRII(MPCC_MCM_1DLUT_RAMA_REGION_30_31, MPCC_MCM, inst),\
-       SRII(MPCC_MCM_1DLUT_RAMA_REGION_32_33, MPCC_MCM, inst),\
-       SRII(MPCC_MCM_1DLUT_RAMB_START_CNTL_B, MPCC_MCM, inst),\
-       SRII(MPCC_MCM_1DLUT_RAMB_START_CNTL_G, MPCC_MCM, inst),\
-       SRII(MPCC_MCM_1DLUT_RAMB_START_CNTL_R, MPCC_MCM, inst),\
-       SRII(MPCC_MCM_1DLUT_RAMB_START_SLOPE_CNTL_B, MPCC_MCM, inst),\
-       SRII(MPCC_MCM_1DLUT_RAMB_START_SLOPE_CNTL_G, MPCC_MCM, inst),\
-       SRII(MPCC_MCM_1DLUT_RAMB_START_SLOPE_CNTL_R, MPCC_MCM, inst),\
-       SRII(MPCC_MCM_1DLUT_RAMB_START_BASE_CNTL_B, MPCC_MCM, inst),\
-       SRII(MPCC_MCM_1DLUT_RAMB_START_BASE_CNTL_G, MPCC_MCM, inst),\
-       SRII(MPCC_MCM_1DLUT_RAMB_START_BASE_CNTL_R, MPCC_MCM, inst),\
-       SRII(MPCC_MCM_1DLUT_RAMB_END_CNTL1_B, MPCC_MCM, inst),\
-       SRII(MPCC_MCM_1DLUT_RAMB_END_CNTL2_B, MPCC_MCM, inst),\
-       SRII(MPCC_MCM_1DLUT_RAMB_END_CNTL1_G, MPCC_MCM, inst),\
-       SRII(MPCC_MCM_1DLUT_RAMB_END_CNTL2_G, MPCC_MCM, inst),\
-       SRII(MPCC_MCM_1DLUT_RAMB_END_CNTL1_R, MPCC_MCM, inst),\
-       SRII(MPCC_MCM_1DLUT_RAMB_END_CNTL2_R, MPCC_MCM, inst),\
-       SRII(MPCC_MCM_1DLUT_RAMB_OFFSET_B, MPCC_MCM, inst),\
-       SRII(MPCC_MCM_1DLUT_RAMB_OFFSET_G, MPCC_MCM, inst),\
-       SRII(MPCC_MCM_1DLUT_RAMB_OFFSET_R, MPCC_MCM, inst),\
-       SRII(MPCC_MCM_1DLUT_RAMB_REGION_0_1, MPCC_MCM, inst),\
-       SRII(MPCC_MCM_1DLUT_RAMB_REGION_2_3, MPCC_MCM, inst),\
-       SRII(MPCC_MCM_1DLUT_RAMB_REGION_4_5, MPCC_MCM, inst),\
-       SRII(MPCC_MCM_1DLUT_RAMB_REGION_6_7, MPCC_MCM, inst),\
-       SRII(MPCC_MCM_1DLUT_RAMB_REGION_8_9, MPCC_MCM, inst),\
-       SRII(MPCC_MCM_1DLUT_RAMB_REGION_10_11, MPCC_MCM, inst),\
-       SRII(MPCC_MCM_1DLUT_RAMB_REGION_12_13, MPCC_MCM, inst),\
-       SRII(MPCC_MCM_1DLUT_RAMB_REGION_14_15, MPCC_MCM, inst),\
-       SRII(MPCC_MCM_1DLUT_RAMB_REGION_16_17, MPCC_MCM, inst),\
-       SRII(MPCC_MCM_1DLUT_RAMB_REGION_18_19, MPCC_MCM, inst),\
-       SRII(MPCC_MCM_1DLUT_RAMB_REGION_20_21, MPCC_MCM, inst),\
-       SRII(MPCC_MCM_1DLUT_RAMB_REGION_22_23, MPCC_MCM, inst),\
-       SRII(MPCC_MCM_1DLUT_RAMB_REGION_24_25, MPCC_MCM, inst),\
-       SRII(MPCC_MCM_1DLUT_RAMB_REGION_26_27, MPCC_MCM, inst),\
-       SRII(MPCC_MCM_1DLUT_RAMB_REGION_28_29, MPCC_MCM, inst),\
-       SRII(MPCC_MCM_1DLUT_RAMB_REGION_30_31, MPCC_MCM, inst),\
-       SRII(MPCC_MCM_1DLUT_RAMB_REGION_32_33, MPCC_MCM, inst),\
-       SRII(MPCC_MCM_MEM_PWR_CTRL, MPCC_MCM, inst)
-
-
-#define MPC_COMMON_MASK_SH_LIST_DCN32(mask_sh) \
-       MPC_COMMON_MASK_SH_LIST_DCN1_0(mask_sh),\
-       SF(MPCC0_MPCC_CONTROL, MPCC_BG_BPC, mask_sh),\
-       SF(MPCC0_MPCC_CONTROL, MPCC_BOT_GAIN_MODE, mask_sh),\
-       SF(MPCC0_MPCC_TOP_GAIN, MPCC_TOP_GAIN, mask_sh),\
-       SF(MPCC0_MPCC_BOT_GAIN_INSIDE, MPCC_BOT_GAIN_INSIDE, mask_sh),\
-       SF(MPCC0_MPCC_BOT_GAIN_OUTSIDE, MPCC_BOT_GAIN_OUTSIDE, mask_sh),\
-       SF(MPCC0_MPCC_MOVABLE_CM_LOCATION_CONTROL, MPCC_MOVABLE_CM_LOCATION_CNTL, mask_sh),\
-       SF(MPCC0_MPCC_MOVABLE_CM_LOCATION_CONTROL, MPCC_MOVABLE_CM_LOCATION_CNTL_CURRENT, mask_sh),\
-       SF(MPC_OUT0_CSC_MODE, MPC_OCSC_MODE, mask_sh),\
-       SF(MPC_OUT0_CSC_C11_C12_A, MPC_OCSC_C11_A, mask_sh),\
-       SF(MPC_OUT0_CSC_C11_C12_A, MPC_OCSC_C12_A, mask_sh),\
-       SF(MPCC0_MPCC_STATUS, MPCC_DISABLED, mask_sh),\
-       SF(MPCC0_MPCC_MEM_PWR_CTRL, MPCC_OGAM_MEM_PWR_FORCE, mask_sh),\
-       SF(MPCC0_MPCC_MEM_PWR_CTRL, MPCC_OGAM_MEM_PWR_DIS, mask_sh),\
-       SF(MPCC0_MPCC_MEM_PWR_CTRL, MPCC_OGAM_MEM_LOW_PWR_MODE, mask_sh),\
-       SF(MPCC0_MPCC_MEM_PWR_CTRL, MPCC_OGAM_MEM_PWR_STATE, mask_sh),\
-       SF(MPC_OUT0_DENORM_CONTROL, MPC_OUT_DENORM_MODE, mask_sh),\
-       SF(MPC_OUT0_DENORM_CONTROL, MPC_OUT_DENORM_CLAMP_MAX_R_CR, mask_sh),\
-       SF(MPC_OUT0_DENORM_CONTROL, MPC_OUT_DENORM_CLAMP_MIN_R_CR, mask_sh),\
-       SF(MPC_OUT0_DENORM_CLAMP_G_Y, MPC_OUT_DENORM_CLAMP_MAX_G_Y, mask_sh),\
-       SF(MPC_OUT0_DENORM_CLAMP_G_Y, MPC_OUT_DENORM_CLAMP_MIN_G_Y, mask_sh),\
-       SF(MPC_OUT0_DENORM_CLAMP_B_CB, MPC_OUT_DENORM_CLAMP_MAX_B_CB, mask_sh),\
-       SF(MPC_OUT0_DENORM_CLAMP_B_CB, MPC_OUT_DENORM_CLAMP_MIN_B_CB, mask_sh),\
-       SF(MPCC_OGAM0_MPCC_GAMUT_REMAP_MODE, MPCC_GAMUT_REMAP_MODE, mask_sh),\
-       SF(MPCC_OGAM0_MPCC_GAMUT_REMAP_MODE, MPCC_GAMUT_REMAP_MODE_CURRENT, mask_sh),\
-       SF(MPCC_OGAM0_MPCC_GAMUT_REMAP_COEF_FORMAT, MPCC_GAMUT_REMAP_COEF_FORMAT, mask_sh),\
-       SF(MPCC_OGAM0_MPC_GAMUT_REMAP_C11_C12_A, MPCC_GAMUT_REMAP_C11_A, mask_sh),\
-       SF(MPCC_OGAM0_MPC_GAMUT_REMAP_C11_C12_A, MPCC_GAMUT_REMAP_C12_A, mask_sh),\
-       SF(MPC_DWB0_MUX, MPC_DWB0_MUX, mask_sh),\
-       SF(MPC_DWB0_MUX, MPC_DWB0_MUX_STATUS, mask_sh),\
-       SF(MPC_OUT0_MUX, MPC_OUT_RATE_CONTROL, mask_sh),\
-       SF(MPC_OUT0_MUX, MPC_OUT_RATE_CONTROL_DISABLE, mask_sh),\
-       SF(MPC_OUT0_MUX, MPC_OUT_FLOW_CONTROL_MODE, mask_sh),\
-       SF(MPC_OUT0_MUX, MPC_OUT_FLOW_CONTROL_COUNT, mask_sh), \
-       SF(MPCC_OGAM0_MPCC_OGAM_RAMA_REGION_0_1, MPCC_OGAM_RAMA_EXP_REGION0_LUT_OFFSET, mask_sh),\
-       SF(MPCC_OGAM0_MPCC_OGAM_RAMA_REGION_0_1, MPCC_OGAM_RAMA_EXP_REGION0_NUM_SEGMENTS, mask_sh),\
-       SF(MPCC_OGAM0_MPCC_OGAM_RAMA_REGION_0_1, MPCC_OGAM_RAMA_EXP_REGION1_LUT_OFFSET, mask_sh),\
-       SF(MPCC_OGAM0_MPCC_OGAM_RAMA_REGION_0_1, MPCC_OGAM_RAMA_EXP_REGION1_NUM_SEGMENTS, mask_sh),\
-       SF(MPCC_OGAM0_MPCC_OGAM_RAMA_END_CNTL2_B, MPCC_OGAM_RAMA_EXP_REGION_END_SLOPE_B, mask_sh),\
-       SF(MPCC_OGAM0_MPCC_OGAM_RAMA_END_CNTL2_B, MPCC_OGAM_RAMA_EXP_REGION_END_B, mask_sh),\
-       SF(MPCC_OGAM0_MPCC_OGAM_RAMA_END_CNTL1_B, MPCC_OGAM_RAMA_EXP_REGION_END_BASE_B, mask_sh),\
-       SF(MPCC_OGAM0_MPCC_OGAM_RAMA_START_SLOPE_CNTL_B, MPCC_OGAM_RAMA_EXP_REGION_START_SLOPE_B, mask_sh),\
-       SF(MPCC_OGAM0_MPCC_OGAM_RAMA_START_BASE_CNTL_B, MPCC_OGAM_RAMA_EXP_REGION_START_BASE_B, mask_sh),\
-       SF(MPCC_OGAM0_MPCC_OGAM_RAMA_START_CNTL_B, MPCC_OGAM_RAMA_EXP_REGION_START_B, mask_sh),\
-       SF(MPCC_OGAM0_MPCC_OGAM_RAMA_START_CNTL_B, MPCC_OGAM_RAMA_EXP_REGION_START_SEGMENT_B, mask_sh),\
-       SF(MPCC_OGAM0_MPCC_OGAM_RAMA_OFFSET_B, MPCC_OGAM_RAMA_OFFSET_B, mask_sh),\
-       SF(MPCC_OGAM0_MPCC_OGAM_RAMA_OFFSET_G, MPCC_OGAM_RAMA_OFFSET_G, mask_sh),\
-       SF(MPCC_OGAM0_MPCC_OGAM_RAMA_OFFSET_R, MPCC_OGAM_RAMA_OFFSET_R, mask_sh),\
-       SF(MPCC_OGAM0_MPCC_OGAM_LUT_INDEX, MPCC_OGAM_LUT_INDEX, mask_sh),\
-       SF(MPCC_OGAM0_MPCC_OGAM_CONTROL, MPCC_OGAM_MODE, mask_sh),\
-       SF(MPCC_OGAM0_MPCC_OGAM_CONTROL, MPCC_OGAM_SELECT, mask_sh),\
-       SF(MPCC_OGAM0_MPCC_OGAM_CONTROL, MPCC_OGAM_PWL_DISABLE, mask_sh),\
-       SF(MPCC_OGAM0_MPCC_OGAM_CONTROL, MPCC_OGAM_MODE_CURRENT, mask_sh),\
-       SF(MPCC_OGAM0_MPCC_OGAM_CONTROL, MPCC_OGAM_SELECT_CURRENT, mask_sh),\
-       SF(MPCC_OGAM0_MPCC_OGAM_LUT_CONTROL, MPCC_OGAM_LUT_WRITE_COLOR_MASK, mask_sh),\
-       SF(MPCC_OGAM0_MPCC_OGAM_LUT_CONTROL, MPCC_OGAM_LUT_READ_COLOR_SEL, mask_sh),\
-       SF(MPCC_OGAM0_MPCC_OGAM_LUT_CONTROL, MPCC_OGAM_LUT_HOST_SEL, mask_sh),\
-       SF(MPCC_OGAM0_MPCC_OGAM_LUT_CONTROL, MPCC_OGAM_LUT_CONFIG_MODE, mask_sh),\
-       SF(MPCC_OGAM0_MPCC_OGAM_LUT_DATA, MPCC_OGAM_LUT_DATA, mask_sh),\
-       SF(MPCC_MCM0_MPCC_MCM_3DLUT_MODE, MPCC_MCM_3DLUT_MODE, mask_sh),\
-       SF(MPCC_MCM0_MPCC_MCM_3DLUT_MODE, MPCC_MCM_3DLUT_SIZE, mask_sh),\
-       SF(MPCC_MCM0_MPCC_MCM_3DLUT_MODE, MPCC_MCM_3DLUT_MODE_CURRENT, mask_sh),\
-       SF(MPCC_MCM0_MPCC_MCM_3DLUT_READ_WRITE_CONTROL, MPCC_MCM_3DLUT_WRITE_EN_MASK, mask_sh),\
-       SF(MPCC_MCM0_MPCC_MCM_3DLUT_READ_WRITE_CONTROL, MPCC_MCM_3DLUT_RAM_SEL, mask_sh),\
-       SF(MPCC_MCM0_MPCC_MCM_3DLUT_READ_WRITE_CONTROL, MPCC_MCM_3DLUT_30BIT_EN, mask_sh),\
-       SF(MPCC_MCM0_MPCC_MCM_3DLUT_READ_WRITE_CONTROL, MPCC_MCM_3DLUT_READ_SEL, mask_sh),\
-       SF(MPCC_MCM0_MPCC_MCM_3DLUT_INDEX, MPCC_MCM_3DLUT_INDEX, mask_sh),\
-       SF(MPCC_MCM0_MPCC_MCM_3DLUT_DATA, MPCC_MCM_3DLUT_DATA0, mask_sh),\
-       SF(MPCC_MCM0_MPCC_MCM_3DLUT_DATA, MPCC_MCM_3DLUT_DATA1, mask_sh),\
-       SF(MPCC_MCM0_MPCC_MCM_3DLUT_DATA_30BIT, MPCC_MCM_3DLUT_DATA_30BIT, mask_sh),\
-       SF(MPCC_MCM0_MPCC_MCM_SHAPER_CONTROL, MPCC_MCM_SHAPER_LUT_MODE, mask_sh),\
-       SF(MPCC_MCM0_MPCC_MCM_SHAPER_CONTROL, MPCC_MCM_SHAPER_MODE_CURRENT, mask_sh),\
-       SF(MPCC_MCM0_MPCC_MCM_SHAPER_OFFSET_R, MPCC_MCM_SHAPER_OFFSET_R, mask_sh),\
-       SF(MPCC_MCM0_MPCC_MCM_SHAPER_OFFSET_G, MPCC_MCM_SHAPER_OFFSET_G, mask_sh),\
-       SF(MPCC_MCM0_MPCC_MCM_SHAPER_OFFSET_B, MPCC_MCM_SHAPER_OFFSET_B, mask_sh),\
-       SF(MPCC_MCM0_MPCC_MCM_SHAPER_SCALE_R, MPCC_MCM_SHAPER_SCALE_R, mask_sh),\
-       SF(MPCC_MCM0_MPCC_MCM_SHAPER_SCALE_G_B, MPCC_MCM_SHAPER_SCALE_G, mask_sh),\
-       SF(MPCC_MCM0_MPCC_MCM_SHAPER_SCALE_G_B, MPCC_MCM_SHAPER_SCALE_B, mask_sh),\
-       SF(MPCC_MCM0_MPCC_MCM_SHAPER_LUT_INDEX, MPCC_MCM_SHAPER_LUT_INDEX, mask_sh),\
-       SF(MPCC_MCM0_MPCC_MCM_SHAPER_LUT_DATA, MPCC_MCM_SHAPER_LUT_DATA, mask_sh),\
-       SF(MPCC_MCM0_MPCC_MCM_SHAPER_LUT_WRITE_EN_MASK, MPCC_MCM_SHAPER_LUT_WRITE_EN_MASK, mask_sh),\
-       SF(MPCC_MCM0_MPCC_MCM_SHAPER_LUT_WRITE_EN_MASK, MPCC_MCM_SHAPER_LUT_WRITE_SEL, mask_sh),\
-       SF(MPCC_MCM0_MPCC_MCM_SHAPER_RAMA_START_CNTL_B, MPCC_MCM_SHAPER_RAMA_EXP_REGION_START_B, mask_sh),\
-       SF(MPCC_MCM0_MPCC_MCM_SHAPER_RAMA_START_CNTL_B, MPCC_MCM_SHAPER_RAMA_EXP_REGION_START_SEGMENT_B, mask_sh),\
-       SF(MPCC_MCM0_MPCC_MCM_SHAPER_RAMA_END_CNTL_B, MPCC_MCM_SHAPER_RAMA_EXP_REGION_END_B, mask_sh),\
-       SF(MPCC_MCM0_MPCC_MCM_SHAPER_RAMA_END_CNTL_B, MPCC_MCM_SHAPER_RAMA_EXP_REGION_END_BASE_B, mask_sh),\
-       SF(MPCC_MCM0_MPCC_MCM_SHAPER_RAMA_REGION_0_1, MPCC_MCM_SHAPER_RAMA_EXP_REGION0_LUT_OFFSET, mask_sh),\
-       SF(MPCC_MCM0_MPCC_MCM_SHAPER_RAMA_REGION_0_1, MPCC_MCM_SHAPER_RAMA_EXP_REGION0_NUM_SEGMENTS, mask_sh),\
-       SF(MPCC_MCM0_MPCC_MCM_SHAPER_RAMA_REGION_0_1, MPCC_MCM_SHAPER_RAMA_EXP_REGION1_LUT_OFFSET, mask_sh),\
-       SF(MPCC_MCM0_MPCC_MCM_SHAPER_RAMA_REGION_0_1, MPCC_MCM_SHAPER_RAMA_EXP_REGION1_NUM_SEGMENTS, mask_sh),\
-       SF(MPCC_MCM0_MPCC_MCM_1DLUT_CONTROL, MPCC_MCM_1DLUT_MODE, mask_sh),\
-       SF(MPCC_MCM0_MPCC_MCM_1DLUT_CONTROL, MPCC_MCM_1DLUT_SELECT, mask_sh),\
-       SF(MPCC_MCM0_MPCC_MCM_1DLUT_CONTROL, MPCC_MCM_1DLUT_PWL_DISABLE, mask_sh),\
-       SF(MPCC_MCM0_MPCC_MCM_1DLUT_CONTROL, MPCC_MCM_1DLUT_MODE_CURRENT, mask_sh),\
-       SF(MPCC_MCM0_MPCC_MCM_1DLUT_CONTROL, MPCC_MCM_1DLUT_SELECT_CURRENT, mask_sh),\
-       SF(MPCC_MCM0_MPCC_MCM_1DLUT_LUT_INDEX, MPCC_MCM_1DLUT_LUT_INDEX, mask_sh),\
-       SF(MPCC_MCM0_MPCC_MCM_1DLUT_LUT_DATA, MPCC_MCM_1DLUT_LUT_DATA, mask_sh),\
-       SF(MPCC_MCM0_MPCC_MCM_1DLUT_LUT_CONTROL, MPCC_MCM_1DLUT_LUT_WRITE_COLOR_MASK, mask_sh),\
-       SF(MPCC_MCM0_MPCC_MCM_1DLUT_LUT_CONTROL, MPCC_MCM_1DLUT_LUT_READ_COLOR_SEL, mask_sh),\
-       SF(MPCC_MCM0_MPCC_MCM_1DLUT_LUT_CONTROL, MPCC_MCM_1DLUT_LUT_HOST_SEL, mask_sh),\
-       SF(MPCC_MCM0_MPCC_MCM_1DLUT_LUT_CONTROL, MPCC_MCM_1DLUT_LUT_CONFIG_MODE, mask_sh),\
-       SF(MPCC_MCM0_MPCC_MCM_1DLUT_RAMA_START_CNTL_B, MPCC_MCM_1DLUT_RAMA_EXP_REGION_START_B, mask_sh),\
-       SF(MPCC_MCM0_MPCC_MCM_1DLUT_RAMA_START_CNTL_B, MPCC_MCM_1DLUT_RAMA_EXP_REGION_START_SEGMENT_B, mask_sh),\
-       SF(MPCC_MCM0_MPCC_MCM_1DLUT_RAMA_START_SLOPE_CNTL_B, MPCC_MCM_1DLUT_RAMA_EXP_REGION_START_SLOPE_B, mask_sh),\
-       SF(MPCC_MCM0_MPCC_MCM_1DLUT_RAMA_START_BASE_CNTL_B, MPCC_MCM_1DLUT_RAMA_EXP_REGION_START_BASE_B, mask_sh),\
-       SF(MPCC_MCM0_MPCC_MCM_1DLUT_RAMA_END_CNTL1_B, MPCC_MCM_1DLUT_RAMA_EXP_REGION_END_BASE_B, mask_sh),\
-       SF(MPCC_MCM0_MPCC_MCM_1DLUT_RAMA_END_CNTL2_B, MPCC_MCM_1DLUT_RAMA_EXP_REGION_END_B, mask_sh),\
-       SF(MPCC_MCM0_MPCC_MCM_1DLUT_RAMA_END_CNTL2_B, MPCC_MCM_1DLUT_RAMA_EXP_REGION_END_SLOPE_B, mask_sh),\
-       SF(MPCC_MCM0_MPCC_MCM_1DLUT_RAMA_OFFSET_B, MPCC_MCM_1DLUT_RAMA_OFFSET_B, mask_sh),\
-       SF(MPCC_MCM0_MPCC_MCM_1DLUT_RAMA_REGION_0_1, MPCC_MCM_1DLUT_RAMA_EXP_REGION0_LUT_OFFSET, mask_sh),\
-       SF(MPCC_MCM0_MPCC_MCM_1DLUT_RAMA_REGION_0_1, MPCC_MCM_1DLUT_RAMA_EXP_REGION0_NUM_SEGMENTS, mask_sh),\
-       SF(MPCC_MCM0_MPCC_MCM_1DLUT_RAMA_REGION_0_1, MPCC_MCM_1DLUT_RAMA_EXP_REGION1_LUT_OFFSET, mask_sh),\
-       SF(MPCC_MCM0_MPCC_MCM_1DLUT_RAMA_REGION_0_1, MPCC_MCM_1DLUT_RAMA_EXP_REGION1_NUM_SEGMENTS, mask_sh),\
-       SF(MPCC_MCM0_MPCC_MCM_MEM_PWR_CTRL, MPCC_MCM_SHAPER_MEM_PWR_FORCE, mask_sh),\
-       SF(MPCC_MCM0_MPCC_MCM_MEM_PWR_CTRL, MPCC_MCM_SHAPER_MEM_PWR_DIS, mask_sh),\
-       SF(MPCC_MCM0_MPCC_MCM_MEM_PWR_CTRL, MPCC_MCM_SHAPER_MEM_LOW_PWR_MODE, mask_sh),\
-       SF(MPCC_MCM0_MPCC_MCM_MEM_PWR_CTRL, MPCC_MCM_3DLUT_MEM_PWR_FORCE, mask_sh),\
-       SF(MPCC_MCM0_MPCC_MCM_MEM_PWR_CTRL, MPCC_MCM_3DLUT_MEM_PWR_DIS, mask_sh),\
-       SF(MPCC_MCM0_MPCC_MCM_MEM_PWR_CTRL, MPCC_MCM_3DLUT_MEM_LOW_PWR_MODE, mask_sh),\
-       SF(MPCC_MCM0_MPCC_MCM_MEM_PWR_CTRL, MPCC_MCM_1DLUT_MEM_PWR_FORCE, mask_sh),\
-       SF(MPCC_MCM0_MPCC_MCM_MEM_PWR_CTRL, MPCC_MCM_1DLUT_MEM_PWR_DIS, mask_sh),\
-       SF(MPCC_MCM0_MPCC_MCM_MEM_PWR_CTRL, MPCC_MCM_1DLUT_MEM_LOW_PWR_MODE, mask_sh),\
-       SF(MPCC_MCM0_MPCC_MCM_MEM_PWR_CTRL, MPCC_MCM_SHAPER_MEM_PWR_STATE, mask_sh),\
-       SF(MPCC_MCM0_MPCC_MCM_MEM_PWR_CTRL, MPCC_MCM_3DLUT_MEM_PWR_STATE, mask_sh),\
-       SF(MPCC_MCM0_MPCC_MCM_MEM_PWR_CTRL, MPCC_MCM_1DLUT_MEM_PWR_STATE, mask_sh),\
-       SF(CUR_VUPDATE_LOCK_SET0, CUR_VUPDATE_LOCK_SET, mask_sh)
-
-
-struct dcn32_mpc_registers {
-       MPC_REG_VARIABLE_LIST_DCN3_0;
-       MPC_REG_VARIABLE_LIST_DCN32;
-};
-void mpc32_mpc_init(struct mpc *mpc);
-bool mpc32_program_3dlut(
-               struct mpc *mpc,
-               const struct tetrahedral_params *params,
-               int mpcc_id);
-bool mpc32_program_post1dlut(
-               struct mpc *mpc,
-               const struct pwl_params *params,
-               uint32_t mpcc_id);
-bool mpc32_program_shaper(
-               struct mpc *mpc,
-               const struct pwl_params *params,
-               uint32_t mpcc_id);
-
-void dcn32_mpc_construct(struct dcn30_mpc *mpc30,
-       struct dc_context *ctx,
-       const struct dcn30_mpc_registers *mpc_regs,
-       const struct dcn30_mpc_shift *mpc_shift,
-       const struct dcn30_mpc_mask *mpc_mask,
-       int num_mpcc,
-       int num_rmu);
-
-void mpc32_power_on_blnd_lut(
-       struct mpc *mpc,
-       uint32_t mpcc_id,
-       bool power_on);
-void mpc32_program_post1dlut_pwl(
-               struct mpc *mpc,
-               uint32_t mpcc_id,
-               const struct pwl_result_data *rgb,
-               uint32_t num);
-void mpc32_program_post1dlutb_settings(
-               struct mpc *mpc,
-               uint32_t mpcc_id,
-               const struct pwl_params *params);
-void mpc32_program_post1dluta_settings(
-               struct mpc *mpc,
-               uint32_t mpcc_id,
-               const struct pwl_params *params);
-void mpc32_configure_post1dlut(
-               struct mpc *mpc,
-               uint32_t mpcc_id,
-               bool is_ram_a);
-void mpc32_program_shaper_lut(
-               struct mpc *mpc,
-               const struct pwl_result_data *rgb,
-               uint32_t num,
-               uint32_t mpcc_id);
-void mpc32_program_shaper_lutb_settings(
-               struct mpc *mpc,
-               const struct pwl_params *params,
-               uint32_t mpcc_id);
-void mpc32_program_shaper_luta_settings(
-               struct mpc *mpc,
-               const struct pwl_params *params,
-               uint32_t mpcc_id);
-void mpc32_configure_shaper_lut(
-               struct mpc *mpc,
-               bool is_ram_a,
-               uint32_t mpcc_id);
-void mpc32_power_on_shaper_3dlut(
-               struct mpc *mpc,
-               uint32_t mpcc_id,
-               bool power_on);
-void mpc32_set3dlut_ram10(
-               struct mpc *mpc,
-               const struct dc_rgb *lut,
-               uint32_t entries,
-               uint32_t mpcc_id);
-void mpc32_set3dlut_ram12(
-               struct mpc *mpc,
-               const struct dc_rgb *lut,
-               uint32_t entries,
-               uint32_t mpcc_id);
-void mpc32_select_3dlut_ram_mask(
-               struct mpc *mpc,
-               uint32_t ram_selection_mask,
-               uint32_t mpcc_id);
-void mpc32_select_3dlut_ram(
-               struct mpc *mpc,
-               enum dc_lut_mode mode,
-               bool is_color_channel_12bits,
-               uint32_t mpcc_id);
-#endif         //__DC_MPCC_DCN32_H__
diff --git a/drivers/gpu/drm/amd/display/dc/dcn32/dcn32_resource_helpers.c b/drivers/gpu/drm/amd/display/dc/dcn32/dcn32_resource_helpers.c
deleted file mode 100644 (file)
index d184105..0000000
+++ /dev/null
@@ -1,780 +0,0 @@
-/*
- * Copyright 2022 Advanced Micro Devices, Inc.
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the "Software"),
- * to deal in the Software without restriction, including without limitation
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
- * and/or sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
- * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
- * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
- * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
- * OTHER DEALINGS IN THE SOFTWARE.
- *
- * Authors: AMD
- *
- */
-
-// header file of functions being implemented
-#include "dcn32/dcn32_resource.h"
-#include "dcn20/dcn20_resource.h"
-#include "dml/dcn32/display_mode_vba_util_32.h"
-#include "dml/dcn32/dcn32_fpu.h"
-#include "dc_state_priv.h"
-#include "dc_stream_priv.h"
-
-static bool is_dual_plane(enum surface_pixel_format format)
-{
-       return format >= SURFACE_PIXEL_FORMAT_VIDEO_BEGIN || format == SURFACE_PIXEL_FORMAT_GRPH_RGBE_ALPHA;
-}
-
-uint32_t dcn32_helper_calculate_mall_bytes_for_cursor(
-               struct dc *dc,
-               struct pipe_ctx *pipe_ctx,
-               bool ignore_cursor_buf)
-{
-       struct hubp *hubp = pipe_ctx->plane_res.hubp;
-       uint32_t cursor_size = hubp->curs_attr.pitch * hubp->curs_attr.height;
-       uint32_t cursor_mall_size_bytes = 0;
-
-       switch (pipe_ctx->stream->cursor_attributes.color_format) {
-       case CURSOR_MODE_MONO:
-               cursor_size /= 2;
-               break;
-       case CURSOR_MODE_COLOR_1BIT_AND:
-       case CURSOR_MODE_COLOR_PRE_MULTIPLIED_ALPHA:
-       case CURSOR_MODE_COLOR_UN_PRE_MULTIPLIED_ALPHA:
-               cursor_size *= 4;
-               break;
-
-       case CURSOR_MODE_COLOR_64BIT_FP_PRE_MULTIPLIED:
-       case CURSOR_MODE_COLOR_64BIT_FP_UN_PRE_MULTIPLIED:
-               cursor_size *= 8;
-               break;
-       }
-
-       /* only count if cursor is enabled, and if additional allocation needed outside of the
-        * DCN cursor buffer
-        */
-       if (pipe_ctx->stream->cursor_position.enable && (ignore_cursor_buf ||
-                       cursor_size > 16384)) {
-               /* cursor_num_mblk = CEILING(num_cursors*cursor_width*cursor_width*cursor_Bpe/mblk_bytes, 1)
-                * Note: add 1 mblk in case of cursor misalignment
-                */
-               cursor_mall_size_bytes = ((cursor_size + DCN3_2_MALL_MBLK_SIZE_BYTES - 1) /
-                               DCN3_2_MALL_MBLK_SIZE_BYTES + 1) * DCN3_2_MALL_MBLK_SIZE_BYTES;
-       }
-
-       return cursor_mall_size_bytes;
-}
-
-/**
- * dcn32_helper_calculate_num_ways_for_subvp(): Calculate number of ways needed for SubVP
- *
- * Gets total allocation required for the phantom viewport calculated by DML in bytes and
- * converts to number of cache ways.
- *
- * @dc: current dc state
- * @context: new dc state
- *
- * Return: number of ways required for SubVP
- */
-uint32_t dcn32_helper_calculate_num_ways_for_subvp(
-               struct dc *dc,
-               struct dc_state *context)
-{
-       if (context->bw_ctx.bw.dcn.mall_subvp_size_bytes > 0) {
-               if (dc->debug.force_subvp_num_ways) {
-                       return dc->debug.force_subvp_num_ways;
-               } else if (dc->res_pool->funcs->calculate_mall_ways_from_bytes) {
-                       return dc->res_pool->funcs->calculate_mall_ways_from_bytes(dc, context->bw_ctx.bw.dcn.mall_subvp_size_bytes);
-               } else {
-                       return 0;
-               }
-       } else {
-               return 0;
-       }
-}
-
-void dcn32_merge_pipes_for_subvp(struct dc *dc,
-               struct dc_state *context)
-{
-       uint32_t i;
-
-       /* merge pipes if necessary */
-       for (i = 0; i < dc->res_pool->pipe_count; i++) {
-               struct pipe_ctx *pipe = &context->res_ctx.pipe_ctx[i];
-
-               // For now merge all pipes for SubVP since pipe split case isn't supported yet
-
-               /* if ODM merge we ignore mpc tree, mpo pipes will have their own flags */
-               if (pipe->prev_odm_pipe) {
-                       /*split off odm pipe*/
-                       pipe->prev_odm_pipe->next_odm_pipe = pipe->next_odm_pipe;
-                       if (pipe->next_odm_pipe)
-                               pipe->next_odm_pipe->prev_odm_pipe = pipe->prev_odm_pipe;
-
-                       pipe->bottom_pipe = NULL;
-                       pipe->next_odm_pipe = NULL;
-                       pipe->plane_state = NULL;
-                       pipe->stream = NULL;
-                       pipe->top_pipe = NULL;
-                       pipe->prev_odm_pipe = NULL;
-                       if (pipe->stream_res.dsc)
-                               dcn20_release_dsc(&context->res_ctx, dc->res_pool, &pipe->stream_res.dsc);
-                       memset(&pipe->plane_res, 0, sizeof(pipe->plane_res));
-                       memset(&pipe->stream_res, 0, sizeof(pipe->stream_res));
-               } else if (pipe->top_pipe && pipe->top_pipe->plane_state == pipe->plane_state) {
-                       struct pipe_ctx *top_pipe = pipe->top_pipe;
-                       struct pipe_ctx *bottom_pipe = pipe->bottom_pipe;
-
-                       top_pipe->bottom_pipe = bottom_pipe;
-                       if (bottom_pipe)
-                               bottom_pipe->top_pipe = top_pipe;
-
-                       pipe->top_pipe = NULL;
-                       pipe->bottom_pipe = NULL;
-                       pipe->plane_state = NULL;
-                       pipe->stream = NULL;
-                       memset(&pipe->plane_res, 0, sizeof(pipe->plane_res));
-                       memset(&pipe->stream_res, 0, sizeof(pipe->stream_res));
-               }
-       }
-}
-
-bool dcn32_all_pipes_have_stream_and_plane(struct dc *dc,
-               struct dc_state *context)
-{
-       uint32_t i;
-
-       for (i = 0; i < dc->res_pool->pipe_count; i++) {
-               struct pipe_ctx *pipe = &context->res_ctx.pipe_ctx[i];
-
-               if (!pipe->stream)
-                       continue;
-
-               if (!pipe->plane_state)
-                       return false;
-       }
-       return true;
-}
-
-bool dcn32_subvp_in_use(struct dc *dc,
-               struct dc_state *context)
-{
-       uint32_t i;
-
-       for (i = 0; i < dc->res_pool->pipe_count; i++) {
-               struct pipe_ctx *pipe = &context->res_ctx.pipe_ctx[i];
-
-               if (dc_state_get_pipe_subvp_type(context, pipe) != SUBVP_NONE)
-                       return true;
-       }
-       return false;
-}
-
-bool dcn32_mpo_in_use(struct dc_state *context)
-{
-       uint32_t i;
-
-       for (i = 0; i < context->stream_count; i++) {
-               if (context->stream_status[i].plane_count > 1)
-                       return true;
-       }
-       return false;
-}
-
-
-bool dcn32_any_surfaces_rotated(struct dc *dc, struct dc_state *context)
-{
-       uint32_t i;
-
-       for (i = 0; i < dc->res_pool->pipe_count; i++) {
-               struct pipe_ctx *pipe = &context->res_ctx.pipe_ctx[i];
-
-               if (!pipe->stream)
-                       continue;
-
-               if (pipe->plane_state && pipe->plane_state->rotation != ROTATION_ANGLE_0)
-                       return true;
-       }
-       return false;
-}
-
-bool dcn32_is_center_timing(struct pipe_ctx *pipe)
-{
-       bool is_center_timing = false;
-
-       if (pipe->stream) {
-               if (pipe->stream->timing.v_addressable != pipe->stream->dst.height ||
-                               pipe->stream->timing.v_addressable != pipe->stream->src.height) {
-                       is_center_timing = true;
-               }
-       }
-
-       if (pipe->plane_state) {
-               if (pipe->stream->timing.v_addressable != pipe->plane_state->dst_rect.height &&
-                               pipe->stream->timing.v_addressable != pipe->plane_state->src_rect.height) {
-                       is_center_timing = true;
-               }
-       }
-
-       return is_center_timing;
-}
-
-bool dcn32_is_psr_capable(struct pipe_ctx *pipe)
-{
-       bool psr_capable = false;
-
-       if (pipe->stream && pipe->stream->link->psr_settings.psr_version != DC_PSR_VERSION_UNSUPPORTED) {
-               psr_capable = true;
-       }
-       return psr_capable;
-}
-
-static void override_det_for_subvp(struct dc *dc, struct dc_state *context, uint8_t pipe_segments[])
-{
-       uint32_t i;
-       uint8_t fhd_count = 0;
-       uint8_t subvp_high_refresh_count = 0;
-       uint8_t stream_count = 0;
-
-       // Do not override if a stream has multiple planes
-       for (i = 0; i < context->stream_count; i++) {
-               if (context->stream_status[i].plane_count > 1)
-                       return;
-
-               if (dc_state_get_stream_subvp_type(context, context->streams[i]) != SUBVP_PHANTOM)
-                       stream_count++;
-       }
-
-       for (i = 0; i < dc->res_pool->pipe_count; i++) {
-               struct pipe_ctx *pipe_ctx = &context->res_ctx.pipe_ctx[i];
-
-               if (pipe_ctx->stream && pipe_ctx->plane_state && dc_state_get_pipe_subvp_type(context, pipe_ctx) != SUBVP_PHANTOM) {
-                       if (dcn32_allow_subvp_high_refresh_rate(dc, context, pipe_ctx)) {
-
-                               if (pipe_ctx->stream->timing.v_addressable == 1080 && pipe_ctx->stream->timing.h_addressable == 1920) {
-                                       fhd_count++;
-                               }
-                               subvp_high_refresh_count++;
-                       }
-               }
-       }
-
-       if (stream_count == 2 && subvp_high_refresh_count == 2 && fhd_count == 1) {
-               for (i = 0; i < dc->res_pool->pipe_count; i++) {
-                       struct pipe_ctx *pipe_ctx = &context->res_ctx.pipe_ctx[i];
-
-                       if (pipe_ctx->stream && pipe_ctx->plane_state && dc_state_get_pipe_subvp_type(context, pipe_ctx) != SUBVP_PHANTOM) {
-                               if (pipe_ctx->stream->timing.v_addressable == 1080 && pipe_ctx->stream->timing.h_addressable == 1920) {
-                                       if (pipe_segments[i] > 4)
-                                               pipe_segments[i] = 4;
-                               }
-                       }
-               }
-       }
-}
-
-/**
- * dcn32_determine_det_override(): Determine DET allocation for each pipe
- *
- * This function determines how much DET to allocate for each pipe. The total number of
- * DET segments will be split equally among each of the streams, and after that the DET
- * segments per stream will be split equally among the planes for the given stream.
- *
- * If there is a plane that's driven by more than 1 pipe (i.e. pipe split), then the
- * number of DET for that given plane will be split among the pipes driving that plane.
- *
- *
- * High level algorithm:
- * 1. Split total DET among number of streams
- * 2. For each stream, split DET among the planes
- * 3. For each plane, check if there is a pipe split. If yes, split the DET allocation
- *    among those pipes.
- * 4. Assign the DET override to the DML pipes.
- *
- * @dc: Current DC state
- * @context: New DC state to be programmed
- * @pipes: Array of DML pipes
- *
- * Return: void
- */
-void dcn32_determine_det_override(struct dc *dc,
-               struct dc_state *context,
-               display_e2e_pipe_params_st *pipes)
-{
-       uint32_t i, j, k;
-       uint8_t pipe_plane_count, stream_segments, plane_segments, pipe_segments[MAX_PIPES] = {0};
-       uint8_t pipe_counted[MAX_PIPES] = {0};
-       uint8_t pipe_cnt = 0;
-       struct dc_plane_state *current_plane = NULL;
-       uint8_t stream_count = 0;
-
-       for (i = 0; i < context->stream_count; i++) {
-               /* Don't count SubVP streams for DET allocation */
-               if (dc_state_get_stream_subvp_type(context, context->streams[i]) != SUBVP_PHANTOM)
-                       stream_count++;
-       }
-
-       if (stream_count > 0) {
-               stream_segments = 18 / stream_count;
-               for (i = 0; i < context->stream_count; i++) {
-                       if (dc_state_get_stream_subvp_type(context, context->streams[i]) == SUBVP_PHANTOM)
-                               continue;
-
-                       if (context->stream_status[i].plane_count > 0)
-                               plane_segments = stream_segments / context->stream_status[i].plane_count;
-                       else
-                               plane_segments = stream_segments;
-                       for (j = 0; j < dc->res_pool->pipe_count; j++) {
-                               pipe_plane_count = 0;
-                               if (context->res_ctx.pipe_ctx[j].stream == context->streams[i] &&
-                                               pipe_counted[j] != 1) {
-                                       /* Note: pipe_plane_count indicates the number of pipes to be used for a
-                                        * given plane. e.g. pipe_plane_count = 1 means single pipe (i.e. not split),
-                                        * pipe_plane_count = 2 means 2:1 split, etc.
-                                        */
-                                       pipe_plane_count++;
-                                       pipe_counted[j] = 1;
-                                       current_plane = context->res_ctx.pipe_ctx[j].plane_state;
-                                       for (k = 0; k < dc->res_pool->pipe_count; k++) {
-                                               if (k != j && context->res_ctx.pipe_ctx[k].stream == context->streams[i] &&
-                                                               context->res_ctx.pipe_ctx[k].plane_state == current_plane) {
-                                                       pipe_plane_count++;
-                                                       pipe_counted[k] = 1;
-                                               }
-                                       }
-
-                                       pipe_segments[j] = plane_segments / pipe_plane_count;
-                                       for (k = 0; k < dc->res_pool->pipe_count; k++) {
-                                               if (k != j && context->res_ctx.pipe_ctx[k].stream == context->streams[i] &&
-                                                               context->res_ctx.pipe_ctx[k].plane_state == current_plane) {
-                                                       pipe_segments[k] = plane_segments / pipe_plane_count;
-                                               }
-                                       }
-                               }
-                       }
-               }
-
-               override_det_for_subvp(dc, context, pipe_segments);
-               for (i = 0, pipe_cnt = 0; i < dc->res_pool->pipe_count; i++) {
-                       if (!context->res_ctx.pipe_ctx[i].stream)
-                               continue;
-                       pipes[pipe_cnt].pipe.src.det_size_override = pipe_segments[i] * DCN3_2_DET_SEG_SIZE;
-                       pipe_cnt++;
-               }
-       } else {
-               for (i = 0; i < dc->res_pool->pipe_count; i++)
-                       pipes[i].pipe.src.det_size_override = 4 * DCN3_2_DET_SEG_SIZE; //DCN3_2_DEFAULT_DET_SIZE
-       }
-}
-
-void dcn32_set_det_allocations(struct dc *dc, struct dc_state *context,
-       display_e2e_pipe_params_st *pipes)
-{
-       int i, pipe_cnt;
-       struct resource_context *res_ctx = &context->res_ctx;
-       struct pipe_ctx *pipe = 0;
-       bool disable_unbounded_requesting = dc->debug.disable_z9_mpc || dc->debug.disable_unbounded_requesting;
-
-       for (i = 0, pipe_cnt = 0; i < dc->res_pool->pipe_count; i++) {
-
-               if (!res_ctx->pipe_ctx[i].stream)
-                       continue;
-
-               pipe = &res_ctx->pipe_ctx[i];
-               pipe_cnt++;
-       }
-
-       /* For DET allocation, we don't want to use DML policy (not optimal for utilizing all
-        * the DET available for each pipe). Use the DET override input to maintain our driver
-        * policy.
-        */
-       if (pipe_cnt == 1) {
-               pipes[0].pipe.src.det_size_override = DCN3_2_MAX_DET_SIZE;
-               if (pipe->plane_state && !disable_unbounded_requesting && pipe->plane_state->tiling_info.gfx9.swizzle != DC_SW_LINEAR) {
-                       if (!is_dual_plane(pipe->plane_state->format)) {
-                               pipes[0].pipe.src.det_size_override = DCN3_2_DEFAULT_DET_SIZE;
-                               pipes[0].pipe.src.unbounded_req_mode = true;
-                               if (pipe->plane_state->src_rect.width >= 5120 &&
-                                       pipe->plane_state->src_rect.height >= 2880)
-                                       pipes[0].pipe.src.det_size_override = 320; // 5K or higher
-                       }
-               }
-       } else
-               dcn32_determine_det_override(dc, context, pipes);
-}
-
-#define MAX_STRETCHED_V_BLANK 1000 // in micro-seconds (must ensure to match value in FW)
-/*
- * Scaling factor for v_blank stretch calculations considering timing in
- * micro-seconds and pixel clock in 100hz.
- * Note: the parenthesis are necessary to ensure the correct order of
- * operation where V_SCALE is used.
- */
-#define V_SCALE (10000 / MAX_STRETCHED_V_BLANK)
-
-static int get_frame_rate_at_max_stretch_100hz(
-               struct dc_stream_state *fpo_candidate_stream,
-               uint32_t fpo_vactive_margin_us)
-{
-       struct dc_crtc_timing *timing = NULL;
-       uint32_t sec_per_100_lines;
-       uint32_t max_v_blank;
-       uint32_t curr_v_blank;
-       uint32_t v_stretch_max;
-       uint32_t stretched_frame_pix_cnt;
-       uint32_t scaled_stretched_frame_pix_cnt;
-       uint32_t scaled_refresh_rate;
-       uint32_t v_scale;
-
-       if (fpo_candidate_stream == NULL)
-               return 0;
-
-       /* check if refresh rate at least 120hz */
-       timing = &fpo_candidate_stream->timing;
-       if (timing == NULL)
-               return 0;
-
-       v_scale = 10000 / (MAX_STRETCHED_V_BLANK + fpo_vactive_margin_us);
-
-       sec_per_100_lines = timing->pix_clk_100hz / timing->h_total + 1;
-       max_v_blank = sec_per_100_lines / v_scale + 1;
-       curr_v_blank = timing->v_total - timing->v_addressable;
-       v_stretch_max = (max_v_blank > curr_v_blank) ? (max_v_blank - curr_v_blank) : (0);
-       stretched_frame_pix_cnt = (v_stretch_max + timing->v_total) * timing->h_total;
-       scaled_stretched_frame_pix_cnt = stretched_frame_pix_cnt / 10000;
-       scaled_refresh_rate = (timing->pix_clk_100hz) / scaled_stretched_frame_pix_cnt + 1;
-
-       return scaled_refresh_rate;
-
-}
-
-static bool is_refresh_rate_support_mclk_switch_using_fw_based_vblank_stretch(
-               struct dc_stream_state *fpo_candidate_stream, uint32_t fpo_vactive_margin_us, int current_refresh_rate)
-{
-       int refresh_rate_max_stretch_100hz;
-       int min_refresh_100hz;
-
-       if (fpo_candidate_stream == NULL)
-               return false;
-
-       refresh_rate_max_stretch_100hz = get_frame_rate_at_max_stretch_100hz(fpo_candidate_stream, fpo_vactive_margin_us);
-       min_refresh_100hz = fpo_candidate_stream->timing.min_refresh_in_uhz / 10000;
-
-       if (refresh_rate_max_stretch_100hz < min_refresh_100hz)
-               return false;
-
-       if (fpo_candidate_stream->ctx->dc->config.enable_fpo_flicker_detection == 1 &&
-                       !dc_stream_is_refresh_rate_range_flickerless(fpo_candidate_stream, (refresh_rate_max_stretch_100hz / 100), current_refresh_rate, false))
-               return false;
-
-       return true;
-}
-
-static int get_refresh_rate(struct dc_stream_state *fpo_candidate_stream)
-{
-       int refresh_rate = 0;
-       int h_v_total = 0;
-       struct dc_crtc_timing *timing = NULL;
-
-       if (fpo_candidate_stream == NULL)
-               return 0;
-
-       /* check if refresh rate at least 120hz */
-       timing = &fpo_candidate_stream->timing;
-       if (timing == NULL)
-               return 0;
-
-       h_v_total = timing->h_total * timing->v_total;
-       if (h_v_total == 0)
-               return 0;
-
-       refresh_rate = ((timing->pix_clk_100hz * 100) / (h_v_total)) + 1;
-       return refresh_rate;
-}
-
-/**
- * dcn32_can_support_mclk_switch_using_fw_based_vblank_stretch() - Determines if config can
- *                                                                 support FPO
- *
- * @dc: current dc state
- * @context: new dc state
- *
- * Return: Pointer to FPO stream candidate if config can support FPO, otherwise NULL
- */
-struct dc_stream_state *dcn32_can_support_mclk_switch_using_fw_based_vblank_stretch(struct dc *dc, struct dc_state *context)
-{
-       int refresh_rate = 0;
-       const int minimum_refreshrate_supported = 120;
-       struct dc_stream_state *fpo_candidate_stream = NULL;
-       bool is_fpo_vactive = false;
-       uint32_t fpo_vactive_margin_us = 0;
-       struct dc_stream_status *fpo_stream_status = NULL;
-
-       if (context == NULL)
-               return NULL;
-
-       if (dc->debug.disable_fams)
-               return NULL;
-
-       if (!dc->caps.dmub_caps.mclk_sw)
-               return NULL;
-
-       if (context->bw_ctx.bw.dcn.clk.fw_based_mclk_switching_shut_down)
-               return NULL;
-
-       /* For FPO we can support up to 2 display configs if:
-        * - first display uses FPO
-        * - Second display switches in VACTIVE */
-       if (context->stream_count > 2)
-               return NULL;
-       else if (context->stream_count == 2) {
-               DC_FP_START();
-               dcn32_assign_fpo_vactive_candidate(dc, context, &fpo_candidate_stream);
-               DC_FP_END();
-               if (fpo_candidate_stream)
-                       fpo_stream_status = dc_state_get_stream_status(context, fpo_candidate_stream);
-               DC_FP_START();
-               is_fpo_vactive = dcn32_find_vactive_pipe(dc, context, fpo_candidate_stream, dc->debug.fpo_vactive_min_active_margin_us);
-               DC_FP_END();
-               if (!is_fpo_vactive || dc->debug.disable_fpo_vactive)
-                       return NULL;
-       } else {
-               fpo_candidate_stream = context->streams[0];
-               if (fpo_candidate_stream)
-                       fpo_stream_status = dc_state_get_stream_status(context, fpo_candidate_stream);
-       }
-
-       /* In DCN32/321, FPO uses per-pipe P-State force.
-        * If there's no planes, HUBP is power gated and
-        * therefore programming UCLK_PSTATE_FORCE does
-        * nothing (P-State will always be asserted naturally
-        * on a pipe that has HUBP power gated. Therefore we
-        * only want to enable FPO if the FPO pipe has both
-        * a stream and a plane.
-        */
-       if (!fpo_candidate_stream || !fpo_stream_status || fpo_stream_status->plane_count == 0)
-               return NULL;
-
-       if (fpo_candidate_stream->sink->edid_caps.panel_patch.disable_fams)
-               return NULL;
-
-       refresh_rate = get_refresh_rate(fpo_candidate_stream);
-       if (refresh_rate < minimum_refreshrate_supported)
-               return NULL;
-
-       fpo_vactive_margin_us = is_fpo_vactive ? dc->debug.fpo_vactive_margin_us : 0; // For now hardcode the FPO + Vactive stretch margin to be 2000us
-       if (!is_refresh_rate_support_mclk_switch_using_fw_based_vblank_stretch(fpo_candidate_stream, fpo_vactive_margin_us, refresh_rate))
-               return NULL;
-
-       if (!fpo_candidate_stream->allow_freesync)
-               return NULL;
-
-       if (fpo_candidate_stream->vrr_active_variable &&
-       ((dc->debug.disable_fams_gaming == INGAME_FAMS_DISABLE) ||
-       (context->stream_count > 1 && !(dc->debug.disable_fams_gaming == INGAME_FAMS_MULTI_DISP_ENABLE))))
-               return NULL;
-
-       return fpo_candidate_stream;
-}
-
-bool dcn32_check_native_scaling_for_res(struct pipe_ctx *pipe, unsigned int width, unsigned int height)
-{
-       bool is_native_scaling = false;
-
-       if (pipe->stream->timing.h_addressable == width &&
-                       pipe->stream->timing.v_addressable == height &&
-                       pipe->plane_state->src_rect.width == width &&
-                       pipe->plane_state->src_rect.height == height &&
-                       pipe->plane_state->dst_rect.width == width &&
-                       pipe->plane_state->dst_rect.height == height)
-               is_native_scaling = true;
-
-       return is_native_scaling;
-}
-
-/**
- * disallow_subvp_in_active_plus_blank() - Function to determine disallowed subvp + drr/vblank configs
- *
- * @pipe: subvp pipe to be used for the subvp + drr/vblank config
- *
- * Since subvp is being enabled on more configs (such as 1080p60), we want
- * to explicitly block any configs that we don't want to enable. We do not
- * want to enable any 1080p60 (SubVP) + drr / vblank configs since these
- * are already convered by FPO.
- *
- * Return: True if disallowed, false otherwise
- */
-static bool disallow_subvp_in_active_plus_blank(struct pipe_ctx *pipe)
-{
-       bool disallow = false;
-
-       if (resource_is_pipe_type(pipe, OPP_HEAD) &&
-                       resource_is_pipe_type(pipe, DPP_PIPE)) {
-               if (pipe->stream->timing.v_addressable == 1080 && pipe->stream->timing.h_addressable == 1920)
-                       disallow = true;
-       }
-       return disallow;
-}
-
-/**
- * dcn32_subvp_drr_admissable() - Determine if SubVP + DRR config is admissible
- *
- * @dc: Current DC state
- * @context: New DC state to be programmed
- *
- * SubVP + DRR is admissible under the following conditions:
- * - Config must have 2 displays (i.e., 2 non-phantom master pipes)
- * - One display is SubVP
- * - Other display must have Freesync enabled
- * - The potential DRR display must not be PSR capable
- *
- * Return: True if admissible, false otherwise
- */
-bool dcn32_subvp_drr_admissable(struct dc *dc, struct dc_state *context)
-{
-       bool result = false;
-       uint32_t i;
-       uint8_t subvp_count = 0;
-       uint8_t non_subvp_pipes = 0;
-       bool drr_pipe_found = false;
-       bool drr_psr_capable = false;
-       uint64_t refresh_rate = 0;
-       bool subvp_disallow = false;
-
-       for (i = 0; i < dc->res_pool->pipe_count; i++) {
-               struct pipe_ctx *pipe = &context->res_ctx.pipe_ctx[i];
-               enum mall_stream_type pipe_mall_type = dc_state_get_pipe_subvp_type(context, pipe);
-
-               if (resource_is_pipe_type(pipe, OPP_HEAD) &&
-                               resource_is_pipe_type(pipe, DPP_PIPE)) {
-                       if (pipe_mall_type == SUBVP_MAIN) {
-                               subvp_count++;
-
-                               subvp_disallow |= disallow_subvp_in_active_plus_blank(pipe);
-                               refresh_rate = (pipe->stream->timing.pix_clk_100hz * (uint64_t)100 +
-                                       pipe->stream->timing.v_total * pipe->stream->timing.h_total - (uint64_t)1);
-                               refresh_rate = div_u64(refresh_rate, pipe->stream->timing.v_total);
-                               refresh_rate = div_u64(refresh_rate, pipe->stream->timing.h_total);
-                       }
-                       if (pipe_mall_type == SUBVP_NONE) {
-                               non_subvp_pipes++;
-                               drr_psr_capable = (drr_psr_capable || dcn32_is_psr_capable(pipe));
-                               if (pipe->stream->ignore_msa_timing_param &&
-                                               (pipe->stream->allow_freesync || pipe->stream->vrr_active_variable || pipe->stream->vrr_active_fixed)) {
-                                       drr_pipe_found = true;
-                               }
-                       }
-               }
-       }
-
-       if (subvp_count == 1 && !subvp_disallow && non_subvp_pipes == 1 && drr_pipe_found && !drr_psr_capable &&
-               ((uint32_t)refresh_rate < 120))
-               result = true;
-
-       return result;
-}
-
-/**
- * dcn32_subvp_vblank_admissable() - Determine if SubVP + Vblank config is admissible
- *
- * @dc: Current DC state
- * @context: New DC state to be programmed
- * @vlevel: Voltage level calculated by DML
- *
- * SubVP + Vblank is admissible under the following conditions:
- * - Config must have 2 displays (i.e., 2 non-phantom master pipes)
- * - One display is SubVP
- * - Other display must not have Freesync capability
- * - DML must have output DRAM clock change support as SubVP + Vblank
- * - The potential vblank display must not be PSR capable
- *
- * Return: True if admissible, false otherwise
- */
-bool dcn32_subvp_vblank_admissable(struct dc *dc, struct dc_state *context, int vlevel)
-{
-       bool result = false;
-       uint32_t i;
-       uint8_t subvp_count = 0;
-       uint8_t non_subvp_pipes = 0;
-       bool drr_pipe_found = false;
-       struct vba_vars_st *vba = &context->bw_ctx.dml.vba;
-       bool vblank_psr_capable = false;
-       uint64_t refresh_rate = 0;
-       bool subvp_disallow = false;
-
-       for (i = 0; i < dc->res_pool->pipe_count; i++) {
-               struct pipe_ctx *pipe = &context->res_ctx.pipe_ctx[i];
-               enum mall_stream_type pipe_mall_type = dc_state_get_pipe_subvp_type(context, pipe);
-
-               if (resource_is_pipe_type(pipe, OPP_HEAD) &&
-                               resource_is_pipe_type(pipe, DPP_PIPE)) {
-                       if (pipe_mall_type == SUBVP_MAIN) {
-                               subvp_count++;
-
-                               subvp_disallow |= disallow_subvp_in_active_plus_blank(pipe);
-                               refresh_rate = (pipe->stream->timing.pix_clk_100hz * (uint64_t)100 +
-                                       pipe->stream->timing.v_total * pipe->stream->timing.h_total - (uint64_t)1);
-                               refresh_rate = div_u64(refresh_rate, pipe->stream->timing.v_total);
-                               refresh_rate = div_u64(refresh_rate, pipe->stream->timing.h_total);
-                       }
-                       if (pipe_mall_type == SUBVP_NONE) {
-                               non_subvp_pipes++;
-                               vblank_psr_capable = (vblank_psr_capable || dcn32_is_psr_capable(pipe));
-                               if (pipe->stream->ignore_msa_timing_param &&
-                                               (pipe->stream->allow_freesync || pipe->stream->vrr_active_variable || pipe->stream->vrr_active_fixed)) {
-                                       drr_pipe_found = true;
-                               }
-                       }
-               }
-       }
-
-       if (subvp_count == 1 && non_subvp_pipes == 1 && !drr_pipe_found && !vblank_psr_capable &&
-               ((uint32_t)refresh_rate < 120) && !subvp_disallow &&
-               vba->DRAMClockChangeSupport[vlevel][vba->maxMpcComb] == dm_dram_clock_change_vblank_w_mall_sub_vp)
-               result = true;
-
-       return result;
-}
-
-void dcn32_update_dml_pipes_odm_policy_based_on_context(struct dc *dc, struct dc_state *context,
-               display_e2e_pipe_params_st *pipes)
-{
-       int i, pipe_cnt;
-       struct resource_context *res_ctx = &context->res_ctx;
-       struct pipe_ctx *pipe = NULL;
-
-       for (i = 0, pipe_cnt = 0; i < dc->res_pool->pipe_count; i++) {
-               int odm_slice_count = 0;
-
-               if (!res_ctx->pipe_ctx[i].stream)
-                       continue;
-               pipe = &res_ctx->pipe_ctx[i];
-               odm_slice_count = resource_get_odm_slice_count(pipe);
-
-               if (odm_slice_count == 1)
-                       pipes[pipe_cnt].pipe.dest.odm_combine_policy = dm_odm_combine_policy_dal;
-               else if (odm_slice_count == 2)
-                       pipes[pipe_cnt].pipe.dest.odm_combine_policy = dm_odm_combine_policy_2to1;
-               else if (odm_slice_count == 4)
-                       pipes[pipe_cnt].pipe.dest.odm_combine_policy = dm_odm_combine_policy_4to1;
-
-               pipe_cnt++;
-       }
-}
-
-void dcn32_override_min_req_dcfclk(struct dc *dc, struct dc_state *context)
-{
-       if (dcn32_subvp_in_use(dc, context) && context->bw_ctx.bw.dcn.clk.dcfclk_khz <= MIN_SUBVP_DCFCLK_KHZ)
-               context->bw_ctx.bw.dcn.clk.dcfclk_khz = MIN_SUBVP_DCFCLK_KHZ;
-}
diff --git a/drivers/gpu/drm/amd/display/dc/dcn321/Makefile b/drivers/gpu/drm/amd/display/dc/dcn321/Makefile
deleted file mode 100644 (file)
index c195c47..0000000
+++ /dev/null
@@ -1,17 +0,0 @@
-#
-# (c) Copyright 2020 Advanced Micro Devices, Inc. All the rights reserved
-#
-#  All rights reserved.  This notice is intended as a precaution against
-#  inadvertent publication and does not imply publication or any waiver
-#  of confidentiality.  The year included in the foregoing notice is the
-#  year of creation of the work.
-#
-#  Authors: AMD
-#
-# Makefile for dcn321.
-
-DCN321 = dcn321_dio_link_encoder.o
-
-AMD_DAL_DCN321 = $(addprefix $(AMDDALPATH)/dc/dcn321/,$(DCN321))
-
-AMD_DISPLAY_FILES += $(AMD_DAL_DCN321)
diff --git a/drivers/gpu/drm/amd/display/dc/dcn321/dcn321_dio_link_encoder.c b/drivers/gpu/drm/amd/display/dc/dcn321/dcn321_dio_link_encoder.c
deleted file mode 100644 (file)
index 05783da..0000000
+++ /dev/null
@@ -1,191 +0,0 @@
-/*
- * Copyright 2022 Advanced Micro Devices, Inc.
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the "Software"),
- * to deal in the Software without restriction, including without limitation
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
- * and/or sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
- * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
- * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
- * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
- * OTHER DEALINGS IN THE SOFTWARE.
- *
- * Authors: AMD
- *
- */
-
-
-#include "reg_helper.h"
-
-#include "core_types.h"
-#include "link_encoder.h"
-#include "dcn321_dio_link_encoder.h"
-#include "dcn31/dcn31_dio_link_encoder.h"
-#include "stream_encoder.h"
-#include "dc_bios_types.h"
-
-#include "gpio_service_interface.h"
-
-#ifndef MIN
-#define MIN(X, Y) ((X) < (Y) ? (X) : (Y))
-#endif
-
-#define CTX \
-       enc10->base.ctx
-#define DC_LOGGER \
-       enc10->base.ctx->logger
-
-#define REG(reg)\
-       (enc10->link_regs->reg)
-
-#undef FN
-#define FN(reg_name, field_name) \
-       enc10->link_shift->field_name, enc10->link_mask->field_name
-
-#define AUX_REG(reg)\
-       (enc10->aux_regs->reg)
-
-#define AUX_REG_READ(reg_name) \
-               dm_read_reg(CTX, AUX_REG(reg_name))
-
-#define AUX_REG_WRITE(reg_name, val) \
-                       dm_write_reg(CTX, AUX_REG(reg_name), val)
-
-static const struct link_encoder_funcs dcn321_link_enc_funcs = {
-       .read_state = link_enc2_read_state,
-       .validate_output_with_stream =
-                       dcn30_link_encoder_validate_output_with_stream,
-       .hw_init = enc32_hw_init,
-       .setup = dcn10_link_encoder_setup,
-       .enable_tmds_output = dcn10_link_encoder_enable_tmds_output,
-       .enable_dp_output = dcn32_link_encoder_enable_dp_output,
-       .enable_dp_mst_output = dcn10_link_encoder_enable_dp_mst_output,
-       .disable_output = dcn10_link_encoder_disable_output,
-       .dp_set_lane_settings = dcn10_link_encoder_dp_set_lane_settings,
-       .dp_set_phy_pattern = dcn10_link_encoder_dp_set_phy_pattern,
-       .update_mst_stream_allocation_table =
-               dcn10_link_encoder_update_mst_stream_allocation_table,
-       .psr_program_dp_dphy_fast_training =
-                       dcn10_psr_program_dp_dphy_fast_training,
-       .psr_program_secondary_packet = dcn10_psr_program_secondary_packet,
-       .connect_dig_be_to_fe = dcn10_link_encoder_connect_dig_be_to_fe,
-       .enable_hpd = dcn10_link_encoder_enable_hpd,
-       .disable_hpd = dcn10_link_encoder_disable_hpd,
-       .is_dig_enabled = dcn10_is_dig_enabled,
-       .destroy = dcn10_link_encoder_destroy,
-       .fec_set_enable = enc2_fec_set_enable,
-       .fec_set_ready = enc2_fec_set_ready,
-       .fec_is_active = enc2_fec_is_active,
-       .get_dig_frontend = dcn10_get_dig_frontend,
-       .get_dig_mode = dcn10_get_dig_mode,
-       .is_in_alt_mode = dcn20_link_encoder_is_in_alt_mode,
-       .get_max_link_cap = dcn20_link_encoder_get_max_link_cap,
-       .set_dio_phy_mux = dcn31_link_encoder_set_dio_phy_mux,
-};
-
-void dcn321_link_encoder_construct(
-       struct dcn20_link_encoder *enc20,
-       const struct encoder_init_data *init_data,
-       const struct encoder_feature_support *enc_features,
-       const struct dcn10_link_enc_registers *link_regs,
-       const struct dcn10_link_enc_aux_registers *aux_regs,
-       const struct dcn10_link_enc_hpd_registers *hpd_regs,
-       const struct dcn10_link_enc_shift *link_shift,
-       const struct dcn10_link_enc_mask *link_mask)
-{
-       struct bp_connector_speed_cap_info bp_cap_info = {0};
-       const struct dc_vbios_funcs *bp_funcs = init_data->ctx->dc_bios->funcs;
-       enum bp_result result = BP_RESULT_OK;
-       struct dcn10_link_encoder *enc10 = &enc20->enc10;
-
-       enc10->base.funcs = &dcn321_link_enc_funcs;
-       enc10->base.ctx = init_data->ctx;
-       enc10->base.id = init_data->encoder;
-
-       enc10->base.hpd_source = init_data->hpd_source;
-       enc10->base.connector = init_data->connector;
-
-       if (enc10->base.connector.id == CONNECTOR_ID_USBC)
-               enc10->base.features.flags.bits.DP_IS_USB_C = 1;
-
-       enc10->base.preferred_engine = ENGINE_ID_UNKNOWN;
-
-       enc10->base.features = *enc_features;
-
-       enc10->base.transmitter = init_data->transmitter;
-
-       /* set the flag to indicate whether driver poll the I2C data pin
-        * while doing the DP sink detect
-        */
-
-       enc10->base.output_signals =
-               SIGNAL_TYPE_DVI_SINGLE_LINK |
-               SIGNAL_TYPE_DVI_DUAL_LINK |
-               SIGNAL_TYPE_LVDS |
-               SIGNAL_TYPE_DISPLAY_PORT |
-               SIGNAL_TYPE_DISPLAY_PORT_MST |
-               SIGNAL_TYPE_EDP |
-               SIGNAL_TYPE_HDMI_TYPE_A;
-
-       enc10->link_regs = link_regs;
-       enc10->aux_regs = aux_regs;
-       enc10->hpd_regs = hpd_regs;
-       enc10->link_shift = link_shift;
-       enc10->link_mask = link_mask;
-
-       switch (enc10->base.transmitter) {
-       case TRANSMITTER_UNIPHY_A:
-               enc10->base.preferred_engine = ENGINE_ID_DIGA;
-       break;
-       case TRANSMITTER_UNIPHY_B:
-               enc10->base.preferred_engine = ENGINE_ID_DIGB;
-       break;
-       case TRANSMITTER_UNIPHY_C:
-               enc10->base.preferred_engine = ENGINE_ID_DIGC;
-       break;
-       case TRANSMITTER_UNIPHY_D:
-               enc10->base.preferred_engine = ENGINE_ID_DIGD;
-       break;
-       case TRANSMITTER_UNIPHY_E:
-               enc10->base.preferred_engine = ENGINE_ID_DIGE;
-       break;
-       default:
-               ASSERT_CRITICAL(false);
-               enc10->base.preferred_engine = ENGINE_ID_UNKNOWN;
-       }
-
-       /* default to one to mirror Windows behavior */
-       enc10->base.features.flags.bits.HDMI_6GB_EN = 1;
-
-       if (bp_funcs->get_connector_speed_cap_info)
-               result = bp_funcs->get_connector_speed_cap_info(enc10->base.ctx->dc_bios,
-                                               enc10->base.connector, &bp_cap_info);
-
-       /* Override features with DCE-specific values */
-       if (result == BP_RESULT_OK) {
-               enc10->base.features.flags.bits.IS_HBR2_CAPABLE =
-                               bp_cap_info.DP_HBR2_EN;
-               enc10->base.features.flags.bits.IS_HBR3_CAPABLE =
-                               bp_cap_info.DP_HBR3_EN;
-               enc10->base.features.flags.bits.HDMI_6GB_EN = bp_cap_info.HDMI_6GB_EN;
-               enc10->base.features.flags.bits.IS_DP2_CAPABLE = 1;
-               enc10->base.features.flags.bits.IS_UHBR10_CAPABLE = bp_cap_info.DP_UHBR10_EN;
-               enc10->base.features.flags.bits.IS_UHBR13_5_CAPABLE = bp_cap_info.DP_UHBR13_5_EN;
-               enc10->base.features.flags.bits.IS_UHBR20_CAPABLE = bp_cap_info.DP_UHBR20_EN;
-       } else {
-               DC_LOG_WARNING("%s: Failed to get encoder_cap_info from VBIOS with error code %d!\n",
-                               __func__,
-                               result);
-       }
-       if (enc10->base.ctx->dc->debug.hdmi20_disable)
-               enc10->base.features.flags.bits.HDMI_6GB_EN = 0;
-}
diff --git a/drivers/gpu/drm/amd/display/dc/dcn321/dcn321_dio_link_encoder.h b/drivers/gpu/drm/amd/display/dc/dcn321/dcn321_dio_link_encoder.h
deleted file mode 100644 (file)
index 2205f39..0000000
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
- * Copyright 2022 Advanced Micro Devices, Inc.
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the "Software"),
- * to deal in the Software without restriction, including without limitation
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
- *  and/or sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
- * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
- * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
- * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
- * OTHER DEALINGS IN THE SOFTWARE.
- *
- * Authors: AMD
- *
- */
-
-#ifndef __DC_LINK_ENCODER__DCN321_H__
-#define __DC_LINK_ENCODER__DCN321_H__
-
-#include "dcn32/dcn32_dio_link_encoder.h"
-
-void dcn321_link_encoder_construct(
-       struct dcn20_link_encoder *enc20,
-       const struct encoder_init_data *init_data,
-       const struct encoder_feature_support *enc_features,
-       const struct dcn10_link_enc_registers *link_regs,
-       const struct dcn10_link_enc_aux_registers *aux_regs,
-       const struct dcn10_link_enc_hpd_registers *hpd_regs,
-       const struct dcn10_link_enc_shift *link_shift,
-       const struct dcn10_link_enc_mask *link_mask);
-
-
-#endif /* __DC_LINK_ENCODER__DCN321_H__ */
diff --git a/drivers/gpu/drm/amd/display/dc/dcn35/Makefile b/drivers/gpu/drm/amd/display/dc/dcn35/Makefile
deleted file mode 100644 (file)
index d0fab60..0000000
+++ /dev/null
@@ -1,19 +0,0 @@
-#
-# (c) Copyright 2022 Advanced Micro Devices, Inc. All the rights reserved
-#
-#  All rights reserved.  This notice is intended as a precaution against
-#  inadvertent publication and does not imply publication or any waiver
-#  of confidentiality.  The year included in the foregoing notice is the
-#  year of creation of the work.
-#
-#  Authors: AMD
-#
-# Makefile for DCN35.
-
-DCN35 = dcn35_dio_stream_encoder.o \
-       dcn35_dio_link_encoder.o \
-       dcn35_mmhubbub.o dcn35_opp.o dcn35_pg_cntl.o dcn35_dwb.o
-
-AMD_DAL_DCN35 = $(addprefix $(AMDDALPATH)/dc/dcn35/,$(DCN35))
-
-AMD_DISPLAY_FILES += $(AMD_DAL_DCN35)
diff --git a/drivers/gpu/drm/amd/display/dc/dcn35/dcn35_dio_link_encoder.c b/drivers/gpu/drm/amd/display/dc/dcn35/dcn35_dio_link_encoder.c
deleted file mode 100644 (file)
index d4a3e81..0000000
+++ /dev/null
@@ -1,267 +0,0 @@
-/* SPDX-License-Identifier: MIT */
-/*
- * Copyright 2023 Advanced Micro Devices, Inc.
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the "Software"),
- * to deal in the Software without restriction, including without limitation
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
- * and/or sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
- * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
- * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
- * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
- * OTHER DEALINGS IN THE SOFTWARE.
- *
- */
-
-#include "reg_helper.h"
-
-#include "core_types.h"
-#include "link_encoder.h"
-#include "dcn31/dcn31_dio_link_encoder.h"
-#include "dcn35_dio_link_encoder.h"
-#define CTX \
-       enc10->base.ctx
-#define DC_LOGGER \
-       enc10->base.ctx->logger
-
-#define REG(reg)\
-       (enc10->link_regs->reg)
-
-#undef FN
-#define FN(reg_name, field_name) \
-       enc10->link_shift->field_name, enc10->link_mask->field_name
-/*
- * @brief
- * Trigger Source Select
- * ASIC-dependent, actual values for register programming
- */
-#define DCN35_DIG_FE_SOURCE_SELECT_INVALID 0x0
-#define DCN35_DIG_FE_SOURCE_SELECT_DIGA 0x1
-#define DCN35_DIG_FE_SOURCE_SELECT_DIGB 0x2
-#define DCN35_DIG_FE_SOURCE_SELECT_DIGC 0x4
-#define DCN35_DIG_FE_SOURCE_SELECT_DIGD 0x08
-#define DCN35_DIG_FE_SOURCE_SELECT_DIGE 0x10
-
-
-bool dcn35_is_dig_enabled(struct link_encoder *enc)
-{
-       uint32_t enabled;
-       struct dcn10_link_encoder *enc10 = TO_DCN10_LINK_ENC(enc);
-
-       REG_GET(DIG_BE_CLK_CNTL, DIG_BE_CLK_EN, &enabled);
-       return (enabled == 1);
-}
-
-enum signal_type dcn35_get_dig_mode(
-       struct link_encoder *enc)
-{
-       uint32_t value;
-       struct dcn10_link_encoder *enc10 = TO_DCN10_LINK_ENC(enc);
-
-       REG_GET(DIG_BE_CLK_CNTL, DIG_BE_MODE, &value);
-       switch (value) {
-       case 0:
-               return SIGNAL_TYPE_DISPLAY_PORT;
-       case 2:
-               return SIGNAL_TYPE_DVI_SINGLE_LINK;
-       case 3:
-               return SIGNAL_TYPE_HDMI_TYPE_A;
-       case 5:
-               return SIGNAL_TYPE_DISPLAY_PORT_MST;
-       default:
-               return SIGNAL_TYPE_NONE;
-       }
-}
-
-void dcn35_link_encoder_setup(
-       struct link_encoder *enc,
-       enum signal_type signal)
-{
-       struct dcn10_link_encoder *enc10 = TO_DCN10_LINK_ENC(enc);
-
-       switch (signal) {
-       case SIGNAL_TYPE_EDP:
-       case SIGNAL_TYPE_DISPLAY_PORT:
-               /* DP SST */
-               REG_UPDATE(DIG_BE_CLK_CNTL, DIG_BE_MODE, 0);
-               break;
-       case SIGNAL_TYPE_DVI_SINGLE_LINK:
-       case SIGNAL_TYPE_DVI_DUAL_LINK:
-               /* TMDS-DVI */
-               REG_UPDATE(DIG_BE_CLK_CNTL, DIG_BE_MODE, 2);
-               break;
-       case SIGNAL_TYPE_HDMI_TYPE_A:
-               /* TMDS-HDMI */
-               REG_UPDATE(DIG_BE_CLK_CNTL, DIG_BE_MODE, 3);
-               break;
-       case SIGNAL_TYPE_DISPLAY_PORT_MST:
-               /* DP MST */
-               REG_UPDATE(DIG_BE_CLK_CNTL, DIG_BE_MODE, 5);
-               break;
-       default:
-               ASSERT_CRITICAL(false);
-               /* invalid mode ! */
-               break;
-       }
-       REG_UPDATE(DIG_BE_CLK_CNTL, DIG_BE_CLK_EN, 1);
-
-}
-
-void dcn35_link_encoder_init(struct link_encoder *enc)
-{
-       enc31_hw_init(enc);
-       dcn35_link_encoder_set_fgcg(enc, enc->ctx->dc->debug.enable_fine_grain_clock_gating.bits.dio);
-}
-
-void dcn35_link_encoder_set_fgcg(struct link_encoder *enc, bool enable)
-{
-       struct dcn10_link_encoder *enc10 = TO_DCN10_LINK_ENC(enc);
-
-       REG_UPDATE(DIO_CLK_CNTL, DIO_FGCG_REP_DIS, !enable);
-}
-
-static const struct link_encoder_funcs dcn35_link_enc_funcs = {
-       .read_state = link_enc2_read_state,
-       .validate_output_with_stream =
-                       dcn30_link_encoder_validate_output_with_stream,
-       .hw_init = dcn35_link_encoder_init,
-       .setup = dcn35_link_encoder_setup,
-       .enable_tmds_output = dcn10_link_encoder_enable_tmds_output,
-       .enable_dp_output = dcn31_link_encoder_enable_dp_output,
-       .enable_dp_mst_output = dcn31_link_encoder_enable_dp_mst_output,
-       .disable_output = dcn31_link_encoder_disable_output,
-       .dp_set_lane_settings = dcn10_link_encoder_dp_set_lane_settings,
-       .dp_set_phy_pattern = dcn10_link_encoder_dp_set_phy_pattern,
-       .update_mst_stream_allocation_table =
-               dcn10_link_encoder_update_mst_stream_allocation_table,
-       .psr_program_dp_dphy_fast_training =
-                       dcn10_psr_program_dp_dphy_fast_training,
-       .psr_program_secondary_packet = dcn10_psr_program_secondary_packet,
-       .connect_dig_be_to_fe = dcn10_link_encoder_connect_dig_be_to_fe,
-       .enable_hpd = dcn10_link_encoder_enable_hpd,
-       .disable_hpd = dcn10_link_encoder_disable_hpd,
-       .is_dig_enabled = dcn35_is_dig_enabled,
-       .destroy = dcn10_link_encoder_destroy,
-       .fec_set_enable = enc2_fec_set_enable,
-       .fec_set_ready = enc2_fec_set_ready,
-       .fec_is_active = enc2_fec_is_active,
-       .get_dig_frontend = dcn10_get_dig_frontend,
-       .get_dig_mode = dcn35_get_dig_mode,
-       .is_in_alt_mode = dcn31_link_encoder_is_in_alt_mode,
-       .get_max_link_cap = dcn31_link_encoder_get_max_link_cap,
-       .set_dio_phy_mux = dcn31_link_encoder_set_dio_phy_mux,
-};
-
-void dcn35_link_encoder_construct(
-       struct dcn20_link_encoder *enc20,
-       const struct encoder_init_data *init_data,
-       const struct encoder_feature_support *enc_features,
-       const struct dcn10_link_enc_registers *link_regs,
-       const struct dcn10_link_enc_aux_registers *aux_regs,
-       const struct dcn10_link_enc_hpd_registers *hpd_regs,
-       const struct dcn10_link_enc_shift *link_shift,
-       const struct dcn10_link_enc_mask *link_mask)
-{
-       struct bp_connector_speed_cap_info bp_cap_info = {0};
-       const struct dc_vbios_funcs *bp_funcs = init_data->ctx->dc_bios->funcs;
-       enum bp_result result = BP_RESULT_OK;
-       struct dcn10_link_encoder *enc10 = &enc20->enc10;
-
-       enc10->base.funcs = &dcn35_link_enc_funcs;
-       enc10->base.ctx = init_data->ctx;
-       enc10->base.id = init_data->encoder;
-
-       enc10->base.hpd_source = init_data->hpd_source;
-       enc10->base.connector = init_data->connector;
-
-       enc10->base.preferred_engine = ENGINE_ID_UNKNOWN;
-
-       enc10->base.features = *enc_features;
-
-       if (enc10->base.connector.id == CONNECTOR_ID_USBC)
-               enc10->base.features.flags.bits.DP_IS_USB_C = 1;
-
-       enc10->base.transmitter = init_data->transmitter;
-
-       /* set the flag to indicate whether driver poll the I2C data pin
-        * while doing the DP sink detect
-        */
-
-/*     if (dal_adapter_service_is_feature_supported(as,
- *             FEATURE_DP_SINK_DETECT_POLL_DATA_PIN))
- *             enc10->base.features.flags.bits.
- *                     DP_SINK_DETECT_POLL_DATA_PIN = true;
- */
-
-       enc10->base.output_signals =
-               SIGNAL_TYPE_DVI_SINGLE_LINK |
-               SIGNAL_TYPE_DVI_DUAL_LINK |
-               SIGNAL_TYPE_LVDS |
-               SIGNAL_TYPE_DISPLAY_PORT |
-               SIGNAL_TYPE_DISPLAY_PORT_MST |
-               SIGNAL_TYPE_EDP |
-               SIGNAL_TYPE_HDMI_TYPE_A;
-
-       enc10->link_regs = link_regs;
-       enc10->aux_regs = aux_regs;
-       enc10->hpd_regs = hpd_regs;
-       enc10->link_shift = link_shift;
-       enc10->link_mask = link_mask;
-
-       switch (enc10->base.transmitter) {
-       case TRANSMITTER_UNIPHY_A:
-               enc10->base.preferred_engine = ENGINE_ID_DIGA;
-       break;
-       case TRANSMITTER_UNIPHY_B:
-               enc10->base.preferred_engine = ENGINE_ID_DIGB;
-       break;
-       case TRANSMITTER_UNIPHY_C:
-               enc10->base.preferred_engine = ENGINE_ID_DIGC;
-       break;
-       case TRANSMITTER_UNIPHY_D:
-               enc10->base.preferred_engine = ENGINE_ID_DIGD;
-       break;
-       case TRANSMITTER_UNIPHY_E:
-               enc10->base.preferred_engine = ENGINE_ID_DIGE;
-       break;
-       default:
-               ASSERT_CRITICAL(false);
-               enc10->base.preferred_engine = ENGINE_ID_UNKNOWN;
-       }
-
-       enc10->base.features.flags.bits.HDMI_6GB_EN = 1;
-
-       if (bp_funcs->get_connector_speed_cap_info)
-               result = bp_funcs->get_connector_speed_cap_info(enc10->base.ctx->dc_bios,
-                                               enc10->base.connector, &bp_cap_info);
-
-       /* Override features with DCE-specific values */
-       if (result == BP_RESULT_OK) {
-               enc10->base.features.flags.bits.IS_HBR2_CAPABLE =
-                               bp_cap_info.DP_HBR2_EN;
-               enc10->base.features.flags.bits.IS_HBR3_CAPABLE =
-                               bp_cap_info.DP_HBR3_EN;
-               enc10->base.features.flags.bits.HDMI_6GB_EN = bp_cap_info.HDMI_6GB_EN;
-               enc10->base.features.flags.bits.IS_DP2_CAPABLE = 1;
-               enc10->base.features.flags.bits.IS_UHBR10_CAPABLE = bp_cap_info.DP_UHBR10_EN;
-               enc10->base.features.flags.bits.IS_UHBR13_5_CAPABLE = bp_cap_info.DP_UHBR13_5_EN;
-               enc10->base.features.flags.bits.IS_UHBR20_CAPABLE = bp_cap_info.DP_UHBR20_EN;
-
-       } else {
-               DC_LOG_WARNING("%s: Failed to get encoder_cap_info from VBIOS with error code %d!\n",
-                               __func__,
-                               result);
-       }
-       if (enc10->base.ctx->dc->debug.hdmi20_disable)
-               enc10->base.features.flags.bits.HDMI_6GB_EN = 0;
-
-}
diff --git a/drivers/gpu/drm/amd/display/dc/dcn35/dcn35_dio_link_encoder.h b/drivers/gpu/drm/amd/display/dc/dcn35/dcn35_dio_link_encoder.h
deleted file mode 100644 (file)
index d546a36..0000000
+++ /dev/null
@@ -1,147 +0,0 @@
-/* SPDX-License-Identifier: MIT */
-/*
- * Copyright 2023 Advanced Micro Devices, Inc.
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the "Software"),
- * to deal in the Software without restriction, including without limitation
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
- * and/or sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
- * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
- * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
- * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
- * OTHER DEALINGS IN THE SOFTWARE.
- *
- */
-
-#ifndef __DC_LINK_ENCODER__DCN35_H__
-#define __DC_LINK_ENCODER__DCN35_H__
-
-#include "dcn32/dcn32_dio_link_encoder.h"
-#include "dcn30/dcn30_dio_link_encoder.h"
-#include "dcn31/dcn31_dio_link_encoder.h"
-
-#define LINK_ENCODER_MASK_SH_LIST_DCN35(mask_sh) \
-       LE_SF(DIG0_DIG_BE_EN_CNTL, DIG_BE_ENABLE, mask_sh),\
-       LE_SF(DIG0_DIG_BE_CNTL, DIG_RB_SWITCH_EN, mask_sh),\
-       LE_SF(DIG0_DIG_BE_CNTL, DIG_HPD_SELECT, mask_sh),\
-       LE_SF(DIG0_DIG_BE_CNTL, DIG_FE_SOURCE_SELECT, mask_sh),\
-       LE_SF(DIG0_DIG_BE_CLK_CNTL, DIG_BE_MODE, mask_sh),\
-       LE_SF(DIG0_DIG_BE_CLK_CNTL, DIG_BE_CLK_EN, mask_sh),\
-       LE_SF(DIG0_DIG_BE_CLK_CNTL, DIG_BE_SOFT_RESET, mask_sh),\
-       LE_SF(DIG0_DIG_BE_CLK_CNTL, HDCP_SOFT_RESET, mask_sh),\
-       LE_SF(DIG0_DIG_BE_CLK_CNTL, DIG_BE_SYMCLK_G_CLOCK_ON, mask_sh),\
-       LE_SF(DIG0_DIG_BE_CLK_CNTL, DIG_BE_SYMCLK_G_HDCP_CLOCK_ON, mask_sh),\
-       LE_SF(DIG0_DIG_BE_CLK_CNTL, DIG_BE_SYMCLK_G_TMDS_CLOCK_ON, mask_sh),\
-       LE_SF(DIG0_DIG_CLOCK_PATTERN, DIG_CLOCK_PATTERN, mask_sh),\
-       LE_SF(DIG0_TMDS_CTL_BITS, TMDS_CTL0, mask_sh), \
-       LE_SF(DP0_DP_DPHY_CNTL, DPHY_BYPASS, mask_sh),\
-       LE_SF(DP0_DP_DPHY_CNTL, DPHY_ATEST_SEL_LANE0, mask_sh),\
-       LE_SF(DP0_DP_DPHY_CNTL, DPHY_ATEST_SEL_LANE1, mask_sh),\
-       LE_SF(DP0_DP_DPHY_CNTL, DPHY_ATEST_SEL_LANE2, mask_sh),\
-       LE_SF(DP0_DP_DPHY_CNTL, DPHY_ATEST_SEL_LANE3, mask_sh),\
-       LE_SF(DP0_DP_DPHY_PRBS_CNTL, DPHY_PRBS_EN, mask_sh),\
-       LE_SF(DP0_DP_DPHY_PRBS_CNTL, DPHY_PRBS_SEL, mask_sh),\
-       LE_SF(DP0_DP_DPHY_SYM0, DPHY_SYM1, mask_sh),\
-       LE_SF(DP0_DP_DPHY_SYM0, DPHY_SYM2, mask_sh),\
-       LE_SF(DP0_DP_DPHY_SYM0, DPHY_SYM3, mask_sh),\
-       LE_SF(DP0_DP_DPHY_SYM1, DPHY_SYM4, mask_sh),\
-       LE_SF(DP0_DP_DPHY_SYM1, DPHY_SYM5, mask_sh),\
-       LE_SF(DP0_DP_DPHY_SYM1, DPHY_SYM6, mask_sh),\
-       LE_SF(DP0_DP_DPHY_SYM2, DPHY_SYM7, mask_sh),\
-       LE_SF(DP0_DP_DPHY_SYM2, DPHY_SYM8, mask_sh),\
-       LE_SF(DP0_DP_DPHY_SCRAM_CNTL, DPHY_SCRAMBLER_BS_COUNT, mask_sh),\
-       LE_SF(DP0_DP_DPHY_SCRAM_CNTL, DPHY_SCRAMBLER_ADVANCE, mask_sh),\
-       LE_SF(DP0_DP_DPHY_FAST_TRAINING, DPHY_RX_FAST_TRAINING_CAPABLE, mask_sh),\
-       LE_SF(DP0_DP_DPHY_BS_SR_SWAP_CNTL, DPHY_LOAD_BS_COUNT, mask_sh),\
-       LE_SF(DP0_DP_DPHY_TRAINING_PATTERN_SEL, DPHY_TRAINING_PATTERN_SEL, mask_sh),\
-       LE_SF(DP0_DP_DPHY_HBR2_PATTERN_CONTROL, DP_DPHY_HBR2_PATTERN_CONTROL, mask_sh),\
-       LE_SF(DP0_DP_LINK_CNTL, DP_LINK_TRAINING_COMPLETE, mask_sh),\
-       LE_SF(DP0_DP_LINK_FRAMING_CNTL, DP_IDLE_BS_INTERVAL, mask_sh),\
-       LE_SF(DP0_DP_LINK_FRAMING_CNTL, DP_VBID_DISABLE, mask_sh),\
-       LE_SF(DP0_DP_LINK_FRAMING_CNTL, DP_VID_ENHANCED_FRAME_MODE, mask_sh),\
-       LE_SF(DP0_DP_VID_STREAM_CNTL, DP_VID_STREAM_ENABLE, mask_sh),\
-       LE_SF(DP0_DP_CONFIG, DP_UDI_LANES, mask_sh),\
-       LE_SF(DP0_DP_SEC_CNTL1, DP_SEC_GSP0_LINE_NUM, mask_sh),\
-       LE_SF(DP0_DP_SEC_CNTL1, DP_SEC_GSP0_PRIORITY, mask_sh),\
-       LE_SF(DP0_DP_MSE_SAT0, DP_MSE_SAT_SRC0, mask_sh),\
-       LE_SF(DP0_DP_MSE_SAT0, DP_MSE_SAT_SRC1, mask_sh),\
-       LE_SF(DP0_DP_MSE_SAT0, DP_MSE_SAT_SLOT_COUNT0, mask_sh),\
-       LE_SF(DP0_DP_MSE_SAT0, DP_MSE_SAT_SLOT_COUNT1, mask_sh),\
-       LE_SF(DP0_DP_MSE_SAT1, DP_MSE_SAT_SRC2, mask_sh),\
-       LE_SF(DP0_DP_MSE_SAT1, DP_MSE_SAT_SRC3, mask_sh),\
-       LE_SF(DP0_DP_MSE_SAT1, DP_MSE_SAT_SLOT_COUNT2, mask_sh),\
-       LE_SF(DP0_DP_MSE_SAT1, DP_MSE_SAT_SLOT_COUNT3, mask_sh),\
-       LE_SF(DP0_DP_MSE_SAT_UPDATE, DP_MSE_SAT_UPDATE, mask_sh),\
-       LE_SF(DP0_DP_MSE_SAT_UPDATE, DP_MSE_16_MTP_KEEPOUT, mask_sh),\
-       LE_SF(DP_AUX0_AUX_CONTROL, AUX_HPD_SEL, mask_sh),\
-       LE_SF(DP_AUX0_AUX_CONTROL, AUX_LS_READ_EN, mask_sh),\
-       LE_SF(DP_AUX0_AUX_DPHY_RX_CONTROL0, AUX_RX_RECEIVE_WINDOW, mask_sh),\
-       LE_SF(HPD0_DC_HPD_CONTROL, DC_HPD_EN, mask_sh),\
-       LE_SF(DP0_DP_DPHY_CNTL, DPHY_FEC_EN, mask_sh),\
-       LE_SF(DP0_DP_DPHY_CNTL, DPHY_FEC_READY_SHADOW, mask_sh),\
-       LE_SF(DP0_DP_DPHY_CNTL, DPHY_FEC_ACTIVE_STATUS, mask_sh),\
-       LE_SF(DIG0_TMDS_CTL_BITS, TMDS_CTL0, mask_sh), \
-       LE_SF(DP_AUX0_AUX_DPHY_RX_CONTROL0, AUX_RX_START_WINDOW, mask_sh),\
-       LE_SF(DP_AUX0_AUX_DPHY_RX_CONTROL0, AUX_RX_HALF_SYM_DETECT_LEN, mask_sh),\
-       LE_SF(DP_AUX0_AUX_DPHY_RX_CONTROL0, AUX_RX_TRANSITION_FILTER_EN, mask_sh),\
-       LE_SF(DP_AUX0_AUX_DPHY_RX_CONTROL0, AUX_RX_ALLOW_BELOW_THRESHOLD_PHASE_DETECT, mask_sh),\
-       LE_SF(DP_AUX0_AUX_DPHY_RX_CONTROL0, AUX_RX_ALLOW_BELOW_THRESHOLD_START, mask_sh),\
-       LE_SF(DP_AUX0_AUX_DPHY_RX_CONTROL0, AUX_RX_ALLOW_BELOW_THRESHOLD_STOP, mask_sh),\
-       LE_SF(DP_AUX0_AUX_DPHY_RX_CONTROL0, AUX_RX_PHASE_DETECT_LEN, mask_sh),\
-       LE_SF(DP_AUX0_AUX_DPHY_RX_CONTROL0, AUX_RX_DETECTION_THRESHOLD, mask_sh), \
-       LE_SF(DP_AUX0_AUX_DPHY_TX_CONTROL, AUX_TX_PRECHARGE_LEN, mask_sh),\
-       LE_SF(DP_AUX0_AUX_DPHY_TX_CONTROL, AUX_TX_PRECHARGE_SYMBOLS, mask_sh),\
-       LE_SF(DP_AUX0_AUX_DPHY_TX_CONTROL, AUX_MODE_DET_CHECK_DELAY, mask_sh),\
-       LE_SF(DP_AUX0_AUX_DPHY_RX_CONTROL1, AUX_RX_PRECHARGE_SKIP, mask_sh),\
-       LE_SF(DP_AUX0_AUX_DPHY_RX_CONTROL1, AUX_RX_TIMEOUT_LEN, mask_sh),\
-       LE_SF(DP_AUX0_AUX_DPHY_RX_CONTROL1, AUX_RX_TIMEOUT_LEN_MUL, mask_sh),\
-       LE_SF(DIO_LINKA_CNTL, ENC_TYPE_SEL, mask_sh),\
-       LE_SF(DIO_LINKA_CNTL, HPO_DP_ENC_SEL, mask_sh),\
-       LE_SF(DIO_LINKA_CNTL, HPO_HDMI_ENC_SEL, mask_sh),\
-       LE_SF(DIO_CLK_CNTL, DISPCLK_R_GATE_DIS, mask_sh),\
-       LE_SF(DIO_CLK_CNTL, DISPCLK_G_GATE_DIS, mask_sh),\
-       LE_SF(DIO_CLK_CNTL, REFCLK_R_GATE_DIS, mask_sh),\
-       LE_SF(DIO_CLK_CNTL, REFCLK_G_GATE_DIS, mask_sh),\
-       LE_SF(DIO_CLK_CNTL, SOCCLK_G_GATE_DIS, mask_sh),\
-       LE_SF(DIO_CLK_CNTL, SYMCLK_FE_R_GATE_DIS, mask_sh),\
-       LE_SF(DIO_CLK_CNTL, SYMCLK_FE_G_GATE_DIS, mask_sh),\
-       LE_SF(DIO_CLK_CNTL, SYMCLK_R_GATE_DIS, mask_sh),\
-       LE_SF(DIO_CLK_CNTL, SYMCLK_G_GATE_DIS, mask_sh),\
-       LE_SF(DIO_CLK_CNTL, DIO_FGCG_REP_DIS, mask_sh),\
-       LE_SF(DIO_CLK_CNTL, DISPCLK_G_HDCP_GATE_DIS, mask_sh),\
-       LE_SF(DIO_CLK_CNTL, SYMCLKA_G_HDCP_GATE_DIS, mask_sh),\
-       LE_SF(DIO_CLK_CNTL, SYMCLKB_G_HDCP_GATE_DIS, mask_sh),\
-       LE_SF(DIO_CLK_CNTL, SYMCLKC_G_HDCP_GATE_DIS, mask_sh),\
-       LE_SF(DIO_CLK_CNTL, SYMCLKD_G_HDCP_GATE_DIS, mask_sh),\
-       LE_SF(DIO_CLK_CNTL, SYMCLKE_G_HDCP_GATE_DIS, mask_sh),\
-       LE_SF(DIO_CLK_CNTL, SYMCLKF_G_HDCP_GATE_DIS, mask_sh),\
-       LE_SF(DIO_CLK_CNTL, SYMCLKG_G_HDCP_GATE_DIS, mask_sh)
-
-
-void dcn35_link_encoder_construct(
-       struct dcn20_link_encoder *enc20,
-       const struct encoder_init_data *init_data,
-       const struct encoder_feature_support *enc_features,
-       const struct dcn10_link_enc_registers *link_regs,
-       const struct dcn10_link_enc_aux_registers *aux_regs,
-       const struct dcn10_link_enc_hpd_registers *hpd_regs,
-       const struct dcn10_link_enc_shift *link_shift,
-       const struct dcn10_link_enc_mask *link_mask);
-
-void dcn35_link_encoder_init(struct link_encoder *enc);
-void dcn35_link_encoder_set_fgcg(struct link_encoder *enc, bool enabled);
-bool dcn35_is_dig_enabled(struct link_encoder *enc);
-
-enum signal_type dcn35_get_dig_mode(struct link_encoder *enc);
-void dcn35_link_encoder_setup(struct link_encoder *enc, enum signal_type signal);
-
-#endif /* __DC_LINK_ENCODER__DCN35_H__ */
diff --git a/drivers/gpu/drm/amd/display/dc/dcn35/dcn35_dio_stream_encoder.c b/drivers/gpu/drm/amd/display/dc/dcn35/dcn35_dio_stream_encoder.c
deleted file mode 100644 (file)
index 6a179e5..0000000
+++ /dev/null
@@ -1,493 +0,0 @@
-/* SPDX-License-Identifier: MIT */
-/*
- * Copyright 2023 Advanced Micro Devices, Inc.
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the "Software"),
- * to deal in the Software without restriction, including without limitation
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
- * and/or sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
- * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
- * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
- * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
- * OTHER DEALINGS IN THE SOFTWARE.
- *
- */
-
-
-#include "dc_bios_types.h"
-#include "dcn30/dcn30_dio_stream_encoder.h"
-#include "dcn314/dcn314_dio_stream_encoder.h"
-#include "dcn32/dcn32_dio_stream_encoder.h"
-#include "dcn35_dio_stream_encoder.h"
-#include "reg_helper.h"
-#include "hw_shared.h"
-#include "link.h"
-#include "dpcd_defs.h"
-
-#define DC_LOGGER \
-               enc1->base.ctx->logger
-
-#define REG(reg)\
-       (enc1->regs->reg)
-
-#undef FN
-#define FN(reg_name, field_name) \
-       enc1->se_shift->field_name, enc1->se_mask->field_name
-
-#define VBI_LINE_0 0
-#define HDMI_CLOCK_CHANNEL_RATE_MORE_340M 340000
-
-#define CTX \
-       enc1->base.ctx
-/* setup stream encoder in dvi mode */
-static void enc35_stream_encoder_dvi_set_stream_attribute(
-       struct stream_encoder *enc,
-       struct dc_crtc_timing *crtc_timing,
-       bool is_dual_link)
-{
-       struct dcn10_stream_encoder *enc1 = DCN10STRENC_FROM_STRENC(enc);
-
-       if (!enc->ctx->dc->debug.avoid_vbios_exec_table) {
-               struct bp_encoder_control cntl = {0};
-
-               cntl.action = ENCODER_CONTROL_SETUP;
-               cntl.engine_id = enc1->base.id;
-               cntl.signal = is_dual_link ?
-                       SIGNAL_TYPE_DVI_DUAL_LINK : SIGNAL_TYPE_DVI_SINGLE_LINK;
-               cntl.enable_dp_audio = false;
-               cntl.pixel_clock = crtc_timing->pix_clk_100hz / 10;
-               cntl.lanes_number = (is_dual_link) ? LANE_COUNT_EIGHT : LANE_COUNT_FOUR;
-
-               if (enc1->base.bp->funcs->encoder_control(
-                               enc1->base.bp, &cntl) != BP_RESULT_OK)
-                       return;
-
-       } else {
-
-               //Set pattern for clock channel, default vlue 0x63 does not work
-               REG_UPDATE(DIG_CLOCK_PATTERN, DIG_CLOCK_PATTERN, 0x1F);
-
-               //DIG_BE_TMDS_DVI_MODE : TMDS-DVI mode is already set in link_encoder_setup
-
-               //DIG_SOURCE_SELECT is already set in dig_connect_to_otg
-
-               /* DIG_START is removed from the register spec */
-       }
-
-       ASSERT(crtc_timing->pixel_encoding == PIXEL_ENCODING_RGB);
-       ASSERT(crtc_timing->display_color_depth == COLOR_DEPTH_888);
-       enc1_stream_encoder_set_stream_attribute_helper(enc1, crtc_timing);
-}
-/* setup stream encoder in hdmi mode */
-static void enc35_stream_encoder_hdmi_set_stream_attribute(
-       struct stream_encoder *enc,
-       struct dc_crtc_timing *crtc_timing,
-       int actual_pix_clk_khz,
-       bool enable_audio)
-{
-       struct dcn10_stream_encoder *enc1 = DCN10STRENC_FROM_STRENC(enc);
-
-       if (!enc->ctx->dc->debug.avoid_vbios_exec_table) {
-               struct bp_encoder_control cntl = {0};
-
-               cntl.action = ENCODER_CONTROL_SETUP;
-               cntl.engine_id = enc1->base.id;
-               cntl.signal = SIGNAL_TYPE_HDMI_TYPE_A;
-               cntl.enable_dp_audio = enable_audio;
-               cntl.pixel_clock = actual_pix_clk_khz;
-               cntl.lanes_number = LANE_COUNT_FOUR;
-
-               if (enc1->base.bp->funcs->encoder_control(
-                               enc1->base.bp, &cntl) != BP_RESULT_OK)
-                       return;
-
-       } else {
-
-               //Set pattern for clock channel, default vlue 0x63 does not work
-               REG_UPDATE(DIG_CLOCK_PATTERN, DIG_CLOCK_PATTERN, 0x1F);
-
-               //DIG_BE_TMDS_HDMI_MODE : TMDS-HDMI mode is already set in link_encoder_setup
-
-               //DIG_SOURCE_SELECT is already set in dig_connect_to_otg
-
-               /* DIG_START is removed from the register spec */
-               enc314_enable_fifo(enc);
-       }
-
-       /* Configure pixel encoding */
-       enc1_stream_encoder_set_stream_attribute_helper(enc1, crtc_timing);
-
-       /* setup HDMI engine */
-       REG_UPDATE_6(HDMI_CONTROL,
-               HDMI_PACKET_GEN_VERSION, 1,
-               HDMI_KEEPOUT_MODE, 1,
-               HDMI_DEEP_COLOR_ENABLE, 0,
-               HDMI_DATA_SCRAMBLE_EN, 0,
-               HDMI_NO_EXTRA_NULL_PACKET_FILLED, 1,
-               HDMI_CLOCK_CHANNEL_RATE, 0);
-
-       /* Configure color depth */
-       switch (crtc_timing->display_color_depth) {
-       case COLOR_DEPTH_888:
-               REG_UPDATE(HDMI_CONTROL, HDMI_DEEP_COLOR_DEPTH, 0);
-               break;
-       case COLOR_DEPTH_101010:
-               if (crtc_timing->pixel_encoding == PIXEL_ENCODING_YCBCR422) {
-                       REG_UPDATE_2(HDMI_CONTROL,
-                                       HDMI_DEEP_COLOR_DEPTH, 1,
-                                       HDMI_DEEP_COLOR_ENABLE, 0);
-               } else {
-                       REG_UPDATE_2(HDMI_CONTROL,
-                                       HDMI_DEEP_COLOR_DEPTH, 1,
-                                       HDMI_DEEP_COLOR_ENABLE, 1);
-                       }
-               break;
-       case COLOR_DEPTH_121212:
-               if (crtc_timing->pixel_encoding == PIXEL_ENCODING_YCBCR422) {
-                       REG_UPDATE_2(HDMI_CONTROL,
-                                       HDMI_DEEP_COLOR_DEPTH, 2,
-                                       HDMI_DEEP_COLOR_ENABLE, 0);
-               } else {
-                       REG_UPDATE_2(HDMI_CONTROL,
-                                       HDMI_DEEP_COLOR_DEPTH, 2,
-                                       HDMI_DEEP_COLOR_ENABLE, 1);
-                       }
-               break;
-       case COLOR_DEPTH_161616:
-               REG_UPDATE_2(HDMI_CONTROL,
-                               HDMI_DEEP_COLOR_DEPTH, 3,
-                               HDMI_DEEP_COLOR_ENABLE, 1);
-               break;
-       default:
-               break;
-       }
-
-       if (actual_pix_clk_khz >= HDMI_CLOCK_CHANNEL_RATE_MORE_340M) {
-               /* enable HDMI data scrambler
-                * HDMI_CLOCK_CHANNEL_RATE_MORE_340M
-                * Clock channel frequency is 1/4 of character rate.
-                */
-               REG_UPDATE_2(HDMI_CONTROL,
-                       HDMI_DATA_SCRAMBLE_EN, 1,
-                       HDMI_CLOCK_CHANNEL_RATE, 1);
-       } else if (crtc_timing->flags.LTE_340MCSC_SCRAMBLE) {
-
-               /* TODO: New feature for DCE11, still need to implement */
-
-               /* enable HDMI data scrambler
-                * HDMI_CLOCK_CHANNEL_FREQ_EQUAL_TO_CHAR_RATE
-                * Clock channel frequency is the same
-                * as character rate
-                */
-               REG_UPDATE_2(HDMI_CONTROL,
-                       HDMI_DATA_SCRAMBLE_EN, 1,
-                       HDMI_CLOCK_CHANNEL_RATE, 0);
-       }
-
-
-       /* Enable transmission of General Control packet on every frame */
-       REG_UPDATE_3(HDMI_VBI_PACKET_CONTROL,
-               HDMI_GC_CONT, 1,
-               HDMI_GC_SEND, 1,
-               HDMI_NULL_SEND, 1);
-
-       /* Disable Audio Content Protection packet transmission */
-       REG_UPDATE(HDMI_VBI_PACKET_CONTROL, HDMI_ACP_SEND, 0);
-
-       /* following belongs to audio */
-       /* Enable Audio InfoFrame packet transmission. */
-       REG_UPDATE(HDMI_INFOFRAME_CONTROL0, HDMI_AUDIO_INFO_SEND, 1);
-
-       /* update double-buffered AUDIO_INFO registers immediately */
-       ASSERT(enc->afmt);
-       enc->afmt->funcs->audio_info_immediate_update(enc->afmt);
-
-       /* Select line number on which to send Audio InfoFrame packets */
-       REG_UPDATE(HDMI_INFOFRAME_CONTROL1, HDMI_AUDIO_INFO_LINE,
-                               VBI_LINE_0 + 2);
-
-       /* set HDMI GC AVMUTE */
-       REG_UPDATE(HDMI_GC, HDMI_GC_AVMUTE, 0);
-       switch (crtc_timing->pixel_encoding) {
-       case PIXEL_ENCODING_YCBCR422:
-               REG_UPDATE(HDMI_CONTROL, TMDS_PIXEL_ENCODING, 1);
-       break;
-       default:
-               REG_UPDATE(HDMI_CONTROL, TMDS_PIXEL_ENCODING, 0);
-       break;
-       }
-       REG_UPDATE(HDMI_CONTROL, TMDS_COLOR_FORMAT, 0);
-}
-
-
-
-static void enc35_stream_encoder_enable(
-       struct stream_encoder *enc,
-       enum signal_type signal,
-       bool enable)
-{
-       struct dcn10_stream_encoder *enc1 = DCN10STRENC_FROM_STRENC(enc);
-
-       if (enable) {
-               switch (signal) {
-               case SIGNAL_TYPE_DVI_SINGLE_LINK:
-               case SIGNAL_TYPE_DVI_DUAL_LINK:
-                       /* TMDS-DVI */
-                       REG_UPDATE(DIG_FE_CLK_CNTL, DIG_FE_MODE, 2);
-                       break;
-               case SIGNAL_TYPE_HDMI_TYPE_A:
-                       /* TMDS-HDMI */
-                       REG_UPDATE(DIG_FE_CLK_CNTL, DIG_FE_MODE, 3);
-                       break;
-               case SIGNAL_TYPE_DISPLAY_PORT_MST:
-                       /* DP MST */
-                       REG_UPDATE(DIG_FE_CLK_CNTL, DIG_FE_MODE, 5);
-                       break;
-               case SIGNAL_TYPE_EDP:
-               case SIGNAL_TYPE_DISPLAY_PORT:
-               case SIGNAL_TYPE_VIRTUAL:
-                       /* DP SST */
-                       REG_UPDATE(DIG_FE_CLK_CNTL, DIG_FE_MODE, 0);
-                       break;
-               default:
-                       /* invalid mode ! */
-                       ASSERT_CRITICAL(false);
-               }
-       }
-}
-
-static bool is_two_pixels_per_containter(const struct dc_crtc_timing *timing)
-{
-       bool two_pix = timing->pixel_encoding == PIXEL_ENCODING_YCBCR420;
-
-       two_pix = two_pix || (timing->flags.DSC && timing->pixel_encoding == PIXEL_ENCODING_YCBCR422
-                       && !timing->dsc_cfg.ycbcr422_simple);
-       return two_pix;
-}
-
-static void enc35_stream_encoder_dp_unblank(
-               struct dc_link *link,
-               struct stream_encoder *enc,
-               const struct encoder_unblank_param *param)
-{
-       struct dcn10_stream_encoder *enc1 = DCN10STRENC_FROM_STRENC(enc);
-
-       if (param->link_settings.link_rate != LINK_RATE_UNKNOWN) {
-               uint32_t n_vid = 0x8000;
-               uint32_t m_vid;
-               uint32_t n_multiply = 0;
-               uint32_t pix_per_cycle = 0;
-               uint64_t m_vid_l = n_vid;
-
-               /* YCbCr 4:2:0 : Computed VID_M will be 2X the input rate */
-               if (is_two_pixels_per_containter(&param->timing) || param->opp_cnt > 1
-                       || param->pix_per_cycle > 1) {
-                       /*this logic should be the same in get_pixel_clock_parameters() */
-                       n_multiply = 1;
-                       pix_per_cycle = 1;
-               }
-               /* M / N = Fstream / Flink
-                * m_vid / n_vid = pixel rate / link rate
-                */
-
-               m_vid_l *= param->timing.pix_clk_100hz / 10;
-               m_vid_l = div_u64(m_vid_l,
-                       param->link_settings.link_rate
-                               * LINK_RATE_REF_FREQ_IN_KHZ);
-
-               m_vid = (uint32_t) m_vid_l;
-
-               /* enable auto measurement */
-
-               REG_UPDATE(DP_VID_TIMING, DP_VID_M_N_GEN_EN, 0);
-
-               /* auto measurement need 1 full 0x8000 symbol cycle to kick in,
-                * therefore program initial value for Mvid and Nvid
-                */
-
-               REG_UPDATE(DP_VID_N, DP_VID_N, n_vid);
-
-               REG_UPDATE(DP_VID_M, DP_VID_M, m_vid);
-
-               REG_UPDATE_2(DP_VID_TIMING,
-                               DP_VID_M_N_GEN_EN, 1,
-                               DP_VID_N_MUL, n_multiply);
-
-               REG_UPDATE(DP_PIXEL_FORMAT,
-                               DP_PIXEL_PER_CYCLE_PROCESSING_MODE,
-                               pix_per_cycle);
-       }
-
-       /* make sure stream is disabled before resetting steer fifo */
-       REG_UPDATE(DP_VID_STREAM_CNTL, DP_VID_STREAM_ENABLE, false);
-       REG_WAIT(DP_VID_STREAM_CNTL, DP_VID_STREAM_STATUS, 0, 10, 5000);
-
-       /* DIG_START is removed from the register spec */
-
-       /* switch DP encoder to CRTC data, but reset it the fifo first. It may happen
-        * that it overflows during mode transition, and sometimes doesn't recover.
-        */
-       REG_UPDATE(DP_STEER_FIFO, DP_STEER_FIFO_RESET, 1);
-       udelay(10);
-
-       REG_UPDATE(DP_STEER_FIFO, DP_STEER_FIFO_RESET, 0);
-
-       /* wait 100us for DIG/DP logic to prime
-        * (i.e. a few video lines)
-        */
-       udelay(100);
-
-       /* the hardware would start sending video at the start of the next DP
-        * frame (i.e. rising edge of the vblank).
-        * NOTE: We used to program DP_VID_STREAM_DIS_DEFER = 2 here, but this
-        * register has no effect on enable transition! HW always makes sure
-        * VID_STREAM enable at start of next frame, and this is not
-        * programmable
-        */
-
-       REG_UPDATE(DP_VID_STREAM_CNTL, DP_VID_STREAM_ENABLE, true);
-
-       /*
-        * DIG Resync FIFO now needs to be explicitly enabled.
-        * This should come after DP_VID_STREAM_ENABLE per HW docs.
-        */
-       enc314_enable_fifo(enc);
-
-       link->dc->link_srv->dp_trace_source_sequence(link, DPCD_SOURCE_SEQ_AFTER_ENABLE_DP_VID_STREAM);
-}
-
-static void enc35_stream_encoder_map_to_link(
-               struct stream_encoder *enc,
-               uint32_t stream_enc_inst,
-               uint32_t link_enc_inst)
-{
-       struct dcn10_stream_encoder *enc1 = DCN10STRENC_FROM_STRENC(enc);
-
-       ASSERT(stream_enc_inst < 5 && link_enc_inst < 5);
-       REG_UPDATE(STREAM_MAPPER_CONTROL,
-                               DIG_STREAM_LINK_TARGET, link_enc_inst);
-}
-
-static void enc35_reset_fifo(struct stream_encoder *enc, bool reset)
-{
-       struct dcn10_stream_encoder *enc1 = DCN10STRENC_FROM_STRENC(enc);
-       uint32_t reset_val = reset ? 1 : 0;
-       uint32_t is_symclk_on;
-
-       REG_UPDATE(DIG_FIFO_CTRL0, DIG_FIFO_RESET, reset_val);
-       REG_GET(DIG_FE_CLK_CNTL, DIG_FE_SYMCLK_FE_G_CLOCK_ON, &is_symclk_on);
-
-       if (is_symclk_on)
-               REG_WAIT(DIG_FIFO_CTRL0, DIG_FIFO_RESET_DONE, reset_val, 10, 5000);
-       else
-               udelay(10);
-}
-
-void enc35_disable_fifo(struct stream_encoder *enc)
-{
-       struct dcn10_stream_encoder *enc1 = DCN10STRENC_FROM_STRENC(enc);
-
-       REG_UPDATE(DIG_FIFO_CTRL0, DIG_FIFO_ENABLE, 0);
-       REG_UPDATE(DIG_FE_EN_CNTL, DIG_FE_ENABLE, 0);
-       REG_UPDATE(DIG_FE_CLK_CNTL, DIG_FE_CLK_EN, 0);
-}
-
-void enc35_enable_fifo(struct stream_encoder *enc)
-{
-       struct dcn10_stream_encoder *enc1 = DCN10STRENC_FROM_STRENC(enc);
-
-       REG_UPDATE(DIG_FIFO_CTRL0, DIG_FIFO_READ_START_LEVEL, 0x7);
-       REG_UPDATE(DIG_FE_CLK_CNTL, DIG_FE_CLK_EN, 1);
-       REG_UPDATE(DIG_FE_EN_CNTL, DIG_FE_ENABLE, 1);
-
-       enc35_reset_fifo(enc, true);
-       enc35_reset_fifo(enc, false);
-
-       REG_UPDATE(DIG_FIFO_CTRL0, DIG_FIFO_ENABLE, 1);
-}
-
-static const struct stream_encoder_funcs dcn35_str_enc_funcs = {
-       .dp_set_odm_combine =
-               enc314_dp_set_odm_combine,
-       .dp_set_stream_attribute =
-               enc2_stream_encoder_dp_set_stream_attribute,
-       .hdmi_set_stream_attribute =
-               enc35_stream_encoder_hdmi_set_stream_attribute,
-       .dvi_set_stream_attribute =
-               enc35_stream_encoder_dvi_set_stream_attribute,
-       .set_throttled_vcp_size =
-               enc1_stream_encoder_set_throttled_vcp_size,
-       .update_hdmi_info_packets =
-               enc3_stream_encoder_update_hdmi_info_packets,
-       .stop_hdmi_info_packets =
-               enc3_stream_encoder_stop_hdmi_info_packets,
-       .update_dp_info_packets_sdp_line_num =
-               enc3_stream_encoder_update_dp_info_packets_sdp_line_num,
-       .update_dp_info_packets =
-               enc3_stream_encoder_update_dp_info_packets,
-       .stop_dp_info_packets =
-               enc1_stream_encoder_stop_dp_info_packets,
-       .dp_blank =
-               enc314_stream_encoder_dp_blank,
-       .dp_unblank =
-               enc35_stream_encoder_dp_unblank,
-       .audio_mute_control = enc3_audio_mute_control,
-
-       .dp_audio_setup = enc3_se_dp_audio_setup,
-       .dp_audio_enable = enc3_se_dp_audio_enable,
-       .dp_audio_disable = enc1_se_dp_audio_disable,
-
-       .hdmi_audio_setup = enc3_se_hdmi_audio_setup,
-       .hdmi_audio_disable = enc1_se_hdmi_audio_disable,
-       .setup_stereo_sync  = enc1_setup_stereo_sync,
-       .set_avmute = enc1_stream_encoder_set_avmute,
-       .dig_connect_to_otg = enc1_dig_connect_to_otg,
-       .dig_source_otg = enc1_dig_source_otg,
-
-       .dp_get_pixel_format  = enc1_stream_encoder_dp_get_pixel_format,
-
-       .enc_read_state = enc314_read_state,
-       .dp_set_dsc_config = enc314_dp_set_dsc_config,
-       .dp_set_dsc_pps_info_packet = enc3_dp_set_dsc_pps_info_packet,
-       .set_dynamic_metadata = enc2_set_dynamic_metadata,
-       .hdmi_reset_stream_attribute = enc1_reset_hdmi_stream_attribute,
-       .enable_stream = enc35_stream_encoder_enable,
-
-       .set_input_mode = enc314_set_dig_input_mode,
-       .enable_fifo = enc35_enable_fifo,
-       .disable_fifo = enc35_disable_fifo,
-       .map_stream_to_link = enc35_stream_encoder_map_to_link,
-};
-
-void dcn35_dio_stream_encoder_construct(
-       struct dcn10_stream_encoder *enc1,
-       struct dc_context *ctx,
-       struct dc_bios *bp,
-       enum engine_id eng_id,
-       struct vpg *vpg,
-       struct afmt *afmt,
-       const struct dcn10_stream_enc_registers *regs,
-       const struct dcn10_stream_encoder_shift *se_shift,
-       const struct dcn10_stream_encoder_mask *se_mask)
-{
-       enc1->base.funcs = &dcn35_str_enc_funcs;
-       enc1->base.ctx = ctx;
-       enc1->base.id = eng_id;
-       enc1->base.bp = bp;
-       enc1->base.vpg = vpg;
-       enc1->base.afmt = afmt;
-       enc1->regs = regs;
-       enc1->se_shift = se_shift;
-       enc1->se_mask = se_mask;
-       enc1->base.stream_enc_inst = vpg->inst;
-}
-
diff --git a/drivers/gpu/drm/amd/display/dc/dcn35/dcn35_dio_stream_encoder.h b/drivers/gpu/drm/amd/display/dc/dcn35/dcn35_dio_stream_encoder.h
deleted file mode 100644 (file)
index ddb33fd..0000000
+++ /dev/null
@@ -1,332 +0,0 @@
-/* SPDX-License-Identifier: MIT */
-/*
- * Copyright 2023 Advanced Micro Devices, Inc.
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the "Software"),
- * to deal in the Software without restriction, including without limitation
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
- * and/or sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
- * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
- * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
- * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
- * OTHER DEALINGS IN THE SOFTWARE.
- *
- */
-
-#ifndef __DC_DIO_STREAM_ENCODER_DCN35_H__
-#define __DC_DIO_STREAM_ENCODER_DCN35_H__
-
-#include "dcn30/dcn30_vpg.h"
-#include "dcn30/dcn30_afmt.h"
-#include "stream_encoder.h"
-#include "dcn20/dcn20_stream_encoder.h"
-
-/* Register bit field name change */
-#define RDPCSTX0_RDPCSTX_CLOCK_CNTL__RDPCS_SYMCLK_DIV2_GATE_DIS__SHIFT                                        0x8
-#define RDPCSTX0_RDPCSTX_CLOCK_CNTL__RDPCS_SYMCLK_DIV2_EN__SHIFT                                              0x9
-#define RDPCSTX0_RDPCSTX_CLOCK_CNTL__RDPCS_SYMCLK_DIV2_CLOCK_ON__SHIFT                                        0xa
-#define DPCSTX0_DPCSTX_TX_CNTL__DPCS_TX_DATA_SWAP__SHIFT                                                      0xe
-#define DPCSTX0_DPCSTX_TX_CNTL__DPCS_TX_DATA_ORDER_INVERT__SHIFT                                              0xf
-
-#define RDPCSTX0_RDPCSTX_CLOCK_CNTL__RDPCS_SYMCLK_DIV2_GATE_DIS_MASK                                          0x00000100L
-#define RDPCSTX0_RDPCSTX_CLOCK_CNTL__RDPCS_SYMCLK_DIV2_EN_MASK                                                0x00000200L
-#define RDPCSTX0_RDPCSTX_CLOCK_CNTL__RDPCS_SYMCLK_DIV2_CLOCK_ON_MASK                                          0x00000400L
-#define DPCSTX0_DPCSTX_TX_CNTL__DPCS_TX_DATA_SWAP_MASK                                                        0x00004000L
-#define DPCSTX0_DPCSTX_TX_CNTL__DPCS_TX_DATA_ORDER_INVERT_MASK                                                0x00008000L
-
-
-#define SE_DCN35_REG_LIST(id)\
-       SRI(AFMT_CNTL, DIG, id), \
-       SRI(DIG_FE_CNTL, DIG, id), \
-       SRI(HDMI_CONTROL, DIG, id), \
-       SRI(HDMI_DB_CONTROL, DIG, id), \
-       SRI(HDMI_GC, DIG, id), \
-       SRI(HDMI_GENERIC_PACKET_CONTROL0, DIG, id), \
-       SRI(HDMI_GENERIC_PACKET_CONTROL1, DIG, id), \
-       SRI(HDMI_GENERIC_PACKET_CONTROL2, DIG, id), \
-       SRI(HDMI_GENERIC_PACKET_CONTROL3, DIG, id), \
-       SRI(HDMI_GENERIC_PACKET_CONTROL4, DIG, id), \
-       SRI(HDMI_GENERIC_PACKET_CONTROL5, DIG, id), \
-       SRI(HDMI_GENERIC_PACKET_CONTROL6, DIG, id), \
-       SRI(HDMI_GENERIC_PACKET_CONTROL7, DIG, id), \
-       SRI(HDMI_GENERIC_PACKET_CONTROL8, DIG, id), \
-       SRI(HDMI_GENERIC_PACKET_CONTROL9, DIG, id), \
-       SRI(HDMI_GENERIC_PACKET_CONTROL10, DIG, id), \
-       SRI(HDMI_INFOFRAME_CONTROL0, DIG, id), \
-       SRI(HDMI_INFOFRAME_CONTROL1, DIG, id), \
-       SRI(HDMI_VBI_PACKET_CONTROL, DIG, id), \
-       SRI(HDMI_AUDIO_PACKET_CONTROL, DIG, id),\
-       SRI(HDMI_ACR_PACKET_CONTROL, DIG, id),\
-       SRI(HDMI_ACR_32_0, DIG, id),\
-       SRI(HDMI_ACR_32_1, DIG, id),\
-       SRI(HDMI_ACR_44_0, DIG, id),\
-       SRI(HDMI_ACR_44_1, DIG, id),\
-       SRI(HDMI_ACR_48_0, DIG, id),\
-       SRI(HDMI_ACR_48_1, DIG, id),\
-       SRI(DP_DB_CNTL, DP, id), \
-       SRI(DP_MSA_MISC, DP, id), \
-       SRI(DP_MSA_VBID_MISC, DP, id), \
-       SRI(DP_MSA_COLORIMETRY, DP, id), \
-       SRI(DP_MSA_TIMING_PARAM1, DP, id), \
-       SRI(DP_MSA_TIMING_PARAM2, DP, id), \
-       SRI(DP_MSA_TIMING_PARAM3, DP, id), \
-       SRI(DP_MSA_TIMING_PARAM4, DP, id), \
-       SRI(DP_MSE_RATE_CNTL, DP, id), \
-       SRI(DP_MSE_RATE_UPDATE, DP, id), \
-       SRI(DP_PIXEL_FORMAT, DP, id), \
-       SRI(DP_SEC_CNTL, DP, id), \
-       SRI(DP_SEC_CNTL1, DP, id), \
-       SRI(DP_SEC_CNTL2, DP, id), \
-       SRI(DP_SEC_CNTL5, DP, id), \
-       SRI(DP_SEC_CNTL6, DP, id), \
-       SRI(DP_STEER_FIFO, DP, id), \
-       SRI(DP_VID_M, DP, id), \
-       SRI(DP_VID_N, DP, id), \
-       SRI(DP_VID_STREAM_CNTL, DP, id), \
-       SRI(DP_VID_TIMING, DP, id), \
-       SRI(DP_SEC_AUD_N, DP, id), \
-       SRI(DP_SEC_TIMESTAMP, DP, id), \
-       SRI(DP_DSC_CNTL, DP, id), \
-       SRI(DP_SEC_METADATA_TRANSMISSION, DP, id), \
-       SRI(HDMI_METADATA_PACKET_CONTROL, DIG, id), \
-       SRI(DP_SEC_FRAMING4, DP, id), \
-       SRI(DP_GSP11_CNTL, DP, id), \
-       SRI(DME_CONTROL, DME, id),\
-       SRI(DP_SEC_METADATA_TRANSMISSION, DP, id), \
-       SRI(HDMI_METADATA_PACKET_CONTROL, DIG, id), \
-       SRI(DIG_FE_CNTL, DIG, id), \
-       SRI(DIG_FE_EN_CNTL, DIG, id), \
-       SRI(DIG_FE_CLK_CNTL, DIG, id), \
-       SRI(DIG_CLOCK_PATTERN, DIG, id), \
-       SRI(DIG_FIFO_CTRL0, DIG, id),\
-       SRI(STREAM_MAPPER_CONTROL, DIG, id)
-
-
-#define SE_COMMON_MASK_SH_LIST_DCN35(mask_sh)\
-       SE_SF(DP0_DP_PIXEL_FORMAT, DP_PIXEL_ENCODING, mask_sh),\
-       SE_SF(DP0_DP_PIXEL_FORMAT, DP_COMPONENT_DEPTH, mask_sh),\
-       SE_SF(DP0_DP_PIXEL_FORMAT, DP_PIXEL_PER_CYCLE_PROCESSING_MODE, mask_sh),\
-       SE_SF(DIG0_HDMI_CONTROL, HDMI_PACKET_GEN_VERSION, mask_sh),\
-       SE_SF(DIG0_HDMI_CONTROL, HDMI_KEEPOUT_MODE, mask_sh),\
-       SE_SF(DIG0_HDMI_CONTROL, HDMI_DEEP_COLOR_ENABLE, mask_sh),\
-       SE_SF(DIG0_HDMI_CONTROL, HDMI_DEEP_COLOR_DEPTH, mask_sh),\
-       SE_SF(DIG0_HDMI_CONTROL, HDMI_DATA_SCRAMBLE_EN, mask_sh),\
-       SE_SF(DIG0_HDMI_CONTROL, HDMI_NO_EXTRA_NULL_PACKET_FILLED, mask_sh),\
-       SE_SF(DIG0_HDMI_VBI_PACKET_CONTROL, HDMI_GC_CONT, mask_sh),\
-       SE_SF(DIG0_HDMI_VBI_PACKET_CONTROL, HDMI_GC_SEND, mask_sh),\
-       SE_SF(DIG0_HDMI_VBI_PACKET_CONTROL, HDMI_NULL_SEND, mask_sh),\
-       SE_SF(DIG0_HDMI_VBI_PACKET_CONTROL, HDMI_ACP_SEND, mask_sh),\
-       SE_SF(DIG0_HDMI_INFOFRAME_CONTROL0, HDMI_AUDIO_INFO_SEND, mask_sh),\
-       SE_SF(DIG0_HDMI_INFOFRAME_CONTROL1, HDMI_AUDIO_INFO_LINE, mask_sh),\
-       SE_SF(DIG0_HDMI_GC, HDMI_GC_AVMUTE, mask_sh),\
-       SE_SF(DP0_DP_MSE_RATE_CNTL, DP_MSE_RATE_X, mask_sh),\
-       SE_SF(DP0_DP_MSE_RATE_CNTL, DP_MSE_RATE_Y, mask_sh),\
-       SE_SF(DP0_DP_MSE_RATE_UPDATE, DP_MSE_RATE_UPDATE_PENDING, mask_sh),\
-       SE_SF(DP0_DP_SEC_CNTL, DP_SEC_GSP0_ENABLE, mask_sh),\
-       SE_SF(DP0_DP_SEC_CNTL, DP_SEC_STREAM_ENABLE, mask_sh),\
-       SE_SF(DP0_DP_SEC_CNTL, DP_SEC_GSP1_ENABLE, mask_sh),\
-       SE_SF(DP0_DP_SEC_CNTL, DP_SEC_GSP2_ENABLE, mask_sh),\
-       SE_SF(DP0_DP_SEC_CNTL, DP_SEC_GSP3_ENABLE, mask_sh),\
-       SE_SF(DP0_DP_SEC_CNTL, DP_SEC_MPG_ENABLE, mask_sh),\
-       SE_SF(DP0_DP_SEC_CNTL1, DP_SEC_GSP5_LINE_REFERENCE, mask_sh),\
-       SE_SF(DP0_DP_SEC_CNTL2, DP_SEC_GSP4_SEND, mask_sh),\
-       SE_SF(DP0_DP_SEC_CNTL2, DP_SEC_GSP4_SEND_PENDING, mask_sh),\
-       SE_SF(DP0_DP_SEC_CNTL4, DP_SEC_GSP4_LINE_NUM, mask_sh),\
-       SE_SF(DP0_DP_SEC_CNTL5, DP_SEC_GSP5_LINE_NUM, mask_sh),\
-       SE_SF(DP0_DP_SEC_CNTL2, DP_SEC_GSP4_SEND_ANY_LINE, mask_sh),\
-       SE_SF(DP0_DP_VID_STREAM_CNTL, DP_VID_STREAM_DIS_DEFER, mask_sh),\
-       SE_SF(DP0_DP_VID_STREAM_CNTL, DP_VID_STREAM_ENABLE, mask_sh),\
-       SE_SF(DP0_DP_VID_STREAM_CNTL, DP_VID_STREAM_STATUS, mask_sh),\
-       SE_SF(DP0_DP_STEER_FIFO, DP_STEER_FIFO_RESET, mask_sh),\
-       SE_SF(DP0_DP_VID_TIMING, DP_VID_M_N_GEN_EN, mask_sh),\
-       SE_SF(DP0_DP_VID_N, DP_VID_N, mask_sh),\
-       SE_SF(DP0_DP_VID_M, DP_VID_M, mask_sh),\
-       SE_SF(DIG0_HDMI_AUDIO_PACKET_CONTROL, HDMI_AUDIO_DELAY_EN, mask_sh),\
-       SE_SF(DIG0_HDMI_ACR_PACKET_CONTROL, HDMI_ACR_AUTO_SEND, mask_sh),\
-       SE_SF(DIG0_HDMI_ACR_PACKET_CONTROL, HDMI_ACR_SOURCE, mask_sh),\
-       SE_SF(DIG0_HDMI_ACR_PACKET_CONTROL, HDMI_ACR_AUDIO_PRIORITY, mask_sh),\
-       SE_SF(DIG0_HDMI_ACR_32_0, HDMI_ACR_CTS_32, mask_sh),\
-       SE_SF(DIG0_HDMI_ACR_32_1, HDMI_ACR_N_32, mask_sh),\
-       SE_SF(DIG0_HDMI_ACR_44_0, HDMI_ACR_CTS_44, mask_sh),\
-       SE_SF(DIG0_HDMI_ACR_44_1, HDMI_ACR_N_44, mask_sh),\
-       SE_SF(DIG0_HDMI_ACR_48_0, HDMI_ACR_CTS_48, mask_sh),\
-       SE_SF(DIG0_HDMI_ACR_48_1, HDMI_ACR_N_48, mask_sh),\
-       SE_SF(DP0_DP_SEC_AUD_N, DP_SEC_AUD_N, mask_sh),\
-       SE_SF(DP0_DP_SEC_TIMESTAMP, DP_SEC_TIMESTAMP_MODE, mask_sh),\
-       SE_SF(DP0_DP_SEC_CNTL, DP_SEC_ASP_ENABLE, mask_sh),\
-       SE_SF(DP0_DP_SEC_CNTL, DP_SEC_ATP_ENABLE, mask_sh),\
-       SE_SF(DP0_DP_SEC_CNTL, DP_SEC_AIP_ENABLE, mask_sh),\
-       SE_SF(DP0_DP_SEC_CNTL, DP_SEC_ACM_ENABLE, mask_sh),\
-       SE_SF(DIG0_AFMT_CNTL, AFMT_AUDIO_CLOCK_EN, mask_sh),\
-       SE_SF(DIG0_HDMI_CONTROL, HDMI_CLOCK_CHANNEL_RATE, mask_sh),\
-       SE_SF(DIG0_HDMI_CONTROL, TMDS_PIXEL_ENCODING, mask_sh),\
-       SE_SF(DIG0_HDMI_CONTROL, TMDS_COLOR_FORMAT, mask_sh),\
-       SE_SF(DIG0_DIG_FE_CNTL, DIG_STEREOSYNC_SELECT, mask_sh),\
-       SE_SF(DIG0_DIG_FE_CNTL, DIG_STEREOSYNC_GATE_EN, mask_sh),\
-       SE_SF(DP0_DP_SEC_CNTL, DP_SEC_GSP4_ENABLE, mask_sh),\
-       SE_SF(DP0_DP_SEC_CNTL, DP_SEC_GSP5_ENABLE, mask_sh),\
-       SE_SF(DP0_DP_SEC_CNTL, DP_SEC_GSP6_ENABLE, mask_sh),\
-       SE_SF(DP0_DP_SEC_CNTL, DP_SEC_GSP7_ENABLE, mask_sh),\
-       SE_SF(DP0_DP_SEC_CNTL2, DP_SEC_GSP7_SEND, mask_sh),\
-       SE_SF(DP0_DP_SEC_CNTL6, DP_SEC_GSP7_LINE_NUM, mask_sh),\
-       SE_SF(DP0_DP_SEC_CNTL2, DP_SEC_GSP11_PPS, mask_sh),\
-       SE_SF(DP0_DP_GSP11_CNTL, DP_SEC_GSP11_ENABLE, mask_sh),\
-       SE_SF(DP0_DP_GSP11_CNTL, DP_SEC_GSP11_LINE_NUM, mask_sh),\
-       SE_SF(DP0_DP_DB_CNTL, DP_DB_DISABLE, mask_sh),\
-       SE_SF(DP0_DP_MSA_COLORIMETRY, DP_MSA_MISC0, mask_sh),\
-       SE_SF(DP0_DP_MSA_TIMING_PARAM1, DP_MSA_HTOTAL, mask_sh),\
-       SE_SF(DP0_DP_MSA_TIMING_PARAM1, DP_MSA_VTOTAL, mask_sh),\
-       SE_SF(DP0_DP_MSA_TIMING_PARAM2, DP_MSA_HSTART, mask_sh),\
-       SE_SF(DP0_DP_MSA_TIMING_PARAM2, DP_MSA_VSTART, mask_sh),\
-       SE_SF(DP0_DP_MSA_TIMING_PARAM3, DP_MSA_HSYNCWIDTH, mask_sh),\
-       SE_SF(DP0_DP_MSA_TIMING_PARAM3, DP_MSA_HSYNCPOLARITY, mask_sh),\
-       SE_SF(DP0_DP_MSA_TIMING_PARAM3, DP_MSA_VSYNCWIDTH, mask_sh),\
-       SE_SF(DP0_DP_MSA_TIMING_PARAM3, DP_MSA_VSYNCPOLARITY, mask_sh),\
-       SE_SF(DP0_DP_MSA_TIMING_PARAM4, DP_MSA_HWIDTH, mask_sh),\
-       SE_SF(DP0_DP_MSA_TIMING_PARAM4, DP_MSA_VHEIGHT, mask_sh),\
-       SE_SF(DIG0_HDMI_DB_CONTROL, HDMI_DB_DISABLE, mask_sh),\
-       SE_SF(DP0_DP_VID_TIMING, DP_VID_N_MUL, mask_sh),\
-       SE_SF(DIG0_DIG_FE_CNTL, DIG_SOURCE_SELECT, mask_sh), \
-       SE_SF(DIG0_HDMI_GENERIC_PACKET_CONTROL0, HDMI_GENERIC0_CONT, mask_sh),\
-       SE_SF(DIG0_HDMI_GENERIC_PACKET_CONTROL0, HDMI_GENERIC0_SEND, mask_sh),\
-       SE_SF(DIG0_HDMI_GENERIC_PACKET_CONTROL0, HDMI_GENERIC1_CONT, mask_sh),\
-       SE_SF(DIG0_HDMI_GENERIC_PACKET_CONTROL0, HDMI_GENERIC1_SEND, mask_sh),\
-       SE_SF(DIG0_HDMI_GENERIC_PACKET_CONTROL0, HDMI_GENERIC2_CONT, mask_sh),\
-       SE_SF(DIG0_HDMI_GENERIC_PACKET_CONTROL0, HDMI_GENERIC2_SEND, mask_sh),\
-       SE_SF(DIG0_HDMI_GENERIC_PACKET_CONTROL0, HDMI_GENERIC3_CONT, mask_sh),\
-       SE_SF(DIG0_HDMI_GENERIC_PACKET_CONTROL0, HDMI_GENERIC3_SEND, mask_sh),\
-       SE_SF(DIG0_HDMI_GENERIC_PACKET_CONTROL0, HDMI_GENERIC4_CONT, mask_sh),\
-       SE_SF(DIG0_HDMI_GENERIC_PACKET_CONTROL0, HDMI_GENERIC4_SEND, mask_sh),\
-       SE_SF(DIG0_HDMI_GENERIC_PACKET_CONTROL0, HDMI_GENERIC5_CONT, mask_sh),\
-       SE_SF(DIG0_HDMI_GENERIC_PACKET_CONTROL0, HDMI_GENERIC5_SEND, mask_sh),\
-       SE_SF(DIG0_HDMI_GENERIC_PACKET_CONTROL0, HDMI_GENERIC6_CONT, mask_sh),\
-       SE_SF(DIG0_HDMI_GENERIC_PACKET_CONTROL0, HDMI_GENERIC6_SEND, mask_sh),\
-       SE_SF(DIG0_HDMI_GENERIC_PACKET_CONTROL0, HDMI_GENERIC7_CONT, mask_sh),\
-       SE_SF(DIG0_HDMI_GENERIC_PACKET_CONTROL0, HDMI_GENERIC7_SEND, mask_sh),\
-       SE_SF(DIG0_HDMI_GENERIC_PACKET_CONTROL6, HDMI_GENERIC8_CONT, mask_sh),\
-       SE_SF(DIG0_HDMI_GENERIC_PACKET_CONTROL6, HDMI_GENERIC8_SEND, mask_sh),\
-       SE_SF(DIG0_HDMI_GENERIC_PACKET_CONTROL6, HDMI_GENERIC9_CONT, mask_sh),\
-       SE_SF(DIG0_HDMI_GENERIC_PACKET_CONTROL6, HDMI_GENERIC9_SEND, mask_sh),\
-       SE_SF(DIG0_HDMI_GENERIC_PACKET_CONTROL6, HDMI_GENERIC10_CONT, mask_sh),\
-       SE_SF(DIG0_HDMI_GENERIC_PACKET_CONTROL6, HDMI_GENERIC10_SEND, mask_sh),\
-       SE_SF(DIG0_HDMI_GENERIC_PACKET_CONTROL6, HDMI_GENERIC11_CONT, mask_sh),\
-       SE_SF(DIG0_HDMI_GENERIC_PACKET_CONTROL6, HDMI_GENERIC11_SEND, mask_sh),\
-       SE_SF(DIG0_HDMI_GENERIC_PACKET_CONTROL6, HDMI_GENERIC12_CONT, mask_sh),\
-       SE_SF(DIG0_HDMI_GENERIC_PACKET_CONTROL6, HDMI_GENERIC12_SEND, mask_sh),\
-       SE_SF(DIG0_HDMI_GENERIC_PACKET_CONTROL6, HDMI_GENERIC13_CONT, mask_sh),\
-       SE_SF(DIG0_HDMI_GENERIC_PACKET_CONTROL6, HDMI_GENERIC13_SEND, mask_sh),\
-       SE_SF(DIG0_HDMI_GENERIC_PACKET_CONTROL6, HDMI_GENERIC14_CONT, mask_sh),\
-       SE_SF(DIG0_HDMI_GENERIC_PACKET_CONTROL6, HDMI_GENERIC14_SEND, mask_sh),\
-       SE_SF(DIG0_HDMI_GENERIC_PACKET_CONTROL1, HDMI_GENERIC0_LINE, mask_sh),\
-       SE_SF(DIG0_HDMI_GENERIC_PACKET_CONTROL1, HDMI_GENERIC1_LINE, mask_sh),\
-       SE_SF(DIG0_HDMI_GENERIC_PACKET_CONTROL2, HDMI_GENERIC2_LINE, mask_sh),\
-       SE_SF(DIG0_HDMI_GENERIC_PACKET_CONTROL2, HDMI_GENERIC3_LINE, mask_sh),\
-       SE_SF(DIG0_HDMI_GENERIC_PACKET_CONTROL3, HDMI_GENERIC4_LINE, mask_sh),\
-       SE_SF(DIG0_HDMI_GENERIC_PACKET_CONTROL3, HDMI_GENERIC5_LINE, mask_sh),\
-       SE_SF(DIG0_HDMI_GENERIC_PACKET_CONTROL4, HDMI_GENERIC6_LINE, mask_sh),\
-       SE_SF(DIG0_HDMI_GENERIC_PACKET_CONTROL4, HDMI_GENERIC7_LINE, mask_sh),\
-       SE_SF(DIG0_HDMI_GENERIC_PACKET_CONTROL7, HDMI_GENERIC8_LINE, mask_sh),\
-       SE_SF(DIG0_HDMI_GENERIC_PACKET_CONTROL7, HDMI_GENERIC9_LINE, mask_sh),\
-       SE_SF(DIG0_HDMI_GENERIC_PACKET_CONTROL8, HDMI_GENERIC10_LINE, mask_sh),\
-       SE_SF(DIG0_HDMI_GENERIC_PACKET_CONTROL8, HDMI_GENERIC11_LINE, mask_sh),\
-       SE_SF(DIG0_HDMI_GENERIC_PACKET_CONTROL9, HDMI_GENERIC12_LINE, mask_sh),\
-       SE_SF(DIG0_HDMI_GENERIC_PACKET_CONTROL9, HDMI_GENERIC13_LINE, mask_sh),\
-       SE_SF(DIG0_HDMI_GENERIC_PACKET_CONTROL10, HDMI_GENERIC14_LINE, mask_sh),\
-       SE_SF(DP0_DP_DSC_CNTL, DP_DSC_MODE, mask_sh),\
-       SE_SF(DP0_DP_MSA_VBID_MISC, DP_VBID6_LINE_REFERENCE, mask_sh),\
-       SE_SF(DP0_DP_MSA_VBID_MISC, DP_VBID6_LINE_NUM, mask_sh),\
-       SE_SF(DME0_DME_CONTROL, METADATA_ENGINE_EN, mask_sh),\
-       SE_SF(DME0_DME_CONTROL, METADATA_HUBP_REQUESTOR_ID, mask_sh),\
-       SE_SF(DME0_DME_CONTROL, METADATA_STREAM_TYPE, mask_sh),\
-       SE_SF(DP0_DP_SEC_METADATA_TRANSMISSION, DP_SEC_METADATA_PACKET_ENABLE, mask_sh),\
-       SE_SF(DP0_DP_SEC_METADATA_TRANSMISSION, DP_SEC_METADATA_PACKET_LINE_REFERENCE, mask_sh),\
-       SE_SF(DP0_DP_SEC_METADATA_TRANSMISSION, DP_SEC_METADATA_PACKET_LINE, mask_sh),\
-       SE_SF(DIG0_HDMI_METADATA_PACKET_CONTROL, HDMI_METADATA_PACKET_ENABLE, mask_sh),\
-       SE_SF(DIG0_HDMI_METADATA_PACKET_CONTROL, HDMI_METADATA_PACKET_LINE_REFERENCE, mask_sh),\
-       SE_SF(DIG0_HDMI_METADATA_PACKET_CONTROL, HDMI_METADATA_PACKET_LINE, mask_sh),\
-       SE_SF(DIG0_HDMI_CONTROL, DOLBY_VISION_EN, mask_sh),\
-       SE_SF(DIG0_DIG_FE_EN_CNTL, DIG_FE_ENABLE, mask_sh),\
-       SE_SF(DIG0_DIG_FE_CLK_CNTL, DIG_FE_MODE, mask_sh),\
-       SE_SF(DIG0_DIG_FE_CLK_CNTL, DIG_FE_CLK_EN, mask_sh),\
-       SE_SF(DIG0_DIG_FE_CLK_CNTL, DIG_FE_SOFT_RESET, mask_sh),\
-       SE_SF(DIG0_DIG_FE_CLK_CNTL, DIG_FE_DISPCLK_G_CLOCK_ON, mask_sh),\
-       SE_SF(DIG0_DIG_FE_CLK_CNTL, DIG_FE_SYMCLK_FE_G_CLOCK_ON, mask_sh),\
-       SE_SF(DIG0_DIG_FE_CLK_CNTL, DIG_FE_SYMCLK_FE_G_AFMT_CLOCK_ON, mask_sh),\
-       SE_SF(DIG0_DIG_FE_CLK_CNTL, DIG_FE_SYMCLK_FE_G_TMDS_CLOCK_ON, mask_sh),\
-       SE_SF(DIG0_DIG_FE_CLK_CNTL, DIG_FE_SOCCLK_G_AFMT_CLOCK_ON, mask_sh),\
-       SE_SF(DP0_DP_SEC_FRAMING4, DP_SST_SDP_SPLITTING, mask_sh),\
-       SE_SF(DIG0_DIG_CLOCK_PATTERN, DIG_CLOCK_PATTERN, mask_sh),\
-       SE_SF(DIG0_DIG_FIFO_CTRL0, DIG_FIFO_OUTPUT_PIXEL_MODE, mask_sh),\
-       SE_SF(DIG0_DIG_FIFO_CTRL0, DIG_FIFO_READ_START_LEVEL, mask_sh),\
-       SE_SF(DIG0_DIG_FIFO_CTRL0, DIG_FIFO_ENABLE, mask_sh),\
-       SE_SF(DIG0_DIG_FIFO_CTRL0, DIG_FIFO_RESET, mask_sh),\
-       SE_SF(DIG0_DIG_FIFO_CTRL0, DIG_FIFO_RESET_DONE, mask_sh),\
-       SE_SF(DIG0_STREAM_MAPPER_CONTROL, DIG_STREAM_LINK_TARGET, mask_sh),
-
-void dcn35_dio_stream_encoder_construct(
-       struct dcn10_stream_encoder *enc1,
-       struct dc_context *ctx,
-       struct dc_bios *bp,
-       enum engine_id eng_id,
-       struct vpg *vpg,
-       struct afmt *afmt,
-       const struct dcn10_stream_enc_registers *regs,
-       const struct dcn10_stream_encoder_shift *se_shift,
-       const struct dcn10_stream_encoder_mask *se_mask);
-
-void enc3_stream_encoder_update_hdmi_info_packets(
-       struct stream_encoder *enc,
-       const struct encoder_info_frame *info_frame);
-
-void enc3_stream_encoder_stop_hdmi_info_packets(
-       struct stream_encoder *enc);
-
-void enc3_stream_encoder_update_dp_info_packets_sdp_line_num(
-               struct stream_encoder *enc,
-               struct encoder_info_frame *info_frame);
-
-void enc3_stream_encoder_update_dp_info_packets(
-       struct stream_encoder *enc,
-       const struct encoder_info_frame *info_frame);
-
-void enc3_audio_mute_control(
-       struct stream_encoder *enc,
-       bool mute);
-
-void enc3_se_dp_audio_setup(
-       struct stream_encoder *enc,
-       unsigned int az_inst,
-       struct audio_info *info);
-
-void enc3_se_dp_audio_enable(
-       struct stream_encoder *enc);
-
-void enc3_se_hdmi_audio_setup(
-       struct stream_encoder *enc,
-       unsigned int az_inst,
-       struct audio_info *info,
-       struct audio_crtc_info *audio_crtc_info);
-
-void enc3_dp_set_dsc_pps_info_packet(
-       struct stream_encoder *enc,
-       bool enable,
-       uint8_t *dsc_packed_pps,
-       bool immediate_update);
-
-void enc35_disable_fifo(
-       struct stream_encoder *enc);
-
-void enc35_enable_fifo(
-       struct stream_encoder *enc);
-
-
-#endif /* __DC_DIO_STREAM_ENCODER_DCN35_H__ */
diff --git a/drivers/gpu/drm/amd/display/dc/dcn35/dcn35_dwb.c b/drivers/gpu/drm/amd/display/dc/dcn35/dcn35_dwb.c
deleted file mode 100644 (file)
index b23a809..0000000
+++ /dev/null
@@ -1,58 +0,0 @@
-/* SPDX-License-Identifier: MIT */
-/*
- * Copyright 2023 Advanced Micro Devices, Inc.
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the "Software"),
- * to deal in the Software without restriction, including without limitation
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
- * and/or sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
- * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
- * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
- * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
- * OTHER DEALINGS IN THE SOFTWARE.
- *
- */
-
-#include "reg_helper.h"
-#include "dcn35_dwb.h"
-
-#define REG(reg)\
-       dwbc30->dwbc_regs->reg
-
-#define CTX \
-       dwbc30->base.ctx
-
-#undef FN
-#define FN(reg_name, field_name)                                             \
-       ((const struct dcn35_dwbc_shift *)(dwbc30->dwbc_shift))->field_name, \
-               ((const struct dcn35_dwbc_mask *)(dwbc30->dwbc_mask))        \
-                       ->field_name
-
-#define DC_LOGGER \
-       dwbc30->base.ctx->logger
-
-void dcn35_dwbc_construct(struct dcn30_dwbc *dwbc30,
-       struct dc_context *ctx,
-       const struct dcn30_dwbc_registers *dwbc_regs,
-       const struct dcn35_dwbc_shift *dwbc_shift,
-       const struct dcn35_dwbc_mask *dwbc_mask,
-       int inst)
-{
-       dcn30_dwbc_construct(dwbc30, ctx, dwbc_regs,
-                            (const struct dcn30_dwbc_shift *)dwbc_shift,
-                            (const struct dcn30_dwbc_mask *)dwbc_mask, inst);
-}
-
-void dcn35_dwbc_set_fgcg(struct dcn30_dwbc *dwbc30, bool enable)
-{
-       REG_UPDATE(DWB_ENABLE_CLK_CTRL, DWB_FGCG_REP_DIS, !enable);
-}
diff --git a/drivers/gpu/drm/amd/display/dc/dcn35/dcn35_dwb.h b/drivers/gpu/drm/amd/display/dc/dcn35/dcn35_dwb.h
deleted file mode 100644 (file)
index 886e727..0000000
+++ /dev/null
@@ -1,61 +0,0 @@
-/* SPDX-License-Identifier: MIT */
-/*
- * Copyright 2023 Advanced Micro Devices, Inc.
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the "Software"),
- * to deal in the Software without restriction, including without limitation
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
- * and/or sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
- * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
- * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
- * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
- * OTHER DEALINGS IN THE SOFTWARE.
- *
- * Authors: AMD
- *
- */
-
-#ifndef __DCN35_DWB_H
-#define __DCN35_DWB_H
-
-#include "resource.h"
-#include "dwb.h"
-#include "dcn30/dcn30_dwb.h"
-
-#define DWBC_COMMON_MASK_SH_LIST_DCN35(mask_sh) \
-       DWBC_COMMON_MASK_SH_LIST_DCN30(mask_sh), \
-       SF_DWB2(DWB_ENABLE_CLK_CTRL, DWB_TOP, 0, DWB_FGCG_REP_DIS, mask_sh)
-
-#define DWBC_REG_FIELD_LIST_DCN3_5(type)          \
-       struct {                                  \
-               DWBC_REG_FIELD_LIST_DCN3_0(type); \
-               type DWB_FGCG_REP_DIS;            \
-       }
-
-struct dcn35_dwbc_mask {
-       DWBC_REG_FIELD_LIST_DCN3_5(uint32_t);
-};
-
-struct dcn35_dwbc_shift {
-       DWBC_REG_FIELD_LIST_DCN3_5(uint8_t);
-};
-
-void dcn35_dwbc_construct(struct dcn30_dwbc *dwbc30,
-       struct dc_context *ctx,
-       const struct dcn30_dwbc_registers *dwbc_regs,
-       const struct dcn35_dwbc_shift *dwbc_shift,
-       const struct dcn35_dwbc_mask *dwbc_mask,
-       int inst);
-
-void dcn35_dwbc_set_fgcg(struct dcn30_dwbc *dwbc30, bool enable);
-
-#endif
diff --git a/drivers/gpu/drm/amd/display/dc/dcn35/dcn35_mmhubbub.c b/drivers/gpu/drm/amd/display/dc/dcn35/dcn35_mmhubbub.c
deleted file mode 100644 (file)
index 4317100..0000000
+++ /dev/null
@@ -1,59 +0,0 @@
-/* SPDX-License-Identifier: MIT */
-/*
- * Copyright 2023 Advanced Micro Devices, Inc.
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the "Software"),
- * to deal in the Software without restriction, including without limitation
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
- * and/or sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
- * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
- * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
- * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
- * OTHER DEALINGS IN THE SOFTWARE.
- *
- * Authors: AMD
- *
- */
-
-#include "dcn35_mmhubbub.h"
-#include "reg_helper.h"
-
-#define REG(reg)                                                             \
-       ((const struct dcn35_mmhubbub_registers *)(mcif_wb30->mcif_wb_regs)) \
-               ->reg
-
-#define CTX mcif_wb30->base.ctx
-
-#undef FN
-#define FN(reg_name, field_name)                                                \
-       ((const struct dcn35_mmhubbub_shift *)(mcif_wb30->mcif_wb_shift))       \
-               ->field_name,                                                   \
-               ((const struct dcn35_mmhubbub_mask *)(mcif_wb30->mcif_wb_mask)) \
-                       ->field_name
-
-void dcn35_mmhubbub_construct(
-       struct dcn30_mmhubbub *mcif_wb30, struct dc_context *ctx,
-       const struct dcn35_mmhubbub_registers *mcif_wb_regs,
-       const struct dcn35_mmhubbub_shift *mcif_wb_shift,
-       const struct dcn35_mmhubbub_mask *mcif_wb_mask, int inst)
-{
-       dcn32_mmhubbub_construct(
-               mcif_wb30, ctx,
-               (const struct dcn30_mmhubbub_registers *)(mcif_wb_regs),
-               (const struct dcn30_mmhubbub_shift *)(mcif_wb_shift),
-               (const struct dcn30_mmhubbub_mask *)(mcif_wb_mask), inst);
-}
-
-void dcn35_mmhubbub_set_fgcg(struct dcn30_mmhubbub *mcif_wb30, bool enabled)
-{
-       REG_UPDATE(MMHUBBUB_CLOCK_CNTL, MMHUBBUB_FGCG_REP_DIS, !enabled);
-}
diff --git a/drivers/gpu/drm/amd/display/dc/dcn35/dcn35_mmhubbub.h b/drivers/gpu/drm/amd/display/dc/dcn35/dcn35_mmhubbub.h
deleted file mode 100644 (file)
index 098e13e..0000000
+++ /dev/null
@@ -1,75 +0,0 @@
-/* SPDX-License-Identifier: MIT */
-/*
- * Copyright 2023 Advanced Micro Devices, Inc.
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the "Software"),
- * to deal in the Software without restriction, including without limitation
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
- * and/or sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
- * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
- * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
- * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
- * OTHER DEALINGS IN THE SOFTWARE.
- *
- * Authors: AMD
- *
- */
-
-#ifndef __DCN35_MMHUBBUB_H
-#define __DCN35_MMHUBBUB_H
-
-#include "mcif_wb.h"
-#include "dcn32/dcn32_mmhubbub.h"
-
-#define MCIF_WB_REG_VARIABLE_LIST_DCN3_5  \
-       MCIF_WB_REG_VARIABLE_LIST_DCN3_0; \
-       uint32_t MMHUBBUB_CLOCK_CNTL
-
-#define MCIF_WB_COMMON_MASK_SH_LIST_DCN3_5(mask_sh)                            \
-       MCIF_WB_COMMON_MASK_SH_LIST_DCN32(mask_sh),                            \
-               SF(MMHUBBUB_CLOCK_CNTL, MMHUBBUB_TEST_CLK_SEL, mask_sh),       \
-               SF(MMHUBBUB_CLOCK_CNTL, DISPCLK_R_MMHUBBUB_GATE_DIS, mask_sh), \
-               SF(MMHUBBUB_CLOCK_CNTL, DISPCLK_G_WBIF0_GATE_DIS, mask_sh),    \
-               SF(MMHUBBUB_CLOCK_CNTL, SOCCLK_G_WBIF0_GATE_DIS, mask_sh),     \
-               SF(MMHUBBUB_CLOCK_CNTL, MMHUBBUB_FGCG_REP_DIS, mask_sh)
-
-#define MCIF_WB_REG_FIELD_LIST_DCN3_5(type)          \
-       struct {                                     \
-               MCIF_WB_REG_FIELD_LIST_DCN3_0(type); \
-               type MMHUBBUB_TEST_CLK_SEL;          \
-               type DISPCLK_R_MMHUBBUB_GATE_DIS;    \
-               type DISPCLK_G_WBIF0_GATE_DIS;       \
-               type SOCCLK_G_WBIF0_GATE_DIS;        \
-               type MMHUBBUB_FGCG_REP_DIS;          \
-       }
-
-struct dcn35_mmhubbub_registers {
-       MCIF_WB_REG_VARIABLE_LIST_DCN3_5;
-};
-
-struct dcn35_mmhubbub_mask {
-       MCIF_WB_REG_FIELD_LIST_DCN3_5(uint32_t);
-};
-
-struct dcn35_mmhubbub_shift {
-       MCIF_WB_REG_FIELD_LIST_DCN3_5(uint8_t);
-};
-
-void dcn35_mmhubbub_construct(
-       struct dcn30_mmhubbub *mcif_wb30, struct dc_context *ctx,
-       const struct dcn35_mmhubbub_registers *mcif_wb_regs,
-       const struct dcn35_mmhubbub_shift *mcif_wb_shift,
-       const struct dcn35_mmhubbub_mask *mcif_wb_mask, int inst);
-
-void dcn35_mmhubbub_set_fgcg(struct dcn30_mmhubbub *mcif_wb30, bool enabled);
-
-#endif // __DCN35_MMHUBBUB_H
diff --git a/drivers/gpu/drm/amd/display/dc/dcn35/dcn35_opp.c b/drivers/gpu/drm/amd/display/dc/dcn35/dcn35_opp.c
deleted file mode 100644 (file)
index 3542b51..0000000
+++ /dev/null
@@ -1,53 +0,0 @@
-/* SPDX-License-Identifier: MIT */
-/*
- * Copyright 2023 Advanced Micro Devices, Inc.
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the "Software"),
- * to deal in the Software without restriction, including without limitation
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
- * and/or sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
- * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
- * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
- * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
- * OTHER DEALINGS IN THE SOFTWARE.
- *
- * Authors: AMD
- *
- */
-
-#include "dcn35_opp.h"
-#include "reg_helper.h"
-
-#define REG(reg) ((const struct dcn35_opp_registers *)(oppn20->regs))->reg
-
-#undef FN
-#define FN(reg_name, field_name)                                           \
-       ((const struct dcn35_opp_shift *)(oppn20->opp_shift))->field_name, \
-               ((const struct dcn35_opp_mask *)(oppn20->opp_mask))->field_name
-
-#define CTX oppn20->base.ctx
-
-void dcn35_opp_construct(struct dcn20_opp *oppn20, struct dc_context *ctx,
-                        uint32_t inst, const struct dcn35_opp_registers *regs,
-                        const struct dcn35_opp_shift *opp_shift,
-                        const struct dcn35_opp_mask *opp_mask)
-{
-       dcn20_opp_construct(oppn20, ctx, inst,
-                           (const struct dcn20_opp_registers *)regs,
-                           (const struct dcn20_opp_shift *)opp_shift,
-                           (const struct dcn20_opp_mask *)opp_mask);
-}
-
-void dcn35_opp_set_fgcg(struct dcn20_opp *oppn20, bool enable)
-{
-       REG_UPDATE(OPP_TOP_CLK_CONTROL, OPP_FGCG_REP_DIS, !enable);
-}
diff --git a/drivers/gpu/drm/amd/display/dc/dcn35/dcn35_opp.h b/drivers/gpu/drm/amd/display/dc/dcn35/dcn35_opp.h
deleted file mode 100644 (file)
index a9a4135..0000000
+++ /dev/null
@@ -1,67 +0,0 @@
-/* SPDX-License-Identifier: MIT */
-/*
- * Copyright 2023 Advanced Micro Devices, Inc.
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the "Software"),
- * to deal in the Software without restriction, including without limitation
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
- * and/or sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
- * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
- * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
- * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
- * OTHER DEALINGS IN THE SOFTWARE.
- *
- * Authors: AMD
- *
- */
-
-#ifndef __DCN35_OPP_H
-#define __DCN35_OPP_H
-
-#include "dcn20/dcn20_opp.h"
-
-#define OPP_REG_VARIABLE_LIST_DCN3_5  \
-       OPP_REG_VARIABLE_LIST_DCN2_0; \
-       uint32_t OPP_TOP_CLK_CONTROL
-
-#define OPP_MASK_SH_LIST_DCN35(mask_sh)  \
-       OPP_MASK_SH_LIST_DCN20(mask_sh), \
-               OPP_SF(OPP_TOP_CLK_CONTROL, OPP_FGCG_REP_DIS, mask_sh)
-
-#define OPP_DCN35_REG_FIELD_LIST(type)          \
-       struct {                                \
-               OPP_DCN20_REG_FIELD_LIST(type); \
-               type OPP_FGCG_REP_DIS;          \
-       }
-
-struct dcn35_opp_registers {
-       OPP_REG_VARIABLE_LIST_DCN3_5;
-};
-
-struct dcn35_opp_shift {
-       OPP_DCN35_REG_FIELD_LIST(uint8_t);
-};
-
-struct dcn35_opp_mask {
-       OPP_DCN35_REG_FIELD_LIST(uint32_t);
-};
-
-void dcn35_opp_construct(struct dcn20_opp *oppn20,
-       struct dc_context *ctx,
-       uint32_t inst,
-       const struct dcn35_opp_registers *regs,
-       const struct dcn35_opp_shift *opp_shift,
-       const struct dcn35_opp_mask *opp_mask);
-
-void dcn35_opp_set_fgcg(struct dcn20_opp *oppn20, bool enable);
-
-#endif
diff --git a/drivers/gpu/drm/amd/display/dc/dcn35/dcn35_pg_cntl.c b/drivers/gpu/drm/amd/display/dc/dcn35/dcn35_pg_cntl.c
deleted file mode 100644 (file)
index af21c0a..0000000
+++ /dev/null
@@ -1,551 +0,0 @@
-/* SPDX-License-Identifier: MIT */
-/*
- * Copyright 2023 Advanced Micro Devices, Inc.
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the "Software"),
- * to deal in the Software without restriction, including without limitation
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
- * and/or sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
- * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
- * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
- * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
- * OTHER DEALINGS IN THE SOFTWARE.
- *
- * Authors: AMD
- *
- */
-
-#include "reg_helper.h"
-#include "core_types.h"
-#include "dcn35_pg_cntl.h"
-#include "dccg.h"
-
-#define TO_DCN_PG_CNTL(pg_cntl)\
-       container_of(pg_cntl, struct dcn_pg_cntl, base)
-
-#define REG(reg) \
-       (pg_cntl_dcn->regs->reg)
-
-#undef FN
-#define FN(reg_name, field_name) \
-       pg_cntl_dcn->pg_cntl_shift->field_name, pg_cntl_dcn->pg_cntl_mask->field_name
-
-#define CTX \
-       pg_cntl_dcn->base.ctx
-#define DC_LOGGER \
-       pg_cntl->ctx->logger
-
-static bool pg_cntl35_dsc_pg_status(struct pg_cntl *pg_cntl, unsigned int dsc_inst)
-{
-       struct dcn_pg_cntl *pg_cntl_dcn = TO_DCN_PG_CNTL(pg_cntl);
-       uint32_t pwr_status = 0;
-
-       if (pg_cntl->ctx->dc->debug.ignore_pg)
-               return true;
-
-       switch (dsc_inst) {
-       case 0: /* DSC0 */
-               REG_GET(DOMAIN16_PG_STATUS, DOMAIN_PGFSM_PWR_STATUS, &pwr_status);
-               break;
-       case 1: /* DSC1 */
-               REG_GET(DOMAIN17_PG_STATUS, DOMAIN_PGFSM_PWR_STATUS, &pwr_status);
-               break;
-       case 2: /* DSC2 */
-               REG_GET(DOMAIN18_PG_STATUS, DOMAIN_PGFSM_PWR_STATUS, &pwr_status);
-               break;
-       case 3: /* DSC3 */
-               REG_GET(DOMAIN19_PG_STATUS, DOMAIN_PGFSM_PWR_STATUS, &pwr_status);
-               break;
-       default:
-               BREAK_TO_DEBUGGER();
-               break;
-       }
-
-       return pwr_status == 0;
-}
-
-void pg_cntl35_dsc_pg_control(struct pg_cntl *pg_cntl, unsigned int dsc_inst, bool power_on)
-{
-       struct dcn_pg_cntl *pg_cntl_dcn = TO_DCN_PG_CNTL(pg_cntl);
-       uint32_t power_gate = power_on ? 0 : 1;
-       uint32_t pwr_status = power_on ? 0 : 2;
-       uint32_t org_ip_request_cntl = 0;
-       bool block_enabled;
-
-       /*need to enable dscclk regardless DSC_PG*/
-       if (pg_cntl->ctx->dc->res_pool->dccg->funcs->enable_dsc && power_on)
-               pg_cntl->ctx->dc->res_pool->dccg->funcs->enable_dsc(
-                               pg_cntl->ctx->dc->res_pool->dccg, dsc_inst);
-
-       if (pg_cntl->ctx->dc->debug.ignore_pg ||
-               pg_cntl->ctx->dc->debug.disable_dsc_power_gate ||
-               pg_cntl->ctx->dc->idle_optimizations_allowed)
-               return;
-
-       block_enabled = pg_cntl35_dsc_pg_status(pg_cntl, dsc_inst);
-       if (power_on) {
-               if (block_enabled)
-                       return;
-       } else {
-               if (!block_enabled)
-                       return;
-       }
-
-       REG_GET(DC_IP_REQUEST_CNTL, IP_REQUEST_EN, &org_ip_request_cntl);
-       if (org_ip_request_cntl == 0)
-               REG_SET(DC_IP_REQUEST_CNTL, 0, IP_REQUEST_EN, 1);
-
-       switch (dsc_inst) {
-       case 0: /* DSC0 */
-               REG_UPDATE(DOMAIN16_PG_CONFIG,
-                               DOMAIN_POWER_GATE, power_gate);
-
-               REG_WAIT(DOMAIN16_PG_STATUS,
-                               DOMAIN_PGFSM_PWR_STATUS, pwr_status,
-                               1, 1000);
-               break;
-       case 1: /* DSC1 */
-               REG_UPDATE(DOMAIN17_PG_CONFIG,
-                               DOMAIN_POWER_GATE, power_gate);
-
-               REG_WAIT(DOMAIN17_PG_STATUS,
-                               DOMAIN_PGFSM_PWR_STATUS, pwr_status,
-                               1, 1000);
-               break;
-       case 2: /* DSC2 */
-               REG_UPDATE(DOMAIN18_PG_CONFIG,
-                               DOMAIN_POWER_GATE, power_gate);
-
-               REG_WAIT(DOMAIN18_PG_STATUS,
-                               DOMAIN_PGFSM_PWR_STATUS, pwr_status,
-                               1, 1000);
-               break;
-       case 3: /* DSC3 */
-               REG_UPDATE(DOMAIN19_PG_CONFIG,
-                               DOMAIN_POWER_GATE, power_gate);
-
-               REG_WAIT(DOMAIN19_PG_STATUS,
-                               DOMAIN_PGFSM_PWR_STATUS, pwr_status,
-                               1, 1000);
-               break;
-       default:
-               BREAK_TO_DEBUGGER();
-               break;
-       }
-
-       if (dsc_inst < MAX_PIPES)
-               pg_cntl->pg_pipe_res_enable[PG_DSC][dsc_inst] = power_on;
-
-       if (pg_cntl->ctx->dc->res_pool->dccg->funcs->disable_dsc && !power_on) {
-               /*this is to disable dscclk*/
-               pg_cntl->ctx->dc->res_pool->dccg->funcs->disable_dsc(
-                       pg_cntl->ctx->dc->res_pool->dccg, dsc_inst);
-       }
-}
-
-static bool pg_cntl35_hubp_dpp_pg_status(struct pg_cntl *pg_cntl, unsigned int hubp_dpp_inst)
-{
-       struct dcn_pg_cntl *pg_cntl_dcn = TO_DCN_PG_CNTL(pg_cntl);
-       uint32_t pwr_status = 0;
-
-       switch (hubp_dpp_inst) {
-       case 0:
-               /* DPP0 & HUBP0 */
-               REG_GET(DOMAIN0_PG_STATUS, DOMAIN_PGFSM_PWR_STATUS, &pwr_status);
-               break;
-       case 1:
-               /* DPP1 & HUBP1 */
-               REG_GET(DOMAIN1_PG_STATUS, DOMAIN_PGFSM_PWR_STATUS, &pwr_status);
-               break;
-       case 2:
-               /* DPP2 & HUBP2 */
-               REG_GET(DOMAIN2_PG_STATUS, DOMAIN_PGFSM_PWR_STATUS, &pwr_status);
-               break;
-       case 3:
-               /* DPP3 & HUBP3 */
-               REG_GET(DOMAIN3_PG_STATUS, DOMAIN_PGFSM_PWR_STATUS, &pwr_status);
-               break;
-       default:
-               BREAK_TO_DEBUGGER();
-               break;
-       }
-
-       return pwr_status == 0;
-}
-
-void pg_cntl35_hubp_dpp_pg_control(struct pg_cntl *pg_cntl, unsigned int hubp_dpp_inst, bool power_on)
-{
-       struct dcn_pg_cntl *pg_cntl_dcn = TO_DCN_PG_CNTL(pg_cntl);
-       uint32_t power_gate = power_on ? 0 : 1;
-       uint32_t pwr_status = power_on ? 0 : 2;
-       uint32_t org_ip_request_cntl;
-       bool block_enabled;
-
-       if (pg_cntl->ctx->dc->debug.ignore_pg ||
-               pg_cntl->ctx->dc->debug.disable_hubp_power_gate ||
-               pg_cntl->ctx->dc->debug.disable_dpp_power_gate ||
-               pg_cntl->ctx->dc->idle_optimizations_allowed)
-               return;
-
-       block_enabled = pg_cntl35_hubp_dpp_pg_status(pg_cntl, hubp_dpp_inst);
-       if (power_on) {
-               if (block_enabled)
-                       return;
-       } else {
-               if (!block_enabled)
-                       return;
-       }
-
-       REG_GET(DC_IP_REQUEST_CNTL, IP_REQUEST_EN, &org_ip_request_cntl);
-       if (org_ip_request_cntl == 0)
-               REG_SET(DC_IP_REQUEST_CNTL, 0, IP_REQUEST_EN, 1);
-
-       switch (hubp_dpp_inst) {
-       case 0:
-               /* DPP0 & HUBP0 */
-               REG_UPDATE(DOMAIN0_PG_CONFIG, DOMAIN_POWER_GATE, power_gate);
-               REG_WAIT(DOMAIN0_PG_STATUS, DOMAIN_PGFSM_PWR_STATUS, pwr_status, 1, 1000);
-               break;
-       case 1:
-               /* DPP1 & HUBP1 */
-               REG_UPDATE(DOMAIN1_PG_CONFIG, DOMAIN_POWER_GATE, power_gate);
-               REG_WAIT(DOMAIN1_PG_STATUS, DOMAIN_PGFSM_PWR_STATUS, pwr_status, 1, 1000);
-               break;
-       case 2:
-               /* DPP2 & HUBP2 */
-               REG_UPDATE(DOMAIN2_PG_CONFIG, DOMAIN_POWER_GATE, power_gate);
-               REG_WAIT(DOMAIN2_PG_STATUS, DOMAIN_PGFSM_PWR_STATUS, pwr_status, 1, 1000);
-               break;
-       case 3:
-               /* DPP3 & HUBP3 */
-               REG_UPDATE(DOMAIN3_PG_CONFIG, DOMAIN_POWER_GATE, power_gate);
-               REG_WAIT(DOMAIN3_PG_STATUS, DOMAIN_PGFSM_PWR_STATUS, pwr_status, 1, 1000);
-               break;
-       default:
-               BREAK_TO_DEBUGGER();
-               break;
-       }
-
-       DC_LOG_DEBUG("HUBP DPP instance %d, power %s", hubp_dpp_inst,
-               power_on ? "ON" : "OFF");
-
-       if (hubp_dpp_inst < MAX_PIPES) {
-               pg_cntl->pg_pipe_res_enable[PG_HUBP][hubp_dpp_inst] = power_on;
-               pg_cntl->pg_pipe_res_enable[PG_DPP][hubp_dpp_inst] = power_on;
-       }
-}
-
-static bool pg_cntl35_hpo_pg_status(struct pg_cntl *pg_cntl)
-{
-       struct dcn_pg_cntl *pg_cntl_dcn = TO_DCN_PG_CNTL(pg_cntl);
-       uint32_t pwr_status = 0;
-
-       REG_GET(DOMAIN25_PG_STATUS,
-                       DOMAIN_PGFSM_PWR_STATUS, &pwr_status);
-
-       return pwr_status == 0;
-}
-
-void pg_cntl35_hpo_pg_control(struct pg_cntl *pg_cntl, bool power_on)
-{
-       struct dcn_pg_cntl *pg_cntl_dcn = TO_DCN_PG_CNTL(pg_cntl);
-       uint32_t power_gate = power_on ? 0 : 1;
-       uint32_t pwr_status = power_on ? 0 : 2;
-       uint32_t org_ip_request_cntl;
-       uint32_t power_forceon;
-       bool block_enabled;
-
-       if (pg_cntl->ctx->dc->debug.ignore_pg ||
-               pg_cntl->ctx->dc->debug.disable_hpo_power_gate ||
-               pg_cntl->ctx->dc->idle_optimizations_allowed)
-               return;
-
-       block_enabled = pg_cntl35_hpo_pg_status(pg_cntl);
-       if (power_on) {
-               if (block_enabled)
-                       return;
-       } else {
-               if (!block_enabled)
-                       return;
-       }
-
-       REG_GET(DOMAIN25_PG_CONFIG, DOMAIN_POWER_FORCEON, &power_forceon);
-       if (power_forceon)
-               return;
-
-       REG_GET(DC_IP_REQUEST_CNTL, IP_REQUEST_EN, &org_ip_request_cntl);
-       if (org_ip_request_cntl == 0)
-               REG_SET(DC_IP_REQUEST_CNTL, 0, IP_REQUEST_EN, 1);
-
-       REG_UPDATE(DOMAIN25_PG_CONFIG, DOMAIN_POWER_GATE, power_gate);
-       REG_WAIT(DOMAIN25_PG_STATUS, DOMAIN_PGFSM_PWR_STATUS, pwr_status, 1, 1000);
-
-       pg_cntl->pg_res_enable[PG_HPO] = power_on;
-}
-
-static bool pg_cntl35_io_clk_status(struct pg_cntl *pg_cntl)
-{
-       struct dcn_pg_cntl *pg_cntl_dcn = TO_DCN_PG_CNTL(pg_cntl);
-       uint32_t pwr_status = 0;
-
-       REG_GET(DOMAIN22_PG_STATUS,
-               DOMAIN_PGFSM_PWR_STATUS, &pwr_status);
-
-       return pwr_status == 0;
-}
-
-void pg_cntl35_io_clk_pg_control(struct pg_cntl *pg_cntl, bool power_on)
-{
-       struct dcn_pg_cntl *pg_cntl_dcn = TO_DCN_PG_CNTL(pg_cntl);
-       uint32_t power_gate = power_on ? 0 : 1;
-       uint32_t pwr_status = power_on ? 0 : 2;
-       uint32_t org_ip_request_cntl;
-       uint32_t power_forceon;
-       bool block_enabled;
-
-       if (pg_cntl->ctx->dc->debug.ignore_pg ||
-               pg_cntl->ctx->dc->idle_optimizations_allowed)
-               return;
-
-       block_enabled = pg_cntl35_io_clk_status(pg_cntl);
-       if (power_on) {
-               if (block_enabled)
-                       return;
-       } else {
-               if (!block_enabled)
-                       return;
-       }
-
-       REG_GET(DOMAIN22_PG_CONFIG, DOMAIN_POWER_FORCEON, &power_forceon);
-       if (power_forceon)
-               return;
-
-       REG_GET(DC_IP_REQUEST_CNTL, IP_REQUEST_EN, &org_ip_request_cntl);
-       if (org_ip_request_cntl == 0)
-               REG_SET(DC_IP_REQUEST_CNTL, 0, IP_REQUEST_EN, 1);
-
-       /* DCCG, DIO, DCIO */
-       REG_UPDATE(DOMAIN22_PG_CONFIG, DOMAIN_POWER_GATE, power_gate);
-       REG_WAIT(DOMAIN22_PG_STATUS, DOMAIN_PGFSM_PWR_STATUS, pwr_status, 1, 1000);
-
-       pg_cntl->pg_res_enable[PG_DCCG] = power_on;
-       pg_cntl->pg_res_enable[PG_DIO] = power_on;
-       pg_cntl->pg_res_enable[PG_DCIO] = power_on;
-}
-
-static bool pg_cntl35_plane_otg_status(struct pg_cntl *pg_cntl)
-{
-       struct dcn_pg_cntl *pg_cntl_dcn = TO_DCN_PG_CNTL(pg_cntl);
-       uint32_t pwr_status = 0;
-
-       REG_GET(DOMAIN24_PG_STATUS,
-               DOMAIN_PGFSM_PWR_STATUS, &pwr_status);
-
-       return pwr_status == 0;
-}
-
-void pg_cntl35_mpcc_pg_control(struct pg_cntl *pg_cntl,
-       unsigned int mpcc_inst, bool power_on)
-{
-       if (pg_cntl->ctx->dc->idle_optimizations_allowed)
-               return;
-
-       if (mpcc_inst < MAX_PIPES)
-               pg_cntl->pg_pipe_res_enable[PG_MPCC][mpcc_inst] = power_on;
-}
-
-void pg_cntl35_opp_pg_control(struct pg_cntl *pg_cntl,
-       unsigned int opp_inst, bool power_on)
-{
-       if (pg_cntl->ctx->dc->idle_optimizations_allowed)
-               return;
-
-       if (opp_inst < MAX_PIPES)
-               pg_cntl->pg_pipe_res_enable[PG_OPP][opp_inst] = power_on;
-}
-
-void pg_cntl35_optc_pg_control(struct pg_cntl *pg_cntl,
-       unsigned int optc_inst, bool power_on)
-{
-       if (pg_cntl->ctx->dc->idle_optimizations_allowed)
-               return;
-
-       if (optc_inst < MAX_PIPES)
-               pg_cntl->pg_pipe_res_enable[PG_OPTC][optc_inst] = power_on;
-}
-
-void pg_cntl35_plane_otg_pg_control(struct pg_cntl *pg_cntl, bool power_on)
-{
-       struct dcn_pg_cntl *pg_cntl_dcn = TO_DCN_PG_CNTL(pg_cntl);
-       uint32_t power_gate = power_on ? 0 : 1;
-       uint32_t pwr_status = power_on ? 0 : 2;
-       uint32_t org_ip_request_cntl;
-       int i;
-       bool block_enabled;
-       bool all_mpcc_disabled = true, all_opp_disabled = true;
-       bool all_optc_disabled = true, all_stream_disabled = true;
-
-       if (pg_cntl->ctx->dc->debug.ignore_pg ||
-               pg_cntl->ctx->dc->debug.disable_optc_power_gate ||
-               pg_cntl->ctx->dc->idle_optimizations_allowed)
-               return;
-
-       block_enabled = pg_cntl35_plane_otg_status(pg_cntl);
-       if (power_on) {
-               if (block_enabled)
-                       return;
-       } else {
-               if (!block_enabled)
-                       return;
-       }
-
-       for (i = 0; i < pg_cntl->ctx->dc->res_pool->pipe_count; i++) {
-               struct pipe_ctx *pipe_ctx = &pg_cntl->ctx->dc->current_state->res_ctx.pipe_ctx[i];
-
-               if (pipe_ctx) {
-                       if (pipe_ctx->stream)
-                               all_stream_disabled = false;
-               }
-
-               if (pg_cntl->pg_pipe_res_enable[PG_MPCC][i])
-                       all_mpcc_disabled = false;
-
-               if (pg_cntl->pg_pipe_res_enable[PG_OPP][i])
-                       all_opp_disabled = false;
-
-               if (pg_cntl->pg_pipe_res_enable[PG_OPTC][i])
-                       all_optc_disabled = false;
-       }
-
-       if (!power_on) {
-               if (!all_mpcc_disabled || !all_opp_disabled || !all_optc_disabled
-                       || !all_stream_disabled || pg_cntl->pg_res_enable[PG_DWB])
-                       return;
-       }
-
-       REG_GET(DC_IP_REQUEST_CNTL, IP_REQUEST_EN, &org_ip_request_cntl);
-       if (org_ip_request_cntl == 0)
-               REG_SET(DC_IP_REQUEST_CNTL, 0, IP_REQUEST_EN, 1);
-
-       /* MPC, OPP, OPTC, DWB */
-       REG_UPDATE(DOMAIN24_PG_CONFIG, DOMAIN_POWER_GATE, power_gate);
-       REG_WAIT(DOMAIN24_PG_STATUS, DOMAIN_PGFSM_PWR_STATUS, pwr_status, 1, 1000);
-
-       for (i = 0; i < pg_cntl->ctx->dc->res_pool->pipe_count; i++) {
-               pg_cntl->pg_pipe_res_enable[PG_MPCC][i] = power_on;
-               pg_cntl->pg_pipe_res_enable[PG_OPP][i] = power_on;
-               pg_cntl->pg_pipe_res_enable[PG_OPTC][i] = power_on;
-       }
-       pg_cntl->pg_res_enable[PG_DWB] = power_on;
-}
-
-void pg_cntl35_dwb_pg_control(struct pg_cntl *pg_cntl, bool power_on)
-{
-       if (pg_cntl->ctx->dc->idle_optimizations_allowed)
-               return;
-
-       pg_cntl->pg_res_enable[PG_DWB] = power_on;
-}
-
-static bool pg_cntl35_mem_status(struct pg_cntl *pg_cntl)
-{
-       struct dcn_pg_cntl *pg_cntl_dcn = TO_DCN_PG_CNTL(pg_cntl);
-       uint32_t pwr_status = 0;
-
-       REG_GET(DOMAIN23_PG_STATUS,
-               DOMAIN_PGFSM_PWR_STATUS, &pwr_status);
-
-       return pwr_status == 0;
-}
-
-void pg_cntl35_init_pg_status(struct pg_cntl *pg_cntl)
-{
-       int i = 0;
-       bool block_enabled;
-
-       pg_cntl->pg_res_enable[PG_HPO] = pg_cntl35_hpo_pg_status(pg_cntl);
-
-       block_enabled = pg_cntl35_io_clk_status(pg_cntl);
-       pg_cntl->pg_res_enable[PG_DCCG] = block_enabled;
-       pg_cntl->pg_res_enable[PG_DIO] = block_enabled;
-       pg_cntl->pg_res_enable[PG_DCIO] = block_enabled;
-
-       block_enabled = pg_cntl35_mem_status(pg_cntl);
-       pg_cntl->pg_res_enable[PG_DCHUBBUB] = block_enabled;
-       pg_cntl->pg_res_enable[PG_DCHVM] = block_enabled;
-
-       for (i = 0; i < pg_cntl->ctx->dc->res_pool->pipe_count; i++) {
-               block_enabled = pg_cntl35_hubp_dpp_pg_status(pg_cntl, i);
-               pg_cntl->pg_pipe_res_enable[PG_HUBP][i] = block_enabled;
-               pg_cntl->pg_pipe_res_enable[PG_DPP][i] = block_enabled;
-
-               block_enabled = pg_cntl35_dsc_pg_status(pg_cntl, i);
-               pg_cntl->pg_pipe_res_enable[PG_DSC][i] = block_enabled;
-       }
-
-       block_enabled = pg_cntl35_plane_otg_status(pg_cntl);
-       for (i = 0; i < pg_cntl->ctx->dc->res_pool->pipe_count; i++) {
-               pg_cntl->pg_pipe_res_enable[PG_MPCC][i] = block_enabled;
-               pg_cntl->pg_pipe_res_enable[PG_OPP][i] = block_enabled;
-               pg_cntl->pg_pipe_res_enable[PG_OPTC][i] = block_enabled;
-       }
-       pg_cntl->pg_res_enable[PG_DWB] = block_enabled;
-}
-
-static const struct pg_cntl_funcs pg_cntl35_funcs = {
-       .init_pg_status = pg_cntl35_init_pg_status,
-       .dsc_pg_control = pg_cntl35_dsc_pg_control,
-       .hubp_dpp_pg_control = pg_cntl35_hubp_dpp_pg_control,
-       .hpo_pg_control = pg_cntl35_hpo_pg_control,
-       .io_clk_pg_control = pg_cntl35_io_clk_pg_control,
-       .plane_otg_pg_control = pg_cntl35_plane_otg_pg_control,
-       .mpcc_pg_control = pg_cntl35_mpcc_pg_control,
-       .opp_pg_control = pg_cntl35_opp_pg_control,
-       .optc_pg_control = pg_cntl35_optc_pg_control,
-       .dwb_pg_control = pg_cntl35_dwb_pg_control
-};
-
-struct pg_cntl *pg_cntl35_create(
-       struct dc_context *ctx,
-       const struct pg_cntl_registers *regs,
-       const struct pg_cntl_shift *pg_cntl_shift,
-       const struct pg_cntl_mask *pg_cntl_mask)
-{
-       struct dcn_pg_cntl *pg_cntl_dcn = kzalloc(sizeof(*pg_cntl_dcn), GFP_KERNEL);
-       struct pg_cntl *base;
-
-       if (pg_cntl_dcn == NULL) {
-               BREAK_TO_DEBUGGER();
-               return NULL;
-       }
-
-       base = &pg_cntl_dcn->base;
-       base->ctx = ctx;
-       base->funcs = &pg_cntl35_funcs;
-
-       pg_cntl_dcn->regs = regs;
-       pg_cntl_dcn->pg_cntl_shift = pg_cntl_shift;
-       pg_cntl_dcn->pg_cntl_mask = pg_cntl_mask;
-
-       memset(base->pg_pipe_res_enable, 0, PG_HW_PIPE_RESOURCES_NUM_ELEMENT * MAX_PIPES * sizeof(bool));
-       memset(base->pg_res_enable, 0, PG_HW_RESOURCES_NUM_ELEMENT * sizeof(bool));
-
-       return &pg_cntl_dcn->base;
-}
-
-void dcn_pg_cntl_destroy(struct pg_cntl **pg_cntl)
-{
-       struct dcn_pg_cntl *pg_cntl_dcn = TO_DCN_PG_CNTL(*pg_cntl);
-
-       kfree(pg_cntl_dcn);
-       *pg_cntl = NULL;
-}
diff --git a/drivers/gpu/drm/amd/display/dc/dcn35/dcn35_pg_cntl.h b/drivers/gpu/drm/amd/display/dc/dcn35/dcn35_pg_cntl.h
deleted file mode 100644 (file)
index 3de2408..0000000
+++ /dev/null
@@ -1,195 +0,0 @@
-/* SPDX-License-Identifier: MIT */
-/*
- * Copyright 2023 Advanced Micro Devices, Inc.
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the "Software"),
- * to deal in the Software without restriction, including without limitation
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
- * and/or sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
- * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
- * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
- * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
- * OTHER DEALINGS IN THE SOFTWARE.
- *
- * Authors: AMD
- *
- */
-
-#ifndef _DCN35_PG_CNTL_H_
-#define _DCN35_PG_CNTL_H_
-
-#include "pg_cntl.h"
-
-#define PG_CNTL_REG_LIST_DCN35()\
-       SR(DOMAIN0_PG_CONFIG), \
-       SR(DOMAIN1_PG_CONFIG), \
-       SR(DOMAIN2_PG_CONFIG), \
-       SR(DOMAIN3_PG_CONFIG), \
-       SR(DOMAIN16_PG_CONFIG), \
-       SR(DOMAIN17_PG_CONFIG), \
-       SR(DOMAIN18_PG_CONFIG), \
-       SR(DOMAIN19_PG_CONFIG), \
-       SR(DOMAIN22_PG_CONFIG), \
-       SR(DOMAIN23_PG_CONFIG), \
-       SR(DOMAIN24_PG_CONFIG), \
-       SR(DOMAIN25_PG_CONFIG), \
-       SR(DOMAIN0_PG_STATUS), \
-       SR(DOMAIN1_PG_STATUS), \
-       SR(DOMAIN2_PG_STATUS), \
-       SR(DOMAIN3_PG_STATUS), \
-       SR(DOMAIN16_PG_STATUS), \
-       SR(DOMAIN17_PG_STATUS), \
-       SR(DOMAIN18_PG_STATUS), \
-       SR(DOMAIN19_PG_STATUS), \
-       SR(DOMAIN22_PG_STATUS), \
-       SR(DOMAIN23_PG_STATUS), \
-       SR(DOMAIN24_PG_STATUS), \
-       SR(DOMAIN25_PG_STATUS), \
-       SR(DC_IP_REQUEST_CNTL)
-
-#define PG_CNTL_SF(reg_name, field_name, post_fix)\
-       .field_name = reg_name ## __ ## field_name ## post_fix
-
-#define PG_CNTL_MASK_SH_LIST_DCN35(mask_sh) \
-       PG_CNTL_SF(DOMAIN0_PG_CONFIG, DOMAIN_POWER_FORCEON, mask_sh), \
-       PG_CNTL_SF(DOMAIN0_PG_CONFIG, DOMAIN_POWER_GATE, mask_sh), \
-       PG_CNTL_SF(DOMAIN1_PG_CONFIG, DOMAIN_POWER_FORCEON, mask_sh), \
-       PG_CNTL_SF(DOMAIN1_PG_CONFIG, DOMAIN_POWER_GATE, mask_sh), \
-       PG_CNTL_SF(DOMAIN2_PG_CONFIG, DOMAIN_POWER_FORCEON, mask_sh), \
-       PG_CNTL_SF(DOMAIN2_PG_CONFIG, DOMAIN_POWER_GATE, mask_sh), \
-       PG_CNTL_SF(DOMAIN3_PG_CONFIG, DOMAIN_POWER_FORCEON, mask_sh), \
-       PG_CNTL_SF(DOMAIN3_PG_CONFIG, DOMAIN_POWER_GATE, mask_sh), \
-       PG_CNTL_SF(DOMAIN16_PG_CONFIG, DOMAIN_POWER_FORCEON, mask_sh), \
-       PG_CNTL_SF(DOMAIN16_PG_CONFIG, DOMAIN_POWER_GATE, mask_sh), \
-       PG_CNTL_SF(DOMAIN17_PG_CONFIG, DOMAIN_POWER_FORCEON, mask_sh), \
-       PG_CNTL_SF(DOMAIN17_PG_CONFIG, DOMAIN_POWER_GATE, mask_sh), \
-       PG_CNTL_SF(DOMAIN18_PG_CONFIG, DOMAIN_POWER_FORCEON, mask_sh), \
-       PG_CNTL_SF(DOMAIN18_PG_CONFIG, DOMAIN_POWER_GATE, mask_sh), \
-       PG_CNTL_SF(DOMAIN19_PG_CONFIG, DOMAIN_POWER_FORCEON, mask_sh), \
-       PG_CNTL_SF(DOMAIN19_PG_CONFIG, DOMAIN_POWER_GATE, mask_sh), \
-       PG_CNTL_SF(DOMAIN22_PG_CONFIG, DOMAIN_POWER_FORCEON, mask_sh), \
-       PG_CNTL_SF(DOMAIN22_PG_CONFIG, DOMAIN_POWER_GATE, mask_sh), \
-       PG_CNTL_SF(DOMAIN23_PG_CONFIG, DOMAIN_POWER_FORCEON, mask_sh), \
-       PG_CNTL_SF(DOMAIN23_PG_CONFIG, DOMAIN_POWER_GATE, mask_sh), \
-       PG_CNTL_SF(DOMAIN24_PG_CONFIG, DOMAIN_POWER_FORCEON, mask_sh), \
-       PG_CNTL_SF(DOMAIN24_PG_CONFIG, DOMAIN_POWER_GATE, mask_sh), \
-       PG_CNTL_SF(DOMAIN25_PG_CONFIG, DOMAIN_POWER_FORCEON, mask_sh), \
-       PG_CNTL_SF(DOMAIN25_PG_CONFIG, DOMAIN_POWER_GATE, mask_sh), \
-       PG_CNTL_SF(DOMAIN0_PG_STATUS, DOMAIN_DESIRED_PWR_STATE, mask_sh), \
-       PG_CNTL_SF(DOMAIN0_PG_STATUS, DOMAIN_PGFSM_PWR_STATUS, mask_sh), \
-       PG_CNTL_SF(DOMAIN1_PG_STATUS, DOMAIN_DESIRED_PWR_STATE, mask_sh), \
-       PG_CNTL_SF(DOMAIN1_PG_STATUS, DOMAIN_PGFSM_PWR_STATUS, mask_sh), \
-       PG_CNTL_SF(DOMAIN2_PG_STATUS, DOMAIN_DESIRED_PWR_STATE, mask_sh), \
-       PG_CNTL_SF(DOMAIN2_PG_STATUS, DOMAIN_PGFSM_PWR_STATUS, mask_sh), \
-       PG_CNTL_SF(DOMAIN3_PG_STATUS, DOMAIN_DESIRED_PWR_STATE, mask_sh), \
-       PG_CNTL_SF(DOMAIN3_PG_STATUS, DOMAIN_PGFSM_PWR_STATUS, mask_sh), \
-       PG_CNTL_SF(DOMAIN16_PG_STATUS, DOMAIN_DESIRED_PWR_STATE, mask_sh), \
-       PG_CNTL_SF(DOMAIN16_PG_STATUS, DOMAIN_PGFSM_PWR_STATUS, mask_sh), \
-       PG_CNTL_SF(DOMAIN17_PG_STATUS, DOMAIN_DESIRED_PWR_STATE, mask_sh), \
-       PG_CNTL_SF(DOMAIN17_PG_STATUS, DOMAIN_PGFSM_PWR_STATUS, mask_sh), \
-       PG_CNTL_SF(DOMAIN18_PG_STATUS, DOMAIN_DESIRED_PWR_STATE, mask_sh), \
-       PG_CNTL_SF(DOMAIN18_PG_STATUS, DOMAIN_PGFSM_PWR_STATUS, mask_sh), \
-       PG_CNTL_SF(DOMAIN19_PG_STATUS, DOMAIN_DESIRED_PWR_STATE, mask_sh), \
-       PG_CNTL_SF(DOMAIN19_PG_STATUS, DOMAIN_PGFSM_PWR_STATUS, mask_sh), \
-       PG_CNTL_SF(DOMAIN22_PG_STATUS, DOMAIN_DESIRED_PWR_STATE, mask_sh), \
-       PG_CNTL_SF(DOMAIN22_PG_STATUS, DOMAIN_PGFSM_PWR_STATUS, mask_sh), \
-       PG_CNTL_SF(DOMAIN23_PG_STATUS, DOMAIN_DESIRED_PWR_STATE, mask_sh), \
-       PG_CNTL_SF(DOMAIN23_PG_STATUS, DOMAIN_PGFSM_PWR_STATUS, mask_sh), \
-       PG_CNTL_SF(DOMAIN24_PG_STATUS, DOMAIN_DESIRED_PWR_STATE, mask_sh), \
-       PG_CNTL_SF(DOMAIN24_PG_STATUS, DOMAIN_PGFSM_PWR_STATUS, mask_sh), \
-       PG_CNTL_SF(DOMAIN25_PG_STATUS, DOMAIN_DESIRED_PWR_STATE, mask_sh), \
-       PG_CNTL_SF(DOMAIN25_PG_STATUS, DOMAIN_PGFSM_PWR_STATUS, mask_sh), \
-       PG_CNTL_SF(DC_IP_REQUEST_CNTL, IP_REQUEST_EN, mask_sh)
-
-#define PG_CNTL_REG_FIELD_LIST(type) \
-       type IPS2;\
-       type IPS1;\
-       type IPS0;\
-       type IPS0_All
-
-#define PG_CNTL_DCN35_REG_FIELD_LIST(type) \
-       type IP_REQUEST_EN; \
-       type DOMAIN_POWER_FORCEON; \
-       type DOMAIN_POWER_GATE; \
-       type DOMAIN_DESIRED_PWR_STATE; \
-       type DOMAIN_PGFSM_PWR_STATUS
-
-struct pg_cntl_shift {
-       PG_CNTL_REG_FIELD_LIST(uint8_t);
-       PG_CNTL_DCN35_REG_FIELD_LIST(uint8_t);
-};
-
-struct pg_cntl_mask {
-       PG_CNTL_REG_FIELD_LIST(uint32_t);
-       PG_CNTL_DCN35_REG_FIELD_LIST(uint32_t);
-};
-
-struct pg_cntl_registers {
-       uint32_t LONO_STATE;
-       uint32_t DC_IP_REQUEST_CNTL;
-       uint32_t DOMAIN0_PG_CONFIG;
-       uint32_t DOMAIN1_PG_CONFIG;
-       uint32_t DOMAIN2_PG_CONFIG;
-       uint32_t DOMAIN3_PG_CONFIG;
-       uint32_t DOMAIN16_PG_CONFIG;
-       uint32_t DOMAIN17_PG_CONFIG;
-       uint32_t DOMAIN18_PG_CONFIG;
-       uint32_t DOMAIN19_PG_CONFIG;
-       uint32_t DOMAIN22_PG_CONFIG;
-       uint32_t DOMAIN23_PG_CONFIG;
-       uint32_t DOMAIN24_PG_CONFIG;
-       uint32_t DOMAIN25_PG_CONFIG;
-       uint32_t DOMAIN0_PG_STATUS;
-       uint32_t DOMAIN1_PG_STATUS;
-       uint32_t DOMAIN2_PG_STATUS;
-       uint32_t DOMAIN3_PG_STATUS;
-       uint32_t DOMAIN16_PG_STATUS;
-       uint32_t DOMAIN17_PG_STATUS;
-       uint32_t DOMAIN18_PG_STATUS;
-       uint32_t DOMAIN19_PG_STATUS;
-       uint32_t DOMAIN22_PG_STATUS;
-       uint32_t DOMAIN23_PG_STATUS;
-       uint32_t DOMAIN24_PG_STATUS;
-       uint32_t DOMAIN25_PG_STATUS;
-};
-
-struct dcn_pg_cntl {
-       struct pg_cntl base;
-       const struct pg_cntl_registers *regs;
-       const struct pg_cntl_shift *pg_cntl_shift;
-       const struct pg_cntl_mask *pg_cntl_mask;
-};
-
-void pg_cntl35_dsc_pg_control(struct pg_cntl *pg_cntl, unsigned int dsc_inst, bool power_on);
-void pg_cntl35_hubp_dpp_pg_control(struct pg_cntl *pg_cntl,
-       unsigned int hubp_dpp_inst, bool power_on);
-void pg_cntl35_hpo_pg_control(struct pg_cntl *pg_cntl, bool power_on);
-void pg_cntl35_io_clk_pg_control(struct pg_cntl *pg_cntl, bool power_on);
-void pg_cntl35_plane_otg_pg_control(struct pg_cntl *pg_cntl, bool power_on);
-void pg_cntl35_mpcc_pg_control(struct pg_cntl *pg_cntl,
-       unsigned int mpcc_inst, bool power_on);
-void pg_cntl35_opp_pg_control(struct pg_cntl *pg_cntl,
-       unsigned int opp_inst, bool power_on);
-void pg_cntl35_optc_pg_control(struct pg_cntl *pg_cntl,
-       unsigned int optc_inst, bool power_on);
-void pg_cntl35_dwb_pg_control(struct pg_cntl *pg_cntl, bool power_on);
-void pg_cntl35_init_pg_status(struct pg_cntl *pg_cntl);
-
-struct pg_cntl *pg_cntl35_create(
-       struct dc_context *ctx,
-       const struct pg_cntl_registers *regs,
-       const struct pg_cntl_shift *pg_cntl_shift,
-       const struct pg_cntl_mask *pg_cntl_mask);
-
-void dcn_pg_cntl_destroy(struct pg_cntl **pg_cntl);
-
-#endif /* DCN35_PG_CNTL */
diff --git a/drivers/gpu/drm/amd/display/dc/dcn401/dcn401_dio_link_encoder.c b/drivers/gpu/drm/amd/display/dc/dcn401/dcn401_dio_link_encoder.c
deleted file mode 100644 (file)
index 7e558ca..0000000
+++ /dev/null
@@ -1,322 +0,0 @@
-/*
- * Copyright 2021 Advanced Micro Devices, Inc.
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the "Software"),
- * to deal in the Software without restriction, including without limitation
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
- * and/or sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
- * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
- * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
- * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
- * OTHER DEALINGS IN THE SOFTWARE.
- *
- * Authors: AMD
- *
- */
-
-
-#include "reg_helper.h"
-
-#include "core_types.h"
-#include "link_encoder.h"
-#include "dcn31/dcn31_dio_link_encoder.h"
-#include "dcn32/dcn32_dio_link_encoder.h"
-#include "dcn401_dio_link_encoder.h"
-#include "stream_encoder.h"
-#include "dc_bios_types.h"
-
-#include "gpio_service_interface.h"
-
-#ifndef MIN
-#define MIN(X, Y) ((X) < (Y) ? (X) : (Y))
-#endif
-
-#define CTX \
-       enc10->base.ctx
-#define DC_LOGGER \
-       enc10->base.ctx->logger
-
-#define REG(reg)\
-       (enc10->link_regs->reg)
-
-#undef FN
-#define FN(reg_name, field_name) \
-       enc10->link_shift->field_name, enc10->link_mask->field_name
-
-#define AUX_REG(reg)\
-       (enc10->aux_regs->reg)
-
-#define AUX_REG_READ(reg_name) \
-               dm_read_reg(CTX, AUX_REG(reg_name))
-
-#define AUX_REG_WRITE(reg_name, val) \
-                       dm_write_reg(CTX, AUX_REG(reg_name), val)
-
-#ifndef MIN
-#define MIN(X, Y) ((X) < (Y) ? (X) : (Y))
-#endif
-
-void enc401_hw_init(struct link_encoder *enc)
-{
-       struct dcn10_link_encoder *enc10 = TO_DCN10_LINK_ENC(enc);
-
-/*
-       00 - DP_AUX_DPHY_RX_DETECTION_THRESHOLD__1to2 : 1/2
-       01 - DP_AUX_DPHY_RX_DETECTION_THRESHOLD__3to4 : 3/4
-       02 - DP_AUX_DPHY_RX_DETECTION_THRESHOLD__7to8 : 7/8
-       03 - DP_AUX_DPHY_RX_DETECTION_THRESHOLD__15to16 : 15/16
-       04 - DP_AUX_DPHY_RX_DETECTION_THRESHOLD__31to32 : 31/32
-       05 - DP_AUX_DPHY_RX_DETECTION_THRESHOLD__63to64 : 63/64
-       06 - DP_AUX_DPHY_RX_DETECTION_THRESHOLD__127to128 : 127/128
-       07 - DP_AUX_DPHY_RX_DETECTION_THRESHOLD__255to256 : 255/256
-*/
-
-/*
-       AUX_REG_UPDATE_5(AUX_DPHY_RX_CONTROL0,
-       AUX_RX_START_WINDOW = 1 [6:4]
-       AUX_RX_RECEIVE_WINDOW = 1 default is 2 [10:8]
-       AUX_RX_HALF_SYM_DETECT_LEN  = 1 [13:12] default is 1
-       AUX_RX_TRANSITION_FILTER_EN = 1 [16] default is 1
-       AUX_RX_ALLOW_BELOW_THRESHOLD_PHASE_DETECT [17] is 0  default is 0
-       AUX_RX_ALLOW_BELOW_THRESHOLD_START [18] is 1  default is 1
-       AUX_RX_ALLOW_BELOW_THRESHOLD_STOP [19] is 1  default is 1
-       AUX_RX_PHASE_DETECT_LEN,  [21,20] = 0x3 default is 3
-       AUX_RX_DETECTION_THRESHOLD [30:28] = 1
-*/
-       AUX_REG_WRITE(AUX_DPHY_RX_CONTROL0, 0x103d1110);
-
-       AUX_REG_WRITE(AUX_DPHY_TX_CONTROL, 0x21c7a);
-
-       //AUX_DPHY_TX_REF_CONTROL'AUX_TX_REF_DIV HW default is 0x32;
-       // Set AUX_TX_REF_DIV Divider to generate 2 MHz reference from refclk
-       // 27MHz -> 0xd
-       // 100MHz -> 0x32
-       // 48MHz -> 0x18
-
-       // Set TMDS_CTL0 to 1.  This is a legacy setting.
-       REG_UPDATE(TMDS_CTL_BITS, TMDS_CTL0, 1);
-
-       dcn10_aux_initialize(enc10);
-}
-
-
-void dcn401_link_encoder_enable_dp_output(
-       struct link_encoder *enc,
-       const struct dc_link_settings *link_settings,
-       enum clock_source_id clock_source)
-{
-       if (!enc->ctx->dc->debug.avoid_vbios_exec_table) {
-               dcn10_link_encoder_enable_dp_output(enc, link_settings, clock_source);
-               return;
-       }
-}
-
-void dcn401_link_encoder_setup(
-       struct link_encoder *enc,
-       enum signal_type signal)
-{
-       struct dcn10_link_encoder *enc10 = TO_DCN10_LINK_ENC(enc);
-
-       switch (signal) {
-       case SIGNAL_TYPE_EDP:
-       case SIGNAL_TYPE_DISPLAY_PORT:
-               /* DP SST */
-               REG_UPDATE(DIG_BE_CLK_CNTL, DIG_BE_MODE, 0);
-               break;
-       case SIGNAL_TYPE_DVI_SINGLE_LINK:
-       case SIGNAL_TYPE_DVI_DUAL_LINK:
-               /* TMDS-DVI */
-               REG_UPDATE(DIG_BE_CLK_CNTL, DIG_BE_MODE, 2);
-               break;
-       case SIGNAL_TYPE_HDMI_TYPE_A:
-               /* TMDS-HDMI */
-               REG_UPDATE(DIG_BE_CLK_CNTL, DIG_BE_MODE, 3);
-               break;
-       case SIGNAL_TYPE_DISPLAY_PORT_MST:
-               /* DP MST */
-               REG_UPDATE(DIG_BE_CLK_CNTL, DIG_BE_MODE, 5);
-               break;
-       default:
-               ASSERT_CRITICAL(false);
-               /* invalid mode ! */
-               break;
-       }
-       REG_UPDATE(DIG_BE_CLK_CNTL, DIG_BE_CLK_EN, 1);
-       REG_UPDATE(DIG_BE_EN_CNTL, DIG_BE_ENABLE, 1);
-}
-
-bool dcn401_is_dig_enabled(struct link_encoder *enc)
-{
-       uint32_t clk_enabled;
-       uint32_t dig_enabled;
-       struct dcn10_link_encoder *enc10 = TO_DCN10_LINK_ENC(enc);
-
-       REG_GET(DIG_BE_CLK_CNTL, DIG_BE_CLK_EN, &clk_enabled);
-       REG_GET(DIG_BE_EN_CNTL, DIG_BE_ENABLE, &dig_enabled);
-       return (clk_enabled == 1 && dig_enabled == 1);
-}
-
-enum signal_type dcn401_get_dig_mode(
-       struct link_encoder *enc)
-{
-       struct dcn10_link_encoder *enc10 = TO_DCN10_LINK_ENC(enc);
-       uint32_t value;
-       REG_GET(DIG_BE_CLK_CNTL, DIG_BE_MODE, &value);
-       switch (value) {
-       case 0:
-               return SIGNAL_TYPE_DISPLAY_PORT;
-       case 2:
-               return SIGNAL_TYPE_DVI_SINGLE_LINK;
-       case 3:
-               return SIGNAL_TYPE_HDMI_TYPE_A;
-       case 5:
-               return SIGNAL_TYPE_DISPLAY_PORT_MST;
-       default:
-               return SIGNAL_TYPE_NONE;
-       }
-}
-
-static const struct link_encoder_funcs dcn401_link_enc_funcs = {
-       .read_state = link_enc2_read_state,
-       .validate_output_with_stream =
-                       dcn30_link_encoder_validate_output_with_stream,
-       .hw_init = enc401_hw_init,
-       .setup = dcn401_link_encoder_setup,
-       .enable_tmds_output = dcn10_link_encoder_enable_tmds_output,
-       .enable_dp_output = dcn401_link_encoder_enable_dp_output,
-       .enable_dp_mst_output = dcn10_link_encoder_enable_dp_mst_output,
-       .disable_output = dcn10_link_encoder_disable_output,
-       .dp_set_lane_settings = dcn10_link_encoder_dp_set_lane_settings,
-       .dp_set_phy_pattern = dcn10_link_encoder_dp_set_phy_pattern,
-       .update_mst_stream_allocation_table =
-               dcn10_link_encoder_update_mst_stream_allocation_table,
-       .psr_program_dp_dphy_fast_training =
-                       dcn10_psr_program_dp_dphy_fast_training,
-       .psr_program_secondary_packet = dcn10_psr_program_secondary_packet,
-       .connect_dig_be_to_fe = dcn10_link_encoder_connect_dig_be_to_fe,
-       .enable_hpd = dcn10_link_encoder_enable_hpd,
-       .disable_hpd = dcn10_link_encoder_disable_hpd,
-       .is_dig_enabled = dcn401_is_dig_enabled,
-       .destroy = dcn10_link_encoder_destroy,
-       .fec_set_enable = enc2_fec_set_enable,
-       .fec_set_ready = enc2_fec_set_ready,
-       .fec_is_active = enc2_fec_is_active,
-       .get_dig_frontend = dcn10_get_dig_frontend,
-       .get_dig_mode = dcn401_get_dig_mode,
-       .is_in_alt_mode = dcn32_link_encoder_is_in_alt_mode,
-       .get_max_link_cap = dcn32_link_encoder_get_max_link_cap,
-       .set_dio_phy_mux = dcn31_link_encoder_set_dio_phy_mux,
-};
-
-void dcn401_link_encoder_construct(
-       struct dcn20_link_encoder *enc20,
-       const struct encoder_init_data *init_data,
-       const struct encoder_feature_support *enc_features,
-       const struct dcn10_link_enc_registers *link_regs,
-       const struct dcn10_link_enc_aux_registers *aux_regs,
-       const struct dcn10_link_enc_hpd_registers *hpd_regs,
-       const struct dcn10_link_enc_shift *link_shift,
-       const struct dcn10_link_enc_mask *link_mask)
-{
-       struct bp_connector_speed_cap_info bp_cap_info = {0};
-       const struct dc_vbios_funcs *bp_funcs = init_data->ctx->dc_bios->funcs;
-       enum bp_result result = BP_RESULT_OK;
-       struct dcn10_link_encoder *enc10 = &enc20->enc10;
-
-       enc10->base.funcs = &dcn401_link_enc_funcs;
-       enc10->base.ctx = init_data->ctx;
-       enc10->base.id = init_data->encoder;
-
-       enc10->base.hpd_source = init_data->hpd_source;
-       enc10->base.connector = init_data->connector;
-
-
-       enc10->base.preferred_engine = ENGINE_ID_UNKNOWN;
-
-       enc10->base.features = *enc_features;
-       if (enc10->base.connector.id == CONNECTOR_ID_USBC)
-               enc10->base.features.flags.bits.DP_IS_USB_C = 1;
-
-       enc10->base.transmitter = init_data->transmitter;
-
-       /* set the flag to indicate whether driver poll the I2C data pin
-        * while doing the DP sink detect
-        */
-
-/*     if (dal_adapter_service_is_feature_supported(as,
-               FEATURE_DP_SINK_DETECT_POLL_DATA_PIN))
-               enc10->base.features.flags.bits.
-                       DP_SINK_DETECT_POLL_DATA_PIN = true;*/
-
-       enc10->base.output_signals =
-               SIGNAL_TYPE_DVI_SINGLE_LINK |
-               SIGNAL_TYPE_DVI_DUAL_LINK |
-               SIGNAL_TYPE_LVDS |
-               SIGNAL_TYPE_DISPLAY_PORT |
-               SIGNAL_TYPE_DISPLAY_PORT_MST |
-               SIGNAL_TYPE_EDP |
-               SIGNAL_TYPE_HDMI_TYPE_A;
-
-       enc10->link_regs = link_regs;
-       enc10->aux_regs = aux_regs;
-       enc10->hpd_regs = hpd_regs;
-       enc10->link_shift = link_shift;
-       enc10->link_mask = link_mask;
-
-       switch (enc10->base.transmitter) {
-       case TRANSMITTER_UNIPHY_A:
-               enc10->base.preferred_engine = ENGINE_ID_DIGA;
-       break;
-       case TRANSMITTER_UNIPHY_B:
-               enc10->base.preferred_engine = ENGINE_ID_DIGB;
-       break;
-       case TRANSMITTER_UNIPHY_C:
-               enc10->base.preferred_engine = ENGINE_ID_DIGC;
-       break;
-       case TRANSMITTER_UNIPHY_D:
-               enc10->base.preferred_engine = ENGINE_ID_DIGD;
-       break;
-       case TRANSMITTER_UNIPHY_E:
-               enc10->base.preferred_engine = ENGINE_ID_DIGE;
-       break;
-       default:
-               ASSERT_CRITICAL(false);
-               enc10->base.preferred_engine = ENGINE_ID_UNKNOWN;
-       }
-
-       /* default to one to mirror Windows behavior */
-       enc10->base.features.flags.bits.HDMI_6GB_EN = 1;
-
-       if (bp_funcs->get_connector_speed_cap_info)
-               result = bp_funcs->get_connector_speed_cap_info(enc10->base.ctx->dc_bios,
-                                               enc10->base.connector, &bp_cap_info);
-
-       /* Override features with DCE-specific values */
-       if (result == BP_RESULT_OK) {
-               enc10->base.features.flags.bits.IS_HBR2_CAPABLE =
-                               bp_cap_info.DP_HBR2_EN;
-               enc10->base.features.flags.bits.IS_HBR3_CAPABLE =
-                               bp_cap_info.DP_HBR3_EN;
-               enc10->base.features.flags.bits.HDMI_6GB_EN = bp_cap_info.HDMI_6GB_EN;
-               enc10->base.features.flags.bits.IS_DP2_CAPABLE = 1;
-               enc10->base.features.flags.bits.IS_UHBR10_CAPABLE = bp_cap_info.DP_UHBR10_EN;
-               enc10->base.features.flags.bits.IS_UHBR13_5_CAPABLE = bp_cap_info.DP_UHBR13_5_EN;
-               enc10->base.features.flags.bits.IS_UHBR20_CAPABLE = bp_cap_info.DP_UHBR20_EN;
-       } else {
-               DC_LOG_WARNING("%s: Failed to get encoder_cap_info from VBIOS with error code %d!\n",
-                               __func__,
-                               result);
-       }
-       if (enc10->base.ctx->dc->debug.hdmi20_disable) {
-               enc10->base.features.flags.bits.HDMI_6GB_EN = 0;
-       }
-}
diff --git a/drivers/gpu/drm/amd/display/dc/dcn401/dcn401_dio_link_encoder.h b/drivers/gpu/drm/amd/display/dc/dcn401/dcn401_dio_link_encoder.h
deleted file mode 100644 (file)
index 6baab83..0000000
+++ /dev/null
@@ -1,134 +0,0 @@
-/*
- * Copyright 2021 Advanced Micro Devices, Inc.
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the "Software"),
- * to deal in the Software without restriction, including without limitation
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
- *  and/or sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
- * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
- * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
- * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
- * OTHER DEALINGS IN THE SOFTWARE.
- *
- * Authors: AMD
- *
- */
-
-#ifndef __DC_LINK_ENCODER__DCN401_H__
-#define __DC_LINK_ENCODER__DCN401_H__
-
-#include "dcn30/dcn30_dio_link_encoder.h"
-
-#define LINK_ENCODER_MASK_SH_LIST_DCN401(mask_sh) \
-       LE_SF(DIG0_DIG_BE_EN_CNTL, DIG_BE_ENABLE, mask_sh),\
-       LE_SF(DIG0_DIG_BE_CNTL, DIG_RB_SWITCH_EN, mask_sh),\
-       LE_SF(DIG0_DIG_BE_CNTL, DIG_HPD_SELECT, mask_sh),\
-       LE_SF(DIG0_DIG_BE_CNTL, DIG_FE_SOURCE_SELECT, mask_sh),\
-       LE_SF(DIG0_DIG_BE_CLK_CNTL, DIG_BE_MODE, mask_sh),\
-       LE_SF(DIG0_DIG_BE_CLK_CNTL, DIG_BE_CLK_EN, mask_sh),\
-       LE_SF(DIG0_DIG_BE_CLK_CNTL, DIG_BE_SOFT_RESET, mask_sh),\
-       LE_SF(DIG0_DIG_BE_CLK_CNTL, HDCP_SOFT_RESET, mask_sh),\
-       LE_SF(DIG0_DIG_BE_CLK_CNTL, DIG_BE_SYMCLK_G_CLOCK_ON, mask_sh),\
-       LE_SF(DIG0_DIG_BE_CLK_CNTL, DIG_BE_SYMCLK_G_HDCP_CLOCK_ON, mask_sh),\
-       LE_SF(DIG0_DIG_BE_CLK_CNTL, DIG_BE_SYMCLK_G_TMDS_CLOCK_ON, mask_sh),\
-       LE_SF(DIG0_DIG_CLOCK_PATTERN, DIG_CLOCK_PATTERN, mask_sh),\
-       LE_SF(DIG0_TMDS_CTL_BITS, TMDS_CTL0, mask_sh), \
-       LE_SF(DP0_DP_DPHY_CNTL, DPHY_BYPASS, mask_sh),\
-       LE_SF(DP0_DP_DPHY_CNTL, DPHY_ATEST_SEL_LANE0, mask_sh),\
-       LE_SF(DP0_DP_DPHY_CNTL, DPHY_ATEST_SEL_LANE1, mask_sh),\
-       LE_SF(DP0_DP_DPHY_CNTL, DPHY_ATEST_SEL_LANE2, mask_sh),\
-       LE_SF(DP0_DP_DPHY_CNTL, DPHY_ATEST_SEL_LANE3, mask_sh),\
-       LE_SF(DP0_DP_DPHY_PRBS_CNTL, DPHY_PRBS_EN, mask_sh),\
-       LE_SF(DP0_DP_DPHY_PRBS_CNTL, DPHY_PRBS_SEL, mask_sh),\
-       LE_SF(DP0_DP_DPHY_SYM0, DPHY_SYM1, mask_sh),\
-       LE_SF(DP0_DP_DPHY_SYM0, DPHY_SYM2, mask_sh),\
-       LE_SF(DP0_DP_DPHY_SYM0, DPHY_SYM3, mask_sh),\
-       LE_SF(DP0_DP_DPHY_SYM1, DPHY_SYM4, mask_sh),\
-       LE_SF(DP0_DP_DPHY_SYM1, DPHY_SYM5, mask_sh),\
-       LE_SF(DP0_DP_DPHY_SYM1, DPHY_SYM6, mask_sh),\
-       LE_SF(DP0_DP_DPHY_SYM2, DPHY_SYM7, mask_sh),\
-       LE_SF(DP0_DP_DPHY_SYM2, DPHY_SYM8, mask_sh),\
-       LE_SF(DP0_DP_DPHY_SCRAM_CNTL, DPHY_SCRAMBLER_BS_COUNT, mask_sh),\
-       LE_SF(DP0_DP_DPHY_SCRAM_CNTL, DPHY_SCRAMBLER_ADVANCE, mask_sh),\
-       LE_SF(DP0_DP_DPHY_FAST_TRAINING, DPHY_RX_FAST_TRAINING_CAPABLE, mask_sh),\
-       LE_SF(DP0_DP_DPHY_BS_SR_SWAP_CNTL, DPHY_LOAD_BS_COUNT, mask_sh),\
-       LE_SF(DP0_DP_DPHY_TRAINING_PATTERN_SEL, DPHY_TRAINING_PATTERN_SEL, mask_sh),\
-       LE_SF(DP0_DP_DPHY_HBR2_PATTERN_CONTROL, DP_DPHY_HBR2_PATTERN_CONTROL, mask_sh),\
-       LE_SF(DP0_DP_LINK_CNTL, DP_LINK_TRAINING_COMPLETE, mask_sh),\
-       LE_SF(DP0_DP_LINK_FRAMING_CNTL, DP_IDLE_BS_INTERVAL, mask_sh),\
-       LE_SF(DP0_DP_LINK_FRAMING_CNTL, DP_VBID_DISABLE, mask_sh),\
-       LE_SF(DP0_DP_LINK_FRAMING_CNTL, DP_VID_ENHANCED_FRAME_MODE, mask_sh),\
-       LE_SF(DP0_DP_VID_STREAM_CNTL, DP_VID_STREAM_ENABLE, mask_sh),\
-       LE_SF(DP0_DP_CONFIG, DP_UDI_LANES, mask_sh),\
-       LE_SF(DP0_DP_SEC_CNTL1, DP_SEC_GSP0_LINE_NUM, mask_sh),\
-       LE_SF(DP0_DP_SEC_CNTL1, DP_SEC_GSP0_PRIORITY, mask_sh),\
-       LE_SF(DP0_DP_MSE_SAT0, DP_MSE_SAT_SRC0, mask_sh),\
-       LE_SF(DP0_DP_MSE_SAT0, DP_MSE_SAT_SRC1, mask_sh),\
-       LE_SF(DP0_DP_MSE_SAT0, DP_MSE_SAT_SLOT_COUNT0, mask_sh),\
-       LE_SF(DP0_DP_MSE_SAT0, DP_MSE_SAT_SLOT_COUNT1, mask_sh),\
-       LE_SF(DP0_DP_MSE_SAT1, DP_MSE_SAT_SRC2, mask_sh),\
-       LE_SF(DP0_DP_MSE_SAT1, DP_MSE_SAT_SRC3, mask_sh),\
-       LE_SF(DP0_DP_MSE_SAT1, DP_MSE_SAT_SLOT_COUNT2, mask_sh),\
-       LE_SF(DP0_DP_MSE_SAT1, DP_MSE_SAT_SLOT_COUNT3, mask_sh),\
-       LE_SF(DP0_DP_MSE_SAT_UPDATE, DP_MSE_SAT_UPDATE, mask_sh),\
-       LE_SF(DP0_DP_MSE_SAT_UPDATE, DP_MSE_16_MTP_KEEPOUT, mask_sh),\
-       LE_SF(DP_AUX0_AUX_CONTROL, AUX_HPD_SEL, mask_sh),\
-       LE_SF(DP_AUX0_AUX_CONTROL, AUX_LS_READ_EN, mask_sh),\
-       LE_SF(DP_AUX0_AUX_DPHY_RX_CONTROL0, AUX_RX_RECEIVE_WINDOW, mask_sh),\
-       LE_SF(HPD0_DC_HPD_CONTROL, DC_HPD_EN, mask_sh),\
-       LE_SF(DP0_DP_DPHY_CNTL, DPHY_FEC_EN, mask_sh),\
-       LE_SF(DP0_DP_DPHY_CNTL, DPHY_FEC_READY_SHADOW, mask_sh),\
-       LE_SF(DP0_DP_DPHY_CNTL, DPHY_FEC_ACTIVE_STATUS, mask_sh),\
-       LE_SF(DIG0_TMDS_CTL_BITS, TMDS_CTL0, mask_sh), \
-       LE_SF(DP_AUX0_AUX_DPHY_RX_CONTROL0, AUX_RX_START_WINDOW, mask_sh),\
-       LE_SF(DP_AUX0_AUX_DPHY_RX_CONTROL0, AUX_RX_HALF_SYM_DETECT_LEN, mask_sh),\
-       LE_SF(DP_AUX0_AUX_DPHY_RX_CONTROL0, AUX_RX_TRANSITION_FILTER_EN, mask_sh),\
-       LE_SF(DP_AUX0_AUX_DPHY_RX_CONTROL0, AUX_RX_ALLOW_BELOW_THRESHOLD_PHASE_DETECT, mask_sh),\
-       LE_SF(DP_AUX0_AUX_DPHY_RX_CONTROL0, AUX_RX_ALLOW_BELOW_THRESHOLD_START, mask_sh),\
-       LE_SF(DP_AUX0_AUX_DPHY_RX_CONTROL0, AUX_RX_ALLOW_BELOW_THRESHOLD_STOP, mask_sh),\
-       LE_SF(DP_AUX0_AUX_DPHY_RX_CONTROL0, AUX_RX_PHASE_DETECT_LEN, mask_sh),\
-       LE_SF(DP_AUX0_AUX_DPHY_RX_CONTROL0, AUX_RX_DETECTION_THRESHOLD, mask_sh), \
-       LE_SF(DP_AUX0_AUX_DPHY_TX_CONTROL, AUX_TX_PRECHARGE_LEN, mask_sh),\
-       LE_SF(DP_AUX0_AUX_DPHY_TX_CONTROL, AUX_TX_PRECHARGE_SYMBOLS, mask_sh),\
-       LE_SF(DP_AUX0_AUX_DPHY_TX_CONTROL, AUX_MODE_DET_CHECK_DELAY, mask_sh),\
-       LE_SF(DP_AUX0_AUX_DPHY_RX_CONTROL1, AUX_RX_PRECHARGE_SKIP, mask_sh),\
-       LE_SF(DP_AUX0_AUX_DPHY_RX_CONTROL1, AUX_RX_TIMEOUT_LEN, mask_sh),\
-       LE_SF(DP_AUX0_AUX_DPHY_RX_CONTROL1, AUX_RX_TIMEOUT_LEN_MUL, mask_sh)
-
-void dcn401_link_encoder_construct(
-       struct dcn20_link_encoder *enc20,
-       const struct encoder_init_data *init_data,
-       const struct encoder_feature_support *enc_features,
-       const struct dcn10_link_enc_registers *link_regs,
-       const struct dcn10_link_enc_aux_registers *aux_regs,
-       const struct dcn10_link_enc_hpd_registers *hpd_regs,
-       const struct dcn10_link_enc_shift *link_shift,
-       const struct dcn10_link_enc_mask *link_mask);
-
-void enc401_hw_init(struct link_encoder *enc);
-
-void dcn401_link_encoder_enable_dp_output(
-       struct link_encoder *enc,
-       const struct dc_link_settings *link_settings,
-       enum clock_source_id clock_source);
-
-void dcn401_link_encoder_setup(
-       struct link_encoder *enc,
-       enum signal_type signal);
-
-enum signal_type dcn401_get_dig_mode(
-       struct link_encoder *enc);
-
-bool dcn401_is_dig_enabled(struct link_encoder *enc);
-
-enum signal_type dcn401_get_dig_mode(struct link_encoder *enc);
-#endif /* __DC_LINK_ENCODER__DCN401_H__ */
diff --git a/drivers/gpu/drm/amd/display/dc/dcn401/dcn401_dio_stream_encoder.c b/drivers/gpu/drm/amd/display/dc/dcn401/dcn401_dio_stream_encoder.c
deleted file mode 100644 (file)
index 0a27e09..0000000
+++ /dev/null
@@ -1,857 +0,0 @@
-/*
- * Copyright 2021 Advanced Micro Devices, Inc.
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the "Software"),
- * to deal in the Software without restriction, including without limitation
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
- *  and/or sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
- * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
- * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
- * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
- * OTHER DEALINGS IN THE SOFTWARE.
- *
- * Authors: AMD
- *
- */
-
-
-#include "dc_bios_types.h"
-#include "dcn30/dcn30_dio_stream_encoder.h"
-#include "dcn32/dcn32_dio_stream_encoder.h"
-#include "dcn35/dcn35_dio_stream_encoder.h"
-
-#include "dcn401_dio_stream_encoder.h"
-#include "reg_helper.h"
-#include "hw_shared.h"
-#include "link.h"
-#include "dpcd_defs.h"
-
-#define DC_LOGGER \
-               enc1->base.ctx->logger
-
-#define REG(reg)\
-       (enc1->regs->reg)
-
-#undef FN
-#define FN(reg_name, field_name) \
-       enc1->se_shift->field_name, enc1->se_mask->field_name
-
-#define VBI_LINE_0 0
-#define HDMI_CLOCK_CHANNEL_RATE_MORE_340M 340000
-
-#define CTX \
-       enc1->base.ctx
-
-
-
-static void enc401_dp_set_odm_combine(
-       struct stream_encoder *enc,
-       bool odm_combine)
-{
-}
-
-/* setup stream encoder in dvi mode */
-static void enc401_stream_encoder_dvi_set_stream_attribute(
-       struct stream_encoder *enc,
-       struct dc_crtc_timing *crtc_timing,
-       bool is_dual_link)
-{
-       struct dcn10_stream_encoder *enc1 = DCN10STRENC_FROM_STRENC(enc);
-
-       if (!enc->ctx->dc->debug.avoid_vbios_exec_table) {
-               struct bp_encoder_control cntl = {0};
-
-               cntl.action = ENCODER_CONTROL_SETUP;
-               cntl.engine_id = enc1->base.id;
-               cntl.signal = is_dual_link ?
-                       SIGNAL_TYPE_DVI_DUAL_LINK : SIGNAL_TYPE_DVI_SINGLE_LINK;
-               cntl.enable_dp_audio = false;
-               cntl.pixel_clock = crtc_timing->pix_clk_100hz / 10;
-               cntl.lanes_number = (is_dual_link) ? LANE_COUNT_EIGHT : LANE_COUNT_FOUR;
-
-               if (enc1->base.bp->funcs->encoder_control(
-                               enc1->base.bp, &cntl) != BP_RESULT_OK)
-                       return;
-
-       } else {
-
-               //Set pattern for clock channel, default vlue 0x63 does not work
-               REG_UPDATE(DIG_CLOCK_PATTERN, DIG_CLOCK_PATTERN, 0x1F);
-
-               //DIG_BE_TMDS_DVI_MODE : TMDS-DVI mode is already set in link_encoder_setup
-
-               //DIG_SOURCE_SELECT is already set in dig_connect_to_otg
-
-               /* DIG_START is removed from the register spec */
-       }
-
-       ASSERT(crtc_timing->pixel_encoding == PIXEL_ENCODING_RGB);
-       ASSERT(crtc_timing->display_color_depth == COLOR_DEPTH_888);
-       enc401_stream_encoder_set_stream_attribute_helper(enc1, crtc_timing);
-}
-
-/* setup stream encoder in hdmi mode */
-static void enc401_stream_encoder_hdmi_set_stream_attribute(
-       struct stream_encoder *enc,
-       struct dc_crtc_timing *crtc_timing,
-       int actual_pix_clk_khz,
-       bool enable_audio)
-{
-       struct dcn10_stream_encoder *enc1 = DCN10STRENC_FROM_STRENC(enc);
-
-       if (!enc->ctx->dc->debug.avoid_vbios_exec_table) {
-               struct bp_encoder_control cntl = {0};
-
-               cntl.action = ENCODER_CONTROL_SETUP;
-               cntl.engine_id = enc1->base.id;
-               cntl.signal = SIGNAL_TYPE_HDMI_TYPE_A;
-               cntl.enable_dp_audio = enable_audio;
-               cntl.pixel_clock = actual_pix_clk_khz;
-               cntl.lanes_number = LANE_COUNT_FOUR;
-
-               if (enc1->base.bp->funcs->encoder_control(
-                               enc1->base.bp, &cntl) != BP_RESULT_OK)
-                       return;
-
-       } else {
-
-               //Set pattern for clock channel, default vlue 0x63 does not work
-               REG_UPDATE(DIG_CLOCK_PATTERN, DIG_CLOCK_PATTERN, 0x1F);
-
-               //DIG_BE_TMDS_HDMI_MODE : TMDS-HDMI mode is already set in link_encoder_setup
-
-               //DIG_SOURCE_SELECT is already set in dig_connect_to_otg
-
-               /* DIG_START is removed from the register spec */
-       }
-
-       /* Configure pixel encoding */
-       enc401_stream_encoder_set_stream_attribute_helper(enc1, crtc_timing);
-
-       /* setup HDMI engine */
-       REG_UPDATE_6(HDMI_CONTROL,
-               HDMI_PACKET_GEN_VERSION, 1,
-               HDMI_KEEPOUT_MODE, 1,
-               HDMI_DEEP_COLOR_ENABLE, 0,
-               HDMI_DATA_SCRAMBLE_EN, 0,
-               HDMI_NO_EXTRA_NULL_PACKET_FILLED, 1,
-               HDMI_CLOCK_CHANNEL_RATE, 0);
-
-       /* Configure color depth */
-       switch (crtc_timing->display_color_depth) {
-       case COLOR_DEPTH_888:
-               REG_UPDATE(HDMI_CONTROL, HDMI_DEEP_COLOR_DEPTH, 0);
-               break;
-       case COLOR_DEPTH_101010:
-               if (crtc_timing->pixel_encoding == PIXEL_ENCODING_YCBCR422) {
-                       REG_UPDATE_2(HDMI_CONTROL,
-                                       HDMI_DEEP_COLOR_DEPTH, 1,
-                                       HDMI_DEEP_COLOR_ENABLE, 0);
-               } else {
-                       REG_UPDATE_2(HDMI_CONTROL,
-                                       HDMI_DEEP_COLOR_DEPTH, 1,
-                                       HDMI_DEEP_COLOR_ENABLE, 1);
-                       }
-               break;
-       case COLOR_DEPTH_121212:
-               if (crtc_timing->pixel_encoding == PIXEL_ENCODING_YCBCR422) {
-                       REG_UPDATE_2(HDMI_CONTROL,
-                                       HDMI_DEEP_COLOR_DEPTH, 2,
-                                       HDMI_DEEP_COLOR_ENABLE, 0);
-               } else {
-                       REG_UPDATE_2(HDMI_CONTROL,
-                                       HDMI_DEEP_COLOR_DEPTH, 2,
-                                       HDMI_DEEP_COLOR_ENABLE, 1);
-                       }
-               break;
-       case COLOR_DEPTH_161616:
-               REG_UPDATE_2(HDMI_CONTROL,
-                               HDMI_DEEP_COLOR_DEPTH, 3,
-                               HDMI_DEEP_COLOR_ENABLE, 1);
-               break;
-       default:
-               break;
-       }
-
-       if (actual_pix_clk_khz >= HDMI_CLOCK_CHANNEL_RATE_MORE_340M) {
-               /* enable HDMI data scrambler
-                * HDMI_CLOCK_CHANNEL_RATE_MORE_340M
-                * Clock channel frequency is 1/4 of character rate.
-                */
-               REG_UPDATE_2(HDMI_CONTROL,
-                       HDMI_DATA_SCRAMBLE_EN, 1,
-                       HDMI_CLOCK_CHANNEL_RATE, 1);
-       } else if (crtc_timing->flags.LTE_340MCSC_SCRAMBLE) {
-
-               /* TODO: New feature for DCE11, still need to implement */
-
-               /* enable HDMI data scrambler
-                * HDMI_CLOCK_CHANNEL_FREQ_EQUAL_TO_CHAR_RATE
-                * Clock channel frequency is the same
-                * as character rate
-                */
-               REG_UPDATE_2(HDMI_CONTROL,
-                       HDMI_DATA_SCRAMBLE_EN, 1,
-                       HDMI_CLOCK_CHANNEL_RATE, 0);
-       }
-
-
-       /* Enable transmission of General Control packet on every frame */
-       REG_UPDATE_3(HDMI_VBI_PACKET_CONTROL,
-               HDMI_GC_CONT, 1,
-               HDMI_GC_SEND, 1,
-               HDMI_NULL_SEND, 1);
-
-       /* Disable Audio Content Protection packet transmission */
-       REG_UPDATE(HDMI_VBI_PACKET_CONTROL, HDMI_ACP_SEND, 0);
-       /* following belongs to audio */
-       /* Enable Audio InfoFrame packet transmission. */
-       REG_UPDATE(HDMI_INFOFRAME_CONTROL0, HDMI_AUDIO_INFO_SEND, 1);
-
-       /* update double-buffered AUDIO_INFO registers immediately */
-       ASSERT(enc->afmt);
-       enc->afmt->funcs->audio_info_immediate_update(enc->afmt);
-
-       /* Select line number on which to send Audio InfoFrame packets */
-       REG_UPDATE(HDMI_INFOFRAME_CONTROL1, HDMI_AUDIO_INFO_LINE,
-                               VBI_LINE_0 + 2);
-
-       /* set HDMI GC AVMUTE */
-       REG_UPDATE(HDMI_GC, HDMI_GC_AVMUTE, 0);
-}
-
-static void enc401_set_dig_input_mode(struct stream_encoder *enc, unsigned int pix_per_container)
-{
-       struct dcn10_stream_encoder *enc1 = DCN10STRENC_FROM_STRENC(enc);
-
-       // The naming of this field is confusing, what it means is the output mode of otg, which
-       // is the input mode of the dig
-       switch (pix_per_container)      {
-       case 2:
-               REG_UPDATE(DIG_FIFO_CTRL0, DIG_FIFO_OUTPUT_PIXEL_PER_CYCLE, 0x1);
-               break;
-       case 4:
-               REG_UPDATE(DIG_FIFO_CTRL0, DIG_FIFO_OUTPUT_PIXEL_PER_CYCLE, 0x2);
-               break;
-       case 8:
-               REG_UPDATE(DIG_FIFO_CTRL0, DIG_FIFO_OUTPUT_PIXEL_PER_CYCLE, 0x3);
-               break;
-       default:
-               REG_UPDATE(DIG_FIFO_CTRL0, DIG_FIFO_OUTPUT_PIXEL_PER_CYCLE, 0x0);
-               break;
-       }
-}
-
-static bool is_two_pixels_per_containter(const struct dc_crtc_timing *timing)
-{
-       bool two_pix = timing->pixel_encoding == PIXEL_ENCODING_YCBCR420;
-
-       two_pix = two_pix || (timing->flags.DSC && timing->pixel_encoding == PIXEL_ENCODING_YCBCR422
-                       && !timing->dsc_cfg.ycbcr422_simple);
-       return two_pix;
-}
-
-static void enc401_stream_encoder_dp_unblank(
-               struct dc_link *link,
-               struct stream_encoder *enc,
-               const struct encoder_unblank_param *param)
-{
-       struct dcn10_stream_encoder *enc1 = DCN10STRENC_FROM_STRENC(enc);
-
-       if (param->link_settings.link_rate != LINK_RATE_UNKNOWN) {
-               uint32_t n_vid = 0x8000;
-               uint32_t m_vid;
-               uint32_t pix_per_container = 1;
-               uint64_t m_vid_l = n_vid;
-
-               /* YCbCr 4:2:0 or YCbCr4:2:2 simple + DSC: Computed VID_M will be 2X the input rate */
-               if (is_two_pixels_per_containter(&param->timing)) {
-                       pix_per_container = 2;
-               }
-
-               /* M / N = Fstream / Flink
-                * m_vid / n_vid = pixel rate / link rate
-                */
-               m_vid_l *= param->timing.pix_clk_100hz / pix_per_container / 10;
-               m_vid_l = div_u64(m_vid_l,
-                       param->link_settings.link_rate
-                               * LINK_RATE_REF_FREQ_IN_KHZ);
-
-               m_vid = (uint32_t) m_vid_l;
-
-               /* enable auto measurement */
-
-               REG_UPDATE(DP_VID_TIMING, DP_VID_M_N_GEN_EN, 0);
-
-               /* auto measurement need 1 full 0x8000 symbol cycle to kick in,
-                * therefore program initial value for Mvid and Nvid
-                */
-
-               REG_UPDATE(DP_VID_N, DP_VID_N, n_vid);
-
-               REG_UPDATE(DP_VID_M, DP_VID_M, m_vid);
-
-               /* reduce jitter based on read rate */
-               switch (param->pix_per_cycle)   {
-               case 2:
-                       REG_UPDATE(DP_VID_TIMING, DP_VID_N_INTERVAL, 0x1);
-                       break;
-               case 4:
-                       REG_UPDATE(DP_VID_TIMING, DP_VID_N_INTERVAL, 0x2);
-                       break;
-               case 8:
-                       REG_UPDATE(DP_VID_TIMING, DP_VID_N_INTERVAL, 0x3);
-                       break;
-               default:
-                       REG_UPDATE(DP_VID_TIMING, DP_VID_N_INTERVAL, 0x0);
-                       break;
-               }
-
-               REG_UPDATE(DP_VID_TIMING, DP_VID_M_N_GEN_EN, 1);
-       }
-
-       /* make sure stream is disabled before resetting steer fifo */
-       REG_UPDATE(DP_VID_STREAM_CNTL, DP_VID_STREAM_ENABLE, false);
-       REG_WAIT(DP_VID_STREAM_CNTL, DP_VID_STREAM_STATUS, 0, 10, 5000);
-
-       /* DIG_START is removed from the register spec */
-
-       /* switch DP encoder to CRTC data, but reset it the fifo first. It may happen
-        * that it overflows during mode transition, and sometimes doesn't recover.
-        */
-       REG_UPDATE(DP_STEER_FIFO, DP_STEER_FIFO_RESET, 1);
-       udelay(10);
-
-       REG_UPDATE(DP_STEER_FIFO, DP_STEER_FIFO_RESET, 0);
-
-       REG_UPDATE(DP_STEER_FIFO, DP_STEER_FIFO_ENABLE, 1);
-
-       REG_UPDATE_2(DP_VID_STREAM_CNTL, DP_VID_STREAM_ENABLE, 1, DP_VID_STREAM_DIS_DEFER, 2);
-       udelay(200);
-
-       /* DIG Resync FIFO now needs to be explicitly enabled
-        */
-       /* read start level = 0 will bring underflow / overflow and DIG_FIFO_ERROR = 1
-        * so set it to 1/2 full = 7 before reset as suggested by hardware team.
-        */
-       REG_UPDATE(DIG_FIFO_CTRL0, DIG_FIFO_READ_START_LEVEL, 0x7);
-
-       REG_UPDATE(DIG_FIFO_CTRL0, DIG_FIFO_RESET, 1);
-
-       REG_WAIT(DIG_FIFO_CTRL0, DIG_FIFO_RESET_DONE, 1, 10, 5000);
-
-       REG_UPDATE(DIG_FIFO_CTRL0, DIG_FIFO_RESET, 0);
-
-       REG_WAIT(DIG_FIFO_CTRL0, DIG_FIFO_RESET_DONE, 0, 10, 5000);
-
-       REG_UPDATE(DIG_FIFO_CTRL0, DIG_FIFO_ENABLE, 1);
-
-       /* wait 100us for DIG/DP logic to prime
-        * (i.e. a few video lines)
-        */
-       udelay(100);
-
-       /* the hardware would start sending video at the start of the next DP
-        * frame (i.e. rising edge of the vblank).
-        * NOTE: We used to program DP_VID_STREAM_DIS_DEFER = 2 here, but this
-        * register has no effect on enable transition! HW always guarantees
-        * VID_STREAM enable at start of next frame, and this is not
-        * programmable
-        */
-
-       REG_UPDATE(DP_VID_STREAM_CNTL, DP_VID_STREAM_ENABLE, true);
-
-       link->dc->link_srv->dp_trace_source_sequence(link, DPCD_SOURCE_SEQ_AFTER_ENABLE_DP_VID_STREAM);
-}
-
-/* this function read dsc related register fields to be logged later in dcn10_log_hw_state
- * into a dcn_dsc_state struct.
- */
-static void enc401_read_state(struct stream_encoder *enc, struct enc_state *s)
-{
-       struct dcn10_stream_encoder *enc1 = DCN10STRENC_FROM_STRENC(enc);
-
-       //if dsc is enabled, continue to read
-       REG_GET(DP_PIXEL_FORMAT, PIXEL_ENCODING_TYPE, &s->dsc_mode);
-
-       if (s->dsc_mode) {
-               REG_GET(DP_GSP11_CNTL, DP_SEC_GSP11_LINE_NUM, &s->sec_gsp_pps_line_num);
-
-               REG_GET(DP_MSA_VBID_MISC, DP_VBID6_LINE_REFERENCE, &s->vbid6_line_reference);
-               REG_GET(DP_MSA_VBID_MISC, DP_VBID6_LINE_NUM, &s->vbid6_line_num);
-
-               REG_GET(DP_GSP11_CNTL, DP_SEC_GSP11_ENABLE, &s->sec_gsp_pps_enable);
-               REG_GET(DP_SEC_CNTL, DP_SEC_STREAM_ENABLE, &s->sec_stream_enable);
-       }
-}
-
-static void enc401_stream_encoder_enable(
-       struct stream_encoder *enc,
-       enum signal_type signal,
-       bool enable)
-{
-       struct dcn10_stream_encoder *enc1 = DCN10STRENC_FROM_STRENC(enc);
-       if (enable) {
-               switch (signal) {
-               case SIGNAL_TYPE_DVI_SINGLE_LINK:
-               case SIGNAL_TYPE_DVI_DUAL_LINK:
-                       /* TMDS-DVI */
-                       REG_UPDATE(DIG_FE_CLK_CNTL, DIG_FE_MODE, 2);
-                       break;
-               case SIGNAL_TYPE_HDMI_TYPE_A:
-                       /* TMDS-HDMI */
-                       REG_UPDATE(DIG_FE_CLK_CNTL, DIG_FE_MODE, 3);
-                       break;
-               case SIGNAL_TYPE_DISPLAY_PORT_MST:
-                       /* DP MST */
-                       REG_UPDATE(DIG_FE_CLK_CNTL, DIG_FE_MODE, 5);
-                       break;
-               case SIGNAL_TYPE_EDP:
-               case SIGNAL_TYPE_DISPLAY_PORT:
-               case SIGNAL_TYPE_VIRTUAL:
-                       /* DP SST */
-                       REG_UPDATE(DIG_FE_CLK_CNTL, DIG_FE_MODE, 0);
-                       break;
-               default:
-                       /* invalid mode ! */
-                       ASSERT_CRITICAL(false);
-               }
-
-               REG_UPDATE(DIG_FE_CLK_CNTL, DIG_FE_CLK_EN, 1);
-               REG_UPDATE(DIG_FE_EN_CNTL, DIG_FE_ENABLE, 1);
-       } else {
-               REG_UPDATE(DIG_FE_EN_CNTL, DIG_FE_ENABLE, 0);
-               REG_UPDATE(DIG_FE_CLK_CNTL, DIG_FE_CLK_EN, 0);
-       }
-}
-
-void enc401_stream_encoder_dp_set_stream_attribute(
-       struct stream_encoder *enc,
-       struct dc_crtc_timing *crtc_timing,
-       enum dc_color_space output_color_space,
-       bool use_vsc_sdp_for_colorimetry,
-       uint32_t enable_sdp_splitting)
-{
-       uint32_t h_active_start;
-       uint32_t v_active_start;
-       uint32_t misc0 = 0;
-       uint32_t misc1 = 0;
-       uint32_t h_blank;
-       uint32_t h_back_porch;
-       uint8_t synchronous_clock = 0; /* asynchronous mode */
-       uint8_t colorimetry_bpc;
-       uint8_t dp_pixel_encoding = 0;
-       uint8_t dp_component_depth = 0;
-       uint8_t dp_translate_pixel_enc = 0;
-       // Fix set but not used warnings
-       //uint8_t dp_pixel_encoding_type = 0;
-       uint8_t dp_compressed_pixel_format = 0;
-
-       struct dcn10_stream_encoder *enc1 = DCN10STRENC_FROM_STRENC(enc);
-       struct dc_crtc_timing hw_crtc_timing = *crtc_timing;
-
-       if (hw_crtc_timing.flags.INTERLACE) {
-               /*the input timing is in VESA spec format with Interlace flag =1*/
-               hw_crtc_timing.v_total /= 2;
-               hw_crtc_timing.v_border_top /= 2;
-               hw_crtc_timing.v_addressable /= 2;
-               hw_crtc_timing.v_border_bottom /= 2;
-               hw_crtc_timing.v_front_porch /= 2;
-               hw_crtc_timing.v_sync_width /= 2;
-       }
-
-
-       /* set pixel encoding */
-       switch (hw_crtc_timing.pixel_encoding) {
-       case PIXEL_ENCODING_YCBCR422:
-               dp_pixel_encoding = DP_PIXEL_ENCODING_TYPE_YCBCR422;
-               break;
-       case PIXEL_ENCODING_YCBCR444:
-               dp_pixel_encoding = DP_PIXEL_ENCODING_TYPE_YCBCR444;
-
-               if (hw_crtc_timing.flags.Y_ONLY)
-                       if (hw_crtc_timing.display_color_depth != COLOR_DEPTH_666)
-                               /* HW testing only, no use case yet.
-                                * Color depth of Y-only could be
-                                * 8, 10, 12, 16 bits
-                                */
-                               dp_pixel_encoding = DP_PIXEL_ENCODING_TYPE_Y_ONLY;
-
-               /* Note: DP_MSA_MISC1 bit 7 is the indicator
-                * of Y-only mode.
-                * This bit is set in HW if register
-                * DP_PIXEL_ENCODING is programmed to 0x4
-                */
-               break;
-       case PIXEL_ENCODING_YCBCR420:
-               dp_pixel_encoding = DP_PIXEL_ENCODING_TYPE_YCBCR420;
-               break;
-       default:
-               dp_pixel_encoding = DP_PIXEL_ENCODING_TYPE_RGB444;
-               break;
-       }
-
-       misc1 = REG_READ(DP_MSA_MISC);
-       /* For YCbCr420 and BT2020 Colorimetry Formats, VSC SDP shall be used.
-        * When MISC1, bit 6, is Set to 1, a Source device uses a VSC SDP to indicate the
-        * Pixel Encoding/Colorimetry Format and that a Sink device shall ignore MISC1, bit 7,
-        * and MISC0, bits 7:1 (MISC1, bit 7, and MISC0, bits 7:1, become "don't care").
-        */
-       if (use_vsc_sdp_for_colorimetry)
-               misc1 = misc1 | 0x40;
-       else
-               misc1 = misc1 & ~0x40;
-
-       /* set color depth */
-       switch (hw_crtc_timing.display_color_depth) {
-       case COLOR_DEPTH_666:
-               dp_component_depth = DP_COMPONENT_PIXEL_DEPTH_6BPC;
-               break;
-       case COLOR_DEPTH_888:
-               dp_component_depth = DP_COMPONENT_PIXEL_DEPTH_8BPC;
-               break;
-       case COLOR_DEPTH_101010:
-               dp_component_depth = DP_COMPONENT_PIXEL_DEPTH_10BPC;
-               break;
-       case COLOR_DEPTH_121212:
-               dp_component_depth = DP_COMPONENT_PIXEL_DEPTH_12BPC;
-               break;
-       case COLOR_DEPTH_161616:
-               dp_component_depth = DP_COMPONENT_PIXEL_DEPTH_16BPC;
-               break;
-       default:
-               dp_component_depth = DP_COMPONENT_PIXEL_DEPTH_6BPC;
-               break;
-       }
-
-       if (hw_crtc_timing.flags.DSC) {
-               // Fix set but not used error
-               //dp_pixel_encoding_type = 1;
-               switch (hw_crtc_timing.pixel_encoding) {
-               case PIXEL_ENCODING_YCBCR444:
-                       dp_compressed_pixel_format = 0;
-                       break;
-               case PIXEL_ENCODING_YCBCR422:
-                       dp_compressed_pixel_format = 1;
-                       if (hw_crtc_timing.dsc_cfg.ycbcr422_simple)
-                               dp_compressed_pixel_format = 0;
-                       break;
-               case PIXEL_ENCODING_YCBCR420:
-                       dp_compressed_pixel_format = 1;
-                       break;
-               default:
-                       dp_compressed_pixel_format = 0;
-                       break;
-               }
-       } else {
-               // Fix set but not used error
-               //dp_pixel_encoding_type = 0;
-               switch (dp_pixel_encoding) {
-               case DP_PIXEL_ENCODING_TYPE_RGB444:
-                       dp_translate_pixel_enc = 0;
-                       break;
-               case DP_PIXEL_ENCODING_TYPE_YCBCR422:
-                       dp_translate_pixel_enc = 1;
-                       break;
-               case DP_PIXEL_ENCODING_TYPE_YCBCR444:
-                       dp_translate_pixel_enc = 0;
-                       break;
-               case DP_PIXEL_ENCODING_TYPE_Y_ONLY:
-                       dp_translate_pixel_enc = 3;
-                       break;
-               case DP_PIXEL_ENCODING_TYPE_YCBCR420:
-                       dp_translate_pixel_enc = 2;
-                       break;
-               default:
-                       ASSERT(0);
-                       break;
-               }
-       }
-       /* Set DP pixel encoding and component depth */
-       REG_UPDATE_4(DP_PIXEL_FORMAT,
-                       PIXEL_ENCODING_TYPE, hw_crtc_timing.flags.DSC ? 1 : 0,
-                       UNCOMPRESSED_PIXEL_FORMAT, dp_translate_pixel_enc,
-                       UNCOMPRESSED_COMPONENT_DEPTH, dp_component_depth,
-                       COMPRESSED_PIXEL_FORMAT, dp_compressed_pixel_format);
-
-       /* set dynamic range and YCbCr range */
-
-       switch (hw_crtc_timing.display_color_depth) {
-       case COLOR_DEPTH_666:
-               colorimetry_bpc = 0;
-               break;
-       case COLOR_DEPTH_888:
-               colorimetry_bpc = 1;
-               break;
-       case COLOR_DEPTH_101010:
-               colorimetry_bpc = 2;
-               break;
-       case COLOR_DEPTH_121212:
-               colorimetry_bpc = 3;
-               break;
-       default:
-               colorimetry_bpc = 0;
-               break;
-       }
-
-       misc0 = misc0 | synchronous_clock;
-       misc0 = colorimetry_bpc << 5;
-
-       switch (output_color_space) {
-       case COLOR_SPACE_SRGB:
-               misc1 = misc1 & ~0x80; /* bit7 = 0*/
-               break;
-       case COLOR_SPACE_SRGB_LIMITED:
-               misc0 = misc0 | 0x8; /* bit3=1 */
-               misc1 = misc1 & ~0x80; /* bit7 = 0*/
-               break;
-       case COLOR_SPACE_YCBCR601:
-       case COLOR_SPACE_YCBCR601_LIMITED:
-               misc0 = misc0 | 0x8; /* bit3=1, bit4=0 */
-               misc1 = misc1 & ~0x80; /* bit7 = 0*/
-               if (hw_crtc_timing.pixel_encoding == PIXEL_ENCODING_YCBCR422)
-                       misc0 = misc0 | 0x2; /* bit2=0, bit1=1 */
-               else if (hw_crtc_timing.pixel_encoding == PIXEL_ENCODING_YCBCR444)
-                       misc0 = misc0 | 0x4; /* bit2=1, bit1=0 */
-               break;
-       case COLOR_SPACE_YCBCR709:
-       case COLOR_SPACE_YCBCR709_LIMITED:
-               misc0 = misc0 | 0x18; /* bit3=1, bit4=1 */
-               misc1 = misc1 & ~0x80; /* bit7 = 0*/
-               if (hw_crtc_timing.pixel_encoding == PIXEL_ENCODING_YCBCR422)
-                       misc0 = misc0 | 0x2; /* bit2=0, bit1=1 */
-               else if (hw_crtc_timing.pixel_encoding == PIXEL_ENCODING_YCBCR444)
-                       misc0 = misc0 | 0x4; /* bit2=1, bit1=0 */
-               break;
-       case COLOR_SPACE_2020_RGB_LIMITEDRANGE:
-       case COLOR_SPACE_2020_RGB_FULLRANGE:
-       case COLOR_SPACE_2020_YCBCR:
-       case COLOR_SPACE_XR_RGB:
-       case COLOR_SPACE_MSREF_SCRGB:
-       case COLOR_SPACE_ADOBERGB:
-       case COLOR_SPACE_DCIP3:
-       case COLOR_SPACE_XV_YCC_709:
-       case COLOR_SPACE_XV_YCC_601:
-       case COLOR_SPACE_DISPLAYNATIVE:
-       case COLOR_SPACE_DOLBYVISION:
-       case COLOR_SPACE_APPCTRL:
-       case COLOR_SPACE_CUSTOMPOINTS:
-       case COLOR_SPACE_UNKNOWN:
-       case COLOR_SPACE_YCBCR709_BLACK:
-               /* do nothing */
-               break;
-       }
-
-       REG_SET(DP_MSA_COLORIMETRY, 0, DP_MSA_MISC0, misc0);
-       REG_WRITE(DP_MSA_MISC, misc1);   /* MSA_MISC1 */
-
-       /* dcn new register
-        * dc_crtc_timing is vesa dmt struct. data from edid
-        */
-       REG_SET_2(DP_MSA_TIMING_PARAM1, 0,
-                       DP_MSA_HTOTAL, hw_crtc_timing.h_total,
-                       DP_MSA_VTOTAL, hw_crtc_timing.v_total);
-
-       /* calculate from vesa timing parameters
-        * h_active_start related to leading edge of sync
-        */
-
-       h_blank = hw_crtc_timing.h_total - hw_crtc_timing.h_border_left -
-                       hw_crtc_timing.h_addressable - hw_crtc_timing.h_border_right;
-
-       h_back_porch = h_blank - hw_crtc_timing.h_front_porch -
-                       hw_crtc_timing.h_sync_width;
-
-       /* start at beginning of left border */
-       h_active_start = hw_crtc_timing.h_sync_width + h_back_porch;
-
-
-       v_active_start = hw_crtc_timing.v_total - hw_crtc_timing.v_border_top -
-                       hw_crtc_timing.v_addressable - hw_crtc_timing.v_border_bottom -
-                       hw_crtc_timing.v_front_porch;
-
-
-       /* start at beginning of left border */
-       REG_SET_2(DP_MSA_TIMING_PARAM2, 0,
-               DP_MSA_HSTART, h_active_start,
-               DP_MSA_VSTART, v_active_start);
-
-       REG_SET_4(DP_MSA_TIMING_PARAM3, 0,
-                       DP_MSA_HSYNCWIDTH,
-                       hw_crtc_timing.h_sync_width,
-                       DP_MSA_HSYNCPOLARITY,
-                       !hw_crtc_timing.flags.HSYNC_POSITIVE_POLARITY,
-                       DP_MSA_VSYNCWIDTH,
-                       hw_crtc_timing.v_sync_width,
-                       DP_MSA_VSYNCPOLARITY,
-                       !hw_crtc_timing.flags.VSYNC_POSITIVE_POLARITY);
-
-       /* HWDITH include border or overscan */
-       REG_SET_2(DP_MSA_TIMING_PARAM4, 0,
-               DP_MSA_HWIDTH, hw_crtc_timing.h_border_left +
-               hw_crtc_timing.h_addressable + hw_crtc_timing.h_border_right,
-               DP_MSA_VHEIGHT, hw_crtc_timing.v_border_top +
-               hw_crtc_timing.v_addressable + hw_crtc_timing.v_border_bottom);
-
-       REG_UPDATE(DP_SEC_FRAMING4,
-               DP_SST_SDP_SPLITTING, enable_sdp_splitting);
-}
-
-static void enc401_stream_encoder_map_to_link(
-               struct stream_encoder *enc,
-               uint32_t stream_enc_inst,
-               uint32_t link_enc_inst)
-{
-       struct dcn10_stream_encoder *enc1 = DCN10STRENC_FROM_STRENC(enc);
-
-       REG_UPDATE(STREAM_MAPPER_CONTROL,
-                               DIG_STREAM_LINK_TARGET, link_enc_inst);
-}
-
-static const struct stream_encoder_funcs dcn401_str_enc_funcs = {
-       .dp_set_odm_combine =
-               enc401_dp_set_odm_combine,
-       .dp_set_stream_attribute =
-               enc401_stream_encoder_dp_set_stream_attribute,
-       .hdmi_set_stream_attribute =
-               enc401_stream_encoder_hdmi_set_stream_attribute,
-       .dvi_set_stream_attribute =
-               enc401_stream_encoder_dvi_set_stream_attribute,
-       .set_throttled_vcp_size =
-               enc1_stream_encoder_set_throttled_vcp_size,
-       .update_hdmi_info_packets =
-               enc3_stream_encoder_update_hdmi_info_packets,
-       .stop_hdmi_info_packets =
-               enc3_stream_encoder_stop_hdmi_info_packets,
-       .update_dp_info_packets_sdp_line_num =
-               enc3_stream_encoder_update_dp_info_packets_sdp_line_num,
-       .update_dp_info_packets =
-               enc3_stream_encoder_update_dp_info_packets,
-       .stop_dp_info_packets =
-               enc1_stream_encoder_stop_dp_info_packets,
-       .dp_blank =
-               enc1_stream_encoder_dp_blank,
-       .dp_unblank =
-               enc401_stream_encoder_dp_unblank,
-       .audio_mute_control = enc3_audio_mute_control,
-
-       .dp_audio_setup = enc3_se_dp_audio_setup,
-       .dp_audio_enable = enc3_se_dp_audio_enable,
-       .dp_audio_disable = enc1_se_dp_audio_disable,
-
-       .hdmi_audio_setup = enc3_se_hdmi_audio_setup,
-       .hdmi_audio_disable = enc1_se_hdmi_audio_disable,
-       .setup_stereo_sync  = enc1_setup_stereo_sync,
-       .set_avmute = enc1_stream_encoder_set_avmute,
-       .dig_connect_to_otg = enc1_dig_connect_to_otg,
-       .dig_source_otg = enc1_dig_source_otg,
-
-       .dp_get_pixel_format  = enc1_stream_encoder_dp_get_pixel_format,
-
-       .enc_read_state = enc401_read_state,
-       .dp_set_dsc_config = NULL,
-       .dp_set_dsc_pps_info_packet = enc3_dp_set_dsc_pps_info_packet,
-       .set_dynamic_metadata = enc401_set_dynamic_metadata,
-       .hdmi_reset_stream_attribute = enc1_reset_hdmi_stream_attribute,
-       .enable_stream = enc401_stream_encoder_enable,
-
-       .set_input_mode = enc401_set_dig_input_mode,
-       .enable_fifo = enc35_enable_fifo,
-       .disable_fifo = enc35_disable_fifo,
-       .map_stream_to_link = enc401_stream_encoder_map_to_link,
-};
-
-void dcn401_dio_stream_encoder_construct(
-       struct dcn10_stream_encoder *enc1,
-       struct dc_context *ctx,
-       struct dc_bios *bp,
-       enum engine_id eng_id,
-       struct vpg *vpg,
-       struct afmt *afmt,
-       const struct dcn10_stream_enc_registers *regs,
-       const struct dcn10_stream_encoder_shift *se_shift,
-       const struct dcn10_stream_encoder_mask *se_mask)
-{
-       enc1->base.funcs = &dcn401_str_enc_funcs;
-       enc1->base.ctx = ctx;
-       enc1->base.id = eng_id;
-       enc1->base.bp = bp;
-       enc1->base.vpg = vpg;
-       enc1->base.afmt = afmt;
-       enc1->regs = regs;
-       enc1->se_shift = se_shift;
-       enc1->se_mask = se_mask;
-       enc1->base.stream_enc_inst = vpg->inst;
-}
-
-void enc401_set_dynamic_metadata(struct stream_encoder *enc,
-               bool enable_dme,
-               uint32_t hubp_requestor_id,
-               enum dynamic_metadata_mode dmdata_mode)
-{
-       struct dcn10_stream_encoder *enc1 = DCN10STRENC_FROM_STRENC(enc);
-
-       if (enable_dme) {
-               REG_UPDATE_2(DME_CONTROL,
-                               METADATA_HUBP_REQUESTOR_ID, hubp_requestor_id,
-                               METADATA_STREAM_TYPE, (dmdata_mode == dmdata_dolby_vision) ? 1 : 0);
-
-               /* Use default line reference DP_SOF for bringup.
-                * Should use OTG_SOF for DRR cases
-                */
-               if (dmdata_mode == dmdata_dp)
-                       REG_UPDATE_3(DP_SEC_METADATA_TRANSMISSION,
-                                       DP_SEC_METADATA_PACKET_ENABLE, 1,
-                                       DP_SEC_METADATA_PACKET_LINE_REFERENCE, 0,
-                                       DP_SEC_METADATA_PACKET_LINE, 20);
-               else {
-                       REG_UPDATE_3(HDMI_METADATA_PACKET_CONTROL,
-                                       HDMI_METADATA_PACKET_ENABLE, 1,
-                                       HDMI_METADATA_PACKET_LINE_REFERENCE, 0,
-                                       HDMI_METADATA_PACKET_LINE, 2);
-
-                       if (dmdata_mode == dmdata_dolby_vision)
-                               REG_UPDATE(HDMI_CONTROL,
-                                               DOLBY_VISION_EN, 1);
-               }
-
-               REG_UPDATE(DME_CONTROL,
-                               METADATA_ENGINE_EN, 1);
-       } else {
-               REG_UPDATE(DME_CONTROL,
-                               METADATA_ENGINE_EN, 0);
-
-               if (dmdata_mode == dmdata_dp)
-                       REG_UPDATE(DP_SEC_METADATA_TRANSMISSION,
-                                       DP_SEC_METADATA_PACKET_ENABLE, 0);
-               else {
-                       REG_UPDATE(HDMI_METADATA_PACKET_CONTROL,
-                                       HDMI_METADATA_PACKET_ENABLE, 0);
-                       REG_UPDATE(HDMI_CONTROL,
-                                       DOLBY_VISION_EN, 0);
-               }
-       }
-}
-void enc401_stream_encoder_set_stream_attribute_helper(
-               struct dcn10_stream_encoder *enc1,
-               struct dc_crtc_timing *crtc_timing)
-{
-       switch (crtc_timing->pixel_encoding) {
-       case PIXEL_ENCODING_YCBCR422:
-               REG_UPDATE(HDMI_CONTROL, TMDS_PIXEL_ENCODING, 1);
-               break;
-       default:
-               REG_UPDATE(HDMI_CONTROL, TMDS_PIXEL_ENCODING, 0);
-               break;
-       }
-       REG_UPDATE(HDMI_CONTROL, TMDS_COLOR_FORMAT, 0);
-}
diff --git a/drivers/gpu/drm/amd/display/dc/dcn401/dcn401_dio_stream_encoder.h b/drivers/gpu/drm/amd/display/dc/dcn401/dcn401_dio_stream_encoder.h
deleted file mode 100644 (file)
index d751839..0000000
+++ /dev/null
@@ -1,217 +0,0 @@
-/*
- * Copyright 2021 - Advanced Micro Devices, Inc.
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the "Software"),
- * to deal in the Software without restriction, including without limitation
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
- *  and/or sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
- * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
- * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
- * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
- * OTHER DEALINGS IN THE SOFTWARE.
- *
- * Authors: AMD
- *
- */
-
-#ifndef __DC_DIO_STREAM_ENCODER_DCN401_H__
-#define __DC_DIO_STREAM_ENCODER_DCN401_H__
-
-#include "dcn30/dcn30_vpg.h"
-#include "dcn30/dcn30_afmt.h"
-#include "stream_encoder.h"
-#include "dcn20/dcn20_stream_encoder.h"
-
-#define SE_COMMON_MASK_SH_LIST_DCN401(mask_sh)\
-       SE_SF(DP0_DP_PIXEL_FORMAT, PIXEL_ENCODING_TYPE, mask_sh),\
-       SE_SF(DP0_DP_PIXEL_FORMAT, UNCOMPRESSED_PIXEL_FORMAT, mask_sh),\
-       SE_SF(DP0_DP_PIXEL_FORMAT, UNCOMPRESSED_COMPONENT_DEPTH, mask_sh),\
-       SE_SF(DP0_DP_PIXEL_FORMAT, COMPRESSED_PIXEL_FORMAT, mask_sh),\
-       SE_SF(DIG0_HDMI_CONTROL, HDMI_PACKET_GEN_VERSION, mask_sh),\
-       SE_SF(DIG0_HDMI_CONTROL, HDMI_KEEPOUT_MODE, mask_sh),\
-       SE_SF(DIG0_HDMI_CONTROL, HDMI_DEEP_COLOR_ENABLE, mask_sh),\
-       SE_SF(DIG0_HDMI_CONTROL, HDMI_DEEP_COLOR_DEPTH, mask_sh),\
-       SE_SF(DIG0_HDMI_CONTROL, HDMI_DATA_SCRAMBLE_EN, mask_sh),\
-       SE_SF(DIG0_HDMI_CONTROL, HDMI_NO_EXTRA_NULL_PACKET_FILLED, mask_sh),\
-       SE_SF(DIG0_HDMI_VBI_PACKET_CONTROL, HDMI_GC_CONT, mask_sh),\
-       SE_SF(DIG0_HDMI_VBI_PACKET_CONTROL, HDMI_GC_SEND, mask_sh),\
-       SE_SF(DIG0_HDMI_VBI_PACKET_CONTROL, HDMI_NULL_SEND, mask_sh),\
-       SE_SF(DIG0_HDMI_VBI_PACKET_CONTROL, HDMI_ACP_SEND, mask_sh),\
-       SE_SF(DIG0_HDMI_INFOFRAME_CONTROL0, HDMI_AUDIO_INFO_SEND, mask_sh),\
-       SE_SF(DIG0_HDMI_INFOFRAME_CONTROL1, HDMI_AUDIO_INFO_LINE, mask_sh),\
-       SE_SF(DIG0_HDMI_GC, HDMI_GC_AVMUTE, mask_sh),\
-       SE_SF(DP0_DP_MSE_RATE_CNTL, DP_MSE_RATE_X, mask_sh),\
-       SE_SF(DP0_DP_MSE_RATE_CNTL, DP_MSE_RATE_Y, mask_sh),\
-       SE_SF(DP0_DP_MSE_RATE_UPDATE, DP_MSE_RATE_UPDATE_PENDING, mask_sh),\
-       SE_SF(DP0_DP_SEC_CNTL, DP_SEC_GSP0_ENABLE, mask_sh),\
-       SE_SF(DP0_DP_SEC_CNTL, DP_SEC_STREAM_ENABLE, mask_sh),\
-       SE_SF(DP0_DP_SEC_CNTL, DP_SEC_GSP1_ENABLE, mask_sh),\
-       SE_SF(DP0_DP_SEC_CNTL, DP_SEC_GSP2_ENABLE, mask_sh),\
-       SE_SF(DP0_DP_SEC_CNTL, DP_SEC_GSP3_ENABLE, mask_sh),\
-       SE_SF(DP0_DP_SEC_CNTL, DP_SEC_MPG_ENABLE, mask_sh),\
-       SE_SF(DP0_DP_SEC_CNTL1, DP_SEC_GSP5_LINE_REFERENCE, mask_sh),\
-       SE_SF(DP0_DP_SEC_CNTL2, DP_SEC_GSP4_SEND, mask_sh),\
-       SE_SF(DP0_DP_SEC_CNTL2, DP_SEC_GSP4_SEND_PENDING, mask_sh),\
-       SE_SF(DP0_DP_SEC_CNTL4, DP_SEC_GSP4_LINE_NUM, mask_sh),\
-       SE_SF(DP0_DP_SEC_CNTL5, DP_SEC_GSP5_LINE_NUM, mask_sh),\
-       SE_SF(DP0_DP_SEC_CNTL2, DP_SEC_GSP4_SEND_ANY_LINE, mask_sh),\
-       SE_SF(DP0_DP_VID_STREAM_CNTL, DP_VID_STREAM_DIS_DEFER, mask_sh),\
-       SE_SF(DP0_DP_VID_STREAM_CNTL, DP_VID_STREAM_ENABLE, mask_sh),\
-       SE_SF(DP0_DP_VID_STREAM_CNTL, DP_VID_STREAM_STATUS, mask_sh),\
-       SE_SF(DP0_DP_STEER_FIFO, DP_STEER_FIFO_RESET, mask_sh),\
-       SE_SF(DP0_DP_STEER_FIFO, DP_STEER_FIFO_ENABLE, mask_sh),\
-       SE_SF(DP0_DP_VID_TIMING, DP_VID_M_N_GEN_EN, mask_sh),\
-       SE_SF(DP0_DP_VID_N, DP_VID_N, mask_sh),\
-       SE_SF(DP0_DP_VID_M, DP_VID_M, mask_sh),\
-       SE_SF(DIG0_HDMI_AUDIO_PACKET_CONTROL, HDMI_AUDIO_DELAY_EN, mask_sh),\
-       SE_SF(DIG0_HDMI_ACR_PACKET_CONTROL, HDMI_ACR_AUTO_SEND, mask_sh),\
-       SE_SF(DIG0_HDMI_ACR_PACKET_CONTROL, HDMI_ACR_SOURCE, mask_sh),\
-       SE_SF(DIG0_HDMI_ACR_PACKET_CONTROL, HDMI_ACR_AUDIO_PRIORITY, mask_sh),\
-       SE_SF(DIG0_HDMI_ACR_32_0, HDMI_ACR_CTS_32, mask_sh),\
-       SE_SF(DIG0_HDMI_ACR_32_1, HDMI_ACR_N_32, mask_sh),\
-       SE_SF(DIG0_HDMI_ACR_44_0, HDMI_ACR_CTS_44, mask_sh),\
-       SE_SF(DIG0_HDMI_ACR_44_1, HDMI_ACR_N_44, mask_sh),\
-       SE_SF(DIG0_HDMI_ACR_48_0, HDMI_ACR_CTS_48, mask_sh),\
-       SE_SF(DIG0_HDMI_ACR_48_1, HDMI_ACR_N_48, mask_sh),\
-       SE_SF(DP0_DP_SEC_AUD_N, DP_SEC_AUD_N, mask_sh),\
-       SE_SF(DP0_DP_SEC_TIMESTAMP, DP_SEC_TIMESTAMP_MODE, mask_sh),\
-       SE_SF(DP0_DP_SEC_CNTL, DP_SEC_ASP_ENABLE, mask_sh),\
-       SE_SF(DP0_DP_SEC_CNTL, DP_SEC_ATP_ENABLE, mask_sh),\
-       SE_SF(DP0_DP_SEC_CNTL, DP_SEC_AIP_ENABLE, mask_sh),\
-       SE_SF(DP0_DP_SEC_CNTL, DP_SEC_ACM_ENABLE, mask_sh),\
-       SE_SF(DIG0_AFMT_CNTL, AFMT_AUDIO_CLOCK_EN, mask_sh),\
-       SE_SF(DIG0_HDMI_CONTROL, HDMI_CLOCK_CHANNEL_RATE, mask_sh),\
-       SE_SF(DIG1_HDMI_CONTROL, TMDS_PIXEL_ENCODING, mask_sh),\
-       SE_SF(DIG1_HDMI_CONTROL, TMDS_COLOR_FORMAT, mask_sh),\
-       SE_SF(DIG0_DIG_FE_CNTL, DIG_STEREOSYNC_SELECT, mask_sh),\
-       SE_SF(DIG0_DIG_FE_CNTL, DIG_STEREOSYNC_GATE_EN, mask_sh),\
-       SE_SF(DP0_DP_SEC_CNTL, DP_SEC_GSP4_ENABLE, mask_sh),\
-       SE_SF(DP0_DP_SEC_CNTL, DP_SEC_GSP5_ENABLE, mask_sh),\
-       SE_SF(DP0_DP_SEC_CNTL, DP_SEC_GSP6_ENABLE, mask_sh),\
-       SE_SF(DP0_DP_SEC_CNTL, DP_SEC_GSP7_ENABLE, mask_sh),\
-       SE_SF(DP0_DP_SEC_CNTL2, DP_SEC_GSP7_SEND, mask_sh),\
-       SE_SF(DP0_DP_SEC_CNTL6, DP_SEC_GSP7_LINE_NUM, mask_sh),\
-       SE_SF(DP0_DP_SEC_CNTL2, DP_SEC_GSP11_PPS, mask_sh),\
-       SE_SF(DP0_DP_GSP11_CNTL, DP_SEC_GSP11_ENABLE, mask_sh),\
-       SE_SF(DP0_DP_GSP11_CNTL, DP_SEC_GSP11_LINE_NUM, mask_sh),\
-       SE_SF(DP0_DP_DB_CNTL, DP_DB_DISABLE, mask_sh),\
-       SE_SF(DP0_DP_MSA_COLORIMETRY, DP_MSA_MISC0, mask_sh),\
-       SE_SF(DP0_DP_MSA_TIMING_PARAM1, DP_MSA_HTOTAL, mask_sh),\
-       SE_SF(DP0_DP_MSA_TIMING_PARAM1, DP_MSA_VTOTAL, mask_sh),\
-       SE_SF(DP0_DP_MSA_TIMING_PARAM2, DP_MSA_HSTART, mask_sh),\
-       SE_SF(DP0_DP_MSA_TIMING_PARAM2, DP_MSA_VSTART, mask_sh),\
-       SE_SF(DP0_DP_MSA_TIMING_PARAM3, DP_MSA_HSYNCWIDTH, mask_sh),\
-       SE_SF(DP0_DP_MSA_TIMING_PARAM3, DP_MSA_HSYNCPOLARITY, mask_sh),\
-       SE_SF(DP0_DP_MSA_TIMING_PARAM3, DP_MSA_VSYNCWIDTH, mask_sh),\
-       SE_SF(DP0_DP_MSA_TIMING_PARAM3, DP_MSA_VSYNCPOLARITY, mask_sh),\
-       SE_SF(DP0_DP_MSA_TIMING_PARAM4, DP_MSA_HWIDTH, mask_sh),\
-       SE_SF(DP0_DP_MSA_TIMING_PARAM4, DP_MSA_VHEIGHT, mask_sh),\
-       SE_SF(DIG0_HDMI_DB_CONTROL, HDMI_DB_DISABLE, mask_sh),\
-       SE_SF(DP0_DP_VID_TIMING, DP_VID_N_INTERVAL, mask_sh),\
-       SE_SF(DIG0_DIG_FE_CNTL, DIG_SOURCE_SELECT, mask_sh), \
-       SE_SF(DIG0_HDMI_GENERIC_PACKET_CONTROL0, HDMI_GENERIC0_CONT, mask_sh),\
-       SE_SF(DIG0_HDMI_GENERIC_PACKET_CONTROL0, HDMI_GENERIC0_SEND, mask_sh),\
-       SE_SF(DIG0_HDMI_GENERIC_PACKET_CONTROL0, HDMI_GENERIC1_CONT, mask_sh),\
-       SE_SF(DIG0_HDMI_GENERIC_PACKET_CONTROL0, HDMI_GENERIC1_SEND, mask_sh),\
-       SE_SF(DIG0_HDMI_GENERIC_PACKET_CONTROL0, HDMI_GENERIC2_CONT, mask_sh),\
-       SE_SF(DIG0_HDMI_GENERIC_PACKET_CONTROL0, HDMI_GENERIC2_SEND, mask_sh),\
-       SE_SF(DIG0_HDMI_GENERIC_PACKET_CONTROL0, HDMI_GENERIC3_CONT, mask_sh),\
-       SE_SF(DIG0_HDMI_GENERIC_PACKET_CONTROL0, HDMI_GENERIC3_SEND, mask_sh),\
-       SE_SF(DIG0_HDMI_GENERIC_PACKET_CONTROL0, HDMI_GENERIC4_CONT, mask_sh),\
-       SE_SF(DIG0_HDMI_GENERIC_PACKET_CONTROL0, HDMI_GENERIC4_SEND, mask_sh),\
-       SE_SF(DIG0_HDMI_GENERIC_PACKET_CONTROL0, HDMI_GENERIC5_CONT, mask_sh),\
-       SE_SF(DIG0_HDMI_GENERIC_PACKET_CONTROL0, HDMI_GENERIC5_SEND, mask_sh),\
-       SE_SF(DIG0_HDMI_GENERIC_PACKET_CONTROL0, HDMI_GENERIC6_CONT, mask_sh),\
-       SE_SF(DIG0_HDMI_GENERIC_PACKET_CONTROL0, HDMI_GENERIC6_SEND, mask_sh),\
-       SE_SF(DIG0_HDMI_GENERIC_PACKET_CONTROL0, HDMI_GENERIC7_CONT, mask_sh),\
-       SE_SF(DIG0_HDMI_GENERIC_PACKET_CONTROL0, HDMI_GENERIC7_SEND, mask_sh),\
-       SE_SF(DIG0_HDMI_GENERIC_PACKET_CONTROL6, HDMI_GENERIC8_CONT, mask_sh),\
-       SE_SF(DIG0_HDMI_GENERIC_PACKET_CONTROL6, HDMI_GENERIC8_SEND, mask_sh),\
-       SE_SF(DIG0_HDMI_GENERIC_PACKET_CONTROL6, HDMI_GENERIC9_CONT, mask_sh),\
-       SE_SF(DIG0_HDMI_GENERIC_PACKET_CONTROL6, HDMI_GENERIC9_SEND, mask_sh),\
-       SE_SF(DIG0_HDMI_GENERIC_PACKET_CONTROL6, HDMI_GENERIC10_CONT, mask_sh),\
-       SE_SF(DIG0_HDMI_GENERIC_PACKET_CONTROL6, HDMI_GENERIC10_SEND, mask_sh),\
-       SE_SF(DIG0_HDMI_GENERIC_PACKET_CONTROL6, HDMI_GENERIC11_CONT, mask_sh),\
-       SE_SF(DIG0_HDMI_GENERIC_PACKET_CONTROL6, HDMI_GENERIC11_SEND, mask_sh),\
-       SE_SF(DIG0_HDMI_GENERIC_PACKET_CONTROL6, HDMI_GENERIC12_CONT, mask_sh),\
-       SE_SF(DIG0_HDMI_GENERIC_PACKET_CONTROL6, HDMI_GENERIC12_SEND, mask_sh),\
-       SE_SF(DIG0_HDMI_GENERIC_PACKET_CONTROL6, HDMI_GENERIC13_CONT, mask_sh),\
-       SE_SF(DIG0_HDMI_GENERIC_PACKET_CONTROL6, HDMI_GENERIC13_SEND, mask_sh),\
-       SE_SF(DIG0_HDMI_GENERIC_PACKET_CONTROL6, HDMI_GENERIC14_CONT, mask_sh),\
-       SE_SF(DIG0_HDMI_GENERIC_PACKET_CONTROL6, HDMI_GENERIC14_SEND, mask_sh),\
-       SE_SF(DIG0_HDMI_GENERIC_PACKET_CONTROL1, HDMI_GENERIC0_LINE, mask_sh),\
-       SE_SF(DIG0_HDMI_GENERIC_PACKET_CONTROL1, HDMI_GENERIC1_LINE, mask_sh),\
-       SE_SF(DIG0_HDMI_GENERIC_PACKET_CONTROL2, HDMI_GENERIC2_LINE, mask_sh),\
-       SE_SF(DIG0_HDMI_GENERIC_PACKET_CONTROL2, HDMI_GENERIC3_LINE, mask_sh),\
-       SE_SF(DIG0_HDMI_GENERIC_PACKET_CONTROL3, HDMI_GENERIC4_LINE, mask_sh),\
-       SE_SF(DIG0_HDMI_GENERIC_PACKET_CONTROL3, HDMI_GENERIC5_LINE, mask_sh),\
-       SE_SF(DIG0_HDMI_GENERIC_PACKET_CONTROL4, HDMI_GENERIC6_LINE, mask_sh),\
-       SE_SF(DIG0_HDMI_GENERIC_PACKET_CONTROL4, HDMI_GENERIC7_LINE, mask_sh),\
-       SE_SF(DIG0_HDMI_GENERIC_PACKET_CONTROL7, HDMI_GENERIC8_LINE, mask_sh),\
-       SE_SF(DIG0_HDMI_GENERIC_PACKET_CONTROL7, HDMI_GENERIC9_LINE, mask_sh),\
-       SE_SF(DIG0_HDMI_GENERIC_PACKET_CONTROL8, HDMI_GENERIC10_LINE, mask_sh),\
-       SE_SF(DIG0_HDMI_GENERIC_PACKET_CONTROL8, HDMI_GENERIC11_LINE, mask_sh),\
-       SE_SF(DIG0_HDMI_GENERIC_PACKET_CONTROL9, HDMI_GENERIC12_LINE, mask_sh),\
-       SE_SF(DIG0_HDMI_GENERIC_PACKET_CONTROL9, HDMI_GENERIC13_LINE, mask_sh),\
-       SE_SF(DIG0_HDMI_GENERIC_PACKET_CONTROL10, HDMI_GENERIC14_LINE, mask_sh),\
-       SE_SF(DP0_DP_MSA_VBID_MISC, DP_VBID6_LINE_REFERENCE, mask_sh),\
-       SE_SF(DP0_DP_MSA_VBID_MISC, DP_VBID6_LINE_NUM, mask_sh),\
-       SE_SF(DME0_DME_CONTROL, METADATA_ENGINE_EN, mask_sh),\
-       SE_SF(DME0_DME_CONTROL, METADATA_HUBP_REQUESTOR_ID, mask_sh),\
-       SE_SF(DME0_DME_CONTROL, METADATA_STREAM_TYPE, mask_sh),\
-       SE_SF(DP0_DP_SEC_METADATA_TRANSMISSION, DP_SEC_METADATA_PACKET_ENABLE, mask_sh),\
-       SE_SF(DP0_DP_SEC_METADATA_TRANSMISSION, DP_SEC_METADATA_PACKET_LINE_REFERENCE, mask_sh),\
-       SE_SF(DP0_DP_SEC_METADATA_TRANSMISSION, DP_SEC_METADATA_PACKET_LINE, mask_sh),\
-       SE_SF(DIG0_HDMI_METADATA_PACKET_CONTROL, HDMI_METADATA_PACKET_ENABLE, mask_sh),\
-       SE_SF(DIG0_HDMI_METADATA_PACKET_CONTROL, HDMI_METADATA_PACKET_LINE_REFERENCE, mask_sh),\
-       SE_SF(DIG0_HDMI_METADATA_PACKET_CONTROL, HDMI_METADATA_PACKET_LINE, mask_sh),\
-       SE_SF(DIG0_HDMI_CONTROL, DOLBY_VISION_EN, mask_sh),\
-       SE_SF(DIG0_DIG_FE_EN_CNTL, DIG_FE_ENABLE, mask_sh),\
-       SE_SF(DIG0_DIG_FE_CLK_CNTL, DIG_FE_MODE, mask_sh),\
-       SE_SF(DIG0_DIG_FE_CLK_CNTL, DIG_FE_CLK_EN, mask_sh),\
-       SE_SF(DIG0_DIG_FE_CLK_CNTL, DIG_FE_SOFT_RESET, mask_sh),\
-       SE_SF(DIG0_DIG_FE_CNTL, DIG_STEREOSYNC_GATE_EN, mask_sh),\
-       SE_SF(DP0_DP_SEC_FRAMING4, DP_SST_SDP_SPLITTING, mask_sh),\
-       SE_SF(DIG0_DIG_CLOCK_PATTERN, DIG_CLOCK_PATTERN, mask_sh),\
-       SE_SF(DIG0_DIG_FIFO_CTRL0, DIG_FIFO_OUTPUT_PIXEL_PER_CYCLE, mask_sh),\
-       SE_SF(DIG0_DIG_FIFO_CTRL0, DIG_FIFO_READ_START_LEVEL, mask_sh),\
-       SE_SF(DIG0_DIG_FIFO_CTRL0, DIG_FIFO_ENABLE, mask_sh),\
-       SE_SF(DIG0_DIG_FIFO_CTRL0, DIG_FIFO_RESET, mask_sh),\
-       SE_SF(DIG0_DIG_FIFO_CTRL0, DIG_FIFO_RESET_DONE, mask_sh),\
-       SE_SF(DIG0_STREAM_MAPPER_CONTROL, DIG_STREAM_LINK_TARGET, mask_sh),
-
-
-void dcn401_dio_stream_encoder_construct(
-       struct dcn10_stream_encoder *enc1,
-       struct dc_context *ctx,
-       struct dc_bios *bp,
-       enum engine_id eng_id,
-       struct vpg *vpg,
-       struct afmt *afmt,
-       const struct dcn10_stream_enc_registers *regs,
-       const struct dcn10_stream_encoder_shift *se_shift,
-       const struct dcn10_stream_encoder_mask *se_mask);
-
-void enc401_set_dynamic_metadata(struct stream_encoder *enc,
-               bool enable_dme,
-               uint32_t hubp_requestor_id,
-               enum dynamic_metadata_mode dmdata_mode);
-void enc401_stream_encoder_set_stream_attribute_helper(
-               struct dcn10_stream_encoder *enc1,
-               struct dc_crtc_timing *crtc_timing);
-void enc401_stream_encoder_dp_set_stream_attribute(
-       struct stream_encoder *enc,
-       struct dc_crtc_timing *crtc_timing,
-       enum dc_color_space output_color_space,
-       bool use_vsc_sdp_for_colorimetry,
-       uint32_t enable_sdp_splitting);
-#endif /* __DC_DIO_STREAM_ENCODER_DCN401_H__ */
diff --git a/drivers/gpu/drm/amd/display/dc/dcn401/dcn401_mpc.c b/drivers/gpu/drm/amd/display/dc/dcn401/dcn401_mpc.c
deleted file mode 100644 (file)
index 37ab5a4..0000000
+++ /dev/null
@@ -1,653 +0,0 @@
-/*
- * Copyright 2023 Advanced Micro Devices, Inc.
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the "Software"),
- * to deal in the Software without restriction, including without limitation
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
- * and/or sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
- * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
- * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
- * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
- * OTHER DEALINGS IN THE SOFTWARE.
- *
- * Authors: AMD
- *
- */
-
-#include "reg_helper.h"
-#include "dc.h"
-#include "dcn401_mpc.h"
-#include "dcn10/dcn10_cm_common.h"
-#include "basics/conversion.h"
-#include "mpc.h"
-
-#define REG(reg)\
-       mpc401->mpc_regs->reg
-
-#define CTX \
-       mpc401->base.ctx
-
-#undef FN
-#define FN(reg_name, field_name) \
-       mpc401->mpc_shift->field_name, mpc401->mpc_mask->field_name
-
-static void mpc401_update_3dlut_fast_load_select(struct mpc *mpc, int mpcc_id, int hubp_idx)
-{
-       struct dcn401_mpc *mpc401 = TO_DCN401_MPC(mpc);
-
-       REG_SET(MPCC_MCM_3DLUT_FAST_LOAD_SELECT[mpcc_id], 0, MPCC_MCM_3DLUT_FL_SEL, hubp_idx);
-}
-
-static void mpc401_get_3dlut_fast_load_status(struct mpc *mpc, int mpcc_id, uint32_t *done, uint32_t *soft_underflow, uint32_t *hard_underflow)
-{
-       struct dcn401_mpc *mpc401 = TO_DCN401_MPC(mpc);
-
-       REG_GET_3(MPCC_MCM_3DLUT_FAST_LOAD_STATUS[mpcc_id],
-                       MPCC_MCM_3DLUT_FL_DONE, done,
-                       MPCC_MCM_3DLUT_FL_SOFT_UNDERFLOW, soft_underflow,
-                       MPCC_MCM_3DLUT_FL_HARD_UNDERFLOW, hard_underflow);
-}
-
-void mpc401_set_movable_cm_location(struct mpc *mpc, enum mpcc_movable_cm_location location, int mpcc_id)
-{
-       struct dcn401_mpc *mpc401 = TO_DCN401_MPC(mpc);
-
-       switch (location) {
-       case MPCC_MOVABLE_CM_LOCATION_BEFORE:
-               REG_UPDATE(MPCC_MOVABLE_CM_LOCATION_CONTROL[mpcc_id],
-                               MPCC_MOVABLE_CM_LOCATION_CNTL, 0);
-               break;
-       case MPCC_MOVABLE_CM_LOCATION_AFTER:
-               REG_UPDATE(MPCC_MOVABLE_CM_LOCATION_CONTROL[mpcc_id],
-                               MPCC_MOVABLE_CM_LOCATION_CNTL, 1);
-               break;
-       }
-}
-
-static enum dc_lut_mode get3dlut_config(
-                       struct mpc *mpc,
-                       bool *is_17x17x17,
-                       bool *is_12bits_color_channel,
-                       int mpcc_id)
-{
-       uint32_t i_mode, i_enable_10bits, lut_size;
-       enum dc_lut_mode mode;
-       struct dcn401_mpc *mpc401 = TO_DCN401_MPC(mpc);
-
-       REG_GET(MPCC_MCM_3DLUT_MODE[mpcc_id],
-                       MPCC_MCM_3DLUT_MODE_CURRENT,  &i_mode);
-
-       REG_GET(MPCC_MCM_3DLUT_READ_WRITE_CONTROL[mpcc_id],
-                       MPCC_MCM_3DLUT_30BIT_EN, &i_enable_10bits);
-
-       switch (i_mode) {
-       case 0:
-               mode = LUT_BYPASS;
-               break;
-       case 1:
-               mode = LUT_RAM_A;
-               break;
-       case 2:
-               mode = LUT_RAM_B;
-               break;
-       default:
-               mode = LUT_BYPASS;
-               break;
-       }
-       if (i_enable_10bits > 0)
-               *is_12bits_color_channel = false;
-       else
-               *is_12bits_color_channel = true;
-
-       REG_GET(MPCC_MCM_3DLUT_MODE[mpcc_id], MPCC_MCM_3DLUT_SIZE, &lut_size);
-
-       if (lut_size == 0)
-               *is_17x17x17 = true;
-       else
-               *is_17x17x17 = false;
-
-       return mode;
-}
-
-void mpc401_populate_lut(struct mpc *mpc, const enum MCM_LUT_ID id, const union mcm_lut_params params, bool lut_bank_a, int mpcc_id)
-{
-       const enum dc_lut_mode next_mode = lut_bank_a ? LUT_RAM_A : LUT_RAM_B;
-       const struct pwl_params *lut1d = params.pwl;
-       const struct pwl_params *lut_shaper = params.pwl;
-       bool is_17x17x17;
-       bool is_12bits_color_channel;
-       const struct dc_rgb *lut0;
-       const struct dc_rgb *lut1;
-       const struct dc_rgb *lut2;
-       const struct dc_rgb *lut3;
-       int lut_size0;
-       int lut_size;
-       const struct tetrahedral_params *lut3d = params.lut3d;
-
-       switch (id) {
-       case MCM_LUT_1DLUT:
-               if (lut1d == NULL)
-                       return;
-
-               mpc32_power_on_blnd_lut(mpc, mpcc_id, true);
-               mpc32_configure_post1dlut(mpc, mpcc_id, next_mode == LUT_RAM_A);
-
-               if (next_mode == LUT_RAM_A)
-                       mpc32_program_post1dluta_settings(mpc, mpcc_id, lut1d);
-               else
-                       mpc32_program_post1dlutb_settings(mpc, mpcc_id, lut1d);
-
-               mpc32_program_post1dlut_pwl(
-                               mpc, mpcc_id, lut1d->rgb_resulted, lut1d->hw_points_num);
-
-               break;
-       case MCM_LUT_SHAPER:
-               if (lut_shaper == NULL)
-                       return;
-               if (mpc->ctx->dc->debug.enable_mem_low_power.bits.mpc)
-                       mpc32_power_on_shaper_3dlut(mpc, mpcc_id, true);
-
-               mpc32_configure_shaper_lut(mpc, next_mode == LUT_RAM_A, mpcc_id);
-
-               if (next_mode == LUT_RAM_A)
-                       mpc32_program_shaper_luta_settings(mpc, lut_shaper, mpcc_id);
-               else
-                       mpc32_program_shaper_lutb_settings(mpc, lut_shaper, mpcc_id);
-
-               mpc32_program_shaper_lut(
-                               mpc, lut_shaper->rgb_resulted, lut_shaper->hw_points_num, mpcc_id);
-
-               mpc32_power_on_shaper_3dlut(mpc, mpcc_id, false);
-               break;
-       case MCM_LUT_3DLUT:
-               if (lut3d == NULL)
-                       return;
-
-               mpc32_power_on_shaper_3dlut(mpc, mpcc_id, true);
-
-               get3dlut_config(mpc, &is_17x17x17, &is_12bits_color_channel, mpcc_id);
-
-               is_17x17x17 = !lut3d->use_tetrahedral_9;
-               is_12bits_color_channel = lut3d->use_12bits;
-               if (is_17x17x17) {
-                       lut0 = lut3d->tetrahedral_17.lut0;
-                       lut1 = lut3d->tetrahedral_17.lut1;
-                       lut2 = lut3d->tetrahedral_17.lut2;
-                       lut3 = lut3d->tetrahedral_17.lut3;
-                       lut_size0 = sizeof(lut3d->tetrahedral_17.lut0)/
-                                               sizeof(lut3d->tetrahedral_17.lut0[0]);
-                       lut_size  = sizeof(lut3d->tetrahedral_17.lut1)/
-                                               sizeof(lut3d->tetrahedral_17.lut1[0]);
-               } else {
-                       lut0 = lut3d->tetrahedral_9.lut0;
-                       lut1 = lut3d->tetrahedral_9.lut1;
-                       lut2 = lut3d->tetrahedral_9.lut2;
-                       lut3 = lut3d->tetrahedral_9.lut3;
-                       lut_size0 = sizeof(lut3d->tetrahedral_9.lut0)/
-                                       sizeof(lut3d->tetrahedral_9.lut0[0]);
-                       lut_size  = sizeof(lut3d->tetrahedral_9.lut1)/
-                                       sizeof(lut3d->tetrahedral_9.lut1[0]);
-                       }
-
-               mpc32_select_3dlut_ram(mpc, next_mode,
-                                       is_12bits_color_channel, mpcc_id);
-               mpc32_select_3dlut_ram_mask(mpc, 0x1, mpcc_id);
-               if (is_12bits_color_channel)
-                       mpc32_set3dlut_ram12(mpc, lut0, lut_size0, mpcc_id);
-               else
-                       mpc32_set3dlut_ram10(mpc, lut0, lut_size0, mpcc_id);
-
-               mpc32_select_3dlut_ram_mask(mpc, 0x2, mpcc_id);
-               if (is_12bits_color_channel)
-                       mpc32_set3dlut_ram12(mpc, lut1, lut_size, mpcc_id);
-               else
-                       mpc32_set3dlut_ram10(mpc, lut1, lut_size, mpcc_id);
-
-               mpc32_select_3dlut_ram_mask(mpc, 0x4, mpcc_id);
-               if (is_12bits_color_channel)
-                       mpc32_set3dlut_ram12(mpc, lut2, lut_size, mpcc_id);
-               else
-                       mpc32_set3dlut_ram10(mpc, lut2, lut_size, mpcc_id);
-
-               mpc32_select_3dlut_ram_mask(mpc, 0x8, mpcc_id);
-               if (is_12bits_color_channel)
-                       mpc32_set3dlut_ram12(mpc, lut3, lut_size, mpcc_id);
-               else
-                       mpc32_set3dlut_ram10(mpc, lut3, lut_size, mpcc_id);
-
-               if (mpc->ctx->dc->debug.enable_mem_low_power.bits.mpc)
-                       mpc32_power_on_shaper_3dlut(mpc, mpcc_id, false);
-
-               break;
-       }
-
-}
-
-void mpc401_program_lut_mode(
-               struct mpc *mpc,
-               const enum MCM_LUT_ID id,
-               const enum MCM_LUT_XABLE xable,
-               bool lut_bank_a,
-               int mpcc_id)
-{
-       struct dcn401_mpc *mpc401 = TO_DCN401_MPC(mpc);
-
-       switch (id) {
-       case MCM_LUT_3DLUT:
-               switch (xable) {
-               case MCM_LUT_DISABLE:
-                       REG_UPDATE(MPCC_MCM_3DLUT_MODE[mpcc_id], MPCC_MCM_3DLUT_MODE, 0);
-                       break;
-               case MCM_LUT_ENABLE:
-                       REG_UPDATE(MPCC_MCM_3DLUT_MODE[mpcc_id], MPCC_MCM_3DLUT_MODE, lut_bank_a ? 1 : 2);
-                       break;
-               }
-               break;
-       case MCM_LUT_SHAPER:
-               switch (xable) {
-               case MCM_LUT_DISABLE:
-                       REG_UPDATE(MPCC_MCM_SHAPER_CONTROL[mpcc_id], MPCC_MCM_SHAPER_LUT_MODE, 0);
-                       break;
-               case MCM_LUT_ENABLE:
-                       REG_UPDATE(MPCC_MCM_SHAPER_CONTROL[mpcc_id], MPCC_MCM_SHAPER_LUT_MODE, lut_bank_a ? 1 : 2);
-                       break;
-               }
-               break;
-       case MCM_LUT_1DLUT:
-               switch (xable) {
-               case MCM_LUT_DISABLE:
-                       REG_UPDATE(MPCC_MCM_1DLUT_CONTROL[mpcc_id],
-                                       MPCC_MCM_1DLUT_MODE, 0);
-                       break;
-               case MCM_LUT_ENABLE:
-                       REG_UPDATE(MPCC_MCM_1DLUT_CONTROL[mpcc_id],
-                                       MPCC_MCM_1DLUT_MODE, 2);
-                       break;
-               }
-               REG_UPDATE(MPCC_MCM_1DLUT_CONTROL[mpcc_id],
-                               MPCC_MCM_1DLUT_SELECT, lut_bank_a ? 0 : 1);
-               break;
-       }
-}
-
-void mpc401_program_lut_read_write_control(struct mpc *mpc, const enum MCM_LUT_ID id, bool lut_bank_a, int mpcc_id)
-{
-       struct dcn401_mpc *mpc401 = TO_DCN401_MPC(mpc);
-
-       switch (id) {
-       case MCM_LUT_3DLUT:
-               mpc32_select_3dlut_ram_mask(mpc, 0xf, mpcc_id);
-               REG_UPDATE(MPCC_MCM_3DLUT_READ_WRITE_CONTROL[mpcc_id], MPCC_MCM_3DLUT_RAM_SEL, lut_bank_a ? 0 : 1);
-               break;
-       case MCM_LUT_SHAPER:
-               mpc32_configure_shaper_lut(mpc, lut_bank_a, mpcc_id);
-               break;
-       case MCM_LUT_1DLUT:
-               mpc32_configure_post1dlut(mpc, lut_bank_a, mpcc_id);
-               break;
-       }
-}
-
-void mpc401_program_3dlut_size(struct mpc *mpc, bool is_17x17x17, int mpcc_id)
-{
-       struct dcn401_mpc *mpc401 = TO_DCN401_MPC(mpc);
-
-       REG_UPDATE(MPCC_MCM_3DLUT_MODE[mpcc_id], MPCC_MCM_3DLUT_SIZE, is_17x17x17 ? 0 : 1);
-}
-
-static void program_gamut_remap(
-       struct mpc *mpc,
-       unsigned int mpcc_id,
-       const uint16_t *regval,
-       enum mpcc_gamut_remap_id gamut_remap_block_id,
-       enum mpcc_gamut_remap_mode_select mode_select)
-{
-       struct color_matrices_reg gamut_regs;
-       struct dcn401_mpc *mpc401 = TO_DCN401_MPC(mpc);
-
-       switch (gamut_remap_block_id) {
-       case MPCC_OGAM_GAMUT_REMAP:
-
-               if (regval == NULL || mode_select == MPCC_GAMUT_REMAP_MODE_SELECT_0) {
-                       REG_SET(MPCC_GAMUT_REMAP_MODE[mpcc_id], 0,
-                               MPCC_GAMUT_REMAP_MODE, mode_select);
-                       return;
-               }
-
-               gamut_regs.shifts.csc_c11 = mpc401->mpc_shift->MPCC_GAMUT_REMAP_C11_A;
-               gamut_regs.masks.csc_c11 = mpc401->mpc_mask->MPCC_GAMUT_REMAP_C11_A;
-               gamut_regs.shifts.csc_c12 = mpc401->mpc_shift->MPCC_GAMUT_REMAP_C12_A;
-               gamut_regs.masks.csc_c12 = mpc401->mpc_mask->MPCC_GAMUT_REMAP_C12_A;
-
-               switch (mode_select) {
-               case MPCC_GAMUT_REMAP_MODE_SELECT_1:
-                       gamut_regs.csc_c11_c12 = REG(MPC_GAMUT_REMAP_C11_C12_A[mpcc_id]);
-                       gamut_regs.csc_c33_c34 = REG(MPC_GAMUT_REMAP_C33_C34_A[mpcc_id]);
-                       break;
-               case MPCC_GAMUT_REMAP_MODE_SELECT_2:
-                       gamut_regs.csc_c11_c12 = REG(MPC_GAMUT_REMAP_C11_C12_B[mpcc_id]);
-                       gamut_regs.csc_c33_c34 = REG(MPC_GAMUT_REMAP_C33_C34_B[mpcc_id]);
-                       break;
-               default:
-                       break;
-               }
-
-               cm_helper_program_color_matrices(
-                       mpc->ctx,
-                       regval,
-                       &gamut_regs);
-
-               //select coefficient set to use, set A (MODE_1) or set B (MODE_2)
-               REG_SET(MPCC_GAMUT_REMAP_MODE[mpcc_id], 0, MPCC_GAMUT_REMAP_MODE, mode_select);
-               break;
-
-       case MPCC_MCM_FIRST_GAMUT_REMAP:
-               if (regval == NULL || mode_select == MPCC_GAMUT_REMAP_MODE_SELECT_0) {
-                       REG_SET(MPCC_MCM_FIRST_GAMUT_REMAP_MODE[mpcc_id], 0,
-                               MPCC_MCM_FIRST_GAMUT_REMAP_MODE, mode_select);
-                       return;
-               }
-
-               gamut_regs.shifts.csc_c11 = mpc401->mpc_shift->MPCC_MCM_FIRST_GAMUT_REMAP_C11_A;
-               gamut_regs.masks.csc_c11 = mpc401->mpc_mask->MPCC_MCM_FIRST_GAMUT_REMAP_C11_A;
-               gamut_regs.shifts.csc_c12 = mpc401->mpc_shift->MPCC_MCM_FIRST_GAMUT_REMAP_C12_A;
-               gamut_regs.masks.csc_c12 = mpc401->mpc_mask->MPCC_MCM_FIRST_GAMUT_REMAP_C12_A;
-
-               switch (mode_select) {
-               case MPCC_GAMUT_REMAP_MODE_SELECT_1:
-                       gamut_regs.csc_c11_c12 = REG(MPC_MCM_FIRST_GAMUT_REMAP_C11_C12_A[mpcc_id]);
-                       gamut_regs.csc_c33_c34 = REG(MPC_MCM_FIRST_GAMUT_REMAP_C33_C34_A[mpcc_id]);
-                       break;
-               case MPCC_GAMUT_REMAP_MODE_SELECT_2:
-                       gamut_regs.csc_c11_c12 = REG(MPC_MCM_FIRST_GAMUT_REMAP_C11_C12_B[mpcc_id]);
-                       gamut_regs.csc_c33_c34 = REG(MPC_MCM_FIRST_GAMUT_REMAP_C33_C34_B[mpcc_id]);
-                       break;
-               default:
-                       break;
-               }
-
-               cm_helper_program_color_matrices(
-                       mpc->ctx,
-                       regval,
-                       &gamut_regs);
-
-               //select coefficient set to use, set A (MODE_1) or set B (MODE_2)
-               REG_SET(MPCC_MCM_FIRST_GAMUT_REMAP_MODE[mpcc_id], 0,
-                       MPCC_MCM_FIRST_GAMUT_REMAP_MODE, mode_select);
-               break;
-
-       case MPCC_MCM_SECOND_GAMUT_REMAP:
-               if (regval == NULL || mode_select == MPCC_GAMUT_REMAP_MODE_SELECT_0) {
-                       REG_SET(MPCC_MCM_SECOND_GAMUT_REMAP_MODE[mpcc_id], 0,
-                               MPCC_MCM_SECOND_GAMUT_REMAP_MODE, mode_select);
-                       return;
-               }
-
-               gamut_regs.shifts.csc_c11 = mpc401->mpc_shift->MPCC_MCM_SECOND_GAMUT_REMAP_C11_A;
-               gamut_regs.masks.csc_c11 = mpc401->mpc_mask->MPCC_MCM_SECOND_GAMUT_REMAP_C11_A;
-               gamut_regs.shifts.csc_c12 = mpc401->mpc_shift->MPCC_MCM_SECOND_GAMUT_REMAP_C12_A;
-               gamut_regs.masks.csc_c12 = mpc401->mpc_mask->MPCC_MCM_SECOND_GAMUT_REMAP_C12_A;
-
-               switch (mode_select) {
-               case MPCC_GAMUT_REMAP_MODE_SELECT_1:
-                       gamut_regs.csc_c11_c12 = REG(MPC_MCM_SECOND_GAMUT_REMAP_C11_C12_A[mpcc_id]);
-                       gamut_regs.csc_c33_c34 = REG(MPC_MCM_SECOND_GAMUT_REMAP_C33_C34_A[mpcc_id]);
-                       break;
-               case MPCC_GAMUT_REMAP_MODE_SELECT_2:
-                       gamut_regs.csc_c11_c12 = REG(MPC_MCM_SECOND_GAMUT_REMAP_C11_C12_B[mpcc_id]);
-                       gamut_regs.csc_c33_c34 = REG(MPC_MCM_SECOND_GAMUT_REMAP_C33_C34_B[mpcc_id]);
-                       break;
-               default:
-                       break;
-               }
-
-               cm_helper_program_color_matrices(
-                       mpc->ctx,
-                       regval,
-                       &gamut_regs);
-
-               //select coefficient set to use, set A (MODE_1) or set B (MODE_2)
-               REG_SET(MPCC_MCM_SECOND_GAMUT_REMAP_MODE[mpcc_id], 0,
-                       MPCC_MCM_SECOND_GAMUT_REMAP_MODE, mode_select);
-               break;
-
-       default:
-               break;
-       }
-}
-
-void mpc401_set_gamut_remap(
-       struct mpc *mpc,
-       int mpcc_id,
-       const struct mpc_grph_gamut_adjustment *adjust)
-{
-       struct dcn401_mpc *mpc401 = TO_DCN401_MPC(mpc);
-       unsigned int i = 0;
-       uint32_t mode_select = 0;
-
-       if (adjust->gamut_adjust_type != GRAPHICS_GAMUT_ADJUST_TYPE_SW) {
-               /* Bypass / Disable if type is bypass or hw */
-               program_gamut_remap(mpc, mpcc_id, NULL,
-                       adjust->mpcc_gamut_remap_block_id, MPCC_GAMUT_REMAP_MODE_SELECT_0);
-       } else {
-               struct fixed31_32 arr_matrix[12];
-               uint16_t arr_reg_val[12];
-
-               for (i = 0; i < 12; i++)
-                       arr_matrix[i] = adjust->temperature_matrix[i];
-
-               convert_float_matrix(arr_reg_val, arr_matrix, 12);
-
-               switch (adjust->mpcc_gamut_remap_block_id) {
-               case MPCC_OGAM_GAMUT_REMAP:
-                       REG_GET(MPCC_GAMUT_REMAP_MODE[mpcc_id],
-                               MPCC_GAMUT_REMAP_MODE_CURRENT, &mode_select);
-                       break;
-               case MPCC_MCM_FIRST_GAMUT_REMAP:
-                       REG_GET(MPCC_MCM_FIRST_GAMUT_REMAP_MODE[mpcc_id],
-                               MPCC_MCM_FIRST_GAMUT_REMAP_MODE_CURRENT, &mode_select);
-                       break;
-               case MPCC_MCM_SECOND_GAMUT_REMAP:
-                       REG_GET(MPCC_MCM_SECOND_GAMUT_REMAP_MODE[mpcc_id],
-                               MPCC_MCM_SECOND_GAMUT_REMAP_MODE_CURRENT, &mode_select);
-                       break;
-               default:
-                       break;
-               }
-
-               //If current set in use not set A (MODE_1), then use set A, otherwise use set B
-               if (mode_select != MPCC_GAMUT_REMAP_MODE_SELECT_1)
-                       mode_select = MPCC_GAMUT_REMAP_MODE_SELECT_1;
-               else
-                       mode_select = MPCC_GAMUT_REMAP_MODE_SELECT_2;
-
-               program_gamut_remap(mpc, mpcc_id, arr_reg_val,
-                       adjust->mpcc_gamut_remap_block_id, mode_select);
-       }
-}
-
-static void read_gamut_remap(struct mpc *mpc,
-       int mpcc_id,
-       uint16_t *regval,
-       enum mpcc_gamut_remap_id gamut_remap_block_id,
-       uint32_t *mode_select)
-{
-       struct color_matrices_reg gamut_regs = {0};
-       struct dcn401_mpc *mpc401 = TO_DCN401_MPC(mpc);
-
-       switch (gamut_remap_block_id) {
-       case MPCC_OGAM_GAMUT_REMAP:
-               //current coefficient set in use
-               REG_GET(MPCC_GAMUT_REMAP_MODE[mpcc_id], MPCC_GAMUT_REMAP_MODE_CURRENT, mode_select);
-
-               gamut_regs.shifts.csc_c11 = mpc401->mpc_shift->MPCC_GAMUT_REMAP_C11_A;
-               gamut_regs.masks.csc_c11 = mpc401->mpc_mask->MPCC_GAMUT_REMAP_C11_A;
-               gamut_regs.shifts.csc_c12 = mpc401->mpc_shift->MPCC_GAMUT_REMAP_C12_A;
-               gamut_regs.masks.csc_c12 = mpc401->mpc_mask->MPCC_GAMUT_REMAP_C12_A;
-
-               switch (*mode_select) {
-               case MPCC_GAMUT_REMAP_MODE_SELECT_1:
-                       gamut_regs.csc_c11_c12 = REG(MPC_GAMUT_REMAP_C11_C12_A[mpcc_id]);
-                       gamut_regs.csc_c33_c34 = REG(MPC_GAMUT_REMAP_C33_C34_A[mpcc_id]);
-                       break;
-               case MPCC_GAMUT_REMAP_MODE_SELECT_2:
-                       gamut_regs.csc_c11_c12 = REG(MPC_GAMUT_REMAP_C11_C12_B[mpcc_id]);
-                       gamut_regs.csc_c33_c34 = REG(MPC_GAMUT_REMAP_C33_C34_B[mpcc_id]);
-                       break;
-               default:
-                       break;
-               }
-               break;
-
-       case MPCC_MCM_FIRST_GAMUT_REMAP:
-               REG_GET(MPCC_MCM_FIRST_GAMUT_REMAP_MODE[mpcc_id],
-                               MPCC_MCM_FIRST_GAMUT_REMAP_MODE_CURRENT, mode_select);
-
-               gamut_regs.shifts.csc_c11 = mpc401->mpc_shift->MPCC_MCM_FIRST_GAMUT_REMAP_C11_A;
-               gamut_regs.masks.csc_c11 = mpc401->mpc_mask->MPCC_MCM_FIRST_GAMUT_REMAP_C11_A;
-               gamut_regs.shifts.csc_c12 = mpc401->mpc_shift->MPCC_MCM_FIRST_GAMUT_REMAP_C12_A;
-               gamut_regs.masks.csc_c12 = mpc401->mpc_mask->MPCC_MCM_FIRST_GAMUT_REMAP_C12_A;
-
-               switch (*mode_select) {
-               case MPCC_GAMUT_REMAP_MODE_SELECT_1:
-                       gamut_regs.csc_c11_c12 = REG(MPC_MCM_FIRST_GAMUT_REMAP_C11_C12_A[mpcc_id]);
-                       gamut_regs.csc_c33_c34 = REG(MPC_MCM_FIRST_GAMUT_REMAP_C33_C34_A[mpcc_id]);
-                       break;
-               case MPCC_GAMUT_REMAP_MODE_SELECT_2:
-                       gamut_regs.csc_c11_c12 = REG(MPC_MCM_FIRST_GAMUT_REMAP_C11_C12_B[mpcc_id]);
-                       gamut_regs.csc_c33_c34 = REG(MPC_MCM_FIRST_GAMUT_REMAP_C33_C34_B[mpcc_id]);
-                       break;
-               default:
-                       break;
-               }
-               break;
-
-       case MPCC_MCM_SECOND_GAMUT_REMAP:
-               REG_GET(MPCC_MCM_SECOND_GAMUT_REMAP_MODE[mpcc_id],
-                               MPCC_MCM_SECOND_GAMUT_REMAP_MODE_CURRENT, mode_select);
-
-               gamut_regs.shifts.csc_c11 = mpc401->mpc_shift->MPCC_MCM_SECOND_GAMUT_REMAP_C11_A;
-               gamut_regs.masks.csc_c11 = mpc401->mpc_mask->MPCC_MCM_SECOND_GAMUT_REMAP_C11_A;
-               gamut_regs.shifts.csc_c12 = mpc401->mpc_shift->MPCC_MCM_SECOND_GAMUT_REMAP_C12_A;
-               gamut_regs.masks.csc_c12 = mpc401->mpc_mask->MPCC_MCM_SECOND_GAMUT_REMAP_C12_A;
-
-               switch (*mode_select) {
-               case MPCC_GAMUT_REMAP_MODE_SELECT_1:
-                       gamut_regs.csc_c11_c12 = REG(MPC_MCM_SECOND_GAMUT_REMAP_C11_C12_A[mpcc_id]);
-                       gamut_regs.csc_c33_c34 = REG(MPC_MCM_SECOND_GAMUT_REMAP_C33_C34_A[mpcc_id]);
-                       break;
-               case MPCC_GAMUT_REMAP_MODE_SELECT_2:
-                       gamut_regs.csc_c11_c12 = REG(MPC_MCM_SECOND_GAMUT_REMAP_C11_C12_B[mpcc_id]);
-                       gamut_regs.csc_c33_c34 = REG(MPC_MCM_SECOND_GAMUT_REMAP_C33_C34_B[mpcc_id]);
-                       break;
-               default:
-                       break;
-               }
-               break;
-
-       default:
-               break;
-       }
-
-       if (*mode_select != MPCC_GAMUT_REMAP_MODE_SELECT_0) {
-               cm_helper_read_color_matrices(
-                       mpc401->base.ctx,
-                       regval,
-                       &gamut_regs);
-       }
-}
-
-void mpc401_get_gamut_remap(struct mpc *mpc,
-       int mpcc_id,
-       struct mpc_grph_gamut_adjustment *adjust)
-{
-       uint16_t arr_reg_val[12] = {0};
-       uint32_t mode_select;
-
-       read_gamut_remap(mpc, mpcc_id, arr_reg_val, adjust->mpcc_gamut_remap_block_id, &mode_select);
-
-       if (mode_select == MPCC_GAMUT_REMAP_MODE_SELECT_0) {
-               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 const struct mpc_funcs dcn401_mpc_funcs = {
-       .read_mpcc_state = mpc1_read_mpcc_state,
-       .insert_plane = mpc1_insert_plane,
-       .remove_mpcc = mpc1_remove_mpcc,
-       .mpc_init = mpc32_mpc_init,
-       .mpc_init_single_inst = mpc3_mpc_init_single_inst,
-       .update_blending = mpc2_update_blending,
-       .cursor_lock = mpc1_cursor_lock,
-       .get_mpcc_for_dpp = mpc1_get_mpcc_for_dpp,
-       .wait_for_idle = mpc2_assert_idle_mpcc,
-       .assert_mpcc_idle_before_connect = mpc2_assert_mpcc_idle_before_connect,
-       .init_mpcc_list_from_hw = mpc1_init_mpcc_list_from_hw,
-       .set_denorm =  mpc3_set_denorm,
-       .set_denorm_clamp = mpc3_set_denorm_clamp,
-       .set_output_csc = mpc3_set_output_csc,
-       .set_ocsc_default = mpc3_set_ocsc_default,
-       .set_output_gamma = mpc3_set_output_gamma,
-       .insert_plane_to_secondary = NULL,
-       .remove_mpcc_from_secondary =  NULL,
-       .set_dwb_mux = mpc3_set_dwb_mux,
-       .disable_dwb_mux = mpc3_disable_dwb_mux,
-       .is_dwb_idle = mpc3_is_dwb_idle,
-       .set_gamut_remap = mpc401_set_gamut_remap,
-       .program_shaper = mpc32_program_shaper,
-       .program_3dlut = mpc32_program_3dlut,
-       .program_1dlut = mpc32_program_post1dlut,
-       .acquire_rmu = NULL,
-       .release_rmu = NULL,
-       .power_on_mpc_mem_pwr = mpc3_power_on_ogam_lut,
-       .get_mpc_out_mux = mpc1_get_mpc_out_mux,
-       .set_bg_color = mpc1_set_bg_color,
-       .set_movable_cm_location = mpc401_set_movable_cm_location,
-       .update_3dlut_fast_load_select = mpc401_update_3dlut_fast_load_select,
-       .get_3dlut_fast_load_status = mpc401_get_3dlut_fast_load_status,
-       .populate_lut = mpc401_populate_lut,
-       .program_lut_read_write_control = mpc401_program_lut_read_write_control,
-       .program_lut_mode = mpc401_program_lut_mode,
-       .program_3dlut_size = mpc401_program_3dlut_size,
-};
-
-
-void dcn401_mpc_construct(struct dcn401_mpc *mpc401,
-       struct dc_context *ctx,
-       const struct dcn401_mpc_registers *mpc_regs,
-       const struct dcn401_mpc_shift *mpc_shift,
-       const struct dcn401_mpc_mask *mpc_mask,
-       int num_mpcc,
-       int num_rmu)
-{
-       int i;
-
-       mpc401->base.ctx = ctx;
-
-       mpc401->base.funcs = &dcn401_mpc_funcs;
-
-       mpc401->mpc_regs = mpc_regs;
-       mpc401->mpc_shift = mpc_shift;
-       mpc401->mpc_mask = mpc_mask;
-
-       mpc401->mpcc_in_use_mask = 0;
-       mpc401->num_mpcc = num_mpcc;
-       mpc401->num_rmu = num_rmu;
-
-       for (i = 0; i < MAX_MPCC; i++)
-               mpc3_init_mpcc(&mpc401->base.mpcc_array[i], i);
-}
diff --git a/drivers/gpu/drm/amd/display/dc/dcn401/dcn401_mpc.h b/drivers/gpu/drm/amd/display/dc/dcn401/dcn401_mpc.h
deleted file mode 100644 (file)
index af44054..0000000
+++ /dev/null
@@ -1,239 +0,0 @@
-/*
- * Copyright 2023 Advanced Micro Devices, Inc.
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the "Software"),
- * to deal in the Software without restriction, including without limitation
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
- * and/or sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
- * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
- * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
- * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
- * OTHER DEALINGS IN THE SOFTWARE.
- *
- * Authors: AMD
- *
- */
-
-#ifndef __DC_MPCC_DCN401_H__
-#define __DC_MPCC_DCN401_H__
-#include "dcn30/dcn30_mpc.h"
-#include "dcn32/dcn32_mpc.h"
-
-#define TO_DCN401_MPC(mpc_base) \
-       container_of(mpc_base, struct dcn401_mpc, base)
-
-#define MPC_REG_VARIABLE_LIST_DCN4_01 \
-       MPC_REG_VARIABLE_LIST_DCN3_0; \
-       MPC_REG_VARIABLE_LIST_DCN32; \
-       uint32_t MPCC_MCM_FIRST_GAMUT_REMAP_COEF_FORMAT[MAX_MPCC]; \
-       uint32_t MPCC_MCM_FIRST_GAMUT_REMAP_MODE[MAX_MPCC]; \
-       uint32_t MPC_MCM_FIRST_GAMUT_REMAP_C11_C12_A[MAX_MPCC]; \
-       uint32_t MPC_MCM_FIRST_GAMUT_REMAP_C13_C14_A[MAX_MPCC]; \
-       uint32_t MPC_MCM_FIRST_GAMUT_REMAP_C21_C22_A[MAX_MPCC]; \
-       uint32_t MPC_MCM_FIRST_GAMUT_REMAP_C23_C24_A[MAX_MPCC]; \
-       uint32_t MPC_MCM_FIRST_GAMUT_REMAP_C31_C32_A[MAX_MPCC]; \
-       uint32_t MPC_MCM_FIRST_GAMUT_REMAP_C33_C34_A[MAX_MPCC]; \
-       uint32_t MPC_MCM_FIRST_GAMUT_REMAP_C11_C12_B[MAX_MPCC]; \
-       uint32_t MPC_MCM_FIRST_GAMUT_REMAP_C13_C14_B[MAX_MPCC]; \
-       uint32_t MPC_MCM_FIRST_GAMUT_REMAP_C21_C22_B[MAX_MPCC]; \
-       uint32_t MPC_MCM_FIRST_GAMUT_REMAP_C23_C24_B[MAX_MPCC]; \
-       uint32_t MPC_MCM_FIRST_GAMUT_REMAP_C31_C32_B[MAX_MPCC]; \
-       uint32_t MPC_MCM_FIRST_GAMUT_REMAP_C33_C34_B[MAX_MPCC]; \
-       uint32_t MPCC_MCM_SECOND_GAMUT_REMAP_COEF_FORMAT[MAX_MPCC]; \
-       uint32_t MPCC_MCM_SECOND_GAMUT_REMAP_MODE[MAX_MPCC]; \
-       uint32_t MPC_MCM_SECOND_GAMUT_REMAP_C11_C12_A[MAX_MPCC]; \
-       uint32_t MPC_MCM_SECOND_GAMUT_REMAP_C13_C14_A[MAX_MPCC]; \
-       uint32_t MPC_MCM_SECOND_GAMUT_REMAP_C21_C22_A[MAX_MPCC]; \
-       uint32_t MPC_MCM_SECOND_GAMUT_REMAP_C23_C24_A[MAX_MPCC]; \
-       uint32_t MPC_MCM_SECOND_GAMUT_REMAP_C31_C32_A[MAX_MPCC]; \
-       uint32_t MPC_MCM_SECOND_GAMUT_REMAP_C33_C34_A[MAX_MPCC]; \
-       uint32_t MPC_MCM_SECOND_GAMUT_REMAP_C11_C12_B[MAX_MPCC]; \
-       uint32_t MPC_MCM_SECOND_GAMUT_REMAP_C13_C14_B[MAX_MPCC]; \
-       uint32_t MPC_MCM_SECOND_GAMUT_REMAP_C21_C22_B[MAX_MPCC]; \
-       uint32_t MPC_MCM_SECOND_GAMUT_REMAP_C23_C24_B[MAX_MPCC]; \
-       uint32_t MPC_MCM_SECOND_GAMUT_REMAP_C31_C32_B[MAX_MPCC]; \
-       uint32_t MPC_MCM_SECOND_GAMUT_REMAP_C33_C34_B[MAX_MPCC]; \
-       uint32_t MPCC_MCM_3DLUT_FAST_LOAD_SELECT[MAX_MPCC]; \
-       uint32_t MPCC_MCM_3DLUT_FAST_LOAD_STATUS[MAX_MPCC]
-
-#define MPC_COMMON_MASK_SH_LIST_DCN4_01(mask_sh) \
-       MPC_COMMON_MASK_SH_LIST_DCN32(mask_sh), \
-       SF(MPCC_MCM0_MPCC_MCM_FIRST_GAMUT_REMAP_COEF_FORMAT, MPCC_MCM_FIRST_GAMUT_REMAP_COEF_FORMAT, mask_sh), \
-       SF(MPCC_MCM0_MPCC_MCM_FIRST_GAMUT_REMAP_MODE, MPCC_MCM_FIRST_GAMUT_REMAP_MODE, mask_sh), \
-       SF(MPCC_MCM0_MPCC_MCM_FIRST_GAMUT_REMAP_MODE, MPCC_MCM_FIRST_GAMUT_REMAP_MODE_CURRENT, mask_sh), \
-       SF(MPCC_MCM0_MPC_MCM_FIRST_GAMUT_REMAP_C11_C12_A, MPCC_MCM_FIRST_GAMUT_REMAP_C11_A, mask_sh), \
-       SF(MPCC_MCM0_MPC_MCM_FIRST_GAMUT_REMAP_C11_C12_A, MPCC_MCM_FIRST_GAMUT_REMAP_C12_A, mask_sh), \
-       SF(MPCC_MCM0_MPC_MCM_FIRST_GAMUT_REMAP_C13_C14_A, MPCC_MCM_FIRST_GAMUT_REMAP_C13_A, mask_sh), \
-       SF(MPCC_MCM0_MPC_MCM_FIRST_GAMUT_REMAP_C13_C14_A, MPCC_MCM_FIRST_GAMUT_REMAP_C14_A, mask_sh), \
-       SF(MPCC_MCM0_MPC_MCM_FIRST_GAMUT_REMAP_C21_C22_A, MPCC_MCM_FIRST_GAMUT_REMAP_C21_A, mask_sh), \
-       SF(MPCC_MCM0_MPC_MCM_FIRST_GAMUT_REMAP_C21_C22_A, MPCC_MCM_FIRST_GAMUT_REMAP_C22_A, mask_sh), \
-       SF(MPCC_MCM0_MPC_MCM_FIRST_GAMUT_REMAP_C23_C24_A, MPCC_MCM_FIRST_GAMUT_REMAP_C23_A, mask_sh), \
-       SF(MPCC_MCM0_MPC_MCM_FIRST_GAMUT_REMAP_C23_C24_A, MPCC_MCM_FIRST_GAMUT_REMAP_C24_A, mask_sh), \
-       SF(MPCC_MCM0_MPC_MCM_FIRST_GAMUT_REMAP_C31_C32_A, MPCC_MCM_FIRST_GAMUT_REMAP_C31_A, mask_sh), \
-       SF(MPCC_MCM0_MPC_MCM_FIRST_GAMUT_REMAP_C31_C32_A, MPCC_MCM_FIRST_GAMUT_REMAP_C32_A, mask_sh), \
-       SF(MPCC_MCM0_MPC_MCM_FIRST_GAMUT_REMAP_C33_C34_A, MPCC_MCM_FIRST_GAMUT_REMAP_C33_A, mask_sh), \
-       SF(MPCC_MCM0_MPC_MCM_FIRST_GAMUT_REMAP_C33_C34_A, MPCC_MCM_FIRST_GAMUT_REMAP_C34_A, mask_sh), \
-       SF(MPCC_MCM0_MPCC_MCM_SECOND_GAMUT_REMAP_COEF_FORMAT, MPCC_MCM_SECOND_GAMUT_REMAP_COEF_FORMAT, mask_sh), \
-       SF(MPCC_MCM0_MPCC_MCM_SECOND_GAMUT_REMAP_MODE, MPCC_MCM_SECOND_GAMUT_REMAP_MODE, mask_sh), \
-       SF(MPCC_MCM0_MPCC_MCM_SECOND_GAMUT_REMAP_MODE, MPCC_MCM_SECOND_GAMUT_REMAP_MODE_CURRENT, mask_sh), \
-       SF(MPCC_MCM0_MPC_MCM_SECOND_GAMUT_REMAP_C11_C12_A, MPCC_MCM_SECOND_GAMUT_REMAP_C11_A, mask_sh), \
-       SF(MPCC_MCM0_MPC_MCM_SECOND_GAMUT_REMAP_C11_C12_A, MPCC_MCM_SECOND_GAMUT_REMAP_C12_A, mask_sh), \
-       SF(MPCC_MCM0_MPC_MCM_SECOND_GAMUT_REMAP_C13_C14_A, MPCC_MCM_SECOND_GAMUT_REMAP_C13_A, mask_sh), \
-       SF(MPCC_MCM0_MPC_MCM_SECOND_GAMUT_REMAP_C13_C14_A, MPCC_MCM_SECOND_GAMUT_REMAP_C14_A, mask_sh), \
-       SF(MPCC_MCM0_MPC_MCM_SECOND_GAMUT_REMAP_C21_C22_A, MPCC_MCM_SECOND_GAMUT_REMAP_C21_A, mask_sh), \
-       SF(MPCC_MCM0_MPC_MCM_SECOND_GAMUT_REMAP_C21_C22_A, MPCC_MCM_SECOND_GAMUT_REMAP_C22_A, mask_sh), \
-       SF(MPCC_MCM0_MPC_MCM_SECOND_GAMUT_REMAP_C23_C24_A, MPCC_MCM_SECOND_GAMUT_REMAP_C23_A, mask_sh), \
-       SF(MPCC_MCM0_MPC_MCM_SECOND_GAMUT_REMAP_C23_C24_A, MPCC_MCM_SECOND_GAMUT_REMAP_C24_A, mask_sh), \
-       SF(MPCC_MCM0_MPC_MCM_SECOND_GAMUT_REMAP_C31_C32_A, MPCC_MCM_SECOND_GAMUT_REMAP_C31_A, mask_sh), \
-       SF(MPCC_MCM0_MPC_MCM_SECOND_GAMUT_REMAP_C31_C32_A, MPCC_MCM_SECOND_GAMUT_REMAP_C32_A, mask_sh), \
-       SF(MPCC_MCM0_MPC_MCM_SECOND_GAMUT_REMAP_C33_C34_A, MPCC_MCM_SECOND_GAMUT_REMAP_C33_A, mask_sh), \
-       SF(MPCC_MCM0_MPC_MCM_SECOND_GAMUT_REMAP_C33_C34_A, MPCC_MCM_SECOND_GAMUT_REMAP_C34_A, mask_sh), \
-       SF(MPCC_MCM0_MPCC_MCM_3DLUT_FAST_LOAD_SELECT, MPCC_MCM_3DLUT_FL_SEL, mask_sh), \
-       SF(MPCC_MCM0_MPCC_MCM_3DLUT_FAST_LOAD_STATUS, MPCC_MCM_3DLUT_FL_DONE, mask_sh), \
-       SF(MPCC_MCM0_MPCC_MCM_3DLUT_FAST_LOAD_STATUS, MPCC_MCM_3DLUT_FL_SOFT_UNDERFLOW, mask_sh), \
-       SF(MPCC_MCM0_MPCC_MCM_3DLUT_FAST_LOAD_STATUS, MPCC_MCM_3DLUT_FL_HARD_UNDERFLOW, mask_sh)
-
-
-#define MPC_REG_LIST_DCN4_01_RI(inst) \
-       MPC_REG_LIST_DCN3_2_RI(inst),\
-       SRII(MPCC_MCM_FIRST_GAMUT_REMAP_COEF_FORMAT, MPCC_MCM, inst),\
-       SRII(MPCC_MCM_FIRST_GAMUT_REMAP_MODE, MPCC_MCM, inst),\
-       SRII(MPC_MCM_FIRST_GAMUT_REMAP_C11_C12_A, MPCC_MCM, inst),\
-       SRII(MPC_MCM_FIRST_GAMUT_REMAP_C13_C14_A, MPCC_MCM, inst),\
-       SRII(MPC_MCM_FIRST_GAMUT_REMAP_C21_C22_A, MPCC_MCM, inst),\
-       SRII(MPC_MCM_FIRST_GAMUT_REMAP_C23_C24_A, MPCC_MCM, inst),\
-       SRII(MPC_MCM_FIRST_GAMUT_REMAP_C31_C32_A, MPCC_MCM, inst),\
-       SRII(MPC_MCM_FIRST_GAMUT_REMAP_C33_C34_A, MPCC_MCM, inst),\
-       SRII(MPC_MCM_FIRST_GAMUT_REMAP_C11_C12_B, MPCC_MCM, inst),\
-       SRII(MPC_MCM_FIRST_GAMUT_REMAP_C13_C14_B, MPCC_MCM, inst),\
-       SRII(MPC_MCM_FIRST_GAMUT_REMAP_C21_C22_B, MPCC_MCM, inst),\
-       SRII(MPC_MCM_FIRST_GAMUT_REMAP_C23_C24_B, MPCC_MCM, inst),\
-       SRII(MPC_MCM_FIRST_GAMUT_REMAP_C31_C32_B, MPCC_MCM, inst),\
-       SRII(MPC_MCM_FIRST_GAMUT_REMAP_C33_C34_B, MPCC_MCM, inst),\
-       SRII(MPCC_MCM_SECOND_GAMUT_REMAP_COEF_FORMAT, MPCC_MCM, inst), \
-       SRII(MPCC_MCM_SECOND_GAMUT_REMAP_MODE, MPCC_MCM, inst), \
-       SRII(MPC_MCM_SECOND_GAMUT_REMAP_C11_C12_A, MPCC_MCM, inst), \
-       SRII(MPC_MCM_SECOND_GAMUT_REMAP_C13_C14_A, MPCC_MCM, inst), \
-       SRII(MPC_MCM_SECOND_GAMUT_REMAP_C21_C22_A, MPCC_MCM, inst), \
-       SRII(MPC_MCM_SECOND_GAMUT_REMAP_C23_C24_A, MPCC_MCM, inst), \
-       SRII(MPC_MCM_SECOND_GAMUT_REMAP_C31_C32_A, MPCC_MCM, inst), \
-       SRII(MPC_MCM_SECOND_GAMUT_REMAP_C33_C34_A, MPCC_MCM, inst), \
-       SRII(MPC_MCM_SECOND_GAMUT_REMAP_C11_C12_B, MPCC_MCM, inst), \
-       SRII(MPC_MCM_SECOND_GAMUT_REMAP_C13_C14_B, MPCC_MCM, inst), \
-       SRII(MPC_MCM_SECOND_GAMUT_REMAP_C21_C22_B, MPCC_MCM, inst), \
-       SRII(MPC_MCM_SECOND_GAMUT_REMAP_C23_C24_B, MPCC_MCM, inst), \
-       SRII(MPC_MCM_SECOND_GAMUT_REMAP_C31_C32_B, MPCC_MCM, inst), \
-       SRII(MPC_MCM_SECOND_GAMUT_REMAP_C33_C34_B, MPCC_MCM, inst), \
-       SRII(MPCC_MCM_3DLUT_FAST_LOAD_STATUS, MPCC_MCM, inst),\
-       SRII(MPCC_MCM_3DLUT_FAST_LOAD_SELECT, MPCC_MCM, inst)
-
-#define MPC_REG_FIELD_LIST_DCN4_01(type)\
-       MPC_REG_FIELD_LIST_DCN3_0(type);\
-       MPC_REG_FIELD_LIST_DCN32(type);\
-       type MPCC_MCM_FIRST_GAMUT_REMAP_COEF_FORMAT;\
-       type MPCC_MCM_FIRST_GAMUT_REMAP_MODE;\
-       type MPCC_MCM_FIRST_GAMUT_REMAP_MODE_CURRENT;\
-       type MPCC_MCM_FIRST_GAMUT_REMAP_C11_A;\
-       type MPCC_MCM_FIRST_GAMUT_REMAP_C12_A;\
-       type MPCC_MCM_FIRST_GAMUT_REMAP_C13_A;\
-       type MPCC_MCM_FIRST_GAMUT_REMAP_C14_A;\
-       type MPCC_MCM_FIRST_GAMUT_REMAP_C21_A;\
-       type MPCC_MCM_FIRST_GAMUT_REMAP_C22_A;\
-       type MPCC_MCM_FIRST_GAMUT_REMAP_C23_A;\
-       type MPCC_MCM_FIRST_GAMUT_REMAP_C24_A;\
-       type MPCC_MCM_FIRST_GAMUT_REMAP_C31_A; \
-       type MPCC_MCM_FIRST_GAMUT_REMAP_C32_A; \
-       type MPCC_MCM_FIRST_GAMUT_REMAP_C33_A; \
-       type MPCC_MCM_FIRST_GAMUT_REMAP_C34_A; \
-       type MPCC_MCM_SECOND_GAMUT_REMAP_COEF_FORMAT;\
-       type MPCC_MCM_SECOND_GAMUT_REMAP_MODE;\
-       type MPCC_MCM_SECOND_GAMUT_REMAP_MODE_CURRENT;\
-       type MPCC_MCM_SECOND_GAMUT_REMAP_C11_A;\
-       type MPCC_MCM_SECOND_GAMUT_REMAP_C12_A;\
-       type MPCC_MCM_SECOND_GAMUT_REMAP_C13_A;\
-       type MPCC_MCM_SECOND_GAMUT_REMAP_C14_A;\
-       type MPCC_MCM_SECOND_GAMUT_REMAP_C21_A;\
-       type MPCC_MCM_SECOND_GAMUT_REMAP_C22_A;\
-       type MPCC_MCM_SECOND_GAMUT_REMAP_C23_A;\
-       type MPCC_MCM_SECOND_GAMUT_REMAP_C24_A;\
-       type MPCC_MCM_SECOND_GAMUT_REMAP_C31_A; \
-       type MPCC_MCM_SECOND_GAMUT_REMAP_C32_A; \
-       type MPCC_MCM_SECOND_GAMUT_REMAP_C33_A; \
-       type MPCC_MCM_SECOND_GAMUT_REMAP_C34_A; \
-       type MPCC_MCM_3DLUT_FL_SEL;\
-       type MPCC_MCM_3DLUT_FL_DONE;\
-       type MPCC_MCM_3DLUT_FL_SOFT_UNDERFLOW;\
-       type MPCC_MCM_3DLUT_FL_HARD_UNDERFLOW
-
-struct dcn401_mpc_shift {
-       MPC_REG_FIELD_LIST_DCN4_01(uint8_t);
-};
-
-struct dcn401_mpc_mask {
-       MPC_REG_FIELD_LIST_DCN4_01(uint32_t);
-};
-
-struct dcn401_mpc_registers {
-       MPC_REG_VARIABLE_LIST_DCN4_01;
-};
-
-struct dcn401_mpc {
-       struct mpc base;
-
-       int mpcc_in_use_mask;
-       int num_mpcc;
-       const struct dcn401_mpc_registers *mpc_regs;
-       const struct dcn401_mpc_shift *mpc_shift;
-       const struct dcn401_mpc_mask *mpc_mask;
-       int num_rmu;
-};
-void dcn401_mpc_construct(struct dcn401_mpc *mpc401,
-       struct dc_context *ctx,
-       const struct dcn401_mpc_registers *mpc_regs,
-       const struct dcn401_mpc_shift *mpc_shift,
-       const struct dcn401_mpc_mask *mpc_mask,
-       int num_mpcc,
-       int num_rmu);
-
-void mpc401_set_movable_cm_location(struct mpc *mpc, enum mpcc_movable_cm_location location, int mpcc_id);
-void mpc401_populate_lut(struct mpc *mpc, const enum MCM_LUT_ID id, const union mcm_lut_params params,
-               bool lut_bank_a, int mpcc_id);
-
-void mpc401_program_lut_mode(
-               struct mpc *mpc,
-               const enum MCM_LUT_ID id,
-               const enum MCM_LUT_XABLE xable,
-               bool lut_bank_a,
-               int mpcc_id);
-
-void mpc401_program_lut_read_write_control(
-               struct mpc *mpc,
-               const enum MCM_LUT_ID id,
-               bool lut_bank_a,
-               int mpcc_id);
-
-void mpc401_program_3dlut_size(
-               struct mpc *mpc,
-               bool is_17x17x17,
-               int mpcc_id);
-
-void mpc401_set_gamut_remap(
-       struct mpc *mpc,
-       int mpcc_id,
-       const struct mpc_grph_gamut_adjustment *adjust);
-
-void mpc401_get_gamut_remap(
-       struct mpc *mpc,
-       int mpcc_id,
-       struct mpc_grph_gamut_adjustment *adjust);
-
-#endif
diff --git a/drivers/gpu/drm/amd/display/dc/dio/Makefile b/drivers/gpu/drm/amd/display/dc/dio/Makefile
new file mode 100644 (file)
index 0000000..5fa905c
--- /dev/null
@@ -0,0 +1,63 @@
+#
+# Copyright 2020 Advanced Micro Devices, Inc.
+#
+# Permission is hereby granted, free of charge, to any person obtaining a
+# copy of this software and associated documentation files (the "Software"),
+# to deal in the Software without restriction, including without limitation
+# the rights to use, copy, modify, merge, publish, distribute, sublicense,
+# and/or sell copies of the Software, and to permit persons to whom the
+# Software is furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in
+# all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+# THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
+# OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+# ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+# OTHER DEALINGS IN THE SOFTWARE.
+#
+# Authors: AMD
+#
+#
+
+ifdef CONFIG_DRM_AMD_DC_FP
+###############################################################################
+# DCN32
+###############################################################################
+DIO_DCN32 = dcn32_dio_link_encoder.o dcn32_dio_stream_encoder.o
+
+AMD_DAL_DIO_DCN32 = $(addprefix $(AMDDALPATH)/dc/dio/dcn32/,$(DIO_DCN32))
+
+AMD_DISPLAY_FILES += $(AMD_DAL_DIO_DCN32)
+
+###############################################################################
+# DCN35
+###############################################################################
+DIO_DCN35 = dcn35_dio_link_encoder.o dcn35_dio_stream_encoder.o
+
+AMD_DAL_DIO_DCN35 = $(addprefix $(AMDDALPATH)/dc/dio/dcn35/,$(DIO_DCN35))
+
+AMD_DISPLAY_FILES += $(AMD_DAL_DIO_DCN35)
+
+###############################################################################
+# DCN321
+###############################################################################
+DIO_DCN321 = dcn321_dio_link_encoder.o
+
+AMD_DAL_DIO_DCN321 = $(addprefix $(AMDDALPATH)/dc/dio/dcn321/,$(DIO_DCN321))
+
+AMD_DISPLAY_FILES += $(AMD_DAL_DIO_DCN321)
+
+
+###############################################################################
+# DCN401
+###############################################################################
+DIO_DCN401 = dcn401_dio_link_encoder.o dcn401_dio_stream_encoder.o
+
+AMD_DAL_DIO_DCN401 = $(addprefix $(AMDDALPATH)/dc/dio/dcn401/,$(DIO_DCN401))
+
+AMD_DISPLAY_FILES += $(AMD_DAL_DIO_DCN401)
+endif
diff --git a/drivers/gpu/drm/amd/display/dc/dio/dcn32/dcn32_dio_link_encoder.c b/drivers/gpu/drm/amd/display/dc/dio/dcn32/dcn32_dio_link_encoder.c
new file mode 100644 (file)
index 0000000..06907e8
--- /dev/null
@@ -0,0 +1,328 @@
+/*
+ * Copyright 2021 Advanced Micro Devices, Inc.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+ * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
+ * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+ * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+ * OTHER DEALINGS IN THE SOFTWARE.
+ *
+ * Authors: AMD
+ *
+ */
+
+
+#include "reg_helper.h"
+
+#include "core_types.h"
+#include "link_encoder.h"
+#include "dcn31/dcn31_dio_link_encoder.h"
+#include "dcn32_dio_link_encoder.h"
+#include "stream_encoder.h"
+#include "dc_bios_types.h"
+#include "link_enc_cfg.h"
+
+#include "dc_dmub_srv.h"
+#include "gpio_service_interface.h"
+
+#ifndef MIN
+#define MIN(X, Y) ((X) < (Y) ? (X) : (Y))
+#endif
+
+#define CTX \
+       enc10->base.ctx
+#define DC_LOGGER \
+       enc10->base.ctx->logger
+
+#define REG(reg)\
+       (enc10->link_regs->reg)
+
+#undef FN
+#define FN(reg_name, field_name) \
+       enc10->link_shift->field_name, enc10->link_mask->field_name
+
+#define AUX_REG(reg)\
+       (enc10->aux_regs->reg)
+
+#define AUX_REG_READ(reg_name) \
+               dm_read_reg(CTX, AUX_REG(reg_name))
+
+#define AUX_REG_WRITE(reg_name, val) \
+                       dm_write_reg(CTX, AUX_REG(reg_name), val)
+
+static uint8_t phy_id_from_transmitter(enum transmitter t)
+{
+       uint8_t phy_id;
+
+       switch (t) {
+       case TRANSMITTER_UNIPHY_A:
+               phy_id = 0;
+               break;
+       case TRANSMITTER_UNIPHY_B:
+               phy_id = 1;
+               break;
+       case TRANSMITTER_UNIPHY_C:
+               phy_id = 2;
+               break;
+       case TRANSMITTER_UNIPHY_D:
+               phy_id = 3;
+               break;
+       case TRANSMITTER_UNIPHY_E:
+               phy_id = 4;
+               break;
+       case TRANSMITTER_UNIPHY_F:
+               phy_id = 5;
+               break;
+       case TRANSMITTER_UNIPHY_G:
+               phy_id = 6;
+               break;
+       default:
+               phy_id = 0;
+               break;
+       }
+       return phy_id;
+}
+
+void enc32_hw_init(struct link_encoder *enc)
+{
+       struct dcn10_link_encoder *enc10 = TO_DCN10_LINK_ENC(enc);
+
+/*
+       00 - DP_AUX_DPHY_RX_DETECTION_THRESHOLD__1to2 : 1/2
+       01 - DP_AUX_DPHY_RX_DETECTION_THRESHOLD__3to4 : 3/4
+       02 - DP_AUX_DPHY_RX_DETECTION_THRESHOLD__7to8 : 7/8
+       03 - DP_AUX_DPHY_RX_DETECTION_THRESHOLD__15to16 : 15/16
+       04 - DP_AUX_DPHY_RX_DETECTION_THRESHOLD__31to32 : 31/32
+       05 - DP_AUX_DPHY_RX_DETECTION_THRESHOLD__63to64 : 63/64
+       06 - DP_AUX_DPHY_RX_DETECTION_THRESHOLD__127to128 : 127/128
+       07 - DP_AUX_DPHY_RX_DETECTION_THRESHOLD__255to256 : 255/256
+*/
+
+/*
+       AUX_REG_UPDATE_5(AUX_DPHY_RX_CONTROL0,
+       AUX_RX_START_WINDOW = 1 [6:4]
+       AUX_RX_RECEIVE_WINDOW = 1 default is 2 [10:8]
+       AUX_RX_HALF_SYM_DETECT_LEN  = 1 [13:12] default is 1
+       AUX_RX_TRANSITION_FILTER_EN = 1 [16] default is 1
+       AUX_RX_ALLOW_BELOW_THRESHOLD_PHASE_DETECT [17] is 0  default is 0
+       AUX_RX_ALLOW_BELOW_THRESHOLD_START [18] is 1  default is 1
+       AUX_RX_ALLOW_BELOW_THRESHOLD_STOP [19] is 1  default is 1
+       AUX_RX_PHASE_DETECT_LEN,  [21,20] = 0x3 default is 3
+       AUX_RX_DETECTION_THRESHOLD [30:28] = 1
+*/
+       AUX_REG_WRITE(AUX_DPHY_RX_CONTROL0, 0x103d1110);
+
+       AUX_REG_WRITE(AUX_DPHY_TX_CONTROL, 0x21c7a);
+
+       //AUX_DPHY_TX_REF_CONTROL'AUX_TX_REF_DIV HW default is 0x32;
+       // Set AUX_TX_REF_DIV Divider to generate 2 MHz reference from refclk
+       // 27MHz -> 0xd
+       // 100MHz -> 0x32
+       // 48MHz -> 0x18
+
+       // Set TMDS_CTL0 to 1.  This is a legacy setting.
+       REG_UPDATE(TMDS_CTL_BITS, TMDS_CTL0, 1);
+
+       dcn10_aux_initialize(enc10);
+}
+
+
+void dcn32_link_encoder_enable_dp_output(
+       struct link_encoder *enc,
+       const struct dc_link_settings *link_settings,
+       enum clock_source_id clock_source)
+{
+       if (!enc->ctx->dc->debug.avoid_vbios_exec_table) {
+               dcn10_link_encoder_enable_dp_output(enc, link_settings, clock_source);
+               return;
+       }
+}
+
+static bool query_dp_alt_from_dmub(struct link_encoder *enc,
+       union dmub_rb_cmd *cmd)
+{
+       struct dcn10_link_encoder *enc10 = TO_DCN10_LINK_ENC(enc);
+
+       memset(cmd, 0, sizeof(*cmd));
+       cmd->query_dp_alt.header.type = DMUB_CMD__VBIOS;
+       cmd->query_dp_alt.header.sub_type =
+               DMUB_CMD__VBIOS_TRANSMITTER_QUERY_DP_ALT;
+       cmd->query_dp_alt.header.payload_bytes = sizeof(cmd->query_dp_alt.data);
+       cmd->query_dp_alt.data.phy_id = phy_id_from_transmitter(enc10->base.transmitter);
+
+       if (!dc_wake_and_execute_dmub_cmd(enc->ctx, cmd, DM_DMUB_WAIT_TYPE_WAIT_WITH_REPLY))
+               return false;
+
+       return true;
+}
+
+bool dcn32_link_encoder_is_in_alt_mode(struct link_encoder *enc)
+{
+       union dmub_rb_cmd cmd;
+
+       if (!query_dp_alt_from_dmub(enc, &cmd))
+               return false;
+
+       return (cmd.query_dp_alt.data.is_dp_alt_disable == 0);
+}
+
+void dcn32_link_encoder_get_max_link_cap(struct link_encoder *enc,
+       struct dc_link_settings *link_settings)
+{
+       union dmub_rb_cmd cmd;
+
+       dcn10_link_encoder_get_max_link_cap(enc, link_settings);
+
+       if (!query_dp_alt_from_dmub(enc, &cmd))
+               return;
+
+       if (cmd.query_dp_alt.data.is_usb &&
+                       cmd.query_dp_alt.data.is_dp4 == 0)
+               link_settings->lane_count = MIN(LANE_COUNT_TWO, link_settings->lane_count);
+}
+
+
+static const struct link_encoder_funcs dcn32_link_enc_funcs = {
+       .read_state = link_enc2_read_state,
+       .validate_output_with_stream =
+                       dcn30_link_encoder_validate_output_with_stream,
+       .hw_init = enc32_hw_init,
+       .setup = dcn10_link_encoder_setup,
+       .enable_tmds_output = dcn10_link_encoder_enable_tmds_output,
+       .enable_dp_output = dcn32_link_encoder_enable_dp_output,
+       .enable_dp_mst_output = dcn10_link_encoder_enable_dp_mst_output,
+       .disable_output = dcn10_link_encoder_disable_output,
+       .dp_set_lane_settings = dcn10_link_encoder_dp_set_lane_settings,
+       .dp_set_phy_pattern = dcn10_link_encoder_dp_set_phy_pattern,
+       .update_mst_stream_allocation_table =
+               dcn10_link_encoder_update_mst_stream_allocation_table,
+       .psr_program_dp_dphy_fast_training =
+                       dcn10_psr_program_dp_dphy_fast_training,
+       .psr_program_secondary_packet = dcn10_psr_program_secondary_packet,
+       .connect_dig_be_to_fe = dcn10_link_encoder_connect_dig_be_to_fe,
+       .enable_hpd = dcn10_link_encoder_enable_hpd,
+       .disable_hpd = dcn10_link_encoder_disable_hpd,
+       .is_dig_enabled = dcn10_is_dig_enabled,
+       .destroy = dcn10_link_encoder_destroy,
+       .fec_set_enable = enc2_fec_set_enable,
+       .fec_set_ready = enc2_fec_set_ready,
+       .fec_is_active = enc2_fec_is_active,
+       .get_dig_frontend = dcn10_get_dig_frontend,
+       .get_dig_mode = dcn10_get_dig_mode,
+       .is_in_alt_mode = dcn32_link_encoder_is_in_alt_mode,
+       .get_max_link_cap = dcn32_link_encoder_get_max_link_cap,
+       .set_dio_phy_mux = dcn31_link_encoder_set_dio_phy_mux,
+};
+
+void dcn32_link_encoder_construct(
+       struct dcn20_link_encoder *enc20,
+       const struct encoder_init_data *init_data,
+       const struct encoder_feature_support *enc_features,
+       const struct dcn10_link_enc_registers *link_regs,
+       const struct dcn10_link_enc_aux_registers *aux_regs,
+       const struct dcn10_link_enc_hpd_registers *hpd_regs,
+       const struct dcn10_link_enc_shift *link_shift,
+       const struct dcn10_link_enc_mask *link_mask)
+{
+       struct bp_connector_speed_cap_info bp_cap_info = {0};
+       const struct dc_vbios_funcs *bp_funcs = init_data->ctx->dc_bios->funcs;
+       enum bp_result result = BP_RESULT_OK;
+       struct dcn10_link_encoder *enc10 = &enc20->enc10;
+
+       enc10->base.funcs = &dcn32_link_enc_funcs;
+       enc10->base.ctx = init_data->ctx;
+       enc10->base.id = init_data->encoder;
+
+       enc10->base.hpd_source = init_data->hpd_source;
+       enc10->base.connector = init_data->connector;
+
+       enc10->base.preferred_engine = ENGINE_ID_UNKNOWN;
+
+       enc10->base.features = *enc_features;
+
+       enc10->base.transmitter = init_data->transmitter;
+
+       /* set the flag to indicate whether driver poll the I2C data pin
+        * while doing the DP sink detect
+        */
+
+/*     if (dal_adapter_service_is_feature_supported(as,
+               FEATURE_DP_SINK_DETECT_POLL_DATA_PIN))
+               enc10->base.features.flags.bits.
+                       DP_SINK_DETECT_POLL_DATA_PIN = true;*/
+
+       enc10->base.output_signals =
+               SIGNAL_TYPE_DVI_SINGLE_LINK |
+               SIGNAL_TYPE_DVI_DUAL_LINK |
+               SIGNAL_TYPE_LVDS |
+               SIGNAL_TYPE_DISPLAY_PORT |
+               SIGNAL_TYPE_DISPLAY_PORT_MST |
+               SIGNAL_TYPE_EDP |
+               SIGNAL_TYPE_HDMI_TYPE_A;
+
+       enc10->link_regs = link_regs;
+       enc10->aux_regs = aux_regs;
+       enc10->hpd_regs = hpd_regs;
+       enc10->link_shift = link_shift;
+       enc10->link_mask = link_mask;
+
+       switch (enc10->base.transmitter) {
+       case TRANSMITTER_UNIPHY_A:
+               enc10->base.preferred_engine = ENGINE_ID_DIGA;
+       break;
+       case TRANSMITTER_UNIPHY_B:
+               enc10->base.preferred_engine = ENGINE_ID_DIGB;
+       break;
+       case TRANSMITTER_UNIPHY_C:
+               enc10->base.preferred_engine = ENGINE_ID_DIGC;
+       break;
+       case TRANSMITTER_UNIPHY_D:
+               enc10->base.preferred_engine = ENGINE_ID_DIGD;
+       break;
+       case TRANSMITTER_UNIPHY_E:
+               enc10->base.preferred_engine = ENGINE_ID_DIGE;
+       break;
+       default:
+               ASSERT_CRITICAL(false);
+               enc10->base.preferred_engine = ENGINE_ID_UNKNOWN;
+       }
+
+       /* default to one to mirror Windows behavior */
+       enc10->base.features.flags.bits.HDMI_6GB_EN = 1;
+
+       if (bp_funcs->get_connector_speed_cap_info)
+               result = bp_funcs->get_connector_speed_cap_info(enc10->base.ctx->dc_bios,
+                                               enc10->base.connector, &bp_cap_info);
+
+       /* Override features with DCE-specific values */
+       if (result == BP_RESULT_OK) {
+               enc10->base.features.flags.bits.IS_HBR2_CAPABLE =
+                               bp_cap_info.DP_HBR2_EN;
+               enc10->base.features.flags.bits.IS_HBR3_CAPABLE =
+                               bp_cap_info.DP_HBR3_EN;
+               enc10->base.features.flags.bits.HDMI_6GB_EN = bp_cap_info.HDMI_6GB_EN;
+               enc10->base.features.flags.bits.IS_DP2_CAPABLE = 1;
+               enc10->base.features.flags.bits.IS_UHBR10_CAPABLE = bp_cap_info.DP_UHBR10_EN;
+               enc10->base.features.flags.bits.IS_UHBR13_5_CAPABLE = bp_cap_info.DP_UHBR13_5_EN;
+               enc10->base.features.flags.bits.IS_UHBR20_CAPABLE = bp_cap_info.DP_UHBR20_EN;
+       } else {
+               DC_LOG_WARNING("%s: Failed to get encoder_cap_info from VBIOS with error code %d!\n",
+                               __func__,
+                               result);
+       }
+       if (enc10->base.ctx->dc->debug.hdmi20_disable) {
+               enc10->base.features.flags.bits.HDMI_6GB_EN = 0;
+       }
+}
diff --git a/drivers/gpu/drm/amd/display/dc/dio/dcn32/dcn32_dio_link_encoder.h b/drivers/gpu/drm/amd/display/dc/dio/dcn32/dcn32_dio_link_encoder.h
new file mode 100644 (file)
index 0000000..35d23d9
--- /dev/null
@@ -0,0 +1,53 @@
+/*
+ * Copyright 2021 Advanced Micro Devices, Inc.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ *  and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+ * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
+ * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+ * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+ * OTHER DEALINGS IN THE SOFTWARE.
+ *
+ * Authors: AMD
+ *
+ */
+
+#ifndef __DC_LINK_ENCODER__DCN32_H__
+#define __DC_LINK_ENCODER__DCN32_H__
+
+#include "dcn30/dcn30_dio_link_encoder.h"
+
+void dcn32_link_encoder_construct(
+       struct dcn20_link_encoder *enc20,
+       const struct encoder_init_data *init_data,
+       const struct encoder_feature_support *enc_features,
+       const struct dcn10_link_enc_registers *link_regs,
+       const struct dcn10_link_enc_aux_registers *aux_regs,
+       const struct dcn10_link_enc_hpd_registers *hpd_regs,
+       const struct dcn10_link_enc_shift *link_shift,
+       const struct dcn10_link_enc_mask *link_mask);
+
+void enc32_hw_init(struct link_encoder *enc);
+
+void dcn32_link_encoder_enable_dp_output(
+       struct link_encoder *enc,
+       const struct dc_link_settings *link_settings,
+       enum clock_source_id clock_source);
+
+bool dcn32_link_encoder_is_in_alt_mode(struct link_encoder *enc);
+
+void dcn32_link_encoder_get_max_link_cap(struct link_encoder *enc,
+       struct dc_link_settings *link_settings);
+
+#endif /* __DC_LINK_ENCODER__DCN32_H__ */
diff --git a/drivers/gpu/drm/amd/display/dc/dio/dcn32/dcn32_dio_stream_encoder.c b/drivers/gpu/drm/amd/display/dc/dio/dcn32/dcn32_dio_stream_encoder.c
new file mode 100644 (file)
index 0000000..1a9bb61
--- /dev/null
@@ -0,0 +1,493 @@
+/*
+ * Copyright 2021 Advanced Micro Devices, Inc.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ *  and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+ * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
+ * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+ * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+ * OTHER DEALINGS IN THE SOFTWARE.
+ *
+ * Authors: AMD
+ *
+ */
+
+
+#include "dc_bios_types.h"
+#include "dcn30/dcn30_dio_stream_encoder.h"
+#include "dcn32_dio_stream_encoder.h"
+#include "reg_helper.h"
+#include "hw_shared.h"
+#include "link.h"
+#include "dpcd_defs.h"
+
+#define DC_LOGGER \
+               enc1->base.ctx->logger
+
+#define REG(reg)\
+       (enc1->regs->reg)
+
+#undef FN
+#define FN(reg_name, field_name) \
+       enc1->se_shift->field_name, enc1->se_mask->field_name
+
+#define VBI_LINE_0 0
+#define HDMI_CLOCK_CHANNEL_RATE_MORE_340M 340000
+
+#define CTX \
+       enc1->base.ctx
+
+
+
+static void enc32_dp_set_odm_combine(
+       struct stream_encoder *enc,
+       bool two_pixel_per_cyle)
+{
+       struct dcn10_stream_encoder *enc1 = DCN10STRENC_FROM_STRENC(enc);
+
+       REG_UPDATE(DP_PIXEL_FORMAT, DP_PIXEL_PER_CYCLE_PROCESSING_MODE, two_pixel_per_cyle ? 1 : 0);
+}
+
+/* setup stream encoder in dvi mode */
+static void enc32_stream_encoder_dvi_set_stream_attribute(
+       struct stream_encoder *enc,
+       struct dc_crtc_timing *crtc_timing,
+       bool is_dual_link)
+{
+       struct dcn10_stream_encoder *enc1 = DCN10STRENC_FROM_STRENC(enc);
+
+       if (!enc->ctx->dc->debug.avoid_vbios_exec_table) {
+               struct bp_encoder_control cntl = {0};
+
+               cntl.action = ENCODER_CONTROL_SETUP;
+               cntl.engine_id = enc1->base.id;
+               cntl.signal = is_dual_link ?
+                       SIGNAL_TYPE_DVI_DUAL_LINK : SIGNAL_TYPE_DVI_SINGLE_LINK;
+               cntl.enable_dp_audio = false;
+               cntl.pixel_clock = crtc_timing->pix_clk_100hz / 10;
+               cntl.lanes_number = (is_dual_link) ? LANE_COUNT_EIGHT : LANE_COUNT_FOUR;
+
+               if (enc1->base.bp->funcs->encoder_control(
+                               enc1->base.bp, &cntl) != BP_RESULT_OK)
+                       return;
+
+       } else {
+
+               //Set pattern for clock channel, default vlue 0x63 does not work
+               REG_UPDATE(DIG_CLOCK_PATTERN, DIG_CLOCK_PATTERN, 0x1F);
+
+               //DIG_BE_TMDS_DVI_MODE : TMDS-DVI mode is already set in link_encoder_setup
+
+               //DIG_SOURCE_SELECT is already set in dig_connect_to_otg
+
+               /* DIG_START is removed from the register spec */
+       }
+
+       ASSERT(crtc_timing->pixel_encoding == PIXEL_ENCODING_RGB);
+       ASSERT(crtc_timing->display_color_depth == COLOR_DEPTH_888);
+       enc1_stream_encoder_set_stream_attribute_helper(enc1, crtc_timing);
+}
+
+/* setup stream encoder in hdmi mode */
+static void enc32_stream_encoder_hdmi_set_stream_attribute(
+       struct stream_encoder *enc,
+       struct dc_crtc_timing *crtc_timing,
+       int actual_pix_clk_khz,
+       bool enable_audio)
+{
+       struct dcn10_stream_encoder *enc1 = DCN10STRENC_FROM_STRENC(enc);
+
+       if (!enc->ctx->dc->debug.avoid_vbios_exec_table) {
+               struct bp_encoder_control cntl = {0};
+
+               cntl.action = ENCODER_CONTROL_SETUP;
+               cntl.engine_id = enc1->base.id;
+               cntl.signal = SIGNAL_TYPE_HDMI_TYPE_A;
+               cntl.enable_dp_audio = enable_audio;
+               cntl.pixel_clock = actual_pix_clk_khz;
+               cntl.lanes_number = LANE_COUNT_FOUR;
+
+               if (enc1->base.bp->funcs->encoder_control(
+                               enc1->base.bp, &cntl) != BP_RESULT_OK)
+                       return;
+
+       } else {
+
+               //Set pattern for clock channel, default vlue 0x63 does not work
+               REG_UPDATE(DIG_CLOCK_PATTERN, DIG_CLOCK_PATTERN, 0x1F);
+
+               //DIG_BE_TMDS_HDMI_MODE : TMDS-HDMI mode is already set in link_encoder_setup
+
+               //DIG_SOURCE_SELECT is already set in dig_connect_to_otg
+
+               /* DIG_START is removed from the register spec */
+       }
+
+       /* Configure pixel encoding */
+       enc1_stream_encoder_set_stream_attribute_helper(enc1, crtc_timing);
+
+       /* setup HDMI engine */
+       REG_UPDATE_6(HDMI_CONTROL,
+               HDMI_PACKET_GEN_VERSION, 1,
+               HDMI_KEEPOUT_MODE, 1,
+               HDMI_DEEP_COLOR_ENABLE, 0,
+               HDMI_DATA_SCRAMBLE_EN, 0,
+               HDMI_NO_EXTRA_NULL_PACKET_FILLED, 1,
+               HDMI_CLOCK_CHANNEL_RATE, 0);
+
+       /* Configure color depth */
+       switch (crtc_timing->display_color_depth) {
+       case COLOR_DEPTH_888:
+               REG_UPDATE(HDMI_CONTROL, HDMI_DEEP_COLOR_DEPTH, 0);
+               break;
+       case COLOR_DEPTH_101010:
+               if (crtc_timing->pixel_encoding == PIXEL_ENCODING_YCBCR422) {
+                       REG_UPDATE_2(HDMI_CONTROL,
+                                       HDMI_DEEP_COLOR_DEPTH, 1,
+                                       HDMI_DEEP_COLOR_ENABLE, 0);
+               } else {
+                       REG_UPDATE_2(HDMI_CONTROL,
+                                       HDMI_DEEP_COLOR_DEPTH, 1,
+                                       HDMI_DEEP_COLOR_ENABLE, 1);
+                       }
+               break;
+       case COLOR_DEPTH_121212:
+               if (crtc_timing->pixel_encoding == PIXEL_ENCODING_YCBCR422) {
+                       REG_UPDATE_2(HDMI_CONTROL,
+                                       HDMI_DEEP_COLOR_DEPTH, 2,
+                                       HDMI_DEEP_COLOR_ENABLE, 0);
+               } else {
+                       REG_UPDATE_2(HDMI_CONTROL,
+                                       HDMI_DEEP_COLOR_DEPTH, 2,
+                                       HDMI_DEEP_COLOR_ENABLE, 1);
+                       }
+               break;
+       case COLOR_DEPTH_161616:
+               REG_UPDATE_2(HDMI_CONTROL,
+                               HDMI_DEEP_COLOR_DEPTH, 3,
+                               HDMI_DEEP_COLOR_ENABLE, 1);
+               break;
+       default:
+               break;
+       }
+
+       if (actual_pix_clk_khz >= HDMI_CLOCK_CHANNEL_RATE_MORE_340M) {
+               /* enable HDMI data scrambler
+                * HDMI_CLOCK_CHANNEL_RATE_MORE_340M
+                * Clock channel frequency is 1/4 of character rate.
+                */
+               REG_UPDATE_2(HDMI_CONTROL,
+                       HDMI_DATA_SCRAMBLE_EN, 1,
+                       HDMI_CLOCK_CHANNEL_RATE, 1);
+       } else if (crtc_timing->flags.LTE_340MCSC_SCRAMBLE) {
+
+               /* TODO: New feature for DCE11, still need to implement */
+
+               /* enable HDMI data scrambler
+                * HDMI_CLOCK_CHANNEL_FREQ_EQUAL_TO_CHAR_RATE
+                * Clock channel frequency is the same
+                * as character rate
+                */
+               REG_UPDATE_2(HDMI_CONTROL,
+                       HDMI_DATA_SCRAMBLE_EN, 1,
+                       HDMI_CLOCK_CHANNEL_RATE, 0);
+       }
+
+
+       /* Enable transmission of General Control packet on every frame */
+       REG_UPDATE_3(HDMI_VBI_PACKET_CONTROL,
+               HDMI_GC_CONT, 1,
+               HDMI_GC_SEND, 1,
+               HDMI_NULL_SEND, 1);
+
+       /* Disable Audio Content Protection packet transmission */
+       REG_UPDATE(HDMI_VBI_PACKET_CONTROL, HDMI_ACP_SEND, 0);
+
+       /* following belongs to audio */
+       /* Enable Audio InfoFrame packet transmission. */
+       REG_UPDATE(HDMI_INFOFRAME_CONTROL0, HDMI_AUDIO_INFO_SEND, 1);
+
+       /* update double-buffered AUDIO_INFO registers immediately */
+       ASSERT(enc->afmt);
+       enc->afmt->funcs->audio_info_immediate_update(enc->afmt);
+
+       /* Select line number on which to send Audio InfoFrame packets */
+       REG_UPDATE(HDMI_INFOFRAME_CONTROL1, HDMI_AUDIO_INFO_LINE,
+                               VBI_LINE_0 + 2);
+
+       /* set HDMI GC AVMUTE */
+       REG_UPDATE(HDMI_GC, HDMI_GC_AVMUTE, 0);
+}
+
+
+
+static bool is_two_pixels_per_containter(const struct dc_crtc_timing *timing)
+{
+       bool two_pix = timing->pixel_encoding == PIXEL_ENCODING_YCBCR420;
+
+       two_pix = two_pix || (timing->flags.DSC && timing->pixel_encoding == PIXEL_ENCODING_YCBCR422
+                       && !timing->dsc_cfg.ycbcr422_simple);
+       return two_pix;
+}
+
+void enc32_stream_encoder_dp_unblank(
+       struct dc_link *link,
+       struct stream_encoder *enc,
+       const struct encoder_unblank_param *param)
+{
+       struct dcn10_stream_encoder *enc1 = DCN10STRENC_FROM_STRENC(enc);
+
+       if (param->link_settings.link_rate != LINK_RATE_UNKNOWN) {
+               uint32_t n_vid = 0x8000;
+               uint32_t m_vid;
+               uint32_t n_multiply = 0;
+               uint32_t pix_per_cycle = 0;
+               uint64_t m_vid_l = n_vid;
+
+               /* YCbCr 4:2:0 : Computed VID_M will be 2X the input rate */
+               if (is_two_pixels_per_containter(&param->timing) || param->opp_cnt > 1
+                       || param->pix_per_cycle > 1) {
+                       /*this logic should be the same in get_pixel_clock_parameters() */
+                       n_multiply = 1;
+                       pix_per_cycle = 1;
+               }
+               /* M / N = Fstream / Flink
+                * m_vid / n_vid = pixel rate / link rate
+                */
+
+               m_vid_l *= param->timing.pix_clk_100hz / 10;
+               m_vid_l = div_u64(m_vid_l,
+                       param->link_settings.link_rate
+                               * LINK_RATE_REF_FREQ_IN_KHZ);
+
+               m_vid = (uint32_t) m_vid_l;
+
+               /* enable auto measurement */
+
+               REG_UPDATE(DP_VID_TIMING, DP_VID_M_N_GEN_EN, 0);
+
+               /* auto measurement need 1 full 0x8000 symbol cycle to kick in,
+                * therefore program initial value for Mvid and Nvid
+                */
+
+               REG_UPDATE(DP_VID_N, DP_VID_N, n_vid);
+
+               REG_UPDATE(DP_VID_M, DP_VID_M, m_vid);
+
+               REG_UPDATE_2(DP_VID_TIMING,
+                               DP_VID_M_N_GEN_EN, 1,
+                               DP_VID_N_MUL, n_multiply);
+
+               REG_UPDATE(DP_PIXEL_FORMAT,
+                               DP_PIXEL_PER_CYCLE_PROCESSING_MODE,
+                               pix_per_cycle);
+       }
+
+       /* make sure stream is disabled before resetting steer fifo */
+       REG_UPDATE(DP_VID_STREAM_CNTL, DP_VID_STREAM_ENABLE, false);
+       REG_WAIT(DP_VID_STREAM_CNTL, DP_VID_STREAM_STATUS, 0, 10, 5000);
+
+       /* DIG_START is removed from the register spec */
+
+       /* switch DP encoder to CRTC data, but reset it the fifo first. It may happen
+        * that it overflows during mode transition, and sometimes doesn't recover.
+        */
+       REG_UPDATE(DP_STEER_FIFO, DP_STEER_FIFO_RESET, 1);
+       udelay(10);
+
+       REG_UPDATE(DP_STEER_FIFO, DP_STEER_FIFO_RESET, 0);
+
+       /* DIG Resync FIFO now needs to be explicitly enabled
+        */
+       // TODO: Confirm if we need to wait for DIG_SYMCLK_FE_ON
+       REG_WAIT(DIG_FE_CNTL, DIG_SYMCLK_FE_ON, 1, 10, 5000);
+
+       /* read start level = 0 will bring underflow / overflow and DIG_FIFO_ERROR = 1
+        * so set it to 1/2 full = 7 before reset as suggested by hardware team.
+        */
+       REG_UPDATE(DIG_FIFO_CTRL0, DIG_FIFO_READ_START_LEVEL, 0x7);
+
+       REG_UPDATE(DIG_FIFO_CTRL0, DIG_FIFO_RESET, 1);
+
+       REG_WAIT(DIG_FIFO_CTRL0, DIG_FIFO_RESET_DONE, 1, 10, 5000);
+
+       REG_UPDATE(DIG_FIFO_CTRL0, DIG_FIFO_RESET, 0);
+
+       REG_WAIT(DIG_FIFO_CTRL0, DIG_FIFO_RESET_DONE, 0, 10, 5000);
+
+       REG_UPDATE(DIG_FIFO_CTRL0, DIG_FIFO_ENABLE, 1);
+
+       /* wait 100us for DIG/DP logic to prime
+        * (i.e. a few video lines)
+        */
+       udelay(100);
+
+       /* the hardware would start sending video at the start of the next DP
+        * frame (i.e. rising edge of the vblank).
+        * NOTE: We used to program DP_VID_STREAM_DIS_DEFER = 2 here, but this
+        * register has no effect on enable transition! HW always guarantees
+        * VID_STREAM enable at start of next frame, and this is not
+        * programmable
+        */
+
+       REG_UPDATE(DP_VID_STREAM_CNTL, DP_VID_STREAM_ENABLE, true);
+
+       link->dc->link_srv->dp_trace_source_sequence(link, DPCD_SOURCE_SEQ_AFTER_ENABLE_DP_VID_STREAM);
+}
+
+/* Set DSC-related configuration.
+ *   dsc_mode: 0 disables DSC, other values enable DSC in specified format
+ *   sc_bytes_per_pixel: DP_DSC_BYTES_PER_PIXEL removed in DCN32
+ *   dsc_slice_width: DP_DSC_SLICE_WIDTH removed in DCN32
+ */
+static void enc32_dp_set_dsc_config(struct stream_encoder *enc,
+                                       enum optc_dsc_mode dsc_mode,
+                                       uint32_t dsc_bytes_per_pixel,
+                                       uint32_t dsc_slice_width)
+{
+       struct dcn10_stream_encoder *enc1 = DCN10STRENC_FROM_STRENC(enc);
+
+       REG_UPDATE(DP_DSC_CNTL, DP_DSC_MODE, dsc_mode == OPTC_DSC_DISABLED ? 0 : 1);
+}
+
+/* this function read dsc related register fields to be logged later in dcn10_log_hw_state
+ * into a dcn_dsc_state struct.
+ */
+static void enc32_read_state(struct stream_encoder *enc, struct enc_state *s)
+{
+       struct dcn10_stream_encoder *enc1 = DCN10STRENC_FROM_STRENC(enc);
+
+       //if dsc is enabled, continue to read
+       REG_GET(DP_DSC_CNTL, DP_DSC_MODE, &s->dsc_mode);
+       if (s->dsc_mode) {
+               REG_GET(DP_GSP11_CNTL, DP_SEC_GSP11_LINE_NUM, &s->sec_gsp_pps_line_num);
+
+               REG_GET(DP_MSA_VBID_MISC, DP_VBID6_LINE_REFERENCE, &s->vbid6_line_reference);
+               REG_GET(DP_MSA_VBID_MISC, DP_VBID6_LINE_NUM, &s->vbid6_line_num);
+
+               REG_GET(DP_GSP11_CNTL, DP_SEC_GSP11_ENABLE, &s->sec_gsp_pps_enable);
+               REG_GET(DP_SEC_CNTL, DP_SEC_STREAM_ENABLE, &s->sec_stream_enable);
+       }
+}
+
+static void enc32_set_dig_input_mode(struct stream_encoder *enc, unsigned int pix_per_container)
+{
+       struct dcn10_stream_encoder *enc1 = DCN10STRENC_FROM_STRENC(enc);
+
+       /* The naming of this field is confusing, what it means is the output mode of otg, which
+        * is the input mode of the dig
+        */
+       REG_UPDATE(DIG_FIFO_CTRL0, DIG_FIFO_OUTPUT_PIXEL_MODE, pix_per_container == 2 ? 0x1 : 0x0);
+}
+
+static void enc32_reset_fifo(struct stream_encoder *enc, bool reset)
+{
+       struct dcn10_stream_encoder *enc1 = DCN10STRENC_FROM_STRENC(enc);
+       uint32_t reset_val = reset ? 1 : 0;
+       uint32_t is_symclk_on;
+
+       REG_UPDATE(DIG_FIFO_CTRL0, DIG_FIFO_RESET, reset_val);
+       REG_GET(DIG_FE_CNTL, DIG_SYMCLK_FE_ON, &is_symclk_on);
+
+       if (is_symclk_on)
+               REG_WAIT(DIG_FIFO_CTRL0, DIG_FIFO_RESET_DONE, reset_val, 10, 5000);
+       else
+               udelay(10);
+}
+
+void enc32_enable_fifo(struct stream_encoder *enc)
+{
+       struct dcn10_stream_encoder *enc1 = DCN10STRENC_FROM_STRENC(enc);
+
+       REG_UPDATE(DIG_FIFO_CTRL0, DIG_FIFO_READ_START_LEVEL, 0x7);
+
+       enc32_reset_fifo(enc, true);
+       enc32_reset_fifo(enc, false);
+
+       REG_UPDATE(DIG_FIFO_CTRL0, DIG_FIFO_ENABLE, 1);
+}
+
+static const struct stream_encoder_funcs dcn32_str_enc_funcs = {
+       .dp_set_odm_combine =
+               enc32_dp_set_odm_combine,
+       .dp_set_stream_attribute =
+               enc2_stream_encoder_dp_set_stream_attribute,
+       .hdmi_set_stream_attribute =
+               enc32_stream_encoder_hdmi_set_stream_attribute,
+       .dvi_set_stream_attribute =
+               enc32_stream_encoder_dvi_set_stream_attribute,
+       .set_throttled_vcp_size =
+               enc1_stream_encoder_set_throttled_vcp_size,
+       .update_hdmi_info_packets =
+               enc3_stream_encoder_update_hdmi_info_packets,
+       .stop_hdmi_info_packets =
+               enc3_stream_encoder_stop_hdmi_info_packets,
+       .update_dp_info_packets_sdp_line_num =
+               enc3_stream_encoder_update_dp_info_packets_sdp_line_num,
+       .update_dp_info_packets =
+               enc3_stream_encoder_update_dp_info_packets,
+       .stop_dp_info_packets =
+               enc1_stream_encoder_stop_dp_info_packets,
+       .dp_blank =
+               enc1_stream_encoder_dp_blank,
+       .dp_unblank =
+               enc32_stream_encoder_dp_unblank,
+       .audio_mute_control = enc3_audio_mute_control,
+
+       .dp_audio_setup = enc3_se_dp_audio_setup,
+       .dp_audio_enable = enc3_se_dp_audio_enable,
+       .dp_audio_disable = enc1_se_dp_audio_disable,
+
+       .hdmi_audio_setup = enc3_se_hdmi_audio_setup,
+       .hdmi_audio_disable = enc1_se_hdmi_audio_disable,
+       .setup_stereo_sync  = enc1_setup_stereo_sync,
+       .set_avmute = enc1_stream_encoder_set_avmute,
+       .dig_connect_to_otg = enc1_dig_connect_to_otg,
+       .dig_source_otg = enc1_dig_source_otg,
+
+       .dp_get_pixel_format  = enc1_stream_encoder_dp_get_pixel_format,
+
+       .enc_read_state = enc32_read_state,
+       .dp_set_dsc_config = enc32_dp_set_dsc_config,
+       .dp_set_dsc_pps_info_packet = enc3_dp_set_dsc_pps_info_packet,
+       .set_dynamic_metadata = enc2_set_dynamic_metadata,
+       .hdmi_reset_stream_attribute = enc1_reset_hdmi_stream_attribute,
+
+       .set_input_mode = enc32_set_dig_input_mode,
+       .enable_fifo = enc32_enable_fifo,
+};
+
+void dcn32_dio_stream_encoder_construct(
+       struct dcn10_stream_encoder *enc1,
+       struct dc_context *ctx,
+       struct dc_bios *bp,
+       enum engine_id eng_id,
+       struct vpg *vpg,
+       struct afmt *afmt,
+       const struct dcn10_stream_enc_registers *regs,
+       const struct dcn10_stream_encoder_shift *se_shift,
+       const struct dcn10_stream_encoder_mask *se_mask)
+{
+       enc1->base.funcs = &dcn32_str_enc_funcs;
+       enc1->base.ctx = ctx;
+       enc1->base.id = eng_id;
+       enc1->base.bp = bp;
+       enc1->base.vpg = vpg;
+       enc1->base.afmt = afmt;
+       enc1->regs = regs;
+       enc1->se_shift = se_shift;
+       enc1->se_mask = se_mask;
+       enc1->base.stream_enc_inst = vpg->inst;
+}
+
diff --git a/drivers/gpu/drm/amd/display/dc/dio/dcn32/dcn32_dio_stream_encoder.h b/drivers/gpu/drm/amd/display/dc/dio/dcn32/dcn32_dio_stream_encoder.h
new file mode 100644 (file)
index 0000000..ca53d39
--- /dev/null
@@ -0,0 +1,206 @@
+/*
+ * Copyright 2021 - Advanced Micro Devices, Inc.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ *  and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+ * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
+ * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+ * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+ * OTHER DEALINGS IN THE SOFTWARE.
+ *
+ * Authors: AMD
+ *
+ */
+
+#ifndef __DC_DIO_STREAM_ENCODER_DCN32_H__
+#define __DC_DIO_STREAM_ENCODER_DCN32_H__
+
+#include "dcn30/dcn30_vpg.h"
+#include "dcn30/dcn30_afmt.h"
+#include "stream_encoder.h"
+#include "dcn20/dcn20_stream_encoder.h"
+
+#define SE_COMMON_MASK_SH_LIST_DCN32(mask_sh)\
+       SE_SF(DP0_DP_PIXEL_FORMAT, DP_PIXEL_ENCODING, mask_sh),\
+       SE_SF(DP0_DP_PIXEL_FORMAT, DP_COMPONENT_DEPTH, mask_sh),\
+       SE_SF(DP0_DP_PIXEL_FORMAT, DP_PIXEL_PER_CYCLE_PROCESSING_MODE, mask_sh),\
+       SE_SF(DIG0_HDMI_CONTROL, HDMI_PACKET_GEN_VERSION, mask_sh),\
+       SE_SF(DIG0_HDMI_CONTROL, HDMI_KEEPOUT_MODE, mask_sh),\
+       SE_SF(DIG0_HDMI_CONTROL, HDMI_DEEP_COLOR_ENABLE, mask_sh),\
+       SE_SF(DIG0_HDMI_CONTROL, HDMI_DEEP_COLOR_DEPTH, mask_sh),\
+       SE_SF(DIG0_HDMI_CONTROL, HDMI_DATA_SCRAMBLE_EN, mask_sh),\
+       SE_SF(DIG0_HDMI_CONTROL, HDMI_NO_EXTRA_NULL_PACKET_FILLED, mask_sh),\
+       SE_SF(DIG0_HDMI_VBI_PACKET_CONTROL, HDMI_GC_CONT, mask_sh),\
+       SE_SF(DIG0_HDMI_VBI_PACKET_CONTROL, HDMI_GC_SEND, mask_sh),\
+       SE_SF(DIG0_HDMI_VBI_PACKET_CONTROL, HDMI_NULL_SEND, mask_sh),\
+       SE_SF(DIG0_HDMI_VBI_PACKET_CONTROL, HDMI_ACP_SEND, mask_sh),\
+       SE_SF(DIG0_HDMI_INFOFRAME_CONTROL0, HDMI_AUDIO_INFO_SEND, mask_sh),\
+       SE_SF(DIG0_HDMI_INFOFRAME_CONTROL1, HDMI_AUDIO_INFO_LINE, mask_sh),\
+       SE_SF(DIG0_HDMI_GC, HDMI_GC_AVMUTE, mask_sh),\
+       SE_SF(DP0_DP_MSE_RATE_CNTL, DP_MSE_RATE_X, mask_sh),\
+       SE_SF(DP0_DP_MSE_RATE_CNTL, DP_MSE_RATE_Y, mask_sh),\
+       SE_SF(DP0_DP_MSE_RATE_UPDATE, DP_MSE_RATE_UPDATE_PENDING, mask_sh),\
+       SE_SF(DP0_DP_SEC_CNTL, DP_SEC_GSP0_ENABLE, mask_sh),\
+       SE_SF(DP0_DP_SEC_CNTL, DP_SEC_STREAM_ENABLE, mask_sh),\
+       SE_SF(DP0_DP_SEC_CNTL, DP_SEC_GSP1_ENABLE, mask_sh),\
+       SE_SF(DP0_DP_SEC_CNTL, DP_SEC_GSP2_ENABLE, mask_sh),\
+       SE_SF(DP0_DP_SEC_CNTL, DP_SEC_GSP3_ENABLE, mask_sh),\
+       SE_SF(DP0_DP_SEC_CNTL, DP_SEC_MPG_ENABLE, mask_sh),\
+       SE_SF(DP0_DP_SEC_CNTL1, DP_SEC_GSP5_LINE_REFERENCE, mask_sh),\
+       SE_SF(DP0_DP_SEC_CNTL2, DP_SEC_GSP4_SEND, mask_sh),\
+       SE_SF(DP0_DP_SEC_CNTL2, DP_SEC_GSP4_SEND_PENDING, mask_sh),\
+       SE_SF(DP0_DP_SEC_CNTL4, DP_SEC_GSP4_LINE_NUM, mask_sh),\
+       SE_SF(DP0_DP_SEC_CNTL5, DP_SEC_GSP5_LINE_NUM, mask_sh),\
+       SE_SF(DP0_DP_SEC_CNTL2, DP_SEC_GSP4_SEND_ANY_LINE, mask_sh),\
+       SE_SF(DP0_DP_VID_STREAM_CNTL, DP_VID_STREAM_DIS_DEFER, mask_sh),\
+       SE_SF(DP0_DP_VID_STREAM_CNTL, DP_VID_STREAM_ENABLE, mask_sh),\
+       SE_SF(DP0_DP_VID_STREAM_CNTL, DP_VID_STREAM_STATUS, mask_sh),\
+       SE_SF(DP0_DP_STEER_FIFO, DP_STEER_FIFO_RESET, mask_sh),\
+       SE_SF(DP0_DP_VID_TIMING, DP_VID_M_N_GEN_EN, mask_sh),\
+       SE_SF(DP0_DP_VID_N, DP_VID_N, mask_sh),\
+       SE_SF(DP0_DP_VID_M, DP_VID_M, mask_sh),\
+       SE_SF(DIG0_HDMI_AUDIO_PACKET_CONTROL, HDMI_AUDIO_DELAY_EN, mask_sh),\
+       SE_SF(DIG0_HDMI_ACR_PACKET_CONTROL, HDMI_ACR_AUTO_SEND, mask_sh),\
+       SE_SF(DIG0_HDMI_ACR_PACKET_CONTROL, HDMI_ACR_SOURCE, mask_sh),\
+       SE_SF(DIG0_HDMI_ACR_PACKET_CONTROL, HDMI_ACR_AUDIO_PRIORITY, mask_sh),\
+       SE_SF(DIG0_HDMI_ACR_32_0, HDMI_ACR_CTS_32, mask_sh),\
+       SE_SF(DIG0_HDMI_ACR_32_1, HDMI_ACR_N_32, mask_sh),\
+       SE_SF(DIG0_HDMI_ACR_44_0, HDMI_ACR_CTS_44, mask_sh),\
+       SE_SF(DIG0_HDMI_ACR_44_1, HDMI_ACR_N_44, mask_sh),\
+       SE_SF(DIG0_HDMI_ACR_48_0, HDMI_ACR_CTS_48, mask_sh),\
+       SE_SF(DIG0_HDMI_ACR_48_1, HDMI_ACR_N_48, mask_sh),\
+       SE_SF(DP0_DP_SEC_AUD_N, DP_SEC_AUD_N, mask_sh),\
+       SE_SF(DP0_DP_SEC_TIMESTAMP, DP_SEC_TIMESTAMP_MODE, mask_sh),\
+       SE_SF(DP0_DP_SEC_CNTL, DP_SEC_ASP_ENABLE, mask_sh),\
+       SE_SF(DP0_DP_SEC_CNTL, DP_SEC_ATP_ENABLE, mask_sh),\
+       SE_SF(DP0_DP_SEC_CNTL, DP_SEC_AIP_ENABLE, mask_sh),\
+       SE_SF(DP0_DP_SEC_CNTL, DP_SEC_ACM_ENABLE, mask_sh),\
+       SE_SF(DIG0_AFMT_CNTL, AFMT_AUDIO_CLOCK_EN, mask_sh),\
+       SE_SF(DIG0_HDMI_CONTROL, HDMI_CLOCK_CHANNEL_RATE, mask_sh),\
+       SE_SF(DIG0_DIG_FE_CNTL, TMDS_PIXEL_ENCODING, mask_sh),\
+       SE_SF(DIG0_DIG_FE_CNTL, TMDS_COLOR_FORMAT, mask_sh),\
+       SE_SF(DIG0_DIG_FE_CNTL, DIG_STEREOSYNC_SELECT, mask_sh),\
+       SE_SF(DIG0_DIG_FE_CNTL, DIG_STEREOSYNC_GATE_EN, mask_sh),\
+       SE_SF(DP0_DP_SEC_CNTL, DP_SEC_GSP4_ENABLE, mask_sh),\
+       SE_SF(DP0_DP_SEC_CNTL, DP_SEC_GSP5_ENABLE, mask_sh),\
+       SE_SF(DP0_DP_SEC_CNTL, DP_SEC_GSP6_ENABLE, mask_sh),\
+       SE_SF(DP0_DP_SEC_CNTL, DP_SEC_GSP7_ENABLE, mask_sh),\
+       SE_SF(DP0_DP_SEC_CNTL2, DP_SEC_GSP7_SEND, mask_sh),\
+       SE_SF(DP0_DP_SEC_CNTL6, DP_SEC_GSP7_LINE_NUM, mask_sh),\
+       SE_SF(DP0_DP_SEC_CNTL2, DP_SEC_GSP11_PPS, mask_sh),\
+       SE_SF(DP0_DP_GSP11_CNTL, DP_SEC_GSP11_ENABLE, mask_sh),\
+       SE_SF(DP0_DP_GSP11_CNTL, DP_SEC_GSP11_LINE_NUM, mask_sh),\
+       SE_SF(DP0_DP_DB_CNTL, DP_DB_DISABLE, mask_sh),\
+       SE_SF(DP0_DP_MSA_COLORIMETRY, DP_MSA_MISC0, mask_sh),\
+       SE_SF(DP0_DP_MSA_TIMING_PARAM1, DP_MSA_HTOTAL, mask_sh),\
+       SE_SF(DP0_DP_MSA_TIMING_PARAM1, DP_MSA_VTOTAL, mask_sh),\
+       SE_SF(DP0_DP_MSA_TIMING_PARAM2, DP_MSA_HSTART, mask_sh),\
+       SE_SF(DP0_DP_MSA_TIMING_PARAM2, DP_MSA_VSTART, mask_sh),\
+       SE_SF(DP0_DP_MSA_TIMING_PARAM3, DP_MSA_HSYNCWIDTH, mask_sh),\
+       SE_SF(DP0_DP_MSA_TIMING_PARAM3, DP_MSA_HSYNCPOLARITY, mask_sh),\
+       SE_SF(DP0_DP_MSA_TIMING_PARAM3, DP_MSA_VSYNCWIDTH, mask_sh),\
+       SE_SF(DP0_DP_MSA_TIMING_PARAM3, DP_MSA_VSYNCPOLARITY, mask_sh),\
+       SE_SF(DP0_DP_MSA_TIMING_PARAM4, DP_MSA_HWIDTH, mask_sh),\
+       SE_SF(DP0_DP_MSA_TIMING_PARAM4, DP_MSA_VHEIGHT, mask_sh),\
+       SE_SF(DIG0_HDMI_DB_CONTROL, HDMI_DB_DISABLE, mask_sh),\
+       SE_SF(DP0_DP_VID_TIMING, DP_VID_N_MUL, mask_sh),\
+       SE_SF(DIG0_DIG_FE_CNTL, DIG_SOURCE_SELECT, mask_sh), \
+       SE_SF(DIG0_HDMI_GENERIC_PACKET_CONTROL0, HDMI_GENERIC0_CONT, mask_sh),\
+       SE_SF(DIG0_HDMI_GENERIC_PACKET_CONTROL0, HDMI_GENERIC0_SEND, mask_sh),\
+       SE_SF(DIG0_HDMI_GENERIC_PACKET_CONTROL0, HDMI_GENERIC1_CONT, mask_sh),\
+       SE_SF(DIG0_HDMI_GENERIC_PACKET_CONTROL0, HDMI_GENERIC1_SEND, mask_sh),\
+       SE_SF(DIG0_HDMI_GENERIC_PACKET_CONTROL0, HDMI_GENERIC2_CONT, mask_sh),\
+       SE_SF(DIG0_HDMI_GENERIC_PACKET_CONTROL0, HDMI_GENERIC2_SEND, mask_sh),\
+       SE_SF(DIG0_HDMI_GENERIC_PACKET_CONTROL0, HDMI_GENERIC3_CONT, mask_sh),\
+       SE_SF(DIG0_HDMI_GENERIC_PACKET_CONTROL0, HDMI_GENERIC3_SEND, mask_sh),\
+       SE_SF(DIG0_HDMI_GENERIC_PACKET_CONTROL0, HDMI_GENERIC4_CONT, mask_sh),\
+       SE_SF(DIG0_HDMI_GENERIC_PACKET_CONTROL0, HDMI_GENERIC4_SEND, mask_sh),\
+       SE_SF(DIG0_HDMI_GENERIC_PACKET_CONTROL0, HDMI_GENERIC5_CONT, mask_sh),\
+       SE_SF(DIG0_HDMI_GENERIC_PACKET_CONTROL0, HDMI_GENERIC5_SEND, mask_sh),\
+       SE_SF(DIG0_HDMI_GENERIC_PACKET_CONTROL0, HDMI_GENERIC6_CONT, mask_sh),\
+       SE_SF(DIG0_HDMI_GENERIC_PACKET_CONTROL0, HDMI_GENERIC6_SEND, mask_sh),\
+       SE_SF(DIG0_HDMI_GENERIC_PACKET_CONTROL0, HDMI_GENERIC7_CONT, mask_sh),\
+       SE_SF(DIG0_HDMI_GENERIC_PACKET_CONTROL0, HDMI_GENERIC7_SEND, mask_sh),\
+       SE_SF(DIG0_HDMI_GENERIC_PACKET_CONTROL6, HDMI_GENERIC8_CONT, mask_sh),\
+       SE_SF(DIG0_HDMI_GENERIC_PACKET_CONTROL6, HDMI_GENERIC8_SEND, mask_sh),\
+       SE_SF(DIG0_HDMI_GENERIC_PACKET_CONTROL6, HDMI_GENERIC9_CONT, mask_sh),\
+       SE_SF(DIG0_HDMI_GENERIC_PACKET_CONTROL6, HDMI_GENERIC9_SEND, mask_sh),\
+       SE_SF(DIG0_HDMI_GENERIC_PACKET_CONTROL6, HDMI_GENERIC10_CONT, mask_sh),\
+       SE_SF(DIG0_HDMI_GENERIC_PACKET_CONTROL6, HDMI_GENERIC10_SEND, mask_sh),\
+       SE_SF(DIG0_HDMI_GENERIC_PACKET_CONTROL6, HDMI_GENERIC11_CONT, mask_sh),\
+       SE_SF(DIG0_HDMI_GENERIC_PACKET_CONTROL6, HDMI_GENERIC11_SEND, mask_sh),\
+       SE_SF(DIG0_HDMI_GENERIC_PACKET_CONTROL6, HDMI_GENERIC12_CONT, mask_sh),\
+       SE_SF(DIG0_HDMI_GENERIC_PACKET_CONTROL6, HDMI_GENERIC12_SEND, mask_sh),\
+       SE_SF(DIG0_HDMI_GENERIC_PACKET_CONTROL6, HDMI_GENERIC13_CONT, mask_sh),\
+       SE_SF(DIG0_HDMI_GENERIC_PACKET_CONTROL6, HDMI_GENERIC13_SEND, mask_sh),\
+       SE_SF(DIG0_HDMI_GENERIC_PACKET_CONTROL6, HDMI_GENERIC14_CONT, mask_sh),\
+       SE_SF(DIG0_HDMI_GENERIC_PACKET_CONTROL6, HDMI_GENERIC14_SEND, mask_sh),\
+       SE_SF(DIG0_HDMI_GENERIC_PACKET_CONTROL1, HDMI_GENERIC0_LINE, mask_sh),\
+       SE_SF(DIG0_HDMI_GENERIC_PACKET_CONTROL1, HDMI_GENERIC1_LINE, mask_sh),\
+       SE_SF(DIG0_HDMI_GENERIC_PACKET_CONTROL2, HDMI_GENERIC2_LINE, mask_sh),\
+       SE_SF(DIG0_HDMI_GENERIC_PACKET_CONTROL2, HDMI_GENERIC3_LINE, mask_sh),\
+       SE_SF(DIG0_HDMI_GENERIC_PACKET_CONTROL3, HDMI_GENERIC4_LINE, mask_sh),\
+       SE_SF(DIG0_HDMI_GENERIC_PACKET_CONTROL3, HDMI_GENERIC5_LINE, mask_sh),\
+       SE_SF(DIG0_HDMI_GENERIC_PACKET_CONTROL4, HDMI_GENERIC6_LINE, mask_sh),\
+       SE_SF(DIG0_HDMI_GENERIC_PACKET_CONTROL4, HDMI_GENERIC7_LINE, mask_sh),\
+       SE_SF(DIG0_HDMI_GENERIC_PACKET_CONTROL7, HDMI_GENERIC8_LINE, mask_sh),\
+       SE_SF(DIG0_HDMI_GENERIC_PACKET_CONTROL7, HDMI_GENERIC9_LINE, mask_sh),\
+       SE_SF(DIG0_HDMI_GENERIC_PACKET_CONTROL8, HDMI_GENERIC10_LINE, mask_sh),\
+       SE_SF(DIG0_HDMI_GENERIC_PACKET_CONTROL8, HDMI_GENERIC11_LINE, mask_sh),\
+       SE_SF(DIG0_HDMI_GENERIC_PACKET_CONTROL9, HDMI_GENERIC12_LINE, mask_sh),\
+       SE_SF(DIG0_HDMI_GENERIC_PACKET_CONTROL9, HDMI_GENERIC13_LINE, mask_sh),\
+       SE_SF(DIG0_HDMI_GENERIC_PACKET_CONTROL10, HDMI_GENERIC14_LINE, mask_sh),\
+       SE_SF(DP0_DP_DSC_CNTL, DP_DSC_MODE, mask_sh),\
+       SE_SF(DP0_DP_MSA_VBID_MISC, DP_VBID6_LINE_REFERENCE, mask_sh),\
+       SE_SF(DP0_DP_MSA_VBID_MISC, DP_VBID6_LINE_NUM, mask_sh),\
+       SE_SF(DME0_DME_CONTROL, METADATA_ENGINE_EN, mask_sh),\
+       SE_SF(DME0_DME_CONTROL, METADATA_HUBP_REQUESTOR_ID, mask_sh),\
+       SE_SF(DME0_DME_CONTROL, METADATA_STREAM_TYPE, mask_sh),\
+       SE_SF(DP0_DP_SEC_METADATA_TRANSMISSION, DP_SEC_METADATA_PACKET_ENABLE, mask_sh),\
+       SE_SF(DP0_DP_SEC_METADATA_TRANSMISSION, DP_SEC_METADATA_PACKET_LINE_REFERENCE, mask_sh),\
+       SE_SF(DP0_DP_SEC_METADATA_TRANSMISSION, DP_SEC_METADATA_PACKET_LINE, mask_sh),\
+       SE_SF(DIG0_HDMI_METADATA_PACKET_CONTROL, HDMI_METADATA_PACKET_ENABLE, mask_sh),\
+       SE_SF(DIG0_HDMI_METADATA_PACKET_CONTROL, HDMI_METADATA_PACKET_LINE_REFERENCE, mask_sh),\
+       SE_SF(DIG0_HDMI_METADATA_PACKET_CONTROL, HDMI_METADATA_PACKET_LINE, mask_sh),\
+       SE_SF(DIG0_DIG_FE_CNTL, DOLBY_VISION_EN, mask_sh),\
+       SE_SF(DIG0_DIG_FE_CNTL, DIG_SYMCLK_FE_ON, mask_sh),\
+       SE_SF(DP0_DP_SEC_FRAMING4, DP_SST_SDP_SPLITTING, mask_sh),\
+       SE_SF(DIG0_DIG_CLOCK_PATTERN, DIG_CLOCK_PATTERN, mask_sh),\
+       SE_SF(DIG0_DIG_FIFO_CTRL0, DIG_FIFO_OUTPUT_PIXEL_MODE, mask_sh),\
+       SE_SF(DIG0_DIG_FIFO_CTRL0, DIG_FIFO_READ_START_LEVEL, mask_sh),\
+       SE_SF(DIG0_DIG_FIFO_CTRL0, DIG_FIFO_ENABLE, mask_sh),\
+       SE_SF(DIG0_DIG_FIFO_CTRL0, DIG_FIFO_RESET, mask_sh),\
+       SE_SF(DIG0_DIG_FIFO_CTRL0, DIG_FIFO_RESET_DONE, mask_sh)
+
+
+void dcn32_dio_stream_encoder_construct(
+       struct dcn10_stream_encoder *enc1,
+       struct dc_context *ctx,
+       struct dc_bios *bp,
+       enum engine_id eng_id,
+       struct vpg *vpg,
+       struct afmt *afmt,
+       const struct dcn10_stream_enc_registers *regs,
+       const struct dcn10_stream_encoder_shift *se_shift,
+       const struct dcn10_stream_encoder_mask *se_mask);
+
+
+void enc32_enable_fifo(struct stream_encoder *enc);
+
+void enc32_stream_encoder_dp_unblank(
+               struct dc_link *link,
+               struct stream_encoder *enc,
+               const struct encoder_unblank_param *param);
+
+#endif /* __DC_DIO_STREAM_ENCODER_DCN32_H__ */
diff --git a/drivers/gpu/drm/amd/display/dc/dio/dcn321/dcn321_dio_link_encoder.c b/drivers/gpu/drm/amd/display/dc/dio/dcn321/dcn321_dio_link_encoder.c
new file mode 100644 (file)
index 0000000..05783da
--- /dev/null
@@ -0,0 +1,191 @@
+/*
+ * Copyright 2022 Advanced Micro Devices, Inc.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+ * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
+ * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+ * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+ * OTHER DEALINGS IN THE SOFTWARE.
+ *
+ * Authors: AMD
+ *
+ */
+
+
+#include "reg_helper.h"
+
+#include "core_types.h"
+#include "link_encoder.h"
+#include "dcn321_dio_link_encoder.h"
+#include "dcn31/dcn31_dio_link_encoder.h"
+#include "stream_encoder.h"
+#include "dc_bios_types.h"
+
+#include "gpio_service_interface.h"
+
+#ifndef MIN
+#define MIN(X, Y) ((X) < (Y) ? (X) : (Y))
+#endif
+
+#define CTX \
+       enc10->base.ctx
+#define DC_LOGGER \
+       enc10->base.ctx->logger
+
+#define REG(reg)\
+       (enc10->link_regs->reg)
+
+#undef FN
+#define FN(reg_name, field_name) \
+       enc10->link_shift->field_name, enc10->link_mask->field_name
+
+#define AUX_REG(reg)\
+       (enc10->aux_regs->reg)
+
+#define AUX_REG_READ(reg_name) \
+               dm_read_reg(CTX, AUX_REG(reg_name))
+
+#define AUX_REG_WRITE(reg_name, val) \
+                       dm_write_reg(CTX, AUX_REG(reg_name), val)
+
+static const struct link_encoder_funcs dcn321_link_enc_funcs = {
+       .read_state = link_enc2_read_state,
+       .validate_output_with_stream =
+                       dcn30_link_encoder_validate_output_with_stream,
+       .hw_init = enc32_hw_init,
+       .setup = dcn10_link_encoder_setup,
+       .enable_tmds_output = dcn10_link_encoder_enable_tmds_output,
+       .enable_dp_output = dcn32_link_encoder_enable_dp_output,
+       .enable_dp_mst_output = dcn10_link_encoder_enable_dp_mst_output,
+       .disable_output = dcn10_link_encoder_disable_output,
+       .dp_set_lane_settings = dcn10_link_encoder_dp_set_lane_settings,
+       .dp_set_phy_pattern = dcn10_link_encoder_dp_set_phy_pattern,
+       .update_mst_stream_allocation_table =
+               dcn10_link_encoder_update_mst_stream_allocation_table,
+       .psr_program_dp_dphy_fast_training =
+                       dcn10_psr_program_dp_dphy_fast_training,
+       .psr_program_secondary_packet = dcn10_psr_program_secondary_packet,
+       .connect_dig_be_to_fe = dcn10_link_encoder_connect_dig_be_to_fe,
+       .enable_hpd = dcn10_link_encoder_enable_hpd,
+       .disable_hpd = dcn10_link_encoder_disable_hpd,
+       .is_dig_enabled = dcn10_is_dig_enabled,
+       .destroy = dcn10_link_encoder_destroy,
+       .fec_set_enable = enc2_fec_set_enable,
+       .fec_set_ready = enc2_fec_set_ready,
+       .fec_is_active = enc2_fec_is_active,
+       .get_dig_frontend = dcn10_get_dig_frontend,
+       .get_dig_mode = dcn10_get_dig_mode,
+       .is_in_alt_mode = dcn20_link_encoder_is_in_alt_mode,
+       .get_max_link_cap = dcn20_link_encoder_get_max_link_cap,
+       .set_dio_phy_mux = dcn31_link_encoder_set_dio_phy_mux,
+};
+
+void dcn321_link_encoder_construct(
+       struct dcn20_link_encoder *enc20,
+       const struct encoder_init_data *init_data,
+       const struct encoder_feature_support *enc_features,
+       const struct dcn10_link_enc_registers *link_regs,
+       const struct dcn10_link_enc_aux_registers *aux_regs,
+       const struct dcn10_link_enc_hpd_registers *hpd_regs,
+       const struct dcn10_link_enc_shift *link_shift,
+       const struct dcn10_link_enc_mask *link_mask)
+{
+       struct bp_connector_speed_cap_info bp_cap_info = {0};
+       const struct dc_vbios_funcs *bp_funcs = init_data->ctx->dc_bios->funcs;
+       enum bp_result result = BP_RESULT_OK;
+       struct dcn10_link_encoder *enc10 = &enc20->enc10;
+
+       enc10->base.funcs = &dcn321_link_enc_funcs;
+       enc10->base.ctx = init_data->ctx;
+       enc10->base.id = init_data->encoder;
+
+       enc10->base.hpd_source = init_data->hpd_source;
+       enc10->base.connector = init_data->connector;
+
+       if (enc10->base.connector.id == CONNECTOR_ID_USBC)
+               enc10->base.features.flags.bits.DP_IS_USB_C = 1;
+
+       enc10->base.preferred_engine = ENGINE_ID_UNKNOWN;
+
+       enc10->base.features = *enc_features;
+
+       enc10->base.transmitter = init_data->transmitter;
+
+       /* set the flag to indicate whether driver poll the I2C data pin
+        * while doing the DP sink detect
+        */
+
+       enc10->base.output_signals =
+               SIGNAL_TYPE_DVI_SINGLE_LINK |
+               SIGNAL_TYPE_DVI_DUAL_LINK |
+               SIGNAL_TYPE_LVDS |
+               SIGNAL_TYPE_DISPLAY_PORT |
+               SIGNAL_TYPE_DISPLAY_PORT_MST |
+               SIGNAL_TYPE_EDP |
+               SIGNAL_TYPE_HDMI_TYPE_A;
+
+       enc10->link_regs = link_regs;
+       enc10->aux_regs = aux_regs;
+       enc10->hpd_regs = hpd_regs;
+       enc10->link_shift = link_shift;
+       enc10->link_mask = link_mask;
+
+       switch (enc10->base.transmitter) {
+       case TRANSMITTER_UNIPHY_A:
+               enc10->base.preferred_engine = ENGINE_ID_DIGA;
+       break;
+       case TRANSMITTER_UNIPHY_B:
+               enc10->base.preferred_engine = ENGINE_ID_DIGB;
+       break;
+       case TRANSMITTER_UNIPHY_C:
+               enc10->base.preferred_engine = ENGINE_ID_DIGC;
+       break;
+       case TRANSMITTER_UNIPHY_D:
+               enc10->base.preferred_engine = ENGINE_ID_DIGD;
+       break;
+       case TRANSMITTER_UNIPHY_E:
+               enc10->base.preferred_engine = ENGINE_ID_DIGE;
+       break;
+       default:
+               ASSERT_CRITICAL(false);
+               enc10->base.preferred_engine = ENGINE_ID_UNKNOWN;
+       }
+
+       /* default to one to mirror Windows behavior */
+       enc10->base.features.flags.bits.HDMI_6GB_EN = 1;
+
+       if (bp_funcs->get_connector_speed_cap_info)
+               result = bp_funcs->get_connector_speed_cap_info(enc10->base.ctx->dc_bios,
+                                               enc10->base.connector, &bp_cap_info);
+
+       /* Override features with DCE-specific values */
+       if (result == BP_RESULT_OK) {
+               enc10->base.features.flags.bits.IS_HBR2_CAPABLE =
+                               bp_cap_info.DP_HBR2_EN;
+               enc10->base.features.flags.bits.IS_HBR3_CAPABLE =
+                               bp_cap_info.DP_HBR3_EN;
+               enc10->base.features.flags.bits.HDMI_6GB_EN = bp_cap_info.HDMI_6GB_EN;
+               enc10->base.features.flags.bits.IS_DP2_CAPABLE = 1;
+               enc10->base.features.flags.bits.IS_UHBR10_CAPABLE = bp_cap_info.DP_UHBR10_EN;
+               enc10->base.features.flags.bits.IS_UHBR13_5_CAPABLE = bp_cap_info.DP_UHBR13_5_EN;
+               enc10->base.features.flags.bits.IS_UHBR20_CAPABLE = bp_cap_info.DP_UHBR20_EN;
+       } else {
+               DC_LOG_WARNING("%s: Failed to get encoder_cap_info from VBIOS with error code %d!\n",
+                               __func__,
+                               result);
+       }
+       if (enc10->base.ctx->dc->debug.hdmi20_disable)
+               enc10->base.features.flags.bits.HDMI_6GB_EN = 0;
+}
diff --git a/drivers/gpu/drm/amd/display/dc/dio/dcn321/dcn321_dio_link_encoder.h b/drivers/gpu/drm/amd/display/dc/dio/dcn321/dcn321_dio_link_encoder.h
new file mode 100644 (file)
index 0000000..2205f39
--- /dev/null
@@ -0,0 +1,42 @@
+/*
+ * Copyright 2022 Advanced Micro Devices, Inc.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ *  and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+ * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
+ * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+ * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+ * OTHER DEALINGS IN THE SOFTWARE.
+ *
+ * Authors: AMD
+ *
+ */
+
+#ifndef __DC_LINK_ENCODER__DCN321_H__
+#define __DC_LINK_ENCODER__DCN321_H__
+
+#include "dcn32/dcn32_dio_link_encoder.h"
+
+void dcn321_link_encoder_construct(
+       struct dcn20_link_encoder *enc20,
+       const struct encoder_init_data *init_data,
+       const struct encoder_feature_support *enc_features,
+       const struct dcn10_link_enc_registers *link_regs,
+       const struct dcn10_link_enc_aux_registers *aux_regs,
+       const struct dcn10_link_enc_hpd_registers *hpd_regs,
+       const struct dcn10_link_enc_shift *link_shift,
+       const struct dcn10_link_enc_mask *link_mask);
+
+
+#endif /* __DC_LINK_ENCODER__DCN321_H__ */
diff --git a/drivers/gpu/drm/amd/display/dc/dio/dcn35/dcn35_dio_link_encoder.c b/drivers/gpu/drm/amd/display/dc/dio/dcn35/dcn35_dio_link_encoder.c
new file mode 100644 (file)
index 0000000..d4a3e81
--- /dev/null
@@ -0,0 +1,267 @@
+/* SPDX-License-Identifier: MIT */
+/*
+ * Copyright 2023 Advanced Micro Devices, Inc.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+ * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
+ * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+ * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+ * OTHER DEALINGS IN THE SOFTWARE.
+ *
+ */
+
+#include "reg_helper.h"
+
+#include "core_types.h"
+#include "link_encoder.h"
+#include "dcn31/dcn31_dio_link_encoder.h"
+#include "dcn35_dio_link_encoder.h"
+#define CTX \
+       enc10->base.ctx
+#define DC_LOGGER \
+       enc10->base.ctx->logger
+
+#define REG(reg)\
+       (enc10->link_regs->reg)
+
+#undef FN
+#define FN(reg_name, field_name) \
+       enc10->link_shift->field_name, enc10->link_mask->field_name
+/*
+ * @brief
+ * Trigger Source Select
+ * ASIC-dependent, actual values for register programming
+ */
+#define DCN35_DIG_FE_SOURCE_SELECT_INVALID 0x0
+#define DCN35_DIG_FE_SOURCE_SELECT_DIGA 0x1
+#define DCN35_DIG_FE_SOURCE_SELECT_DIGB 0x2
+#define DCN35_DIG_FE_SOURCE_SELECT_DIGC 0x4
+#define DCN35_DIG_FE_SOURCE_SELECT_DIGD 0x08
+#define DCN35_DIG_FE_SOURCE_SELECT_DIGE 0x10
+
+
+bool dcn35_is_dig_enabled(struct link_encoder *enc)
+{
+       uint32_t enabled;
+       struct dcn10_link_encoder *enc10 = TO_DCN10_LINK_ENC(enc);
+
+       REG_GET(DIG_BE_CLK_CNTL, DIG_BE_CLK_EN, &enabled);
+       return (enabled == 1);
+}
+
+enum signal_type dcn35_get_dig_mode(
+       struct link_encoder *enc)
+{
+       uint32_t value;
+       struct dcn10_link_encoder *enc10 = TO_DCN10_LINK_ENC(enc);
+
+       REG_GET(DIG_BE_CLK_CNTL, DIG_BE_MODE, &value);
+       switch (value) {
+       case 0:
+               return SIGNAL_TYPE_DISPLAY_PORT;
+       case 2:
+               return SIGNAL_TYPE_DVI_SINGLE_LINK;
+       case 3:
+               return SIGNAL_TYPE_HDMI_TYPE_A;
+       case 5:
+               return SIGNAL_TYPE_DISPLAY_PORT_MST;
+       default:
+               return SIGNAL_TYPE_NONE;
+       }
+}
+
+void dcn35_link_encoder_setup(
+       struct link_encoder *enc,
+       enum signal_type signal)
+{
+       struct dcn10_link_encoder *enc10 = TO_DCN10_LINK_ENC(enc);
+
+       switch (signal) {
+       case SIGNAL_TYPE_EDP:
+       case SIGNAL_TYPE_DISPLAY_PORT:
+               /* DP SST */
+               REG_UPDATE(DIG_BE_CLK_CNTL, DIG_BE_MODE, 0);
+               break;
+       case SIGNAL_TYPE_DVI_SINGLE_LINK:
+       case SIGNAL_TYPE_DVI_DUAL_LINK:
+               /* TMDS-DVI */
+               REG_UPDATE(DIG_BE_CLK_CNTL, DIG_BE_MODE, 2);
+               break;
+       case SIGNAL_TYPE_HDMI_TYPE_A:
+               /* TMDS-HDMI */
+               REG_UPDATE(DIG_BE_CLK_CNTL, DIG_BE_MODE, 3);
+               break;
+       case SIGNAL_TYPE_DISPLAY_PORT_MST:
+               /* DP MST */
+               REG_UPDATE(DIG_BE_CLK_CNTL, DIG_BE_MODE, 5);
+               break;
+       default:
+               ASSERT_CRITICAL(false);
+               /* invalid mode ! */
+               break;
+       }
+       REG_UPDATE(DIG_BE_CLK_CNTL, DIG_BE_CLK_EN, 1);
+
+}
+
+void dcn35_link_encoder_init(struct link_encoder *enc)
+{
+       enc31_hw_init(enc);
+       dcn35_link_encoder_set_fgcg(enc, enc->ctx->dc->debug.enable_fine_grain_clock_gating.bits.dio);
+}
+
+void dcn35_link_encoder_set_fgcg(struct link_encoder *enc, bool enable)
+{
+       struct dcn10_link_encoder *enc10 = TO_DCN10_LINK_ENC(enc);
+
+       REG_UPDATE(DIO_CLK_CNTL, DIO_FGCG_REP_DIS, !enable);
+}
+
+static const struct link_encoder_funcs dcn35_link_enc_funcs = {
+       .read_state = link_enc2_read_state,
+       .validate_output_with_stream =
+                       dcn30_link_encoder_validate_output_with_stream,
+       .hw_init = dcn35_link_encoder_init,
+       .setup = dcn35_link_encoder_setup,
+       .enable_tmds_output = dcn10_link_encoder_enable_tmds_output,
+       .enable_dp_output = dcn31_link_encoder_enable_dp_output,
+       .enable_dp_mst_output = dcn31_link_encoder_enable_dp_mst_output,
+       .disable_output = dcn31_link_encoder_disable_output,
+       .dp_set_lane_settings = dcn10_link_encoder_dp_set_lane_settings,
+       .dp_set_phy_pattern = dcn10_link_encoder_dp_set_phy_pattern,
+       .update_mst_stream_allocation_table =
+               dcn10_link_encoder_update_mst_stream_allocation_table,
+       .psr_program_dp_dphy_fast_training =
+                       dcn10_psr_program_dp_dphy_fast_training,
+       .psr_program_secondary_packet = dcn10_psr_program_secondary_packet,
+       .connect_dig_be_to_fe = dcn10_link_encoder_connect_dig_be_to_fe,
+       .enable_hpd = dcn10_link_encoder_enable_hpd,
+       .disable_hpd = dcn10_link_encoder_disable_hpd,
+       .is_dig_enabled = dcn35_is_dig_enabled,
+       .destroy = dcn10_link_encoder_destroy,
+       .fec_set_enable = enc2_fec_set_enable,
+       .fec_set_ready = enc2_fec_set_ready,
+       .fec_is_active = enc2_fec_is_active,
+       .get_dig_frontend = dcn10_get_dig_frontend,
+       .get_dig_mode = dcn35_get_dig_mode,
+       .is_in_alt_mode = dcn31_link_encoder_is_in_alt_mode,
+       .get_max_link_cap = dcn31_link_encoder_get_max_link_cap,
+       .set_dio_phy_mux = dcn31_link_encoder_set_dio_phy_mux,
+};
+
+void dcn35_link_encoder_construct(
+       struct dcn20_link_encoder *enc20,
+       const struct encoder_init_data *init_data,
+       const struct encoder_feature_support *enc_features,
+       const struct dcn10_link_enc_registers *link_regs,
+       const struct dcn10_link_enc_aux_registers *aux_regs,
+       const struct dcn10_link_enc_hpd_registers *hpd_regs,
+       const struct dcn10_link_enc_shift *link_shift,
+       const struct dcn10_link_enc_mask *link_mask)
+{
+       struct bp_connector_speed_cap_info bp_cap_info = {0};
+       const struct dc_vbios_funcs *bp_funcs = init_data->ctx->dc_bios->funcs;
+       enum bp_result result = BP_RESULT_OK;
+       struct dcn10_link_encoder *enc10 = &enc20->enc10;
+
+       enc10->base.funcs = &dcn35_link_enc_funcs;
+       enc10->base.ctx = init_data->ctx;
+       enc10->base.id = init_data->encoder;
+
+       enc10->base.hpd_source = init_data->hpd_source;
+       enc10->base.connector = init_data->connector;
+
+       enc10->base.preferred_engine = ENGINE_ID_UNKNOWN;
+
+       enc10->base.features = *enc_features;
+
+       if (enc10->base.connector.id == CONNECTOR_ID_USBC)
+               enc10->base.features.flags.bits.DP_IS_USB_C = 1;
+
+       enc10->base.transmitter = init_data->transmitter;
+
+       /* set the flag to indicate whether driver poll the I2C data pin
+        * while doing the DP sink detect
+        */
+
+/*     if (dal_adapter_service_is_feature_supported(as,
+ *             FEATURE_DP_SINK_DETECT_POLL_DATA_PIN))
+ *             enc10->base.features.flags.bits.
+ *                     DP_SINK_DETECT_POLL_DATA_PIN = true;
+ */
+
+       enc10->base.output_signals =
+               SIGNAL_TYPE_DVI_SINGLE_LINK |
+               SIGNAL_TYPE_DVI_DUAL_LINK |
+               SIGNAL_TYPE_LVDS |
+               SIGNAL_TYPE_DISPLAY_PORT |
+               SIGNAL_TYPE_DISPLAY_PORT_MST |
+               SIGNAL_TYPE_EDP |
+               SIGNAL_TYPE_HDMI_TYPE_A;
+
+       enc10->link_regs = link_regs;
+       enc10->aux_regs = aux_regs;
+       enc10->hpd_regs = hpd_regs;
+       enc10->link_shift = link_shift;
+       enc10->link_mask = link_mask;
+
+       switch (enc10->base.transmitter) {
+       case TRANSMITTER_UNIPHY_A:
+               enc10->base.preferred_engine = ENGINE_ID_DIGA;
+       break;
+       case TRANSMITTER_UNIPHY_B:
+               enc10->base.preferred_engine = ENGINE_ID_DIGB;
+       break;
+       case TRANSMITTER_UNIPHY_C:
+               enc10->base.preferred_engine = ENGINE_ID_DIGC;
+       break;
+       case TRANSMITTER_UNIPHY_D:
+               enc10->base.preferred_engine = ENGINE_ID_DIGD;
+       break;
+       case TRANSMITTER_UNIPHY_E:
+               enc10->base.preferred_engine = ENGINE_ID_DIGE;
+       break;
+       default:
+               ASSERT_CRITICAL(false);
+               enc10->base.preferred_engine = ENGINE_ID_UNKNOWN;
+       }
+
+       enc10->base.features.flags.bits.HDMI_6GB_EN = 1;
+
+       if (bp_funcs->get_connector_speed_cap_info)
+               result = bp_funcs->get_connector_speed_cap_info(enc10->base.ctx->dc_bios,
+                                               enc10->base.connector, &bp_cap_info);
+
+       /* Override features with DCE-specific values */
+       if (result == BP_RESULT_OK) {
+               enc10->base.features.flags.bits.IS_HBR2_CAPABLE =
+                               bp_cap_info.DP_HBR2_EN;
+               enc10->base.features.flags.bits.IS_HBR3_CAPABLE =
+                               bp_cap_info.DP_HBR3_EN;
+               enc10->base.features.flags.bits.HDMI_6GB_EN = bp_cap_info.HDMI_6GB_EN;
+               enc10->base.features.flags.bits.IS_DP2_CAPABLE = 1;
+               enc10->base.features.flags.bits.IS_UHBR10_CAPABLE = bp_cap_info.DP_UHBR10_EN;
+               enc10->base.features.flags.bits.IS_UHBR13_5_CAPABLE = bp_cap_info.DP_UHBR13_5_EN;
+               enc10->base.features.flags.bits.IS_UHBR20_CAPABLE = bp_cap_info.DP_UHBR20_EN;
+
+       } else {
+               DC_LOG_WARNING("%s: Failed to get encoder_cap_info from VBIOS with error code %d!\n",
+                               __func__,
+                               result);
+       }
+       if (enc10->base.ctx->dc->debug.hdmi20_disable)
+               enc10->base.features.flags.bits.HDMI_6GB_EN = 0;
+
+}
diff --git a/drivers/gpu/drm/amd/display/dc/dio/dcn35/dcn35_dio_link_encoder.h b/drivers/gpu/drm/amd/display/dc/dio/dcn35/dcn35_dio_link_encoder.h
new file mode 100644 (file)
index 0000000..d546a36
--- /dev/null
@@ -0,0 +1,147 @@
+/* SPDX-License-Identifier: MIT */
+/*
+ * Copyright 2023 Advanced Micro Devices, Inc.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+ * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
+ * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+ * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+ * OTHER DEALINGS IN THE SOFTWARE.
+ *
+ */
+
+#ifndef __DC_LINK_ENCODER__DCN35_H__
+#define __DC_LINK_ENCODER__DCN35_H__
+
+#include "dcn32/dcn32_dio_link_encoder.h"
+#include "dcn30/dcn30_dio_link_encoder.h"
+#include "dcn31/dcn31_dio_link_encoder.h"
+
+#define LINK_ENCODER_MASK_SH_LIST_DCN35(mask_sh) \
+       LE_SF(DIG0_DIG_BE_EN_CNTL, DIG_BE_ENABLE, mask_sh),\
+       LE_SF(DIG0_DIG_BE_CNTL, DIG_RB_SWITCH_EN, mask_sh),\
+       LE_SF(DIG0_DIG_BE_CNTL, DIG_HPD_SELECT, mask_sh),\
+       LE_SF(DIG0_DIG_BE_CNTL, DIG_FE_SOURCE_SELECT, mask_sh),\
+       LE_SF(DIG0_DIG_BE_CLK_CNTL, DIG_BE_MODE, mask_sh),\
+       LE_SF(DIG0_DIG_BE_CLK_CNTL, DIG_BE_CLK_EN, mask_sh),\
+       LE_SF(DIG0_DIG_BE_CLK_CNTL, DIG_BE_SOFT_RESET, mask_sh),\
+       LE_SF(DIG0_DIG_BE_CLK_CNTL, HDCP_SOFT_RESET, mask_sh),\
+       LE_SF(DIG0_DIG_BE_CLK_CNTL, DIG_BE_SYMCLK_G_CLOCK_ON, mask_sh),\
+       LE_SF(DIG0_DIG_BE_CLK_CNTL, DIG_BE_SYMCLK_G_HDCP_CLOCK_ON, mask_sh),\
+       LE_SF(DIG0_DIG_BE_CLK_CNTL, DIG_BE_SYMCLK_G_TMDS_CLOCK_ON, mask_sh),\
+       LE_SF(DIG0_DIG_CLOCK_PATTERN, DIG_CLOCK_PATTERN, mask_sh),\
+       LE_SF(DIG0_TMDS_CTL_BITS, TMDS_CTL0, mask_sh), \
+       LE_SF(DP0_DP_DPHY_CNTL, DPHY_BYPASS, mask_sh),\
+       LE_SF(DP0_DP_DPHY_CNTL, DPHY_ATEST_SEL_LANE0, mask_sh),\
+       LE_SF(DP0_DP_DPHY_CNTL, DPHY_ATEST_SEL_LANE1, mask_sh),\
+       LE_SF(DP0_DP_DPHY_CNTL, DPHY_ATEST_SEL_LANE2, mask_sh),\
+       LE_SF(DP0_DP_DPHY_CNTL, DPHY_ATEST_SEL_LANE3, mask_sh),\
+       LE_SF(DP0_DP_DPHY_PRBS_CNTL, DPHY_PRBS_EN, mask_sh),\
+       LE_SF(DP0_DP_DPHY_PRBS_CNTL, DPHY_PRBS_SEL, mask_sh),\
+       LE_SF(DP0_DP_DPHY_SYM0, DPHY_SYM1, mask_sh),\
+       LE_SF(DP0_DP_DPHY_SYM0, DPHY_SYM2, mask_sh),\
+       LE_SF(DP0_DP_DPHY_SYM0, DPHY_SYM3, mask_sh),\
+       LE_SF(DP0_DP_DPHY_SYM1, DPHY_SYM4, mask_sh),\
+       LE_SF(DP0_DP_DPHY_SYM1, DPHY_SYM5, mask_sh),\
+       LE_SF(DP0_DP_DPHY_SYM1, DPHY_SYM6, mask_sh),\
+       LE_SF(DP0_DP_DPHY_SYM2, DPHY_SYM7, mask_sh),\
+       LE_SF(DP0_DP_DPHY_SYM2, DPHY_SYM8, mask_sh),\
+       LE_SF(DP0_DP_DPHY_SCRAM_CNTL, DPHY_SCRAMBLER_BS_COUNT, mask_sh),\
+       LE_SF(DP0_DP_DPHY_SCRAM_CNTL, DPHY_SCRAMBLER_ADVANCE, mask_sh),\
+       LE_SF(DP0_DP_DPHY_FAST_TRAINING, DPHY_RX_FAST_TRAINING_CAPABLE, mask_sh),\
+       LE_SF(DP0_DP_DPHY_BS_SR_SWAP_CNTL, DPHY_LOAD_BS_COUNT, mask_sh),\
+       LE_SF(DP0_DP_DPHY_TRAINING_PATTERN_SEL, DPHY_TRAINING_PATTERN_SEL, mask_sh),\
+       LE_SF(DP0_DP_DPHY_HBR2_PATTERN_CONTROL, DP_DPHY_HBR2_PATTERN_CONTROL, mask_sh),\
+       LE_SF(DP0_DP_LINK_CNTL, DP_LINK_TRAINING_COMPLETE, mask_sh),\
+       LE_SF(DP0_DP_LINK_FRAMING_CNTL, DP_IDLE_BS_INTERVAL, mask_sh),\
+       LE_SF(DP0_DP_LINK_FRAMING_CNTL, DP_VBID_DISABLE, mask_sh),\
+       LE_SF(DP0_DP_LINK_FRAMING_CNTL, DP_VID_ENHANCED_FRAME_MODE, mask_sh),\
+       LE_SF(DP0_DP_VID_STREAM_CNTL, DP_VID_STREAM_ENABLE, mask_sh),\
+       LE_SF(DP0_DP_CONFIG, DP_UDI_LANES, mask_sh),\
+       LE_SF(DP0_DP_SEC_CNTL1, DP_SEC_GSP0_LINE_NUM, mask_sh),\
+       LE_SF(DP0_DP_SEC_CNTL1, DP_SEC_GSP0_PRIORITY, mask_sh),\
+       LE_SF(DP0_DP_MSE_SAT0, DP_MSE_SAT_SRC0, mask_sh),\
+       LE_SF(DP0_DP_MSE_SAT0, DP_MSE_SAT_SRC1, mask_sh),\
+       LE_SF(DP0_DP_MSE_SAT0, DP_MSE_SAT_SLOT_COUNT0, mask_sh),\
+       LE_SF(DP0_DP_MSE_SAT0, DP_MSE_SAT_SLOT_COUNT1, mask_sh),\
+       LE_SF(DP0_DP_MSE_SAT1, DP_MSE_SAT_SRC2, mask_sh),\
+       LE_SF(DP0_DP_MSE_SAT1, DP_MSE_SAT_SRC3, mask_sh),\
+       LE_SF(DP0_DP_MSE_SAT1, DP_MSE_SAT_SLOT_COUNT2, mask_sh),\
+       LE_SF(DP0_DP_MSE_SAT1, DP_MSE_SAT_SLOT_COUNT3, mask_sh),\
+       LE_SF(DP0_DP_MSE_SAT_UPDATE, DP_MSE_SAT_UPDATE, mask_sh),\
+       LE_SF(DP0_DP_MSE_SAT_UPDATE, DP_MSE_16_MTP_KEEPOUT, mask_sh),\
+       LE_SF(DP_AUX0_AUX_CONTROL, AUX_HPD_SEL, mask_sh),\
+       LE_SF(DP_AUX0_AUX_CONTROL, AUX_LS_READ_EN, mask_sh),\
+       LE_SF(DP_AUX0_AUX_DPHY_RX_CONTROL0, AUX_RX_RECEIVE_WINDOW, mask_sh),\
+       LE_SF(HPD0_DC_HPD_CONTROL, DC_HPD_EN, mask_sh),\
+       LE_SF(DP0_DP_DPHY_CNTL, DPHY_FEC_EN, mask_sh),\
+       LE_SF(DP0_DP_DPHY_CNTL, DPHY_FEC_READY_SHADOW, mask_sh),\
+       LE_SF(DP0_DP_DPHY_CNTL, DPHY_FEC_ACTIVE_STATUS, mask_sh),\
+       LE_SF(DIG0_TMDS_CTL_BITS, TMDS_CTL0, mask_sh), \
+       LE_SF(DP_AUX0_AUX_DPHY_RX_CONTROL0, AUX_RX_START_WINDOW, mask_sh),\
+       LE_SF(DP_AUX0_AUX_DPHY_RX_CONTROL0, AUX_RX_HALF_SYM_DETECT_LEN, mask_sh),\
+       LE_SF(DP_AUX0_AUX_DPHY_RX_CONTROL0, AUX_RX_TRANSITION_FILTER_EN, mask_sh),\
+       LE_SF(DP_AUX0_AUX_DPHY_RX_CONTROL0, AUX_RX_ALLOW_BELOW_THRESHOLD_PHASE_DETECT, mask_sh),\
+       LE_SF(DP_AUX0_AUX_DPHY_RX_CONTROL0, AUX_RX_ALLOW_BELOW_THRESHOLD_START, mask_sh),\
+       LE_SF(DP_AUX0_AUX_DPHY_RX_CONTROL0, AUX_RX_ALLOW_BELOW_THRESHOLD_STOP, mask_sh),\
+       LE_SF(DP_AUX0_AUX_DPHY_RX_CONTROL0, AUX_RX_PHASE_DETECT_LEN, mask_sh),\
+       LE_SF(DP_AUX0_AUX_DPHY_RX_CONTROL0, AUX_RX_DETECTION_THRESHOLD, mask_sh), \
+       LE_SF(DP_AUX0_AUX_DPHY_TX_CONTROL, AUX_TX_PRECHARGE_LEN, mask_sh),\
+       LE_SF(DP_AUX0_AUX_DPHY_TX_CONTROL, AUX_TX_PRECHARGE_SYMBOLS, mask_sh),\
+       LE_SF(DP_AUX0_AUX_DPHY_TX_CONTROL, AUX_MODE_DET_CHECK_DELAY, mask_sh),\
+       LE_SF(DP_AUX0_AUX_DPHY_RX_CONTROL1, AUX_RX_PRECHARGE_SKIP, mask_sh),\
+       LE_SF(DP_AUX0_AUX_DPHY_RX_CONTROL1, AUX_RX_TIMEOUT_LEN, mask_sh),\
+       LE_SF(DP_AUX0_AUX_DPHY_RX_CONTROL1, AUX_RX_TIMEOUT_LEN_MUL, mask_sh),\
+       LE_SF(DIO_LINKA_CNTL, ENC_TYPE_SEL, mask_sh),\
+       LE_SF(DIO_LINKA_CNTL, HPO_DP_ENC_SEL, mask_sh),\
+       LE_SF(DIO_LINKA_CNTL, HPO_HDMI_ENC_SEL, mask_sh),\
+       LE_SF(DIO_CLK_CNTL, DISPCLK_R_GATE_DIS, mask_sh),\
+       LE_SF(DIO_CLK_CNTL, DISPCLK_G_GATE_DIS, mask_sh),\
+       LE_SF(DIO_CLK_CNTL, REFCLK_R_GATE_DIS, mask_sh),\
+       LE_SF(DIO_CLK_CNTL, REFCLK_G_GATE_DIS, mask_sh),\
+       LE_SF(DIO_CLK_CNTL, SOCCLK_G_GATE_DIS, mask_sh),\
+       LE_SF(DIO_CLK_CNTL, SYMCLK_FE_R_GATE_DIS, mask_sh),\
+       LE_SF(DIO_CLK_CNTL, SYMCLK_FE_G_GATE_DIS, mask_sh),\
+       LE_SF(DIO_CLK_CNTL, SYMCLK_R_GATE_DIS, mask_sh),\
+       LE_SF(DIO_CLK_CNTL, SYMCLK_G_GATE_DIS, mask_sh),\
+       LE_SF(DIO_CLK_CNTL, DIO_FGCG_REP_DIS, mask_sh),\
+       LE_SF(DIO_CLK_CNTL, DISPCLK_G_HDCP_GATE_DIS, mask_sh),\
+       LE_SF(DIO_CLK_CNTL, SYMCLKA_G_HDCP_GATE_DIS, mask_sh),\
+       LE_SF(DIO_CLK_CNTL, SYMCLKB_G_HDCP_GATE_DIS, mask_sh),\
+       LE_SF(DIO_CLK_CNTL, SYMCLKC_G_HDCP_GATE_DIS, mask_sh),\
+       LE_SF(DIO_CLK_CNTL, SYMCLKD_G_HDCP_GATE_DIS, mask_sh),\
+       LE_SF(DIO_CLK_CNTL, SYMCLKE_G_HDCP_GATE_DIS, mask_sh),\
+       LE_SF(DIO_CLK_CNTL, SYMCLKF_G_HDCP_GATE_DIS, mask_sh),\
+       LE_SF(DIO_CLK_CNTL, SYMCLKG_G_HDCP_GATE_DIS, mask_sh)
+
+
+void dcn35_link_encoder_construct(
+       struct dcn20_link_encoder *enc20,
+       const struct encoder_init_data *init_data,
+       const struct encoder_feature_support *enc_features,
+       const struct dcn10_link_enc_registers *link_regs,
+       const struct dcn10_link_enc_aux_registers *aux_regs,
+       const struct dcn10_link_enc_hpd_registers *hpd_regs,
+       const struct dcn10_link_enc_shift *link_shift,
+       const struct dcn10_link_enc_mask *link_mask);
+
+void dcn35_link_encoder_init(struct link_encoder *enc);
+void dcn35_link_encoder_set_fgcg(struct link_encoder *enc, bool enabled);
+bool dcn35_is_dig_enabled(struct link_encoder *enc);
+
+enum signal_type dcn35_get_dig_mode(struct link_encoder *enc);
+void dcn35_link_encoder_setup(struct link_encoder *enc, enum signal_type signal);
+
+#endif /* __DC_LINK_ENCODER__DCN35_H__ */
diff --git a/drivers/gpu/drm/amd/display/dc/dio/dcn35/dcn35_dio_stream_encoder.c b/drivers/gpu/drm/amd/display/dc/dio/dcn35/dcn35_dio_stream_encoder.c
new file mode 100644 (file)
index 0000000..6a179e5
--- /dev/null
@@ -0,0 +1,493 @@
+/* SPDX-License-Identifier: MIT */
+/*
+ * Copyright 2023 Advanced Micro Devices, Inc.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+ * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
+ * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+ * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+ * OTHER DEALINGS IN THE SOFTWARE.
+ *
+ */
+
+
+#include "dc_bios_types.h"
+#include "dcn30/dcn30_dio_stream_encoder.h"
+#include "dcn314/dcn314_dio_stream_encoder.h"
+#include "dcn32/dcn32_dio_stream_encoder.h"
+#include "dcn35_dio_stream_encoder.h"
+#include "reg_helper.h"
+#include "hw_shared.h"
+#include "link.h"
+#include "dpcd_defs.h"
+
+#define DC_LOGGER \
+               enc1->base.ctx->logger
+
+#define REG(reg)\
+       (enc1->regs->reg)
+
+#undef FN
+#define FN(reg_name, field_name) \
+       enc1->se_shift->field_name, enc1->se_mask->field_name
+
+#define VBI_LINE_0 0
+#define HDMI_CLOCK_CHANNEL_RATE_MORE_340M 340000
+
+#define CTX \
+       enc1->base.ctx
+/* setup stream encoder in dvi mode */
+static void enc35_stream_encoder_dvi_set_stream_attribute(
+       struct stream_encoder *enc,
+       struct dc_crtc_timing *crtc_timing,
+       bool is_dual_link)
+{
+       struct dcn10_stream_encoder *enc1 = DCN10STRENC_FROM_STRENC(enc);
+
+       if (!enc->ctx->dc->debug.avoid_vbios_exec_table) {
+               struct bp_encoder_control cntl = {0};
+
+               cntl.action = ENCODER_CONTROL_SETUP;
+               cntl.engine_id = enc1->base.id;
+               cntl.signal = is_dual_link ?
+                       SIGNAL_TYPE_DVI_DUAL_LINK : SIGNAL_TYPE_DVI_SINGLE_LINK;
+               cntl.enable_dp_audio = false;
+               cntl.pixel_clock = crtc_timing->pix_clk_100hz / 10;
+               cntl.lanes_number = (is_dual_link) ? LANE_COUNT_EIGHT : LANE_COUNT_FOUR;
+
+               if (enc1->base.bp->funcs->encoder_control(
+                               enc1->base.bp, &cntl) != BP_RESULT_OK)
+                       return;
+
+       } else {
+
+               //Set pattern for clock channel, default vlue 0x63 does not work
+               REG_UPDATE(DIG_CLOCK_PATTERN, DIG_CLOCK_PATTERN, 0x1F);
+
+               //DIG_BE_TMDS_DVI_MODE : TMDS-DVI mode is already set in link_encoder_setup
+
+               //DIG_SOURCE_SELECT is already set in dig_connect_to_otg
+
+               /* DIG_START is removed from the register spec */
+       }
+
+       ASSERT(crtc_timing->pixel_encoding == PIXEL_ENCODING_RGB);
+       ASSERT(crtc_timing->display_color_depth == COLOR_DEPTH_888);
+       enc1_stream_encoder_set_stream_attribute_helper(enc1, crtc_timing);
+}
+/* setup stream encoder in hdmi mode */
+static void enc35_stream_encoder_hdmi_set_stream_attribute(
+       struct stream_encoder *enc,
+       struct dc_crtc_timing *crtc_timing,
+       int actual_pix_clk_khz,
+       bool enable_audio)
+{
+       struct dcn10_stream_encoder *enc1 = DCN10STRENC_FROM_STRENC(enc);
+
+       if (!enc->ctx->dc->debug.avoid_vbios_exec_table) {
+               struct bp_encoder_control cntl = {0};
+
+               cntl.action = ENCODER_CONTROL_SETUP;
+               cntl.engine_id = enc1->base.id;
+               cntl.signal = SIGNAL_TYPE_HDMI_TYPE_A;
+               cntl.enable_dp_audio = enable_audio;
+               cntl.pixel_clock = actual_pix_clk_khz;
+               cntl.lanes_number = LANE_COUNT_FOUR;
+
+               if (enc1->base.bp->funcs->encoder_control(
+                               enc1->base.bp, &cntl) != BP_RESULT_OK)
+                       return;
+
+       } else {
+
+               //Set pattern for clock channel, default vlue 0x63 does not work
+               REG_UPDATE(DIG_CLOCK_PATTERN, DIG_CLOCK_PATTERN, 0x1F);
+
+               //DIG_BE_TMDS_HDMI_MODE : TMDS-HDMI mode is already set in link_encoder_setup
+
+               //DIG_SOURCE_SELECT is already set in dig_connect_to_otg
+
+               /* DIG_START is removed from the register spec */
+               enc314_enable_fifo(enc);
+       }
+
+       /* Configure pixel encoding */
+       enc1_stream_encoder_set_stream_attribute_helper(enc1, crtc_timing);
+
+       /* setup HDMI engine */
+       REG_UPDATE_6(HDMI_CONTROL,
+               HDMI_PACKET_GEN_VERSION, 1,
+               HDMI_KEEPOUT_MODE, 1,
+               HDMI_DEEP_COLOR_ENABLE, 0,
+               HDMI_DATA_SCRAMBLE_EN, 0,
+               HDMI_NO_EXTRA_NULL_PACKET_FILLED, 1,
+               HDMI_CLOCK_CHANNEL_RATE, 0);
+
+       /* Configure color depth */
+       switch (crtc_timing->display_color_depth) {
+       case COLOR_DEPTH_888:
+               REG_UPDATE(HDMI_CONTROL, HDMI_DEEP_COLOR_DEPTH, 0);
+               break;
+       case COLOR_DEPTH_101010:
+               if (crtc_timing->pixel_encoding == PIXEL_ENCODING_YCBCR422) {
+                       REG_UPDATE_2(HDMI_CONTROL,
+                                       HDMI_DEEP_COLOR_DEPTH, 1,
+                                       HDMI_DEEP_COLOR_ENABLE, 0);
+               } else {
+                       REG_UPDATE_2(HDMI_CONTROL,
+                                       HDMI_DEEP_COLOR_DEPTH, 1,
+                                       HDMI_DEEP_COLOR_ENABLE, 1);
+                       }
+               break;
+       case COLOR_DEPTH_121212:
+               if (crtc_timing->pixel_encoding == PIXEL_ENCODING_YCBCR422) {
+                       REG_UPDATE_2(HDMI_CONTROL,
+                                       HDMI_DEEP_COLOR_DEPTH, 2,
+                                       HDMI_DEEP_COLOR_ENABLE, 0);
+               } else {
+                       REG_UPDATE_2(HDMI_CONTROL,
+                                       HDMI_DEEP_COLOR_DEPTH, 2,
+                                       HDMI_DEEP_COLOR_ENABLE, 1);
+                       }
+               break;
+       case COLOR_DEPTH_161616:
+               REG_UPDATE_2(HDMI_CONTROL,
+                               HDMI_DEEP_COLOR_DEPTH, 3,
+                               HDMI_DEEP_COLOR_ENABLE, 1);
+               break;
+       default:
+               break;
+       }
+
+       if (actual_pix_clk_khz >= HDMI_CLOCK_CHANNEL_RATE_MORE_340M) {
+               /* enable HDMI data scrambler
+                * HDMI_CLOCK_CHANNEL_RATE_MORE_340M
+                * Clock channel frequency is 1/4 of character rate.
+                */
+               REG_UPDATE_2(HDMI_CONTROL,
+                       HDMI_DATA_SCRAMBLE_EN, 1,
+                       HDMI_CLOCK_CHANNEL_RATE, 1);
+       } else if (crtc_timing->flags.LTE_340MCSC_SCRAMBLE) {
+
+               /* TODO: New feature for DCE11, still need to implement */
+
+               /* enable HDMI data scrambler
+                * HDMI_CLOCK_CHANNEL_FREQ_EQUAL_TO_CHAR_RATE
+                * Clock channel frequency is the same
+                * as character rate
+                */
+               REG_UPDATE_2(HDMI_CONTROL,
+                       HDMI_DATA_SCRAMBLE_EN, 1,
+                       HDMI_CLOCK_CHANNEL_RATE, 0);
+       }
+
+
+       /* Enable transmission of General Control packet on every frame */
+       REG_UPDATE_3(HDMI_VBI_PACKET_CONTROL,
+               HDMI_GC_CONT, 1,
+               HDMI_GC_SEND, 1,
+               HDMI_NULL_SEND, 1);
+
+       /* Disable Audio Content Protection packet transmission */
+       REG_UPDATE(HDMI_VBI_PACKET_CONTROL, HDMI_ACP_SEND, 0);
+
+       /* following belongs to audio */
+       /* Enable Audio InfoFrame packet transmission. */
+       REG_UPDATE(HDMI_INFOFRAME_CONTROL0, HDMI_AUDIO_INFO_SEND, 1);
+
+       /* update double-buffered AUDIO_INFO registers immediately */
+       ASSERT(enc->afmt);
+       enc->afmt->funcs->audio_info_immediate_update(enc->afmt);
+
+       /* Select line number on which to send Audio InfoFrame packets */
+       REG_UPDATE(HDMI_INFOFRAME_CONTROL1, HDMI_AUDIO_INFO_LINE,
+                               VBI_LINE_0 + 2);
+
+       /* set HDMI GC AVMUTE */
+       REG_UPDATE(HDMI_GC, HDMI_GC_AVMUTE, 0);
+       switch (crtc_timing->pixel_encoding) {
+       case PIXEL_ENCODING_YCBCR422:
+               REG_UPDATE(HDMI_CONTROL, TMDS_PIXEL_ENCODING, 1);
+       break;
+       default:
+               REG_UPDATE(HDMI_CONTROL, TMDS_PIXEL_ENCODING, 0);
+       break;
+       }
+       REG_UPDATE(HDMI_CONTROL, TMDS_COLOR_FORMAT, 0);
+}
+
+
+
+static void enc35_stream_encoder_enable(
+       struct stream_encoder *enc,
+       enum signal_type signal,
+       bool enable)
+{
+       struct dcn10_stream_encoder *enc1 = DCN10STRENC_FROM_STRENC(enc);
+
+       if (enable) {
+               switch (signal) {
+               case SIGNAL_TYPE_DVI_SINGLE_LINK:
+               case SIGNAL_TYPE_DVI_DUAL_LINK:
+                       /* TMDS-DVI */
+                       REG_UPDATE(DIG_FE_CLK_CNTL, DIG_FE_MODE, 2);
+                       break;
+               case SIGNAL_TYPE_HDMI_TYPE_A:
+                       /* TMDS-HDMI */
+                       REG_UPDATE(DIG_FE_CLK_CNTL, DIG_FE_MODE, 3);
+                       break;
+               case SIGNAL_TYPE_DISPLAY_PORT_MST:
+                       /* DP MST */
+                       REG_UPDATE(DIG_FE_CLK_CNTL, DIG_FE_MODE, 5);
+                       break;
+               case SIGNAL_TYPE_EDP:
+               case SIGNAL_TYPE_DISPLAY_PORT:
+               case SIGNAL_TYPE_VIRTUAL:
+                       /* DP SST */
+                       REG_UPDATE(DIG_FE_CLK_CNTL, DIG_FE_MODE, 0);
+                       break;
+               default:
+                       /* invalid mode ! */
+                       ASSERT_CRITICAL(false);
+               }
+       }
+}
+
+static bool is_two_pixels_per_containter(const struct dc_crtc_timing *timing)
+{
+       bool two_pix = timing->pixel_encoding == PIXEL_ENCODING_YCBCR420;
+
+       two_pix = two_pix || (timing->flags.DSC && timing->pixel_encoding == PIXEL_ENCODING_YCBCR422
+                       && !timing->dsc_cfg.ycbcr422_simple);
+       return two_pix;
+}
+
+static void enc35_stream_encoder_dp_unblank(
+               struct dc_link *link,
+               struct stream_encoder *enc,
+               const struct encoder_unblank_param *param)
+{
+       struct dcn10_stream_encoder *enc1 = DCN10STRENC_FROM_STRENC(enc);
+
+       if (param->link_settings.link_rate != LINK_RATE_UNKNOWN) {
+               uint32_t n_vid = 0x8000;
+               uint32_t m_vid;
+               uint32_t n_multiply = 0;
+               uint32_t pix_per_cycle = 0;
+               uint64_t m_vid_l = n_vid;
+
+               /* YCbCr 4:2:0 : Computed VID_M will be 2X the input rate */
+               if (is_two_pixels_per_containter(&param->timing) || param->opp_cnt > 1
+                       || param->pix_per_cycle > 1) {
+                       /*this logic should be the same in get_pixel_clock_parameters() */
+                       n_multiply = 1;
+                       pix_per_cycle = 1;
+               }
+               /* M / N = Fstream / Flink
+                * m_vid / n_vid = pixel rate / link rate
+                */
+
+               m_vid_l *= param->timing.pix_clk_100hz / 10;
+               m_vid_l = div_u64(m_vid_l,
+                       param->link_settings.link_rate
+                               * LINK_RATE_REF_FREQ_IN_KHZ);
+
+               m_vid = (uint32_t) m_vid_l;
+
+               /* enable auto measurement */
+
+               REG_UPDATE(DP_VID_TIMING, DP_VID_M_N_GEN_EN, 0);
+
+               /* auto measurement need 1 full 0x8000 symbol cycle to kick in,
+                * therefore program initial value for Mvid and Nvid
+                */
+
+               REG_UPDATE(DP_VID_N, DP_VID_N, n_vid);
+
+               REG_UPDATE(DP_VID_M, DP_VID_M, m_vid);
+
+               REG_UPDATE_2(DP_VID_TIMING,
+                               DP_VID_M_N_GEN_EN, 1,
+                               DP_VID_N_MUL, n_multiply);
+
+               REG_UPDATE(DP_PIXEL_FORMAT,
+                               DP_PIXEL_PER_CYCLE_PROCESSING_MODE,
+                               pix_per_cycle);
+       }
+
+       /* make sure stream is disabled before resetting steer fifo */
+       REG_UPDATE(DP_VID_STREAM_CNTL, DP_VID_STREAM_ENABLE, false);
+       REG_WAIT(DP_VID_STREAM_CNTL, DP_VID_STREAM_STATUS, 0, 10, 5000);
+
+       /* DIG_START is removed from the register spec */
+
+       /* switch DP encoder to CRTC data, but reset it the fifo first. It may happen
+        * that it overflows during mode transition, and sometimes doesn't recover.
+        */
+       REG_UPDATE(DP_STEER_FIFO, DP_STEER_FIFO_RESET, 1);
+       udelay(10);
+
+       REG_UPDATE(DP_STEER_FIFO, DP_STEER_FIFO_RESET, 0);
+
+       /* wait 100us for DIG/DP logic to prime
+        * (i.e. a few video lines)
+        */
+       udelay(100);
+
+       /* the hardware would start sending video at the start of the next DP
+        * frame (i.e. rising edge of the vblank).
+        * NOTE: We used to program DP_VID_STREAM_DIS_DEFER = 2 here, but this
+        * register has no effect on enable transition! HW always makes sure
+        * VID_STREAM enable at start of next frame, and this is not
+        * programmable
+        */
+
+       REG_UPDATE(DP_VID_STREAM_CNTL, DP_VID_STREAM_ENABLE, true);
+
+       /*
+        * DIG Resync FIFO now needs to be explicitly enabled.
+        * This should come after DP_VID_STREAM_ENABLE per HW docs.
+        */
+       enc314_enable_fifo(enc);
+
+       link->dc->link_srv->dp_trace_source_sequence(link, DPCD_SOURCE_SEQ_AFTER_ENABLE_DP_VID_STREAM);
+}
+
+static void enc35_stream_encoder_map_to_link(
+               struct stream_encoder *enc,
+               uint32_t stream_enc_inst,
+               uint32_t link_enc_inst)
+{
+       struct dcn10_stream_encoder *enc1 = DCN10STRENC_FROM_STRENC(enc);
+
+       ASSERT(stream_enc_inst < 5 && link_enc_inst < 5);
+       REG_UPDATE(STREAM_MAPPER_CONTROL,
+                               DIG_STREAM_LINK_TARGET, link_enc_inst);
+}
+
+static void enc35_reset_fifo(struct stream_encoder *enc, bool reset)
+{
+       struct dcn10_stream_encoder *enc1 = DCN10STRENC_FROM_STRENC(enc);
+       uint32_t reset_val = reset ? 1 : 0;
+       uint32_t is_symclk_on;
+
+       REG_UPDATE(DIG_FIFO_CTRL0, DIG_FIFO_RESET, reset_val);
+       REG_GET(DIG_FE_CLK_CNTL, DIG_FE_SYMCLK_FE_G_CLOCK_ON, &is_symclk_on);
+
+       if (is_symclk_on)
+               REG_WAIT(DIG_FIFO_CTRL0, DIG_FIFO_RESET_DONE, reset_val, 10, 5000);
+       else
+               udelay(10);
+}
+
+void enc35_disable_fifo(struct stream_encoder *enc)
+{
+       struct dcn10_stream_encoder *enc1 = DCN10STRENC_FROM_STRENC(enc);
+
+       REG_UPDATE(DIG_FIFO_CTRL0, DIG_FIFO_ENABLE, 0);
+       REG_UPDATE(DIG_FE_EN_CNTL, DIG_FE_ENABLE, 0);
+       REG_UPDATE(DIG_FE_CLK_CNTL, DIG_FE_CLK_EN, 0);
+}
+
+void enc35_enable_fifo(struct stream_encoder *enc)
+{
+       struct dcn10_stream_encoder *enc1 = DCN10STRENC_FROM_STRENC(enc);
+
+       REG_UPDATE(DIG_FIFO_CTRL0, DIG_FIFO_READ_START_LEVEL, 0x7);
+       REG_UPDATE(DIG_FE_CLK_CNTL, DIG_FE_CLK_EN, 1);
+       REG_UPDATE(DIG_FE_EN_CNTL, DIG_FE_ENABLE, 1);
+
+       enc35_reset_fifo(enc, true);
+       enc35_reset_fifo(enc, false);
+
+       REG_UPDATE(DIG_FIFO_CTRL0, DIG_FIFO_ENABLE, 1);
+}
+
+static const struct stream_encoder_funcs dcn35_str_enc_funcs = {
+       .dp_set_odm_combine =
+               enc314_dp_set_odm_combine,
+       .dp_set_stream_attribute =
+               enc2_stream_encoder_dp_set_stream_attribute,
+       .hdmi_set_stream_attribute =
+               enc35_stream_encoder_hdmi_set_stream_attribute,
+       .dvi_set_stream_attribute =
+               enc35_stream_encoder_dvi_set_stream_attribute,
+       .set_throttled_vcp_size =
+               enc1_stream_encoder_set_throttled_vcp_size,
+       .update_hdmi_info_packets =
+               enc3_stream_encoder_update_hdmi_info_packets,
+       .stop_hdmi_info_packets =
+               enc3_stream_encoder_stop_hdmi_info_packets,
+       .update_dp_info_packets_sdp_line_num =
+               enc3_stream_encoder_update_dp_info_packets_sdp_line_num,
+       .update_dp_info_packets =
+               enc3_stream_encoder_update_dp_info_packets,
+       .stop_dp_info_packets =
+               enc1_stream_encoder_stop_dp_info_packets,
+       .dp_blank =
+               enc314_stream_encoder_dp_blank,
+       .dp_unblank =
+               enc35_stream_encoder_dp_unblank,
+       .audio_mute_control = enc3_audio_mute_control,
+
+       .dp_audio_setup = enc3_se_dp_audio_setup,
+       .dp_audio_enable = enc3_se_dp_audio_enable,
+       .dp_audio_disable = enc1_se_dp_audio_disable,
+
+       .hdmi_audio_setup = enc3_se_hdmi_audio_setup,
+       .hdmi_audio_disable = enc1_se_hdmi_audio_disable,
+       .setup_stereo_sync  = enc1_setup_stereo_sync,
+       .set_avmute = enc1_stream_encoder_set_avmute,
+       .dig_connect_to_otg = enc1_dig_connect_to_otg,
+       .dig_source_otg = enc1_dig_source_otg,
+
+       .dp_get_pixel_format  = enc1_stream_encoder_dp_get_pixel_format,
+
+       .enc_read_state = enc314_read_state,
+       .dp_set_dsc_config = enc314_dp_set_dsc_config,
+       .dp_set_dsc_pps_info_packet = enc3_dp_set_dsc_pps_info_packet,
+       .set_dynamic_metadata = enc2_set_dynamic_metadata,
+       .hdmi_reset_stream_attribute = enc1_reset_hdmi_stream_attribute,
+       .enable_stream = enc35_stream_encoder_enable,
+
+       .set_input_mode = enc314_set_dig_input_mode,
+       .enable_fifo = enc35_enable_fifo,
+       .disable_fifo = enc35_disable_fifo,
+       .map_stream_to_link = enc35_stream_encoder_map_to_link,
+};
+
+void dcn35_dio_stream_encoder_construct(
+       struct dcn10_stream_encoder *enc1,
+       struct dc_context *ctx,
+       struct dc_bios *bp,
+       enum engine_id eng_id,
+       struct vpg *vpg,
+       struct afmt *afmt,
+       const struct dcn10_stream_enc_registers *regs,
+       const struct dcn10_stream_encoder_shift *se_shift,
+       const struct dcn10_stream_encoder_mask *se_mask)
+{
+       enc1->base.funcs = &dcn35_str_enc_funcs;
+       enc1->base.ctx = ctx;
+       enc1->base.id = eng_id;
+       enc1->base.bp = bp;
+       enc1->base.vpg = vpg;
+       enc1->base.afmt = afmt;
+       enc1->regs = regs;
+       enc1->se_shift = se_shift;
+       enc1->se_mask = se_mask;
+       enc1->base.stream_enc_inst = vpg->inst;
+}
+
diff --git a/drivers/gpu/drm/amd/display/dc/dio/dcn35/dcn35_dio_stream_encoder.h b/drivers/gpu/drm/amd/display/dc/dio/dcn35/dcn35_dio_stream_encoder.h
new file mode 100644 (file)
index 0000000..ddb33fd
--- /dev/null
@@ -0,0 +1,332 @@
+/* SPDX-License-Identifier: MIT */
+/*
+ * Copyright 2023 Advanced Micro Devices, Inc.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+ * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
+ * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+ * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+ * OTHER DEALINGS IN THE SOFTWARE.
+ *
+ */
+
+#ifndef __DC_DIO_STREAM_ENCODER_DCN35_H__
+#define __DC_DIO_STREAM_ENCODER_DCN35_H__
+
+#include "dcn30/dcn30_vpg.h"
+#include "dcn30/dcn30_afmt.h"
+#include "stream_encoder.h"
+#include "dcn20/dcn20_stream_encoder.h"
+
+/* Register bit field name change */
+#define RDPCSTX0_RDPCSTX_CLOCK_CNTL__RDPCS_SYMCLK_DIV2_GATE_DIS__SHIFT                                        0x8
+#define RDPCSTX0_RDPCSTX_CLOCK_CNTL__RDPCS_SYMCLK_DIV2_EN__SHIFT                                              0x9
+#define RDPCSTX0_RDPCSTX_CLOCK_CNTL__RDPCS_SYMCLK_DIV2_CLOCK_ON__SHIFT                                        0xa
+#define DPCSTX0_DPCSTX_TX_CNTL__DPCS_TX_DATA_SWAP__SHIFT                                                      0xe
+#define DPCSTX0_DPCSTX_TX_CNTL__DPCS_TX_DATA_ORDER_INVERT__SHIFT                                              0xf
+
+#define RDPCSTX0_RDPCSTX_CLOCK_CNTL__RDPCS_SYMCLK_DIV2_GATE_DIS_MASK                                          0x00000100L
+#define RDPCSTX0_RDPCSTX_CLOCK_CNTL__RDPCS_SYMCLK_DIV2_EN_MASK                                                0x00000200L
+#define RDPCSTX0_RDPCSTX_CLOCK_CNTL__RDPCS_SYMCLK_DIV2_CLOCK_ON_MASK                                          0x00000400L
+#define DPCSTX0_DPCSTX_TX_CNTL__DPCS_TX_DATA_SWAP_MASK                                                        0x00004000L
+#define DPCSTX0_DPCSTX_TX_CNTL__DPCS_TX_DATA_ORDER_INVERT_MASK                                                0x00008000L
+
+
+#define SE_DCN35_REG_LIST(id)\
+       SRI(AFMT_CNTL, DIG, id), \
+       SRI(DIG_FE_CNTL, DIG, id), \
+       SRI(HDMI_CONTROL, DIG, id), \
+       SRI(HDMI_DB_CONTROL, DIG, id), \
+       SRI(HDMI_GC, DIG, id), \
+       SRI(HDMI_GENERIC_PACKET_CONTROL0, DIG, id), \
+       SRI(HDMI_GENERIC_PACKET_CONTROL1, DIG, id), \
+       SRI(HDMI_GENERIC_PACKET_CONTROL2, DIG, id), \
+       SRI(HDMI_GENERIC_PACKET_CONTROL3, DIG, id), \
+       SRI(HDMI_GENERIC_PACKET_CONTROL4, DIG, id), \
+       SRI(HDMI_GENERIC_PACKET_CONTROL5, DIG, id), \
+       SRI(HDMI_GENERIC_PACKET_CONTROL6, DIG, id), \
+       SRI(HDMI_GENERIC_PACKET_CONTROL7, DIG, id), \
+       SRI(HDMI_GENERIC_PACKET_CONTROL8, DIG, id), \
+       SRI(HDMI_GENERIC_PACKET_CONTROL9, DIG, id), \
+       SRI(HDMI_GENERIC_PACKET_CONTROL10, DIG, id), \
+       SRI(HDMI_INFOFRAME_CONTROL0, DIG, id), \
+       SRI(HDMI_INFOFRAME_CONTROL1, DIG, id), \
+       SRI(HDMI_VBI_PACKET_CONTROL, DIG, id), \
+       SRI(HDMI_AUDIO_PACKET_CONTROL, DIG, id),\
+       SRI(HDMI_ACR_PACKET_CONTROL, DIG, id),\
+       SRI(HDMI_ACR_32_0, DIG, id),\
+       SRI(HDMI_ACR_32_1, DIG, id),\
+       SRI(HDMI_ACR_44_0, DIG, id),\
+       SRI(HDMI_ACR_44_1, DIG, id),\
+       SRI(HDMI_ACR_48_0, DIG, id),\
+       SRI(HDMI_ACR_48_1, DIG, id),\
+       SRI(DP_DB_CNTL, DP, id), \
+       SRI(DP_MSA_MISC, DP, id), \
+       SRI(DP_MSA_VBID_MISC, DP, id), \
+       SRI(DP_MSA_COLORIMETRY, DP, id), \
+       SRI(DP_MSA_TIMING_PARAM1, DP, id), \
+       SRI(DP_MSA_TIMING_PARAM2, DP, id), \
+       SRI(DP_MSA_TIMING_PARAM3, DP, id), \
+       SRI(DP_MSA_TIMING_PARAM4, DP, id), \
+       SRI(DP_MSE_RATE_CNTL, DP, id), \
+       SRI(DP_MSE_RATE_UPDATE, DP, id), \
+       SRI(DP_PIXEL_FORMAT, DP, id), \
+       SRI(DP_SEC_CNTL, DP, id), \
+       SRI(DP_SEC_CNTL1, DP, id), \
+       SRI(DP_SEC_CNTL2, DP, id), \
+       SRI(DP_SEC_CNTL5, DP, id), \
+       SRI(DP_SEC_CNTL6, DP, id), \
+       SRI(DP_STEER_FIFO, DP, id), \
+       SRI(DP_VID_M, DP, id), \
+       SRI(DP_VID_N, DP, id), \
+       SRI(DP_VID_STREAM_CNTL, DP, id), \
+       SRI(DP_VID_TIMING, DP, id), \
+       SRI(DP_SEC_AUD_N, DP, id), \
+       SRI(DP_SEC_TIMESTAMP, DP, id), \
+       SRI(DP_DSC_CNTL, DP, id), \
+       SRI(DP_SEC_METADATA_TRANSMISSION, DP, id), \
+       SRI(HDMI_METADATA_PACKET_CONTROL, DIG, id), \
+       SRI(DP_SEC_FRAMING4, DP, id), \
+       SRI(DP_GSP11_CNTL, DP, id), \
+       SRI(DME_CONTROL, DME, id),\
+       SRI(DP_SEC_METADATA_TRANSMISSION, DP, id), \
+       SRI(HDMI_METADATA_PACKET_CONTROL, DIG, id), \
+       SRI(DIG_FE_CNTL, DIG, id), \
+       SRI(DIG_FE_EN_CNTL, DIG, id), \
+       SRI(DIG_FE_CLK_CNTL, DIG, id), \
+       SRI(DIG_CLOCK_PATTERN, DIG, id), \
+       SRI(DIG_FIFO_CTRL0, DIG, id),\
+       SRI(STREAM_MAPPER_CONTROL, DIG, id)
+
+
+#define SE_COMMON_MASK_SH_LIST_DCN35(mask_sh)\
+       SE_SF(DP0_DP_PIXEL_FORMAT, DP_PIXEL_ENCODING, mask_sh),\
+       SE_SF(DP0_DP_PIXEL_FORMAT, DP_COMPONENT_DEPTH, mask_sh),\
+       SE_SF(DP0_DP_PIXEL_FORMAT, DP_PIXEL_PER_CYCLE_PROCESSING_MODE, mask_sh),\
+       SE_SF(DIG0_HDMI_CONTROL, HDMI_PACKET_GEN_VERSION, mask_sh),\
+       SE_SF(DIG0_HDMI_CONTROL, HDMI_KEEPOUT_MODE, mask_sh),\
+       SE_SF(DIG0_HDMI_CONTROL, HDMI_DEEP_COLOR_ENABLE, mask_sh),\
+       SE_SF(DIG0_HDMI_CONTROL, HDMI_DEEP_COLOR_DEPTH, mask_sh),\
+       SE_SF(DIG0_HDMI_CONTROL, HDMI_DATA_SCRAMBLE_EN, mask_sh),\
+       SE_SF(DIG0_HDMI_CONTROL, HDMI_NO_EXTRA_NULL_PACKET_FILLED, mask_sh),\
+       SE_SF(DIG0_HDMI_VBI_PACKET_CONTROL, HDMI_GC_CONT, mask_sh),\
+       SE_SF(DIG0_HDMI_VBI_PACKET_CONTROL, HDMI_GC_SEND, mask_sh),\
+       SE_SF(DIG0_HDMI_VBI_PACKET_CONTROL, HDMI_NULL_SEND, mask_sh),\
+       SE_SF(DIG0_HDMI_VBI_PACKET_CONTROL, HDMI_ACP_SEND, mask_sh),\
+       SE_SF(DIG0_HDMI_INFOFRAME_CONTROL0, HDMI_AUDIO_INFO_SEND, mask_sh),\
+       SE_SF(DIG0_HDMI_INFOFRAME_CONTROL1, HDMI_AUDIO_INFO_LINE, mask_sh),\
+       SE_SF(DIG0_HDMI_GC, HDMI_GC_AVMUTE, mask_sh),\
+       SE_SF(DP0_DP_MSE_RATE_CNTL, DP_MSE_RATE_X, mask_sh),\
+       SE_SF(DP0_DP_MSE_RATE_CNTL, DP_MSE_RATE_Y, mask_sh),\
+       SE_SF(DP0_DP_MSE_RATE_UPDATE, DP_MSE_RATE_UPDATE_PENDING, mask_sh),\
+       SE_SF(DP0_DP_SEC_CNTL, DP_SEC_GSP0_ENABLE, mask_sh),\
+       SE_SF(DP0_DP_SEC_CNTL, DP_SEC_STREAM_ENABLE, mask_sh),\
+       SE_SF(DP0_DP_SEC_CNTL, DP_SEC_GSP1_ENABLE, mask_sh),\
+       SE_SF(DP0_DP_SEC_CNTL, DP_SEC_GSP2_ENABLE, mask_sh),\
+       SE_SF(DP0_DP_SEC_CNTL, DP_SEC_GSP3_ENABLE, mask_sh),\
+       SE_SF(DP0_DP_SEC_CNTL, DP_SEC_MPG_ENABLE, mask_sh),\
+       SE_SF(DP0_DP_SEC_CNTL1, DP_SEC_GSP5_LINE_REFERENCE, mask_sh),\
+       SE_SF(DP0_DP_SEC_CNTL2, DP_SEC_GSP4_SEND, mask_sh),\
+       SE_SF(DP0_DP_SEC_CNTL2, DP_SEC_GSP4_SEND_PENDING, mask_sh),\
+       SE_SF(DP0_DP_SEC_CNTL4, DP_SEC_GSP4_LINE_NUM, mask_sh),\
+       SE_SF(DP0_DP_SEC_CNTL5, DP_SEC_GSP5_LINE_NUM, mask_sh),\
+       SE_SF(DP0_DP_SEC_CNTL2, DP_SEC_GSP4_SEND_ANY_LINE, mask_sh),\
+       SE_SF(DP0_DP_VID_STREAM_CNTL, DP_VID_STREAM_DIS_DEFER, mask_sh),\
+       SE_SF(DP0_DP_VID_STREAM_CNTL, DP_VID_STREAM_ENABLE, mask_sh),\
+       SE_SF(DP0_DP_VID_STREAM_CNTL, DP_VID_STREAM_STATUS, mask_sh),\
+       SE_SF(DP0_DP_STEER_FIFO, DP_STEER_FIFO_RESET, mask_sh),\
+       SE_SF(DP0_DP_VID_TIMING, DP_VID_M_N_GEN_EN, mask_sh),\
+       SE_SF(DP0_DP_VID_N, DP_VID_N, mask_sh),\
+       SE_SF(DP0_DP_VID_M, DP_VID_M, mask_sh),\
+       SE_SF(DIG0_HDMI_AUDIO_PACKET_CONTROL, HDMI_AUDIO_DELAY_EN, mask_sh),\
+       SE_SF(DIG0_HDMI_ACR_PACKET_CONTROL, HDMI_ACR_AUTO_SEND, mask_sh),\
+       SE_SF(DIG0_HDMI_ACR_PACKET_CONTROL, HDMI_ACR_SOURCE, mask_sh),\
+       SE_SF(DIG0_HDMI_ACR_PACKET_CONTROL, HDMI_ACR_AUDIO_PRIORITY, mask_sh),\
+       SE_SF(DIG0_HDMI_ACR_32_0, HDMI_ACR_CTS_32, mask_sh),\
+       SE_SF(DIG0_HDMI_ACR_32_1, HDMI_ACR_N_32, mask_sh),\
+       SE_SF(DIG0_HDMI_ACR_44_0, HDMI_ACR_CTS_44, mask_sh),\
+       SE_SF(DIG0_HDMI_ACR_44_1, HDMI_ACR_N_44, mask_sh),\
+       SE_SF(DIG0_HDMI_ACR_48_0, HDMI_ACR_CTS_48, mask_sh),\
+       SE_SF(DIG0_HDMI_ACR_48_1, HDMI_ACR_N_48, mask_sh),\
+       SE_SF(DP0_DP_SEC_AUD_N, DP_SEC_AUD_N, mask_sh),\
+       SE_SF(DP0_DP_SEC_TIMESTAMP, DP_SEC_TIMESTAMP_MODE, mask_sh),\
+       SE_SF(DP0_DP_SEC_CNTL, DP_SEC_ASP_ENABLE, mask_sh),\
+       SE_SF(DP0_DP_SEC_CNTL, DP_SEC_ATP_ENABLE, mask_sh),\
+       SE_SF(DP0_DP_SEC_CNTL, DP_SEC_AIP_ENABLE, mask_sh),\
+       SE_SF(DP0_DP_SEC_CNTL, DP_SEC_ACM_ENABLE, mask_sh),\
+       SE_SF(DIG0_AFMT_CNTL, AFMT_AUDIO_CLOCK_EN, mask_sh),\
+       SE_SF(DIG0_HDMI_CONTROL, HDMI_CLOCK_CHANNEL_RATE, mask_sh),\
+       SE_SF(DIG0_HDMI_CONTROL, TMDS_PIXEL_ENCODING, mask_sh),\
+       SE_SF(DIG0_HDMI_CONTROL, TMDS_COLOR_FORMAT, mask_sh),\
+       SE_SF(DIG0_DIG_FE_CNTL, DIG_STEREOSYNC_SELECT, mask_sh),\
+       SE_SF(DIG0_DIG_FE_CNTL, DIG_STEREOSYNC_GATE_EN, mask_sh),\
+       SE_SF(DP0_DP_SEC_CNTL, DP_SEC_GSP4_ENABLE, mask_sh),\
+       SE_SF(DP0_DP_SEC_CNTL, DP_SEC_GSP5_ENABLE, mask_sh),\
+       SE_SF(DP0_DP_SEC_CNTL, DP_SEC_GSP6_ENABLE, mask_sh),\
+       SE_SF(DP0_DP_SEC_CNTL, DP_SEC_GSP7_ENABLE, mask_sh),\
+       SE_SF(DP0_DP_SEC_CNTL2, DP_SEC_GSP7_SEND, mask_sh),\
+       SE_SF(DP0_DP_SEC_CNTL6, DP_SEC_GSP7_LINE_NUM, mask_sh),\
+       SE_SF(DP0_DP_SEC_CNTL2, DP_SEC_GSP11_PPS, mask_sh),\
+       SE_SF(DP0_DP_GSP11_CNTL, DP_SEC_GSP11_ENABLE, mask_sh),\
+       SE_SF(DP0_DP_GSP11_CNTL, DP_SEC_GSP11_LINE_NUM, mask_sh),\
+       SE_SF(DP0_DP_DB_CNTL, DP_DB_DISABLE, mask_sh),\
+       SE_SF(DP0_DP_MSA_COLORIMETRY, DP_MSA_MISC0, mask_sh),\
+       SE_SF(DP0_DP_MSA_TIMING_PARAM1, DP_MSA_HTOTAL, mask_sh),\
+       SE_SF(DP0_DP_MSA_TIMING_PARAM1, DP_MSA_VTOTAL, mask_sh),\
+       SE_SF(DP0_DP_MSA_TIMING_PARAM2, DP_MSA_HSTART, mask_sh),\
+       SE_SF(DP0_DP_MSA_TIMING_PARAM2, DP_MSA_VSTART, mask_sh),\
+       SE_SF(DP0_DP_MSA_TIMING_PARAM3, DP_MSA_HSYNCWIDTH, mask_sh),\
+       SE_SF(DP0_DP_MSA_TIMING_PARAM3, DP_MSA_HSYNCPOLARITY, mask_sh),\
+       SE_SF(DP0_DP_MSA_TIMING_PARAM3, DP_MSA_VSYNCWIDTH, mask_sh),\
+       SE_SF(DP0_DP_MSA_TIMING_PARAM3, DP_MSA_VSYNCPOLARITY, mask_sh),\
+       SE_SF(DP0_DP_MSA_TIMING_PARAM4, DP_MSA_HWIDTH, mask_sh),\
+       SE_SF(DP0_DP_MSA_TIMING_PARAM4, DP_MSA_VHEIGHT, mask_sh),\
+       SE_SF(DIG0_HDMI_DB_CONTROL, HDMI_DB_DISABLE, mask_sh),\
+       SE_SF(DP0_DP_VID_TIMING, DP_VID_N_MUL, mask_sh),\
+       SE_SF(DIG0_DIG_FE_CNTL, DIG_SOURCE_SELECT, mask_sh), \
+       SE_SF(DIG0_HDMI_GENERIC_PACKET_CONTROL0, HDMI_GENERIC0_CONT, mask_sh),\
+       SE_SF(DIG0_HDMI_GENERIC_PACKET_CONTROL0, HDMI_GENERIC0_SEND, mask_sh),\
+       SE_SF(DIG0_HDMI_GENERIC_PACKET_CONTROL0, HDMI_GENERIC1_CONT, mask_sh),\
+       SE_SF(DIG0_HDMI_GENERIC_PACKET_CONTROL0, HDMI_GENERIC1_SEND, mask_sh),\
+       SE_SF(DIG0_HDMI_GENERIC_PACKET_CONTROL0, HDMI_GENERIC2_CONT, mask_sh),\
+       SE_SF(DIG0_HDMI_GENERIC_PACKET_CONTROL0, HDMI_GENERIC2_SEND, mask_sh),\
+       SE_SF(DIG0_HDMI_GENERIC_PACKET_CONTROL0, HDMI_GENERIC3_CONT, mask_sh),\
+       SE_SF(DIG0_HDMI_GENERIC_PACKET_CONTROL0, HDMI_GENERIC3_SEND, mask_sh),\
+       SE_SF(DIG0_HDMI_GENERIC_PACKET_CONTROL0, HDMI_GENERIC4_CONT, mask_sh),\
+       SE_SF(DIG0_HDMI_GENERIC_PACKET_CONTROL0, HDMI_GENERIC4_SEND, mask_sh),\
+       SE_SF(DIG0_HDMI_GENERIC_PACKET_CONTROL0, HDMI_GENERIC5_CONT, mask_sh),\
+       SE_SF(DIG0_HDMI_GENERIC_PACKET_CONTROL0, HDMI_GENERIC5_SEND, mask_sh),\
+       SE_SF(DIG0_HDMI_GENERIC_PACKET_CONTROL0, HDMI_GENERIC6_CONT, mask_sh),\
+       SE_SF(DIG0_HDMI_GENERIC_PACKET_CONTROL0, HDMI_GENERIC6_SEND, mask_sh),\
+       SE_SF(DIG0_HDMI_GENERIC_PACKET_CONTROL0, HDMI_GENERIC7_CONT, mask_sh),\
+       SE_SF(DIG0_HDMI_GENERIC_PACKET_CONTROL0, HDMI_GENERIC7_SEND, mask_sh),\
+       SE_SF(DIG0_HDMI_GENERIC_PACKET_CONTROL6, HDMI_GENERIC8_CONT, mask_sh),\
+       SE_SF(DIG0_HDMI_GENERIC_PACKET_CONTROL6, HDMI_GENERIC8_SEND, mask_sh),\
+       SE_SF(DIG0_HDMI_GENERIC_PACKET_CONTROL6, HDMI_GENERIC9_CONT, mask_sh),\
+       SE_SF(DIG0_HDMI_GENERIC_PACKET_CONTROL6, HDMI_GENERIC9_SEND, mask_sh),\
+       SE_SF(DIG0_HDMI_GENERIC_PACKET_CONTROL6, HDMI_GENERIC10_CONT, mask_sh),\
+       SE_SF(DIG0_HDMI_GENERIC_PACKET_CONTROL6, HDMI_GENERIC10_SEND, mask_sh),\
+       SE_SF(DIG0_HDMI_GENERIC_PACKET_CONTROL6, HDMI_GENERIC11_CONT, mask_sh),\
+       SE_SF(DIG0_HDMI_GENERIC_PACKET_CONTROL6, HDMI_GENERIC11_SEND, mask_sh),\
+       SE_SF(DIG0_HDMI_GENERIC_PACKET_CONTROL6, HDMI_GENERIC12_CONT, mask_sh),\
+       SE_SF(DIG0_HDMI_GENERIC_PACKET_CONTROL6, HDMI_GENERIC12_SEND, mask_sh),\
+       SE_SF(DIG0_HDMI_GENERIC_PACKET_CONTROL6, HDMI_GENERIC13_CONT, mask_sh),\
+       SE_SF(DIG0_HDMI_GENERIC_PACKET_CONTROL6, HDMI_GENERIC13_SEND, mask_sh),\
+       SE_SF(DIG0_HDMI_GENERIC_PACKET_CONTROL6, HDMI_GENERIC14_CONT, mask_sh),\
+       SE_SF(DIG0_HDMI_GENERIC_PACKET_CONTROL6, HDMI_GENERIC14_SEND, mask_sh),\
+       SE_SF(DIG0_HDMI_GENERIC_PACKET_CONTROL1, HDMI_GENERIC0_LINE, mask_sh),\
+       SE_SF(DIG0_HDMI_GENERIC_PACKET_CONTROL1, HDMI_GENERIC1_LINE, mask_sh),\
+       SE_SF(DIG0_HDMI_GENERIC_PACKET_CONTROL2, HDMI_GENERIC2_LINE, mask_sh),\
+       SE_SF(DIG0_HDMI_GENERIC_PACKET_CONTROL2, HDMI_GENERIC3_LINE, mask_sh),\
+       SE_SF(DIG0_HDMI_GENERIC_PACKET_CONTROL3, HDMI_GENERIC4_LINE, mask_sh),\
+       SE_SF(DIG0_HDMI_GENERIC_PACKET_CONTROL3, HDMI_GENERIC5_LINE, mask_sh),\
+       SE_SF(DIG0_HDMI_GENERIC_PACKET_CONTROL4, HDMI_GENERIC6_LINE, mask_sh),\
+       SE_SF(DIG0_HDMI_GENERIC_PACKET_CONTROL4, HDMI_GENERIC7_LINE, mask_sh),\
+       SE_SF(DIG0_HDMI_GENERIC_PACKET_CONTROL7, HDMI_GENERIC8_LINE, mask_sh),\
+       SE_SF(DIG0_HDMI_GENERIC_PACKET_CONTROL7, HDMI_GENERIC9_LINE, mask_sh),\
+       SE_SF(DIG0_HDMI_GENERIC_PACKET_CONTROL8, HDMI_GENERIC10_LINE, mask_sh),\
+       SE_SF(DIG0_HDMI_GENERIC_PACKET_CONTROL8, HDMI_GENERIC11_LINE, mask_sh),\
+       SE_SF(DIG0_HDMI_GENERIC_PACKET_CONTROL9, HDMI_GENERIC12_LINE, mask_sh),\
+       SE_SF(DIG0_HDMI_GENERIC_PACKET_CONTROL9, HDMI_GENERIC13_LINE, mask_sh),\
+       SE_SF(DIG0_HDMI_GENERIC_PACKET_CONTROL10, HDMI_GENERIC14_LINE, mask_sh),\
+       SE_SF(DP0_DP_DSC_CNTL, DP_DSC_MODE, mask_sh),\
+       SE_SF(DP0_DP_MSA_VBID_MISC, DP_VBID6_LINE_REFERENCE, mask_sh),\
+       SE_SF(DP0_DP_MSA_VBID_MISC, DP_VBID6_LINE_NUM, mask_sh),\
+       SE_SF(DME0_DME_CONTROL, METADATA_ENGINE_EN, mask_sh),\
+       SE_SF(DME0_DME_CONTROL, METADATA_HUBP_REQUESTOR_ID, mask_sh),\
+       SE_SF(DME0_DME_CONTROL, METADATA_STREAM_TYPE, mask_sh),\
+       SE_SF(DP0_DP_SEC_METADATA_TRANSMISSION, DP_SEC_METADATA_PACKET_ENABLE, mask_sh),\
+       SE_SF(DP0_DP_SEC_METADATA_TRANSMISSION, DP_SEC_METADATA_PACKET_LINE_REFERENCE, mask_sh),\
+       SE_SF(DP0_DP_SEC_METADATA_TRANSMISSION, DP_SEC_METADATA_PACKET_LINE, mask_sh),\
+       SE_SF(DIG0_HDMI_METADATA_PACKET_CONTROL, HDMI_METADATA_PACKET_ENABLE, mask_sh),\
+       SE_SF(DIG0_HDMI_METADATA_PACKET_CONTROL, HDMI_METADATA_PACKET_LINE_REFERENCE, mask_sh),\
+       SE_SF(DIG0_HDMI_METADATA_PACKET_CONTROL, HDMI_METADATA_PACKET_LINE, mask_sh),\
+       SE_SF(DIG0_HDMI_CONTROL, DOLBY_VISION_EN, mask_sh),\
+       SE_SF(DIG0_DIG_FE_EN_CNTL, DIG_FE_ENABLE, mask_sh),\
+       SE_SF(DIG0_DIG_FE_CLK_CNTL, DIG_FE_MODE, mask_sh),\
+       SE_SF(DIG0_DIG_FE_CLK_CNTL, DIG_FE_CLK_EN, mask_sh),\
+       SE_SF(DIG0_DIG_FE_CLK_CNTL, DIG_FE_SOFT_RESET, mask_sh),\
+       SE_SF(DIG0_DIG_FE_CLK_CNTL, DIG_FE_DISPCLK_G_CLOCK_ON, mask_sh),\
+       SE_SF(DIG0_DIG_FE_CLK_CNTL, DIG_FE_SYMCLK_FE_G_CLOCK_ON, mask_sh),\
+       SE_SF(DIG0_DIG_FE_CLK_CNTL, DIG_FE_SYMCLK_FE_G_AFMT_CLOCK_ON, mask_sh),\
+       SE_SF(DIG0_DIG_FE_CLK_CNTL, DIG_FE_SYMCLK_FE_G_TMDS_CLOCK_ON, mask_sh),\
+       SE_SF(DIG0_DIG_FE_CLK_CNTL, DIG_FE_SOCCLK_G_AFMT_CLOCK_ON, mask_sh),\
+       SE_SF(DP0_DP_SEC_FRAMING4, DP_SST_SDP_SPLITTING, mask_sh),\
+       SE_SF(DIG0_DIG_CLOCK_PATTERN, DIG_CLOCK_PATTERN, mask_sh),\
+       SE_SF(DIG0_DIG_FIFO_CTRL0, DIG_FIFO_OUTPUT_PIXEL_MODE, mask_sh),\
+       SE_SF(DIG0_DIG_FIFO_CTRL0, DIG_FIFO_READ_START_LEVEL, mask_sh),\
+       SE_SF(DIG0_DIG_FIFO_CTRL0, DIG_FIFO_ENABLE, mask_sh),\
+       SE_SF(DIG0_DIG_FIFO_CTRL0, DIG_FIFO_RESET, mask_sh),\
+       SE_SF(DIG0_DIG_FIFO_CTRL0, DIG_FIFO_RESET_DONE, mask_sh),\
+       SE_SF(DIG0_STREAM_MAPPER_CONTROL, DIG_STREAM_LINK_TARGET, mask_sh),
+
+void dcn35_dio_stream_encoder_construct(
+       struct dcn10_stream_encoder *enc1,
+       struct dc_context *ctx,
+       struct dc_bios *bp,
+       enum engine_id eng_id,
+       struct vpg *vpg,
+       struct afmt *afmt,
+       const struct dcn10_stream_enc_registers *regs,
+       const struct dcn10_stream_encoder_shift *se_shift,
+       const struct dcn10_stream_encoder_mask *se_mask);
+
+void enc3_stream_encoder_update_hdmi_info_packets(
+       struct stream_encoder *enc,
+       const struct encoder_info_frame *info_frame);
+
+void enc3_stream_encoder_stop_hdmi_info_packets(
+       struct stream_encoder *enc);
+
+void enc3_stream_encoder_update_dp_info_packets_sdp_line_num(
+               struct stream_encoder *enc,
+               struct encoder_info_frame *info_frame);
+
+void enc3_stream_encoder_update_dp_info_packets(
+       struct stream_encoder *enc,
+       const struct encoder_info_frame *info_frame);
+
+void enc3_audio_mute_control(
+       struct stream_encoder *enc,
+       bool mute);
+
+void enc3_se_dp_audio_setup(
+       struct stream_encoder *enc,
+       unsigned int az_inst,
+       struct audio_info *info);
+
+void enc3_se_dp_audio_enable(
+       struct stream_encoder *enc);
+
+void enc3_se_hdmi_audio_setup(
+       struct stream_encoder *enc,
+       unsigned int az_inst,
+       struct audio_info *info,
+       struct audio_crtc_info *audio_crtc_info);
+
+void enc3_dp_set_dsc_pps_info_packet(
+       struct stream_encoder *enc,
+       bool enable,
+       uint8_t *dsc_packed_pps,
+       bool immediate_update);
+
+void enc35_disable_fifo(
+       struct stream_encoder *enc);
+
+void enc35_enable_fifo(
+       struct stream_encoder *enc);
+
+
+#endif /* __DC_DIO_STREAM_ENCODER_DCN35_H__ */
diff --git a/drivers/gpu/drm/amd/display/dc/dio/dcn401/dcn401_dio_link_encoder.c b/drivers/gpu/drm/amd/display/dc/dio/dcn401/dcn401_dio_link_encoder.c
new file mode 100644 (file)
index 0000000..7e558ca
--- /dev/null
@@ -0,0 +1,322 @@
+/*
+ * Copyright 2021 Advanced Micro Devices, Inc.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+ * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
+ * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+ * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+ * OTHER DEALINGS IN THE SOFTWARE.
+ *
+ * Authors: AMD
+ *
+ */
+
+
+#include "reg_helper.h"
+
+#include "core_types.h"
+#include "link_encoder.h"
+#include "dcn31/dcn31_dio_link_encoder.h"
+#include "dcn32/dcn32_dio_link_encoder.h"
+#include "dcn401_dio_link_encoder.h"
+#include "stream_encoder.h"
+#include "dc_bios_types.h"
+
+#include "gpio_service_interface.h"
+
+#ifndef MIN
+#define MIN(X, Y) ((X) < (Y) ? (X) : (Y))
+#endif
+
+#define CTX \
+       enc10->base.ctx
+#define DC_LOGGER \
+       enc10->base.ctx->logger
+
+#define REG(reg)\
+       (enc10->link_regs->reg)
+
+#undef FN
+#define FN(reg_name, field_name) \
+       enc10->link_shift->field_name, enc10->link_mask->field_name
+
+#define AUX_REG(reg)\
+       (enc10->aux_regs->reg)
+
+#define AUX_REG_READ(reg_name) \
+               dm_read_reg(CTX, AUX_REG(reg_name))
+
+#define AUX_REG_WRITE(reg_name, val) \
+                       dm_write_reg(CTX, AUX_REG(reg_name), val)
+
+#ifndef MIN
+#define MIN(X, Y) ((X) < (Y) ? (X) : (Y))
+#endif
+
+void enc401_hw_init(struct link_encoder *enc)
+{
+       struct dcn10_link_encoder *enc10 = TO_DCN10_LINK_ENC(enc);
+
+/*
+       00 - DP_AUX_DPHY_RX_DETECTION_THRESHOLD__1to2 : 1/2
+       01 - DP_AUX_DPHY_RX_DETECTION_THRESHOLD__3to4 : 3/4
+       02 - DP_AUX_DPHY_RX_DETECTION_THRESHOLD__7to8 : 7/8
+       03 - DP_AUX_DPHY_RX_DETECTION_THRESHOLD__15to16 : 15/16
+       04 - DP_AUX_DPHY_RX_DETECTION_THRESHOLD__31to32 : 31/32
+       05 - DP_AUX_DPHY_RX_DETECTION_THRESHOLD__63to64 : 63/64
+       06 - DP_AUX_DPHY_RX_DETECTION_THRESHOLD__127to128 : 127/128
+       07 - DP_AUX_DPHY_RX_DETECTION_THRESHOLD__255to256 : 255/256
+*/
+
+/*
+       AUX_REG_UPDATE_5(AUX_DPHY_RX_CONTROL0,
+       AUX_RX_START_WINDOW = 1 [6:4]
+       AUX_RX_RECEIVE_WINDOW = 1 default is 2 [10:8]
+       AUX_RX_HALF_SYM_DETECT_LEN  = 1 [13:12] default is 1
+       AUX_RX_TRANSITION_FILTER_EN = 1 [16] default is 1
+       AUX_RX_ALLOW_BELOW_THRESHOLD_PHASE_DETECT [17] is 0  default is 0
+       AUX_RX_ALLOW_BELOW_THRESHOLD_START [18] is 1  default is 1
+       AUX_RX_ALLOW_BELOW_THRESHOLD_STOP [19] is 1  default is 1
+       AUX_RX_PHASE_DETECT_LEN,  [21,20] = 0x3 default is 3
+       AUX_RX_DETECTION_THRESHOLD [30:28] = 1
+*/
+       AUX_REG_WRITE(AUX_DPHY_RX_CONTROL0, 0x103d1110);
+
+       AUX_REG_WRITE(AUX_DPHY_TX_CONTROL, 0x21c7a);
+
+       //AUX_DPHY_TX_REF_CONTROL'AUX_TX_REF_DIV HW default is 0x32;
+       // Set AUX_TX_REF_DIV Divider to generate 2 MHz reference from refclk
+       // 27MHz -> 0xd
+       // 100MHz -> 0x32
+       // 48MHz -> 0x18
+
+       // Set TMDS_CTL0 to 1.  This is a legacy setting.
+       REG_UPDATE(TMDS_CTL_BITS, TMDS_CTL0, 1);
+
+       dcn10_aux_initialize(enc10);
+}
+
+
+void dcn401_link_encoder_enable_dp_output(
+       struct link_encoder *enc,
+       const struct dc_link_settings *link_settings,
+       enum clock_source_id clock_source)
+{
+       if (!enc->ctx->dc->debug.avoid_vbios_exec_table) {
+               dcn10_link_encoder_enable_dp_output(enc, link_settings, clock_source);
+               return;
+       }
+}
+
+void dcn401_link_encoder_setup(
+       struct link_encoder *enc,
+       enum signal_type signal)
+{
+       struct dcn10_link_encoder *enc10 = TO_DCN10_LINK_ENC(enc);
+
+       switch (signal) {
+       case SIGNAL_TYPE_EDP:
+       case SIGNAL_TYPE_DISPLAY_PORT:
+               /* DP SST */
+               REG_UPDATE(DIG_BE_CLK_CNTL, DIG_BE_MODE, 0);
+               break;
+       case SIGNAL_TYPE_DVI_SINGLE_LINK:
+       case SIGNAL_TYPE_DVI_DUAL_LINK:
+               /* TMDS-DVI */
+               REG_UPDATE(DIG_BE_CLK_CNTL, DIG_BE_MODE, 2);
+               break;
+       case SIGNAL_TYPE_HDMI_TYPE_A:
+               /* TMDS-HDMI */
+               REG_UPDATE(DIG_BE_CLK_CNTL, DIG_BE_MODE, 3);
+               break;
+       case SIGNAL_TYPE_DISPLAY_PORT_MST:
+               /* DP MST */
+               REG_UPDATE(DIG_BE_CLK_CNTL, DIG_BE_MODE, 5);
+               break;
+       default:
+               ASSERT_CRITICAL(false);
+               /* invalid mode ! */
+               break;
+       }
+       REG_UPDATE(DIG_BE_CLK_CNTL, DIG_BE_CLK_EN, 1);
+       REG_UPDATE(DIG_BE_EN_CNTL, DIG_BE_ENABLE, 1);
+}
+
+bool dcn401_is_dig_enabled(struct link_encoder *enc)
+{
+       uint32_t clk_enabled;
+       uint32_t dig_enabled;
+       struct dcn10_link_encoder *enc10 = TO_DCN10_LINK_ENC(enc);
+
+       REG_GET(DIG_BE_CLK_CNTL, DIG_BE_CLK_EN, &clk_enabled);
+       REG_GET(DIG_BE_EN_CNTL, DIG_BE_ENABLE, &dig_enabled);
+       return (clk_enabled == 1 && dig_enabled == 1);
+}
+
+enum signal_type dcn401_get_dig_mode(
+       struct link_encoder *enc)
+{
+       struct dcn10_link_encoder *enc10 = TO_DCN10_LINK_ENC(enc);
+       uint32_t value;
+       REG_GET(DIG_BE_CLK_CNTL, DIG_BE_MODE, &value);
+       switch (value) {
+       case 0:
+               return SIGNAL_TYPE_DISPLAY_PORT;
+       case 2:
+               return SIGNAL_TYPE_DVI_SINGLE_LINK;
+       case 3:
+               return SIGNAL_TYPE_HDMI_TYPE_A;
+       case 5:
+               return SIGNAL_TYPE_DISPLAY_PORT_MST;
+       default:
+               return SIGNAL_TYPE_NONE;
+       }
+}
+
+static const struct link_encoder_funcs dcn401_link_enc_funcs = {
+       .read_state = link_enc2_read_state,
+       .validate_output_with_stream =
+                       dcn30_link_encoder_validate_output_with_stream,
+       .hw_init = enc401_hw_init,
+       .setup = dcn401_link_encoder_setup,
+       .enable_tmds_output = dcn10_link_encoder_enable_tmds_output,
+       .enable_dp_output = dcn401_link_encoder_enable_dp_output,
+       .enable_dp_mst_output = dcn10_link_encoder_enable_dp_mst_output,
+       .disable_output = dcn10_link_encoder_disable_output,
+       .dp_set_lane_settings = dcn10_link_encoder_dp_set_lane_settings,
+       .dp_set_phy_pattern = dcn10_link_encoder_dp_set_phy_pattern,
+       .update_mst_stream_allocation_table =
+               dcn10_link_encoder_update_mst_stream_allocation_table,
+       .psr_program_dp_dphy_fast_training =
+                       dcn10_psr_program_dp_dphy_fast_training,
+       .psr_program_secondary_packet = dcn10_psr_program_secondary_packet,
+       .connect_dig_be_to_fe = dcn10_link_encoder_connect_dig_be_to_fe,
+       .enable_hpd = dcn10_link_encoder_enable_hpd,
+       .disable_hpd = dcn10_link_encoder_disable_hpd,
+       .is_dig_enabled = dcn401_is_dig_enabled,
+       .destroy = dcn10_link_encoder_destroy,
+       .fec_set_enable = enc2_fec_set_enable,
+       .fec_set_ready = enc2_fec_set_ready,
+       .fec_is_active = enc2_fec_is_active,
+       .get_dig_frontend = dcn10_get_dig_frontend,
+       .get_dig_mode = dcn401_get_dig_mode,
+       .is_in_alt_mode = dcn32_link_encoder_is_in_alt_mode,
+       .get_max_link_cap = dcn32_link_encoder_get_max_link_cap,
+       .set_dio_phy_mux = dcn31_link_encoder_set_dio_phy_mux,
+};
+
+void dcn401_link_encoder_construct(
+       struct dcn20_link_encoder *enc20,
+       const struct encoder_init_data *init_data,
+       const struct encoder_feature_support *enc_features,
+       const struct dcn10_link_enc_registers *link_regs,
+       const struct dcn10_link_enc_aux_registers *aux_regs,
+       const struct dcn10_link_enc_hpd_registers *hpd_regs,
+       const struct dcn10_link_enc_shift *link_shift,
+       const struct dcn10_link_enc_mask *link_mask)
+{
+       struct bp_connector_speed_cap_info bp_cap_info = {0};
+       const struct dc_vbios_funcs *bp_funcs = init_data->ctx->dc_bios->funcs;
+       enum bp_result result = BP_RESULT_OK;
+       struct dcn10_link_encoder *enc10 = &enc20->enc10;
+
+       enc10->base.funcs = &dcn401_link_enc_funcs;
+       enc10->base.ctx = init_data->ctx;
+       enc10->base.id = init_data->encoder;
+
+       enc10->base.hpd_source = init_data->hpd_source;
+       enc10->base.connector = init_data->connector;
+
+
+       enc10->base.preferred_engine = ENGINE_ID_UNKNOWN;
+
+       enc10->base.features = *enc_features;
+       if (enc10->base.connector.id == CONNECTOR_ID_USBC)
+               enc10->base.features.flags.bits.DP_IS_USB_C = 1;
+
+       enc10->base.transmitter = init_data->transmitter;
+
+       /* set the flag to indicate whether driver poll the I2C data pin
+        * while doing the DP sink detect
+        */
+
+/*     if (dal_adapter_service_is_feature_supported(as,
+               FEATURE_DP_SINK_DETECT_POLL_DATA_PIN))
+               enc10->base.features.flags.bits.
+                       DP_SINK_DETECT_POLL_DATA_PIN = true;*/
+
+       enc10->base.output_signals =
+               SIGNAL_TYPE_DVI_SINGLE_LINK |
+               SIGNAL_TYPE_DVI_DUAL_LINK |
+               SIGNAL_TYPE_LVDS |
+               SIGNAL_TYPE_DISPLAY_PORT |
+               SIGNAL_TYPE_DISPLAY_PORT_MST |
+               SIGNAL_TYPE_EDP |
+               SIGNAL_TYPE_HDMI_TYPE_A;
+
+       enc10->link_regs = link_regs;
+       enc10->aux_regs = aux_regs;
+       enc10->hpd_regs = hpd_regs;
+       enc10->link_shift = link_shift;
+       enc10->link_mask = link_mask;
+
+       switch (enc10->base.transmitter) {
+       case TRANSMITTER_UNIPHY_A:
+               enc10->base.preferred_engine = ENGINE_ID_DIGA;
+       break;
+       case TRANSMITTER_UNIPHY_B:
+               enc10->base.preferred_engine = ENGINE_ID_DIGB;
+       break;
+       case TRANSMITTER_UNIPHY_C:
+               enc10->base.preferred_engine = ENGINE_ID_DIGC;
+       break;
+       case TRANSMITTER_UNIPHY_D:
+               enc10->base.preferred_engine = ENGINE_ID_DIGD;
+       break;
+       case TRANSMITTER_UNIPHY_E:
+               enc10->base.preferred_engine = ENGINE_ID_DIGE;
+       break;
+       default:
+               ASSERT_CRITICAL(false);
+               enc10->base.preferred_engine = ENGINE_ID_UNKNOWN;
+       }
+
+       /* default to one to mirror Windows behavior */
+       enc10->base.features.flags.bits.HDMI_6GB_EN = 1;
+
+       if (bp_funcs->get_connector_speed_cap_info)
+               result = bp_funcs->get_connector_speed_cap_info(enc10->base.ctx->dc_bios,
+                                               enc10->base.connector, &bp_cap_info);
+
+       /* Override features with DCE-specific values */
+       if (result == BP_RESULT_OK) {
+               enc10->base.features.flags.bits.IS_HBR2_CAPABLE =
+                               bp_cap_info.DP_HBR2_EN;
+               enc10->base.features.flags.bits.IS_HBR3_CAPABLE =
+                               bp_cap_info.DP_HBR3_EN;
+               enc10->base.features.flags.bits.HDMI_6GB_EN = bp_cap_info.HDMI_6GB_EN;
+               enc10->base.features.flags.bits.IS_DP2_CAPABLE = 1;
+               enc10->base.features.flags.bits.IS_UHBR10_CAPABLE = bp_cap_info.DP_UHBR10_EN;
+               enc10->base.features.flags.bits.IS_UHBR13_5_CAPABLE = bp_cap_info.DP_UHBR13_5_EN;
+               enc10->base.features.flags.bits.IS_UHBR20_CAPABLE = bp_cap_info.DP_UHBR20_EN;
+       } else {
+               DC_LOG_WARNING("%s: Failed to get encoder_cap_info from VBIOS with error code %d!\n",
+                               __func__,
+                               result);
+       }
+       if (enc10->base.ctx->dc->debug.hdmi20_disable) {
+               enc10->base.features.flags.bits.HDMI_6GB_EN = 0;
+       }
+}
diff --git a/drivers/gpu/drm/amd/display/dc/dio/dcn401/dcn401_dio_link_encoder.h b/drivers/gpu/drm/amd/display/dc/dio/dcn401/dcn401_dio_link_encoder.h
new file mode 100644 (file)
index 0000000..6baab83
--- /dev/null
@@ -0,0 +1,134 @@
+/*
+ * Copyright 2021 Advanced Micro Devices, Inc.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ *  and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+ * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
+ * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+ * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+ * OTHER DEALINGS IN THE SOFTWARE.
+ *
+ * Authors: AMD
+ *
+ */
+
+#ifndef __DC_LINK_ENCODER__DCN401_H__
+#define __DC_LINK_ENCODER__DCN401_H__
+
+#include "dcn30/dcn30_dio_link_encoder.h"
+
+#define LINK_ENCODER_MASK_SH_LIST_DCN401(mask_sh) \
+       LE_SF(DIG0_DIG_BE_EN_CNTL, DIG_BE_ENABLE, mask_sh),\
+       LE_SF(DIG0_DIG_BE_CNTL, DIG_RB_SWITCH_EN, mask_sh),\
+       LE_SF(DIG0_DIG_BE_CNTL, DIG_HPD_SELECT, mask_sh),\
+       LE_SF(DIG0_DIG_BE_CNTL, DIG_FE_SOURCE_SELECT, mask_sh),\
+       LE_SF(DIG0_DIG_BE_CLK_CNTL, DIG_BE_MODE, mask_sh),\
+       LE_SF(DIG0_DIG_BE_CLK_CNTL, DIG_BE_CLK_EN, mask_sh),\
+       LE_SF(DIG0_DIG_BE_CLK_CNTL, DIG_BE_SOFT_RESET, mask_sh),\
+       LE_SF(DIG0_DIG_BE_CLK_CNTL, HDCP_SOFT_RESET, mask_sh),\
+       LE_SF(DIG0_DIG_BE_CLK_CNTL, DIG_BE_SYMCLK_G_CLOCK_ON, mask_sh),\
+       LE_SF(DIG0_DIG_BE_CLK_CNTL, DIG_BE_SYMCLK_G_HDCP_CLOCK_ON, mask_sh),\
+       LE_SF(DIG0_DIG_BE_CLK_CNTL, DIG_BE_SYMCLK_G_TMDS_CLOCK_ON, mask_sh),\
+       LE_SF(DIG0_DIG_CLOCK_PATTERN, DIG_CLOCK_PATTERN, mask_sh),\
+       LE_SF(DIG0_TMDS_CTL_BITS, TMDS_CTL0, mask_sh), \
+       LE_SF(DP0_DP_DPHY_CNTL, DPHY_BYPASS, mask_sh),\
+       LE_SF(DP0_DP_DPHY_CNTL, DPHY_ATEST_SEL_LANE0, mask_sh),\
+       LE_SF(DP0_DP_DPHY_CNTL, DPHY_ATEST_SEL_LANE1, mask_sh),\
+       LE_SF(DP0_DP_DPHY_CNTL, DPHY_ATEST_SEL_LANE2, mask_sh),\
+       LE_SF(DP0_DP_DPHY_CNTL, DPHY_ATEST_SEL_LANE3, mask_sh),\
+       LE_SF(DP0_DP_DPHY_PRBS_CNTL, DPHY_PRBS_EN, mask_sh),\
+       LE_SF(DP0_DP_DPHY_PRBS_CNTL, DPHY_PRBS_SEL, mask_sh),\
+       LE_SF(DP0_DP_DPHY_SYM0, DPHY_SYM1, mask_sh),\
+       LE_SF(DP0_DP_DPHY_SYM0, DPHY_SYM2, mask_sh),\
+       LE_SF(DP0_DP_DPHY_SYM0, DPHY_SYM3, mask_sh),\
+       LE_SF(DP0_DP_DPHY_SYM1, DPHY_SYM4, mask_sh),\
+       LE_SF(DP0_DP_DPHY_SYM1, DPHY_SYM5, mask_sh),\
+       LE_SF(DP0_DP_DPHY_SYM1, DPHY_SYM6, mask_sh),\
+       LE_SF(DP0_DP_DPHY_SYM2, DPHY_SYM7, mask_sh),\
+       LE_SF(DP0_DP_DPHY_SYM2, DPHY_SYM8, mask_sh),\
+       LE_SF(DP0_DP_DPHY_SCRAM_CNTL, DPHY_SCRAMBLER_BS_COUNT, mask_sh),\
+       LE_SF(DP0_DP_DPHY_SCRAM_CNTL, DPHY_SCRAMBLER_ADVANCE, mask_sh),\
+       LE_SF(DP0_DP_DPHY_FAST_TRAINING, DPHY_RX_FAST_TRAINING_CAPABLE, mask_sh),\
+       LE_SF(DP0_DP_DPHY_BS_SR_SWAP_CNTL, DPHY_LOAD_BS_COUNT, mask_sh),\
+       LE_SF(DP0_DP_DPHY_TRAINING_PATTERN_SEL, DPHY_TRAINING_PATTERN_SEL, mask_sh),\
+       LE_SF(DP0_DP_DPHY_HBR2_PATTERN_CONTROL, DP_DPHY_HBR2_PATTERN_CONTROL, mask_sh),\
+       LE_SF(DP0_DP_LINK_CNTL, DP_LINK_TRAINING_COMPLETE, mask_sh),\
+       LE_SF(DP0_DP_LINK_FRAMING_CNTL, DP_IDLE_BS_INTERVAL, mask_sh),\
+       LE_SF(DP0_DP_LINK_FRAMING_CNTL, DP_VBID_DISABLE, mask_sh),\
+       LE_SF(DP0_DP_LINK_FRAMING_CNTL, DP_VID_ENHANCED_FRAME_MODE, mask_sh),\
+       LE_SF(DP0_DP_VID_STREAM_CNTL, DP_VID_STREAM_ENABLE, mask_sh),\
+       LE_SF(DP0_DP_CONFIG, DP_UDI_LANES, mask_sh),\
+       LE_SF(DP0_DP_SEC_CNTL1, DP_SEC_GSP0_LINE_NUM, mask_sh),\
+       LE_SF(DP0_DP_SEC_CNTL1, DP_SEC_GSP0_PRIORITY, mask_sh),\
+       LE_SF(DP0_DP_MSE_SAT0, DP_MSE_SAT_SRC0, mask_sh),\
+       LE_SF(DP0_DP_MSE_SAT0, DP_MSE_SAT_SRC1, mask_sh),\
+       LE_SF(DP0_DP_MSE_SAT0, DP_MSE_SAT_SLOT_COUNT0, mask_sh),\
+       LE_SF(DP0_DP_MSE_SAT0, DP_MSE_SAT_SLOT_COUNT1, mask_sh),\
+       LE_SF(DP0_DP_MSE_SAT1, DP_MSE_SAT_SRC2, mask_sh),\
+       LE_SF(DP0_DP_MSE_SAT1, DP_MSE_SAT_SRC3, mask_sh),\
+       LE_SF(DP0_DP_MSE_SAT1, DP_MSE_SAT_SLOT_COUNT2, mask_sh),\
+       LE_SF(DP0_DP_MSE_SAT1, DP_MSE_SAT_SLOT_COUNT3, mask_sh),\
+       LE_SF(DP0_DP_MSE_SAT_UPDATE, DP_MSE_SAT_UPDATE, mask_sh),\
+       LE_SF(DP0_DP_MSE_SAT_UPDATE, DP_MSE_16_MTP_KEEPOUT, mask_sh),\
+       LE_SF(DP_AUX0_AUX_CONTROL, AUX_HPD_SEL, mask_sh),\
+       LE_SF(DP_AUX0_AUX_CONTROL, AUX_LS_READ_EN, mask_sh),\
+       LE_SF(DP_AUX0_AUX_DPHY_RX_CONTROL0, AUX_RX_RECEIVE_WINDOW, mask_sh),\
+       LE_SF(HPD0_DC_HPD_CONTROL, DC_HPD_EN, mask_sh),\
+       LE_SF(DP0_DP_DPHY_CNTL, DPHY_FEC_EN, mask_sh),\
+       LE_SF(DP0_DP_DPHY_CNTL, DPHY_FEC_READY_SHADOW, mask_sh),\
+       LE_SF(DP0_DP_DPHY_CNTL, DPHY_FEC_ACTIVE_STATUS, mask_sh),\
+       LE_SF(DIG0_TMDS_CTL_BITS, TMDS_CTL0, mask_sh), \
+       LE_SF(DP_AUX0_AUX_DPHY_RX_CONTROL0, AUX_RX_START_WINDOW, mask_sh),\
+       LE_SF(DP_AUX0_AUX_DPHY_RX_CONTROL0, AUX_RX_HALF_SYM_DETECT_LEN, mask_sh),\
+       LE_SF(DP_AUX0_AUX_DPHY_RX_CONTROL0, AUX_RX_TRANSITION_FILTER_EN, mask_sh),\
+       LE_SF(DP_AUX0_AUX_DPHY_RX_CONTROL0, AUX_RX_ALLOW_BELOW_THRESHOLD_PHASE_DETECT, mask_sh),\
+       LE_SF(DP_AUX0_AUX_DPHY_RX_CONTROL0, AUX_RX_ALLOW_BELOW_THRESHOLD_START, mask_sh),\
+       LE_SF(DP_AUX0_AUX_DPHY_RX_CONTROL0, AUX_RX_ALLOW_BELOW_THRESHOLD_STOP, mask_sh),\
+       LE_SF(DP_AUX0_AUX_DPHY_RX_CONTROL0, AUX_RX_PHASE_DETECT_LEN, mask_sh),\
+       LE_SF(DP_AUX0_AUX_DPHY_RX_CONTROL0, AUX_RX_DETECTION_THRESHOLD, mask_sh), \
+       LE_SF(DP_AUX0_AUX_DPHY_TX_CONTROL, AUX_TX_PRECHARGE_LEN, mask_sh),\
+       LE_SF(DP_AUX0_AUX_DPHY_TX_CONTROL, AUX_TX_PRECHARGE_SYMBOLS, mask_sh),\
+       LE_SF(DP_AUX0_AUX_DPHY_TX_CONTROL, AUX_MODE_DET_CHECK_DELAY, mask_sh),\
+       LE_SF(DP_AUX0_AUX_DPHY_RX_CONTROL1, AUX_RX_PRECHARGE_SKIP, mask_sh),\
+       LE_SF(DP_AUX0_AUX_DPHY_RX_CONTROL1, AUX_RX_TIMEOUT_LEN, mask_sh),\
+       LE_SF(DP_AUX0_AUX_DPHY_RX_CONTROL1, AUX_RX_TIMEOUT_LEN_MUL, mask_sh)
+
+void dcn401_link_encoder_construct(
+       struct dcn20_link_encoder *enc20,
+       const struct encoder_init_data *init_data,
+       const struct encoder_feature_support *enc_features,
+       const struct dcn10_link_enc_registers *link_regs,
+       const struct dcn10_link_enc_aux_registers *aux_regs,
+       const struct dcn10_link_enc_hpd_registers *hpd_regs,
+       const struct dcn10_link_enc_shift *link_shift,
+       const struct dcn10_link_enc_mask *link_mask);
+
+void enc401_hw_init(struct link_encoder *enc);
+
+void dcn401_link_encoder_enable_dp_output(
+       struct link_encoder *enc,
+       const struct dc_link_settings *link_settings,
+       enum clock_source_id clock_source);
+
+void dcn401_link_encoder_setup(
+       struct link_encoder *enc,
+       enum signal_type signal);
+
+enum signal_type dcn401_get_dig_mode(
+       struct link_encoder *enc);
+
+bool dcn401_is_dig_enabled(struct link_encoder *enc);
+
+enum signal_type dcn401_get_dig_mode(struct link_encoder *enc);
+#endif /* __DC_LINK_ENCODER__DCN401_H__ */
diff --git a/drivers/gpu/drm/amd/display/dc/dio/dcn401/dcn401_dio_stream_encoder.c b/drivers/gpu/drm/amd/display/dc/dio/dcn401/dcn401_dio_stream_encoder.c
new file mode 100644 (file)
index 0000000..0a27e09
--- /dev/null
@@ -0,0 +1,857 @@
+/*
+ * Copyright 2021 Advanced Micro Devices, Inc.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ *  and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+ * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
+ * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+ * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+ * OTHER DEALINGS IN THE SOFTWARE.
+ *
+ * Authors: AMD
+ *
+ */
+
+
+#include "dc_bios_types.h"
+#include "dcn30/dcn30_dio_stream_encoder.h"
+#include "dcn32/dcn32_dio_stream_encoder.h"
+#include "dcn35/dcn35_dio_stream_encoder.h"
+
+#include "dcn401_dio_stream_encoder.h"
+#include "reg_helper.h"
+#include "hw_shared.h"
+#include "link.h"
+#include "dpcd_defs.h"
+
+#define DC_LOGGER \
+               enc1->base.ctx->logger
+
+#define REG(reg)\
+       (enc1->regs->reg)
+
+#undef FN
+#define FN(reg_name, field_name) \
+       enc1->se_shift->field_name, enc1->se_mask->field_name
+
+#define VBI_LINE_0 0
+#define HDMI_CLOCK_CHANNEL_RATE_MORE_340M 340000
+
+#define CTX \
+       enc1->base.ctx
+
+
+
+static void enc401_dp_set_odm_combine(
+       struct stream_encoder *enc,
+       bool odm_combine)
+{
+}
+
+/* setup stream encoder in dvi mode */
+static void enc401_stream_encoder_dvi_set_stream_attribute(
+       struct stream_encoder *enc,
+       struct dc_crtc_timing *crtc_timing,
+       bool is_dual_link)
+{
+       struct dcn10_stream_encoder *enc1 = DCN10STRENC_FROM_STRENC(enc);
+
+       if (!enc->ctx->dc->debug.avoid_vbios_exec_table) {
+               struct bp_encoder_control cntl = {0};
+
+               cntl.action = ENCODER_CONTROL_SETUP;
+               cntl.engine_id = enc1->base.id;
+               cntl.signal = is_dual_link ?
+                       SIGNAL_TYPE_DVI_DUAL_LINK : SIGNAL_TYPE_DVI_SINGLE_LINK;
+               cntl.enable_dp_audio = false;
+               cntl.pixel_clock = crtc_timing->pix_clk_100hz / 10;
+               cntl.lanes_number = (is_dual_link) ? LANE_COUNT_EIGHT : LANE_COUNT_FOUR;
+
+               if (enc1->base.bp->funcs->encoder_control(
+                               enc1->base.bp, &cntl) != BP_RESULT_OK)
+                       return;
+
+       } else {
+
+               //Set pattern for clock channel, default vlue 0x63 does not work
+               REG_UPDATE(DIG_CLOCK_PATTERN, DIG_CLOCK_PATTERN, 0x1F);
+
+               //DIG_BE_TMDS_DVI_MODE : TMDS-DVI mode is already set in link_encoder_setup
+
+               //DIG_SOURCE_SELECT is already set in dig_connect_to_otg
+
+               /* DIG_START is removed from the register spec */
+       }
+
+       ASSERT(crtc_timing->pixel_encoding == PIXEL_ENCODING_RGB);
+       ASSERT(crtc_timing->display_color_depth == COLOR_DEPTH_888);
+       enc401_stream_encoder_set_stream_attribute_helper(enc1, crtc_timing);
+}
+
+/* setup stream encoder in hdmi mode */
+static void enc401_stream_encoder_hdmi_set_stream_attribute(
+       struct stream_encoder *enc,
+       struct dc_crtc_timing *crtc_timing,
+       int actual_pix_clk_khz,
+       bool enable_audio)
+{
+       struct dcn10_stream_encoder *enc1 = DCN10STRENC_FROM_STRENC(enc);
+
+       if (!enc->ctx->dc->debug.avoid_vbios_exec_table) {
+               struct bp_encoder_control cntl = {0};
+
+               cntl.action = ENCODER_CONTROL_SETUP;
+               cntl.engine_id = enc1->base.id;
+               cntl.signal = SIGNAL_TYPE_HDMI_TYPE_A;
+               cntl.enable_dp_audio = enable_audio;
+               cntl.pixel_clock = actual_pix_clk_khz;
+               cntl.lanes_number = LANE_COUNT_FOUR;
+
+               if (enc1->base.bp->funcs->encoder_control(
+                               enc1->base.bp, &cntl) != BP_RESULT_OK)
+                       return;
+
+       } else {
+
+               //Set pattern for clock channel, default vlue 0x63 does not work
+               REG_UPDATE(DIG_CLOCK_PATTERN, DIG_CLOCK_PATTERN, 0x1F);
+
+               //DIG_BE_TMDS_HDMI_MODE : TMDS-HDMI mode is already set in link_encoder_setup
+
+               //DIG_SOURCE_SELECT is already set in dig_connect_to_otg
+
+               /* DIG_START is removed from the register spec */
+       }
+
+       /* Configure pixel encoding */
+       enc401_stream_encoder_set_stream_attribute_helper(enc1, crtc_timing);
+
+       /* setup HDMI engine */
+       REG_UPDATE_6(HDMI_CONTROL,
+               HDMI_PACKET_GEN_VERSION, 1,
+               HDMI_KEEPOUT_MODE, 1,
+               HDMI_DEEP_COLOR_ENABLE, 0,
+               HDMI_DATA_SCRAMBLE_EN, 0,
+               HDMI_NO_EXTRA_NULL_PACKET_FILLED, 1,
+               HDMI_CLOCK_CHANNEL_RATE, 0);
+
+       /* Configure color depth */
+       switch (crtc_timing->display_color_depth) {
+       case COLOR_DEPTH_888:
+               REG_UPDATE(HDMI_CONTROL, HDMI_DEEP_COLOR_DEPTH, 0);
+               break;
+       case COLOR_DEPTH_101010:
+               if (crtc_timing->pixel_encoding == PIXEL_ENCODING_YCBCR422) {
+                       REG_UPDATE_2(HDMI_CONTROL,
+                                       HDMI_DEEP_COLOR_DEPTH, 1,
+                                       HDMI_DEEP_COLOR_ENABLE, 0);
+               } else {
+                       REG_UPDATE_2(HDMI_CONTROL,
+                                       HDMI_DEEP_COLOR_DEPTH, 1,
+                                       HDMI_DEEP_COLOR_ENABLE, 1);
+                       }
+               break;
+       case COLOR_DEPTH_121212:
+               if (crtc_timing->pixel_encoding == PIXEL_ENCODING_YCBCR422) {
+                       REG_UPDATE_2(HDMI_CONTROL,
+                                       HDMI_DEEP_COLOR_DEPTH, 2,
+                                       HDMI_DEEP_COLOR_ENABLE, 0);
+               } else {
+                       REG_UPDATE_2(HDMI_CONTROL,
+                                       HDMI_DEEP_COLOR_DEPTH, 2,
+                                       HDMI_DEEP_COLOR_ENABLE, 1);
+                       }
+               break;
+       case COLOR_DEPTH_161616:
+               REG_UPDATE_2(HDMI_CONTROL,
+                               HDMI_DEEP_COLOR_DEPTH, 3,
+                               HDMI_DEEP_COLOR_ENABLE, 1);
+               break;
+       default:
+               break;
+       }
+
+       if (actual_pix_clk_khz >= HDMI_CLOCK_CHANNEL_RATE_MORE_340M) {
+               /* enable HDMI data scrambler
+                * HDMI_CLOCK_CHANNEL_RATE_MORE_340M
+                * Clock channel frequency is 1/4 of character rate.
+                */
+               REG_UPDATE_2(HDMI_CONTROL,
+                       HDMI_DATA_SCRAMBLE_EN, 1,
+                       HDMI_CLOCK_CHANNEL_RATE, 1);
+       } else if (crtc_timing->flags.LTE_340MCSC_SCRAMBLE) {
+
+               /* TODO: New feature for DCE11, still need to implement */
+
+               /* enable HDMI data scrambler
+                * HDMI_CLOCK_CHANNEL_FREQ_EQUAL_TO_CHAR_RATE
+                * Clock channel frequency is the same
+                * as character rate
+                */
+               REG_UPDATE_2(HDMI_CONTROL,
+                       HDMI_DATA_SCRAMBLE_EN, 1,
+                       HDMI_CLOCK_CHANNEL_RATE, 0);
+       }
+
+
+       /* Enable transmission of General Control packet on every frame */
+       REG_UPDATE_3(HDMI_VBI_PACKET_CONTROL,
+               HDMI_GC_CONT, 1,
+               HDMI_GC_SEND, 1,
+               HDMI_NULL_SEND, 1);
+
+       /* Disable Audio Content Protection packet transmission */
+       REG_UPDATE(HDMI_VBI_PACKET_CONTROL, HDMI_ACP_SEND, 0);
+       /* following belongs to audio */
+       /* Enable Audio InfoFrame packet transmission. */
+       REG_UPDATE(HDMI_INFOFRAME_CONTROL0, HDMI_AUDIO_INFO_SEND, 1);
+
+       /* update double-buffered AUDIO_INFO registers immediately */
+       ASSERT(enc->afmt);
+       enc->afmt->funcs->audio_info_immediate_update(enc->afmt);
+
+       /* Select line number on which to send Audio InfoFrame packets */
+       REG_UPDATE(HDMI_INFOFRAME_CONTROL1, HDMI_AUDIO_INFO_LINE,
+                               VBI_LINE_0 + 2);
+
+       /* set HDMI GC AVMUTE */
+       REG_UPDATE(HDMI_GC, HDMI_GC_AVMUTE, 0);
+}
+
+static void enc401_set_dig_input_mode(struct stream_encoder *enc, unsigned int pix_per_container)
+{
+       struct dcn10_stream_encoder *enc1 = DCN10STRENC_FROM_STRENC(enc);
+
+       // The naming of this field is confusing, what it means is the output mode of otg, which
+       // is the input mode of the dig
+       switch (pix_per_container)      {
+       case 2:
+               REG_UPDATE(DIG_FIFO_CTRL0, DIG_FIFO_OUTPUT_PIXEL_PER_CYCLE, 0x1);
+               break;
+       case 4:
+               REG_UPDATE(DIG_FIFO_CTRL0, DIG_FIFO_OUTPUT_PIXEL_PER_CYCLE, 0x2);
+               break;
+       case 8:
+               REG_UPDATE(DIG_FIFO_CTRL0, DIG_FIFO_OUTPUT_PIXEL_PER_CYCLE, 0x3);
+               break;
+       default:
+               REG_UPDATE(DIG_FIFO_CTRL0, DIG_FIFO_OUTPUT_PIXEL_PER_CYCLE, 0x0);
+               break;
+       }
+}
+
+static bool is_two_pixels_per_containter(const struct dc_crtc_timing *timing)
+{
+       bool two_pix = timing->pixel_encoding == PIXEL_ENCODING_YCBCR420;
+
+       two_pix = two_pix || (timing->flags.DSC && timing->pixel_encoding == PIXEL_ENCODING_YCBCR422
+                       && !timing->dsc_cfg.ycbcr422_simple);
+       return two_pix;
+}
+
+static void enc401_stream_encoder_dp_unblank(
+               struct dc_link *link,
+               struct stream_encoder *enc,
+               const struct encoder_unblank_param *param)
+{
+       struct dcn10_stream_encoder *enc1 = DCN10STRENC_FROM_STRENC(enc);
+
+       if (param->link_settings.link_rate != LINK_RATE_UNKNOWN) {
+               uint32_t n_vid = 0x8000;
+               uint32_t m_vid;
+               uint32_t pix_per_container = 1;
+               uint64_t m_vid_l = n_vid;
+
+               /* YCbCr 4:2:0 or YCbCr4:2:2 simple + DSC: Computed VID_M will be 2X the input rate */
+               if (is_two_pixels_per_containter(&param->timing)) {
+                       pix_per_container = 2;
+               }
+
+               /* M / N = Fstream / Flink
+                * m_vid / n_vid = pixel rate / link rate
+                */
+               m_vid_l *= param->timing.pix_clk_100hz / pix_per_container / 10;
+               m_vid_l = div_u64(m_vid_l,
+                       param->link_settings.link_rate
+                               * LINK_RATE_REF_FREQ_IN_KHZ);
+
+               m_vid = (uint32_t) m_vid_l;
+
+               /* enable auto measurement */
+
+               REG_UPDATE(DP_VID_TIMING, DP_VID_M_N_GEN_EN, 0);
+
+               /* auto measurement need 1 full 0x8000 symbol cycle to kick in,
+                * therefore program initial value for Mvid and Nvid
+                */
+
+               REG_UPDATE(DP_VID_N, DP_VID_N, n_vid);
+
+               REG_UPDATE(DP_VID_M, DP_VID_M, m_vid);
+
+               /* reduce jitter based on read rate */
+               switch (param->pix_per_cycle)   {
+               case 2:
+                       REG_UPDATE(DP_VID_TIMING, DP_VID_N_INTERVAL, 0x1);
+                       break;
+               case 4:
+                       REG_UPDATE(DP_VID_TIMING, DP_VID_N_INTERVAL, 0x2);
+                       break;
+               case 8:
+                       REG_UPDATE(DP_VID_TIMING, DP_VID_N_INTERVAL, 0x3);
+                       break;
+               default:
+                       REG_UPDATE(DP_VID_TIMING, DP_VID_N_INTERVAL, 0x0);
+                       break;
+               }
+
+               REG_UPDATE(DP_VID_TIMING, DP_VID_M_N_GEN_EN, 1);
+       }
+
+       /* make sure stream is disabled before resetting steer fifo */
+       REG_UPDATE(DP_VID_STREAM_CNTL, DP_VID_STREAM_ENABLE, false);
+       REG_WAIT(DP_VID_STREAM_CNTL, DP_VID_STREAM_STATUS, 0, 10, 5000);
+
+       /* DIG_START is removed from the register spec */
+
+       /* switch DP encoder to CRTC data, but reset it the fifo first. It may happen
+        * that it overflows during mode transition, and sometimes doesn't recover.
+        */
+       REG_UPDATE(DP_STEER_FIFO, DP_STEER_FIFO_RESET, 1);
+       udelay(10);
+
+       REG_UPDATE(DP_STEER_FIFO, DP_STEER_FIFO_RESET, 0);
+
+       REG_UPDATE(DP_STEER_FIFO, DP_STEER_FIFO_ENABLE, 1);
+
+       REG_UPDATE_2(DP_VID_STREAM_CNTL, DP_VID_STREAM_ENABLE, 1, DP_VID_STREAM_DIS_DEFER, 2);
+       udelay(200);
+
+       /* DIG Resync FIFO now needs to be explicitly enabled
+        */
+       /* read start level = 0 will bring underflow / overflow and DIG_FIFO_ERROR = 1
+        * so set it to 1/2 full = 7 before reset as suggested by hardware team.
+        */
+       REG_UPDATE(DIG_FIFO_CTRL0, DIG_FIFO_READ_START_LEVEL, 0x7);
+
+       REG_UPDATE(DIG_FIFO_CTRL0, DIG_FIFO_RESET, 1);
+
+       REG_WAIT(DIG_FIFO_CTRL0, DIG_FIFO_RESET_DONE, 1, 10, 5000);
+
+       REG_UPDATE(DIG_FIFO_CTRL0, DIG_FIFO_RESET, 0);
+
+       REG_WAIT(DIG_FIFO_CTRL0, DIG_FIFO_RESET_DONE, 0, 10, 5000);
+
+       REG_UPDATE(DIG_FIFO_CTRL0, DIG_FIFO_ENABLE, 1);
+
+       /* wait 100us for DIG/DP logic to prime
+        * (i.e. a few video lines)
+        */
+       udelay(100);
+
+       /* the hardware would start sending video at the start of the next DP
+        * frame (i.e. rising edge of the vblank).
+        * NOTE: We used to program DP_VID_STREAM_DIS_DEFER = 2 here, but this
+        * register has no effect on enable transition! HW always guarantees
+        * VID_STREAM enable at start of next frame, and this is not
+        * programmable
+        */
+
+       REG_UPDATE(DP_VID_STREAM_CNTL, DP_VID_STREAM_ENABLE, true);
+
+       link->dc->link_srv->dp_trace_source_sequence(link, DPCD_SOURCE_SEQ_AFTER_ENABLE_DP_VID_STREAM);
+}
+
+/* this function read dsc related register fields to be logged later in dcn10_log_hw_state
+ * into a dcn_dsc_state struct.
+ */
+static void enc401_read_state(struct stream_encoder *enc, struct enc_state *s)
+{
+       struct dcn10_stream_encoder *enc1 = DCN10STRENC_FROM_STRENC(enc);
+
+       //if dsc is enabled, continue to read
+       REG_GET(DP_PIXEL_FORMAT, PIXEL_ENCODING_TYPE, &s->dsc_mode);
+
+       if (s->dsc_mode) {
+               REG_GET(DP_GSP11_CNTL, DP_SEC_GSP11_LINE_NUM, &s->sec_gsp_pps_line_num);
+
+               REG_GET(DP_MSA_VBID_MISC, DP_VBID6_LINE_REFERENCE, &s->vbid6_line_reference);
+               REG_GET(DP_MSA_VBID_MISC, DP_VBID6_LINE_NUM, &s->vbid6_line_num);
+
+               REG_GET(DP_GSP11_CNTL, DP_SEC_GSP11_ENABLE, &s->sec_gsp_pps_enable);
+               REG_GET(DP_SEC_CNTL, DP_SEC_STREAM_ENABLE, &s->sec_stream_enable);
+       }
+}
+
+static void enc401_stream_encoder_enable(
+       struct stream_encoder *enc,
+       enum signal_type signal,
+       bool enable)
+{
+       struct dcn10_stream_encoder *enc1 = DCN10STRENC_FROM_STRENC(enc);
+       if (enable) {
+               switch (signal) {
+               case SIGNAL_TYPE_DVI_SINGLE_LINK:
+               case SIGNAL_TYPE_DVI_DUAL_LINK:
+                       /* TMDS-DVI */
+                       REG_UPDATE(DIG_FE_CLK_CNTL, DIG_FE_MODE, 2);
+                       break;
+               case SIGNAL_TYPE_HDMI_TYPE_A:
+                       /* TMDS-HDMI */
+                       REG_UPDATE(DIG_FE_CLK_CNTL, DIG_FE_MODE, 3);
+                       break;
+               case SIGNAL_TYPE_DISPLAY_PORT_MST:
+                       /* DP MST */
+                       REG_UPDATE(DIG_FE_CLK_CNTL, DIG_FE_MODE, 5);
+                       break;
+               case SIGNAL_TYPE_EDP:
+               case SIGNAL_TYPE_DISPLAY_PORT:
+               case SIGNAL_TYPE_VIRTUAL:
+                       /* DP SST */
+                       REG_UPDATE(DIG_FE_CLK_CNTL, DIG_FE_MODE, 0);
+                       break;
+               default:
+                       /* invalid mode ! */
+                       ASSERT_CRITICAL(false);
+               }
+
+               REG_UPDATE(DIG_FE_CLK_CNTL, DIG_FE_CLK_EN, 1);
+               REG_UPDATE(DIG_FE_EN_CNTL, DIG_FE_ENABLE, 1);
+       } else {
+               REG_UPDATE(DIG_FE_EN_CNTL, DIG_FE_ENABLE, 0);
+               REG_UPDATE(DIG_FE_CLK_CNTL, DIG_FE_CLK_EN, 0);
+       }
+}
+
+void enc401_stream_encoder_dp_set_stream_attribute(
+       struct stream_encoder *enc,
+       struct dc_crtc_timing *crtc_timing,
+       enum dc_color_space output_color_space,
+       bool use_vsc_sdp_for_colorimetry,
+       uint32_t enable_sdp_splitting)
+{
+       uint32_t h_active_start;
+       uint32_t v_active_start;
+       uint32_t misc0 = 0;
+       uint32_t misc1 = 0;
+       uint32_t h_blank;
+       uint32_t h_back_porch;
+       uint8_t synchronous_clock = 0; /* asynchronous mode */
+       uint8_t colorimetry_bpc;
+       uint8_t dp_pixel_encoding = 0;
+       uint8_t dp_component_depth = 0;
+       uint8_t dp_translate_pixel_enc = 0;
+       // Fix set but not used warnings
+       //uint8_t dp_pixel_encoding_type = 0;
+       uint8_t dp_compressed_pixel_format = 0;
+
+       struct dcn10_stream_encoder *enc1 = DCN10STRENC_FROM_STRENC(enc);
+       struct dc_crtc_timing hw_crtc_timing = *crtc_timing;
+
+       if (hw_crtc_timing.flags.INTERLACE) {
+               /*the input timing is in VESA spec format with Interlace flag =1*/
+               hw_crtc_timing.v_total /= 2;
+               hw_crtc_timing.v_border_top /= 2;
+               hw_crtc_timing.v_addressable /= 2;
+               hw_crtc_timing.v_border_bottom /= 2;
+               hw_crtc_timing.v_front_porch /= 2;
+               hw_crtc_timing.v_sync_width /= 2;
+       }
+
+
+       /* set pixel encoding */
+       switch (hw_crtc_timing.pixel_encoding) {
+       case PIXEL_ENCODING_YCBCR422:
+               dp_pixel_encoding = DP_PIXEL_ENCODING_TYPE_YCBCR422;
+               break;
+       case PIXEL_ENCODING_YCBCR444:
+               dp_pixel_encoding = DP_PIXEL_ENCODING_TYPE_YCBCR444;
+
+               if (hw_crtc_timing.flags.Y_ONLY)
+                       if (hw_crtc_timing.display_color_depth != COLOR_DEPTH_666)
+                               /* HW testing only, no use case yet.
+                                * Color depth of Y-only could be
+                                * 8, 10, 12, 16 bits
+                                */
+                               dp_pixel_encoding = DP_PIXEL_ENCODING_TYPE_Y_ONLY;
+
+               /* Note: DP_MSA_MISC1 bit 7 is the indicator
+                * of Y-only mode.
+                * This bit is set in HW if register
+                * DP_PIXEL_ENCODING is programmed to 0x4
+                */
+               break;
+       case PIXEL_ENCODING_YCBCR420:
+               dp_pixel_encoding = DP_PIXEL_ENCODING_TYPE_YCBCR420;
+               break;
+       default:
+               dp_pixel_encoding = DP_PIXEL_ENCODING_TYPE_RGB444;
+               break;
+       }
+
+       misc1 = REG_READ(DP_MSA_MISC);
+       /* For YCbCr420 and BT2020 Colorimetry Formats, VSC SDP shall be used.
+        * When MISC1, bit 6, is Set to 1, a Source device uses a VSC SDP to indicate the
+        * Pixel Encoding/Colorimetry Format and that a Sink device shall ignore MISC1, bit 7,
+        * and MISC0, bits 7:1 (MISC1, bit 7, and MISC0, bits 7:1, become "don't care").
+        */
+       if (use_vsc_sdp_for_colorimetry)
+               misc1 = misc1 | 0x40;
+       else
+               misc1 = misc1 & ~0x40;
+
+       /* set color depth */
+       switch (hw_crtc_timing.display_color_depth) {
+       case COLOR_DEPTH_666:
+               dp_component_depth = DP_COMPONENT_PIXEL_DEPTH_6BPC;
+               break;
+       case COLOR_DEPTH_888:
+               dp_component_depth = DP_COMPONENT_PIXEL_DEPTH_8BPC;
+               break;
+       case COLOR_DEPTH_101010:
+               dp_component_depth = DP_COMPONENT_PIXEL_DEPTH_10BPC;
+               break;
+       case COLOR_DEPTH_121212:
+               dp_component_depth = DP_COMPONENT_PIXEL_DEPTH_12BPC;
+               break;
+       case COLOR_DEPTH_161616:
+               dp_component_depth = DP_COMPONENT_PIXEL_DEPTH_16BPC;
+               break;
+       default:
+               dp_component_depth = DP_COMPONENT_PIXEL_DEPTH_6BPC;
+               break;
+       }
+
+       if (hw_crtc_timing.flags.DSC) {
+               // Fix set but not used error
+               //dp_pixel_encoding_type = 1;
+               switch (hw_crtc_timing.pixel_encoding) {
+               case PIXEL_ENCODING_YCBCR444:
+                       dp_compressed_pixel_format = 0;
+                       break;
+               case PIXEL_ENCODING_YCBCR422:
+                       dp_compressed_pixel_format = 1;
+                       if (hw_crtc_timing.dsc_cfg.ycbcr422_simple)
+                               dp_compressed_pixel_format = 0;
+                       break;
+               case PIXEL_ENCODING_YCBCR420:
+                       dp_compressed_pixel_format = 1;
+                       break;
+               default:
+                       dp_compressed_pixel_format = 0;
+                       break;
+               }
+       } else {
+               // Fix set but not used error
+               //dp_pixel_encoding_type = 0;
+               switch (dp_pixel_encoding) {
+               case DP_PIXEL_ENCODING_TYPE_RGB444:
+                       dp_translate_pixel_enc = 0;
+                       break;
+               case DP_PIXEL_ENCODING_TYPE_YCBCR422:
+                       dp_translate_pixel_enc = 1;
+                       break;
+               case DP_PIXEL_ENCODING_TYPE_YCBCR444:
+                       dp_translate_pixel_enc = 0;
+                       break;
+               case DP_PIXEL_ENCODING_TYPE_Y_ONLY:
+                       dp_translate_pixel_enc = 3;
+                       break;
+               case DP_PIXEL_ENCODING_TYPE_YCBCR420:
+                       dp_translate_pixel_enc = 2;
+                       break;
+               default:
+                       ASSERT(0);
+                       break;
+               }
+       }
+       /* Set DP pixel encoding and component depth */
+       REG_UPDATE_4(DP_PIXEL_FORMAT,
+                       PIXEL_ENCODING_TYPE, hw_crtc_timing.flags.DSC ? 1 : 0,
+                       UNCOMPRESSED_PIXEL_FORMAT, dp_translate_pixel_enc,
+                       UNCOMPRESSED_COMPONENT_DEPTH, dp_component_depth,
+                       COMPRESSED_PIXEL_FORMAT, dp_compressed_pixel_format);
+
+       /* set dynamic range and YCbCr range */
+
+       switch (hw_crtc_timing.display_color_depth) {
+       case COLOR_DEPTH_666:
+               colorimetry_bpc = 0;
+               break;
+       case COLOR_DEPTH_888:
+               colorimetry_bpc = 1;
+               break;
+       case COLOR_DEPTH_101010:
+               colorimetry_bpc = 2;
+               break;
+       case COLOR_DEPTH_121212:
+               colorimetry_bpc = 3;
+               break;
+       default:
+               colorimetry_bpc = 0;
+               break;
+       }
+
+       misc0 = misc0 | synchronous_clock;
+       misc0 = colorimetry_bpc << 5;
+
+       switch (output_color_space) {
+       case COLOR_SPACE_SRGB:
+               misc1 = misc1 & ~0x80; /* bit7 = 0*/
+               break;
+       case COLOR_SPACE_SRGB_LIMITED:
+               misc0 = misc0 | 0x8; /* bit3=1 */
+               misc1 = misc1 & ~0x80; /* bit7 = 0*/
+               break;
+       case COLOR_SPACE_YCBCR601:
+       case COLOR_SPACE_YCBCR601_LIMITED:
+               misc0 = misc0 | 0x8; /* bit3=1, bit4=0 */
+               misc1 = misc1 & ~0x80; /* bit7 = 0*/
+               if (hw_crtc_timing.pixel_encoding == PIXEL_ENCODING_YCBCR422)
+                       misc0 = misc0 | 0x2; /* bit2=0, bit1=1 */
+               else if (hw_crtc_timing.pixel_encoding == PIXEL_ENCODING_YCBCR444)
+                       misc0 = misc0 | 0x4; /* bit2=1, bit1=0 */
+               break;
+       case COLOR_SPACE_YCBCR709:
+       case COLOR_SPACE_YCBCR709_LIMITED:
+               misc0 = misc0 | 0x18; /* bit3=1, bit4=1 */
+               misc1 = misc1 & ~0x80; /* bit7 = 0*/
+               if (hw_crtc_timing.pixel_encoding == PIXEL_ENCODING_YCBCR422)
+                       misc0 = misc0 | 0x2; /* bit2=0, bit1=1 */
+               else if (hw_crtc_timing.pixel_encoding == PIXEL_ENCODING_YCBCR444)
+                       misc0 = misc0 | 0x4; /* bit2=1, bit1=0 */
+               break;
+       case COLOR_SPACE_2020_RGB_LIMITEDRANGE:
+       case COLOR_SPACE_2020_RGB_FULLRANGE:
+       case COLOR_SPACE_2020_YCBCR:
+       case COLOR_SPACE_XR_RGB:
+       case COLOR_SPACE_MSREF_SCRGB:
+       case COLOR_SPACE_ADOBERGB:
+       case COLOR_SPACE_DCIP3:
+       case COLOR_SPACE_XV_YCC_709:
+       case COLOR_SPACE_XV_YCC_601:
+       case COLOR_SPACE_DISPLAYNATIVE:
+       case COLOR_SPACE_DOLBYVISION:
+       case COLOR_SPACE_APPCTRL:
+       case COLOR_SPACE_CUSTOMPOINTS:
+       case COLOR_SPACE_UNKNOWN:
+       case COLOR_SPACE_YCBCR709_BLACK:
+               /* do nothing */
+               break;
+       }
+
+       REG_SET(DP_MSA_COLORIMETRY, 0, DP_MSA_MISC0, misc0);
+       REG_WRITE(DP_MSA_MISC, misc1);   /* MSA_MISC1 */
+
+       /* dcn new register
+        * dc_crtc_timing is vesa dmt struct. data from edid
+        */
+       REG_SET_2(DP_MSA_TIMING_PARAM1, 0,
+                       DP_MSA_HTOTAL, hw_crtc_timing.h_total,
+                       DP_MSA_VTOTAL, hw_crtc_timing.v_total);
+
+       /* calculate from vesa timing parameters
+        * h_active_start related to leading edge of sync
+        */
+
+       h_blank = hw_crtc_timing.h_total - hw_crtc_timing.h_border_left -
+                       hw_crtc_timing.h_addressable - hw_crtc_timing.h_border_right;
+
+       h_back_porch = h_blank - hw_crtc_timing.h_front_porch -
+                       hw_crtc_timing.h_sync_width;
+
+       /* start at beginning of left border */
+       h_active_start = hw_crtc_timing.h_sync_width + h_back_porch;
+
+
+       v_active_start = hw_crtc_timing.v_total - hw_crtc_timing.v_border_top -
+                       hw_crtc_timing.v_addressable - hw_crtc_timing.v_border_bottom -
+                       hw_crtc_timing.v_front_porch;
+
+
+       /* start at beginning of left border */
+       REG_SET_2(DP_MSA_TIMING_PARAM2, 0,
+               DP_MSA_HSTART, h_active_start,
+               DP_MSA_VSTART, v_active_start);
+
+       REG_SET_4(DP_MSA_TIMING_PARAM3, 0,
+                       DP_MSA_HSYNCWIDTH,
+                       hw_crtc_timing.h_sync_width,
+                       DP_MSA_HSYNCPOLARITY,
+                       !hw_crtc_timing.flags.HSYNC_POSITIVE_POLARITY,
+                       DP_MSA_VSYNCWIDTH,
+                       hw_crtc_timing.v_sync_width,
+                       DP_MSA_VSYNCPOLARITY,
+                       !hw_crtc_timing.flags.VSYNC_POSITIVE_POLARITY);
+
+       /* HWDITH include border or overscan */
+       REG_SET_2(DP_MSA_TIMING_PARAM4, 0,
+               DP_MSA_HWIDTH, hw_crtc_timing.h_border_left +
+               hw_crtc_timing.h_addressable + hw_crtc_timing.h_border_right,
+               DP_MSA_VHEIGHT, hw_crtc_timing.v_border_top +
+               hw_crtc_timing.v_addressable + hw_crtc_timing.v_border_bottom);
+
+       REG_UPDATE(DP_SEC_FRAMING4,
+               DP_SST_SDP_SPLITTING, enable_sdp_splitting);
+}
+
+static void enc401_stream_encoder_map_to_link(
+               struct stream_encoder *enc,
+               uint32_t stream_enc_inst,
+               uint32_t link_enc_inst)
+{
+       struct dcn10_stream_encoder *enc1 = DCN10STRENC_FROM_STRENC(enc);
+
+       REG_UPDATE(STREAM_MAPPER_CONTROL,
+                               DIG_STREAM_LINK_TARGET, link_enc_inst);
+}
+
+static const struct stream_encoder_funcs dcn401_str_enc_funcs = {
+       .dp_set_odm_combine =
+               enc401_dp_set_odm_combine,
+       .dp_set_stream_attribute =
+               enc401_stream_encoder_dp_set_stream_attribute,
+       .hdmi_set_stream_attribute =
+               enc401_stream_encoder_hdmi_set_stream_attribute,
+       .dvi_set_stream_attribute =
+               enc401_stream_encoder_dvi_set_stream_attribute,
+       .set_throttled_vcp_size =
+               enc1_stream_encoder_set_throttled_vcp_size,
+       .update_hdmi_info_packets =
+               enc3_stream_encoder_update_hdmi_info_packets,
+       .stop_hdmi_info_packets =
+               enc3_stream_encoder_stop_hdmi_info_packets,
+       .update_dp_info_packets_sdp_line_num =
+               enc3_stream_encoder_update_dp_info_packets_sdp_line_num,
+       .update_dp_info_packets =
+               enc3_stream_encoder_update_dp_info_packets,
+       .stop_dp_info_packets =
+               enc1_stream_encoder_stop_dp_info_packets,
+       .dp_blank =
+               enc1_stream_encoder_dp_blank,
+       .dp_unblank =
+               enc401_stream_encoder_dp_unblank,
+       .audio_mute_control = enc3_audio_mute_control,
+
+       .dp_audio_setup = enc3_se_dp_audio_setup,
+       .dp_audio_enable = enc3_se_dp_audio_enable,
+       .dp_audio_disable = enc1_se_dp_audio_disable,
+
+       .hdmi_audio_setup = enc3_se_hdmi_audio_setup,
+       .hdmi_audio_disable = enc1_se_hdmi_audio_disable,
+       .setup_stereo_sync  = enc1_setup_stereo_sync,
+       .set_avmute = enc1_stream_encoder_set_avmute,
+       .dig_connect_to_otg = enc1_dig_connect_to_otg,
+       .dig_source_otg = enc1_dig_source_otg,
+
+       .dp_get_pixel_format  = enc1_stream_encoder_dp_get_pixel_format,
+
+       .enc_read_state = enc401_read_state,
+       .dp_set_dsc_config = NULL,
+       .dp_set_dsc_pps_info_packet = enc3_dp_set_dsc_pps_info_packet,
+       .set_dynamic_metadata = enc401_set_dynamic_metadata,
+       .hdmi_reset_stream_attribute = enc1_reset_hdmi_stream_attribute,
+       .enable_stream = enc401_stream_encoder_enable,
+
+       .set_input_mode = enc401_set_dig_input_mode,
+       .enable_fifo = enc35_enable_fifo,
+       .disable_fifo = enc35_disable_fifo,
+       .map_stream_to_link = enc401_stream_encoder_map_to_link,
+};
+
+void dcn401_dio_stream_encoder_construct(
+       struct dcn10_stream_encoder *enc1,
+       struct dc_context *ctx,
+       struct dc_bios *bp,
+       enum engine_id eng_id,
+       struct vpg *vpg,
+       struct afmt *afmt,
+       const struct dcn10_stream_enc_registers *regs,
+       const struct dcn10_stream_encoder_shift *se_shift,
+       const struct dcn10_stream_encoder_mask *se_mask)
+{
+       enc1->base.funcs = &dcn401_str_enc_funcs;
+       enc1->base.ctx = ctx;
+       enc1->base.id = eng_id;
+       enc1->base.bp = bp;
+       enc1->base.vpg = vpg;
+       enc1->base.afmt = afmt;
+       enc1->regs = regs;
+       enc1->se_shift = se_shift;
+       enc1->se_mask = se_mask;
+       enc1->base.stream_enc_inst = vpg->inst;
+}
+
+void enc401_set_dynamic_metadata(struct stream_encoder *enc,
+               bool enable_dme,
+               uint32_t hubp_requestor_id,
+               enum dynamic_metadata_mode dmdata_mode)
+{
+       struct dcn10_stream_encoder *enc1 = DCN10STRENC_FROM_STRENC(enc);
+
+       if (enable_dme) {
+               REG_UPDATE_2(DME_CONTROL,
+                               METADATA_HUBP_REQUESTOR_ID, hubp_requestor_id,
+                               METADATA_STREAM_TYPE, (dmdata_mode == dmdata_dolby_vision) ? 1 : 0);
+
+               /* Use default line reference DP_SOF for bringup.
+                * Should use OTG_SOF for DRR cases
+                */
+               if (dmdata_mode == dmdata_dp)
+                       REG_UPDATE_3(DP_SEC_METADATA_TRANSMISSION,
+                                       DP_SEC_METADATA_PACKET_ENABLE, 1,
+                                       DP_SEC_METADATA_PACKET_LINE_REFERENCE, 0,
+                                       DP_SEC_METADATA_PACKET_LINE, 20);
+               else {
+                       REG_UPDATE_3(HDMI_METADATA_PACKET_CONTROL,
+                                       HDMI_METADATA_PACKET_ENABLE, 1,
+                                       HDMI_METADATA_PACKET_LINE_REFERENCE, 0,
+                                       HDMI_METADATA_PACKET_LINE, 2);
+
+                       if (dmdata_mode == dmdata_dolby_vision)
+                               REG_UPDATE(HDMI_CONTROL,
+                                               DOLBY_VISION_EN, 1);
+               }
+
+               REG_UPDATE(DME_CONTROL,
+                               METADATA_ENGINE_EN, 1);
+       } else {
+               REG_UPDATE(DME_CONTROL,
+                               METADATA_ENGINE_EN, 0);
+
+               if (dmdata_mode == dmdata_dp)
+                       REG_UPDATE(DP_SEC_METADATA_TRANSMISSION,
+                                       DP_SEC_METADATA_PACKET_ENABLE, 0);
+               else {
+                       REG_UPDATE(HDMI_METADATA_PACKET_CONTROL,
+                                       HDMI_METADATA_PACKET_ENABLE, 0);
+                       REG_UPDATE(HDMI_CONTROL,
+                                       DOLBY_VISION_EN, 0);
+               }
+       }
+}
+void enc401_stream_encoder_set_stream_attribute_helper(
+               struct dcn10_stream_encoder *enc1,
+               struct dc_crtc_timing *crtc_timing)
+{
+       switch (crtc_timing->pixel_encoding) {
+       case PIXEL_ENCODING_YCBCR422:
+               REG_UPDATE(HDMI_CONTROL, TMDS_PIXEL_ENCODING, 1);
+               break;
+       default:
+               REG_UPDATE(HDMI_CONTROL, TMDS_PIXEL_ENCODING, 0);
+               break;
+       }
+       REG_UPDATE(HDMI_CONTROL, TMDS_COLOR_FORMAT, 0);
+}
diff --git a/drivers/gpu/drm/amd/display/dc/dio/dcn401/dcn401_dio_stream_encoder.h b/drivers/gpu/drm/amd/display/dc/dio/dcn401/dcn401_dio_stream_encoder.h
new file mode 100644 (file)
index 0000000..d751839
--- /dev/null
@@ -0,0 +1,217 @@
+/*
+ * Copyright 2021 - Advanced Micro Devices, Inc.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ *  and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+ * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
+ * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+ * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+ * OTHER DEALINGS IN THE SOFTWARE.
+ *
+ * Authors: AMD
+ *
+ */
+
+#ifndef __DC_DIO_STREAM_ENCODER_DCN401_H__
+#define __DC_DIO_STREAM_ENCODER_DCN401_H__
+
+#include "dcn30/dcn30_vpg.h"
+#include "dcn30/dcn30_afmt.h"
+#include "stream_encoder.h"
+#include "dcn20/dcn20_stream_encoder.h"
+
+#define SE_COMMON_MASK_SH_LIST_DCN401(mask_sh)\
+       SE_SF(DP0_DP_PIXEL_FORMAT, PIXEL_ENCODING_TYPE, mask_sh),\
+       SE_SF(DP0_DP_PIXEL_FORMAT, UNCOMPRESSED_PIXEL_FORMAT, mask_sh),\
+       SE_SF(DP0_DP_PIXEL_FORMAT, UNCOMPRESSED_COMPONENT_DEPTH, mask_sh),\
+       SE_SF(DP0_DP_PIXEL_FORMAT, COMPRESSED_PIXEL_FORMAT, mask_sh),\
+       SE_SF(DIG0_HDMI_CONTROL, HDMI_PACKET_GEN_VERSION, mask_sh),\
+       SE_SF(DIG0_HDMI_CONTROL, HDMI_KEEPOUT_MODE, mask_sh),\
+       SE_SF(DIG0_HDMI_CONTROL, HDMI_DEEP_COLOR_ENABLE, mask_sh),\
+       SE_SF(DIG0_HDMI_CONTROL, HDMI_DEEP_COLOR_DEPTH, mask_sh),\
+       SE_SF(DIG0_HDMI_CONTROL, HDMI_DATA_SCRAMBLE_EN, mask_sh),\
+       SE_SF(DIG0_HDMI_CONTROL, HDMI_NO_EXTRA_NULL_PACKET_FILLED, mask_sh),\
+       SE_SF(DIG0_HDMI_VBI_PACKET_CONTROL, HDMI_GC_CONT, mask_sh),\
+       SE_SF(DIG0_HDMI_VBI_PACKET_CONTROL, HDMI_GC_SEND, mask_sh),\
+       SE_SF(DIG0_HDMI_VBI_PACKET_CONTROL, HDMI_NULL_SEND, mask_sh),\
+       SE_SF(DIG0_HDMI_VBI_PACKET_CONTROL, HDMI_ACP_SEND, mask_sh),\
+       SE_SF(DIG0_HDMI_INFOFRAME_CONTROL0, HDMI_AUDIO_INFO_SEND, mask_sh),\
+       SE_SF(DIG0_HDMI_INFOFRAME_CONTROL1, HDMI_AUDIO_INFO_LINE, mask_sh),\
+       SE_SF(DIG0_HDMI_GC, HDMI_GC_AVMUTE, mask_sh),\
+       SE_SF(DP0_DP_MSE_RATE_CNTL, DP_MSE_RATE_X, mask_sh),\
+       SE_SF(DP0_DP_MSE_RATE_CNTL, DP_MSE_RATE_Y, mask_sh),\
+       SE_SF(DP0_DP_MSE_RATE_UPDATE, DP_MSE_RATE_UPDATE_PENDING, mask_sh),\
+       SE_SF(DP0_DP_SEC_CNTL, DP_SEC_GSP0_ENABLE, mask_sh),\
+       SE_SF(DP0_DP_SEC_CNTL, DP_SEC_STREAM_ENABLE, mask_sh),\
+       SE_SF(DP0_DP_SEC_CNTL, DP_SEC_GSP1_ENABLE, mask_sh),\
+       SE_SF(DP0_DP_SEC_CNTL, DP_SEC_GSP2_ENABLE, mask_sh),\
+       SE_SF(DP0_DP_SEC_CNTL, DP_SEC_GSP3_ENABLE, mask_sh),\
+       SE_SF(DP0_DP_SEC_CNTL, DP_SEC_MPG_ENABLE, mask_sh),\
+       SE_SF(DP0_DP_SEC_CNTL1, DP_SEC_GSP5_LINE_REFERENCE, mask_sh),\
+       SE_SF(DP0_DP_SEC_CNTL2, DP_SEC_GSP4_SEND, mask_sh),\
+       SE_SF(DP0_DP_SEC_CNTL2, DP_SEC_GSP4_SEND_PENDING, mask_sh),\
+       SE_SF(DP0_DP_SEC_CNTL4, DP_SEC_GSP4_LINE_NUM, mask_sh),\
+       SE_SF(DP0_DP_SEC_CNTL5, DP_SEC_GSP5_LINE_NUM, mask_sh),\
+       SE_SF(DP0_DP_SEC_CNTL2, DP_SEC_GSP4_SEND_ANY_LINE, mask_sh),\
+       SE_SF(DP0_DP_VID_STREAM_CNTL, DP_VID_STREAM_DIS_DEFER, mask_sh),\
+       SE_SF(DP0_DP_VID_STREAM_CNTL, DP_VID_STREAM_ENABLE, mask_sh),\
+       SE_SF(DP0_DP_VID_STREAM_CNTL, DP_VID_STREAM_STATUS, mask_sh),\
+       SE_SF(DP0_DP_STEER_FIFO, DP_STEER_FIFO_RESET, mask_sh),\
+       SE_SF(DP0_DP_STEER_FIFO, DP_STEER_FIFO_ENABLE, mask_sh),\
+       SE_SF(DP0_DP_VID_TIMING, DP_VID_M_N_GEN_EN, mask_sh),\
+       SE_SF(DP0_DP_VID_N, DP_VID_N, mask_sh),\
+       SE_SF(DP0_DP_VID_M, DP_VID_M, mask_sh),\
+       SE_SF(DIG0_HDMI_AUDIO_PACKET_CONTROL, HDMI_AUDIO_DELAY_EN, mask_sh),\
+       SE_SF(DIG0_HDMI_ACR_PACKET_CONTROL, HDMI_ACR_AUTO_SEND, mask_sh),\
+       SE_SF(DIG0_HDMI_ACR_PACKET_CONTROL, HDMI_ACR_SOURCE, mask_sh),\
+       SE_SF(DIG0_HDMI_ACR_PACKET_CONTROL, HDMI_ACR_AUDIO_PRIORITY, mask_sh),\
+       SE_SF(DIG0_HDMI_ACR_32_0, HDMI_ACR_CTS_32, mask_sh),\
+       SE_SF(DIG0_HDMI_ACR_32_1, HDMI_ACR_N_32, mask_sh),\
+       SE_SF(DIG0_HDMI_ACR_44_0, HDMI_ACR_CTS_44, mask_sh),\
+       SE_SF(DIG0_HDMI_ACR_44_1, HDMI_ACR_N_44, mask_sh),\
+       SE_SF(DIG0_HDMI_ACR_48_0, HDMI_ACR_CTS_48, mask_sh),\
+       SE_SF(DIG0_HDMI_ACR_48_1, HDMI_ACR_N_48, mask_sh),\
+       SE_SF(DP0_DP_SEC_AUD_N, DP_SEC_AUD_N, mask_sh),\
+       SE_SF(DP0_DP_SEC_TIMESTAMP, DP_SEC_TIMESTAMP_MODE, mask_sh),\
+       SE_SF(DP0_DP_SEC_CNTL, DP_SEC_ASP_ENABLE, mask_sh),\
+       SE_SF(DP0_DP_SEC_CNTL, DP_SEC_ATP_ENABLE, mask_sh),\
+       SE_SF(DP0_DP_SEC_CNTL, DP_SEC_AIP_ENABLE, mask_sh),\
+       SE_SF(DP0_DP_SEC_CNTL, DP_SEC_ACM_ENABLE, mask_sh),\
+       SE_SF(DIG0_AFMT_CNTL, AFMT_AUDIO_CLOCK_EN, mask_sh),\
+       SE_SF(DIG0_HDMI_CONTROL, HDMI_CLOCK_CHANNEL_RATE, mask_sh),\
+       SE_SF(DIG1_HDMI_CONTROL, TMDS_PIXEL_ENCODING, mask_sh),\
+       SE_SF(DIG1_HDMI_CONTROL, TMDS_COLOR_FORMAT, mask_sh),\
+       SE_SF(DIG0_DIG_FE_CNTL, DIG_STEREOSYNC_SELECT, mask_sh),\
+       SE_SF(DIG0_DIG_FE_CNTL, DIG_STEREOSYNC_GATE_EN, mask_sh),\
+       SE_SF(DP0_DP_SEC_CNTL, DP_SEC_GSP4_ENABLE, mask_sh),\
+       SE_SF(DP0_DP_SEC_CNTL, DP_SEC_GSP5_ENABLE, mask_sh),\
+       SE_SF(DP0_DP_SEC_CNTL, DP_SEC_GSP6_ENABLE, mask_sh),\
+       SE_SF(DP0_DP_SEC_CNTL, DP_SEC_GSP7_ENABLE, mask_sh),\
+       SE_SF(DP0_DP_SEC_CNTL2, DP_SEC_GSP7_SEND, mask_sh),\
+       SE_SF(DP0_DP_SEC_CNTL6, DP_SEC_GSP7_LINE_NUM, mask_sh),\
+       SE_SF(DP0_DP_SEC_CNTL2, DP_SEC_GSP11_PPS, mask_sh),\
+       SE_SF(DP0_DP_GSP11_CNTL, DP_SEC_GSP11_ENABLE, mask_sh),\
+       SE_SF(DP0_DP_GSP11_CNTL, DP_SEC_GSP11_LINE_NUM, mask_sh),\
+       SE_SF(DP0_DP_DB_CNTL, DP_DB_DISABLE, mask_sh),\
+       SE_SF(DP0_DP_MSA_COLORIMETRY, DP_MSA_MISC0, mask_sh),\
+       SE_SF(DP0_DP_MSA_TIMING_PARAM1, DP_MSA_HTOTAL, mask_sh),\
+       SE_SF(DP0_DP_MSA_TIMING_PARAM1, DP_MSA_VTOTAL, mask_sh),\
+       SE_SF(DP0_DP_MSA_TIMING_PARAM2, DP_MSA_HSTART, mask_sh),\
+       SE_SF(DP0_DP_MSA_TIMING_PARAM2, DP_MSA_VSTART, mask_sh),\
+       SE_SF(DP0_DP_MSA_TIMING_PARAM3, DP_MSA_HSYNCWIDTH, mask_sh),\
+       SE_SF(DP0_DP_MSA_TIMING_PARAM3, DP_MSA_HSYNCPOLARITY, mask_sh),\
+       SE_SF(DP0_DP_MSA_TIMING_PARAM3, DP_MSA_VSYNCWIDTH, mask_sh),\
+       SE_SF(DP0_DP_MSA_TIMING_PARAM3, DP_MSA_VSYNCPOLARITY, mask_sh),\
+       SE_SF(DP0_DP_MSA_TIMING_PARAM4, DP_MSA_HWIDTH, mask_sh),\
+       SE_SF(DP0_DP_MSA_TIMING_PARAM4, DP_MSA_VHEIGHT, mask_sh),\
+       SE_SF(DIG0_HDMI_DB_CONTROL, HDMI_DB_DISABLE, mask_sh),\
+       SE_SF(DP0_DP_VID_TIMING, DP_VID_N_INTERVAL, mask_sh),\
+       SE_SF(DIG0_DIG_FE_CNTL, DIG_SOURCE_SELECT, mask_sh), \
+       SE_SF(DIG0_HDMI_GENERIC_PACKET_CONTROL0, HDMI_GENERIC0_CONT, mask_sh),\
+       SE_SF(DIG0_HDMI_GENERIC_PACKET_CONTROL0, HDMI_GENERIC0_SEND, mask_sh),\
+       SE_SF(DIG0_HDMI_GENERIC_PACKET_CONTROL0, HDMI_GENERIC1_CONT, mask_sh),\
+       SE_SF(DIG0_HDMI_GENERIC_PACKET_CONTROL0, HDMI_GENERIC1_SEND, mask_sh),\
+       SE_SF(DIG0_HDMI_GENERIC_PACKET_CONTROL0, HDMI_GENERIC2_CONT, mask_sh),\
+       SE_SF(DIG0_HDMI_GENERIC_PACKET_CONTROL0, HDMI_GENERIC2_SEND, mask_sh),\
+       SE_SF(DIG0_HDMI_GENERIC_PACKET_CONTROL0, HDMI_GENERIC3_CONT, mask_sh),\
+       SE_SF(DIG0_HDMI_GENERIC_PACKET_CONTROL0, HDMI_GENERIC3_SEND, mask_sh),\
+       SE_SF(DIG0_HDMI_GENERIC_PACKET_CONTROL0, HDMI_GENERIC4_CONT, mask_sh),\
+       SE_SF(DIG0_HDMI_GENERIC_PACKET_CONTROL0, HDMI_GENERIC4_SEND, mask_sh),\
+       SE_SF(DIG0_HDMI_GENERIC_PACKET_CONTROL0, HDMI_GENERIC5_CONT, mask_sh),\
+       SE_SF(DIG0_HDMI_GENERIC_PACKET_CONTROL0, HDMI_GENERIC5_SEND, mask_sh),\
+       SE_SF(DIG0_HDMI_GENERIC_PACKET_CONTROL0, HDMI_GENERIC6_CONT, mask_sh),\
+       SE_SF(DIG0_HDMI_GENERIC_PACKET_CONTROL0, HDMI_GENERIC6_SEND, mask_sh),\
+       SE_SF(DIG0_HDMI_GENERIC_PACKET_CONTROL0, HDMI_GENERIC7_CONT, mask_sh),\
+       SE_SF(DIG0_HDMI_GENERIC_PACKET_CONTROL0, HDMI_GENERIC7_SEND, mask_sh),\
+       SE_SF(DIG0_HDMI_GENERIC_PACKET_CONTROL6, HDMI_GENERIC8_CONT, mask_sh),\
+       SE_SF(DIG0_HDMI_GENERIC_PACKET_CONTROL6, HDMI_GENERIC8_SEND, mask_sh),\
+       SE_SF(DIG0_HDMI_GENERIC_PACKET_CONTROL6, HDMI_GENERIC9_CONT, mask_sh),\
+       SE_SF(DIG0_HDMI_GENERIC_PACKET_CONTROL6, HDMI_GENERIC9_SEND, mask_sh),\
+       SE_SF(DIG0_HDMI_GENERIC_PACKET_CONTROL6, HDMI_GENERIC10_CONT, mask_sh),\
+       SE_SF(DIG0_HDMI_GENERIC_PACKET_CONTROL6, HDMI_GENERIC10_SEND, mask_sh),\
+       SE_SF(DIG0_HDMI_GENERIC_PACKET_CONTROL6, HDMI_GENERIC11_CONT, mask_sh),\
+       SE_SF(DIG0_HDMI_GENERIC_PACKET_CONTROL6, HDMI_GENERIC11_SEND, mask_sh),\
+       SE_SF(DIG0_HDMI_GENERIC_PACKET_CONTROL6, HDMI_GENERIC12_CONT, mask_sh),\
+       SE_SF(DIG0_HDMI_GENERIC_PACKET_CONTROL6, HDMI_GENERIC12_SEND, mask_sh),\
+       SE_SF(DIG0_HDMI_GENERIC_PACKET_CONTROL6, HDMI_GENERIC13_CONT, mask_sh),\
+       SE_SF(DIG0_HDMI_GENERIC_PACKET_CONTROL6, HDMI_GENERIC13_SEND, mask_sh),\
+       SE_SF(DIG0_HDMI_GENERIC_PACKET_CONTROL6, HDMI_GENERIC14_CONT, mask_sh),\
+       SE_SF(DIG0_HDMI_GENERIC_PACKET_CONTROL6, HDMI_GENERIC14_SEND, mask_sh),\
+       SE_SF(DIG0_HDMI_GENERIC_PACKET_CONTROL1, HDMI_GENERIC0_LINE, mask_sh),\
+       SE_SF(DIG0_HDMI_GENERIC_PACKET_CONTROL1, HDMI_GENERIC1_LINE, mask_sh),\
+       SE_SF(DIG0_HDMI_GENERIC_PACKET_CONTROL2, HDMI_GENERIC2_LINE, mask_sh),\
+       SE_SF(DIG0_HDMI_GENERIC_PACKET_CONTROL2, HDMI_GENERIC3_LINE, mask_sh),\
+       SE_SF(DIG0_HDMI_GENERIC_PACKET_CONTROL3, HDMI_GENERIC4_LINE, mask_sh),\
+       SE_SF(DIG0_HDMI_GENERIC_PACKET_CONTROL3, HDMI_GENERIC5_LINE, mask_sh),\
+       SE_SF(DIG0_HDMI_GENERIC_PACKET_CONTROL4, HDMI_GENERIC6_LINE, mask_sh),\
+       SE_SF(DIG0_HDMI_GENERIC_PACKET_CONTROL4, HDMI_GENERIC7_LINE, mask_sh),\
+       SE_SF(DIG0_HDMI_GENERIC_PACKET_CONTROL7, HDMI_GENERIC8_LINE, mask_sh),\
+       SE_SF(DIG0_HDMI_GENERIC_PACKET_CONTROL7, HDMI_GENERIC9_LINE, mask_sh),\
+       SE_SF(DIG0_HDMI_GENERIC_PACKET_CONTROL8, HDMI_GENERIC10_LINE, mask_sh),\
+       SE_SF(DIG0_HDMI_GENERIC_PACKET_CONTROL8, HDMI_GENERIC11_LINE, mask_sh),\
+       SE_SF(DIG0_HDMI_GENERIC_PACKET_CONTROL9, HDMI_GENERIC12_LINE, mask_sh),\
+       SE_SF(DIG0_HDMI_GENERIC_PACKET_CONTROL9, HDMI_GENERIC13_LINE, mask_sh),\
+       SE_SF(DIG0_HDMI_GENERIC_PACKET_CONTROL10, HDMI_GENERIC14_LINE, mask_sh),\
+       SE_SF(DP0_DP_MSA_VBID_MISC, DP_VBID6_LINE_REFERENCE, mask_sh),\
+       SE_SF(DP0_DP_MSA_VBID_MISC, DP_VBID6_LINE_NUM, mask_sh),\
+       SE_SF(DME0_DME_CONTROL, METADATA_ENGINE_EN, mask_sh),\
+       SE_SF(DME0_DME_CONTROL, METADATA_HUBP_REQUESTOR_ID, mask_sh),\
+       SE_SF(DME0_DME_CONTROL, METADATA_STREAM_TYPE, mask_sh),\
+       SE_SF(DP0_DP_SEC_METADATA_TRANSMISSION, DP_SEC_METADATA_PACKET_ENABLE, mask_sh),\
+       SE_SF(DP0_DP_SEC_METADATA_TRANSMISSION, DP_SEC_METADATA_PACKET_LINE_REFERENCE, mask_sh),\
+       SE_SF(DP0_DP_SEC_METADATA_TRANSMISSION, DP_SEC_METADATA_PACKET_LINE, mask_sh),\
+       SE_SF(DIG0_HDMI_METADATA_PACKET_CONTROL, HDMI_METADATA_PACKET_ENABLE, mask_sh),\
+       SE_SF(DIG0_HDMI_METADATA_PACKET_CONTROL, HDMI_METADATA_PACKET_LINE_REFERENCE, mask_sh),\
+       SE_SF(DIG0_HDMI_METADATA_PACKET_CONTROL, HDMI_METADATA_PACKET_LINE, mask_sh),\
+       SE_SF(DIG0_HDMI_CONTROL, DOLBY_VISION_EN, mask_sh),\
+       SE_SF(DIG0_DIG_FE_EN_CNTL, DIG_FE_ENABLE, mask_sh),\
+       SE_SF(DIG0_DIG_FE_CLK_CNTL, DIG_FE_MODE, mask_sh),\
+       SE_SF(DIG0_DIG_FE_CLK_CNTL, DIG_FE_CLK_EN, mask_sh),\
+       SE_SF(DIG0_DIG_FE_CLK_CNTL, DIG_FE_SOFT_RESET, mask_sh),\
+       SE_SF(DIG0_DIG_FE_CNTL, DIG_STEREOSYNC_GATE_EN, mask_sh),\
+       SE_SF(DP0_DP_SEC_FRAMING4, DP_SST_SDP_SPLITTING, mask_sh),\
+       SE_SF(DIG0_DIG_CLOCK_PATTERN, DIG_CLOCK_PATTERN, mask_sh),\
+       SE_SF(DIG0_DIG_FIFO_CTRL0, DIG_FIFO_OUTPUT_PIXEL_PER_CYCLE, mask_sh),\
+       SE_SF(DIG0_DIG_FIFO_CTRL0, DIG_FIFO_READ_START_LEVEL, mask_sh),\
+       SE_SF(DIG0_DIG_FIFO_CTRL0, DIG_FIFO_ENABLE, mask_sh),\
+       SE_SF(DIG0_DIG_FIFO_CTRL0, DIG_FIFO_RESET, mask_sh),\
+       SE_SF(DIG0_DIG_FIFO_CTRL0, DIG_FIFO_RESET_DONE, mask_sh),\
+       SE_SF(DIG0_STREAM_MAPPER_CONTROL, DIG_STREAM_LINK_TARGET, mask_sh),
+
+
+void dcn401_dio_stream_encoder_construct(
+       struct dcn10_stream_encoder *enc1,
+       struct dc_context *ctx,
+       struct dc_bios *bp,
+       enum engine_id eng_id,
+       struct vpg *vpg,
+       struct afmt *afmt,
+       const struct dcn10_stream_enc_registers *regs,
+       const struct dcn10_stream_encoder_shift *se_shift,
+       const struct dcn10_stream_encoder_mask *se_mask);
+
+void enc401_set_dynamic_metadata(struct stream_encoder *enc,
+               bool enable_dme,
+               uint32_t hubp_requestor_id,
+               enum dynamic_metadata_mode dmdata_mode);
+void enc401_stream_encoder_set_stream_attribute_helper(
+               struct dcn10_stream_encoder *enc1,
+               struct dc_crtc_timing *crtc_timing);
+void enc401_stream_encoder_dp_set_stream_attribute(
+       struct stream_encoder *enc,
+       struct dc_crtc_timing *crtc_timing,
+       enum dc_color_space output_color_space,
+       bool use_vsc_sdp_for_colorimetry,
+       uint32_t enable_sdp_splitting);
+#endif /* __DC_DIO_STREAM_ENCODER_DCN401_H__ */
diff --git a/drivers/gpu/drm/amd/display/dc/dwb/Makefile b/drivers/gpu/drm/amd/display/dc/dwb/Makefile
new file mode 100644 (file)
index 0000000..16f7a45
--- /dev/null
@@ -0,0 +1,37 @@
+#
+# Copyright 2020 Advanced Micro Devices, Inc.
+#
+# Permission is hereby granted, free of charge, to any person obtaining a
+# copy of this software and associated documentation files (the "Software"),
+# to deal in the Software without restriction, including without limitation
+# the rights to use, copy, modify, merge, publish, distribute, sublicense,
+# and/or sell copies of the Software, and to permit persons to whom the
+# Software is furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in
+# all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+# THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
+# OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+# ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+# OTHER DEALINGS IN THE SOFTWARE.
+#
+# Authors: AMD
+#
+#
+
+ifdef CONFIG_DRM_AMD_DC_FP
+###############################################################################
+# DCN35
+###############################################################################
+DWB_DCN35 = dcn35_dwb.o
+
+AMD_DAL_DWB_DCN35 = $(addprefix $(AMDDALPATH)/dc/dwb/dcn35/,$(DWB_DCN35))
+
+AMD_DISPLAY_FILES += $(AMD_DAL_DWB_DCN35)
+
+
+endif
diff --git a/drivers/gpu/drm/amd/display/dc/dwb/dcn35/dcn35_dwb.c b/drivers/gpu/drm/amd/display/dc/dwb/dcn35/dcn35_dwb.c
new file mode 100644 (file)
index 0000000..b23a809
--- /dev/null
@@ -0,0 +1,58 @@
+/* SPDX-License-Identifier: MIT */
+/*
+ * Copyright 2023 Advanced Micro Devices, Inc.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+ * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
+ * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+ * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+ * OTHER DEALINGS IN THE SOFTWARE.
+ *
+ */
+
+#include "reg_helper.h"
+#include "dcn35_dwb.h"
+
+#define REG(reg)\
+       dwbc30->dwbc_regs->reg
+
+#define CTX \
+       dwbc30->base.ctx
+
+#undef FN
+#define FN(reg_name, field_name)                                             \
+       ((const struct dcn35_dwbc_shift *)(dwbc30->dwbc_shift))->field_name, \
+               ((const struct dcn35_dwbc_mask *)(dwbc30->dwbc_mask))        \
+                       ->field_name
+
+#define DC_LOGGER \
+       dwbc30->base.ctx->logger
+
+void dcn35_dwbc_construct(struct dcn30_dwbc *dwbc30,
+       struct dc_context *ctx,
+       const struct dcn30_dwbc_registers *dwbc_regs,
+       const struct dcn35_dwbc_shift *dwbc_shift,
+       const struct dcn35_dwbc_mask *dwbc_mask,
+       int inst)
+{
+       dcn30_dwbc_construct(dwbc30, ctx, dwbc_regs,
+                            (const struct dcn30_dwbc_shift *)dwbc_shift,
+                            (const struct dcn30_dwbc_mask *)dwbc_mask, inst);
+}
+
+void dcn35_dwbc_set_fgcg(struct dcn30_dwbc *dwbc30, bool enable)
+{
+       REG_UPDATE(DWB_ENABLE_CLK_CTRL, DWB_FGCG_REP_DIS, !enable);
+}
diff --git a/drivers/gpu/drm/amd/display/dc/dwb/dcn35/dcn35_dwb.h b/drivers/gpu/drm/amd/display/dc/dwb/dcn35/dcn35_dwb.h
new file mode 100644 (file)
index 0000000..886e727
--- /dev/null
@@ -0,0 +1,61 @@
+/* SPDX-License-Identifier: MIT */
+/*
+ * Copyright 2023 Advanced Micro Devices, Inc.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+ * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
+ * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+ * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+ * OTHER DEALINGS IN THE SOFTWARE.
+ *
+ * Authors: AMD
+ *
+ */
+
+#ifndef __DCN35_DWB_H
+#define __DCN35_DWB_H
+
+#include "resource.h"
+#include "dwb.h"
+#include "dcn30/dcn30_dwb.h"
+
+#define DWBC_COMMON_MASK_SH_LIST_DCN35(mask_sh) \
+       DWBC_COMMON_MASK_SH_LIST_DCN30(mask_sh), \
+       SF_DWB2(DWB_ENABLE_CLK_CTRL, DWB_TOP, 0, DWB_FGCG_REP_DIS, mask_sh)
+
+#define DWBC_REG_FIELD_LIST_DCN3_5(type)          \
+       struct {                                  \
+               DWBC_REG_FIELD_LIST_DCN3_0(type); \
+               type DWB_FGCG_REP_DIS;            \
+       }
+
+struct dcn35_dwbc_mask {
+       DWBC_REG_FIELD_LIST_DCN3_5(uint32_t);
+};
+
+struct dcn35_dwbc_shift {
+       DWBC_REG_FIELD_LIST_DCN3_5(uint8_t);
+};
+
+void dcn35_dwbc_construct(struct dcn30_dwbc *dwbc30,
+       struct dc_context *ctx,
+       const struct dcn30_dwbc_registers *dwbc_regs,
+       const struct dcn35_dwbc_shift *dwbc_shift,
+       const struct dcn35_dwbc_mask *dwbc_mask,
+       int inst);
+
+void dcn35_dwbc_set_fgcg(struct dcn30_dwbc *dwbc30, bool enable);
+
+#endif
diff --git a/drivers/gpu/drm/amd/display/dc/hpo/Makefile b/drivers/gpu/drm/amd/display/dc/hpo/Makefile
new file mode 100644 (file)
index 0000000..c248bd8
--- /dev/null
@@ -0,0 +1,35 @@
+#
+# Copyright 2020 Advanced Micro Devices, Inc.
+#
+# Permission is hereby granted, free of charge, to any person obtaining a
+# copy of this software and associated documentation files (the "Software"),
+# to deal in the Software without restriction, including without limitation
+# the rights to use, copy, modify, merge, publish, distribute, sublicense,
+# and/or sell copies of the Software, and to permit persons to whom the
+# Software is furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in
+# all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+# THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
+# OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+# ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+# OTHER DEALINGS IN THE SOFTWARE.
+#
+# Authors: AMD
+#
+#
+
+ifdef CONFIG_DRM_AMD_DC_FP
+###############################################################################
+# DCN32
+###############################################################################
+HPO_DCN32 = dcn32_hpo_dp_link_encoder.o
+
+AMD_DAL_HPO_DCN32 = $(addprefix $(AMDDALPATH)/dc/hpo/dcn32/,$(HPO_DCN32))
+
+AMD_DISPLAY_FILES += $(AMD_DAL_HPO_DCN32)
+endif
diff --git a/drivers/gpu/drm/amd/display/dc/hpo/dcn32/dcn32_hpo_dp_link_encoder.c b/drivers/gpu/drm/amd/display/dc/hpo/dcn32/dcn32_hpo_dp_link_encoder.c
new file mode 100644 (file)
index 0000000..8af01f5
--- /dev/null
@@ -0,0 +1,89 @@
+/*
+ * Copyright 2019 Advanced Micro Devices, Inc.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ *  and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+ * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
+ * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+ * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+ * OTHER DEALINGS IN THE SOFTWARE.
+ *
+ * Authors: AMD
+ *
+ */
+#include "dc_bios_types.h"
+#include "dcn31/dcn31_hpo_dp_link_encoder.h"
+#include "dcn32_hpo_dp_link_encoder.h"
+#include "reg_helper.h"
+#include "stream_encoder.h"
+
+#define DC_LOGGER \
+               enc3->base.ctx->logger
+
+#define REG(reg)\
+       (enc3->regs->reg)
+
+#undef FN
+#define FN(reg_name, field_name) \
+       enc3->hpo_le_shift->field_name, enc3->hpo_le_mask->field_name
+
+#define CTX \
+       enc3->base.ctx
+
+static bool dcn32_hpo_dp_link_enc_is_in_alt_mode(
+               struct hpo_dp_link_encoder *enc)
+{
+       struct dcn31_hpo_dp_link_encoder *enc3 = DCN3_1_HPO_DP_LINK_ENC_FROM_HPO_LINK_ENC(enc);
+       uint32_t dp_alt_mode_disable = 0;
+
+       ASSERT((enc->transmitter >= TRANSMITTER_UNIPHY_A) && (enc->transmitter <= TRANSMITTER_UNIPHY_E));
+
+       /* if value == 1 alt mode is disabled, otherwise it is enabled */
+       REG_GET(RDPCSTX_PHY_CNTL6[enc->transmitter], RDPCS_PHY_DPALT_DISABLE, &dp_alt_mode_disable);
+       return (dp_alt_mode_disable == 0);
+}
+
+
+
+static struct hpo_dp_link_encoder_funcs dcn32_hpo_dp_link_encoder_funcs = {
+       .enable_link_phy = dcn31_hpo_dp_link_enc_enable_dp_output,
+       .disable_link_phy = dcn31_hpo_dp_link_enc_disable_output,
+       .link_enable = dcn31_hpo_dp_link_enc_enable,
+       .link_disable = dcn31_hpo_dp_link_enc_disable,
+       .set_link_test_pattern = dcn31_hpo_dp_link_enc_set_link_test_pattern,
+       .update_stream_allocation_table = dcn31_hpo_dp_link_enc_update_stream_allocation_table,
+       .set_throttled_vcp_size = dcn31_hpo_dp_link_enc_set_throttled_vcp_size,
+       .is_in_alt_mode = dcn32_hpo_dp_link_enc_is_in_alt_mode,
+       .read_state = dcn31_hpo_dp_link_enc_read_state,
+       .set_ffe = dcn31_hpo_dp_link_enc_set_ffe,
+};
+
+void hpo_dp_link_encoder32_construct(struct dcn31_hpo_dp_link_encoder *enc31,
+               struct dc_context *ctx,
+               uint32_t inst,
+               const struct dcn31_hpo_dp_link_encoder_registers *hpo_le_regs,
+               const struct dcn31_hpo_dp_link_encoder_shift *hpo_le_shift,
+               const struct dcn31_hpo_dp_link_encoder_mask *hpo_le_mask)
+{
+       enc31->base.ctx = ctx;
+
+       enc31->base.inst = inst;
+       enc31->base.funcs = &dcn32_hpo_dp_link_encoder_funcs;
+       enc31->base.hpd_source = HPD_SOURCEID_UNKNOWN;
+       enc31->base.transmitter = TRANSMITTER_UNKNOWN;
+
+       enc31->regs = hpo_le_regs;
+       enc31->hpo_le_shift = hpo_le_shift;
+       enc31->hpo_le_mask = hpo_le_mask;
+}
diff --git a/drivers/gpu/drm/amd/display/dc/hpo/dcn32/dcn32_hpo_dp_link_encoder.h b/drivers/gpu/drm/amd/display/dc/hpo/dcn32/dcn32_hpo_dp_link_encoder.h
new file mode 100644 (file)
index 0000000..176b153
--- /dev/null
@@ -0,0 +1,64 @@
+/*
+ * Copyright 2021 Advanced Micro Devices, Inc.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+ * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
+ * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+ * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+ * OTHER DEALINGS IN THE SOFTWARE.
+ *
+ * Authors: AMD
+ *
+ */
+
+#ifndef __DAL_DCN32_HPO_DP_LINK_ENCODER_H__
+#define __DAL_DCN32_HPO_DP_LINK_ENCODER_H__
+
+#include "link_encoder.h"
+
+#define DCN3_2_HPO_DP_LINK_ENC_MASK_SH_LIST(mask_sh)\
+       SE_SF(DP_LINK_ENC0_DP_LINK_ENC_CLOCK_CONTROL, DP_LINK_ENC_CLOCK_EN, mask_sh),\
+       SE_SF(DP_DPHY_SYM320_DP_DPHY_SYM32_CONTROL, DPHY_RESET, mask_sh),\
+       SE_SF(DP_DPHY_SYM320_DP_DPHY_SYM32_CONTROL, DPHY_ENABLE, mask_sh),\
+       SE_SF(DP_DPHY_SYM320_DP_DPHY_SYM32_CONTROL, PRECODER_ENABLE, mask_sh),\
+       SE_SF(DP_DPHY_SYM320_DP_DPHY_SYM32_CONTROL, MODE, mask_sh),\
+       SE_SF(DP_DPHY_SYM320_DP_DPHY_SYM32_CONTROL, NUM_LANES, mask_sh),\
+       SE_SF(DP_DPHY_SYM320_DP_DPHY_SYM32_STATUS, STATUS, mask_sh),\
+       SE_SF(DP_DPHY_SYM320_DP_DPHY_SYM32_STATUS, SAT_UPDATE_PENDING, mask_sh),\
+       SE_SF(DP_DPHY_SYM320_DP_DPHY_SYM32_STATUS, RATE_UPDATE_PENDING, mask_sh),\
+       SE_SF(DP_DPHY_SYM320_DP_DPHY_SYM32_TP_CUSTOM0, TP_CUSTOM, mask_sh),\
+       SE_SF(DP_DPHY_SYM320_DP_DPHY_SYM32_TP_CONFIG, TP_SELECT0, mask_sh),\
+       SE_SF(DP_DPHY_SYM320_DP_DPHY_SYM32_TP_CONFIG, TP_SELECT1, mask_sh),\
+       SE_SF(DP_DPHY_SYM320_DP_DPHY_SYM32_TP_CONFIG, TP_SELECT2, mask_sh),\
+       SE_SF(DP_DPHY_SYM320_DP_DPHY_SYM32_TP_CONFIG, TP_SELECT3, mask_sh),\
+       SE_SF(DP_DPHY_SYM320_DP_DPHY_SYM32_TP_CONFIG, TP_PRBS_SEL0, mask_sh),\
+       SE_SF(DP_DPHY_SYM320_DP_DPHY_SYM32_TP_CONFIG, TP_PRBS_SEL1, mask_sh),\
+       SE_SF(DP_DPHY_SYM320_DP_DPHY_SYM32_TP_CONFIG, TP_PRBS_SEL2, mask_sh),\
+       SE_SF(DP_DPHY_SYM320_DP_DPHY_SYM32_TP_CONFIG, TP_PRBS_SEL3, mask_sh),\
+       SE_SF(DP_DPHY_SYM320_DP_DPHY_SYM32_TP_SQ_PULSE, TP_SQ_PULSE_WIDTH, mask_sh),\
+       SE_SF(DP_DPHY_SYM320_DP_DPHY_SYM32_SAT_VC0, SAT_STREAM_SOURCE, mask_sh),\
+       SE_SF(DP_DPHY_SYM320_DP_DPHY_SYM32_SAT_VC0, SAT_SLOT_COUNT, mask_sh),\
+       SE_SF(DP_DPHY_SYM320_DP_DPHY_SYM32_VC_RATE_CNTL0, STREAM_VC_RATE_X, mask_sh),\
+       SE_SF(DP_DPHY_SYM320_DP_DPHY_SYM32_VC_RATE_CNTL0, STREAM_VC_RATE_Y, mask_sh),\
+       SE_SF(DP_DPHY_SYM320_DP_DPHY_SYM32_SAT_UPDATE, SAT_UPDATE, mask_sh)
+
+void hpo_dp_link_encoder32_construct(struct dcn31_hpo_dp_link_encoder *enc31,
+       struct dc_context *ctx,
+       uint32_t inst,
+       const struct dcn31_hpo_dp_link_encoder_registers *hpo_le_regs,
+       const struct dcn31_hpo_dp_link_encoder_shift *hpo_le_shift,
+       const struct dcn31_hpo_dp_link_encoder_mask *hpo_le_mask);
+
+#endif   // __DAL_DCN32_HPO_DP_LINK_ENCODER_H__
diff --git a/drivers/gpu/drm/amd/display/dc/mmhubbub/Makefile b/drivers/gpu/drm/amd/display/dc/mmhubbub/Makefile
new file mode 100644 (file)
index 0000000..505bc05
--- /dev/null
@@ -0,0 +1,45 @@
+#
+# Copyright 2020 Advanced Micro Devices, Inc.
+#
+# Permission is hereby granted, free of charge, to any person obtaining a
+# copy of this software and associated documentation files (the "Software"),
+# to deal in the Software without restriction, including without limitation
+# the rights to use, copy, modify, merge, publish, distribute, sublicense,
+# and/or sell copies of the Software, and to permit persons to whom the
+# Software is furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in
+# all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+# THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
+# OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+# ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+# OTHER DEALINGS IN THE SOFTWARE.
+#
+# Authors: AMD
+#
+#
+
+ifdef CONFIG_DRM_AMD_DC_FP
+###############################################################################
+# DCN32
+###############################################################################
+MMHUBBUB_DCN32 = dcn32_mmhubbub.o
+
+AMD_DAL_MMHUBBUB_DCN32 = $(addprefix $(AMDDALPATH)/dc/mmhubbub/dcn32/,$(MMHUBBUB_DCN32))
+
+AMD_DISPLAY_FILES += $(AMD_DAL_MMHUBBUB_DCN32)
+
+###############################################################################
+# DCN35
+###############################################################################
+MMHUBBUB_DCN35 = dcn35_mmhubbub.o
+
+AMD_DAL_MMHUBBUB_DCN35 = $(addprefix $(AMDDALPATH)/dc/mmhubbub/dcn35/,$(MMHUBBUB_DCN35))
+
+AMD_DISPLAY_FILES += $(AMD_DAL_MMHUBBUB_DCN35)
+
+endif
diff --git a/drivers/gpu/drm/amd/display/dc/mmhubbub/dcn32/dcn32_mmhubbub.c b/drivers/gpu/drm/amd/display/dc/mmhubbub/dcn32/dcn32_mmhubbub.c
new file mode 100644 (file)
index 0000000..c3b089b
--- /dev/null
@@ -0,0 +1,239 @@
+/*
+ * Copyright 2022 Advanced Micro Devices, Inc.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+ * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
+ * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+ * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+ * OTHER DEALINGS IN THE SOFTWARE.
+ *
+ * Authors: AMD
+ *
+ */
+
+
+#include "reg_helper.h"
+#include "resource.h"
+#include "mcif_wb.h"
+#include "dcn32_mmhubbub.h"
+
+
+#define REG(reg)\
+       mcif_wb30->mcif_wb_regs->reg
+
+#define CTX \
+       mcif_wb30->base.ctx
+
+#undef FN
+#define FN(reg_name, field_name) \
+       mcif_wb30->mcif_wb_shift->field_name, mcif_wb30->mcif_wb_mask->field_name
+
+#define MCIF_ADDR(addr) (((unsigned long long)addr & 0xffffffffff) + 0xFE) >> 8
+#define MCIF_ADDR_HIGH(addr) (unsigned long long)addr >> 40
+
+/* wbif programming guide:
+ * 1. set up wbif parameter:
+ *    unsigned long long   luma_address[4];       //4 frame buffer
+ *    unsigned long long   chroma_address[4];
+ *    unsigned int        luma_pitch;
+ *    unsigned int        chroma_pitch;
+ *    unsigned int         warmup_pitch=0x10;     //256B align, the page size is 4KB when it is 0x10
+ *    unsigned int        slice_lines;           //slice size
+ *    unsigned int         time_per_pixel;        // time per pixel, in ns
+ *    unsigned int         arbitration_slice;     // 0: 2048 bytes 1: 4096 bytes 2: 8192 Bytes
+ *    unsigned int         max_scaled_time;       // used for QOS generation
+ *    unsigned int         swlock=0x0;
+ *    unsigned int         cli_watermark[4];      //4 group urgent watermark
+ *    unsigned int         pstate_watermark[4];   //4 group pstate watermark
+ *    unsigned int         sw_int_en;             // Software interrupt enable, frame end and overflow
+ *    unsigned int         sw_slice_int_en;       // slice end interrupt enable
+ *    unsigned int         sw_overrun_int_en;     // overrun error interrupt enable
+ *    unsigned int         vce_int_en;            // VCE interrupt enable, frame end and overflow
+ *    unsigned int         vce_slice_int_en;      // VCE slice end interrupt enable, frame end and overflow
+ *
+ * 2. configure wbif register
+ *    a. call mmhubbub_config_wbif()
+ *
+ * 3. Enable wbif
+ *    call set_wbif_bufmgr_enable();
+ *
+ * 4. wbif_dump_status(), option, for debug purpose
+ *    the bufmgr status can show the progress of write back, can be used for debug purpose
+ */
+
+static void mmhubbub32_warmup_mcif(struct mcif_wb *mcif_wb,
+               struct mcif_warmup_params *params)
+{
+       struct dcn30_mmhubbub *mcif_wb30 = TO_DCN30_MMHUBBUB(mcif_wb);
+       union large_integer start_address_shift = {.quad_part = params->start_address.quad_part >> 5};
+
+       /* Set base address and region size for warmup */
+       REG_SET(MMHUBBUB_WARMUP_BASE_ADDR_HIGH, 0, MMHUBBUB_WARMUP_BASE_ADDR_HIGH, start_address_shift.high_part);
+       REG_SET(MMHUBBUB_WARMUP_BASE_ADDR_LOW, 0, MMHUBBUB_WARMUP_BASE_ADDR_LOW, start_address_shift.low_part);
+       REG_SET(MMHUBBUB_WARMUP_ADDR_REGION, 0, MMHUBBUB_WARMUP_ADDR_REGION, params->region_size >> 5);
+//     REG_SET(MMHUBBUB_WARMUP_P_VMID, 0, MMHUBBUB_WARMUP_P_VMID, params->p_vmid);
+
+       /* Set address increment and enable warmup */
+       REG_SET_3(MMHUBBUB_WARMUP_CONTROL_STATUS, 0, MMHUBBUB_WARMUP_EN, true,
+                       MMHUBBUB_WARMUP_SW_INT_EN, true,
+                       MMHUBBUB_WARMUP_INC_ADDR, params->address_increment >> 5);
+
+       /* Wait for an interrupt to signal warmup is completed */
+       REG_WAIT(MMHUBBUB_WARMUP_CONTROL_STATUS, MMHUBBUB_WARMUP_SW_INT_STATUS, 1, 20, 100);
+
+       /* Acknowledge interrupt */
+       REG_UPDATE(MMHUBBUB_WARMUP_CONTROL_STATUS, MMHUBBUB_WARMUP_SW_INT_ACK, 1);
+
+       /* Disable warmup */
+       REG_UPDATE(MMHUBBUB_WARMUP_CONTROL_STATUS, MMHUBBUB_WARMUP_EN, false);
+}
+
+static void mmhubbub32_config_mcif_buf(struct mcif_wb *mcif_wb,
+               struct mcif_buf_params *params,
+               unsigned int dest_height)
+{
+       struct dcn30_mmhubbub *mcif_wb30 = TO_DCN30_MMHUBBUB(mcif_wb);
+
+       /* buffer address for packing mode or Luma in planar mode */
+       REG_UPDATE(MCIF_WB_BUF_1_ADDR_Y, MCIF_WB_BUF_1_ADDR_Y, MCIF_ADDR(params->luma_address[0]));
+       REG_UPDATE(MCIF_WB_BUF_1_ADDR_Y_HIGH, MCIF_WB_BUF_1_ADDR_Y_HIGH, MCIF_ADDR_HIGH(params->luma_address[0]));
+
+       /* buffer address for Chroma in planar mode (unused in packing mode) */
+       REG_UPDATE(MCIF_WB_BUF_1_ADDR_C, MCIF_WB_BUF_1_ADDR_C, MCIF_ADDR(params->chroma_address[0]));
+       REG_UPDATE(MCIF_WB_BUF_1_ADDR_C_HIGH, MCIF_WB_BUF_1_ADDR_C_HIGH, MCIF_ADDR_HIGH(params->chroma_address[0]));
+
+       /* buffer address for packing mode or Luma in planar mode */
+       REG_UPDATE(MCIF_WB_BUF_2_ADDR_Y, MCIF_WB_BUF_2_ADDR_Y, MCIF_ADDR(params->luma_address[1]));
+       REG_UPDATE(MCIF_WB_BUF_2_ADDR_Y_HIGH, MCIF_WB_BUF_2_ADDR_Y_HIGH, MCIF_ADDR_HIGH(params->luma_address[1]));
+
+       /* buffer address for Chroma in planar mode (unused in packing mode) */
+       REG_UPDATE(MCIF_WB_BUF_2_ADDR_C, MCIF_WB_BUF_2_ADDR_C, MCIF_ADDR(params->chroma_address[1]));
+       REG_UPDATE(MCIF_WB_BUF_2_ADDR_C_HIGH, MCIF_WB_BUF_2_ADDR_C_HIGH, MCIF_ADDR_HIGH(params->chroma_address[1]));
+
+       /* buffer address for packing mode or Luma in planar mode */
+       REG_UPDATE(MCIF_WB_BUF_3_ADDR_Y, MCIF_WB_BUF_3_ADDR_Y, MCIF_ADDR(params->luma_address[2]));
+       REG_UPDATE(MCIF_WB_BUF_3_ADDR_Y_HIGH, MCIF_WB_BUF_3_ADDR_Y_HIGH, MCIF_ADDR_HIGH(params->luma_address[2]));
+
+       /* buffer address for Chroma in planar mode (unused in packing mode) */
+       REG_UPDATE(MCIF_WB_BUF_3_ADDR_C, MCIF_WB_BUF_3_ADDR_C, MCIF_ADDR(params->chroma_address[2]));
+       REG_UPDATE(MCIF_WB_BUF_3_ADDR_C_HIGH, MCIF_WB_BUF_3_ADDR_C_HIGH, MCIF_ADDR_HIGH(params->chroma_address[2]));
+
+       /* buffer address for packing mode or Luma in planar mode */
+       REG_UPDATE(MCIF_WB_BUF_4_ADDR_Y, MCIF_WB_BUF_4_ADDR_Y, MCIF_ADDR(params->luma_address[3]));
+       REG_UPDATE(MCIF_WB_BUF_4_ADDR_Y_HIGH, MCIF_WB_BUF_4_ADDR_Y_HIGH, MCIF_ADDR_HIGH(params->luma_address[3]));
+
+       /* buffer address for Chroma in planar mode (unused in packing mode) */
+       REG_UPDATE(MCIF_WB_BUF_4_ADDR_C, MCIF_WB_BUF_4_ADDR_C, MCIF_ADDR(params->chroma_address[3]));
+       REG_UPDATE(MCIF_WB_BUF_4_ADDR_C_HIGH, MCIF_WB_BUF_4_ADDR_C_HIGH, MCIF_ADDR_HIGH(params->chroma_address[3]));
+
+       /* setup luma & chroma size
+        * should be enough to contain a whole frame Luma data,
+        * the programmed value is frame buffer size [27:8], 256-byte aligned
+        */
+       REG_UPDATE(MCIF_WB_BUF_LUMA_SIZE, MCIF_WB_BUF_LUMA_SIZE, (params->luma_pitch>>8) * dest_height);
+       REG_UPDATE(MCIF_WB_BUF_CHROMA_SIZE, MCIF_WB_BUF_CHROMA_SIZE, (params->chroma_pitch>>8) * dest_height);
+
+       /* enable address fence */
+       REG_UPDATE(MCIF_WB_BUFMGR_SW_CONTROL, MCIF_WB_BUF_ADDR_FENCE_EN, 1);
+
+       /* setup pitch, the programmed value is [15:8], 256B align */
+       REG_UPDATE_2(MCIF_WB_BUF_PITCH, MCIF_WB_BUF_LUMA_PITCH, params->luma_pitch >> 8,
+                       MCIF_WB_BUF_CHROMA_PITCH, params->chroma_pitch >> 8);
+}
+
+static void mmhubbub32_config_mcif_arb(struct mcif_wb *mcif_wb,
+               struct mcif_arb_params *params)
+{
+       struct dcn30_mmhubbub *mcif_wb30 = TO_DCN30_MMHUBBUB(mcif_wb);
+
+       /* Programmed by the video driver based on the CRTC timing (for DWB) */
+       REG_UPDATE(MCIF_WB_ARBITRATION_CONTROL, MCIF_WB_TIME_PER_PIXEL, params->time_per_pixel);
+
+       /* Programming dwb watermark */
+       /* Watermark to generate urgent in MCIF_WB_CLI, value is determined by MCIF_WB_CLI_WATERMARK_MASK. */
+       /* Program in ns. A formula will be provided in the pseudo code to calculate the value. */
+       REG_UPDATE(MCIF_WB_WATERMARK, MCIF_WB_CLI_WATERMARK_MASK, 0x0);
+       /* urgent_watermarkA */
+       REG_UPDATE(MCIF_WB_WATERMARK, MCIF_WB_CLI_WATERMARK,  params->cli_watermark[0]);
+       REG_UPDATE(MCIF_WB_WATERMARK, MCIF_WB_CLI_WATERMARK_MASK, 0x1);
+       /* urgent_watermarkB */
+       REG_UPDATE(MCIF_WB_WATERMARK, MCIF_WB_CLI_WATERMARK,  params->cli_watermark[1]);
+       REG_UPDATE(MCIF_WB_WATERMARK, MCIF_WB_CLI_WATERMARK_MASK, 0x2);
+       /* urgent_watermarkC */
+       REG_UPDATE(MCIF_WB_WATERMARK, MCIF_WB_CLI_WATERMARK,  params->cli_watermark[2]);
+       REG_UPDATE(MCIF_WB_WATERMARK, MCIF_WB_CLI_WATERMARK_MASK, 0x3);
+       /* urgent_watermarkD */
+       REG_UPDATE(MCIF_WB_WATERMARK, MCIF_WB_CLI_WATERMARK,  params->cli_watermark[3]);
+
+       /* Programming nb pstate watermark */
+       /* nbp_state_change_watermarkA */
+       REG_UPDATE(MCIF_WB_NB_PSTATE_LATENCY_WATERMARK, NB_PSTATE_CHANGE_WATERMARK_MASK, 0x0);
+       REG_UPDATE(MCIF_WB_NB_PSTATE_LATENCY_WATERMARK,
+                       NB_PSTATE_CHANGE_REFRESH_WATERMARK, params->pstate_watermark[0]);
+       /* nbp_state_change_watermarkB */
+       REG_UPDATE(MCIF_WB_NB_PSTATE_LATENCY_WATERMARK, NB_PSTATE_CHANGE_WATERMARK_MASK, 0x1);
+       REG_UPDATE(MCIF_WB_NB_PSTATE_LATENCY_WATERMARK,
+                       NB_PSTATE_CHANGE_REFRESH_WATERMARK, params->pstate_watermark[1]);
+       /* nbp_state_change_watermarkC */
+       REG_UPDATE(MCIF_WB_NB_PSTATE_LATENCY_WATERMARK, NB_PSTATE_CHANGE_WATERMARK_MASK, 0x2);
+       REG_UPDATE(MCIF_WB_NB_PSTATE_LATENCY_WATERMARK,
+                       NB_PSTATE_CHANGE_REFRESH_WATERMARK, params->pstate_watermark[2]);
+       /* nbp_state_change_watermarkD */
+       REG_UPDATE(MCIF_WB_NB_PSTATE_LATENCY_WATERMARK, NB_PSTATE_CHANGE_WATERMARK_MASK, 0x3);
+       REG_UPDATE(MCIF_WB_NB_PSTATE_LATENCY_WATERMARK,
+                       NB_PSTATE_CHANGE_REFRESH_WATERMARK, params->pstate_watermark[3]);
+
+       /* dram_speed_change_duration - register removed */
+       //REG_UPDATE(MCIF_WB_DRAM_SPEED_CHANGE_DURATION_VBI,
+       //              MCIF_WB_DRAM_SPEED_CHANGE_DURATION_VBI, params->dram_speed_change_duration);
+
+       /* max_scaled_time */
+       REG_UPDATE(MULTI_LEVEL_QOS_CTRL, MAX_SCALED_TIME_TO_URGENT, params->max_scaled_time);
+
+       /* slice_lines */
+       REG_UPDATE(MCIF_WB_BUFMGR_VCE_CONTROL, MCIF_WB_BUFMGR_SLICE_SIZE, params->slice_lines-1);
+
+       /* Set arbitration unit for Luma/Chroma */
+       /* arb_unit=2 should be chosen for more efficiency */
+       /* Arbitration size, 0: 2048 bytes 1: 4096 bytes 2: 8192 Bytes */
+       REG_UPDATE(MCIF_WB_ARBITRATION_CONTROL, MCIF_WB_CLIENT_ARBITRATION_SLICE,  params->arbitration_slice);
+}
+
+static const struct mcif_wb_funcs dcn32_mmhubbub_funcs = {
+       .warmup_mcif            = mmhubbub32_warmup_mcif,
+       .enable_mcif            = mmhubbub2_enable_mcif,
+       .disable_mcif           = mmhubbub2_disable_mcif,
+       .config_mcif_buf        = mmhubbub32_config_mcif_buf,
+       .config_mcif_arb        = mmhubbub32_config_mcif_arb,
+       .config_mcif_irq        = mmhubbub2_config_mcif_irq,
+       .dump_frame                     = mcifwb2_dump_frame,
+};
+
+void dcn32_mmhubbub_construct(struct dcn30_mmhubbub *mcif_wb30,
+               struct dc_context *ctx,
+               const struct dcn30_mmhubbub_registers *mcif_wb_regs,
+               const struct dcn30_mmhubbub_shift *mcif_wb_shift,
+               const struct dcn30_mmhubbub_mask *mcif_wb_mask,
+               int inst)
+{
+       mcif_wb30->base.ctx = ctx;
+
+       mcif_wb30->base.inst = inst;
+       mcif_wb30->base.funcs = &dcn32_mmhubbub_funcs;
+
+       mcif_wb30->mcif_wb_regs = mcif_wb_regs;
+       mcif_wb30->mcif_wb_shift = mcif_wb_shift;
+       mcif_wb30->mcif_wb_mask = mcif_wb_mask;
+}
diff --git a/drivers/gpu/drm/amd/display/dc/mmhubbub/dcn32/dcn32_mmhubbub.h b/drivers/gpu/drm/amd/display/dc/mmhubbub/dcn32/dcn32_mmhubbub.h
new file mode 100644 (file)
index 0000000..ef15b4f
--- /dev/null
@@ -0,0 +1,211 @@
+/*
+ * Copyright 2021 Advanced Micro Devices, Inc.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+ * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
+ * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+ * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+ * OTHER DEALINGS IN THE SOFTWARE.
+ *
+ * Authors: AMD
+ *
+ */
+
+#ifndef __DC_MCIF_WB_DCN32_H__
+#define __DC_MCIF_WB_DCN32_H__
+
+#include "dcn20/dcn20_mmhubbub.h"
+#include "dcn30/dcn30_mmhubbub.h"
+
+#define MCIF_WB_COMMON_REG_LIST_DCN32(inst) \
+       SRI2(MCIF_WB_BUFMGR_SW_CONTROL, MCIF_WB, inst),\
+       SRI2(MCIF_WB_BUFMGR_STATUS, MCIF_WB, inst),\
+       SRI2(MCIF_WB_BUF_PITCH, MCIF_WB, inst),\
+       SRI2(MCIF_WB_BUF_1_STATUS, MCIF_WB, inst),\
+       SRI2(MCIF_WB_BUF_1_STATUS2, MCIF_WB, inst),\
+       SRI2(MCIF_WB_BUF_2_STATUS, MCIF_WB, inst),\
+       SRI2(MCIF_WB_BUF_2_STATUS2, MCIF_WB, inst),\
+       SRI2(MCIF_WB_BUF_3_STATUS, MCIF_WB, inst),\
+       SRI2(MCIF_WB_BUF_3_STATUS2, MCIF_WB, inst),\
+       SRI2(MCIF_WB_BUF_4_STATUS, MCIF_WB, inst),\
+       SRI2(MCIF_WB_BUF_4_STATUS2, MCIF_WB, inst),\
+       SRI2(MCIF_WB_ARBITRATION_CONTROL, MCIF_WB, inst),\
+       SRI2(MCIF_WB_SCLK_CHANGE, MCIF_WB, inst),\
+       SRI2(MCIF_WB_BUF_1_ADDR_Y, MCIF_WB, inst),\
+       SRI2(MCIF_WB_BUF_1_ADDR_C, MCIF_WB, inst),\
+       SRI2(MCIF_WB_BUF_2_ADDR_Y, MCIF_WB, inst),\
+       SRI2(MCIF_WB_BUF_2_ADDR_C, MCIF_WB, inst),\
+       SRI2(MCIF_WB_BUF_3_ADDR_Y, MCIF_WB, inst),\
+       SRI2(MCIF_WB_BUF_3_ADDR_C, MCIF_WB, inst),\
+       SRI2(MCIF_WB_BUF_4_ADDR_Y, MCIF_WB, inst),\
+       SRI2(MCIF_WB_BUF_4_ADDR_C, MCIF_WB, inst),\
+       SRI2(MCIF_WB_BUFMGR_VCE_CONTROL, MCIF_WB, inst),\
+       SRI2(MCIF_WB_NB_PSTATE_LATENCY_WATERMARK, MMHUBBUB, inst),\
+       SRI2(MCIF_WB_NB_PSTATE_CONTROL, MCIF_WB, inst),\
+       SRI2(MCIF_WB_WATERMARK, MMHUBBUB, inst),\
+       SRI2(MCIF_WB_CLOCK_GATER_CONTROL, MCIF_WB, inst),\
+       SRI2(MCIF_WB_SELF_REFRESH_CONTROL, MCIF_WB, inst),\
+       SRI2(MULTI_LEVEL_QOS_CTRL, MCIF_WB, inst),\
+       SRI2(MCIF_WB_SECURITY_LEVEL, MCIF_WB, inst),\
+       SRI2(MCIF_WB_BUF_LUMA_SIZE, MCIF_WB, inst),\
+       SRI2(MCIF_WB_BUF_CHROMA_SIZE, MCIF_WB, inst),\
+       SRI2(MCIF_WB_BUF_1_ADDR_Y_HIGH, MCIF_WB, inst),\
+       SRI2(MCIF_WB_BUF_1_ADDR_C_HIGH, MCIF_WB, inst),\
+       SRI2(MCIF_WB_BUF_2_ADDR_Y_HIGH, MCIF_WB, inst),\
+       SRI2(MCIF_WB_BUF_2_ADDR_C_HIGH, MCIF_WB, inst),\
+       SRI2(MCIF_WB_BUF_3_ADDR_Y_HIGH, MCIF_WB, inst),\
+       SRI2(MCIF_WB_BUF_3_ADDR_C_HIGH, MCIF_WB, inst),\
+       SRI2(MCIF_WB_BUF_4_ADDR_Y_HIGH, MCIF_WB, inst),\
+       SRI2(MCIF_WB_BUF_4_ADDR_C_HIGH, MCIF_WB, inst),\
+       SRI2(MCIF_WB_BUF_1_RESOLUTION, MCIF_WB, inst),\
+       SRI2(MCIF_WB_BUF_2_RESOLUTION, MCIF_WB, inst),\
+       SRI2(MCIF_WB_BUF_3_RESOLUTION, MCIF_WB, inst),\
+       SRI2(MCIF_WB_BUF_4_RESOLUTION, MCIF_WB, inst),\
+       SRI2(MMHUBBUB_MEM_PWR_CNTL, MMHUBBUB, inst),\
+       SRI2(MMHUBBUB_WARMUP_ADDR_REGION, MMHUBBUB, inst),\
+       SRI2(MMHUBBUB_WARMUP_BASE_ADDR_HIGH, MMHUBBUB, inst),\
+       SRI2(MMHUBBUB_WARMUP_BASE_ADDR_LOW, MMHUBBUB, inst),\
+       SRI2(MMHUBBUB_WARMUP_CONTROL_STATUS, MMHUBBUB, inst)
+
+
+#define MCIF_WB_COMMON_MASK_SH_LIST_DCN32(mask_sh) \
+       SF(MCIF_WB_BUFMGR_SW_CONTROL, MCIF_WB_BUFMGR_ENABLE, mask_sh),\
+       SF(MCIF_WB_BUFMGR_SW_CONTROL, MCIF_WB_BUFMGR_SW_INT_EN, mask_sh),\
+       SF(MCIF_WB_BUFMGR_SW_CONTROL, MCIF_WB_BUFMGR_SW_INT_ACK, mask_sh),\
+       SF(MCIF_WB_BUFMGR_SW_CONTROL, MCIF_WB_BUFMGR_SW_SLICE_INT_EN, mask_sh),\
+       SF(MCIF_WB_BUFMGR_SW_CONTROL, MCIF_WB_BUFMGR_SW_OVERRUN_INT_EN, mask_sh),\
+       SF(MCIF_WB_BUFMGR_SW_CONTROL, MCIF_WB_BUFMGR_SW_LOCK, mask_sh),\
+       SF(MCIF_WB_BUFMGR_SW_CONTROL, MCIF_WB_BUF_ADDR_FENCE_EN, mask_sh),\
+       SF(MCIF_WB_BUFMGR_STATUS, MCIF_WB_BUFMGR_SW_INT_STATUS, mask_sh),\
+       SF(MCIF_WB_BUFMGR_STATUS, MCIF_WB_BUFMGR_SW_OVERRUN_INT_STATUS, mask_sh),\
+       SF(MCIF_WB_BUFMGR_STATUS, MCIF_WB_BUFMGR_CUR_BUF, mask_sh),\
+       SF(MCIF_WB_BUFMGR_STATUS, MCIF_WB_BUFMGR_BUFTAG, mask_sh),\
+       SF(MCIF_WB_BUFMGR_STATUS, MCIF_WB_BUFMGR_CUR_LINE_L, mask_sh),\
+       SF(MCIF_WB_BUFMGR_STATUS, MCIF_WB_BUFMGR_NEXT_BUF, mask_sh),\
+       SF(MCIF_WB_BUF_PITCH, MCIF_WB_BUF_LUMA_PITCH, mask_sh),\
+       SF(MCIF_WB_BUF_PITCH, MCIF_WB_BUF_CHROMA_PITCH, mask_sh),\
+       SF(MCIF_WB_BUF_1_STATUS, MCIF_WB_BUF_1_ACTIVE, mask_sh),\
+       SF(MCIF_WB_BUF_1_STATUS, MCIF_WB_BUF_1_SW_LOCKED, mask_sh),\
+       SF(MCIF_WB_BUF_1_STATUS, MCIF_WB_BUF_1_OVERFLOW, mask_sh),\
+       SF(MCIF_WB_BUF_1_STATUS, MCIF_WB_BUF_1_DISABLE, mask_sh),\
+       SF(MCIF_WB_BUF_1_STATUS, MCIF_WB_BUF_1_MODE, mask_sh),\
+       SF(MCIF_WB_BUF_1_STATUS, MCIF_WB_BUF_1_BUFTAG, mask_sh),\
+       SF(MCIF_WB_BUF_1_STATUS, MCIF_WB_BUF_1_NXT_BUF, mask_sh),\
+       SF(MCIF_WB_BUF_1_STATUS, MCIF_WB_BUF_1_CUR_LINE_L, mask_sh),\
+       SF(MCIF_WB_BUF_1_STATUS2, MCIF_WB_BUF_1_NEW_CONTENT, mask_sh),\
+       SF(MCIF_WB_BUF_1_STATUS2, MCIF_WB_BUF_1_COLOR_DEPTH, mask_sh),\
+       SF(MCIF_WB_BUF_1_STATUS2, MCIF_WB_BUF_1_TMZ_BLACK_PIXEL, mask_sh),\
+       SF(MCIF_WB_BUF_1_STATUS2, MCIF_WB_BUF_1_TMZ, mask_sh),\
+       SF(MCIF_WB_BUF_1_STATUS2, MCIF_WB_BUF_1_Y_OVERRUN, mask_sh),\
+       SF(MCIF_WB_BUF_1_STATUS2, MCIF_WB_BUF_1_C_OVERRUN, mask_sh),\
+       SF(MCIF_WB_BUF_2_STATUS, MCIF_WB_BUF_2_ACTIVE, mask_sh),\
+       SF(MCIF_WB_BUF_2_STATUS, MCIF_WB_BUF_2_SW_LOCKED, mask_sh),\
+       SF(MCIF_WB_BUF_2_STATUS, MCIF_WB_BUF_2_OVERFLOW, mask_sh),\
+       SF(MCIF_WB_BUF_2_STATUS, MCIF_WB_BUF_2_DISABLE, mask_sh),\
+       SF(MCIF_WB_BUF_2_STATUS, MCIF_WB_BUF_2_MODE, mask_sh),\
+       SF(MCIF_WB_BUF_2_STATUS, MCIF_WB_BUF_2_BUFTAG, mask_sh),\
+       SF(MCIF_WB_BUF_2_STATUS, MCIF_WB_BUF_2_NXT_BUF, mask_sh),\
+       SF(MCIF_WB_BUF_2_STATUS, MCIF_WB_BUF_2_CUR_LINE_L, mask_sh),\
+       SF(MCIF_WB_BUF_2_STATUS2, MCIF_WB_BUF_2_NEW_CONTENT, mask_sh),\
+       SF(MCIF_WB_BUF_2_STATUS2, MCIF_WB_BUF_2_COLOR_DEPTH, mask_sh),\
+       SF(MCIF_WB_BUF_2_STATUS2, MCIF_WB_BUF_2_TMZ_BLACK_PIXEL, mask_sh),\
+       SF(MCIF_WB_BUF_2_STATUS2, MCIF_WB_BUF_2_TMZ, mask_sh),\
+       SF(MCIF_WB_BUF_2_STATUS2, MCIF_WB_BUF_2_Y_OVERRUN, mask_sh),\
+       SF(MCIF_WB_BUF_2_STATUS2, MCIF_WB_BUF_2_C_OVERRUN, mask_sh),\
+       SF(MCIF_WB_BUF_3_STATUS, MCIF_WB_BUF_3_ACTIVE, mask_sh),\
+       SF(MCIF_WB_BUF_3_STATUS, MCIF_WB_BUF_3_SW_LOCKED, mask_sh),\
+       SF(MCIF_WB_BUF_3_STATUS, MCIF_WB_BUF_3_OVERFLOW, mask_sh),\
+       SF(MCIF_WB_BUF_3_STATUS, MCIF_WB_BUF_3_DISABLE, mask_sh),\
+       SF(MCIF_WB_BUF_3_STATUS, MCIF_WB_BUF_3_MODE, mask_sh),\
+       SF(MCIF_WB_BUF_3_STATUS, MCIF_WB_BUF_3_BUFTAG, mask_sh),\
+       SF(MCIF_WB_BUF_3_STATUS, MCIF_WB_BUF_3_NXT_BUF, mask_sh),\
+       SF(MCIF_WB_BUF_3_STATUS, MCIF_WB_BUF_3_CUR_LINE_L, mask_sh),\
+       SF(MCIF_WB_BUF_3_STATUS2, MCIF_WB_BUF_3_NEW_CONTENT, mask_sh),\
+       SF(MCIF_WB_BUF_3_STATUS2, MCIF_WB_BUF_3_COLOR_DEPTH, mask_sh),\
+       SF(MCIF_WB_BUF_3_STATUS2, MCIF_WB_BUF_3_TMZ_BLACK_PIXEL, mask_sh),\
+       SF(MCIF_WB_BUF_3_STATUS2, MCIF_WB_BUF_3_TMZ, mask_sh),\
+       SF(MCIF_WB_BUF_3_STATUS2, MCIF_WB_BUF_3_Y_OVERRUN, mask_sh),\
+       SF(MCIF_WB_BUF_3_STATUS2, MCIF_WB_BUF_3_C_OVERRUN, mask_sh),\
+       SF(MCIF_WB_BUF_4_STATUS, MCIF_WB_BUF_4_ACTIVE, mask_sh),\
+       SF(MCIF_WB_BUF_4_STATUS, MCIF_WB_BUF_4_SW_LOCKED, mask_sh),\
+       SF(MCIF_WB_BUF_4_STATUS, MCIF_WB_BUF_4_OVERFLOW, mask_sh),\
+       SF(MCIF_WB_BUF_4_STATUS, MCIF_WB_BUF_4_DISABLE, mask_sh),\
+       SF(MCIF_WB_BUF_4_STATUS, MCIF_WB_BUF_4_MODE, mask_sh),\
+       SF(MCIF_WB_BUF_4_STATUS, MCIF_WB_BUF_4_BUFTAG, mask_sh),\
+       SF(MCIF_WB_BUF_4_STATUS, MCIF_WB_BUF_4_NXT_BUF, mask_sh),\
+       SF(MCIF_WB_BUF_4_STATUS, MCIF_WB_BUF_4_CUR_LINE_L, mask_sh),\
+       SF(MCIF_WB_BUF_4_STATUS2, MCIF_WB_BUF_4_NEW_CONTENT, mask_sh),\
+       SF(MCIF_WB_BUF_4_STATUS2, MCIF_WB_BUF_4_COLOR_DEPTH, mask_sh),\
+       SF(MCIF_WB_BUF_4_STATUS2, MCIF_WB_BUF_4_TMZ_BLACK_PIXEL, mask_sh),\
+       SF(MCIF_WB_BUF_4_STATUS2, MCIF_WB_BUF_4_TMZ, mask_sh),\
+       SF(MCIF_WB_BUF_4_STATUS2, MCIF_WB_BUF_4_Y_OVERRUN, mask_sh),\
+       SF(MCIF_WB_BUF_4_STATUS2, MCIF_WB_BUF_4_C_OVERRUN, mask_sh),\
+       SF(MCIF_WB_ARBITRATION_CONTROL, MCIF_WB_CLIENT_ARBITRATION_SLICE, mask_sh),\
+       SF(MCIF_WB_ARBITRATION_CONTROL, MCIF_WB_TIME_PER_PIXEL, mask_sh),\
+       SF(MCIF_WB_SCLK_CHANGE, WM_CHANGE_ACK_FORCE_ON, mask_sh),\
+       SF(MCIF_WB_BUF_1_ADDR_Y, MCIF_WB_BUF_1_ADDR_Y, mask_sh),\
+       SF(MCIF_WB_BUF_1_ADDR_C, MCIF_WB_BUF_1_ADDR_C, mask_sh),\
+       SF(MCIF_WB_BUF_2_ADDR_Y, MCIF_WB_BUF_2_ADDR_Y, mask_sh),\
+       SF(MCIF_WB_BUF_2_ADDR_C, MCIF_WB_BUF_2_ADDR_C, mask_sh),\
+       SF(MCIF_WB_BUF_3_ADDR_Y, MCIF_WB_BUF_3_ADDR_Y, mask_sh),\
+       SF(MCIF_WB_BUF_3_ADDR_C, MCIF_WB_BUF_3_ADDR_C, mask_sh),\
+       SF(MCIF_WB_BUF_4_ADDR_Y, MCIF_WB_BUF_4_ADDR_Y, mask_sh),\
+       SF(MCIF_WB_BUF_4_ADDR_C, MCIF_WB_BUF_4_ADDR_C, mask_sh),\
+       SF(MCIF_WB_BUFMGR_VCE_CONTROL, MCIF_WB_BUFMGR_SLICE_SIZE, mask_sh),\
+       SF(MCIF_WB_NB_PSTATE_LATENCY_WATERMARK, NB_PSTATE_CHANGE_REFRESH_WATERMARK, mask_sh),\
+       SF(MCIF_WB_NB_PSTATE_LATENCY_WATERMARK, NB_PSTATE_CHANGE_WATERMARK_MASK, mask_sh),\
+       SF(MCIF_WB_NB_PSTATE_CONTROL, NB_PSTATE_CHANGE_FORCE_ON, mask_sh),\
+       SF(MCIF_WB_WATERMARK, MCIF_WB_CLI_WATERMARK, mask_sh),\
+       SF(MCIF_WB_WATERMARK, MCIF_WB_CLI_WATERMARK_MASK, mask_sh),\
+       SF(MCIF_WB_CLOCK_GATER_CONTROL, MCIF_WB_CLI_CLOCK_GATER_OVERRIDE, mask_sh),\
+       SF(MCIF_WB_SELF_REFRESH_CONTROL, PERFRAME_SELF_REFRESH, mask_sh),\
+       SF(MULTI_LEVEL_QOS_CTRL, MAX_SCALED_TIME_TO_URGENT, mask_sh),\
+       SF(MCIF_WB_SECURITY_LEVEL, MCIF_WB_SECURITY_LEVEL, mask_sh),\
+       SF(MCIF_WB_BUF_LUMA_SIZE, MCIF_WB_BUF_LUMA_SIZE, mask_sh),\
+       SF(MCIF_WB_BUF_CHROMA_SIZE, MCIF_WB_BUF_CHROMA_SIZE, mask_sh),\
+       SF(MCIF_WB_BUF_1_ADDR_Y_HIGH, MCIF_WB_BUF_1_ADDR_Y_HIGH, mask_sh),\
+       SF(MCIF_WB_BUF_1_ADDR_C_HIGH, MCIF_WB_BUF_1_ADDR_C_HIGH, mask_sh),\
+       SF(MCIF_WB_BUF_2_ADDR_Y_HIGH, MCIF_WB_BUF_2_ADDR_Y_HIGH, mask_sh),\
+       SF(MCIF_WB_BUF_2_ADDR_C_HIGH, MCIF_WB_BUF_2_ADDR_C_HIGH, mask_sh),\
+       SF(MCIF_WB_BUF_3_ADDR_Y_HIGH, MCIF_WB_BUF_3_ADDR_Y_HIGH, mask_sh),\
+       SF(MCIF_WB_BUF_3_ADDR_C_HIGH, MCIF_WB_BUF_3_ADDR_C_HIGH, mask_sh),\
+       SF(MCIF_WB_BUF_4_ADDR_Y_HIGH, MCIF_WB_BUF_4_ADDR_Y_HIGH, mask_sh),\
+       SF(MCIF_WB_BUF_4_ADDR_C_HIGH, MCIF_WB_BUF_4_ADDR_C_HIGH, mask_sh),\
+       SF(MCIF_WB_BUF_1_RESOLUTION, MCIF_WB_BUF_1_RESOLUTION_WIDTH, mask_sh),\
+       SF(MCIF_WB_BUF_1_RESOLUTION, MCIF_WB_BUF_1_RESOLUTION_HEIGHT, mask_sh),\
+       SF(MCIF_WB_BUF_2_RESOLUTION, MCIF_WB_BUF_2_RESOLUTION_WIDTH, mask_sh),\
+       SF(MCIF_WB_BUF_2_RESOLUTION, MCIF_WB_BUF_2_RESOLUTION_HEIGHT, mask_sh),\
+       SF(MCIF_WB_BUF_3_RESOLUTION, MCIF_WB_BUF_3_RESOLUTION_WIDTH, mask_sh),\
+       SF(MCIF_WB_BUF_3_RESOLUTION, MCIF_WB_BUF_3_RESOLUTION_HEIGHT, mask_sh),\
+       SF(MCIF_WB_BUF_4_RESOLUTION, MCIF_WB_BUF_4_RESOLUTION_WIDTH, mask_sh),\
+       SF(MCIF_WB_BUF_4_RESOLUTION, MCIF_WB_BUF_4_RESOLUTION_HEIGHT, mask_sh),\
+       SF(MMHUBBUB_WARMUP_ADDR_REGION, MMHUBBUB_WARMUP_ADDR_REGION, mask_sh),\
+       SF(MMHUBBUB_WARMUP_BASE_ADDR_HIGH, MMHUBBUB_WARMUP_BASE_ADDR_HIGH, mask_sh),\
+       SF(MMHUBBUB_WARMUP_BASE_ADDR_LOW, MMHUBBUB_WARMUP_BASE_ADDR_LOW, mask_sh),\
+       SF(MMHUBBUB_WARMUP_CONTROL_STATUS, MMHUBBUB_WARMUP_EN, mask_sh),\
+       SF(MMHUBBUB_WARMUP_CONTROL_STATUS, MMHUBBUB_WARMUP_SW_INT_EN, mask_sh),\
+       SF(MMHUBBUB_WARMUP_CONTROL_STATUS, MMHUBBUB_WARMUP_SW_INT_STATUS, mask_sh),\
+       SF(MMHUBBUB_WARMUP_CONTROL_STATUS, MMHUBBUB_WARMUP_SW_INT_ACK, mask_sh),\
+       SF(MMHUBBUB_WARMUP_CONTROL_STATUS, MMHUBBUB_WARMUP_INC_ADDR, mask_sh)
+
+
+void dcn32_mmhubbub_construct(struct dcn30_mmhubbub *mcif_wb30,
+       struct dc_context *ctx,
+       const struct dcn30_mmhubbub_registers *mcif_wb_regs,
+       const struct dcn30_mmhubbub_shift *mcif_wb_shift,
+       const struct dcn30_mmhubbub_mask *mcif_wb_mask,
+       int inst);
+
+#endif //__DC_MCIF_WB_DCN32_H__
diff --git a/drivers/gpu/drm/amd/display/dc/mmhubbub/dcn35/dcn35_mmhubbub.c b/drivers/gpu/drm/amd/display/dc/mmhubbub/dcn35/dcn35_mmhubbub.c
new file mode 100644 (file)
index 0000000..4317100
--- /dev/null
@@ -0,0 +1,59 @@
+/* SPDX-License-Identifier: MIT */
+/*
+ * Copyright 2023 Advanced Micro Devices, Inc.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+ * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
+ * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+ * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+ * OTHER DEALINGS IN THE SOFTWARE.
+ *
+ * Authors: AMD
+ *
+ */
+
+#include "dcn35_mmhubbub.h"
+#include "reg_helper.h"
+
+#define REG(reg)                                                             \
+       ((const struct dcn35_mmhubbub_registers *)(mcif_wb30->mcif_wb_regs)) \
+               ->reg
+
+#define CTX mcif_wb30->base.ctx
+
+#undef FN
+#define FN(reg_name, field_name)                                                \
+       ((const struct dcn35_mmhubbub_shift *)(mcif_wb30->mcif_wb_shift))       \
+               ->field_name,                                                   \
+               ((const struct dcn35_mmhubbub_mask *)(mcif_wb30->mcif_wb_mask)) \
+                       ->field_name
+
+void dcn35_mmhubbub_construct(
+       struct dcn30_mmhubbub *mcif_wb30, struct dc_context *ctx,
+       const struct dcn35_mmhubbub_registers *mcif_wb_regs,
+       const struct dcn35_mmhubbub_shift *mcif_wb_shift,
+       const struct dcn35_mmhubbub_mask *mcif_wb_mask, int inst)
+{
+       dcn32_mmhubbub_construct(
+               mcif_wb30, ctx,
+               (const struct dcn30_mmhubbub_registers *)(mcif_wb_regs),
+               (const struct dcn30_mmhubbub_shift *)(mcif_wb_shift),
+               (const struct dcn30_mmhubbub_mask *)(mcif_wb_mask), inst);
+}
+
+void dcn35_mmhubbub_set_fgcg(struct dcn30_mmhubbub *mcif_wb30, bool enabled)
+{
+       REG_UPDATE(MMHUBBUB_CLOCK_CNTL, MMHUBBUB_FGCG_REP_DIS, !enabled);
+}
diff --git a/drivers/gpu/drm/amd/display/dc/mmhubbub/dcn35/dcn35_mmhubbub.h b/drivers/gpu/drm/amd/display/dc/mmhubbub/dcn35/dcn35_mmhubbub.h
new file mode 100644 (file)
index 0000000..098e13e
--- /dev/null
@@ -0,0 +1,75 @@
+/* SPDX-License-Identifier: MIT */
+/*
+ * Copyright 2023 Advanced Micro Devices, Inc.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+ * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
+ * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+ * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+ * OTHER DEALINGS IN THE SOFTWARE.
+ *
+ * Authors: AMD
+ *
+ */
+
+#ifndef __DCN35_MMHUBBUB_H
+#define __DCN35_MMHUBBUB_H
+
+#include "mcif_wb.h"
+#include "dcn32/dcn32_mmhubbub.h"
+
+#define MCIF_WB_REG_VARIABLE_LIST_DCN3_5  \
+       MCIF_WB_REG_VARIABLE_LIST_DCN3_0; \
+       uint32_t MMHUBBUB_CLOCK_CNTL
+
+#define MCIF_WB_COMMON_MASK_SH_LIST_DCN3_5(mask_sh)                            \
+       MCIF_WB_COMMON_MASK_SH_LIST_DCN32(mask_sh),                            \
+               SF(MMHUBBUB_CLOCK_CNTL, MMHUBBUB_TEST_CLK_SEL, mask_sh),       \
+               SF(MMHUBBUB_CLOCK_CNTL, DISPCLK_R_MMHUBBUB_GATE_DIS, mask_sh), \
+               SF(MMHUBBUB_CLOCK_CNTL, DISPCLK_G_WBIF0_GATE_DIS, mask_sh),    \
+               SF(MMHUBBUB_CLOCK_CNTL, SOCCLK_G_WBIF0_GATE_DIS, mask_sh),     \
+               SF(MMHUBBUB_CLOCK_CNTL, MMHUBBUB_FGCG_REP_DIS, mask_sh)
+
+#define MCIF_WB_REG_FIELD_LIST_DCN3_5(type)          \
+       struct {                                     \
+               MCIF_WB_REG_FIELD_LIST_DCN3_0(type); \
+               type MMHUBBUB_TEST_CLK_SEL;          \
+               type DISPCLK_R_MMHUBBUB_GATE_DIS;    \
+               type DISPCLK_G_WBIF0_GATE_DIS;       \
+               type SOCCLK_G_WBIF0_GATE_DIS;        \
+               type MMHUBBUB_FGCG_REP_DIS;          \
+       }
+
+struct dcn35_mmhubbub_registers {
+       MCIF_WB_REG_VARIABLE_LIST_DCN3_5;
+};
+
+struct dcn35_mmhubbub_mask {
+       MCIF_WB_REG_FIELD_LIST_DCN3_5(uint32_t);
+};
+
+struct dcn35_mmhubbub_shift {
+       MCIF_WB_REG_FIELD_LIST_DCN3_5(uint8_t);
+};
+
+void dcn35_mmhubbub_construct(
+       struct dcn30_mmhubbub *mcif_wb30, struct dc_context *ctx,
+       const struct dcn35_mmhubbub_registers *mcif_wb_regs,
+       const struct dcn35_mmhubbub_shift *mcif_wb_shift,
+       const struct dcn35_mmhubbub_mask *mcif_wb_mask, int inst);
+
+void dcn35_mmhubbub_set_fgcg(struct dcn30_mmhubbub *mcif_wb30, bool enabled);
+
+#endif // __DCN35_MMHUBBUB_H
diff --git a/drivers/gpu/drm/amd/display/dc/mpc/Makefile b/drivers/gpu/drm/amd/display/dc/mpc/Makefile
new file mode 100644 (file)
index 0000000..7f7458c
--- /dev/null
@@ -0,0 +1,45 @@
+#
+# Copyright 2020 Advanced Micro Devices, Inc.
+#
+# Permission is hereby granted, free of charge, to any person obtaining a
+# copy of this software and associated documentation files (the "Software"),
+# to deal in the Software without restriction, including without limitation
+# the rights to use, copy, modify, merge, publish, distribute, sublicense,
+# and/or sell copies of the Software, and to permit persons to whom the
+# Software is furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in
+# all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+# THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
+# OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+# ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+# OTHER DEALINGS IN THE SOFTWARE.
+#
+# Authors: AMD
+#
+#
+
+ifdef CONFIG_DRM_AMD_DC_FP
+###############################################################################
+# DCN32
+###############################################################################
+MPC_DCN32 = dcn32_mpc.o
+
+AMD_DAL_MPC_DCN32 = $(addprefix $(AMDDALPATH)/dc/mpc/dcn32/,$(MPC_DCN32))
+
+AMD_DISPLAY_FILES += $(AMD_DAL_MPC_DCN32)
+
+###############################################################################
+# DCN401
+###############################################################################
+MPC_DCN401 = dcn401_mpc.o
+
+AMD_DAL_MPC_DCN401 = $(addprefix $(AMDDALPATH)/dc/mpc/dcn401/,$(MPC_DCN401))
+
+AMD_DISPLAY_FILES += $(AMD_DAL_MPC_DCN401)
+
+endif
diff --git a/drivers/gpu/drm/amd/display/dc/mpc/dcn32/dcn32_mpc.c b/drivers/gpu/drm/amd/display/dc/mpc/dcn32/dcn32_mpc.c
new file mode 100644 (file)
index 0000000..a0e9e9f
--- /dev/null
@@ -0,0 +1,1050 @@
+/*
+ * Copyright 2021 Advanced Micro Devices, Inc.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+ * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
+ * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+ * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+ * OTHER DEALINGS IN THE SOFTWARE.
+ *
+ * Authors: AMD
+ *
+ */
+
+#include "reg_helper.h"
+#include "dcn30/dcn30_mpc.h"
+#include "dcn30/dcn30_cm_common.h"
+#include "dcn32_mpc.h"
+#include "basics/conversion.h"
+#include "dcn10/dcn10_cm_common.h"
+#include "dc.h"
+#include "dcn401/dcn401_mpc.h"
+
+#define REG(reg)\
+       mpc30->mpc_regs->reg
+
+#define CTX \
+       mpc30->base.ctx
+
+#undef FN
+#define FN(reg_name, field_name) \
+       mpc30->mpc_shift->field_name, mpc30->mpc_mask->field_name
+
+
+void mpc32_mpc_init(struct mpc *mpc)
+{
+       struct dcn30_mpc *mpc30 = TO_DCN30_MPC(mpc);
+       int mpcc_id;
+
+       mpc3_mpc_init(mpc);
+
+       if (mpc->ctx->dc->debug.enable_mem_low_power.bits.mpc) {
+               if (mpc30->mpc_mask->MPCC_MCM_SHAPER_MEM_LOW_PWR_MODE && mpc30->mpc_mask->MPCC_MCM_3DLUT_MEM_LOW_PWR_MODE) {
+                       for (mpcc_id = 0; mpcc_id < mpc30->num_mpcc; mpcc_id++) {
+                               REG_UPDATE(MPCC_MCM_MEM_PWR_CTRL[mpcc_id], MPCC_MCM_SHAPER_MEM_LOW_PWR_MODE, 3);
+                               REG_UPDATE(MPCC_MCM_MEM_PWR_CTRL[mpcc_id], MPCC_MCM_3DLUT_MEM_LOW_PWR_MODE, 3);
+                               REG_UPDATE(MPCC_MCM_MEM_PWR_CTRL[mpcc_id], MPCC_MCM_1DLUT_MEM_LOW_PWR_MODE, 3);
+                       }
+               }
+               if (mpc30->mpc_mask->MPCC_OGAM_MEM_LOW_PWR_MODE) {
+                       for (mpcc_id = 0; mpcc_id < mpc30->num_mpcc; mpcc_id++)
+                               REG_UPDATE(MPCC_MEM_PWR_CTRL[mpcc_id], MPCC_OGAM_MEM_LOW_PWR_MODE, 3);
+               }
+       }
+}
+
+void mpc32_power_on_blnd_lut(
+       struct mpc *mpc,
+       uint32_t mpcc_id,
+       bool power_on)
+{
+       struct dcn30_mpc *mpc30 = TO_DCN30_MPC(mpc);
+
+       REG_SET(MPCC_MCM_MEM_PWR_CTRL[mpcc_id], 0, MPCC_MCM_1DLUT_MEM_PWR_DIS, power_on);
+
+       if (mpc->ctx->dc->debug.enable_mem_low_power.bits.cm) {
+               if (power_on) {
+                       REG_UPDATE(MPCC_MCM_MEM_PWR_CTRL[mpcc_id], MPCC_MCM_1DLUT_MEM_PWR_FORCE, 0);
+                       REG_WAIT(MPCC_MCM_MEM_PWR_CTRL[mpcc_id], MPCC_MCM_1DLUT_MEM_PWR_STATE, 0, 1, 5);
+               } else if (!mpc->ctx->dc->debug.disable_mem_low_power) {
+                       /* TODO: change to mpc
+                        *  dpp_base->ctx->dc->optimized_required = true;
+                        *  dpp_base->deferred_reg_writes.bits.disable_blnd_lut = true;
+                        */
+               }
+       } else {
+               REG_SET(MPCC_MCM_MEM_PWR_CTRL[mpcc_id], 0,
+                               MPCC_MCM_1DLUT_MEM_PWR_FORCE, power_on == true ? 0 : 1);
+       }
+}
+
+static enum dc_lut_mode mpc32_get_post1dlut_current(struct mpc *mpc, uint32_t mpcc_id)
+{
+       enum dc_lut_mode mode;
+       uint32_t mode_current = 0;
+       uint32_t in_use = 0;
+
+       struct dcn30_mpc *mpc30 = TO_DCN30_MPC(mpc);
+
+       REG_GET(MPCC_MCM_1DLUT_CONTROL[mpcc_id],
+                       MPCC_MCM_1DLUT_MODE_CURRENT, &mode_current);
+       REG_GET(MPCC_MCM_1DLUT_CONTROL[mpcc_id],
+                       MPCC_MCM_1DLUT_SELECT_CURRENT, &in_use);
+
+       switch (mode_current) {
+       case 0:
+       case 1:
+               mode = LUT_BYPASS;
+               break;
+
+       case 2:
+               if (in_use == 0)
+                       mode = LUT_RAM_A;
+               else
+                       mode = LUT_RAM_B;
+               break;
+       default:
+               mode = LUT_BYPASS;
+               break;
+       }
+       return mode;
+}
+
+void mpc32_configure_post1dlut(
+               struct mpc *mpc,
+               uint32_t mpcc_id,
+               bool is_ram_a)
+{
+       struct dcn30_mpc *mpc30 = TO_DCN30_MPC(mpc);
+
+       //TODO: this
+       REG_UPDATE_2(MPCC_MCM_1DLUT_LUT_CONTROL[mpcc_id],
+                       MPCC_MCM_1DLUT_LUT_WRITE_COLOR_MASK, 7,
+                       MPCC_MCM_1DLUT_LUT_HOST_SEL, is_ram_a == true ? 0 : 1);
+
+       REG_SET(MPCC_MCM_1DLUT_LUT_INDEX[mpcc_id], 0, MPCC_MCM_1DLUT_LUT_INDEX, 0);
+}
+
+static void mpc32_post1dlut_get_reg_field(
+               struct dcn30_mpc *mpc,
+               struct dcn3_xfer_func_reg *reg)
+{
+       reg->shifts.exp_region0_lut_offset = mpc->mpc_shift->MPCC_MCM_1DLUT_RAMA_EXP_REGION0_LUT_OFFSET;
+       reg->masks.exp_region0_lut_offset = mpc->mpc_mask->MPCC_MCM_1DLUT_RAMA_EXP_REGION0_LUT_OFFSET;
+       reg->shifts.exp_region0_num_segments = mpc->mpc_shift->MPCC_MCM_1DLUT_RAMA_EXP_REGION0_NUM_SEGMENTS;
+       reg->masks.exp_region0_num_segments = mpc->mpc_mask->MPCC_MCM_1DLUT_RAMA_EXP_REGION0_NUM_SEGMENTS;
+       reg->shifts.exp_region1_lut_offset = mpc->mpc_shift->MPCC_MCM_1DLUT_RAMA_EXP_REGION1_LUT_OFFSET;
+       reg->masks.exp_region1_lut_offset = mpc->mpc_mask->MPCC_MCM_1DLUT_RAMA_EXP_REGION1_LUT_OFFSET;
+       reg->shifts.exp_region1_num_segments = mpc->mpc_shift->MPCC_MCM_1DLUT_RAMA_EXP_REGION1_NUM_SEGMENTS;
+       reg->masks.exp_region1_num_segments = mpc->mpc_mask->MPCC_MCM_1DLUT_RAMA_EXP_REGION1_NUM_SEGMENTS;
+
+       reg->shifts.field_region_end = mpc->mpc_shift->MPCC_MCM_1DLUT_RAMA_EXP_REGION_END_B;
+       reg->masks.field_region_end = mpc->mpc_mask->MPCC_MCM_1DLUT_RAMA_EXP_REGION_END_B;
+       reg->shifts.field_region_end_slope = mpc->mpc_shift->MPCC_MCM_1DLUT_RAMA_EXP_REGION_END_SLOPE_B;
+       reg->masks.field_region_end_slope = mpc->mpc_mask->MPCC_MCM_1DLUT_RAMA_EXP_REGION_END_SLOPE_B;
+       reg->shifts.field_region_end_base = mpc->mpc_shift->MPCC_MCM_1DLUT_RAMA_EXP_REGION_END_BASE_B;
+       reg->masks.field_region_end_base = mpc->mpc_mask->MPCC_MCM_1DLUT_RAMA_EXP_REGION_END_BASE_B;
+       reg->shifts.field_region_linear_slope = mpc->mpc_shift->MPCC_MCM_1DLUT_RAMA_EXP_REGION_START_SLOPE_B;
+       reg->masks.field_region_linear_slope = mpc->mpc_mask->MPCC_MCM_1DLUT_RAMA_EXP_REGION_START_SLOPE_B;
+       reg->shifts.exp_region_start = mpc->mpc_shift->MPCC_MCM_1DLUT_RAMA_EXP_REGION_START_B;
+       reg->masks.exp_region_start = mpc->mpc_mask->MPCC_MCM_1DLUT_RAMA_EXP_REGION_START_B;
+       reg->shifts.exp_resion_start_segment = mpc->mpc_shift->MPCC_MCM_1DLUT_RAMA_EXP_REGION_START_SEGMENT_B;
+       reg->masks.exp_resion_start_segment = mpc->mpc_mask->MPCC_MCM_1DLUT_RAMA_EXP_REGION_START_SEGMENT_B;
+}
+
+/*program blnd lut RAM A*/
+void mpc32_program_post1dluta_settings(
+               struct mpc *mpc,
+               uint32_t mpcc_id,
+               const struct pwl_params *params)
+{
+       struct dcn30_mpc *mpc30 = TO_DCN30_MPC(mpc);
+       struct dcn3_xfer_func_reg gam_regs;
+
+       mpc32_post1dlut_get_reg_field(mpc30, &gam_regs);
+
+       gam_regs.start_cntl_b = REG(MPCC_MCM_1DLUT_RAMA_START_CNTL_B[mpcc_id]);
+       gam_regs.start_cntl_g = REG(MPCC_MCM_1DLUT_RAMA_START_CNTL_G[mpcc_id]);
+       gam_regs.start_cntl_r = REG(MPCC_MCM_1DLUT_RAMA_START_CNTL_R[mpcc_id]);
+       gam_regs.start_slope_cntl_b = REG(MPCC_MCM_1DLUT_RAMA_START_SLOPE_CNTL_B[mpcc_id]);
+       gam_regs.start_slope_cntl_g = REG(MPCC_MCM_1DLUT_RAMA_START_SLOPE_CNTL_G[mpcc_id]);
+       gam_regs.start_slope_cntl_r = REG(MPCC_MCM_1DLUT_RAMA_START_SLOPE_CNTL_R[mpcc_id]);
+       gam_regs.start_end_cntl1_b = REG(MPCC_MCM_1DLUT_RAMA_END_CNTL1_B[mpcc_id]);
+       gam_regs.start_end_cntl2_b = REG(MPCC_MCM_1DLUT_RAMA_END_CNTL2_B[mpcc_id]);
+       gam_regs.start_end_cntl1_g = REG(MPCC_MCM_1DLUT_RAMA_END_CNTL1_G[mpcc_id]);
+       gam_regs.start_end_cntl2_g = REG(MPCC_MCM_1DLUT_RAMA_END_CNTL2_G[mpcc_id]);
+       gam_regs.start_end_cntl1_r = REG(MPCC_MCM_1DLUT_RAMA_END_CNTL1_R[mpcc_id]);
+       gam_regs.start_end_cntl2_r = REG(MPCC_MCM_1DLUT_RAMA_END_CNTL2_R[mpcc_id]);
+       gam_regs.region_start = REG(MPCC_MCM_1DLUT_RAMA_REGION_0_1[mpcc_id]);
+       gam_regs.region_end = REG(MPCC_MCM_1DLUT_RAMA_REGION_32_33[mpcc_id]);
+
+       cm_helper_program_gamcor_xfer_func(mpc->ctx, params, &gam_regs);
+}
+
+/*program blnd lut RAM B*/
+void mpc32_program_post1dlutb_settings(
+               struct mpc *mpc,
+               uint32_t mpcc_id,
+               const struct pwl_params *params)
+{
+       struct dcn30_mpc *mpc30 = TO_DCN30_MPC(mpc);
+       struct dcn3_xfer_func_reg gam_regs;
+
+       mpc32_post1dlut_get_reg_field(mpc30, &gam_regs);
+
+       gam_regs.start_cntl_b = REG(MPCC_MCM_1DLUT_RAMB_START_CNTL_B[mpcc_id]);
+       gam_regs.start_cntl_g = REG(MPCC_MCM_1DLUT_RAMB_START_CNTL_G[mpcc_id]);
+       gam_regs.start_cntl_r = REG(MPCC_MCM_1DLUT_RAMB_START_CNTL_R[mpcc_id]);
+       gam_regs.start_slope_cntl_b = REG(MPCC_MCM_1DLUT_RAMB_START_SLOPE_CNTL_B[mpcc_id]);
+       gam_regs.start_slope_cntl_g = REG(MPCC_MCM_1DLUT_RAMB_START_SLOPE_CNTL_G[mpcc_id]);
+       gam_regs.start_slope_cntl_r = REG(MPCC_MCM_1DLUT_RAMB_START_SLOPE_CNTL_R[mpcc_id]);
+       gam_regs.start_end_cntl1_b = REG(MPCC_MCM_1DLUT_RAMB_END_CNTL1_B[mpcc_id]);
+       gam_regs.start_end_cntl2_b = REG(MPCC_MCM_1DLUT_RAMB_END_CNTL2_B[mpcc_id]);
+       gam_regs.start_end_cntl1_g = REG(MPCC_MCM_1DLUT_RAMB_END_CNTL1_G[mpcc_id]);
+       gam_regs.start_end_cntl2_g = REG(MPCC_MCM_1DLUT_RAMB_END_CNTL2_G[mpcc_id]);
+       gam_regs.start_end_cntl1_r = REG(MPCC_MCM_1DLUT_RAMB_END_CNTL1_R[mpcc_id]);
+       gam_regs.start_end_cntl2_r = REG(MPCC_MCM_1DLUT_RAMB_END_CNTL2_R[mpcc_id]);
+       gam_regs.region_start = REG(MPCC_MCM_1DLUT_RAMB_REGION_0_1[mpcc_id]);
+       gam_regs.region_end = REG(MPCC_MCM_1DLUT_RAMB_REGION_32_33[mpcc_id]);
+
+       cm_helper_program_gamcor_xfer_func(mpc->ctx, params, &gam_regs);
+}
+
+void mpc32_program_post1dlut_pwl(
+               struct mpc *mpc,
+               uint32_t mpcc_id,
+               const struct pwl_result_data *rgb,
+               uint32_t num)
+{
+       uint32_t i;
+       struct dcn30_mpc *mpc30 = TO_DCN30_MPC(mpc);
+       uint32_t last_base_value_red = rgb[num-1].red_reg + rgb[num-1].delta_red_reg;
+       uint32_t last_base_value_green = rgb[num-1].green_reg + rgb[num-1].delta_green_reg;
+       uint32_t last_base_value_blue = rgb[num-1].blue_reg + rgb[num-1].delta_blue_reg;
+
+       if (is_rgb_equal(rgb, num)) {
+               for (i = 0 ; i < num; i++)
+                       REG_SET(MPCC_MCM_1DLUT_LUT_DATA[mpcc_id], 0, MPCC_MCM_1DLUT_LUT_DATA, rgb[i].red_reg);
+               REG_SET(MPCC_MCM_1DLUT_LUT_DATA[mpcc_id], 0, MPCC_MCM_1DLUT_LUT_DATA, last_base_value_red);
+       } else {
+               REG_SET(MPCC_MCM_1DLUT_LUT_INDEX[mpcc_id], 0, MPCC_MCM_1DLUT_LUT_INDEX, 0);
+               REG_UPDATE(MPCC_MCM_1DLUT_LUT_CONTROL[mpcc_id], MPCC_MCM_1DLUT_LUT_WRITE_COLOR_MASK, 4);
+               for (i = 0 ; i < num; i++)
+                       REG_SET(MPCC_MCM_1DLUT_LUT_DATA[mpcc_id], 0, MPCC_MCM_1DLUT_LUT_DATA, rgb[i].red_reg);
+               REG_SET(MPCC_MCM_1DLUT_LUT_DATA[mpcc_id], 0, MPCC_MCM_1DLUT_LUT_DATA, last_base_value_red);
+
+               REG_SET(MPCC_MCM_1DLUT_LUT_INDEX[mpcc_id], 0, MPCC_MCM_1DLUT_LUT_INDEX, 0);
+               REG_UPDATE(MPCC_MCM_1DLUT_LUT_CONTROL[mpcc_id], MPCC_MCM_1DLUT_LUT_WRITE_COLOR_MASK, 2);
+               for (i = 0 ; i < num; i++)
+                       REG_SET(MPCC_MCM_1DLUT_LUT_DATA[mpcc_id], 0, MPCC_MCM_1DLUT_LUT_DATA, rgb[i].green_reg);
+               REG_SET(MPCC_MCM_1DLUT_LUT_DATA[mpcc_id], 0, MPCC_MCM_1DLUT_LUT_DATA, last_base_value_green);
+
+               REG_SET(MPCC_MCM_1DLUT_LUT_INDEX[mpcc_id], 0, MPCC_MCM_1DLUT_LUT_INDEX, 0);
+               REG_UPDATE(MPCC_MCM_1DLUT_LUT_CONTROL[mpcc_id], MPCC_MCM_1DLUT_LUT_WRITE_COLOR_MASK, 1);
+               for (i = 0 ; i < num; i++)
+                       REG_SET(MPCC_MCM_1DLUT_LUT_DATA[mpcc_id], 0, MPCC_MCM_1DLUT_LUT_DATA, rgb[i].blue_reg);
+               REG_SET(MPCC_MCM_1DLUT_LUT_DATA[mpcc_id], 0, MPCC_MCM_1DLUT_LUT_DATA, last_base_value_blue);
+       }
+}
+
+bool mpc32_program_post1dlut(
+               struct mpc *mpc,
+               const struct pwl_params *params,
+               uint32_t mpcc_id)
+{
+       enum dc_lut_mode current_mode;
+       enum dc_lut_mode next_mode;
+       struct dcn30_mpc *mpc30 = TO_DCN30_MPC(mpc);
+
+       if (params == NULL) {
+               REG_SET(MPCC_MCM_1DLUT_CONTROL[mpcc_id], 0, MPCC_MCM_1DLUT_MODE, 0);
+               if (mpc->ctx->dc->debug.enable_mem_low_power.bits.cm)
+                       mpc32_power_on_blnd_lut(mpc, mpcc_id, false);
+               return false;
+       }
+
+       current_mode = mpc32_get_post1dlut_current(mpc, mpcc_id);
+       if (current_mode == LUT_BYPASS || current_mode == LUT_RAM_B)
+               next_mode = LUT_RAM_A;
+       else
+               next_mode = LUT_RAM_B;
+
+       mpc32_power_on_blnd_lut(mpc, mpcc_id, true);
+       mpc32_configure_post1dlut(mpc, mpcc_id, next_mode == LUT_RAM_A);
+
+       if (next_mode == LUT_RAM_A)
+               mpc32_program_post1dluta_settings(mpc, mpcc_id, params);
+       else
+               mpc32_program_post1dlutb_settings(mpc, mpcc_id, params);
+
+       mpc32_program_post1dlut_pwl(
+                       mpc, mpcc_id, params->rgb_resulted, params->hw_points_num);
+
+       REG_UPDATE_2(MPCC_MCM_1DLUT_CONTROL[mpcc_id],
+                       MPCC_MCM_1DLUT_MODE, 2,
+                       MPCC_MCM_1DLUT_SELECT, next_mode == LUT_RAM_A ? 0 : 1);
+
+       return true;
+}
+
+static enum dc_lut_mode mpc32_get_shaper_current(struct mpc *mpc, uint32_t mpcc_id)
+{
+       enum dc_lut_mode mode;
+       uint32_t state_mode;
+       struct dcn30_mpc *mpc30 = TO_DCN30_MPC(mpc);
+
+       REG_GET(MPCC_MCM_SHAPER_CONTROL[mpcc_id], MPCC_MCM_SHAPER_MODE_CURRENT, &state_mode);
+
+       switch (state_mode) {
+       case 0:
+               mode = LUT_BYPASS;
+               break;
+       case 1:
+               mode = LUT_RAM_A;
+               break;
+       case 2:
+               mode = LUT_RAM_B;
+               break;
+       default:
+               mode = LUT_BYPASS;
+               break;
+       }
+
+       return mode;
+}
+
+
+void mpc32_configure_shaper_lut(
+               struct mpc *mpc,
+               bool is_ram_a,
+               uint32_t mpcc_id)
+{
+       struct dcn30_mpc *mpc30 = TO_DCN30_MPC(mpc);
+
+       REG_UPDATE(MPCC_MCM_SHAPER_LUT_WRITE_EN_MASK[mpcc_id],
+                       MPCC_MCM_SHAPER_LUT_WRITE_EN_MASK, 7);
+       REG_UPDATE(MPCC_MCM_SHAPER_LUT_WRITE_EN_MASK[mpcc_id],
+                       MPCC_MCM_SHAPER_LUT_WRITE_SEL, is_ram_a == true ? 0:1);
+       REG_SET(MPCC_MCM_SHAPER_LUT_INDEX[mpcc_id], 0, MPCC_MCM_SHAPER_LUT_INDEX, 0);
+}
+
+
+void mpc32_program_shaper_luta_settings(
+               struct mpc *mpc,
+               const struct pwl_params *params,
+               uint32_t mpcc_id)
+{
+       const struct gamma_curve *curve;
+       struct dcn30_mpc *mpc30 = TO_DCN30_MPC(mpc);
+
+       REG_SET_2(MPCC_MCM_SHAPER_RAMA_START_CNTL_B[mpcc_id], 0,
+               MPCC_MCM_SHAPER_RAMA_EXP_REGION_START_B, params->corner_points[0].blue.custom_float_x,
+               MPCC_MCM_SHAPER_RAMA_EXP_REGION_START_SEGMENT_B, 0);
+       REG_SET_2(MPCC_MCM_SHAPER_RAMA_START_CNTL_G[mpcc_id], 0,
+                       MPCC_MCM_SHAPER_RAMA_EXP_REGION_START_B, params->corner_points[0].green.custom_float_x,
+                       MPCC_MCM_SHAPER_RAMA_EXP_REGION_START_SEGMENT_B, 0);
+       REG_SET_2(MPCC_MCM_SHAPER_RAMA_START_CNTL_R[mpcc_id], 0,
+                       MPCC_MCM_SHAPER_RAMA_EXP_REGION_START_B, params->corner_points[0].red.custom_float_x,
+                       MPCC_MCM_SHAPER_RAMA_EXP_REGION_START_SEGMENT_B, 0);
+
+       REG_SET_2(MPCC_MCM_SHAPER_RAMA_END_CNTL_B[mpcc_id], 0,
+                       MPCC_MCM_SHAPER_RAMA_EXP_REGION_END_B, params->corner_points[1].blue.custom_float_x,
+                       MPCC_MCM_SHAPER_RAMA_EXP_REGION_END_BASE_B, params->corner_points[1].blue.custom_float_y);
+       REG_SET_2(MPCC_MCM_SHAPER_RAMA_END_CNTL_G[mpcc_id], 0,
+                       MPCC_MCM_SHAPER_RAMA_EXP_REGION_END_B, params->corner_points[1].green.custom_float_x,
+                       MPCC_MCM_SHAPER_RAMA_EXP_REGION_END_BASE_B, params->corner_points[1].green.custom_float_y);
+       REG_SET_2(MPCC_MCM_SHAPER_RAMA_END_CNTL_R[mpcc_id], 0,
+                       MPCC_MCM_SHAPER_RAMA_EXP_REGION_END_B, params->corner_points[1].red.custom_float_x,
+                       MPCC_MCM_SHAPER_RAMA_EXP_REGION_END_BASE_B, params->corner_points[1].red.custom_float_y);
+
+       curve = params->arr_curve_points;
+       REG_SET_4(MPCC_MCM_SHAPER_RAMA_REGION_0_1[mpcc_id], 0,
+               MPCC_MCM_SHAPER_RAMA_EXP_REGION0_LUT_OFFSET, curve[0].offset,
+               MPCC_MCM_SHAPER_RAMA_EXP_REGION0_NUM_SEGMENTS, curve[0].segments_num,
+               MPCC_MCM_SHAPER_RAMA_EXP_REGION1_LUT_OFFSET, curve[1].offset,
+               MPCC_MCM_SHAPER_RAMA_EXP_REGION1_NUM_SEGMENTS, curve[1].segments_num);
+
+       curve += 2;
+       REG_SET_4(MPCC_MCM_SHAPER_RAMA_REGION_2_3[mpcc_id], 0,
+               MPCC_MCM_SHAPER_RAMA_EXP_REGION0_LUT_OFFSET, curve[0].offset,
+               MPCC_MCM_SHAPER_RAMA_EXP_REGION0_NUM_SEGMENTS, curve[0].segments_num,
+               MPCC_MCM_SHAPER_RAMA_EXP_REGION1_LUT_OFFSET, curve[1].offset,
+               MPCC_MCM_SHAPER_RAMA_EXP_REGION1_NUM_SEGMENTS, curve[1].segments_num);
+
+       curve += 2;
+       REG_SET_4(MPCC_MCM_SHAPER_RAMA_REGION_4_5[mpcc_id], 0,
+               MPCC_MCM_SHAPER_RAMA_EXP_REGION0_LUT_OFFSET, curve[0].offset,
+               MPCC_MCM_SHAPER_RAMA_EXP_REGION0_NUM_SEGMENTS, curve[0].segments_num,
+               MPCC_MCM_SHAPER_RAMA_EXP_REGION1_LUT_OFFSET, curve[1].offset,
+               MPCC_MCM_SHAPER_RAMA_EXP_REGION1_NUM_SEGMENTS, curve[1].segments_num);
+
+       curve += 2;
+       REG_SET_4(MPCC_MCM_SHAPER_RAMA_REGION_6_7[mpcc_id], 0,
+               MPCC_MCM_SHAPER_RAMA_EXP_REGION0_LUT_OFFSET, curve[0].offset,
+               MPCC_MCM_SHAPER_RAMA_EXP_REGION0_NUM_SEGMENTS, curve[0].segments_num,
+               MPCC_MCM_SHAPER_RAMA_EXP_REGION1_LUT_OFFSET, curve[1].offset,
+               MPCC_MCM_SHAPER_RAMA_EXP_REGION1_NUM_SEGMENTS, curve[1].segments_num);
+
+       curve += 2;
+       REG_SET_4(MPCC_MCM_SHAPER_RAMA_REGION_8_9[mpcc_id], 0,
+               MPCC_MCM_SHAPER_RAMA_EXP_REGION0_LUT_OFFSET, curve[0].offset,
+               MPCC_MCM_SHAPER_RAMA_EXP_REGION0_NUM_SEGMENTS, curve[0].segments_num,
+               MPCC_MCM_SHAPER_RAMA_EXP_REGION1_LUT_OFFSET, curve[1].offset,
+               MPCC_MCM_SHAPER_RAMA_EXP_REGION1_NUM_SEGMENTS, curve[1].segments_num);
+
+       curve += 2;
+       REG_SET_4(MPCC_MCM_SHAPER_RAMA_REGION_10_11[mpcc_id], 0,
+               MPCC_MCM_SHAPER_RAMA_EXP_REGION0_LUT_OFFSET, curve[0].offset,
+               MPCC_MCM_SHAPER_RAMA_EXP_REGION0_NUM_SEGMENTS, curve[0].segments_num,
+               MPCC_MCM_SHAPER_RAMA_EXP_REGION1_LUT_OFFSET, curve[1].offset,
+               MPCC_MCM_SHAPER_RAMA_EXP_REGION1_NUM_SEGMENTS, curve[1].segments_num);
+
+       curve += 2;
+       REG_SET_4(MPCC_MCM_SHAPER_RAMA_REGION_12_13[mpcc_id], 0,
+               MPCC_MCM_SHAPER_RAMA_EXP_REGION0_LUT_OFFSET, curve[0].offset,
+               MPCC_MCM_SHAPER_RAMA_EXP_REGION0_NUM_SEGMENTS, curve[0].segments_num,
+               MPCC_MCM_SHAPER_RAMA_EXP_REGION1_LUT_OFFSET, curve[1].offset,
+               MPCC_MCM_SHAPER_RAMA_EXP_REGION1_NUM_SEGMENTS, curve[1].segments_num);
+
+       curve += 2;
+       REG_SET_4(MPCC_MCM_SHAPER_RAMA_REGION_14_15[mpcc_id], 0,
+               MPCC_MCM_SHAPER_RAMA_EXP_REGION0_LUT_OFFSET, curve[0].offset,
+               MPCC_MCM_SHAPER_RAMA_EXP_REGION0_NUM_SEGMENTS, curve[0].segments_num,
+               MPCC_MCM_SHAPER_RAMA_EXP_REGION1_LUT_OFFSET, curve[1].offset,
+               MPCC_MCM_SHAPER_RAMA_EXP_REGION1_NUM_SEGMENTS, curve[1].segments_num);
+
+
+       curve += 2;
+       REG_SET_4(MPCC_MCM_SHAPER_RAMA_REGION_16_17[mpcc_id], 0,
+               MPCC_MCM_SHAPER_RAMA_EXP_REGION0_LUT_OFFSET, curve[0].offset,
+               MPCC_MCM_SHAPER_RAMA_EXP_REGION0_NUM_SEGMENTS, curve[0].segments_num,
+               MPCC_MCM_SHAPER_RAMA_EXP_REGION1_LUT_OFFSET, curve[1].offset,
+               MPCC_MCM_SHAPER_RAMA_EXP_REGION1_NUM_SEGMENTS, curve[1].segments_num);
+
+       curve += 2;
+       REG_SET_4(MPCC_MCM_SHAPER_RAMA_REGION_18_19[mpcc_id], 0,
+               MPCC_MCM_SHAPER_RAMA_EXP_REGION0_LUT_OFFSET, curve[0].offset,
+               MPCC_MCM_SHAPER_RAMA_EXP_REGION0_NUM_SEGMENTS, curve[0].segments_num,
+               MPCC_MCM_SHAPER_RAMA_EXP_REGION1_LUT_OFFSET, curve[1].offset,
+               MPCC_MCM_SHAPER_RAMA_EXP_REGION1_NUM_SEGMENTS, curve[1].segments_num);
+
+       curve += 2;
+       REG_SET_4(MPCC_MCM_SHAPER_RAMA_REGION_20_21[mpcc_id], 0,
+               MPCC_MCM_SHAPER_RAMA_EXP_REGION0_LUT_OFFSET, curve[0].offset,
+               MPCC_MCM_SHAPER_RAMA_EXP_REGION0_NUM_SEGMENTS, curve[0].segments_num,
+               MPCC_MCM_SHAPER_RAMA_EXP_REGION1_LUT_OFFSET, curve[1].offset,
+               MPCC_MCM_SHAPER_RAMA_EXP_REGION1_NUM_SEGMENTS, curve[1].segments_num);
+
+       curve += 2;
+       REG_SET_4(MPCC_MCM_SHAPER_RAMA_REGION_22_23[mpcc_id], 0,
+               MPCC_MCM_SHAPER_RAMA_EXP_REGION0_LUT_OFFSET, curve[0].offset,
+               MPCC_MCM_SHAPER_RAMA_EXP_REGION0_NUM_SEGMENTS, curve[0].segments_num,
+               MPCC_MCM_SHAPER_RAMA_EXP_REGION1_LUT_OFFSET, curve[1].offset,
+               MPCC_MCM_SHAPER_RAMA_EXP_REGION1_NUM_SEGMENTS, curve[1].segments_num);
+
+       curve += 2;
+       REG_SET_4(MPCC_MCM_SHAPER_RAMA_REGION_24_25[mpcc_id], 0,
+               MPCC_MCM_SHAPER_RAMA_EXP_REGION0_LUT_OFFSET, curve[0].offset,
+               MPCC_MCM_SHAPER_RAMA_EXP_REGION0_NUM_SEGMENTS, curve[0].segments_num,
+               MPCC_MCM_SHAPER_RAMA_EXP_REGION1_LUT_OFFSET, curve[1].offset,
+               MPCC_MCM_SHAPER_RAMA_EXP_REGION1_NUM_SEGMENTS, curve[1].segments_num);
+
+       curve += 2;
+       REG_SET_4(MPCC_MCM_SHAPER_RAMA_REGION_26_27[mpcc_id], 0,
+                       MPCC_MCM_SHAPER_RAMA_EXP_REGION0_LUT_OFFSET, curve[0].offset,
+                       MPCC_MCM_SHAPER_RAMA_EXP_REGION0_NUM_SEGMENTS, curve[0].segments_num,
+                       MPCC_MCM_SHAPER_RAMA_EXP_REGION1_LUT_OFFSET, curve[1].offset,
+                       MPCC_MCM_SHAPER_RAMA_EXP_REGION1_NUM_SEGMENTS, curve[1].segments_num);
+
+       curve += 2;
+       REG_SET_4(MPCC_MCM_SHAPER_RAMA_REGION_28_29[mpcc_id], 0,
+               MPCC_MCM_SHAPER_RAMA_EXP_REGION0_LUT_OFFSET, curve[0].offset,
+               MPCC_MCM_SHAPER_RAMA_EXP_REGION0_NUM_SEGMENTS, curve[0].segments_num,
+               MPCC_MCM_SHAPER_RAMA_EXP_REGION1_LUT_OFFSET, curve[1].offset,
+               MPCC_MCM_SHAPER_RAMA_EXP_REGION1_NUM_SEGMENTS, curve[1].segments_num);
+
+       curve += 2;
+       REG_SET_4(MPCC_MCM_SHAPER_RAMA_REGION_30_31[mpcc_id], 0,
+               MPCC_MCM_SHAPER_RAMA_EXP_REGION0_LUT_OFFSET, curve[0].offset,
+               MPCC_MCM_SHAPER_RAMA_EXP_REGION0_NUM_SEGMENTS, curve[0].segments_num,
+               MPCC_MCM_SHAPER_RAMA_EXP_REGION1_LUT_OFFSET, curve[1].offset,
+               MPCC_MCM_SHAPER_RAMA_EXP_REGION1_NUM_SEGMENTS, curve[1].segments_num);
+
+       curve += 2;
+       REG_SET_4(MPCC_MCM_SHAPER_RAMA_REGION_32_33[mpcc_id], 0,
+               MPCC_MCM_SHAPER_RAMA_EXP_REGION0_LUT_OFFSET, curve[0].offset,
+               MPCC_MCM_SHAPER_RAMA_EXP_REGION0_NUM_SEGMENTS, curve[0].segments_num,
+               MPCC_MCM_SHAPER_RAMA_EXP_REGION1_LUT_OFFSET, curve[1].offset,
+               MPCC_MCM_SHAPER_RAMA_EXP_REGION1_NUM_SEGMENTS, curve[1].segments_num);
+}
+
+
+void mpc32_program_shaper_lutb_settings(
+               struct mpc *mpc,
+               const struct pwl_params *params,
+               uint32_t mpcc_id)
+{
+       const struct gamma_curve *curve;
+       struct dcn30_mpc *mpc30 = TO_DCN30_MPC(mpc);
+
+       REG_SET_2(MPCC_MCM_SHAPER_RAMB_START_CNTL_B[mpcc_id], 0,
+               MPCC_MCM_SHAPER_RAMA_EXP_REGION_START_B, params->corner_points[0].blue.custom_float_x,
+               MPCC_MCM_SHAPER_RAMA_EXP_REGION_START_SEGMENT_B, 0);
+       REG_SET_2(MPCC_MCM_SHAPER_RAMB_START_CNTL_G[mpcc_id], 0,
+                       MPCC_MCM_SHAPER_RAMA_EXP_REGION_START_B, params->corner_points[0].green.custom_float_x,
+                       MPCC_MCM_SHAPER_RAMA_EXP_REGION_START_SEGMENT_B, 0);
+       REG_SET_2(MPCC_MCM_SHAPER_RAMB_START_CNTL_R[mpcc_id], 0,
+                       MPCC_MCM_SHAPER_RAMA_EXP_REGION_START_B, params->corner_points[0].red.custom_float_x,
+                       MPCC_MCM_SHAPER_RAMA_EXP_REGION_START_SEGMENT_B, 0);
+
+       REG_SET_2(MPCC_MCM_SHAPER_RAMB_END_CNTL_B[mpcc_id], 0,
+                       MPCC_MCM_SHAPER_RAMA_EXP_REGION_END_B, params->corner_points[1].blue.custom_float_x,
+                       MPCC_MCM_SHAPER_RAMA_EXP_REGION_END_BASE_B, params->corner_points[1].blue.custom_float_y);
+       REG_SET_2(MPCC_MCM_SHAPER_RAMB_END_CNTL_G[mpcc_id], 0,
+                       MPCC_MCM_SHAPER_RAMA_EXP_REGION_END_B, params->corner_points[1].green.custom_float_x,
+                       MPCC_MCM_SHAPER_RAMA_EXP_REGION_END_BASE_B, params->corner_points[1].green.custom_float_y);
+       REG_SET_2(MPCC_MCM_SHAPER_RAMB_END_CNTL_R[mpcc_id], 0,
+                       MPCC_MCM_SHAPER_RAMA_EXP_REGION_END_B, params->corner_points[1].red.custom_float_x,
+                       MPCC_MCM_SHAPER_RAMA_EXP_REGION_END_BASE_B, params->corner_points[1].red.custom_float_y);
+
+       curve = params->arr_curve_points;
+       REG_SET_4(MPCC_MCM_SHAPER_RAMB_REGION_0_1[mpcc_id], 0,
+               MPCC_MCM_SHAPER_RAMA_EXP_REGION0_LUT_OFFSET, curve[0].offset,
+               MPCC_MCM_SHAPER_RAMA_EXP_REGION0_NUM_SEGMENTS, curve[0].segments_num,
+               MPCC_MCM_SHAPER_RAMA_EXP_REGION1_LUT_OFFSET, curve[1].offset,
+               MPCC_MCM_SHAPER_RAMA_EXP_REGION1_NUM_SEGMENTS, curve[1].segments_num);
+
+       curve += 2;
+       REG_SET_4(MPCC_MCM_SHAPER_RAMB_REGION_2_3[mpcc_id], 0,
+                       MPCC_MCM_SHAPER_RAMA_EXP_REGION0_LUT_OFFSET, curve[0].offset,
+                       MPCC_MCM_SHAPER_RAMA_EXP_REGION0_NUM_SEGMENTS, curve[0].segments_num,
+                       MPCC_MCM_SHAPER_RAMA_EXP_REGION1_LUT_OFFSET, curve[1].offset,
+                       MPCC_MCM_SHAPER_RAMA_EXP_REGION1_NUM_SEGMENTS, curve[1].segments_num);
+
+
+       curve += 2;
+       REG_SET_4(MPCC_MCM_SHAPER_RAMB_REGION_4_5[mpcc_id], 0,
+                       MPCC_MCM_SHAPER_RAMA_EXP_REGION0_LUT_OFFSET, curve[0].offset,
+                       MPCC_MCM_SHAPER_RAMA_EXP_REGION0_NUM_SEGMENTS, curve[0].segments_num,
+                       MPCC_MCM_SHAPER_RAMA_EXP_REGION1_LUT_OFFSET, curve[1].offset,
+                       MPCC_MCM_SHAPER_RAMA_EXP_REGION1_NUM_SEGMENTS, curve[1].segments_num);
+
+       curve += 2;
+       REG_SET_4(MPCC_MCM_SHAPER_RAMB_REGION_6_7[mpcc_id], 0,
+                       MPCC_MCM_SHAPER_RAMA_EXP_REGION0_LUT_OFFSET, curve[0].offset,
+                       MPCC_MCM_SHAPER_RAMA_EXP_REGION0_NUM_SEGMENTS, curve[0].segments_num,
+                       MPCC_MCM_SHAPER_RAMA_EXP_REGION1_LUT_OFFSET, curve[1].offset,
+                       MPCC_MCM_SHAPER_RAMA_EXP_REGION1_NUM_SEGMENTS, curve[1].segments_num);
+
+       curve += 2;
+       REG_SET_4(MPCC_MCM_SHAPER_RAMB_REGION_8_9[mpcc_id], 0,
+               MPCC_MCM_SHAPER_RAMA_EXP_REGION0_LUT_OFFSET, curve[0].offset,
+               MPCC_MCM_SHAPER_RAMA_EXP_REGION0_NUM_SEGMENTS, curve[0].segments_num,
+               MPCC_MCM_SHAPER_RAMA_EXP_REGION1_LUT_OFFSET, curve[1].offset,
+               MPCC_MCM_SHAPER_RAMA_EXP_REGION1_NUM_SEGMENTS, curve[1].segments_num);
+
+       curve += 2;
+       REG_SET_4(MPCC_MCM_SHAPER_RAMB_REGION_10_11[mpcc_id], 0,
+                       MPCC_MCM_SHAPER_RAMA_EXP_REGION0_LUT_OFFSET, curve[0].offset,
+                       MPCC_MCM_SHAPER_RAMA_EXP_REGION0_NUM_SEGMENTS, curve[0].segments_num,
+                       MPCC_MCM_SHAPER_RAMA_EXP_REGION1_LUT_OFFSET, curve[1].offset,
+                       MPCC_MCM_SHAPER_RAMA_EXP_REGION1_NUM_SEGMENTS, curve[1].segments_num);
+
+       curve += 2;
+       REG_SET_4(MPCC_MCM_SHAPER_RAMB_REGION_12_13[mpcc_id], 0,
+                       MPCC_MCM_SHAPER_RAMA_EXP_REGION0_LUT_OFFSET, curve[0].offset,
+                       MPCC_MCM_SHAPER_RAMA_EXP_REGION0_NUM_SEGMENTS, curve[0].segments_num,
+                       MPCC_MCM_SHAPER_RAMA_EXP_REGION1_LUT_OFFSET, curve[1].offset,
+                       MPCC_MCM_SHAPER_RAMA_EXP_REGION1_NUM_SEGMENTS, curve[1].segments_num);
+
+       curve += 2;
+       REG_SET_4(MPCC_MCM_SHAPER_RAMB_REGION_14_15[mpcc_id], 0,
+                       MPCC_MCM_SHAPER_RAMA_EXP_REGION0_LUT_OFFSET, curve[0].offset,
+                       MPCC_MCM_SHAPER_RAMA_EXP_REGION0_NUM_SEGMENTS, curve[0].segments_num,
+                       MPCC_MCM_SHAPER_RAMA_EXP_REGION1_LUT_OFFSET, curve[1].offset,
+                       MPCC_MCM_SHAPER_RAMA_EXP_REGION1_NUM_SEGMENTS, curve[1].segments_num);
+
+
+       curve += 2;
+       REG_SET_4(MPCC_MCM_SHAPER_RAMB_REGION_16_17[mpcc_id], 0,
+                       MPCC_MCM_SHAPER_RAMA_EXP_REGION0_LUT_OFFSET, curve[0].offset,
+                       MPCC_MCM_SHAPER_RAMA_EXP_REGION0_NUM_SEGMENTS, curve[0].segments_num,
+                       MPCC_MCM_SHAPER_RAMA_EXP_REGION1_LUT_OFFSET, curve[1].offset,
+                       MPCC_MCM_SHAPER_RAMA_EXP_REGION1_NUM_SEGMENTS, curve[1].segments_num);
+
+       curve += 2;
+       REG_SET_4(MPCC_MCM_SHAPER_RAMB_REGION_18_19[mpcc_id], 0,
+                       MPCC_MCM_SHAPER_RAMA_EXP_REGION0_LUT_OFFSET, curve[0].offset,
+                       MPCC_MCM_SHAPER_RAMA_EXP_REGION0_NUM_SEGMENTS, curve[0].segments_num,
+                       MPCC_MCM_SHAPER_RAMA_EXP_REGION1_LUT_OFFSET, curve[1].offset,
+                       MPCC_MCM_SHAPER_RAMA_EXP_REGION1_NUM_SEGMENTS, curve[1].segments_num);
+
+       curve += 2;
+       REG_SET_4(MPCC_MCM_SHAPER_RAMB_REGION_20_21[mpcc_id], 0,
+                       MPCC_MCM_SHAPER_RAMA_EXP_REGION0_LUT_OFFSET, curve[0].offset,
+                       MPCC_MCM_SHAPER_RAMA_EXP_REGION0_NUM_SEGMENTS, curve[0].segments_num,
+                       MPCC_MCM_SHAPER_RAMA_EXP_REGION1_LUT_OFFSET, curve[1].offset,
+                       MPCC_MCM_SHAPER_RAMA_EXP_REGION1_NUM_SEGMENTS, curve[1].segments_num);
+
+       curve += 2;
+       REG_SET_4(MPCC_MCM_SHAPER_RAMB_REGION_22_23[mpcc_id], 0,
+                       MPCC_MCM_SHAPER_RAMA_EXP_REGION0_LUT_OFFSET, curve[0].offset,
+                       MPCC_MCM_SHAPER_RAMA_EXP_REGION0_NUM_SEGMENTS, curve[0].segments_num,
+                       MPCC_MCM_SHAPER_RAMA_EXP_REGION1_LUT_OFFSET, curve[1].offset,
+                       MPCC_MCM_SHAPER_RAMA_EXP_REGION1_NUM_SEGMENTS, curve[1].segments_num);
+
+       curve += 2;
+       REG_SET_4(MPCC_MCM_SHAPER_RAMB_REGION_24_25[mpcc_id], 0,
+                       MPCC_MCM_SHAPER_RAMA_EXP_REGION0_LUT_OFFSET, curve[0].offset,
+                       MPCC_MCM_SHAPER_RAMA_EXP_REGION0_NUM_SEGMENTS, curve[0].segments_num,
+                       MPCC_MCM_SHAPER_RAMA_EXP_REGION1_LUT_OFFSET, curve[1].offset,
+                       MPCC_MCM_SHAPER_RAMA_EXP_REGION1_NUM_SEGMENTS, curve[1].segments_num);
+
+       curve += 2;
+       REG_SET_4(MPCC_MCM_SHAPER_RAMB_REGION_26_27[mpcc_id], 0,
+                       MPCC_MCM_SHAPER_RAMA_EXP_REGION0_LUT_OFFSET, curve[0].offset,
+                       MPCC_MCM_SHAPER_RAMA_EXP_REGION0_NUM_SEGMENTS, curve[0].segments_num,
+                       MPCC_MCM_SHAPER_RAMA_EXP_REGION1_LUT_OFFSET, curve[1].offset,
+                       MPCC_MCM_SHAPER_RAMA_EXP_REGION1_NUM_SEGMENTS, curve[1].segments_num);
+
+       curve += 2;
+       REG_SET_4(MPCC_MCM_SHAPER_RAMB_REGION_28_29[mpcc_id], 0,
+                       MPCC_MCM_SHAPER_RAMA_EXP_REGION0_LUT_OFFSET, curve[0].offset,
+                       MPCC_MCM_SHAPER_RAMA_EXP_REGION0_NUM_SEGMENTS, curve[0].segments_num,
+                       MPCC_MCM_SHAPER_RAMA_EXP_REGION1_LUT_OFFSET, curve[1].offset,
+                       MPCC_MCM_SHAPER_RAMA_EXP_REGION1_NUM_SEGMENTS, curve[1].segments_num);
+
+       curve += 2;
+       REG_SET_4(MPCC_MCM_SHAPER_RAMB_REGION_30_31[mpcc_id], 0,
+                       MPCC_MCM_SHAPER_RAMA_EXP_REGION0_LUT_OFFSET, curve[0].offset,
+                       MPCC_MCM_SHAPER_RAMA_EXP_REGION0_NUM_SEGMENTS, curve[0].segments_num,
+                       MPCC_MCM_SHAPER_RAMA_EXP_REGION1_LUT_OFFSET, curve[1].offset,
+                       MPCC_MCM_SHAPER_RAMA_EXP_REGION1_NUM_SEGMENTS, curve[1].segments_num);
+
+       curve += 2;
+       REG_SET_4(MPCC_MCM_SHAPER_RAMB_REGION_32_33[mpcc_id], 0,
+                       MPCC_MCM_SHAPER_RAMA_EXP_REGION0_LUT_OFFSET, curve[0].offset,
+                       MPCC_MCM_SHAPER_RAMA_EXP_REGION0_NUM_SEGMENTS, curve[0].segments_num,
+                       MPCC_MCM_SHAPER_RAMA_EXP_REGION1_LUT_OFFSET, curve[1].offset,
+                       MPCC_MCM_SHAPER_RAMA_EXP_REGION1_NUM_SEGMENTS, curve[1].segments_num);
+}
+
+
+void mpc32_program_shaper_lut(
+               struct mpc *mpc,
+               const struct pwl_result_data *rgb,
+               uint32_t num,
+               uint32_t mpcc_id)
+{
+       uint32_t i, red, green, blue;
+       uint32_t  red_delta, green_delta, blue_delta;
+       uint32_t  red_value, green_value, blue_value;
+
+       struct dcn30_mpc *mpc30 = TO_DCN30_MPC(mpc);
+
+       for (i = 0 ; i < num; i++) {
+
+               red   = rgb[i].red_reg;
+               green = rgb[i].green_reg;
+               blue  = rgb[i].blue_reg;
+
+               red_delta   = rgb[i].delta_red_reg;
+               green_delta = rgb[i].delta_green_reg;
+               blue_delta  = rgb[i].delta_blue_reg;
+
+               red_value   = ((red_delta   & 0x3ff) << 14) | (red   & 0x3fff);
+               green_value = ((green_delta & 0x3ff) << 14) | (green & 0x3fff);
+               blue_value  = ((blue_delta  & 0x3ff) << 14) | (blue  & 0x3fff);
+
+               REG_SET(MPCC_MCM_SHAPER_LUT_DATA[mpcc_id], 0, MPCC_MCM_SHAPER_LUT_DATA, red_value);
+               REG_SET(MPCC_MCM_SHAPER_LUT_DATA[mpcc_id], 0, MPCC_MCM_SHAPER_LUT_DATA, green_value);
+               REG_SET(MPCC_MCM_SHAPER_LUT_DATA[mpcc_id], 0, MPCC_MCM_SHAPER_LUT_DATA, blue_value);
+       }
+
+}
+
+
+void mpc32_power_on_shaper_3dlut(
+               struct mpc *mpc,
+               uint32_t mpcc_id,
+               bool power_on)
+{
+       uint32_t power_status_shaper = 2;
+       uint32_t power_status_3dlut  = 2;
+       struct dcn30_mpc *mpc30 = TO_DCN30_MPC(mpc);
+       int max_retries = 10;
+
+       REG_SET(MPCC_MCM_MEM_PWR_CTRL[mpcc_id], 0,
+       MPCC_MCM_3DLUT_MEM_PWR_DIS, power_on == true ? 1:0);
+       /* wait for memory to fully power up */
+       if (power_on && mpc->ctx->dc->debug.enable_mem_low_power.bits.mpc) {
+               REG_WAIT(MPCC_MCM_MEM_PWR_CTRL[mpcc_id], MPCC_MCM_SHAPER_MEM_PWR_STATE, 0, 1, max_retries);
+               REG_WAIT(MPCC_MCM_MEM_PWR_CTRL[mpcc_id], MPCC_MCM_3DLUT_MEM_PWR_STATE, 0, 1, max_retries);
+       }
+
+       /*read status is not mandatory, it is just for debugging*/
+       REG_GET(MPCC_MCM_MEM_PWR_CTRL[mpcc_id], MPCC_MCM_SHAPER_MEM_PWR_STATE, &power_status_shaper);
+       REG_GET(MPCC_MCM_MEM_PWR_CTRL[mpcc_id], MPCC_MCM_3DLUT_MEM_PWR_STATE, &power_status_3dlut);
+
+       if (power_status_shaper != 0 && power_on == true)
+               BREAK_TO_DEBUGGER();
+
+       if (power_status_3dlut != 0 && power_on == true)
+               BREAK_TO_DEBUGGER();
+}
+
+
+bool mpc32_program_shaper(
+               struct mpc *mpc,
+               const struct pwl_params *params,
+               uint32_t mpcc_id)
+{
+       enum dc_lut_mode current_mode;
+       enum dc_lut_mode next_mode;
+
+       struct dcn30_mpc *mpc30 = TO_DCN30_MPC(mpc);
+
+       if (params == NULL) {
+               REG_SET(MPCC_MCM_SHAPER_CONTROL[mpcc_id], 0, MPCC_MCM_SHAPER_LUT_MODE, 0);
+               return false;
+       }
+
+       if (mpc->ctx->dc->debug.enable_mem_low_power.bits.mpc)
+               mpc32_power_on_shaper_3dlut(mpc, mpcc_id, true);
+
+       current_mode = mpc32_get_shaper_current(mpc, mpcc_id);
+
+       if (current_mode == LUT_BYPASS || current_mode == LUT_RAM_A)
+               next_mode = LUT_RAM_B;
+       else
+               next_mode = LUT_RAM_A;
+
+       mpc32_configure_shaper_lut(mpc, next_mode == LUT_RAM_A, mpcc_id);
+
+       if (next_mode == LUT_RAM_A)
+               mpc32_program_shaper_luta_settings(mpc, params, mpcc_id);
+       else
+               mpc32_program_shaper_lutb_settings(mpc, params, mpcc_id);
+
+       mpc32_program_shaper_lut(
+                       mpc, params->rgb_resulted, params->hw_points_num, mpcc_id);
+
+       REG_SET(MPCC_MCM_SHAPER_CONTROL[mpcc_id], 0, MPCC_MCM_SHAPER_LUT_MODE, next_mode == LUT_RAM_A ? 1:2);
+       mpc32_power_on_shaper_3dlut(mpc, mpcc_id, false);
+
+       return true;
+}
+
+
+static enum dc_lut_mode get3dlut_config(
+                       struct mpc *mpc,
+                       bool *is_17x17x17,
+                       bool *is_12bits_color_channel,
+                       int mpcc_id)
+{
+       uint32_t i_mode, i_enable_10bits, lut_size;
+       enum dc_lut_mode mode;
+       struct dcn30_mpc *mpc30 = TO_DCN30_MPC(mpc);
+
+       REG_GET(MPCC_MCM_3DLUT_MODE[mpcc_id],
+                       MPCC_MCM_3DLUT_MODE_CURRENT,  &i_mode);
+
+       REG_GET(MPCC_MCM_3DLUT_READ_WRITE_CONTROL[mpcc_id],
+                       MPCC_MCM_3DLUT_30BIT_EN, &i_enable_10bits);
+
+       switch (i_mode) {
+       case 0:
+               mode = LUT_BYPASS;
+               break;
+       case 1:
+               mode = LUT_RAM_A;
+               break;
+       case 2:
+               mode = LUT_RAM_B;
+               break;
+       default:
+               mode = LUT_BYPASS;
+               break;
+       }
+       if (i_enable_10bits > 0)
+               *is_12bits_color_channel = false;
+       else
+               *is_12bits_color_channel = true;
+
+       REG_GET(MPCC_MCM_3DLUT_MODE[mpcc_id], MPCC_MCM_3DLUT_SIZE, &lut_size);
+
+       if (lut_size == 0)
+               *is_17x17x17 = true;
+       else
+               *is_17x17x17 = false;
+
+       return mode;
+}
+
+
+void mpc32_select_3dlut_ram(
+               struct mpc *mpc,
+               enum dc_lut_mode mode,
+               bool is_color_channel_12bits,
+               uint32_t mpcc_id)
+{
+       struct dcn30_mpc *mpc30 = TO_DCN30_MPC(mpc);
+
+       REG_UPDATE_2(MPCC_MCM_3DLUT_READ_WRITE_CONTROL[mpcc_id],
+               MPCC_MCM_3DLUT_RAM_SEL, mode == LUT_RAM_A ? 0 : 1,
+               MPCC_MCM_3DLUT_30BIT_EN, is_color_channel_12bits == true ? 0:1);
+}
+
+
+void mpc32_select_3dlut_ram_mask(
+               struct mpc *mpc,
+               uint32_t ram_selection_mask,
+               uint32_t mpcc_id)
+{
+       struct dcn30_mpc *mpc30 = TO_DCN30_MPC(mpc);
+
+       REG_UPDATE(MPCC_MCM_3DLUT_READ_WRITE_CONTROL[mpcc_id], MPCC_MCM_3DLUT_WRITE_EN_MASK,
+                       ram_selection_mask);
+       REG_SET(MPCC_MCM_3DLUT_INDEX[mpcc_id], 0, MPCC_MCM_3DLUT_INDEX, 0);
+}
+
+
+void mpc32_set3dlut_ram12(
+               struct mpc *mpc,
+               const struct dc_rgb *lut,
+               uint32_t entries,
+               uint32_t mpcc_id)
+{
+       uint32_t i, red, green, blue, red1, green1, blue1;
+       struct dcn30_mpc *mpc30 = TO_DCN30_MPC(mpc);
+
+       for (i = 0 ; i < entries; i += 2) {
+               red   = lut[i].red<<4;
+               green = lut[i].green<<4;
+               blue  = lut[i].blue<<4;
+               red1   = lut[i+1].red<<4;
+               green1 = lut[i+1].green<<4;
+               blue1  = lut[i+1].blue<<4;
+
+               REG_SET_2(MPCC_MCM_3DLUT_DATA[mpcc_id], 0,
+                               MPCC_MCM_3DLUT_DATA0, red,
+                               MPCC_MCM_3DLUT_DATA1, red1);
+
+               REG_SET_2(MPCC_MCM_3DLUT_DATA[mpcc_id], 0,
+                               MPCC_MCM_3DLUT_DATA0, green,
+                               MPCC_MCM_3DLUT_DATA1, green1);
+
+               REG_SET_2(MPCC_MCM_3DLUT_DATA[mpcc_id], 0,
+                               MPCC_MCM_3DLUT_DATA0, blue,
+                               MPCC_MCM_3DLUT_DATA1, blue1);
+       }
+}
+
+
+void mpc32_set3dlut_ram10(
+               struct mpc *mpc,
+               const struct dc_rgb *lut,
+               uint32_t entries,
+               uint32_t mpcc_id)
+{
+       uint32_t i, red, green, blue, value;
+       struct dcn30_mpc *mpc30 = TO_DCN30_MPC(mpc);
+
+       for (i = 0; i < entries; i++) {
+               red   = lut[i].red;
+               green = lut[i].green;
+               blue  = lut[i].blue;
+               //should we shift red 22bit and green 12?
+               value = (red<<20) | (green<<10) | blue;
+
+               REG_SET(MPCC_MCM_3DLUT_DATA_30BIT[mpcc_id], 0, MPCC_MCM_3DLUT_DATA_30BIT, value);
+       }
+
+}
+
+
+static void mpc32_set_3dlut_mode(
+               struct mpc *mpc,
+               enum dc_lut_mode mode,
+               bool is_color_channel_12bits,
+               bool is_lut_size17x17x17,
+               uint32_t mpcc_id)
+{
+       uint32_t lut_mode;
+       struct dcn30_mpc *mpc30 = TO_DCN30_MPC(mpc);
+
+       // set default 3DLUT to pre-blend
+       // TODO: implement movable CM location
+       REG_UPDATE(MPCC_MOVABLE_CM_LOCATION_CONTROL[mpcc_id], MPCC_MOVABLE_CM_LOCATION_CNTL, 0);
+
+       if (mode == LUT_BYPASS)
+               lut_mode = 0;
+       else if (mode == LUT_RAM_A)
+               lut_mode = 1;
+       else
+               lut_mode = 2;
+
+       REG_UPDATE_2(MPCC_MCM_3DLUT_MODE[mpcc_id],
+                       MPCC_MCM_3DLUT_MODE, lut_mode,
+                       MPCC_MCM_3DLUT_SIZE, is_lut_size17x17x17 == true ? 0 : 1);
+}
+
+
+bool mpc32_program_3dlut(
+               struct mpc *mpc,
+               const struct tetrahedral_params *params,
+               int mpcc_id)
+{
+       enum dc_lut_mode mode;
+       bool is_17x17x17;
+       bool is_12bits_color_channel;
+       const struct dc_rgb *lut0;
+       const struct dc_rgb *lut1;
+       const struct dc_rgb *lut2;
+       const struct dc_rgb *lut3;
+       int lut_size0;
+       int lut_size;
+
+       if (params == NULL) {
+               mpc32_set_3dlut_mode(mpc, LUT_BYPASS, false, false, mpcc_id);
+               return false;
+       }
+       mpc32_power_on_shaper_3dlut(mpc, mpcc_id, true);
+
+       mode = get3dlut_config(mpc, &is_17x17x17, &is_12bits_color_channel, mpcc_id);
+
+       if (mode == LUT_BYPASS || mode == LUT_RAM_B)
+               mode = LUT_RAM_A;
+       else
+               mode = LUT_RAM_B;
+
+       is_17x17x17 = !params->use_tetrahedral_9;
+       is_12bits_color_channel = params->use_12bits;
+       if (is_17x17x17) {
+               lut0 = params->tetrahedral_17.lut0;
+               lut1 = params->tetrahedral_17.lut1;
+               lut2 = params->tetrahedral_17.lut2;
+               lut3 = params->tetrahedral_17.lut3;
+               lut_size0 = sizeof(params->tetrahedral_17.lut0)/
+                                       sizeof(params->tetrahedral_17.lut0[0]);
+               lut_size  = sizeof(params->tetrahedral_17.lut1)/
+                                       sizeof(params->tetrahedral_17.lut1[0]);
+       } else {
+               lut0 = params->tetrahedral_9.lut0;
+               lut1 = params->tetrahedral_9.lut1;
+               lut2 = params->tetrahedral_9.lut2;
+               lut3 = params->tetrahedral_9.lut3;
+               lut_size0 = sizeof(params->tetrahedral_9.lut0)/
+                               sizeof(params->tetrahedral_9.lut0[0]);
+               lut_size  = sizeof(params->tetrahedral_9.lut1)/
+                               sizeof(params->tetrahedral_9.lut1[0]);
+               }
+
+       mpc32_select_3dlut_ram(mpc, mode,
+                               is_12bits_color_channel, mpcc_id);
+       mpc32_select_3dlut_ram_mask(mpc, 0x1, mpcc_id);
+       if (is_12bits_color_channel)
+               mpc32_set3dlut_ram12(mpc, lut0, lut_size0, mpcc_id);
+       else
+               mpc32_set3dlut_ram10(mpc, lut0, lut_size0, mpcc_id);
+
+       mpc32_select_3dlut_ram_mask(mpc, 0x2, mpcc_id);
+       if (is_12bits_color_channel)
+               mpc32_set3dlut_ram12(mpc, lut1, lut_size, mpcc_id);
+       else
+               mpc32_set3dlut_ram10(mpc, lut1, lut_size, mpcc_id);
+
+       mpc32_select_3dlut_ram_mask(mpc, 0x4, mpcc_id);
+       if (is_12bits_color_channel)
+               mpc32_set3dlut_ram12(mpc, lut2, lut_size, mpcc_id);
+       else
+               mpc32_set3dlut_ram10(mpc, lut2, lut_size, mpcc_id);
+
+       mpc32_select_3dlut_ram_mask(mpc, 0x8, mpcc_id);
+       if (is_12bits_color_channel)
+               mpc32_set3dlut_ram12(mpc, lut3, lut_size, mpcc_id);
+       else
+               mpc32_set3dlut_ram10(mpc, lut3, lut_size, mpcc_id);
+
+       mpc32_set_3dlut_mode(mpc, mode, is_12bits_color_channel,
+                                       is_17x17x17, mpcc_id);
+
+       if (mpc->ctx->dc->debug.enable_mem_low_power.bits.mpc)
+               mpc32_power_on_shaper_3dlut(mpc, mpcc_id, false);
+
+       return true;
+}
+
+static const struct mpc_funcs dcn32_mpc_funcs = {
+       .read_mpcc_state = mpc1_read_mpcc_state,
+       .insert_plane = mpc1_insert_plane,
+       .remove_mpcc = mpc1_remove_mpcc,
+       .mpc_init = mpc32_mpc_init,
+       .mpc_init_single_inst = mpc3_mpc_init_single_inst,
+       .update_blending = mpc2_update_blending,
+       .cursor_lock = mpc1_cursor_lock,
+       .get_mpcc_for_dpp = mpc1_get_mpcc_for_dpp,
+       .wait_for_idle = mpc2_assert_idle_mpcc,
+       .assert_mpcc_idle_before_connect = mpc2_assert_mpcc_idle_before_connect,
+       .init_mpcc_list_from_hw = mpc1_init_mpcc_list_from_hw,
+       .set_denorm =  mpc3_set_denorm,
+       .set_denorm_clamp = mpc3_set_denorm_clamp,
+       .set_output_csc = mpc3_set_output_csc,
+       .set_ocsc_default = mpc3_set_ocsc_default,
+       .set_output_gamma = mpc3_set_output_gamma,
+       .insert_plane_to_secondary = NULL,
+       .remove_mpcc_from_secondary =  NULL,
+       .set_dwb_mux = mpc3_set_dwb_mux,
+       .disable_dwb_mux = mpc3_disable_dwb_mux,
+       .is_dwb_idle = mpc3_is_dwb_idle,
+       .set_gamut_remap = mpc3_set_gamut_remap,
+       .program_shaper = mpc32_program_shaper,
+       .program_3dlut = mpc32_program_3dlut,
+       .program_1dlut = mpc32_program_post1dlut,
+       .acquire_rmu = NULL,
+       .release_rmu = NULL,
+       .power_on_mpc_mem_pwr = mpc3_power_on_ogam_lut,
+       .get_mpc_out_mux = mpc1_get_mpc_out_mux,
+       .set_bg_color = mpc1_set_bg_color,
+       .set_movable_cm_location = mpc401_set_movable_cm_location,
+       .populate_lut = mpc401_populate_lut,
+};
+
+
+void dcn32_mpc_construct(struct dcn30_mpc *mpc30,
+       struct dc_context *ctx,
+       const struct dcn30_mpc_registers *mpc_regs,
+       const struct dcn30_mpc_shift *mpc_shift,
+       const struct dcn30_mpc_mask *mpc_mask,
+       int num_mpcc,
+       int num_rmu)
+{
+       int i;
+
+       mpc30->base.ctx = ctx;
+
+       mpc30->base.funcs = &dcn32_mpc_funcs;
+
+       mpc30->mpc_regs = mpc_regs;
+       mpc30->mpc_shift = mpc_shift;
+       mpc30->mpc_mask = mpc_mask;
+
+       mpc30->mpcc_in_use_mask = 0;
+       mpc30->num_mpcc = num_mpcc;
+       mpc30->num_rmu = num_rmu;
+
+       for (i = 0; i < MAX_MPCC; i++)
+               mpc3_init_mpcc(&mpc30->base.mpcc_array[i], i);
+}
diff --git a/drivers/gpu/drm/amd/display/dc/mpc/dcn32/dcn32_mpc.h b/drivers/gpu/drm/amd/display/dc/mpc/dcn32/dcn32_mpc.h
new file mode 100644 (file)
index 0000000..9622518
--- /dev/null
@@ -0,0 +1,394 @@
+/* Copyright 2021 Advanced Micro Devices, Inc.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+ * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
+ * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+ * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+ * OTHER DEALINGS IN THE SOFTWARE.
+ *
+ * Authors: AMD
+ *
+ */
+
+#ifndef __DC_MPCC_DCN32_H__
+#define __DC_MPCC_DCN32_H__
+
+#include "dcn20/dcn20_mpc.h"
+#include "dcn30/dcn30_mpc.h"
+
+#define TO_DCN32_MPC(mpc_base) \
+       container_of(mpc_base, struct dcn32_mpc, base)
+
+#define MPC_REG_LIST_DCN3_2(inst) \
+       MPC_REG_LIST_DCN3_0(inst),\
+       SRII(MPCC_MOVABLE_CM_LOCATION_CONTROL, MPCC, inst),\
+       SRII(MPCC_MCM_SHAPER_CONTROL, MPCC_MCM, inst),\
+       SRII(MPCC_MCM_SHAPER_OFFSET_R, MPCC_MCM, inst),\
+       SRII(MPCC_MCM_SHAPER_OFFSET_G, MPCC_MCM, inst),\
+       SRII(MPCC_MCM_SHAPER_OFFSET_B, MPCC_MCM, inst),\
+       SRII(MPCC_MCM_SHAPER_SCALE_R, MPCC_MCM, inst),\
+       SRII(MPCC_MCM_SHAPER_SCALE_G_B, MPCC_MCM, inst),\
+       SRII(MPCC_MCM_SHAPER_LUT_INDEX, MPCC_MCM, inst),\
+       SRII(MPCC_MCM_SHAPER_LUT_DATA, MPCC_MCM, inst),\
+       SRII(MPCC_MCM_SHAPER_LUT_WRITE_EN_MASK, MPCC_MCM, inst),\
+       SRII(MPCC_MCM_SHAPER_RAMA_START_CNTL_B, MPCC_MCM, inst),\
+       SRII(MPCC_MCM_SHAPER_RAMA_START_CNTL_G, MPCC_MCM, inst),\
+       SRII(MPCC_MCM_SHAPER_RAMA_START_CNTL_R, MPCC_MCM, inst),\
+       SRII(MPCC_MCM_SHAPER_RAMA_END_CNTL_B, MPCC_MCM, inst),\
+       SRII(MPCC_MCM_SHAPER_RAMA_END_CNTL_G, MPCC_MCM, inst),\
+       SRII(MPCC_MCM_SHAPER_RAMA_END_CNTL_R, MPCC_MCM, inst),\
+       SRII(MPCC_MCM_SHAPER_RAMA_REGION_0_1, MPCC_MCM, inst),\
+       SRII(MPCC_MCM_SHAPER_RAMA_REGION_2_3, MPCC_MCM, inst),\
+       SRII(MPCC_MCM_SHAPER_RAMA_REGION_4_5, MPCC_MCM, inst),\
+       SRII(MPCC_MCM_SHAPER_RAMA_REGION_6_7, MPCC_MCM, inst),\
+       SRII(MPCC_MCM_SHAPER_RAMA_REGION_8_9, MPCC_MCM, inst),\
+       SRII(MPCC_MCM_SHAPER_RAMA_REGION_10_11, MPCC_MCM, inst),\
+       SRII(MPCC_MCM_SHAPER_RAMA_REGION_12_13, MPCC_MCM, inst),\
+       SRII(MPCC_MCM_SHAPER_RAMA_REGION_14_15, MPCC_MCM, inst),\
+       SRII(MPCC_MCM_SHAPER_RAMA_REGION_16_17, MPCC_MCM, inst),\
+       SRII(MPCC_MCM_SHAPER_RAMA_REGION_18_19, MPCC_MCM, inst),\
+       SRII(MPCC_MCM_SHAPER_RAMA_REGION_20_21, MPCC_MCM, inst),\
+       SRII(MPCC_MCM_SHAPER_RAMA_REGION_22_23, MPCC_MCM, inst),\
+       SRII(MPCC_MCM_SHAPER_RAMA_REGION_24_25, MPCC_MCM, inst),\
+       SRII(MPCC_MCM_SHAPER_RAMA_REGION_26_27, MPCC_MCM, inst),\
+       SRII(MPCC_MCM_SHAPER_RAMA_REGION_28_29, MPCC_MCM, inst),\
+       SRII(MPCC_MCM_SHAPER_RAMA_REGION_30_31, MPCC_MCM, inst),\
+       SRII(MPCC_MCM_SHAPER_RAMA_REGION_32_33, MPCC_MCM, inst),\
+       SRII(MPCC_MCM_SHAPER_RAMB_START_CNTL_B, MPCC_MCM, inst),\
+       SRII(MPCC_MCM_SHAPER_RAMB_START_CNTL_G, MPCC_MCM, inst),\
+       SRII(MPCC_MCM_SHAPER_RAMB_START_CNTL_R, MPCC_MCM, inst),\
+       SRII(MPCC_MCM_SHAPER_RAMB_END_CNTL_B, MPCC_MCM, inst),\
+       SRII(MPCC_MCM_SHAPER_RAMB_END_CNTL_G, MPCC_MCM, inst),\
+       SRII(MPCC_MCM_SHAPER_RAMB_END_CNTL_R, MPCC_MCM, inst),\
+       SRII(MPCC_MCM_SHAPER_RAMB_REGION_0_1, MPCC_MCM, inst),\
+       SRII(MPCC_MCM_SHAPER_RAMB_REGION_2_3, MPCC_MCM, inst),\
+       SRII(MPCC_MCM_SHAPER_RAMB_REGION_4_5, MPCC_MCM, inst),\
+       SRII(MPCC_MCM_SHAPER_RAMB_REGION_6_7, MPCC_MCM, inst),\
+       SRII(MPCC_MCM_SHAPER_RAMB_REGION_8_9, MPCC_MCM, inst),\
+       SRII(MPCC_MCM_SHAPER_RAMB_REGION_10_11, MPCC_MCM, inst),\
+       SRII(MPCC_MCM_SHAPER_RAMB_REGION_12_13, MPCC_MCM, inst),\
+       SRII(MPCC_MCM_SHAPER_RAMB_REGION_14_15, MPCC_MCM, inst),\
+       SRII(MPCC_MCM_SHAPER_RAMB_REGION_16_17, MPCC_MCM, inst),\
+       SRII(MPCC_MCM_SHAPER_RAMB_REGION_18_19, MPCC_MCM, inst),\
+       SRII(MPCC_MCM_SHAPER_RAMB_REGION_20_21, MPCC_MCM, inst),\
+       SRII(MPCC_MCM_SHAPER_RAMB_REGION_22_23, MPCC_MCM, inst),\
+       SRII(MPCC_MCM_SHAPER_RAMB_REGION_24_25, MPCC_MCM, inst),\
+       SRII(MPCC_MCM_SHAPER_RAMB_REGION_26_27, MPCC_MCM, inst),\
+       SRII(MPCC_MCM_SHAPER_RAMB_REGION_28_29, MPCC_MCM, inst),\
+       SRII(MPCC_MCM_SHAPER_RAMB_REGION_30_31, MPCC_MCM, inst),\
+       SRII(MPCC_MCM_SHAPER_RAMB_REGION_32_33, MPCC_MCM, inst),\
+       SRII(MPCC_MCM_3DLUT_MODE, MPCC_MCM, inst), /*TODO: may need to add other 3DLUT regs*/\
+       SRII(MPCC_MCM_3DLUT_INDEX, MPCC_MCM, inst),\
+       SRII(MPCC_MCM_3DLUT_DATA, MPCC_MCM, inst),\
+       SRII(MPCC_MCM_3DLUT_DATA_30BIT, MPCC_MCM, inst),\
+       SRII(MPCC_MCM_3DLUT_READ_WRITE_CONTROL, MPCC_MCM, inst),\
+       SRII(MPCC_MCM_3DLUT_OUT_NORM_FACTOR, MPCC_MCM, inst),\
+       SRII(MPCC_MCM_3DLUT_OUT_OFFSET_R, MPCC_MCM, inst),\
+       SRII(MPCC_MCM_3DLUT_OUT_OFFSET_G, MPCC_MCM, inst),\
+       SRII(MPCC_MCM_3DLUT_OUT_OFFSET_B, MPCC_MCM, inst),\
+       SRII(MPCC_MCM_1DLUT_CONTROL, MPCC_MCM, inst),\
+       SRII(MPCC_MCM_1DLUT_LUT_INDEX, MPCC_MCM, inst),\
+       SRII(MPCC_MCM_1DLUT_LUT_DATA, MPCC_MCM, inst),\
+       SRII(MPCC_MCM_1DLUT_LUT_CONTROL, MPCC_MCM, inst),\
+       SRII(MPCC_MCM_1DLUT_RAMA_START_CNTL_B, MPCC_MCM, inst),\
+       SRII(MPCC_MCM_1DLUT_RAMA_START_CNTL_G, MPCC_MCM, inst),\
+       SRII(MPCC_MCM_1DLUT_RAMA_START_CNTL_R, MPCC_MCM, inst),\
+       SRII(MPCC_MCM_1DLUT_RAMA_START_SLOPE_CNTL_B, MPCC_MCM, inst),\
+       SRII(MPCC_MCM_1DLUT_RAMA_START_SLOPE_CNTL_G, MPCC_MCM, inst),\
+       SRII(MPCC_MCM_1DLUT_RAMA_START_SLOPE_CNTL_R, MPCC_MCM, inst),\
+       SRII(MPCC_MCM_1DLUT_RAMA_START_BASE_CNTL_B, MPCC_MCM, inst),\
+       SRII(MPCC_MCM_1DLUT_RAMA_START_BASE_CNTL_G, MPCC_MCM, inst),\
+       SRII(MPCC_MCM_1DLUT_RAMA_START_BASE_CNTL_R, MPCC_MCM, inst),\
+       SRII(MPCC_MCM_1DLUT_RAMA_END_CNTL1_B, MPCC_MCM, inst),\
+       SRII(MPCC_MCM_1DLUT_RAMA_END_CNTL2_B, MPCC_MCM, inst),\
+       SRII(MPCC_MCM_1DLUT_RAMA_END_CNTL1_G, MPCC_MCM, inst),\
+       SRII(MPCC_MCM_1DLUT_RAMA_END_CNTL2_G, MPCC_MCM, inst),\
+       SRII(MPCC_MCM_1DLUT_RAMA_END_CNTL1_R, MPCC_MCM, inst),\
+       SRII(MPCC_MCM_1DLUT_RAMA_END_CNTL2_R, MPCC_MCM, inst),\
+       SRII(MPCC_MCM_1DLUT_RAMA_OFFSET_B, MPCC_MCM, inst),\
+       SRII(MPCC_MCM_1DLUT_RAMA_OFFSET_G, MPCC_MCM, inst),\
+       SRII(MPCC_MCM_1DLUT_RAMA_OFFSET_R, MPCC_MCM, inst),\
+       SRII(MPCC_MCM_1DLUT_RAMA_REGION_0_1, MPCC_MCM, inst),\
+       SRII(MPCC_MCM_1DLUT_RAMA_REGION_2_3, MPCC_MCM, inst),\
+       SRII(MPCC_MCM_1DLUT_RAMA_REGION_4_5, MPCC_MCM, inst),\
+       SRII(MPCC_MCM_1DLUT_RAMA_REGION_6_7, MPCC_MCM, inst),\
+       SRII(MPCC_MCM_1DLUT_RAMA_REGION_8_9, MPCC_MCM, inst),\
+       SRII(MPCC_MCM_1DLUT_RAMA_REGION_10_11, MPCC_MCM, inst),\
+       SRII(MPCC_MCM_1DLUT_RAMA_REGION_12_13, MPCC_MCM, inst),\
+       SRII(MPCC_MCM_1DLUT_RAMA_REGION_14_15, MPCC_MCM, inst),\
+       SRII(MPCC_MCM_1DLUT_RAMA_REGION_16_17, MPCC_MCM, inst),\
+       SRII(MPCC_MCM_1DLUT_RAMA_REGION_18_19, MPCC_MCM, inst),\
+       SRII(MPCC_MCM_1DLUT_RAMA_REGION_20_21, MPCC_MCM, inst),\
+       SRII(MPCC_MCM_1DLUT_RAMA_REGION_22_23, MPCC_MCM, inst),\
+       SRII(MPCC_MCM_1DLUT_RAMA_REGION_24_25, MPCC_MCM, inst),\
+       SRII(MPCC_MCM_1DLUT_RAMA_REGION_26_27, MPCC_MCM, inst),\
+       SRII(MPCC_MCM_1DLUT_RAMA_REGION_28_29, MPCC_MCM, inst),\
+       SRII(MPCC_MCM_1DLUT_RAMA_REGION_30_31, MPCC_MCM, inst),\
+       SRII(MPCC_MCM_1DLUT_RAMA_REGION_32_33, MPCC_MCM, inst),\
+       SRII(MPCC_MCM_1DLUT_RAMB_START_CNTL_B, MPCC_MCM, inst),\
+       SRII(MPCC_MCM_1DLUT_RAMB_START_CNTL_G, MPCC_MCM, inst),\
+       SRII(MPCC_MCM_1DLUT_RAMB_START_CNTL_R, MPCC_MCM, inst),\
+       SRII(MPCC_MCM_1DLUT_RAMB_START_SLOPE_CNTL_B, MPCC_MCM, inst),\
+       SRII(MPCC_MCM_1DLUT_RAMB_START_SLOPE_CNTL_G, MPCC_MCM, inst),\
+       SRII(MPCC_MCM_1DLUT_RAMB_START_SLOPE_CNTL_R, MPCC_MCM, inst),\
+       SRII(MPCC_MCM_1DLUT_RAMB_START_BASE_CNTL_B, MPCC_MCM, inst),\
+       SRII(MPCC_MCM_1DLUT_RAMB_START_BASE_CNTL_G, MPCC_MCM, inst),\
+       SRII(MPCC_MCM_1DLUT_RAMB_START_BASE_CNTL_R, MPCC_MCM, inst),\
+       SRII(MPCC_MCM_1DLUT_RAMB_END_CNTL1_B, MPCC_MCM, inst),\
+       SRII(MPCC_MCM_1DLUT_RAMB_END_CNTL2_B, MPCC_MCM, inst),\
+       SRII(MPCC_MCM_1DLUT_RAMB_END_CNTL1_G, MPCC_MCM, inst),\
+       SRII(MPCC_MCM_1DLUT_RAMB_END_CNTL2_G, MPCC_MCM, inst),\
+       SRII(MPCC_MCM_1DLUT_RAMB_END_CNTL1_R, MPCC_MCM, inst),\
+       SRII(MPCC_MCM_1DLUT_RAMB_END_CNTL2_R, MPCC_MCM, inst),\
+       SRII(MPCC_MCM_1DLUT_RAMB_OFFSET_B, MPCC_MCM, inst),\
+       SRII(MPCC_MCM_1DLUT_RAMB_OFFSET_G, MPCC_MCM, inst),\
+       SRII(MPCC_MCM_1DLUT_RAMB_OFFSET_R, MPCC_MCM, inst),\
+       SRII(MPCC_MCM_1DLUT_RAMB_REGION_0_1, MPCC_MCM, inst),\
+       SRII(MPCC_MCM_1DLUT_RAMB_REGION_2_3, MPCC_MCM, inst),\
+       SRII(MPCC_MCM_1DLUT_RAMB_REGION_4_5, MPCC_MCM, inst),\
+       SRII(MPCC_MCM_1DLUT_RAMB_REGION_6_7, MPCC_MCM, inst),\
+       SRII(MPCC_MCM_1DLUT_RAMB_REGION_8_9, MPCC_MCM, inst),\
+       SRII(MPCC_MCM_1DLUT_RAMB_REGION_10_11, MPCC_MCM, inst),\
+       SRII(MPCC_MCM_1DLUT_RAMB_REGION_12_13, MPCC_MCM, inst),\
+       SRII(MPCC_MCM_1DLUT_RAMB_REGION_14_15, MPCC_MCM, inst),\
+       SRII(MPCC_MCM_1DLUT_RAMB_REGION_16_17, MPCC_MCM, inst),\
+       SRII(MPCC_MCM_1DLUT_RAMB_REGION_18_19, MPCC_MCM, inst),\
+       SRII(MPCC_MCM_1DLUT_RAMB_REGION_20_21, MPCC_MCM, inst),\
+       SRII(MPCC_MCM_1DLUT_RAMB_REGION_22_23, MPCC_MCM, inst),\
+       SRII(MPCC_MCM_1DLUT_RAMB_REGION_24_25, MPCC_MCM, inst),\
+       SRII(MPCC_MCM_1DLUT_RAMB_REGION_26_27, MPCC_MCM, inst),\
+       SRII(MPCC_MCM_1DLUT_RAMB_REGION_28_29, MPCC_MCM, inst),\
+       SRII(MPCC_MCM_1DLUT_RAMB_REGION_30_31, MPCC_MCM, inst),\
+       SRII(MPCC_MCM_1DLUT_RAMB_REGION_32_33, MPCC_MCM, inst),\
+       SRII(MPCC_MCM_MEM_PWR_CTRL, MPCC_MCM, inst)
+
+
+#define MPC_COMMON_MASK_SH_LIST_DCN32(mask_sh) \
+       MPC_COMMON_MASK_SH_LIST_DCN1_0(mask_sh),\
+       SF(MPCC0_MPCC_CONTROL, MPCC_BG_BPC, mask_sh),\
+       SF(MPCC0_MPCC_CONTROL, MPCC_BOT_GAIN_MODE, mask_sh),\
+       SF(MPCC0_MPCC_TOP_GAIN, MPCC_TOP_GAIN, mask_sh),\
+       SF(MPCC0_MPCC_BOT_GAIN_INSIDE, MPCC_BOT_GAIN_INSIDE, mask_sh),\
+       SF(MPCC0_MPCC_BOT_GAIN_OUTSIDE, MPCC_BOT_GAIN_OUTSIDE, mask_sh),\
+       SF(MPCC0_MPCC_MOVABLE_CM_LOCATION_CONTROL, MPCC_MOVABLE_CM_LOCATION_CNTL, mask_sh),\
+       SF(MPCC0_MPCC_MOVABLE_CM_LOCATION_CONTROL, MPCC_MOVABLE_CM_LOCATION_CNTL_CURRENT, mask_sh),\
+       SF(MPC_OUT0_CSC_MODE, MPC_OCSC_MODE, mask_sh),\
+       SF(MPC_OUT0_CSC_C11_C12_A, MPC_OCSC_C11_A, mask_sh),\
+       SF(MPC_OUT0_CSC_C11_C12_A, MPC_OCSC_C12_A, mask_sh),\
+       SF(MPCC0_MPCC_STATUS, MPCC_DISABLED, mask_sh),\
+       SF(MPCC0_MPCC_MEM_PWR_CTRL, MPCC_OGAM_MEM_PWR_FORCE, mask_sh),\
+       SF(MPCC0_MPCC_MEM_PWR_CTRL, MPCC_OGAM_MEM_PWR_DIS, mask_sh),\
+       SF(MPCC0_MPCC_MEM_PWR_CTRL, MPCC_OGAM_MEM_LOW_PWR_MODE, mask_sh),\
+       SF(MPCC0_MPCC_MEM_PWR_CTRL, MPCC_OGAM_MEM_PWR_STATE, mask_sh),\
+       SF(MPC_OUT0_DENORM_CONTROL, MPC_OUT_DENORM_MODE, mask_sh),\
+       SF(MPC_OUT0_DENORM_CONTROL, MPC_OUT_DENORM_CLAMP_MAX_R_CR, mask_sh),\
+       SF(MPC_OUT0_DENORM_CONTROL, MPC_OUT_DENORM_CLAMP_MIN_R_CR, mask_sh),\
+       SF(MPC_OUT0_DENORM_CLAMP_G_Y, MPC_OUT_DENORM_CLAMP_MAX_G_Y, mask_sh),\
+       SF(MPC_OUT0_DENORM_CLAMP_G_Y, MPC_OUT_DENORM_CLAMP_MIN_G_Y, mask_sh),\
+       SF(MPC_OUT0_DENORM_CLAMP_B_CB, MPC_OUT_DENORM_CLAMP_MAX_B_CB, mask_sh),\
+       SF(MPC_OUT0_DENORM_CLAMP_B_CB, MPC_OUT_DENORM_CLAMP_MIN_B_CB, mask_sh),\
+       SF(MPCC_OGAM0_MPCC_GAMUT_REMAP_MODE, MPCC_GAMUT_REMAP_MODE, mask_sh),\
+       SF(MPCC_OGAM0_MPCC_GAMUT_REMAP_MODE, MPCC_GAMUT_REMAP_MODE_CURRENT, mask_sh),\
+       SF(MPCC_OGAM0_MPCC_GAMUT_REMAP_COEF_FORMAT, MPCC_GAMUT_REMAP_COEF_FORMAT, mask_sh),\
+       SF(MPCC_OGAM0_MPC_GAMUT_REMAP_C11_C12_A, MPCC_GAMUT_REMAP_C11_A, mask_sh),\
+       SF(MPCC_OGAM0_MPC_GAMUT_REMAP_C11_C12_A, MPCC_GAMUT_REMAP_C12_A, mask_sh),\
+       SF(MPC_DWB0_MUX, MPC_DWB0_MUX, mask_sh),\
+       SF(MPC_DWB0_MUX, MPC_DWB0_MUX_STATUS, mask_sh),\
+       SF(MPC_OUT0_MUX, MPC_OUT_RATE_CONTROL, mask_sh),\
+       SF(MPC_OUT0_MUX, MPC_OUT_RATE_CONTROL_DISABLE, mask_sh),\
+       SF(MPC_OUT0_MUX, MPC_OUT_FLOW_CONTROL_MODE, mask_sh),\
+       SF(MPC_OUT0_MUX, MPC_OUT_FLOW_CONTROL_COUNT, mask_sh), \
+       SF(MPCC_OGAM0_MPCC_OGAM_RAMA_REGION_0_1, MPCC_OGAM_RAMA_EXP_REGION0_LUT_OFFSET, mask_sh),\
+       SF(MPCC_OGAM0_MPCC_OGAM_RAMA_REGION_0_1, MPCC_OGAM_RAMA_EXP_REGION0_NUM_SEGMENTS, mask_sh),\
+       SF(MPCC_OGAM0_MPCC_OGAM_RAMA_REGION_0_1, MPCC_OGAM_RAMA_EXP_REGION1_LUT_OFFSET, mask_sh),\
+       SF(MPCC_OGAM0_MPCC_OGAM_RAMA_REGION_0_1, MPCC_OGAM_RAMA_EXP_REGION1_NUM_SEGMENTS, mask_sh),\
+       SF(MPCC_OGAM0_MPCC_OGAM_RAMA_END_CNTL2_B, MPCC_OGAM_RAMA_EXP_REGION_END_SLOPE_B, mask_sh),\
+       SF(MPCC_OGAM0_MPCC_OGAM_RAMA_END_CNTL2_B, MPCC_OGAM_RAMA_EXP_REGION_END_B, mask_sh),\
+       SF(MPCC_OGAM0_MPCC_OGAM_RAMA_END_CNTL1_B, MPCC_OGAM_RAMA_EXP_REGION_END_BASE_B, mask_sh),\
+       SF(MPCC_OGAM0_MPCC_OGAM_RAMA_START_SLOPE_CNTL_B, MPCC_OGAM_RAMA_EXP_REGION_START_SLOPE_B, mask_sh),\
+       SF(MPCC_OGAM0_MPCC_OGAM_RAMA_START_BASE_CNTL_B, MPCC_OGAM_RAMA_EXP_REGION_START_BASE_B, mask_sh),\
+       SF(MPCC_OGAM0_MPCC_OGAM_RAMA_START_CNTL_B, MPCC_OGAM_RAMA_EXP_REGION_START_B, mask_sh),\
+       SF(MPCC_OGAM0_MPCC_OGAM_RAMA_START_CNTL_B, MPCC_OGAM_RAMA_EXP_REGION_START_SEGMENT_B, mask_sh),\
+       SF(MPCC_OGAM0_MPCC_OGAM_RAMA_OFFSET_B, MPCC_OGAM_RAMA_OFFSET_B, mask_sh),\
+       SF(MPCC_OGAM0_MPCC_OGAM_RAMA_OFFSET_G, MPCC_OGAM_RAMA_OFFSET_G, mask_sh),\
+       SF(MPCC_OGAM0_MPCC_OGAM_RAMA_OFFSET_R, MPCC_OGAM_RAMA_OFFSET_R, mask_sh),\
+       SF(MPCC_OGAM0_MPCC_OGAM_LUT_INDEX, MPCC_OGAM_LUT_INDEX, mask_sh),\
+       SF(MPCC_OGAM0_MPCC_OGAM_CONTROL, MPCC_OGAM_MODE, mask_sh),\
+       SF(MPCC_OGAM0_MPCC_OGAM_CONTROL, MPCC_OGAM_SELECT, mask_sh),\
+       SF(MPCC_OGAM0_MPCC_OGAM_CONTROL, MPCC_OGAM_PWL_DISABLE, mask_sh),\
+       SF(MPCC_OGAM0_MPCC_OGAM_CONTROL, MPCC_OGAM_MODE_CURRENT, mask_sh),\
+       SF(MPCC_OGAM0_MPCC_OGAM_CONTROL, MPCC_OGAM_SELECT_CURRENT, mask_sh),\
+       SF(MPCC_OGAM0_MPCC_OGAM_LUT_CONTROL, MPCC_OGAM_LUT_WRITE_COLOR_MASK, mask_sh),\
+       SF(MPCC_OGAM0_MPCC_OGAM_LUT_CONTROL, MPCC_OGAM_LUT_READ_COLOR_SEL, mask_sh),\
+       SF(MPCC_OGAM0_MPCC_OGAM_LUT_CONTROL, MPCC_OGAM_LUT_HOST_SEL, mask_sh),\
+       SF(MPCC_OGAM0_MPCC_OGAM_LUT_CONTROL, MPCC_OGAM_LUT_CONFIG_MODE, mask_sh),\
+       SF(MPCC_OGAM0_MPCC_OGAM_LUT_DATA, MPCC_OGAM_LUT_DATA, mask_sh),\
+       SF(MPCC_MCM0_MPCC_MCM_3DLUT_MODE, MPCC_MCM_3DLUT_MODE, mask_sh),\
+       SF(MPCC_MCM0_MPCC_MCM_3DLUT_MODE, MPCC_MCM_3DLUT_SIZE, mask_sh),\
+       SF(MPCC_MCM0_MPCC_MCM_3DLUT_MODE, MPCC_MCM_3DLUT_MODE_CURRENT, mask_sh),\
+       SF(MPCC_MCM0_MPCC_MCM_3DLUT_READ_WRITE_CONTROL, MPCC_MCM_3DLUT_WRITE_EN_MASK, mask_sh),\
+       SF(MPCC_MCM0_MPCC_MCM_3DLUT_READ_WRITE_CONTROL, MPCC_MCM_3DLUT_RAM_SEL, mask_sh),\
+       SF(MPCC_MCM0_MPCC_MCM_3DLUT_READ_WRITE_CONTROL, MPCC_MCM_3DLUT_30BIT_EN, mask_sh),\
+       SF(MPCC_MCM0_MPCC_MCM_3DLUT_READ_WRITE_CONTROL, MPCC_MCM_3DLUT_READ_SEL, mask_sh),\
+       SF(MPCC_MCM0_MPCC_MCM_3DLUT_INDEX, MPCC_MCM_3DLUT_INDEX, mask_sh),\
+       SF(MPCC_MCM0_MPCC_MCM_3DLUT_DATA, MPCC_MCM_3DLUT_DATA0, mask_sh),\
+       SF(MPCC_MCM0_MPCC_MCM_3DLUT_DATA, MPCC_MCM_3DLUT_DATA1, mask_sh),\
+       SF(MPCC_MCM0_MPCC_MCM_3DLUT_DATA_30BIT, MPCC_MCM_3DLUT_DATA_30BIT, mask_sh),\
+       SF(MPCC_MCM0_MPCC_MCM_SHAPER_CONTROL, MPCC_MCM_SHAPER_LUT_MODE, mask_sh),\
+       SF(MPCC_MCM0_MPCC_MCM_SHAPER_CONTROL, MPCC_MCM_SHAPER_MODE_CURRENT, mask_sh),\
+       SF(MPCC_MCM0_MPCC_MCM_SHAPER_OFFSET_R, MPCC_MCM_SHAPER_OFFSET_R, mask_sh),\
+       SF(MPCC_MCM0_MPCC_MCM_SHAPER_OFFSET_G, MPCC_MCM_SHAPER_OFFSET_G, mask_sh),\
+       SF(MPCC_MCM0_MPCC_MCM_SHAPER_OFFSET_B, MPCC_MCM_SHAPER_OFFSET_B, mask_sh),\
+       SF(MPCC_MCM0_MPCC_MCM_SHAPER_SCALE_R, MPCC_MCM_SHAPER_SCALE_R, mask_sh),\
+       SF(MPCC_MCM0_MPCC_MCM_SHAPER_SCALE_G_B, MPCC_MCM_SHAPER_SCALE_G, mask_sh),\
+       SF(MPCC_MCM0_MPCC_MCM_SHAPER_SCALE_G_B, MPCC_MCM_SHAPER_SCALE_B, mask_sh),\
+       SF(MPCC_MCM0_MPCC_MCM_SHAPER_LUT_INDEX, MPCC_MCM_SHAPER_LUT_INDEX, mask_sh),\
+       SF(MPCC_MCM0_MPCC_MCM_SHAPER_LUT_DATA, MPCC_MCM_SHAPER_LUT_DATA, mask_sh),\
+       SF(MPCC_MCM0_MPCC_MCM_SHAPER_LUT_WRITE_EN_MASK, MPCC_MCM_SHAPER_LUT_WRITE_EN_MASK, mask_sh),\
+       SF(MPCC_MCM0_MPCC_MCM_SHAPER_LUT_WRITE_EN_MASK, MPCC_MCM_SHAPER_LUT_WRITE_SEL, mask_sh),\
+       SF(MPCC_MCM0_MPCC_MCM_SHAPER_RAMA_START_CNTL_B, MPCC_MCM_SHAPER_RAMA_EXP_REGION_START_B, mask_sh),\
+       SF(MPCC_MCM0_MPCC_MCM_SHAPER_RAMA_START_CNTL_B, MPCC_MCM_SHAPER_RAMA_EXP_REGION_START_SEGMENT_B, mask_sh),\
+       SF(MPCC_MCM0_MPCC_MCM_SHAPER_RAMA_END_CNTL_B, MPCC_MCM_SHAPER_RAMA_EXP_REGION_END_B, mask_sh),\
+       SF(MPCC_MCM0_MPCC_MCM_SHAPER_RAMA_END_CNTL_B, MPCC_MCM_SHAPER_RAMA_EXP_REGION_END_BASE_B, mask_sh),\
+       SF(MPCC_MCM0_MPCC_MCM_SHAPER_RAMA_REGION_0_1, MPCC_MCM_SHAPER_RAMA_EXP_REGION0_LUT_OFFSET, mask_sh),\
+       SF(MPCC_MCM0_MPCC_MCM_SHAPER_RAMA_REGION_0_1, MPCC_MCM_SHAPER_RAMA_EXP_REGION0_NUM_SEGMENTS, mask_sh),\
+       SF(MPCC_MCM0_MPCC_MCM_SHAPER_RAMA_REGION_0_1, MPCC_MCM_SHAPER_RAMA_EXP_REGION1_LUT_OFFSET, mask_sh),\
+       SF(MPCC_MCM0_MPCC_MCM_SHAPER_RAMA_REGION_0_1, MPCC_MCM_SHAPER_RAMA_EXP_REGION1_NUM_SEGMENTS, mask_sh),\
+       SF(MPCC_MCM0_MPCC_MCM_1DLUT_CONTROL, MPCC_MCM_1DLUT_MODE, mask_sh),\
+       SF(MPCC_MCM0_MPCC_MCM_1DLUT_CONTROL, MPCC_MCM_1DLUT_SELECT, mask_sh),\
+       SF(MPCC_MCM0_MPCC_MCM_1DLUT_CONTROL, MPCC_MCM_1DLUT_PWL_DISABLE, mask_sh),\
+       SF(MPCC_MCM0_MPCC_MCM_1DLUT_CONTROL, MPCC_MCM_1DLUT_MODE_CURRENT, mask_sh),\
+       SF(MPCC_MCM0_MPCC_MCM_1DLUT_CONTROL, MPCC_MCM_1DLUT_SELECT_CURRENT, mask_sh),\
+       SF(MPCC_MCM0_MPCC_MCM_1DLUT_LUT_INDEX, MPCC_MCM_1DLUT_LUT_INDEX, mask_sh),\
+       SF(MPCC_MCM0_MPCC_MCM_1DLUT_LUT_DATA, MPCC_MCM_1DLUT_LUT_DATA, mask_sh),\
+       SF(MPCC_MCM0_MPCC_MCM_1DLUT_LUT_CONTROL, MPCC_MCM_1DLUT_LUT_WRITE_COLOR_MASK, mask_sh),\
+       SF(MPCC_MCM0_MPCC_MCM_1DLUT_LUT_CONTROL, MPCC_MCM_1DLUT_LUT_READ_COLOR_SEL, mask_sh),\
+       SF(MPCC_MCM0_MPCC_MCM_1DLUT_LUT_CONTROL, MPCC_MCM_1DLUT_LUT_HOST_SEL, mask_sh),\
+       SF(MPCC_MCM0_MPCC_MCM_1DLUT_LUT_CONTROL, MPCC_MCM_1DLUT_LUT_CONFIG_MODE, mask_sh),\
+       SF(MPCC_MCM0_MPCC_MCM_1DLUT_RAMA_START_CNTL_B, MPCC_MCM_1DLUT_RAMA_EXP_REGION_START_B, mask_sh),\
+       SF(MPCC_MCM0_MPCC_MCM_1DLUT_RAMA_START_CNTL_B, MPCC_MCM_1DLUT_RAMA_EXP_REGION_START_SEGMENT_B, mask_sh),\
+       SF(MPCC_MCM0_MPCC_MCM_1DLUT_RAMA_START_SLOPE_CNTL_B, MPCC_MCM_1DLUT_RAMA_EXP_REGION_START_SLOPE_B, mask_sh),\
+       SF(MPCC_MCM0_MPCC_MCM_1DLUT_RAMA_START_BASE_CNTL_B, MPCC_MCM_1DLUT_RAMA_EXP_REGION_START_BASE_B, mask_sh),\
+       SF(MPCC_MCM0_MPCC_MCM_1DLUT_RAMA_END_CNTL1_B, MPCC_MCM_1DLUT_RAMA_EXP_REGION_END_BASE_B, mask_sh),\
+       SF(MPCC_MCM0_MPCC_MCM_1DLUT_RAMA_END_CNTL2_B, MPCC_MCM_1DLUT_RAMA_EXP_REGION_END_B, mask_sh),\
+       SF(MPCC_MCM0_MPCC_MCM_1DLUT_RAMA_END_CNTL2_B, MPCC_MCM_1DLUT_RAMA_EXP_REGION_END_SLOPE_B, mask_sh),\
+       SF(MPCC_MCM0_MPCC_MCM_1DLUT_RAMA_OFFSET_B, MPCC_MCM_1DLUT_RAMA_OFFSET_B, mask_sh),\
+       SF(MPCC_MCM0_MPCC_MCM_1DLUT_RAMA_REGION_0_1, MPCC_MCM_1DLUT_RAMA_EXP_REGION0_LUT_OFFSET, mask_sh),\
+       SF(MPCC_MCM0_MPCC_MCM_1DLUT_RAMA_REGION_0_1, MPCC_MCM_1DLUT_RAMA_EXP_REGION0_NUM_SEGMENTS, mask_sh),\
+       SF(MPCC_MCM0_MPCC_MCM_1DLUT_RAMA_REGION_0_1, MPCC_MCM_1DLUT_RAMA_EXP_REGION1_LUT_OFFSET, mask_sh),\
+       SF(MPCC_MCM0_MPCC_MCM_1DLUT_RAMA_REGION_0_1, MPCC_MCM_1DLUT_RAMA_EXP_REGION1_NUM_SEGMENTS, mask_sh),\
+       SF(MPCC_MCM0_MPCC_MCM_MEM_PWR_CTRL, MPCC_MCM_SHAPER_MEM_PWR_FORCE, mask_sh),\
+       SF(MPCC_MCM0_MPCC_MCM_MEM_PWR_CTRL, MPCC_MCM_SHAPER_MEM_PWR_DIS, mask_sh),\
+       SF(MPCC_MCM0_MPCC_MCM_MEM_PWR_CTRL, MPCC_MCM_SHAPER_MEM_LOW_PWR_MODE, mask_sh),\
+       SF(MPCC_MCM0_MPCC_MCM_MEM_PWR_CTRL, MPCC_MCM_3DLUT_MEM_PWR_FORCE, mask_sh),\
+       SF(MPCC_MCM0_MPCC_MCM_MEM_PWR_CTRL, MPCC_MCM_3DLUT_MEM_PWR_DIS, mask_sh),\
+       SF(MPCC_MCM0_MPCC_MCM_MEM_PWR_CTRL, MPCC_MCM_3DLUT_MEM_LOW_PWR_MODE, mask_sh),\
+       SF(MPCC_MCM0_MPCC_MCM_MEM_PWR_CTRL, MPCC_MCM_1DLUT_MEM_PWR_FORCE, mask_sh),\
+       SF(MPCC_MCM0_MPCC_MCM_MEM_PWR_CTRL, MPCC_MCM_1DLUT_MEM_PWR_DIS, mask_sh),\
+       SF(MPCC_MCM0_MPCC_MCM_MEM_PWR_CTRL, MPCC_MCM_1DLUT_MEM_LOW_PWR_MODE, mask_sh),\
+       SF(MPCC_MCM0_MPCC_MCM_MEM_PWR_CTRL, MPCC_MCM_SHAPER_MEM_PWR_STATE, mask_sh),\
+       SF(MPCC_MCM0_MPCC_MCM_MEM_PWR_CTRL, MPCC_MCM_3DLUT_MEM_PWR_STATE, mask_sh),\
+       SF(MPCC_MCM0_MPCC_MCM_MEM_PWR_CTRL, MPCC_MCM_1DLUT_MEM_PWR_STATE, mask_sh),\
+       SF(CUR_VUPDATE_LOCK_SET0, CUR_VUPDATE_LOCK_SET, mask_sh)
+
+
+struct dcn32_mpc_registers {
+       MPC_REG_VARIABLE_LIST_DCN3_0;
+       MPC_REG_VARIABLE_LIST_DCN32;
+};
+void mpc32_mpc_init(struct mpc *mpc);
+bool mpc32_program_3dlut(
+               struct mpc *mpc,
+               const struct tetrahedral_params *params,
+               int mpcc_id);
+bool mpc32_program_post1dlut(
+               struct mpc *mpc,
+               const struct pwl_params *params,
+               uint32_t mpcc_id);
+bool mpc32_program_shaper(
+               struct mpc *mpc,
+               const struct pwl_params *params,
+               uint32_t mpcc_id);
+
+void dcn32_mpc_construct(struct dcn30_mpc *mpc30,
+       struct dc_context *ctx,
+       const struct dcn30_mpc_registers *mpc_regs,
+       const struct dcn30_mpc_shift *mpc_shift,
+       const struct dcn30_mpc_mask *mpc_mask,
+       int num_mpcc,
+       int num_rmu);
+
+void mpc32_power_on_blnd_lut(
+       struct mpc *mpc,
+       uint32_t mpcc_id,
+       bool power_on);
+void mpc32_program_post1dlut_pwl(
+               struct mpc *mpc,
+               uint32_t mpcc_id,
+               const struct pwl_result_data *rgb,
+               uint32_t num);
+void mpc32_program_post1dlutb_settings(
+               struct mpc *mpc,
+               uint32_t mpcc_id,
+               const struct pwl_params *params);
+void mpc32_program_post1dluta_settings(
+               struct mpc *mpc,
+               uint32_t mpcc_id,
+               const struct pwl_params *params);
+void mpc32_configure_post1dlut(
+               struct mpc *mpc,
+               uint32_t mpcc_id,
+               bool is_ram_a);
+void mpc32_program_shaper_lut(
+               struct mpc *mpc,
+               const struct pwl_result_data *rgb,
+               uint32_t num,
+               uint32_t mpcc_id);
+void mpc32_program_shaper_lutb_settings(
+               struct mpc *mpc,
+               const struct pwl_params *params,
+               uint32_t mpcc_id);
+void mpc32_program_shaper_luta_settings(
+               struct mpc *mpc,
+               const struct pwl_params *params,
+               uint32_t mpcc_id);
+void mpc32_configure_shaper_lut(
+               struct mpc *mpc,
+               bool is_ram_a,
+               uint32_t mpcc_id);
+void mpc32_power_on_shaper_3dlut(
+               struct mpc *mpc,
+               uint32_t mpcc_id,
+               bool power_on);
+void mpc32_set3dlut_ram10(
+               struct mpc *mpc,
+               const struct dc_rgb *lut,
+               uint32_t entries,
+               uint32_t mpcc_id);
+void mpc32_set3dlut_ram12(
+               struct mpc *mpc,
+               const struct dc_rgb *lut,
+               uint32_t entries,
+               uint32_t mpcc_id);
+void mpc32_select_3dlut_ram_mask(
+               struct mpc *mpc,
+               uint32_t ram_selection_mask,
+               uint32_t mpcc_id);
+void mpc32_select_3dlut_ram(
+               struct mpc *mpc,
+               enum dc_lut_mode mode,
+               bool is_color_channel_12bits,
+               uint32_t mpcc_id);
+#endif         //__DC_MPCC_DCN32_H__
diff --git a/drivers/gpu/drm/amd/display/dc/mpc/dcn401/dcn401_mpc.c b/drivers/gpu/drm/amd/display/dc/mpc/dcn401/dcn401_mpc.c
new file mode 100644 (file)
index 0000000..37ab5a4
--- /dev/null
@@ -0,0 +1,653 @@
+/*
+ * Copyright 2023 Advanced Micro Devices, Inc.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+ * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
+ * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+ * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+ * OTHER DEALINGS IN THE SOFTWARE.
+ *
+ * Authors: AMD
+ *
+ */
+
+#include "reg_helper.h"
+#include "dc.h"
+#include "dcn401_mpc.h"
+#include "dcn10/dcn10_cm_common.h"
+#include "basics/conversion.h"
+#include "mpc.h"
+
+#define REG(reg)\
+       mpc401->mpc_regs->reg
+
+#define CTX \
+       mpc401->base.ctx
+
+#undef FN
+#define FN(reg_name, field_name) \
+       mpc401->mpc_shift->field_name, mpc401->mpc_mask->field_name
+
+static void mpc401_update_3dlut_fast_load_select(struct mpc *mpc, int mpcc_id, int hubp_idx)
+{
+       struct dcn401_mpc *mpc401 = TO_DCN401_MPC(mpc);
+
+       REG_SET(MPCC_MCM_3DLUT_FAST_LOAD_SELECT[mpcc_id], 0, MPCC_MCM_3DLUT_FL_SEL, hubp_idx);
+}
+
+static void mpc401_get_3dlut_fast_load_status(struct mpc *mpc, int mpcc_id, uint32_t *done, uint32_t *soft_underflow, uint32_t *hard_underflow)
+{
+       struct dcn401_mpc *mpc401 = TO_DCN401_MPC(mpc);
+
+       REG_GET_3(MPCC_MCM_3DLUT_FAST_LOAD_STATUS[mpcc_id],
+                       MPCC_MCM_3DLUT_FL_DONE, done,
+                       MPCC_MCM_3DLUT_FL_SOFT_UNDERFLOW, soft_underflow,
+                       MPCC_MCM_3DLUT_FL_HARD_UNDERFLOW, hard_underflow);
+}
+
+void mpc401_set_movable_cm_location(struct mpc *mpc, enum mpcc_movable_cm_location location, int mpcc_id)
+{
+       struct dcn401_mpc *mpc401 = TO_DCN401_MPC(mpc);
+
+       switch (location) {
+       case MPCC_MOVABLE_CM_LOCATION_BEFORE:
+               REG_UPDATE(MPCC_MOVABLE_CM_LOCATION_CONTROL[mpcc_id],
+                               MPCC_MOVABLE_CM_LOCATION_CNTL, 0);
+               break;
+       case MPCC_MOVABLE_CM_LOCATION_AFTER:
+               REG_UPDATE(MPCC_MOVABLE_CM_LOCATION_CONTROL[mpcc_id],
+                               MPCC_MOVABLE_CM_LOCATION_CNTL, 1);
+               break;
+       }
+}
+
+static enum dc_lut_mode get3dlut_config(
+                       struct mpc *mpc,
+                       bool *is_17x17x17,
+                       bool *is_12bits_color_channel,
+                       int mpcc_id)
+{
+       uint32_t i_mode, i_enable_10bits, lut_size;
+       enum dc_lut_mode mode;
+       struct dcn401_mpc *mpc401 = TO_DCN401_MPC(mpc);
+
+       REG_GET(MPCC_MCM_3DLUT_MODE[mpcc_id],
+                       MPCC_MCM_3DLUT_MODE_CURRENT,  &i_mode);
+
+       REG_GET(MPCC_MCM_3DLUT_READ_WRITE_CONTROL[mpcc_id],
+                       MPCC_MCM_3DLUT_30BIT_EN, &i_enable_10bits);
+
+       switch (i_mode) {
+       case 0:
+               mode = LUT_BYPASS;
+               break;
+       case 1:
+               mode = LUT_RAM_A;
+               break;
+       case 2:
+               mode = LUT_RAM_B;
+               break;
+       default:
+               mode = LUT_BYPASS;
+               break;
+       }
+       if (i_enable_10bits > 0)
+               *is_12bits_color_channel = false;
+       else
+               *is_12bits_color_channel = true;
+
+       REG_GET(MPCC_MCM_3DLUT_MODE[mpcc_id], MPCC_MCM_3DLUT_SIZE, &lut_size);
+
+       if (lut_size == 0)
+               *is_17x17x17 = true;
+       else
+               *is_17x17x17 = false;
+
+       return mode;
+}
+
+void mpc401_populate_lut(struct mpc *mpc, const enum MCM_LUT_ID id, const union mcm_lut_params params, bool lut_bank_a, int mpcc_id)
+{
+       const enum dc_lut_mode next_mode = lut_bank_a ? LUT_RAM_A : LUT_RAM_B;
+       const struct pwl_params *lut1d = params.pwl;
+       const struct pwl_params *lut_shaper = params.pwl;
+       bool is_17x17x17;
+       bool is_12bits_color_channel;
+       const struct dc_rgb *lut0;
+       const struct dc_rgb *lut1;
+       const struct dc_rgb *lut2;
+       const struct dc_rgb *lut3;
+       int lut_size0;
+       int lut_size;
+       const struct tetrahedral_params *lut3d = params.lut3d;
+
+       switch (id) {
+       case MCM_LUT_1DLUT:
+               if (lut1d == NULL)
+                       return;
+
+               mpc32_power_on_blnd_lut(mpc, mpcc_id, true);
+               mpc32_configure_post1dlut(mpc, mpcc_id, next_mode == LUT_RAM_A);
+
+               if (next_mode == LUT_RAM_A)
+                       mpc32_program_post1dluta_settings(mpc, mpcc_id, lut1d);
+               else
+                       mpc32_program_post1dlutb_settings(mpc, mpcc_id, lut1d);
+
+               mpc32_program_post1dlut_pwl(
+                               mpc, mpcc_id, lut1d->rgb_resulted, lut1d->hw_points_num);
+
+               break;
+       case MCM_LUT_SHAPER:
+               if (lut_shaper == NULL)
+                       return;
+               if (mpc->ctx->dc->debug.enable_mem_low_power.bits.mpc)
+                       mpc32_power_on_shaper_3dlut(mpc, mpcc_id, true);
+
+               mpc32_configure_shaper_lut(mpc, next_mode == LUT_RAM_A, mpcc_id);
+
+               if (next_mode == LUT_RAM_A)
+                       mpc32_program_shaper_luta_settings(mpc, lut_shaper, mpcc_id);
+               else
+                       mpc32_program_shaper_lutb_settings(mpc, lut_shaper, mpcc_id);
+
+               mpc32_program_shaper_lut(
+                               mpc, lut_shaper->rgb_resulted, lut_shaper->hw_points_num, mpcc_id);
+
+               mpc32_power_on_shaper_3dlut(mpc, mpcc_id, false);
+               break;
+       case MCM_LUT_3DLUT:
+               if (lut3d == NULL)
+                       return;
+
+               mpc32_power_on_shaper_3dlut(mpc, mpcc_id, true);
+
+               get3dlut_config(mpc, &is_17x17x17, &is_12bits_color_channel, mpcc_id);
+
+               is_17x17x17 = !lut3d->use_tetrahedral_9;
+               is_12bits_color_channel = lut3d->use_12bits;
+               if (is_17x17x17) {
+                       lut0 = lut3d->tetrahedral_17.lut0;
+                       lut1 = lut3d->tetrahedral_17.lut1;
+                       lut2 = lut3d->tetrahedral_17.lut2;
+                       lut3 = lut3d->tetrahedral_17.lut3;
+                       lut_size0 = sizeof(lut3d->tetrahedral_17.lut0)/
+                                               sizeof(lut3d->tetrahedral_17.lut0[0]);
+                       lut_size  = sizeof(lut3d->tetrahedral_17.lut1)/
+                                               sizeof(lut3d->tetrahedral_17.lut1[0]);
+               } else {
+                       lut0 = lut3d->tetrahedral_9.lut0;
+                       lut1 = lut3d->tetrahedral_9.lut1;
+                       lut2 = lut3d->tetrahedral_9.lut2;
+                       lut3 = lut3d->tetrahedral_9.lut3;
+                       lut_size0 = sizeof(lut3d->tetrahedral_9.lut0)/
+                                       sizeof(lut3d->tetrahedral_9.lut0[0]);
+                       lut_size  = sizeof(lut3d->tetrahedral_9.lut1)/
+                                       sizeof(lut3d->tetrahedral_9.lut1[0]);
+                       }
+
+               mpc32_select_3dlut_ram(mpc, next_mode,
+                                       is_12bits_color_channel, mpcc_id);
+               mpc32_select_3dlut_ram_mask(mpc, 0x1, mpcc_id);
+               if (is_12bits_color_channel)
+                       mpc32_set3dlut_ram12(mpc, lut0, lut_size0, mpcc_id);
+               else
+                       mpc32_set3dlut_ram10(mpc, lut0, lut_size0, mpcc_id);
+
+               mpc32_select_3dlut_ram_mask(mpc, 0x2, mpcc_id);
+               if (is_12bits_color_channel)
+                       mpc32_set3dlut_ram12(mpc, lut1, lut_size, mpcc_id);
+               else
+                       mpc32_set3dlut_ram10(mpc, lut1, lut_size, mpcc_id);
+
+               mpc32_select_3dlut_ram_mask(mpc, 0x4, mpcc_id);
+               if (is_12bits_color_channel)
+                       mpc32_set3dlut_ram12(mpc, lut2, lut_size, mpcc_id);
+               else
+                       mpc32_set3dlut_ram10(mpc, lut2, lut_size, mpcc_id);
+
+               mpc32_select_3dlut_ram_mask(mpc, 0x8, mpcc_id);
+               if (is_12bits_color_channel)
+                       mpc32_set3dlut_ram12(mpc, lut3, lut_size, mpcc_id);
+               else
+                       mpc32_set3dlut_ram10(mpc, lut3, lut_size, mpcc_id);
+
+               if (mpc->ctx->dc->debug.enable_mem_low_power.bits.mpc)
+                       mpc32_power_on_shaper_3dlut(mpc, mpcc_id, false);
+
+               break;
+       }
+
+}
+
+void mpc401_program_lut_mode(
+               struct mpc *mpc,
+               const enum MCM_LUT_ID id,
+               const enum MCM_LUT_XABLE xable,
+               bool lut_bank_a,
+               int mpcc_id)
+{
+       struct dcn401_mpc *mpc401 = TO_DCN401_MPC(mpc);
+
+       switch (id) {
+       case MCM_LUT_3DLUT:
+               switch (xable) {
+               case MCM_LUT_DISABLE:
+                       REG_UPDATE(MPCC_MCM_3DLUT_MODE[mpcc_id], MPCC_MCM_3DLUT_MODE, 0);
+                       break;
+               case MCM_LUT_ENABLE:
+                       REG_UPDATE(MPCC_MCM_3DLUT_MODE[mpcc_id], MPCC_MCM_3DLUT_MODE, lut_bank_a ? 1 : 2);
+                       break;
+               }
+               break;
+       case MCM_LUT_SHAPER:
+               switch (xable) {
+               case MCM_LUT_DISABLE:
+                       REG_UPDATE(MPCC_MCM_SHAPER_CONTROL[mpcc_id], MPCC_MCM_SHAPER_LUT_MODE, 0);
+                       break;
+               case MCM_LUT_ENABLE:
+                       REG_UPDATE(MPCC_MCM_SHAPER_CONTROL[mpcc_id], MPCC_MCM_SHAPER_LUT_MODE, lut_bank_a ? 1 : 2);
+                       break;
+               }
+               break;
+       case MCM_LUT_1DLUT:
+               switch (xable) {
+               case MCM_LUT_DISABLE:
+                       REG_UPDATE(MPCC_MCM_1DLUT_CONTROL[mpcc_id],
+                                       MPCC_MCM_1DLUT_MODE, 0);
+                       break;
+               case MCM_LUT_ENABLE:
+                       REG_UPDATE(MPCC_MCM_1DLUT_CONTROL[mpcc_id],
+                                       MPCC_MCM_1DLUT_MODE, 2);
+                       break;
+               }
+               REG_UPDATE(MPCC_MCM_1DLUT_CONTROL[mpcc_id],
+                               MPCC_MCM_1DLUT_SELECT, lut_bank_a ? 0 : 1);
+               break;
+       }
+}
+
+void mpc401_program_lut_read_write_control(struct mpc *mpc, const enum MCM_LUT_ID id, bool lut_bank_a, int mpcc_id)
+{
+       struct dcn401_mpc *mpc401 = TO_DCN401_MPC(mpc);
+
+       switch (id) {
+       case MCM_LUT_3DLUT:
+               mpc32_select_3dlut_ram_mask(mpc, 0xf, mpcc_id);
+               REG_UPDATE(MPCC_MCM_3DLUT_READ_WRITE_CONTROL[mpcc_id], MPCC_MCM_3DLUT_RAM_SEL, lut_bank_a ? 0 : 1);
+               break;
+       case MCM_LUT_SHAPER:
+               mpc32_configure_shaper_lut(mpc, lut_bank_a, mpcc_id);
+               break;
+       case MCM_LUT_1DLUT:
+               mpc32_configure_post1dlut(mpc, lut_bank_a, mpcc_id);
+               break;
+       }
+}
+
+void mpc401_program_3dlut_size(struct mpc *mpc, bool is_17x17x17, int mpcc_id)
+{
+       struct dcn401_mpc *mpc401 = TO_DCN401_MPC(mpc);
+
+       REG_UPDATE(MPCC_MCM_3DLUT_MODE[mpcc_id], MPCC_MCM_3DLUT_SIZE, is_17x17x17 ? 0 : 1);
+}
+
+static void program_gamut_remap(
+       struct mpc *mpc,
+       unsigned int mpcc_id,
+       const uint16_t *regval,
+       enum mpcc_gamut_remap_id gamut_remap_block_id,
+       enum mpcc_gamut_remap_mode_select mode_select)
+{
+       struct color_matrices_reg gamut_regs;
+       struct dcn401_mpc *mpc401 = TO_DCN401_MPC(mpc);
+
+       switch (gamut_remap_block_id) {
+       case MPCC_OGAM_GAMUT_REMAP:
+
+               if (regval == NULL || mode_select == MPCC_GAMUT_REMAP_MODE_SELECT_0) {
+                       REG_SET(MPCC_GAMUT_REMAP_MODE[mpcc_id], 0,
+                               MPCC_GAMUT_REMAP_MODE, mode_select);
+                       return;
+               }
+
+               gamut_regs.shifts.csc_c11 = mpc401->mpc_shift->MPCC_GAMUT_REMAP_C11_A;
+               gamut_regs.masks.csc_c11 = mpc401->mpc_mask->MPCC_GAMUT_REMAP_C11_A;
+               gamut_regs.shifts.csc_c12 = mpc401->mpc_shift->MPCC_GAMUT_REMAP_C12_A;
+               gamut_regs.masks.csc_c12 = mpc401->mpc_mask->MPCC_GAMUT_REMAP_C12_A;
+
+               switch (mode_select) {
+               case MPCC_GAMUT_REMAP_MODE_SELECT_1:
+                       gamut_regs.csc_c11_c12 = REG(MPC_GAMUT_REMAP_C11_C12_A[mpcc_id]);
+                       gamut_regs.csc_c33_c34 = REG(MPC_GAMUT_REMAP_C33_C34_A[mpcc_id]);
+                       break;
+               case MPCC_GAMUT_REMAP_MODE_SELECT_2:
+                       gamut_regs.csc_c11_c12 = REG(MPC_GAMUT_REMAP_C11_C12_B[mpcc_id]);
+                       gamut_regs.csc_c33_c34 = REG(MPC_GAMUT_REMAP_C33_C34_B[mpcc_id]);
+                       break;
+               default:
+                       break;
+               }
+
+               cm_helper_program_color_matrices(
+                       mpc->ctx,
+                       regval,
+                       &gamut_regs);
+
+               //select coefficient set to use, set A (MODE_1) or set B (MODE_2)
+               REG_SET(MPCC_GAMUT_REMAP_MODE[mpcc_id], 0, MPCC_GAMUT_REMAP_MODE, mode_select);
+               break;
+
+       case MPCC_MCM_FIRST_GAMUT_REMAP:
+               if (regval == NULL || mode_select == MPCC_GAMUT_REMAP_MODE_SELECT_0) {
+                       REG_SET(MPCC_MCM_FIRST_GAMUT_REMAP_MODE[mpcc_id], 0,
+                               MPCC_MCM_FIRST_GAMUT_REMAP_MODE, mode_select);
+                       return;
+               }
+
+               gamut_regs.shifts.csc_c11 = mpc401->mpc_shift->MPCC_MCM_FIRST_GAMUT_REMAP_C11_A;
+               gamut_regs.masks.csc_c11 = mpc401->mpc_mask->MPCC_MCM_FIRST_GAMUT_REMAP_C11_A;
+               gamut_regs.shifts.csc_c12 = mpc401->mpc_shift->MPCC_MCM_FIRST_GAMUT_REMAP_C12_A;
+               gamut_regs.masks.csc_c12 = mpc401->mpc_mask->MPCC_MCM_FIRST_GAMUT_REMAP_C12_A;
+
+               switch (mode_select) {
+               case MPCC_GAMUT_REMAP_MODE_SELECT_1:
+                       gamut_regs.csc_c11_c12 = REG(MPC_MCM_FIRST_GAMUT_REMAP_C11_C12_A[mpcc_id]);
+                       gamut_regs.csc_c33_c34 = REG(MPC_MCM_FIRST_GAMUT_REMAP_C33_C34_A[mpcc_id]);
+                       break;
+               case MPCC_GAMUT_REMAP_MODE_SELECT_2:
+                       gamut_regs.csc_c11_c12 = REG(MPC_MCM_FIRST_GAMUT_REMAP_C11_C12_B[mpcc_id]);
+                       gamut_regs.csc_c33_c34 = REG(MPC_MCM_FIRST_GAMUT_REMAP_C33_C34_B[mpcc_id]);
+                       break;
+               default:
+                       break;
+               }
+
+               cm_helper_program_color_matrices(
+                       mpc->ctx,
+                       regval,
+                       &gamut_regs);
+
+               //select coefficient set to use, set A (MODE_1) or set B (MODE_2)
+               REG_SET(MPCC_MCM_FIRST_GAMUT_REMAP_MODE[mpcc_id], 0,
+                       MPCC_MCM_FIRST_GAMUT_REMAP_MODE, mode_select);
+               break;
+
+       case MPCC_MCM_SECOND_GAMUT_REMAP:
+               if (regval == NULL || mode_select == MPCC_GAMUT_REMAP_MODE_SELECT_0) {
+                       REG_SET(MPCC_MCM_SECOND_GAMUT_REMAP_MODE[mpcc_id], 0,
+                               MPCC_MCM_SECOND_GAMUT_REMAP_MODE, mode_select);
+                       return;
+               }
+
+               gamut_regs.shifts.csc_c11 = mpc401->mpc_shift->MPCC_MCM_SECOND_GAMUT_REMAP_C11_A;
+               gamut_regs.masks.csc_c11 = mpc401->mpc_mask->MPCC_MCM_SECOND_GAMUT_REMAP_C11_A;
+               gamut_regs.shifts.csc_c12 = mpc401->mpc_shift->MPCC_MCM_SECOND_GAMUT_REMAP_C12_A;
+               gamut_regs.masks.csc_c12 = mpc401->mpc_mask->MPCC_MCM_SECOND_GAMUT_REMAP_C12_A;
+
+               switch (mode_select) {
+               case MPCC_GAMUT_REMAP_MODE_SELECT_1:
+                       gamut_regs.csc_c11_c12 = REG(MPC_MCM_SECOND_GAMUT_REMAP_C11_C12_A[mpcc_id]);
+                       gamut_regs.csc_c33_c34 = REG(MPC_MCM_SECOND_GAMUT_REMAP_C33_C34_A[mpcc_id]);
+                       break;
+               case MPCC_GAMUT_REMAP_MODE_SELECT_2:
+                       gamut_regs.csc_c11_c12 = REG(MPC_MCM_SECOND_GAMUT_REMAP_C11_C12_B[mpcc_id]);
+                       gamut_regs.csc_c33_c34 = REG(MPC_MCM_SECOND_GAMUT_REMAP_C33_C34_B[mpcc_id]);
+                       break;
+               default:
+                       break;
+               }
+
+               cm_helper_program_color_matrices(
+                       mpc->ctx,
+                       regval,
+                       &gamut_regs);
+
+               //select coefficient set to use, set A (MODE_1) or set B (MODE_2)
+               REG_SET(MPCC_MCM_SECOND_GAMUT_REMAP_MODE[mpcc_id], 0,
+                       MPCC_MCM_SECOND_GAMUT_REMAP_MODE, mode_select);
+               break;
+
+       default:
+               break;
+       }
+}
+
+void mpc401_set_gamut_remap(
+       struct mpc *mpc,
+       int mpcc_id,
+       const struct mpc_grph_gamut_adjustment *adjust)
+{
+       struct dcn401_mpc *mpc401 = TO_DCN401_MPC(mpc);
+       unsigned int i = 0;
+       uint32_t mode_select = 0;
+
+       if (adjust->gamut_adjust_type != GRAPHICS_GAMUT_ADJUST_TYPE_SW) {
+               /* Bypass / Disable if type is bypass or hw */
+               program_gamut_remap(mpc, mpcc_id, NULL,
+                       adjust->mpcc_gamut_remap_block_id, MPCC_GAMUT_REMAP_MODE_SELECT_0);
+       } else {
+               struct fixed31_32 arr_matrix[12];
+               uint16_t arr_reg_val[12];
+
+               for (i = 0; i < 12; i++)
+                       arr_matrix[i] = adjust->temperature_matrix[i];
+
+               convert_float_matrix(arr_reg_val, arr_matrix, 12);
+
+               switch (adjust->mpcc_gamut_remap_block_id) {
+               case MPCC_OGAM_GAMUT_REMAP:
+                       REG_GET(MPCC_GAMUT_REMAP_MODE[mpcc_id],
+                               MPCC_GAMUT_REMAP_MODE_CURRENT, &mode_select);
+                       break;
+               case MPCC_MCM_FIRST_GAMUT_REMAP:
+                       REG_GET(MPCC_MCM_FIRST_GAMUT_REMAP_MODE[mpcc_id],
+                               MPCC_MCM_FIRST_GAMUT_REMAP_MODE_CURRENT, &mode_select);
+                       break;
+               case MPCC_MCM_SECOND_GAMUT_REMAP:
+                       REG_GET(MPCC_MCM_SECOND_GAMUT_REMAP_MODE[mpcc_id],
+                               MPCC_MCM_SECOND_GAMUT_REMAP_MODE_CURRENT, &mode_select);
+                       break;
+               default:
+                       break;
+               }
+
+               //If current set in use not set A (MODE_1), then use set A, otherwise use set B
+               if (mode_select != MPCC_GAMUT_REMAP_MODE_SELECT_1)
+                       mode_select = MPCC_GAMUT_REMAP_MODE_SELECT_1;
+               else
+                       mode_select = MPCC_GAMUT_REMAP_MODE_SELECT_2;
+
+               program_gamut_remap(mpc, mpcc_id, arr_reg_val,
+                       adjust->mpcc_gamut_remap_block_id, mode_select);
+       }
+}
+
+static void read_gamut_remap(struct mpc *mpc,
+       int mpcc_id,
+       uint16_t *regval,
+       enum mpcc_gamut_remap_id gamut_remap_block_id,
+       uint32_t *mode_select)
+{
+       struct color_matrices_reg gamut_regs = {0};
+       struct dcn401_mpc *mpc401 = TO_DCN401_MPC(mpc);
+
+       switch (gamut_remap_block_id) {
+       case MPCC_OGAM_GAMUT_REMAP:
+               //current coefficient set in use
+               REG_GET(MPCC_GAMUT_REMAP_MODE[mpcc_id], MPCC_GAMUT_REMAP_MODE_CURRENT, mode_select);
+
+               gamut_regs.shifts.csc_c11 = mpc401->mpc_shift->MPCC_GAMUT_REMAP_C11_A;
+               gamut_regs.masks.csc_c11 = mpc401->mpc_mask->MPCC_GAMUT_REMAP_C11_A;
+               gamut_regs.shifts.csc_c12 = mpc401->mpc_shift->MPCC_GAMUT_REMAP_C12_A;
+               gamut_regs.masks.csc_c12 = mpc401->mpc_mask->MPCC_GAMUT_REMAP_C12_A;
+
+               switch (*mode_select) {
+               case MPCC_GAMUT_REMAP_MODE_SELECT_1:
+                       gamut_regs.csc_c11_c12 = REG(MPC_GAMUT_REMAP_C11_C12_A[mpcc_id]);
+                       gamut_regs.csc_c33_c34 = REG(MPC_GAMUT_REMAP_C33_C34_A[mpcc_id]);
+                       break;
+               case MPCC_GAMUT_REMAP_MODE_SELECT_2:
+                       gamut_regs.csc_c11_c12 = REG(MPC_GAMUT_REMAP_C11_C12_B[mpcc_id]);
+                       gamut_regs.csc_c33_c34 = REG(MPC_GAMUT_REMAP_C33_C34_B[mpcc_id]);
+                       break;
+               default:
+                       break;
+               }
+               break;
+
+       case MPCC_MCM_FIRST_GAMUT_REMAP:
+               REG_GET(MPCC_MCM_FIRST_GAMUT_REMAP_MODE[mpcc_id],
+                               MPCC_MCM_FIRST_GAMUT_REMAP_MODE_CURRENT, mode_select);
+
+               gamut_regs.shifts.csc_c11 = mpc401->mpc_shift->MPCC_MCM_FIRST_GAMUT_REMAP_C11_A;
+               gamut_regs.masks.csc_c11 = mpc401->mpc_mask->MPCC_MCM_FIRST_GAMUT_REMAP_C11_A;
+               gamut_regs.shifts.csc_c12 = mpc401->mpc_shift->MPCC_MCM_FIRST_GAMUT_REMAP_C12_A;
+               gamut_regs.masks.csc_c12 = mpc401->mpc_mask->MPCC_MCM_FIRST_GAMUT_REMAP_C12_A;
+
+               switch (*mode_select) {
+               case MPCC_GAMUT_REMAP_MODE_SELECT_1:
+                       gamut_regs.csc_c11_c12 = REG(MPC_MCM_FIRST_GAMUT_REMAP_C11_C12_A[mpcc_id]);
+                       gamut_regs.csc_c33_c34 = REG(MPC_MCM_FIRST_GAMUT_REMAP_C33_C34_A[mpcc_id]);
+                       break;
+               case MPCC_GAMUT_REMAP_MODE_SELECT_2:
+                       gamut_regs.csc_c11_c12 = REG(MPC_MCM_FIRST_GAMUT_REMAP_C11_C12_B[mpcc_id]);
+                       gamut_regs.csc_c33_c34 = REG(MPC_MCM_FIRST_GAMUT_REMAP_C33_C34_B[mpcc_id]);
+                       break;
+               default:
+                       break;
+               }
+               break;
+
+       case MPCC_MCM_SECOND_GAMUT_REMAP:
+               REG_GET(MPCC_MCM_SECOND_GAMUT_REMAP_MODE[mpcc_id],
+                               MPCC_MCM_SECOND_GAMUT_REMAP_MODE_CURRENT, mode_select);
+
+               gamut_regs.shifts.csc_c11 = mpc401->mpc_shift->MPCC_MCM_SECOND_GAMUT_REMAP_C11_A;
+               gamut_regs.masks.csc_c11 = mpc401->mpc_mask->MPCC_MCM_SECOND_GAMUT_REMAP_C11_A;
+               gamut_regs.shifts.csc_c12 = mpc401->mpc_shift->MPCC_MCM_SECOND_GAMUT_REMAP_C12_A;
+               gamut_regs.masks.csc_c12 = mpc401->mpc_mask->MPCC_MCM_SECOND_GAMUT_REMAP_C12_A;
+
+               switch (*mode_select) {
+               case MPCC_GAMUT_REMAP_MODE_SELECT_1:
+                       gamut_regs.csc_c11_c12 = REG(MPC_MCM_SECOND_GAMUT_REMAP_C11_C12_A[mpcc_id]);
+                       gamut_regs.csc_c33_c34 = REG(MPC_MCM_SECOND_GAMUT_REMAP_C33_C34_A[mpcc_id]);
+                       break;
+               case MPCC_GAMUT_REMAP_MODE_SELECT_2:
+                       gamut_regs.csc_c11_c12 = REG(MPC_MCM_SECOND_GAMUT_REMAP_C11_C12_B[mpcc_id]);
+                       gamut_regs.csc_c33_c34 = REG(MPC_MCM_SECOND_GAMUT_REMAP_C33_C34_B[mpcc_id]);
+                       break;
+               default:
+                       break;
+               }
+               break;
+
+       default:
+               break;
+       }
+
+       if (*mode_select != MPCC_GAMUT_REMAP_MODE_SELECT_0) {
+               cm_helper_read_color_matrices(
+                       mpc401->base.ctx,
+                       regval,
+                       &gamut_regs);
+       }
+}
+
+void mpc401_get_gamut_remap(struct mpc *mpc,
+       int mpcc_id,
+       struct mpc_grph_gamut_adjustment *adjust)
+{
+       uint16_t arr_reg_val[12] = {0};
+       uint32_t mode_select;
+
+       read_gamut_remap(mpc, mpcc_id, arr_reg_val, adjust->mpcc_gamut_remap_block_id, &mode_select);
+
+       if (mode_select == MPCC_GAMUT_REMAP_MODE_SELECT_0) {
+               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 const struct mpc_funcs dcn401_mpc_funcs = {
+       .read_mpcc_state = mpc1_read_mpcc_state,
+       .insert_plane = mpc1_insert_plane,
+       .remove_mpcc = mpc1_remove_mpcc,
+       .mpc_init = mpc32_mpc_init,
+       .mpc_init_single_inst = mpc3_mpc_init_single_inst,
+       .update_blending = mpc2_update_blending,
+       .cursor_lock = mpc1_cursor_lock,
+       .get_mpcc_for_dpp = mpc1_get_mpcc_for_dpp,
+       .wait_for_idle = mpc2_assert_idle_mpcc,
+       .assert_mpcc_idle_before_connect = mpc2_assert_mpcc_idle_before_connect,
+       .init_mpcc_list_from_hw = mpc1_init_mpcc_list_from_hw,
+       .set_denorm =  mpc3_set_denorm,
+       .set_denorm_clamp = mpc3_set_denorm_clamp,
+       .set_output_csc = mpc3_set_output_csc,
+       .set_ocsc_default = mpc3_set_ocsc_default,
+       .set_output_gamma = mpc3_set_output_gamma,
+       .insert_plane_to_secondary = NULL,
+       .remove_mpcc_from_secondary =  NULL,
+       .set_dwb_mux = mpc3_set_dwb_mux,
+       .disable_dwb_mux = mpc3_disable_dwb_mux,
+       .is_dwb_idle = mpc3_is_dwb_idle,
+       .set_gamut_remap = mpc401_set_gamut_remap,
+       .program_shaper = mpc32_program_shaper,
+       .program_3dlut = mpc32_program_3dlut,
+       .program_1dlut = mpc32_program_post1dlut,
+       .acquire_rmu = NULL,
+       .release_rmu = NULL,
+       .power_on_mpc_mem_pwr = mpc3_power_on_ogam_lut,
+       .get_mpc_out_mux = mpc1_get_mpc_out_mux,
+       .set_bg_color = mpc1_set_bg_color,
+       .set_movable_cm_location = mpc401_set_movable_cm_location,
+       .update_3dlut_fast_load_select = mpc401_update_3dlut_fast_load_select,
+       .get_3dlut_fast_load_status = mpc401_get_3dlut_fast_load_status,
+       .populate_lut = mpc401_populate_lut,
+       .program_lut_read_write_control = mpc401_program_lut_read_write_control,
+       .program_lut_mode = mpc401_program_lut_mode,
+       .program_3dlut_size = mpc401_program_3dlut_size,
+};
+
+
+void dcn401_mpc_construct(struct dcn401_mpc *mpc401,
+       struct dc_context *ctx,
+       const struct dcn401_mpc_registers *mpc_regs,
+       const struct dcn401_mpc_shift *mpc_shift,
+       const struct dcn401_mpc_mask *mpc_mask,
+       int num_mpcc,
+       int num_rmu)
+{
+       int i;
+
+       mpc401->base.ctx = ctx;
+
+       mpc401->base.funcs = &dcn401_mpc_funcs;
+
+       mpc401->mpc_regs = mpc_regs;
+       mpc401->mpc_shift = mpc_shift;
+       mpc401->mpc_mask = mpc_mask;
+
+       mpc401->mpcc_in_use_mask = 0;
+       mpc401->num_mpcc = num_mpcc;
+       mpc401->num_rmu = num_rmu;
+
+       for (i = 0; i < MAX_MPCC; i++)
+               mpc3_init_mpcc(&mpc401->base.mpcc_array[i], i);
+}
diff --git a/drivers/gpu/drm/amd/display/dc/mpc/dcn401/dcn401_mpc.h b/drivers/gpu/drm/amd/display/dc/mpc/dcn401/dcn401_mpc.h
new file mode 100644 (file)
index 0000000..af44054
--- /dev/null
@@ -0,0 +1,239 @@
+/*
+ * Copyright 2023 Advanced Micro Devices, Inc.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+ * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
+ * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+ * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+ * OTHER DEALINGS IN THE SOFTWARE.
+ *
+ * Authors: AMD
+ *
+ */
+
+#ifndef __DC_MPCC_DCN401_H__
+#define __DC_MPCC_DCN401_H__
+#include "dcn30/dcn30_mpc.h"
+#include "dcn32/dcn32_mpc.h"
+
+#define TO_DCN401_MPC(mpc_base) \
+       container_of(mpc_base, struct dcn401_mpc, base)
+
+#define MPC_REG_VARIABLE_LIST_DCN4_01 \
+       MPC_REG_VARIABLE_LIST_DCN3_0; \
+       MPC_REG_VARIABLE_LIST_DCN32; \
+       uint32_t MPCC_MCM_FIRST_GAMUT_REMAP_COEF_FORMAT[MAX_MPCC]; \
+       uint32_t MPCC_MCM_FIRST_GAMUT_REMAP_MODE[MAX_MPCC]; \
+       uint32_t MPC_MCM_FIRST_GAMUT_REMAP_C11_C12_A[MAX_MPCC]; \
+       uint32_t MPC_MCM_FIRST_GAMUT_REMAP_C13_C14_A[MAX_MPCC]; \
+       uint32_t MPC_MCM_FIRST_GAMUT_REMAP_C21_C22_A[MAX_MPCC]; \
+       uint32_t MPC_MCM_FIRST_GAMUT_REMAP_C23_C24_A[MAX_MPCC]; \
+       uint32_t MPC_MCM_FIRST_GAMUT_REMAP_C31_C32_A[MAX_MPCC]; \
+       uint32_t MPC_MCM_FIRST_GAMUT_REMAP_C33_C34_A[MAX_MPCC]; \
+       uint32_t MPC_MCM_FIRST_GAMUT_REMAP_C11_C12_B[MAX_MPCC]; \
+       uint32_t MPC_MCM_FIRST_GAMUT_REMAP_C13_C14_B[MAX_MPCC]; \
+       uint32_t MPC_MCM_FIRST_GAMUT_REMAP_C21_C22_B[MAX_MPCC]; \
+       uint32_t MPC_MCM_FIRST_GAMUT_REMAP_C23_C24_B[MAX_MPCC]; \
+       uint32_t MPC_MCM_FIRST_GAMUT_REMAP_C31_C32_B[MAX_MPCC]; \
+       uint32_t MPC_MCM_FIRST_GAMUT_REMAP_C33_C34_B[MAX_MPCC]; \
+       uint32_t MPCC_MCM_SECOND_GAMUT_REMAP_COEF_FORMAT[MAX_MPCC]; \
+       uint32_t MPCC_MCM_SECOND_GAMUT_REMAP_MODE[MAX_MPCC]; \
+       uint32_t MPC_MCM_SECOND_GAMUT_REMAP_C11_C12_A[MAX_MPCC]; \
+       uint32_t MPC_MCM_SECOND_GAMUT_REMAP_C13_C14_A[MAX_MPCC]; \
+       uint32_t MPC_MCM_SECOND_GAMUT_REMAP_C21_C22_A[MAX_MPCC]; \
+       uint32_t MPC_MCM_SECOND_GAMUT_REMAP_C23_C24_A[MAX_MPCC]; \
+       uint32_t MPC_MCM_SECOND_GAMUT_REMAP_C31_C32_A[MAX_MPCC]; \
+       uint32_t MPC_MCM_SECOND_GAMUT_REMAP_C33_C34_A[MAX_MPCC]; \
+       uint32_t MPC_MCM_SECOND_GAMUT_REMAP_C11_C12_B[MAX_MPCC]; \
+       uint32_t MPC_MCM_SECOND_GAMUT_REMAP_C13_C14_B[MAX_MPCC]; \
+       uint32_t MPC_MCM_SECOND_GAMUT_REMAP_C21_C22_B[MAX_MPCC]; \
+       uint32_t MPC_MCM_SECOND_GAMUT_REMAP_C23_C24_B[MAX_MPCC]; \
+       uint32_t MPC_MCM_SECOND_GAMUT_REMAP_C31_C32_B[MAX_MPCC]; \
+       uint32_t MPC_MCM_SECOND_GAMUT_REMAP_C33_C34_B[MAX_MPCC]; \
+       uint32_t MPCC_MCM_3DLUT_FAST_LOAD_SELECT[MAX_MPCC]; \
+       uint32_t MPCC_MCM_3DLUT_FAST_LOAD_STATUS[MAX_MPCC]
+
+#define MPC_COMMON_MASK_SH_LIST_DCN4_01(mask_sh) \
+       MPC_COMMON_MASK_SH_LIST_DCN32(mask_sh), \
+       SF(MPCC_MCM0_MPCC_MCM_FIRST_GAMUT_REMAP_COEF_FORMAT, MPCC_MCM_FIRST_GAMUT_REMAP_COEF_FORMAT, mask_sh), \
+       SF(MPCC_MCM0_MPCC_MCM_FIRST_GAMUT_REMAP_MODE, MPCC_MCM_FIRST_GAMUT_REMAP_MODE, mask_sh), \
+       SF(MPCC_MCM0_MPCC_MCM_FIRST_GAMUT_REMAP_MODE, MPCC_MCM_FIRST_GAMUT_REMAP_MODE_CURRENT, mask_sh), \
+       SF(MPCC_MCM0_MPC_MCM_FIRST_GAMUT_REMAP_C11_C12_A, MPCC_MCM_FIRST_GAMUT_REMAP_C11_A, mask_sh), \
+       SF(MPCC_MCM0_MPC_MCM_FIRST_GAMUT_REMAP_C11_C12_A, MPCC_MCM_FIRST_GAMUT_REMAP_C12_A, mask_sh), \
+       SF(MPCC_MCM0_MPC_MCM_FIRST_GAMUT_REMAP_C13_C14_A, MPCC_MCM_FIRST_GAMUT_REMAP_C13_A, mask_sh), \
+       SF(MPCC_MCM0_MPC_MCM_FIRST_GAMUT_REMAP_C13_C14_A, MPCC_MCM_FIRST_GAMUT_REMAP_C14_A, mask_sh), \
+       SF(MPCC_MCM0_MPC_MCM_FIRST_GAMUT_REMAP_C21_C22_A, MPCC_MCM_FIRST_GAMUT_REMAP_C21_A, mask_sh), \
+       SF(MPCC_MCM0_MPC_MCM_FIRST_GAMUT_REMAP_C21_C22_A, MPCC_MCM_FIRST_GAMUT_REMAP_C22_A, mask_sh), \
+       SF(MPCC_MCM0_MPC_MCM_FIRST_GAMUT_REMAP_C23_C24_A, MPCC_MCM_FIRST_GAMUT_REMAP_C23_A, mask_sh), \
+       SF(MPCC_MCM0_MPC_MCM_FIRST_GAMUT_REMAP_C23_C24_A, MPCC_MCM_FIRST_GAMUT_REMAP_C24_A, mask_sh), \
+       SF(MPCC_MCM0_MPC_MCM_FIRST_GAMUT_REMAP_C31_C32_A, MPCC_MCM_FIRST_GAMUT_REMAP_C31_A, mask_sh), \
+       SF(MPCC_MCM0_MPC_MCM_FIRST_GAMUT_REMAP_C31_C32_A, MPCC_MCM_FIRST_GAMUT_REMAP_C32_A, mask_sh), \
+       SF(MPCC_MCM0_MPC_MCM_FIRST_GAMUT_REMAP_C33_C34_A, MPCC_MCM_FIRST_GAMUT_REMAP_C33_A, mask_sh), \
+       SF(MPCC_MCM0_MPC_MCM_FIRST_GAMUT_REMAP_C33_C34_A, MPCC_MCM_FIRST_GAMUT_REMAP_C34_A, mask_sh), \
+       SF(MPCC_MCM0_MPCC_MCM_SECOND_GAMUT_REMAP_COEF_FORMAT, MPCC_MCM_SECOND_GAMUT_REMAP_COEF_FORMAT, mask_sh), \
+       SF(MPCC_MCM0_MPCC_MCM_SECOND_GAMUT_REMAP_MODE, MPCC_MCM_SECOND_GAMUT_REMAP_MODE, mask_sh), \
+       SF(MPCC_MCM0_MPCC_MCM_SECOND_GAMUT_REMAP_MODE, MPCC_MCM_SECOND_GAMUT_REMAP_MODE_CURRENT, mask_sh), \
+       SF(MPCC_MCM0_MPC_MCM_SECOND_GAMUT_REMAP_C11_C12_A, MPCC_MCM_SECOND_GAMUT_REMAP_C11_A, mask_sh), \
+       SF(MPCC_MCM0_MPC_MCM_SECOND_GAMUT_REMAP_C11_C12_A, MPCC_MCM_SECOND_GAMUT_REMAP_C12_A, mask_sh), \
+       SF(MPCC_MCM0_MPC_MCM_SECOND_GAMUT_REMAP_C13_C14_A, MPCC_MCM_SECOND_GAMUT_REMAP_C13_A, mask_sh), \
+       SF(MPCC_MCM0_MPC_MCM_SECOND_GAMUT_REMAP_C13_C14_A, MPCC_MCM_SECOND_GAMUT_REMAP_C14_A, mask_sh), \
+       SF(MPCC_MCM0_MPC_MCM_SECOND_GAMUT_REMAP_C21_C22_A, MPCC_MCM_SECOND_GAMUT_REMAP_C21_A, mask_sh), \
+       SF(MPCC_MCM0_MPC_MCM_SECOND_GAMUT_REMAP_C21_C22_A, MPCC_MCM_SECOND_GAMUT_REMAP_C22_A, mask_sh), \
+       SF(MPCC_MCM0_MPC_MCM_SECOND_GAMUT_REMAP_C23_C24_A, MPCC_MCM_SECOND_GAMUT_REMAP_C23_A, mask_sh), \
+       SF(MPCC_MCM0_MPC_MCM_SECOND_GAMUT_REMAP_C23_C24_A, MPCC_MCM_SECOND_GAMUT_REMAP_C24_A, mask_sh), \
+       SF(MPCC_MCM0_MPC_MCM_SECOND_GAMUT_REMAP_C31_C32_A, MPCC_MCM_SECOND_GAMUT_REMAP_C31_A, mask_sh), \
+       SF(MPCC_MCM0_MPC_MCM_SECOND_GAMUT_REMAP_C31_C32_A, MPCC_MCM_SECOND_GAMUT_REMAP_C32_A, mask_sh), \
+       SF(MPCC_MCM0_MPC_MCM_SECOND_GAMUT_REMAP_C33_C34_A, MPCC_MCM_SECOND_GAMUT_REMAP_C33_A, mask_sh), \
+       SF(MPCC_MCM0_MPC_MCM_SECOND_GAMUT_REMAP_C33_C34_A, MPCC_MCM_SECOND_GAMUT_REMAP_C34_A, mask_sh), \
+       SF(MPCC_MCM0_MPCC_MCM_3DLUT_FAST_LOAD_SELECT, MPCC_MCM_3DLUT_FL_SEL, mask_sh), \
+       SF(MPCC_MCM0_MPCC_MCM_3DLUT_FAST_LOAD_STATUS, MPCC_MCM_3DLUT_FL_DONE, mask_sh), \
+       SF(MPCC_MCM0_MPCC_MCM_3DLUT_FAST_LOAD_STATUS, MPCC_MCM_3DLUT_FL_SOFT_UNDERFLOW, mask_sh), \
+       SF(MPCC_MCM0_MPCC_MCM_3DLUT_FAST_LOAD_STATUS, MPCC_MCM_3DLUT_FL_HARD_UNDERFLOW, mask_sh)
+
+
+#define MPC_REG_LIST_DCN4_01_RI(inst) \
+       MPC_REG_LIST_DCN3_2_RI(inst),\
+       SRII(MPCC_MCM_FIRST_GAMUT_REMAP_COEF_FORMAT, MPCC_MCM, inst),\
+       SRII(MPCC_MCM_FIRST_GAMUT_REMAP_MODE, MPCC_MCM, inst),\
+       SRII(MPC_MCM_FIRST_GAMUT_REMAP_C11_C12_A, MPCC_MCM, inst),\
+       SRII(MPC_MCM_FIRST_GAMUT_REMAP_C13_C14_A, MPCC_MCM, inst),\
+       SRII(MPC_MCM_FIRST_GAMUT_REMAP_C21_C22_A, MPCC_MCM, inst),\
+       SRII(MPC_MCM_FIRST_GAMUT_REMAP_C23_C24_A, MPCC_MCM, inst),\
+       SRII(MPC_MCM_FIRST_GAMUT_REMAP_C31_C32_A, MPCC_MCM, inst),\
+       SRII(MPC_MCM_FIRST_GAMUT_REMAP_C33_C34_A, MPCC_MCM, inst),\
+       SRII(MPC_MCM_FIRST_GAMUT_REMAP_C11_C12_B, MPCC_MCM, inst),\
+       SRII(MPC_MCM_FIRST_GAMUT_REMAP_C13_C14_B, MPCC_MCM, inst),\
+       SRII(MPC_MCM_FIRST_GAMUT_REMAP_C21_C22_B, MPCC_MCM, inst),\
+       SRII(MPC_MCM_FIRST_GAMUT_REMAP_C23_C24_B, MPCC_MCM, inst),\
+       SRII(MPC_MCM_FIRST_GAMUT_REMAP_C31_C32_B, MPCC_MCM, inst),\
+       SRII(MPC_MCM_FIRST_GAMUT_REMAP_C33_C34_B, MPCC_MCM, inst),\
+       SRII(MPCC_MCM_SECOND_GAMUT_REMAP_COEF_FORMAT, MPCC_MCM, inst), \
+       SRII(MPCC_MCM_SECOND_GAMUT_REMAP_MODE, MPCC_MCM, inst), \
+       SRII(MPC_MCM_SECOND_GAMUT_REMAP_C11_C12_A, MPCC_MCM, inst), \
+       SRII(MPC_MCM_SECOND_GAMUT_REMAP_C13_C14_A, MPCC_MCM, inst), \
+       SRII(MPC_MCM_SECOND_GAMUT_REMAP_C21_C22_A, MPCC_MCM, inst), \
+       SRII(MPC_MCM_SECOND_GAMUT_REMAP_C23_C24_A, MPCC_MCM, inst), \
+       SRII(MPC_MCM_SECOND_GAMUT_REMAP_C31_C32_A, MPCC_MCM, inst), \
+       SRII(MPC_MCM_SECOND_GAMUT_REMAP_C33_C34_A, MPCC_MCM, inst), \
+       SRII(MPC_MCM_SECOND_GAMUT_REMAP_C11_C12_B, MPCC_MCM, inst), \
+       SRII(MPC_MCM_SECOND_GAMUT_REMAP_C13_C14_B, MPCC_MCM, inst), \
+       SRII(MPC_MCM_SECOND_GAMUT_REMAP_C21_C22_B, MPCC_MCM, inst), \
+       SRII(MPC_MCM_SECOND_GAMUT_REMAP_C23_C24_B, MPCC_MCM, inst), \
+       SRII(MPC_MCM_SECOND_GAMUT_REMAP_C31_C32_B, MPCC_MCM, inst), \
+       SRII(MPC_MCM_SECOND_GAMUT_REMAP_C33_C34_B, MPCC_MCM, inst), \
+       SRII(MPCC_MCM_3DLUT_FAST_LOAD_STATUS, MPCC_MCM, inst),\
+       SRII(MPCC_MCM_3DLUT_FAST_LOAD_SELECT, MPCC_MCM, inst)
+
+#define MPC_REG_FIELD_LIST_DCN4_01(type)\
+       MPC_REG_FIELD_LIST_DCN3_0(type);\
+       MPC_REG_FIELD_LIST_DCN32(type);\
+       type MPCC_MCM_FIRST_GAMUT_REMAP_COEF_FORMAT;\
+       type MPCC_MCM_FIRST_GAMUT_REMAP_MODE;\
+       type MPCC_MCM_FIRST_GAMUT_REMAP_MODE_CURRENT;\
+       type MPCC_MCM_FIRST_GAMUT_REMAP_C11_A;\
+       type MPCC_MCM_FIRST_GAMUT_REMAP_C12_A;\
+       type MPCC_MCM_FIRST_GAMUT_REMAP_C13_A;\
+       type MPCC_MCM_FIRST_GAMUT_REMAP_C14_A;\
+       type MPCC_MCM_FIRST_GAMUT_REMAP_C21_A;\
+       type MPCC_MCM_FIRST_GAMUT_REMAP_C22_A;\
+       type MPCC_MCM_FIRST_GAMUT_REMAP_C23_A;\
+       type MPCC_MCM_FIRST_GAMUT_REMAP_C24_A;\
+       type MPCC_MCM_FIRST_GAMUT_REMAP_C31_A; \
+       type MPCC_MCM_FIRST_GAMUT_REMAP_C32_A; \
+       type MPCC_MCM_FIRST_GAMUT_REMAP_C33_A; \
+       type MPCC_MCM_FIRST_GAMUT_REMAP_C34_A; \
+       type MPCC_MCM_SECOND_GAMUT_REMAP_COEF_FORMAT;\
+       type MPCC_MCM_SECOND_GAMUT_REMAP_MODE;\
+       type MPCC_MCM_SECOND_GAMUT_REMAP_MODE_CURRENT;\
+       type MPCC_MCM_SECOND_GAMUT_REMAP_C11_A;\
+       type MPCC_MCM_SECOND_GAMUT_REMAP_C12_A;\
+       type MPCC_MCM_SECOND_GAMUT_REMAP_C13_A;\
+       type MPCC_MCM_SECOND_GAMUT_REMAP_C14_A;\
+       type MPCC_MCM_SECOND_GAMUT_REMAP_C21_A;\
+       type MPCC_MCM_SECOND_GAMUT_REMAP_C22_A;\
+       type MPCC_MCM_SECOND_GAMUT_REMAP_C23_A;\
+       type MPCC_MCM_SECOND_GAMUT_REMAP_C24_A;\
+       type MPCC_MCM_SECOND_GAMUT_REMAP_C31_A; \
+       type MPCC_MCM_SECOND_GAMUT_REMAP_C32_A; \
+       type MPCC_MCM_SECOND_GAMUT_REMAP_C33_A; \
+       type MPCC_MCM_SECOND_GAMUT_REMAP_C34_A; \
+       type MPCC_MCM_3DLUT_FL_SEL;\
+       type MPCC_MCM_3DLUT_FL_DONE;\
+       type MPCC_MCM_3DLUT_FL_SOFT_UNDERFLOW;\
+       type MPCC_MCM_3DLUT_FL_HARD_UNDERFLOW
+
+struct dcn401_mpc_shift {
+       MPC_REG_FIELD_LIST_DCN4_01(uint8_t);
+};
+
+struct dcn401_mpc_mask {
+       MPC_REG_FIELD_LIST_DCN4_01(uint32_t);
+};
+
+struct dcn401_mpc_registers {
+       MPC_REG_VARIABLE_LIST_DCN4_01;
+};
+
+struct dcn401_mpc {
+       struct mpc base;
+
+       int mpcc_in_use_mask;
+       int num_mpcc;
+       const struct dcn401_mpc_registers *mpc_regs;
+       const struct dcn401_mpc_shift *mpc_shift;
+       const struct dcn401_mpc_mask *mpc_mask;
+       int num_rmu;
+};
+void dcn401_mpc_construct(struct dcn401_mpc *mpc401,
+       struct dc_context *ctx,
+       const struct dcn401_mpc_registers *mpc_regs,
+       const struct dcn401_mpc_shift *mpc_shift,
+       const struct dcn401_mpc_mask *mpc_mask,
+       int num_mpcc,
+       int num_rmu);
+
+void mpc401_set_movable_cm_location(struct mpc *mpc, enum mpcc_movable_cm_location location, int mpcc_id);
+void mpc401_populate_lut(struct mpc *mpc, const enum MCM_LUT_ID id, const union mcm_lut_params params,
+               bool lut_bank_a, int mpcc_id);
+
+void mpc401_program_lut_mode(
+               struct mpc *mpc,
+               const enum MCM_LUT_ID id,
+               const enum MCM_LUT_XABLE xable,
+               bool lut_bank_a,
+               int mpcc_id);
+
+void mpc401_program_lut_read_write_control(
+               struct mpc *mpc,
+               const enum MCM_LUT_ID id,
+               bool lut_bank_a,
+               int mpcc_id);
+
+void mpc401_program_3dlut_size(
+               struct mpc *mpc,
+               bool is_17x17x17,
+               int mpcc_id);
+
+void mpc401_set_gamut_remap(
+       struct mpc *mpc,
+       int mpcc_id,
+       const struct mpc_grph_gamut_adjustment *adjust);
+
+void mpc401_get_gamut_remap(
+       struct mpc *mpc,
+       int mpcc_id,
+       struct mpc_grph_gamut_adjustment *adjust);
+
+#endif
diff --git a/drivers/gpu/drm/amd/display/dc/opp/Makefile b/drivers/gpu/drm/amd/display/dc/opp/Makefile
new file mode 100644 (file)
index 0000000..fbfb3c3
--- /dev/null
@@ -0,0 +1,35 @@
+#
+# Copyright 2020 Advanced Micro Devices, Inc.
+#
+# Permission is hereby granted, free of charge, to any person obtaining a
+# copy of this software and associated documentation files (the "Software"),
+# to deal in the Software without restriction, including without limitation
+# the rights to use, copy, modify, merge, publish, distribute, sublicense,
+# and/or sell copies of the Software, and to permit persons to whom the
+# Software is furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in
+# all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+# THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
+# OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+# ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+# OTHER DEALINGS IN THE SOFTWARE.
+#
+# Authors: AMD
+#
+#
+
+ifdef CONFIG_DRM_AMD_DC_FP
+###############################################################################
+# DCN35
+###############################################################################
+OPP_DCN35 = dcn35_opp.o
+
+AMD_DAL_OPP_DCN35 = $(addprefix $(AMDDALPATH)/dc/opp/dcn35/,$(OPP_DCN35))
+
+AMD_DISPLAY_FILES += $(AMD_DAL_OPP_DCN35)
+endif
diff --git a/drivers/gpu/drm/amd/display/dc/opp/dcn35/dcn35_opp.c b/drivers/gpu/drm/amd/display/dc/opp/dcn35/dcn35_opp.c
new file mode 100644 (file)
index 0000000..3542b51
--- /dev/null
@@ -0,0 +1,53 @@
+/* SPDX-License-Identifier: MIT */
+/*
+ * Copyright 2023 Advanced Micro Devices, Inc.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+ * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
+ * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+ * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+ * OTHER DEALINGS IN THE SOFTWARE.
+ *
+ * Authors: AMD
+ *
+ */
+
+#include "dcn35_opp.h"
+#include "reg_helper.h"
+
+#define REG(reg) ((const struct dcn35_opp_registers *)(oppn20->regs))->reg
+
+#undef FN
+#define FN(reg_name, field_name)                                           \
+       ((const struct dcn35_opp_shift *)(oppn20->opp_shift))->field_name, \
+               ((const struct dcn35_opp_mask *)(oppn20->opp_mask))->field_name
+
+#define CTX oppn20->base.ctx
+
+void dcn35_opp_construct(struct dcn20_opp *oppn20, struct dc_context *ctx,
+                        uint32_t inst, const struct dcn35_opp_registers *regs,
+                        const struct dcn35_opp_shift *opp_shift,
+                        const struct dcn35_opp_mask *opp_mask)
+{
+       dcn20_opp_construct(oppn20, ctx, inst,
+                           (const struct dcn20_opp_registers *)regs,
+                           (const struct dcn20_opp_shift *)opp_shift,
+                           (const struct dcn20_opp_mask *)opp_mask);
+}
+
+void dcn35_opp_set_fgcg(struct dcn20_opp *oppn20, bool enable)
+{
+       REG_UPDATE(OPP_TOP_CLK_CONTROL, OPP_FGCG_REP_DIS, !enable);
+}
diff --git a/drivers/gpu/drm/amd/display/dc/opp/dcn35/dcn35_opp.h b/drivers/gpu/drm/amd/display/dc/opp/dcn35/dcn35_opp.h
new file mode 100644 (file)
index 0000000..a9a4135
--- /dev/null
@@ -0,0 +1,67 @@
+/* SPDX-License-Identifier: MIT */
+/*
+ * Copyright 2023 Advanced Micro Devices, Inc.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+ * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
+ * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+ * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+ * OTHER DEALINGS IN THE SOFTWARE.
+ *
+ * Authors: AMD
+ *
+ */
+
+#ifndef __DCN35_OPP_H
+#define __DCN35_OPP_H
+
+#include "dcn20/dcn20_opp.h"
+
+#define OPP_REG_VARIABLE_LIST_DCN3_5  \
+       OPP_REG_VARIABLE_LIST_DCN2_0; \
+       uint32_t OPP_TOP_CLK_CONTROL
+
+#define OPP_MASK_SH_LIST_DCN35(mask_sh)  \
+       OPP_MASK_SH_LIST_DCN20(mask_sh), \
+               OPP_SF(OPP_TOP_CLK_CONTROL, OPP_FGCG_REP_DIS, mask_sh)
+
+#define OPP_DCN35_REG_FIELD_LIST(type)          \
+       struct {                                \
+               OPP_DCN20_REG_FIELD_LIST(type); \
+               type OPP_FGCG_REP_DIS;          \
+       }
+
+struct dcn35_opp_registers {
+       OPP_REG_VARIABLE_LIST_DCN3_5;
+};
+
+struct dcn35_opp_shift {
+       OPP_DCN35_REG_FIELD_LIST(uint8_t);
+};
+
+struct dcn35_opp_mask {
+       OPP_DCN35_REG_FIELD_LIST(uint32_t);
+};
+
+void dcn35_opp_construct(struct dcn20_opp *oppn20,
+       struct dc_context *ctx,
+       uint32_t inst,
+       const struct dcn35_opp_registers *regs,
+       const struct dcn35_opp_shift *opp_shift,
+       const struct dcn35_opp_mask *opp_mask);
+
+void dcn35_opp_set_fgcg(struct dcn20_opp *oppn20, bool enable);
+
+#endif
diff --git a/drivers/gpu/drm/amd/display/dc/pg/Makefile b/drivers/gpu/drm/amd/display/dc/pg/Makefile
new file mode 100644 (file)
index 0000000..ec11d31
--- /dev/null
@@ -0,0 +1,35 @@
+#
+# Copyright 2020 Advanced Micro Devices, Inc.
+#
+# Permission is hereby granted, free of charge, to any person obtaining a
+# copy of this software and associated documentation files (the "Software"),
+# to deal in the Software without restriction, including without limitation
+# the rights to use, copy, modify, merge, publish, distribute, sublicense,
+# and/or sell copies of the Software, and to permit persons to whom the
+# Software is furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in
+# all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+# THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
+# OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+# ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+# OTHER DEALINGS IN THE SOFTWARE.
+#
+# Authors: AMD
+#
+#
+
+ifdef CONFIG_DRM_AMD_DC_FP
+###############################################################################
+# DCN35
+###############################################################################
+PG_DCN35 = dcn35_pg_cntl.o
+
+AMD_DAL_PG_DCN35 = $(addprefix $(AMDDALPATH)/dc/pg/dcn35/,$(PG_DCN35))
+
+AMD_DISPLAY_FILES += $(AMD_DAL_PG_DCN35)
+endif
diff --git a/drivers/gpu/drm/amd/display/dc/pg/dcn35/dcn35_pg_cntl.c b/drivers/gpu/drm/amd/display/dc/pg/dcn35/dcn35_pg_cntl.c
new file mode 100644 (file)
index 0000000..af21c0a
--- /dev/null
@@ -0,0 +1,551 @@
+/* SPDX-License-Identifier: MIT */
+/*
+ * Copyright 2023 Advanced Micro Devices, Inc.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+ * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
+ * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+ * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+ * OTHER DEALINGS IN THE SOFTWARE.
+ *
+ * Authors: AMD
+ *
+ */
+
+#include "reg_helper.h"
+#include "core_types.h"
+#include "dcn35_pg_cntl.h"
+#include "dccg.h"
+
+#define TO_DCN_PG_CNTL(pg_cntl)\
+       container_of(pg_cntl, struct dcn_pg_cntl, base)
+
+#define REG(reg) \
+       (pg_cntl_dcn->regs->reg)
+
+#undef FN
+#define FN(reg_name, field_name) \
+       pg_cntl_dcn->pg_cntl_shift->field_name, pg_cntl_dcn->pg_cntl_mask->field_name
+
+#define CTX \
+       pg_cntl_dcn->base.ctx
+#define DC_LOGGER \
+       pg_cntl->ctx->logger
+
+static bool pg_cntl35_dsc_pg_status(struct pg_cntl *pg_cntl, unsigned int dsc_inst)
+{
+       struct dcn_pg_cntl *pg_cntl_dcn = TO_DCN_PG_CNTL(pg_cntl);
+       uint32_t pwr_status = 0;
+
+       if (pg_cntl->ctx->dc->debug.ignore_pg)
+               return true;
+
+       switch (dsc_inst) {
+       case 0: /* DSC0 */
+               REG_GET(DOMAIN16_PG_STATUS, DOMAIN_PGFSM_PWR_STATUS, &pwr_status);
+               break;
+       case 1: /* DSC1 */
+               REG_GET(DOMAIN17_PG_STATUS, DOMAIN_PGFSM_PWR_STATUS, &pwr_status);
+               break;
+       case 2: /* DSC2 */
+               REG_GET(DOMAIN18_PG_STATUS, DOMAIN_PGFSM_PWR_STATUS, &pwr_status);
+               break;
+       case 3: /* DSC3 */
+               REG_GET(DOMAIN19_PG_STATUS, DOMAIN_PGFSM_PWR_STATUS, &pwr_status);
+               break;
+       default:
+               BREAK_TO_DEBUGGER();
+               break;
+       }
+
+       return pwr_status == 0;
+}
+
+void pg_cntl35_dsc_pg_control(struct pg_cntl *pg_cntl, unsigned int dsc_inst, bool power_on)
+{
+       struct dcn_pg_cntl *pg_cntl_dcn = TO_DCN_PG_CNTL(pg_cntl);
+       uint32_t power_gate = power_on ? 0 : 1;
+       uint32_t pwr_status = power_on ? 0 : 2;
+       uint32_t org_ip_request_cntl = 0;
+       bool block_enabled;
+
+       /*need to enable dscclk regardless DSC_PG*/
+       if (pg_cntl->ctx->dc->res_pool->dccg->funcs->enable_dsc && power_on)
+               pg_cntl->ctx->dc->res_pool->dccg->funcs->enable_dsc(
+                               pg_cntl->ctx->dc->res_pool->dccg, dsc_inst);
+
+       if (pg_cntl->ctx->dc->debug.ignore_pg ||
+               pg_cntl->ctx->dc->debug.disable_dsc_power_gate ||
+               pg_cntl->ctx->dc->idle_optimizations_allowed)
+               return;
+
+       block_enabled = pg_cntl35_dsc_pg_status(pg_cntl, dsc_inst);
+       if (power_on) {
+               if (block_enabled)
+                       return;
+       } else {
+               if (!block_enabled)
+                       return;
+       }
+
+       REG_GET(DC_IP_REQUEST_CNTL, IP_REQUEST_EN, &org_ip_request_cntl);
+       if (org_ip_request_cntl == 0)
+               REG_SET(DC_IP_REQUEST_CNTL, 0, IP_REQUEST_EN, 1);
+
+       switch (dsc_inst) {
+       case 0: /* DSC0 */
+               REG_UPDATE(DOMAIN16_PG_CONFIG,
+                               DOMAIN_POWER_GATE, power_gate);
+
+               REG_WAIT(DOMAIN16_PG_STATUS,
+                               DOMAIN_PGFSM_PWR_STATUS, pwr_status,
+                               1, 1000);
+               break;
+       case 1: /* DSC1 */
+               REG_UPDATE(DOMAIN17_PG_CONFIG,
+                               DOMAIN_POWER_GATE, power_gate);
+
+               REG_WAIT(DOMAIN17_PG_STATUS,
+                               DOMAIN_PGFSM_PWR_STATUS, pwr_status,
+                               1, 1000);
+               break;
+       case 2: /* DSC2 */
+               REG_UPDATE(DOMAIN18_PG_CONFIG,
+                               DOMAIN_POWER_GATE, power_gate);
+
+               REG_WAIT(DOMAIN18_PG_STATUS,
+                               DOMAIN_PGFSM_PWR_STATUS, pwr_status,
+                               1, 1000);
+               break;
+       case 3: /* DSC3 */
+               REG_UPDATE(DOMAIN19_PG_CONFIG,
+                               DOMAIN_POWER_GATE, power_gate);
+
+               REG_WAIT(DOMAIN19_PG_STATUS,
+                               DOMAIN_PGFSM_PWR_STATUS, pwr_status,
+                               1, 1000);
+               break;
+       default:
+               BREAK_TO_DEBUGGER();
+               break;
+       }
+
+       if (dsc_inst < MAX_PIPES)
+               pg_cntl->pg_pipe_res_enable[PG_DSC][dsc_inst] = power_on;
+
+       if (pg_cntl->ctx->dc->res_pool->dccg->funcs->disable_dsc && !power_on) {
+               /*this is to disable dscclk*/
+               pg_cntl->ctx->dc->res_pool->dccg->funcs->disable_dsc(
+                       pg_cntl->ctx->dc->res_pool->dccg, dsc_inst);
+       }
+}
+
+static bool pg_cntl35_hubp_dpp_pg_status(struct pg_cntl *pg_cntl, unsigned int hubp_dpp_inst)
+{
+       struct dcn_pg_cntl *pg_cntl_dcn = TO_DCN_PG_CNTL(pg_cntl);
+       uint32_t pwr_status = 0;
+
+       switch (hubp_dpp_inst) {
+       case 0:
+               /* DPP0 & HUBP0 */
+               REG_GET(DOMAIN0_PG_STATUS, DOMAIN_PGFSM_PWR_STATUS, &pwr_status);
+               break;
+       case 1:
+               /* DPP1 & HUBP1 */
+               REG_GET(DOMAIN1_PG_STATUS, DOMAIN_PGFSM_PWR_STATUS, &pwr_status);
+               break;
+       case 2:
+               /* DPP2 & HUBP2 */
+               REG_GET(DOMAIN2_PG_STATUS, DOMAIN_PGFSM_PWR_STATUS, &pwr_status);
+               break;
+       case 3:
+               /* DPP3 & HUBP3 */
+               REG_GET(DOMAIN3_PG_STATUS, DOMAIN_PGFSM_PWR_STATUS, &pwr_status);
+               break;
+       default:
+               BREAK_TO_DEBUGGER();
+               break;
+       }
+
+       return pwr_status == 0;
+}
+
+void pg_cntl35_hubp_dpp_pg_control(struct pg_cntl *pg_cntl, unsigned int hubp_dpp_inst, bool power_on)
+{
+       struct dcn_pg_cntl *pg_cntl_dcn = TO_DCN_PG_CNTL(pg_cntl);
+       uint32_t power_gate = power_on ? 0 : 1;
+       uint32_t pwr_status = power_on ? 0 : 2;
+       uint32_t org_ip_request_cntl;
+       bool block_enabled;
+
+       if (pg_cntl->ctx->dc->debug.ignore_pg ||
+               pg_cntl->ctx->dc->debug.disable_hubp_power_gate ||
+               pg_cntl->ctx->dc->debug.disable_dpp_power_gate ||
+               pg_cntl->ctx->dc->idle_optimizations_allowed)
+               return;
+
+       block_enabled = pg_cntl35_hubp_dpp_pg_status(pg_cntl, hubp_dpp_inst);
+       if (power_on) {
+               if (block_enabled)
+                       return;
+       } else {
+               if (!block_enabled)
+                       return;
+       }
+
+       REG_GET(DC_IP_REQUEST_CNTL, IP_REQUEST_EN, &org_ip_request_cntl);
+       if (org_ip_request_cntl == 0)
+               REG_SET(DC_IP_REQUEST_CNTL, 0, IP_REQUEST_EN, 1);
+
+       switch (hubp_dpp_inst) {
+       case 0:
+               /* DPP0 & HUBP0 */
+               REG_UPDATE(DOMAIN0_PG_CONFIG, DOMAIN_POWER_GATE, power_gate);
+               REG_WAIT(DOMAIN0_PG_STATUS, DOMAIN_PGFSM_PWR_STATUS, pwr_status, 1, 1000);
+               break;
+       case 1:
+               /* DPP1 & HUBP1 */
+               REG_UPDATE(DOMAIN1_PG_CONFIG, DOMAIN_POWER_GATE, power_gate);
+               REG_WAIT(DOMAIN1_PG_STATUS, DOMAIN_PGFSM_PWR_STATUS, pwr_status, 1, 1000);
+               break;
+       case 2:
+               /* DPP2 & HUBP2 */
+               REG_UPDATE(DOMAIN2_PG_CONFIG, DOMAIN_POWER_GATE, power_gate);
+               REG_WAIT(DOMAIN2_PG_STATUS, DOMAIN_PGFSM_PWR_STATUS, pwr_status, 1, 1000);
+               break;
+       case 3:
+               /* DPP3 & HUBP3 */
+               REG_UPDATE(DOMAIN3_PG_CONFIG, DOMAIN_POWER_GATE, power_gate);
+               REG_WAIT(DOMAIN3_PG_STATUS, DOMAIN_PGFSM_PWR_STATUS, pwr_status, 1, 1000);
+               break;
+       default:
+               BREAK_TO_DEBUGGER();
+               break;
+       }
+
+       DC_LOG_DEBUG("HUBP DPP instance %d, power %s", hubp_dpp_inst,
+               power_on ? "ON" : "OFF");
+
+       if (hubp_dpp_inst < MAX_PIPES) {
+               pg_cntl->pg_pipe_res_enable[PG_HUBP][hubp_dpp_inst] = power_on;
+               pg_cntl->pg_pipe_res_enable[PG_DPP][hubp_dpp_inst] = power_on;
+       }
+}
+
+static bool pg_cntl35_hpo_pg_status(struct pg_cntl *pg_cntl)
+{
+       struct dcn_pg_cntl *pg_cntl_dcn = TO_DCN_PG_CNTL(pg_cntl);
+       uint32_t pwr_status = 0;
+
+       REG_GET(DOMAIN25_PG_STATUS,
+                       DOMAIN_PGFSM_PWR_STATUS, &pwr_status);
+
+       return pwr_status == 0;
+}
+
+void pg_cntl35_hpo_pg_control(struct pg_cntl *pg_cntl, bool power_on)
+{
+       struct dcn_pg_cntl *pg_cntl_dcn = TO_DCN_PG_CNTL(pg_cntl);
+       uint32_t power_gate = power_on ? 0 : 1;
+       uint32_t pwr_status = power_on ? 0 : 2;
+       uint32_t org_ip_request_cntl;
+       uint32_t power_forceon;
+       bool block_enabled;
+
+       if (pg_cntl->ctx->dc->debug.ignore_pg ||
+               pg_cntl->ctx->dc->debug.disable_hpo_power_gate ||
+               pg_cntl->ctx->dc->idle_optimizations_allowed)
+               return;
+
+       block_enabled = pg_cntl35_hpo_pg_status(pg_cntl);
+       if (power_on) {
+               if (block_enabled)
+                       return;
+       } else {
+               if (!block_enabled)
+                       return;
+       }
+
+       REG_GET(DOMAIN25_PG_CONFIG, DOMAIN_POWER_FORCEON, &power_forceon);
+       if (power_forceon)
+               return;
+
+       REG_GET(DC_IP_REQUEST_CNTL, IP_REQUEST_EN, &org_ip_request_cntl);
+       if (org_ip_request_cntl == 0)
+               REG_SET(DC_IP_REQUEST_CNTL, 0, IP_REQUEST_EN, 1);
+
+       REG_UPDATE(DOMAIN25_PG_CONFIG, DOMAIN_POWER_GATE, power_gate);
+       REG_WAIT(DOMAIN25_PG_STATUS, DOMAIN_PGFSM_PWR_STATUS, pwr_status, 1, 1000);
+
+       pg_cntl->pg_res_enable[PG_HPO] = power_on;
+}
+
+static bool pg_cntl35_io_clk_status(struct pg_cntl *pg_cntl)
+{
+       struct dcn_pg_cntl *pg_cntl_dcn = TO_DCN_PG_CNTL(pg_cntl);
+       uint32_t pwr_status = 0;
+
+       REG_GET(DOMAIN22_PG_STATUS,
+               DOMAIN_PGFSM_PWR_STATUS, &pwr_status);
+
+       return pwr_status == 0;
+}
+
+void pg_cntl35_io_clk_pg_control(struct pg_cntl *pg_cntl, bool power_on)
+{
+       struct dcn_pg_cntl *pg_cntl_dcn = TO_DCN_PG_CNTL(pg_cntl);
+       uint32_t power_gate = power_on ? 0 : 1;
+       uint32_t pwr_status = power_on ? 0 : 2;
+       uint32_t org_ip_request_cntl;
+       uint32_t power_forceon;
+       bool block_enabled;
+
+       if (pg_cntl->ctx->dc->debug.ignore_pg ||
+               pg_cntl->ctx->dc->idle_optimizations_allowed)
+               return;
+
+       block_enabled = pg_cntl35_io_clk_status(pg_cntl);
+       if (power_on) {
+               if (block_enabled)
+                       return;
+       } else {
+               if (!block_enabled)
+                       return;
+       }
+
+       REG_GET(DOMAIN22_PG_CONFIG, DOMAIN_POWER_FORCEON, &power_forceon);
+       if (power_forceon)
+               return;
+
+       REG_GET(DC_IP_REQUEST_CNTL, IP_REQUEST_EN, &org_ip_request_cntl);
+       if (org_ip_request_cntl == 0)
+               REG_SET(DC_IP_REQUEST_CNTL, 0, IP_REQUEST_EN, 1);
+
+       /* DCCG, DIO, DCIO */
+       REG_UPDATE(DOMAIN22_PG_CONFIG, DOMAIN_POWER_GATE, power_gate);
+       REG_WAIT(DOMAIN22_PG_STATUS, DOMAIN_PGFSM_PWR_STATUS, pwr_status, 1, 1000);
+
+       pg_cntl->pg_res_enable[PG_DCCG] = power_on;
+       pg_cntl->pg_res_enable[PG_DIO] = power_on;
+       pg_cntl->pg_res_enable[PG_DCIO] = power_on;
+}
+
+static bool pg_cntl35_plane_otg_status(struct pg_cntl *pg_cntl)
+{
+       struct dcn_pg_cntl *pg_cntl_dcn = TO_DCN_PG_CNTL(pg_cntl);
+       uint32_t pwr_status = 0;
+
+       REG_GET(DOMAIN24_PG_STATUS,
+               DOMAIN_PGFSM_PWR_STATUS, &pwr_status);
+
+       return pwr_status == 0;
+}
+
+void pg_cntl35_mpcc_pg_control(struct pg_cntl *pg_cntl,
+       unsigned int mpcc_inst, bool power_on)
+{
+       if (pg_cntl->ctx->dc->idle_optimizations_allowed)
+               return;
+
+       if (mpcc_inst < MAX_PIPES)
+               pg_cntl->pg_pipe_res_enable[PG_MPCC][mpcc_inst] = power_on;
+}
+
+void pg_cntl35_opp_pg_control(struct pg_cntl *pg_cntl,
+       unsigned int opp_inst, bool power_on)
+{
+       if (pg_cntl->ctx->dc->idle_optimizations_allowed)
+               return;
+
+       if (opp_inst < MAX_PIPES)
+               pg_cntl->pg_pipe_res_enable[PG_OPP][opp_inst] = power_on;
+}
+
+void pg_cntl35_optc_pg_control(struct pg_cntl *pg_cntl,
+       unsigned int optc_inst, bool power_on)
+{
+       if (pg_cntl->ctx->dc->idle_optimizations_allowed)
+               return;
+
+       if (optc_inst < MAX_PIPES)
+               pg_cntl->pg_pipe_res_enable[PG_OPTC][optc_inst] = power_on;
+}
+
+void pg_cntl35_plane_otg_pg_control(struct pg_cntl *pg_cntl, bool power_on)
+{
+       struct dcn_pg_cntl *pg_cntl_dcn = TO_DCN_PG_CNTL(pg_cntl);
+       uint32_t power_gate = power_on ? 0 : 1;
+       uint32_t pwr_status = power_on ? 0 : 2;
+       uint32_t org_ip_request_cntl;
+       int i;
+       bool block_enabled;
+       bool all_mpcc_disabled = true, all_opp_disabled = true;
+       bool all_optc_disabled = true, all_stream_disabled = true;
+
+       if (pg_cntl->ctx->dc->debug.ignore_pg ||
+               pg_cntl->ctx->dc->debug.disable_optc_power_gate ||
+               pg_cntl->ctx->dc->idle_optimizations_allowed)
+               return;
+
+       block_enabled = pg_cntl35_plane_otg_status(pg_cntl);
+       if (power_on) {
+               if (block_enabled)
+                       return;
+       } else {
+               if (!block_enabled)
+                       return;
+       }
+
+       for (i = 0; i < pg_cntl->ctx->dc->res_pool->pipe_count; i++) {
+               struct pipe_ctx *pipe_ctx = &pg_cntl->ctx->dc->current_state->res_ctx.pipe_ctx[i];
+
+               if (pipe_ctx) {
+                       if (pipe_ctx->stream)
+                               all_stream_disabled = false;
+               }
+
+               if (pg_cntl->pg_pipe_res_enable[PG_MPCC][i])
+                       all_mpcc_disabled = false;
+
+               if (pg_cntl->pg_pipe_res_enable[PG_OPP][i])
+                       all_opp_disabled = false;
+
+               if (pg_cntl->pg_pipe_res_enable[PG_OPTC][i])
+                       all_optc_disabled = false;
+       }
+
+       if (!power_on) {
+               if (!all_mpcc_disabled || !all_opp_disabled || !all_optc_disabled
+                       || !all_stream_disabled || pg_cntl->pg_res_enable[PG_DWB])
+                       return;
+       }
+
+       REG_GET(DC_IP_REQUEST_CNTL, IP_REQUEST_EN, &org_ip_request_cntl);
+       if (org_ip_request_cntl == 0)
+               REG_SET(DC_IP_REQUEST_CNTL, 0, IP_REQUEST_EN, 1);
+
+       /* MPC, OPP, OPTC, DWB */
+       REG_UPDATE(DOMAIN24_PG_CONFIG, DOMAIN_POWER_GATE, power_gate);
+       REG_WAIT(DOMAIN24_PG_STATUS, DOMAIN_PGFSM_PWR_STATUS, pwr_status, 1, 1000);
+
+       for (i = 0; i < pg_cntl->ctx->dc->res_pool->pipe_count; i++) {
+               pg_cntl->pg_pipe_res_enable[PG_MPCC][i] = power_on;
+               pg_cntl->pg_pipe_res_enable[PG_OPP][i] = power_on;
+               pg_cntl->pg_pipe_res_enable[PG_OPTC][i] = power_on;
+       }
+       pg_cntl->pg_res_enable[PG_DWB] = power_on;
+}
+
+void pg_cntl35_dwb_pg_control(struct pg_cntl *pg_cntl, bool power_on)
+{
+       if (pg_cntl->ctx->dc->idle_optimizations_allowed)
+               return;
+
+       pg_cntl->pg_res_enable[PG_DWB] = power_on;
+}
+
+static bool pg_cntl35_mem_status(struct pg_cntl *pg_cntl)
+{
+       struct dcn_pg_cntl *pg_cntl_dcn = TO_DCN_PG_CNTL(pg_cntl);
+       uint32_t pwr_status = 0;
+
+       REG_GET(DOMAIN23_PG_STATUS,
+               DOMAIN_PGFSM_PWR_STATUS, &pwr_status);
+
+       return pwr_status == 0;
+}
+
+void pg_cntl35_init_pg_status(struct pg_cntl *pg_cntl)
+{
+       int i = 0;
+       bool block_enabled;
+
+       pg_cntl->pg_res_enable[PG_HPO] = pg_cntl35_hpo_pg_status(pg_cntl);
+
+       block_enabled = pg_cntl35_io_clk_status(pg_cntl);
+       pg_cntl->pg_res_enable[PG_DCCG] = block_enabled;
+       pg_cntl->pg_res_enable[PG_DIO] = block_enabled;
+       pg_cntl->pg_res_enable[PG_DCIO] = block_enabled;
+
+       block_enabled = pg_cntl35_mem_status(pg_cntl);
+       pg_cntl->pg_res_enable[PG_DCHUBBUB] = block_enabled;
+       pg_cntl->pg_res_enable[PG_DCHVM] = block_enabled;
+
+       for (i = 0; i < pg_cntl->ctx->dc->res_pool->pipe_count; i++) {
+               block_enabled = pg_cntl35_hubp_dpp_pg_status(pg_cntl, i);
+               pg_cntl->pg_pipe_res_enable[PG_HUBP][i] = block_enabled;
+               pg_cntl->pg_pipe_res_enable[PG_DPP][i] = block_enabled;
+
+               block_enabled = pg_cntl35_dsc_pg_status(pg_cntl, i);
+               pg_cntl->pg_pipe_res_enable[PG_DSC][i] = block_enabled;
+       }
+
+       block_enabled = pg_cntl35_plane_otg_status(pg_cntl);
+       for (i = 0; i < pg_cntl->ctx->dc->res_pool->pipe_count; i++) {
+               pg_cntl->pg_pipe_res_enable[PG_MPCC][i] = block_enabled;
+               pg_cntl->pg_pipe_res_enable[PG_OPP][i] = block_enabled;
+               pg_cntl->pg_pipe_res_enable[PG_OPTC][i] = block_enabled;
+       }
+       pg_cntl->pg_res_enable[PG_DWB] = block_enabled;
+}
+
+static const struct pg_cntl_funcs pg_cntl35_funcs = {
+       .init_pg_status = pg_cntl35_init_pg_status,
+       .dsc_pg_control = pg_cntl35_dsc_pg_control,
+       .hubp_dpp_pg_control = pg_cntl35_hubp_dpp_pg_control,
+       .hpo_pg_control = pg_cntl35_hpo_pg_control,
+       .io_clk_pg_control = pg_cntl35_io_clk_pg_control,
+       .plane_otg_pg_control = pg_cntl35_plane_otg_pg_control,
+       .mpcc_pg_control = pg_cntl35_mpcc_pg_control,
+       .opp_pg_control = pg_cntl35_opp_pg_control,
+       .optc_pg_control = pg_cntl35_optc_pg_control,
+       .dwb_pg_control = pg_cntl35_dwb_pg_control
+};
+
+struct pg_cntl *pg_cntl35_create(
+       struct dc_context *ctx,
+       const struct pg_cntl_registers *regs,
+       const struct pg_cntl_shift *pg_cntl_shift,
+       const struct pg_cntl_mask *pg_cntl_mask)
+{
+       struct dcn_pg_cntl *pg_cntl_dcn = kzalloc(sizeof(*pg_cntl_dcn), GFP_KERNEL);
+       struct pg_cntl *base;
+
+       if (pg_cntl_dcn == NULL) {
+               BREAK_TO_DEBUGGER();
+               return NULL;
+       }
+
+       base = &pg_cntl_dcn->base;
+       base->ctx = ctx;
+       base->funcs = &pg_cntl35_funcs;
+
+       pg_cntl_dcn->regs = regs;
+       pg_cntl_dcn->pg_cntl_shift = pg_cntl_shift;
+       pg_cntl_dcn->pg_cntl_mask = pg_cntl_mask;
+
+       memset(base->pg_pipe_res_enable, 0, PG_HW_PIPE_RESOURCES_NUM_ELEMENT * MAX_PIPES * sizeof(bool));
+       memset(base->pg_res_enable, 0, PG_HW_RESOURCES_NUM_ELEMENT * sizeof(bool));
+
+       return &pg_cntl_dcn->base;
+}
+
+void dcn_pg_cntl_destroy(struct pg_cntl **pg_cntl)
+{
+       struct dcn_pg_cntl *pg_cntl_dcn = TO_DCN_PG_CNTL(*pg_cntl);
+
+       kfree(pg_cntl_dcn);
+       *pg_cntl = NULL;
+}
diff --git a/drivers/gpu/drm/amd/display/dc/pg/dcn35/dcn35_pg_cntl.h b/drivers/gpu/drm/amd/display/dc/pg/dcn35/dcn35_pg_cntl.h
new file mode 100644 (file)
index 0000000..3de2408
--- /dev/null
@@ -0,0 +1,195 @@
+/* SPDX-License-Identifier: MIT */
+/*
+ * Copyright 2023 Advanced Micro Devices, Inc.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+ * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
+ * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+ * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+ * OTHER DEALINGS IN THE SOFTWARE.
+ *
+ * Authors: AMD
+ *
+ */
+
+#ifndef _DCN35_PG_CNTL_H_
+#define _DCN35_PG_CNTL_H_
+
+#include "pg_cntl.h"
+
+#define PG_CNTL_REG_LIST_DCN35()\
+       SR(DOMAIN0_PG_CONFIG), \
+       SR(DOMAIN1_PG_CONFIG), \
+       SR(DOMAIN2_PG_CONFIG), \
+       SR(DOMAIN3_PG_CONFIG), \
+       SR(DOMAIN16_PG_CONFIG), \
+       SR(DOMAIN17_PG_CONFIG), \
+       SR(DOMAIN18_PG_CONFIG), \
+       SR(DOMAIN19_PG_CONFIG), \
+       SR(DOMAIN22_PG_CONFIG), \
+       SR(DOMAIN23_PG_CONFIG), \
+       SR(DOMAIN24_PG_CONFIG), \
+       SR(DOMAIN25_PG_CONFIG), \
+       SR(DOMAIN0_PG_STATUS), \
+       SR(DOMAIN1_PG_STATUS), \
+       SR(DOMAIN2_PG_STATUS), \
+       SR(DOMAIN3_PG_STATUS), \
+       SR(DOMAIN16_PG_STATUS), \
+       SR(DOMAIN17_PG_STATUS), \
+       SR(DOMAIN18_PG_STATUS), \
+       SR(DOMAIN19_PG_STATUS), \
+       SR(DOMAIN22_PG_STATUS), \
+       SR(DOMAIN23_PG_STATUS), \
+       SR(DOMAIN24_PG_STATUS), \
+       SR(DOMAIN25_PG_STATUS), \
+       SR(DC_IP_REQUEST_CNTL)
+
+#define PG_CNTL_SF(reg_name, field_name, post_fix)\
+       .field_name = reg_name ## __ ## field_name ## post_fix
+
+#define PG_CNTL_MASK_SH_LIST_DCN35(mask_sh) \
+       PG_CNTL_SF(DOMAIN0_PG_CONFIG, DOMAIN_POWER_FORCEON, mask_sh), \
+       PG_CNTL_SF(DOMAIN0_PG_CONFIG, DOMAIN_POWER_GATE, mask_sh), \
+       PG_CNTL_SF(DOMAIN1_PG_CONFIG, DOMAIN_POWER_FORCEON, mask_sh), \
+       PG_CNTL_SF(DOMAIN1_PG_CONFIG, DOMAIN_POWER_GATE, mask_sh), \
+       PG_CNTL_SF(DOMAIN2_PG_CONFIG, DOMAIN_POWER_FORCEON, mask_sh), \
+       PG_CNTL_SF(DOMAIN2_PG_CONFIG, DOMAIN_POWER_GATE, mask_sh), \
+       PG_CNTL_SF(DOMAIN3_PG_CONFIG, DOMAIN_POWER_FORCEON, mask_sh), \
+       PG_CNTL_SF(DOMAIN3_PG_CONFIG, DOMAIN_POWER_GATE, mask_sh), \
+       PG_CNTL_SF(DOMAIN16_PG_CONFIG, DOMAIN_POWER_FORCEON, mask_sh), \
+       PG_CNTL_SF(DOMAIN16_PG_CONFIG, DOMAIN_POWER_GATE, mask_sh), \
+       PG_CNTL_SF(DOMAIN17_PG_CONFIG, DOMAIN_POWER_FORCEON, mask_sh), \
+       PG_CNTL_SF(DOMAIN17_PG_CONFIG, DOMAIN_POWER_GATE, mask_sh), \
+       PG_CNTL_SF(DOMAIN18_PG_CONFIG, DOMAIN_POWER_FORCEON, mask_sh), \
+       PG_CNTL_SF(DOMAIN18_PG_CONFIG, DOMAIN_POWER_GATE, mask_sh), \
+       PG_CNTL_SF(DOMAIN19_PG_CONFIG, DOMAIN_POWER_FORCEON, mask_sh), \
+       PG_CNTL_SF(DOMAIN19_PG_CONFIG, DOMAIN_POWER_GATE, mask_sh), \
+       PG_CNTL_SF(DOMAIN22_PG_CONFIG, DOMAIN_POWER_FORCEON, mask_sh), \
+       PG_CNTL_SF(DOMAIN22_PG_CONFIG, DOMAIN_POWER_GATE, mask_sh), \
+       PG_CNTL_SF(DOMAIN23_PG_CONFIG, DOMAIN_POWER_FORCEON, mask_sh), \
+       PG_CNTL_SF(DOMAIN23_PG_CONFIG, DOMAIN_POWER_GATE, mask_sh), \
+       PG_CNTL_SF(DOMAIN24_PG_CONFIG, DOMAIN_POWER_FORCEON, mask_sh), \
+       PG_CNTL_SF(DOMAIN24_PG_CONFIG, DOMAIN_POWER_GATE, mask_sh), \
+       PG_CNTL_SF(DOMAIN25_PG_CONFIG, DOMAIN_POWER_FORCEON, mask_sh), \
+       PG_CNTL_SF(DOMAIN25_PG_CONFIG, DOMAIN_POWER_GATE, mask_sh), \
+       PG_CNTL_SF(DOMAIN0_PG_STATUS, DOMAIN_DESIRED_PWR_STATE, mask_sh), \
+       PG_CNTL_SF(DOMAIN0_PG_STATUS, DOMAIN_PGFSM_PWR_STATUS, mask_sh), \
+       PG_CNTL_SF(DOMAIN1_PG_STATUS, DOMAIN_DESIRED_PWR_STATE, mask_sh), \
+       PG_CNTL_SF(DOMAIN1_PG_STATUS, DOMAIN_PGFSM_PWR_STATUS, mask_sh), \
+       PG_CNTL_SF(DOMAIN2_PG_STATUS, DOMAIN_DESIRED_PWR_STATE, mask_sh), \
+       PG_CNTL_SF(DOMAIN2_PG_STATUS, DOMAIN_PGFSM_PWR_STATUS, mask_sh), \
+       PG_CNTL_SF(DOMAIN3_PG_STATUS, DOMAIN_DESIRED_PWR_STATE, mask_sh), \
+       PG_CNTL_SF(DOMAIN3_PG_STATUS, DOMAIN_PGFSM_PWR_STATUS, mask_sh), \
+       PG_CNTL_SF(DOMAIN16_PG_STATUS, DOMAIN_DESIRED_PWR_STATE, mask_sh), \
+       PG_CNTL_SF(DOMAIN16_PG_STATUS, DOMAIN_PGFSM_PWR_STATUS, mask_sh), \
+       PG_CNTL_SF(DOMAIN17_PG_STATUS, DOMAIN_DESIRED_PWR_STATE, mask_sh), \
+       PG_CNTL_SF(DOMAIN17_PG_STATUS, DOMAIN_PGFSM_PWR_STATUS, mask_sh), \
+       PG_CNTL_SF(DOMAIN18_PG_STATUS, DOMAIN_DESIRED_PWR_STATE, mask_sh), \
+       PG_CNTL_SF(DOMAIN18_PG_STATUS, DOMAIN_PGFSM_PWR_STATUS, mask_sh), \
+       PG_CNTL_SF(DOMAIN19_PG_STATUS, DOMAIN_DESIRED_PWR_STATE, mask_sh), \
+       PG_CNTL_SF(DOMAIN19_PG_STATUS, DOMAIN_PGFSM_PWR_STATUS, mask_sh), \
+       PG_CNTL_SF(DOMAIN22_PG_STATUS, DOMAIN_DESIRED_PWR_STATE, mask_sh), \
+       PG_CNTL_SF(DOMAIN22_PG_STATUS, DOMAIN_PGFSM_PWR_STATUS, mask_sh), \
+       PG_CNTL_SF(DOMAIN23_PG_STATUS, DOMAIN_DESIRED_PWR_STATE, mask_sh), \
+       PG_CNTL_SF(DOMAIN23_PG_STATUS, DOMAIN_PGFSM_PWR_STATUS, mask_sh), \
+       PG_CNTL_SF(DOMAIN24_PG_STATUS, DOMAIN_DESIRED_PWR_STATE, mask_sh), \
+       PG_CNTL_SF(DOMAIN24_PG_STATUS, DOMAIN_PGFSM_PWR_STATUS, mask_sh), \
+       PG_CNTL_SF(DOMAIN25_PG_STATUS, DOMAIN_DESIRED_PWR_STATE, mask_sh), \
+       PG_CNTL_SF(DOMAIN25_PG_STATUS, DOMAIN_PGFSM_PWR_STATUS, mask_sh), \
+       PG_CNTL_SF(DC_IP_REQUEST_CNTL, IP_REQUEST_EN, mask_sh)
+
+#define PG_CNTL_REG_FIELD_LIST(type) \
+       type IPS2;\
+       type IPS1;\
+       type IPS0;\
+       type IPS0_All
+
+#define PG_CNTL_DCN35_REG_FIELD_LIST(type) \
+       type IP_REQUEST_EN; \
+       type DOMAIN_POWER_FORCEON; \
+       type DOMAIN_POWER_GATE; \
+       type DOMAIN_DESIRED_PWR_STATE; \
+       type DOMAIN_PGFSM_PWR_STATUS
+
+struct pg_cntl_shift {
+       PG_CNTL_REG_FIELD_LIST(uint8_t);
+       PG_CNTL_DCN35_REG_FIELD_LIST(uint8_t);
+};
+
+struct pg_cntl_mask {
+       PG_CNTL_REG_FIELD_LIST(uint32_t);
+       PG_CNTL_DCN35_REG_FIELD_LIST(uint32_t);
+};
+
+struct pg_cntl_registers {
+       uint32_t LONO_STATE;
+       uint32_t DC_IP_REQUEST_CNTL;
+       uint32_t DOMAIN0_PG_CONFIG;
+       uint32_t DOMAIN1_PG_CONFIG;
+       uint32_t DOMAIN2_PG_CONFIG;
+       uint32_t DOMAIN3_PG_CONFIG;
+       uint32_t DOMAIN16_PG_CONFIG;
+       uint32_t DOMAIN17_PG_CONFIG;
+       uint32_t DOMAIN18_PG_CONFIG;
+       uint32_t DOMAIN19_PG_CONFIG;
+       uint32_t DOMAIN22_PG_CONFIG;
+       uint32_t DOMAIN23_PG_CONFIG;
+       uint32_t DOMAIN24_PG_CONFIG;
+       uint32_t DOMAIN25_PG_CONFIG;
+       uint32_t DOMAIN0_PG_STATUS;
+       uint32_t DOMAIN1_PG_STATUS;
+       uint32_t DOMAIN2_PG_STATUS;
+       uint32_t DOMAIN3_PG_STATUS;
+       uint32_t DOMAIN16_PG_STATUS;
+       uint32_t DOMAIN17_PG_STATUS;
+       uint32_t DOMAIN18_PG_STATUS;
+       uint32_t DOMAIN19_PG_STATUS;
+       uint32_t DOMAIN22_PG_STATUS;
+       uint32_t DOMAIN23_PG_STATUS;
+       uint32_t DOMAIN24_PG_STATUS;
+       uint32_t DOMAIN25_PG_STATUS;
+};
+
+struct dcn_pg_cntl {
+       struct pg_cntl base;
+       const struct pg_cntl_registers *regs;
+       const struct pg_cntl_shift *pg_cntl_shift;
+       const struct pg_cntl_mask *pg_cntl_mask;
+};
+
+void pg_cntl35_dsc_pg_control(struct pg_cntl *pg_cntl, unsigned int dsc_inst, bool power_on);
+void pg_cntl35_hubp_dpp_pg_control(struct pg_cntl *pg_cntl,
+       unsigned int hubp_dpp_inst, bool power_on);
+void pg_cntl35_hpo_pg_control(struct pg_cntl *pg_cntl, bool power_on);
+void pg_cntl35_io_clk_pg_control(struct pg_cntl *pg_cntl, bool power_on);
+void pg_cntl35_plane_otg_pg_control(struct pg_cntl *pg_cntl, bool power_on);
+void pg_cntl35_mpcc_pg_control(struct pg_cntl *pg_cntl,
+       unsigned int mpcc_inst, bool power_on);
+void pg_cntl35_opp_pg_control(struct pg_cntl *pg_cntl,
+       unsigned int opp_inst, bool power_on);
+void pg_cntl35_optc_pg_control(struct pg_cntl *pg_cntl,
+       unsigned int optc_inst, bool power_on);
+void pg_cntl35_dwb_pg_control(struct pg_cntl *pg_cntl, bool power_on);
+void pg_cntl35_init_pg_status(struct pg_cntl *pg_cntl);
+
+struct pg_cntl *pg_cntl35_create(
+       struct dc_context *ctx,
+       const struct pg_cntl_registers *regs,
+       const struct pg_cntl_shift *pg_cntl_shift,
+       const struct pg_cntl_mask *pg_cntl_mask);
+
+void dcn_pg_cntl_destroy(struct pg_cntl **pg_cntl);
+
+#endif /* DCN35_PG_CNTL */
index abc2405..4860bb2 100644 (file)
@@ -166,7 +166,7 @@ AMD_DISPLAY_FILES += $(AMD_DAL_RESOURCE_DCN316)
 
 ###############################################################################
 
-RESOURCE_DCN32 = dcn32_resource.o
+RESOURCE_DCN32 = dcn32_resource.o dcn32_resource_helpers.o
 
 AMD_DAL_RESOURCE_DCN32 = $(addprefix $(AMDDALPATH)/dc/resource/dcn32/,$(RESOURCE_DCN32))
 
diff --git a/drivers/gpu/drm/amd/display/dc/resource/dcn32/dcn32_resource_helpers.c b/drivers/gpu/drm/amd/display/dc/resource/dcn32/dcn32_resource_helpers.c
new file mode 100644 (file)
index 0000000..d184105
--- /dev/null
@@ -0,0 +1,780 @@
+/*
+ * Copyright 2022 Advanced Micro Devices, Inc.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+ * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
+ * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+ * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+ * OTHER DEALINGS IN THE SOFTWARE.
+ *
+ * Authors: AMD
+ *
+ */
+
+// header file of functions being implemented
+#include "dcn32/dcn32_resource.h"
+#include "dcn20/dcn20_resource.h"
+#include "dml/dcn32/display_mode_vba_util_32.h"
+#include "dml/dcn32/dcn32_fpu.h"
+#include "dc_state_priv.h"
+#include "dc_stream_priv.h"
+
+static bool is_dual_plane(enum surface_pixel_format format)
+{
+       return format >= SURFACE_PIXEL_FORMAT_VIDEO_BEGIN || format == SURFACE_PIXEL_FORMAT_GRPH_RGBE_ALPHA;
+}
+
+uint32_t dcn32_helper_calculate_mall_bytes_for_cursor(
+               struct dc *dc,
+               struct pipe_ctx *pipe_ctx,
+               bool ignore_cursor_buf)
+{
+       struct hubp *hubp = pipe_ctx->plane_res.hubp;
+       uint32_t cursor_size = hubp->curs_attr.pitch * hubp->curs_attr.height;
+       uint32_t cursor_mall_size_bytes = 0;
+
+       switch (pipe_ctx->stream->cursor_attributes.color_format) {
+       case CURSOR_MODE_MONO:
+               cursor_size /= 2;
+               break;
+       case CURSOR_MODE_COLOR_1BIT_AND:
+       case CURSOR_MODE_COLOR_PRE_MULTIPLIED_ALPHA:
+       case CURSOR_MODE_COLOR_UN_PRE_MULTIPLIED_ALPHA:
+               cursor_size *= 4;
+               break;
+
+       case CURSOR_MODE_COLOR_64BIT_FP_PRE_MULTIPLIED:
+       case CURSOR_MODE_COLOR_64BIT_FP_UN_PRE_MULTIPLIED:
+               cursor_size *= 8;
+               break;
+       }
+
+       /* only count if cursor is enabled, and if additional allocation needed outside of the
+        * DCN cursor buffer
+        */
+       if (pipe_ctx->stream->cursor_position.enable && (ignore_cursor_buf ||
+                       cursor_size > 16384)) {
+               /* cursor_num_mblk = CEILING(num_cursors*cursor_width*cursor_width*cursor_Bpe/mblk_bytes, 1)
+                * Note: add 1 mblk in case of cursor misalignment
+                */
+               cursor_mall_size_bytes = ((cursor_size + DCN3_2_MALL_MBLK_SIZE_BYTES - 1) /
+                               DCN3_2_MALL_MBLK_SIZE_BYTES + 1) * DCN3_2_MALL_MBLK_SIZE_BYTES;
+       }
+
+       return cursor_mall_size_bytes;
+}
+
+/**
+ * dcn32_helper_calculate_num_ways_for_subvp(): Calculate number of ways needed for SubVP
+ *
+ * Gets total allocation required for the phantom viewport calculated by DML in bytes and
+ * converts to number of cache ways.
+ *
+ * @dc: current dc state
+ * @context: new dc state
+ *
+ * Return: number of ways required for SubVP
+ */
+uint32_t dcn32_helper_calculate_num_ways_for_subvp(
+               struct dc *dc,
+               struct dc_state *context)
+{
+       if (context->bw_ctx.bw.dcn.mall_subvp_size_bytes > 0) {
+               if (dc->debug.force_subvp_num_ways) {
+                       return dc->debug.force_subvp_num_ways;
+               } else if (dc->res_pool->funcs->calculate_mall_ways_from_bytes) {
+                       return dc->res_pool->funcs->calculate_mall_ways_from_bytes(dc, context->bw_ctx.bw.dcn.mall_subvp_size_bytes);
+               } else {
+                       return 0;
+               }
+       } else {
+               return 0;
+       }
+}
+
+void dcn32_merge_pipes_for_subvp(struct dc *dc,
+               struct dc_state *context)
+{
+       uint32_t i;
+
+       /* merge pipes if necessary */
+       for (i = 0; i < dc->res_pool->pipe_count; i++) {
+               struct pipe_ctx *pipe = &context->res_ctx.pipe_ctx[i];
+
+               // For now merge all pipes for SubVP since pipe split case isn't supported yet
+
+               /* if ODM merge we ignore mpc tree, mpo pipes will have their own flags */
+               if (pipe->prev_odm_pipe) {
+                       /*split off odm pipe*/
+                       pipe->prev_odm_pipe->next_odm_pipe = pipe->next_odm_pipe;
+                       if (pipe->next_odm_pipe)
+                               pipe->next_odm_pipe->prev_odm_pipe = pipe->prev_odm_pipe;
+
+                       pipe->bottom_pipe = NULL;
+                       pipe->next_odm_pipe = NULL;
+                       pipe->plane_state = NULL;
+                       pipe->stream = NULL;
+                       pipe->top_pipe = NULL;
+                       pipe->prev_odm_pipe = NULL;
+                       if (pipe->stream_res.dsc)
+                               dcn20_release_dsc(&context->res_ctx, dc->res_pool, &pipe->stream_res.dsc);
+                       memset(&pipe->plane_res, 0, sizeof(pipe->plane_res));
+                       memset(&pipe->stream_res, 0, sizeof(pipe->stream_res));
+               } else if (pipe->top_pipe && pipe->top_pipe->plane_state == pipe->plane_state) {
+                       struct pipe_ctx *top_pipe = pipe->top_pipe;
+                       struct pipe_ctx *bottom_pipe = pipe->bottom_pipe;
+
+                       top_pipe->bottom_pipe = bottom_pipe;
+                       if (bottom_pipe)
+                               bottom_pipe->top_pipe = top_pipe;
+
+                       pipe->top_pipe = NULL;
+                       pipe->bottom_pipe = NULL;
+                       pipe->plane_state = NULL;
+                       pipe->stream = NULL;
+                       memset(&pipe->plane_res, 0, sizeof(pipe->plane_res));
+                       memset(&pipe->stream_res, 0, sizeof(pipe->stream_res));
+               }
+       }
+}
+
+bool dcn32_all_pipes_have_stream_and_plane(struct dc *dc,
+               struct dc_state *context)
+{
+       uint32_t i;
+
+       for (i = 0; i < dc->res_pool->pipe_count; i++) {
+               struct pipe_ctx *pipe = &context->res_ctx.pipe_ctx[i];
+
+               if (!pipe->stream)
+                       continue;
+
+               if (!pipe->plane_state)
+                       return false;
+       }
+       return true;
+}
+
+bool dcn32_subvp_in_use(struct dc *dc,
+               struct dc_state *context)
+{
+       uint32_t i;
+
+       for (i = 0; i < dc->res_pool->pipe_count; i++) {
+               struct pipe_ctx *pipe = &context->res_ctx.pipe_ctx[i];
+
+               if (dc_state_get_pipe_subvp_type(context, pipe) != SUBVP_NONE)
+                       return true;
+       }
+       return false;
+}
+
+bool dcn32_mpo_in_use(struct dc_state *context)
+{
+       uint32_t i;
+
+       for (i = 0; i < context->stream_count; i++) {
+               if (context->stream_status[i].plane_count > 1)
+                       return true;
+       }
+       return false;
+}
+
+
+bool dcn32_any_surfaces_rotated(struct dc *dc, struct dc_state *context)
+{
+       uint32_t i;
+
+       for (i = 0; i < dc->res_pool->pipe_count; i++) {
+               struct pipe_ctx *pipe = &context->res_ctx.pipe_ctx[i];
+
+               if (!pipe->stream)
+                       continue;
+
+               if (pipe->plane_state && pipe->plane_state->rotation != ROTATION_ANGLE_0)
+                       return true;
+       }
+       return false;
+}
+
+bool dcn32_is_center_timing(struct pipe_ctx *pipe)
+{
+       bool is_center_timing = false;
+
+       if (pipe->stream) {
+               if (pipe->stream->timing.v_addressable != pipe->stream->dst.height ||
+                               pipe->stream->timing.v_addressable != pipe->stream->src.height) {
+                       is_center_timing = true;
+               }
+       }
+
+       if (pipe->plane_state) {
+               if (pipe->stream->timing.v_addressable != pipe->plane_state->dst_rect.height &&
+                               pipe->stream->timing.v_addressable != pipe->plane_state->src_rect.height) {
+                       is_center_timing = true;
+               }
+       }
+
+       return is_center_timing;
+}
+
+bool dcn32_is_psr_capable(struct pipe_ctx *pipe)
+{
+       bool psr_capable = false;
+
+       if (pipe->stream && pipe->stream->link->psr_settings.psr_version != DC_PSR_VERSION_UNSUPPORTED) {
+               psr_capable = true;
+       }
+       return psr_capable;
+}
+
+static void override_det_for_subvp(struct dc *dc, struct dc_state *context, uint8_t pipe_segments[])
+{
+       uint32_t i;
+       uint8_t fhd_count = 0;
+       uint8_t subvp_high_refresh_count = 0;
+       uint8_t stream_count = 0;
+
+       // Do not override if a stream has multiple planes
+       for (i = 0; i < context->stream_count; i++) {
+               if (context->stream_status[i].plane_count > 1)
+                       return;
+
+               if (dc_state_get_stream_subvp_type(context, context->streams[i]) != SUBVP_PHANTOM)
+                       stream_count++;
+       }
+
+       for (i = 0; i < dc->res_pool->pipe_count; i++) {
+               struct pipe_ctx *pipe_ctx = &context->res_ctx.pipe_ctx[i];
+
+               if (pipe_ctx->stream && pipe_ctx->plane_state && dc_state_get_pipe_subvp_type(context, pipe_ctx) != SUBVP_PHANTOM) {
+                       if (dcn32_allow_subvp_high_refresh_rate(dc, context, pipe_ctx)) {
+
+                               if (pipe_ctx->stream->timing.v_addressable == 1080 && pipe_ctx->stream->timing.h_addressable == 1920) {
+                                       fhd_count++;
+                               }
+                               subvp_high_refresh_count++;
+                       }
+               }
+       }
+
+       if (stream_count == 2 && subvp_high_refresh_count == 2 && fhd_count == 1) {
+               for (i = 0; i < dc->res_pool->pipe_count; i++) {
+                       struct pipe_ctx *pipe_ctx = &context->res_ctx.pipe_ctx[i];
+
+                       if (pipe_ctx->stream && pipe_ctx->plane_state && dc_state_get_pipe_subvp_type(context, pipe_ctx) != SUBVP_PHANTOM) {
+                               if (pipe_ctx->stream->timing.v_addressable == 1080 && pipe_ctx->stream->timing.h_addressable == 1920) {
+                                       if (pipe_segments[i] > 4)
+                                               pipe_segments[i] = 4;
+                               }
+                       }
+               }
+       }
+}
+
+/**
+ * dcn32_determine_det_override(): Determine DET allocation for each pipe
+ *
+ * This function determines how much DET to allocate for each pipe. The total number of
+ * DET segments will be split equally among each of the streams, and after that the DET
+ * segments per stream will be split equally among the planes for the given stream.
+ *
+ * If there is a plane that's driven by more than 1 pipe (i.e. pipe split), then the
+ * number of DET for that given plane will be split among the pipes driving that plane.
+ *
+ *
+ * High level algorithm:
+ * 1. Split total DET among number of streams
+ * 2. For each stream, split DET among the planes
+ * 3. For each plane, check if there is a pipe split. If yes, split the DET allocation
+ *    among those pipes.
+ * 4. Assign the DET override to the DML pipes.
+ *
+ * @dc: Current DC state
+ * @context: New DC state to be programmed
+ * @pipes: Array of DML pipes
+ *
+ * Return: void
+ */
+void dcn32_determine_det_override(struct dc *dc,
+               struct dc_state *context,
+               display_e2e_pipe_params_st *pipes)
+{
+       uint32_t i, j, k;
+       uint8_t pipe_plane_count, stream_segments, plane_segments, pipe_segments[MAX_PIPES] = {0};
+       uint8_t pipe_counted[MAX_PIPES] = {0};
+       uint8_t pipe_cnt = 0;
+       struct dc_plane_state *current_plane = NULL;
+       uint8_t stream_count = 0;
+
+       for (i = 0; i < context->stream_count; i++) {
+               /* Don't count SubVP streams for DET allocation */
+               if (dc_state_get_stream_subvp_type(context, context->streams[i]) != SUBVP_PHANTOM)
+                       stream_count++;
+       }
+
+       if (stream_count > 0) {
+               stream_segments = 18 / stream_count;
+               for (i = 0; i < context->stream_count; i++) {
+                       if (dc_state_get_stream_subvp_type(context, context->streams[i]) == SUBVP_PHANTOM)
+                               continue;
+
+                       if (context->stream_status[i].plane_count > 0)
+                               plane_segments = stream_segments / context->stream_status[i].plane_count;
+                       else
+                               plane_segments = stream_segments;
+                       for (j = 0; j < dc->res_pool->pipe_count; j++) {
+                               pipe_plane_count = 0;
+                               if (context->res_ctx.pipe_ctx[j].stream == context->streams[i] &&
+                                               pipe_counted[j] != 1) {
+                                       /* Note: pipe_plane_count indicates the number of pipes to be used for a
+                                        * given plane. e.g. pipe_plane_count = 1 means single pipe (i.e. not split),
+                                        * pipe_plane_count = 2 means 2:1 split, etc.
+                                        */
+                                       pipe_plane_count++;
+                                       pipe_counted[j] = 1;
+                                       current_plane = context->res_ctx.pipe_ctx[j].plane_state;
+                                       for (k = 0; k < dc->res_pool->pipe_count; k++) {
+                                               if (k != j && context->res_ctx.pipe_ctx[k].stream == context->streams[i] &&
+                                                               context->res_ctx.pipe_ctx[k].plane_state == current_plane) {
+                                                       pipe_plane_count++;
+                                                       pipe_counted[k] = 1;
+                                               }
+                                       }
+
+                                       pipe_segments[j] = plane_segments / pipe_plane_count;
+                                       for (k = 0; k < dc->res_pool->pipe_count; k++) {
+                                               if (k != j && context->res_ctx.pipe_ctx[k].stream == context->streams[i] &&
+                                                               context->res_ctx.pipe_ctx[k].plane_state == current_plane) {
+                                                       pipe_segments[k] = plane_segments / pipe_plane_count;
+                                               }
+                                       }
+                               }
+                       }
+               }
+
+               override_det_for_subvp(dc, context, pipe_segments);
+               for (i = 0, pipe_cnt = 0; i < dc->res_pool->pipe_count; i++) {
+                       if (!context->res_ctx.pipe_ctx[i].stream)
+                               continue;
+                       pipes[pipe_cnt].pipe.src.det_size_override = pipe_segments[i] * DCN3_2_DET_SEG_SIZE;
+                       pipe_cnt++;
+               }
+       } else {
+               for (i = 0; i < dc->res_pool->pipe_count; i++)
+                       pipes[i].pipe.src.det_size_override = 4 * DCN3_2_DET_SEG_SIZE; //DCN3_2_DEFAULT_DET_SIZE
+       }
+}
+
+void dcn32_set_det_allocations(struct dc *dc, struct dc_state *context,
+       display_e2e_pipe_params_st *pipes)
+{
+       int i, pipe_cnt;
+       struct resource_context *res_ctx = &context->res_ctx;
+       struct pipe_ctx *pipe = 0;
+       bool disable_unbounded_requesting = dc->debug.disable_z9_mpc || dc->debug.disable_unbounded_requesting;
+
+       for (i = 0, pipe_cnt = 0; i < dc->res_pool->pipe_count; i++) {
+
+               if (!res_ctx->pipe_ctx[i].stream)
+                       continue;
+
+               pipe = &res_ctx->pipe_ctx[i];
+               pipe_cnt++;
+       }
+
+       /* For DET allocation, we don't want to use DML policy (not optimal for utilizing all
+        * the DET available for each pipe). Use the DET override input to maintain our driver
+        * policy.
+        */
+       if (pipe_cnt == 1) {
+               pipes[0].pipe.src.det_size_override = DCN3_2_MAX_DET_SIZE;
+               if (pipe->plane_state && !disable_unbounded_requesting && pipe->plane_state->tiling_info.gfx9.swizzle != DC_SW_LINEAR) {
+                       if (!is_dual_plane(pipe->plane_state->format)) {
+                               pipes[0].pipe.src.det_size_override = DCN3_2_DEFAULT_DET_SIZE;
+                               pipes[0].pipe.src.unbounded_req_mode = true;
+                               if (pipe->plane_state->src_rect.width >= 5120 &&
+                                       pipe->plane_state->src_rect.height >= 2880)
+                                       pipes[0].pipe.src.det_size_override = 320; // 5K or higher
+                       }
+               }
+       } else
+               dcn32_determine_det_override(dc, context, pipes);
+}
+
+#define MAX_STRETCHED_V_BLANK 1000 // in micro-seconds (must ensure to match value in FW)
+/*
+ * Scaling factor for v_blank stretch calculations considering timing in
+ * micro-seconds and pixel clock in 100hz.
+ * Note: the parenthesis are necessary to ensure the correct order of
+ * operation where V_SCALE is used.
+ */
+#define V_SCALE (10000 / MAX_STRETCHED_V_BLANK)
+
+static int get_frame_rate_at_max_stretch_100hz(
+               struct dc_stream_state *fpo_candidate_stream,
+               uint32_t fpo_vactive_margin_us)
+{
+       struct dc_crtc_timing *timing = NULL;
+       uint32_t sec_per_100_lines;
+       uint32_t max_v_blank;
+       uint32_t curr_v_blank;
+       uint32_t v_stretch_max;
+       uint32_t stretched_frame_pix_cnt;
+       uint32_t scaled_stretched_frame_pix_cnt;
+       uint32_t scaled_refresh_rate;
+       uint32_t v_scale;
+
+       if (fpo_candidate_stream == NULL)
+               return 0;
+
+       /* check if refresh rate at least 120hz */
+       timing = &fpo_candidate_stream->timing;
+       if (timing == NULL)
+               return 0;
+
+       v_scale = 10000 / (MAX_STRETCHED_V_BLANK + fpo_vactive_margin_us);
+
+       sec_per_100_lines = timing->pix_clk_100hz / timing->h_total + 1;
+       max_v_blank = sec_per_100_lines / v_scale + 1;
+       curr_v_blank = timing->v_total - timing->v_addressable;
+       v_stretch_max = (max_v_blank > curr_v_blank) ? (max_v_blank - curr_v_blank) : (0);
+       stretched_frame_pix_cnt = (v_stretch_max + timing->v_total) * timing->h_total;
+       scaled_stretched_frame_pix_cnt = stretched_frame_pix_cnt / 10000;
+       scaled_refresh_rate = (timing->pix_clk_100hz) / scaled_stretched_frame_pix_cnt + 1;
+
+       return scaled_refresh_rate;
+
+}
+
+static bool is_refresh_rate_support_mclk_switch_using_fw_based_vblank_stretch(
+               struct dc_stream_state *fpo_candidate_stream, uint32_t fpo_vactive_margin_us, int current_refresh_rate)
+{
+       int refresh_rate_max_stretch_100hz;
+       int min_refresh_100hz;
+
+       if (fpo_candidate_stream == NULL)
+               return false;
+
+       refresh_rate_max_stretch_100hz = get_frame_rate_at_max_stretch_100hz(fpo_candidate_stream, fpo_vactive_margin_us);
+       min_refresh_100hz = fpo_candidate_stream->timing.min_refresh_in_uhz / 10000;
+
+       if (refresh_rate_max_stretch_100hz < min_refresh_100hz)
+               return false;
+
+       if (fpo_candidate_stream->ctx->dc->config.enable_fpo_flicker_detection == 1 &&
+                       !dc_stream_is_refresh_rate_range_flickerless(fpo_candidate_stream, (refresh_rate_max_stretch_100hz / 100), current_refresh_rate, false))
+               return false;
+
+       return true;
+}
+
+static int get_refresh_rate(struct dc_stream_state *fpo_candidate_stream)
+{
+       int refresh_rate = 0;
+       int h_v_total = 0;
+       struct dc_crtc_timing *timing = NULL;
+
+       if (fpo_candidate_stream == NULL)
+               return 0;
+
+       /* check if refresh rate at least 120hz */
+       timing = &fpo_candidate_stream->timing;
+       if (timing == NULL)
+               return 0;
+
+       h_v_total = timing->h_total * timing->v_total;
+       if (h_v_total == 0)
+               return 0;
+
+       refresh_rate = ((timing->pix_clk_100hz * 100) / (h_v_total)) + 1;
+       return refresh_rate;
+}
+
+/**
+ * dcn32_can_support_mclk_switch_using_fw_based_vblank_stretch() - Determines if config can
+ *                                                                 support FPO
+ *
+ * @dc: current dc state
+ * @context: new dc state
+ *
+ * Return: Pointer to FPO stream candidate if config can support FPO, otherwise NULL
+ */
+struct dc_stream_state *dcn32_can_support_mclk_switch_using_fw_based_vblank_stretch(struct dc *dc, struct dc_state *context)
+{
+       int refresh_rate = 0;
+       const int minimum_refreshrate_supported = 120;
+       struct dc_stream_state *fpo_candidate_stream = NULL;
+       bool is_fpo_vactive = false;
+       uint32_t fpo_vactive_margin_us = 0;
+       struct dc_stream_status *fpo_stream_status = NULL;
+
+       if (context == NULL)
+               return NULL;
+
+       if (dc->debug.disable_fams)
+               return NULL;
+
+       if (!dc->caps.dmub_caps.mclk_sw)
+               return NULL;
+
+       if (context->bw_ctx.bw.dcn.clk.fw_based_mclk_switching_shut_down)
+               return NULL;
+
+       /* For FPO we can support up to 2 display configs if:
+        * - first display uses FPO
+        * - Second display switches in VACTIVE */
+       if (context->stream_count > 2)
+               return NULL;
+       else if (context->stream_count == 2) {
+               DC_FP_START();
+               dcn32_assign_fpo_vactive_candidate(dc, context, &fpo_candidate_stream);
+               DC_FP_END();
+               if (fpo_candidate_stream)
+                       fpo_stream_status = dc_state_get_stream_status(context, fpo_candidate_stream);
+               DC_FP_START();
+               is_fpo_vactive = dcn32_find_vactive_pipe(dc, context, fpo_candidate_stream, dc->debug.fpo_vactive_min_active_margin_us);
+               DC_FP_END();
+               if (!is_fpo_vactive || dc->debug.disable_fpo_vactive)
+                       return NULL;
+       } else {
+               fpo_candidate_stream = context->streams[0];
+               if (fpo_candidate_stream)
+                       fpo_stream_status = dc_state_get_stream_status(context, fpo_candidate_stream);
+       }
+
+       /* In DCN32/321, FPO uses per-pipe P-State force.
+        * If there's no planes, HUBP is power gated and
+        * therefore programming UCLK_PSTATE_FORCE does
+        * nothing (P-State will always be asserted naturally
+        * on a pipe that has HUBP power gated. Therefore we
+        * only want to enable FPO if the FPO pipe has both
+        * a stream and a plane.
+        */
+       if (!fpo_candidate_stream || !fpo_stream_status || fpo_stream_status->plane_count == 0)
+               return NULL;
+
+       if (fpo_candidate_stream->sink->edid_caps.panel_patch.disable_fams)
+               return NULL;
+
+       refresh_rate = get_refresh_rate(fpo_candidate_stream);
+       if (refresh_rate < minimum_refreshrate_supported)
+               return NULL;
+
+       fpo_vactive_margin_us = is_fpo_vactive ? dc->debug.fpo_vactive_margin_us : 0; // For now hardcode the FPO + Vactive stretch margin to be 2000us
+       if (!is_refresh_rate_support_mclk_switch_using_fw_based_vblank_stretch(fpo_candidate_stream, fpo_vactive_margin_us, refresh_rate))
+               return NULL;
+
+       if (!fpo_candidate_stream->allow_freesync)
+               return NULL;
+
+       if (fpo_candidate_stream->vrr_active_variable &&
+       ((dc->debug.disable_fams_gaming == INGAME_FAMS_DISABLE) ||
+       (context->stream_count > 1 && !(dc->debug.disable_fams_gaming == INGAME_FAMS_MULTI_DISP_ENABLE))))
+               return NULL;
+
+       return fpo_candidate_stream;
+}
+
+bool dcn32_check_native_scaling_for_res(struct pipe_ctx *pipe, unsigned int width, unsigned int height)
+{
+       bool is_native_scaling = false;
+
+       if (pipe->stream->timing.h_addressable == width &&
+                       pipe->stream->timing.v_addressable == height &&
+                       pipe->plane_state->src_rect.width == width &&
+                       pipe->plane_state->src_rect.height == height &&
+                       pipe->plane_state->dst_rect.width == width &&
+                       pipe->plane_state->dst_rect.height == height)
+               is_native_scaling = true;
+
+       return is_native_scaling;
+}
+
+/**
+ * disallow_subvp_in_active_plus_blank() - Function to determine disallowed subvp + drr/vblank configs
+ *
+ * @pipe: subvp pipe to be used for the subvp + drr/vblank config
+ *
+ * Since subvp is being enabled on more configs (such as 1080p60), we want
+ * to explicitly block any configs that we don't want to enable. We do not
+ * want to enable any 1080p60 (SubVP) + drr / vblank configs since these
+ * are already convered by FPO.
+ *
+ * Return: True if disallowed, false otherwise
+ */
+static bool disallow_subvp_in_active_plus_blank(struct pipe_ctx *pipe)
+{
+       bool disallow = false;
+
+       if (resource_is_pipe_type(pipe, OPP_HEAD) &&
+                       resource_is_pipe_type(pipe, DPP_PIPE)) {
+               if (pipe->stream->timing.v_addressable == 1080 && pipe->stream->timing.h_addressable == 1920)
+                       disallow = true;
+       }
+       return disallow;
+}
+
+/**
+ * dcn32_subvp_drr_admissable() - Determine if SubVP + DRR config is admissible
+ *
+ * @dc: Current DC state
+ * @context: New DC state to be programmed
+ *
+ * SubVP + DRR is admissible under the following conditions:
+ * - Config must have 2 displays (i.e., 2 non-phantom master pipes)
+ * - One display is SubVP
+ * - Other display must have Freesync enabled
+ * - The potential DRR display must not be PSR capable
+ *
+ * Return: True if admissible, false otherwise
+ */
+bool dcn32_subvp_drr_admissable(struct dc *dc, struct dc_state *context)
+{
+       bool result = false;
+       uint32_t i;
+       uint8_t subvp_count = 0;
+       uint8_t non_subvp_pipes = 0;
+       bool drr_pipe_found = false;
+       bool drr_psr_capable = false;
+       uint64_t refresh_rate = 0;
+       bool subvp_disallow = false;
+
+       for (i = 0; i < dc->res_pool->pipe_count; i++) {
+               struct pipe_ctx *pipe = &context->res_ctx.pipe_ctx[i];
+               enum mall_stream_type pipe_mall_type = dc_state_get_pipe_subvp_type(context, pipe);
+
+               if (resource_is_pipe_type(pipe, OPP_HEAD) &&
+                               resource_is_pipe_type(pipe, DPP_PIPE)) {
+                       if (pipe_mall_type == SUBVP_MAIN) {
+                               subvp_count++;
+
+                               subvp_disallow |= disallow_subvp_in_active_plus_blank(pipe);
+                               refresh_rate = (pipe->stream->timing.pix_clk_100hz * (uint64_t)100 +
+                                       pipe->stream->timing.v_total * pipe->stream->timing.h_total - (uint64_t)1);
+                               refresh_rate = div_u64(refresh_rate, pipe->stream->timing.v_total);
+                               refresh_rate = div_u64(refresh_rate, pipe->stream->timing.h_total);
+                       }
+                       if (pipe_mall_type == SUBVP_NONE) {
+                               non_subvp_pipes++;
+                               drr_psr_capable = (drr_psr_capable || dcn32_is_psr_capable(pipe));
+                               if (pipe->stream->ignore_msa_timing_param &&
+                                               (pipe->stream->allow_freesync || pipe->stream->vrr_active_variable || pipe->stream->vrr_active_fixed)) {
+                                       drr_pipe_found = true;
+                               }
+                       }
+               }
+       }
+
+       if (subvp_count == 1 && !subvp_disallow && non_subvp_pipes == 1 && drr_pipe_found && !drr_psr_capable &&
+               ((uint32_t)refresh_rate < 120))
+               result = true;
+
+       return result;
+}
+
+/**
+ * dcn32_subvp_vblank_admissable() - Determine if SubVP + Vblank config is admissible
+ *
+ * @dc: Current DC state
+ * @context: New DC state to be programmed
+ * @vlevel: Voltage level calculated by DML
+ *
+ * SubVP + Vblank is admissible under the following conditions:
+ * - Config must have 2 displays (i.e., 2 non-phantom master pipes)
+ * - One display is SubVP
+ * - Other display must not have Freesync capability
+ * - DML must have output DRAM clock change support as SubVP + Vblank
+ * - The potential vblank display must not be PSR capable
+ *
+ * Return: True if admissible, false otherwise
+ */
+bool dcn32_subvp_vblank_admissable(struct dc *dc, struct dc_state *context, int vlevel)
+{
+       bool result = false;
+       uint32_t i;
+       uint8_t subvp_count = 0;
+       uint8_t non_subvp_pipes = 0;
+       bool drr_pipe_found = false;
+       struct vba_vars_st *vba = &context->bw_ctx.dml.vba;
+       bool vblank_psr_capable = false;
+       uint64_t refresh_rate = 0;
+       bool subvp_disallow = false;
+
+       for (i = 0; i < dc->res_pool->pipe_count; i++) {
+               struct pipe_ctx *pipe = &context->res_ctx.pipe_ctx[i];
+               enum mall_stream_type pipe_mall_type = dc_state_get_pipe_subvp_type(context, pipe);
+
+               if (resource_is_pipe_type(pipe, OPP_HEAD) &&
+                               resource_is_pipe_type(pipe, DPP_PIPE)) {
+                       if (pipe_mall_type == SUBVP_MAIN) {
+                               subvp_count++;
+
+                               subvp_disallow |= disallow_subvp_in_active_plus_blank(pipe);
+                               refresh_rate = (pipe->stream->timing.pix_clk_100hz * (uint64_t)100 +
+                                       pipe->stream->timing.v_total * pipe->stream->timing.h_total - (uint64_t)1);
+                               refresh_rate = div_u64(refresh_rate, pipe->stream->timing.v_total);
+                               refresh_rate = div_u64(refresh_rate, pipe->stream->timing.h_total);
+                       }
+                       if (pipe_mall_type == SUBVP_NONE) {
+                               non_subvp_pipes++;
+                               vblank_psr_capable = (vblank_psr_capable || dcn32_is_psr_capable(pipe));
+                               if (pipe->stream->ignore_msa_timing_param &&
+                                               (pipe->stream->allow_freesync || pipe->stream->vrr_active_variable || pipe->stream->vrr_active_fixed)) {
+                                       drr_pipe_found = true;
+                               }
+                       }
+               }
+       }
+
+       if (subvp_count == 1 && non_subvp_pipes == 1 && !drr_pipe_found && !vblank_psr_capable &&
+               ((uint32_t)refresh_rate < 120) && !subvp_disallow &&
+               vba->DRAMClockChangeSupport[vlevel][vba->maxMpcComb] == dm_dram_clock_change_vblank_w_mall_sub_vp)
+               result = true;
+
+       return result;
+}
+
+void dcn32_update_dml_pipes_odm_policy_based_on_context(struct dc *dc, struct dc_state *context,
+               display_e2e_pipe_params_st *pipes)
+{
+       int i, pipe_cnt;
+       struct resource_context *res_ctx = &context->res_ctx;
+       struct pipe_ctx *pipe = NULL;
+
+       for (i = 0, pipe_cnt = 0; i < dc->res_pool->pipe_count; i++) {
+               int odm_slice_count = 0;
+
+               if (!res_ctx->pipe_ctx[i].stream)
+                       continue;
+               pipe = &res_ctx->pipe_ctx[i];
+               odm_slice_count = resource_get_odm_slice_count(pipe);
+
+               if (odm_slice_count == 1)
+                       pipes[pipe_cnt].pipe.dest.odm_combine_policy = dm_odm_combine_policy_dal;
+               else if (odm_slice_count == 2)
+                       pipes[pipe_cnt].pipe.dest.odm_combine_policy = dm_odm_combine_policy_2to1;
+               else if (odm_slice_count == 4)
+                       pipes[pipe_cnt].pipe.dest.odm_combine_policy = dm_odm_combine_policy_4to1;
+
+               pipe_cnt++;
+       }
+}
+
+void dcn32_override_min_req_dcfclk(struct dc *dc, struct dc_state *context)
+{
+       if (dcn32_subvp_in_use(dc, context) && context->bw_ctx.bw.dcn.clk.dcfclk_khz <= MIN_SUBVP_DCFCLK_KHZ)
+               context->bw_ctx.bw.dcn.clk.dcfclk_khz = MIN_SUBVP_DCFCLK_KHZ;
+}