drm/amd/display: Refactor resource into component directory
authorMounika Adhuri <moadhuri@amd.com>
Fri, 6 Oct 2023 09:35:42 +0000 (15:05 +0530)
committerAlex Deucher <alexander.deucher@amd.com>
Fri, 17 Nov 2023 14:30:50 +0000 (09:30 -0500)
[WHY]
Move all resource files to unique folder resource.

[HOW]
Created resource folder in dc, moved the
dcnxx_resource.c and dcnxx_resource.h files into
corresponding new folders inside the resource and
made appropriate changes for compilation in Makefiles.

Reviewed-by: Martin Leung <martin.leung@amd.com>
Acked-by: Alex Hung <alex.hung@amd.com>
Signed-off-by: Mounika Adhuri <moadhuri@amd.com>
Tested-by: Daniel Wheeler <daniel.wheeler@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
108 files changed:
drivers/gpu/drm/amd/display/Makefile
drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_mst_types.c
drivers/gpu/drm/amd/display/dc/Makefile
drivers/gpu/drm/amd/display/dc/core/dc_resource.c
drivers/gpu/drm/amd/display/dc/dce100/Makefile [deleted file]
drivers/gpu/drm/amd/display/dc/dce100/dce100_resource.c [deleted file]
drivers/gpu/drm/amd/display/dc/dce100/dce100_resource.h [deleted file]
drivers/gpu/drm/amd/display/dc/dce110/Makefile
drivers/gpu/drm/amd/display/dc/dce110/dce110_resource.c [deleted file]
drivers/gpu/drm/amd/display/dc/dce110/dce110_resource.h [deleted file]
drivers/gpu/drm/amd/display/dc/dce112/Makefile
drivers/gpu/drm/amd/display/dc/dce112/dce112_resource.c [deleted file]
drivers/gpu/drm/amd/display/dc/dce112/dce112_resource.h [deleted file]
drivers/gpu/drm/amd/display/dc/dce120/Makefile
drivers/gpu/drm/amd/display/dc/dce120/dce120_resource.c [deleted file]
drivers/gpu/drm/amd/display/dc/dce120/dce120_resource.h [deleted file]
drivers/gpu/drm/amd/display/dc/dce80/Makefile
drivers/gpu/drm/amd/display/dc/dce80/dce80_resource.c [deleted file]
drivers/gpu/drm/amd/display/dc/dce80/dce80_resource.h [deleted file]
drivers/gpu/drm/amd/display/dc/dcn10/Makefile
drivers/gpu/drm/amd/display/dc/dcn10/dcn10_resource.c [deleted file]
drivers/gpu/drm/amd/display/dc/dcn10/dcn10_resource.h [deleted file]
drivers/gpu/drm/amd/display/dc/dcn20/Makefile
drivers/gpu/drm/amd/display/dc/dcn20/dcn20_resource.c [deleted file]
drivers/gpu/drm/amd/display/dc/dcn20/dcn20_resource.h [deleted file]
drivers/gpu/drm/amd/display/dc/dcn201/Makefile
drivers/gpu/drm/amd/display/dc/dcn201/dcn201_resource.c [deleted file]
drivers/gpu/drm/amd/display/dc/dcn201/dcn201_resource.h [deleted file]
drivers/gpu/drm/amd/display/dc/dcn21/Makefile
drivers/gpu/drm/amd/display/dc/dcn21/dcn21_resource.c [deleted file]
drivers/gpu/drm/amd/display/dc/dcn21/dcn21_resource.h [deleted file]
drivers/gpu/drm/amd/display/dc/dcn30/Makefile
drivers/gpu/drm/amd/display/dc/dcn30/dcn30_resource.c [deleted file]
drivers/gpu/drm/amd/display/dc/dcn30/dcn30_resource.h [deleted file]
drivers/gpu/drm/amd/display/dc/dcn301/Makefile
drivers/gpu/drm/amd/display/dc/dcn301/dcn301_resource.c [deleted file]
drivers/gpu/drm/amd/display/dc/dcn301/dcn301_resource.h [deleted file]
drivers/gpu/drm/amd/display/dc/dcn302/Makefile
drivers/gpu/drm/amd/display/dc/dcn302/dcn302_resource.c [deleted file]
drivers/gpu/drm/amd/display/dc/dcn302/dcn302_resource.h [deleted file]
drivers/gpu/drm/amd/display/dc/dcn303/Makefile
drivers/gpu/drm/amd/display/dc/dcn303/dcn303_resource.c [deleted file]
drivers/gpu/drm/amd/display/dc/dcn303/dcn303_resource.h [deleted file]
drivers/gpu/drm/amd/display/dc/dcn31/Makefile
drivers/gpu/drm/amd/display/dc/dcn31/dcn31_resource.c [deleted file]
drivers/gpu/drm/amd/display/dc/dcn31/dcn31_resource.h [deleted file]
drivers/gpu/drm/amd/display/dc/dcn314/Makefile
drivers/gpu/drm/amd/display/dc/dcn314/dcn314_resource.c [deleted file]
drivers/gpu/drm/amd/display/dc/dcn314/dcn314_resource.h [deleted file]
drivers/gpu/drm/amd/display/dc/dcn315/Makefile [deleted file]
drivers/gpu/drm/amd/display/dc/dcn315/dcn315_resource.c [deleted file]
drivers/gpu/drm/amd/display/dc/dcn315/dcn315_resource.h [deleted file]
drivers/gpu/drm/amd/display/dc/dcn316/Makefile [deleted file]
drivers/gpu/drm/amd/display/dc/dcn316/dcn316_resource.c [deleted file]
drivers/gpu/drm/amd/display/dc/dcn316/dcn316_resource.h [deleted file]
drivers/gpu/drm/amd/display/dc/dcn32/Makefile
drivers/gpu/drm/amd/display/dc/dcn32/dcn32_resource.c [deleted file]
drivers/gpu/drm/amd/display/dc/dcn32/dcn32_resource.h [deleted file]
drivers/gpu/drm/amd/display/dc/dcn32/dcn32_resource_helpers.c
drivers/gpu/drm/amd/display/dc/dcn321/Makefile
drivers/gpu/drm/amd/display/dc/dcn321/dcn321_resource.c [deleted file]
drivers/gpu/drm/amd/display/dc/dcn321/dcn321_resource.h [deleted file]
drivers/gpu/drm/amd/display/dc/dcn35/Makefile
drivers/gpu/drm/amd/display/dc/dcn35/dcn35_resource.c [deleted file]
drivers/gpu/drm/amd/display/dc/dcn35/dcn35_resource.h [deleted file]
drivers/gpu/drm/amd/display/dc/dml/calcs/dcn_calcs.c
drivers/gpu/drm/amd/display/dc/resource/Makefile [new file with mode: 0644]
drivers/gpu/drm/amd/display/dc/resource/dce100/dce100_resource.c [new file with mode: 0644]
drivers/gpu/drm/amd/display/dc/resource/dce100/dce100_resource.h [new file with mode: 0644]
drivers/gpu/drm/amd/display/dc/resource/dce110/dce110_resource.c [new file with mode: 0644]
drivers/gpu/drm/amd/display/dc/resource/dce110/dce110_resource.h [new file with mode: 0644]
drivers/gpu/drm/amd/display/dc/resource/dce112/dce112_resource.c [new file with mode: 0644]
drivers/gpu/drm/amd/display/dc/resource/dce112/dce112_resource.h [new file with mode: 0644]
drivers/gpu/drm/amd/display/dc/resource/dce120/dce120_resource.c [new file with mode: 0644]
drivers/gpu/drm/amd/display/dc/resource/dce120/dce120_resource.h [new file with mode: 0644]
drivers/gpu/drm/amd/display/dc/resource/dce80/CMakeLists.txt [new file with mode: 0644]
drivers/gpu/drm/amd/display/dc/resource/dce80/dce80_resource.c [new file with mode: 0644]
drivers/gpu/drm/amd/display/dc/resource/dce80/dce80_resource.h [new file with mode: 0644]
drivers/gpu/drm/amd/display/dc/resource/dcn10/dcn10_resource.c [new file with mode: 0644]
drivers/gpu/drm/amd/display/dc/resource/dcn10/dcn10_resource.h [new file with mode: 0644]
drivers/gpu/drm/amd/display/dc/resource/dcn20/dcn20_resource.c [new file with mode: 0644]
drivers/gpu/drm/amd/display/dc/resource/dcn20/dcn20_resource.h [new file with mode: 0644]
drivers/gpu/drm/amd/display/dc/resource/dcn201/dcn201_resource.c [new file with mode: 0644]
drivers/gpu/drm/amd/display/dc/resource/dcn201/dcn201_resource.h [new file with mode: 0644]
drivers/gpu/drm/amd/display/dc/resource/dcn21/dcn21_resource.c [new file with mode: 0644]
drivers/gpu/drm/amd/display/dc/resource/dcn21/dcn21_resource.h [new file with mode: 0644]
drivers/gpu/drm/amd/display/dc/resource/dcn30/dcn30_resource.c [new file with mode: 0644]
drivers/gpu/drm/amd/display/dc/resource/dcn30/dcn30_resource.h [new file with mode: 0644]
drivers/gpu/drm/amd/display/dc/resource/dcn301/dcn301_resource.c [new file with mode: 0644]
drivers/gpu/drm/amd/display/dc/resource/dcn301/dcn301_resource.h [new file with mode: 0644]
drivers/gpu/drm/amd/display/dc/resource/dcn302/dcn302_resource.c [new file with mode: 0644]
drivers/gpu/drm/amd/display/dc/resource/dcn302/dcn302_resource.h [new file with mode: 0644]
drivers/gpu/drm/amd/display/dc/resource/dcn303/dcn303_resource.c [new file with mode: 0644]
drivers/gpu/drm/amd/display/dc/resource/dcn303/dcn303_resource.h [new file with mode: 0644]
drivers/gpu/drm/amd/display/dc/resource/dcn31/dcn31_resource.c [new file with mode: 0644]
drivers/gpu/drm/amd/display/dc/resource/dcn31/dcn31_resource.h [new file with mode: 0644]
drivers/gpu/drm/amd/display/dc/resource/dcn314/dcn314_resource.c [new file with mode: 0644]
drivers/gpu/drm/amd/display/dc/resource/dcn314/dcn314_resource.h [new file with mode: 0644]
drivers/gpu/drm/amd/display/dc/resource/dcn315/dcn315_resource.c [new file with mode: 0644]
drivers/gpu/drm/amd/display/dc/resource/dcn315/dcn315_resource.h [new file with mode: 0644]
drivers/gpu/drm/amd/display/dc/resource/dcn316/dcn316_resource.c [new file with mode: 0644]
drivers/gpu/drm/amd/display/dc/resource/dcn316/dcn316_resource.h [new file with mode: 0644]
drivers/gpu/drm/amd/display/dc/resource/dcn32/dcn32_resource.c [new file with mode: 0644]
drivers/gpu/drm/amd/display/dc/resource/dcn32/dcn32_resource.h [new file with mode: 0644]
drivers/gpu/drm/amd/display/dc/resource/dcn321/dcn321_resource.c [new file with mode: 0644]
drivers/gpu/drm/amd/display/dc/resource/dcn321/dcn321_resource.h [new file with mode: 0644]
drivers/gpu/drm/amd/display/dc/resource/dcn35/dcn35_resource.c [new file with mode: 0644]
drivers/gpu/drm/amd/display/dc/resource/dcn35/dcn35_resource.h [new file with mode: 0644]

index af17ab8027dfdaf6d7af5f08fef309f8061aa26d..71192fc81a20e684b026f3fd48467b633e05861a 100644 (file)
@@ -30,6 +30,7 @@ subdir-ccflags-y += -I$(FULL_AMD_DISPLAY_PATH)/dc/inc/
 subdir-ccflags-y += -I$(FULL_AMD_DISPLAY_PATH)/dc/inc/hw
 subdir-ccflags-y += -I$(FULL_AMD_DISPLAY_PATH)/dc/clk_mgr
 subdir-ccflags-y += -I$(FULL_AMD_DISPLAY_PATH)/dc/hwss
+subdir-ccflags-y += -I$(FULL_AMD_DISPLAY_PATH)/dc/resource
 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 11da0eebee6c4b0afd34ee5b7a499e046c4be413..ec87e31c6fe88e5e5544028e70a1165c8fd5f263 100644 (file)
@@ -44,7 +44,7 @@
 #include "amdgpu_dm_debugfs.h"
 #endif
 
-#include "dc/dcn20/dcn20_resource.h"
+#include "dc/resource/dcn20/dcn20_resource.h"
 
 #define PEAK_FACTOR_X1000 1006
 
index 3a169b78e7e432a9b3ba3d0f41405c2b9f297f2e..ab51a065cf0e589cf2f3546750916c0048daeb8c 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
+DC_LIBS = basics bios dml clk_mgr dce gpio hwss irq link virtual dsc resource
 
 ifdef CONFIG_DRM_AMD_DC_FP
 
@@ -38,8 +38,6 @@ DC_LIBS += dcn302
 DC_LIBS += dcn303
 DC_LIBS += dcn31
 DC_LIBS += dcn314
-DC_LIBS += dcn315
-DC_LIBS += dcn316
 DC_LIBS += dcn32
 DC_LIBS += dcn321
 DC_LIBS += dcn35
@@ -51,7 +49,6 @@ DC_LIBS += dce120
 
 DC_LIBS += dce112
 DC_LIBS += dce110
-DC_LIBS += dce100
 DC_LIBS += dce80
 
 ifdef CONFIG_DRM_AMD_DC_SI
index a1f1d100399275aba741c7dcd852c30fbcac27cf..6159d819c5c57c6ab987139fe058bdec345ff418 100644 (file)
@@ -69,8 +69,8 @@
 #include "dcn314/dcn314_resource.h"
 #include "dcn315/dcn315_resource.h"
 #include "dcn316/dcn316_resource.h"
-#include "../dcn32/dcn32_resource.h"
-#include "../dcn321/dcn321_resource.h"
+#include "dcn32/dcn32_resource.h"
+#include "dcn321/dcn321_resource.h"
 #include "dcn35/dcn35_resource.h"
 
 #define VISUAL_CONFIRM_BASE_DEFAULT 3
diff --git a/drivers/gpu/drm/amd/display/dc/dce100/Makefile b/drivers/gpu/drm/amd/display/dc/dce100/Makefile
deleted file mode 100644 (file)
index 0d2f6bb..0000000
+++ /dev/null
@@ -1,46 +0,0 @@
-#
-# Copyright 2017 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.
-#
-#
-# Makefile for the 'controller' sub-component of DAL.
-# It provides the control and status of HW CRTC block.
-
-CFLAGS_$(AMDDALPATH)/dc/dce100/dce100_resource.o = $(call cc-disable-warning, override-init)
-
-DCE100 = dce100_resource.o
-
-AMD_DAL_DCE100 = $(addprefix $(AMDDALPATH)/dc/dce100/,$(DCE100))
-
-AMD_DISPLAY_FILES += $(AMD_DAL_DCE100)
-
-
-###############################################################################
-# DCE 10x
-###############################################################################
-ifdef 0#CONFIG_DRM_AMD_DC_DCE11_0
-TG_DCE100 = dce100_resource.o
-
-AMD_DAL_TG_DCE100 = $(addprefix \
-       $(AMDDALPATH)/dc/dce100/,$(TG_DCE100))
-
-AMD_DISPLAY_FILES += $(AMD_DAL_TG_DCE100)
-endif
-
diff --git a/drivers/gpu/drm/amd/display/dc/dce100/dce100_resource.c b/drivers/gpu/drm/amd/display/dc/dce100/dce100_resource.c
deleted file mode 100644 (file)
index 53a5f4c..0000000
+++ /dev/null
@@ -1,1179 +0,0 @@
-/*
- * Copyright 2012-15 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 "dm_services.h"
-
-#include "link_encoder.h"
-#include "stream_encoder.h"
-
-#include "resource.h"
-#include "include/irq_service_interface.h"
-#include "virtual/virtual_stream_encoder.h"
-#include "dce110/dce110_resource.h"
-#include "dce110/dce110_timing_generator.h"
-#include "irq/dce110/irq_service_dce110.h"
-#include "dce/dce_link_encoder.h"
-#include "dce/dce_stream_encoder.h"
-#include "dce/dce_mem_input.h"
-#include "dce/dce_ipp.h"
-#include "dce/dce_transform.h"
-#include "dce/dce_opp.h"
-#include "dce/dce_clock_source.h"
-#include "dce/dce_audio.h"
-#include "dce/dce_hwseq.h"
-#include "dce100/dce100_hwseq.h"
-#include "dce/dce_panel_cntl.h"
-
-#include "reg_helper.h"
-
-#include "dce/dce_10_0_d.h"
-#include "dce/dce_10_0_sh_mask.h"
-
-#include "dce/dce_dmcu.h"
-#include "dce/dce_aux.h"
-#include "dce/dce_abm.h"
-#include "dce/dce_i2c.h"
-
-#include "dce100_resource.h"
-
-#ifndef mmMC_HUB_RDREQ_DMIF_LIMIT
-#include "gmc/gmc_8_2_d.h"
-#include "gmc/gmc_8_2_sh_mask.h"
-#endif
-
-#ifndef mmDP_DPHY_INTERNAL_CTRL
-       #define mmDP_DPHY_INTERNAL_CTRL 0x4aa7
-       #define mmDP0_DP_DPHY_INTERNAL_CTRL 0x4aa7
-       #define mmDP1_DP_DPHY_INTERNAL_CTRL 0x4ba7
-       #define mmDP2_DP_DPHY_INTERNAL_CTRL 0x4ca7
-       #define mmDP3_DP_DPHY_INTERNAL_CTRL 0x4da7
-       #define mmDP4_DP_DPHY_INTERNAL_CTRL 0x4ea7
-       #define mmDP5_DP_DPHY_INTERNAL_CTRL 0x4fa7
-       #define mmDP6_DP_DPHY_INTERNAL_CTRL 0x54a7
-       #define mmDP7_DP_DPHY_INTERNAL_CTRL 0x56a7
-       #define mmDP8_DP_DPHY_INTERNAL_CTRL 0x57a7
-#endif
-
-#ifndef mmBIOS_SCRATCH_2
-       #define mmBIOS_SCRATCH_2 0x05CB
-       #define mmBIOS_SCRATCH_3 0x05CC
-       #define mmBIOS_SCRATCH_6 0x05CF
-#endif
-
-#ifndef mmDP_DPHY_BS_SR_SWAP_CNTL
-       #define mmDP_DPHY_BS_SR_SWAP_CNTL                       0x4ADC
-       #define mmDP0_DP_DPHY_BS_SR_SWAP_CNTL                   0x4ADC
-       #define mmDP1_DP_DPHY_BS_SR_SWAP_CNTL                   0x4BDC
-       #define mmDP2_DP_DPHY_BS_SR_SWAP_CNTL                   0x4CDC
-       #define mmDP3_DP_DPHY_BS_SR_SWAP_CNTL                   0x4DDC
-       #define mmDP4_DP_DPHY_BS_SR_SWAP_CNTL                   0x4EDC
-       #define mmDP5_DP_DPHY_BS_SR_SWAP_CNTL                   0x4FDC
-       #define mmDP6_DP_DPHY_BS_SR_SWAP_CNTL                   0x54DC
-#endif
-
-#ifndef mmDP_DPHY_FAST_TRAINING
-       #define mmDP_DPHY_FAST_TRAINING                         0x4ABC
-       #define mmDP0_DP_DPHY_FAST_TRAINING                     0x4ABC
-       #define mmDP1_DP_DPHY_FAST_TRAINING                     0x4BBC
-       #define mmDP2_DP_DPHY_FAST_TRAINING                     0x4CBC
-       #define mmDP3_DP_DPHY_FAST_TRAINING                     0x4DBC
-       #define mmDP4_DP_DPHY_FAST_TRAINING                     0x4EBC
-       #define mmDP5_DP_DPHY_FAST_TRAINING                     0x4FBC
-       #define mmDP6_DP_DPHY_FAST_TRAINING                     0x54BC
-#endif
-
-static const struct dce110_timing_generator_offsets dce100_tg_offsets[] = {
-       {
-               .crtc = (mmCRTC0_CRTC_CONTROL - mmCRTC_CONTROL),
-               .dcp =  (mmDCP0_GRPH_CONTROL - mmGRPH_CONTROL),
-       },
-       {
-               .crtc = (mmCRTC1_CRTC_CONTROL - mmCRTC_CONTROL),
-               .dcp = (mmDCP1_GRPH_CONTROL - mmGRPH_CONTROL),
-       },
-       {
-               .crtc = (mmCRTC2_CRTC_CONTROL - mmCRTC_CONTROL),
-               .dcp = (mmDCP2_GRPH_CONTROL - mmGRPH_CONTROL),
-       },
-       {
-               .crtc = (mmCRTC3_CRTC_CONTROL - mmCRTC_CONTROL),
-               .dcp =  (mmDCP3_GRPH_CONTROL - mmGRPH_CONTROL),
-       },
-       {
-               .crtc = (mmCRTC4_CRTC_CONTROL - mmCRTC_CONTROL),
-               .dcp = (mmDCP4_GRPH_CONTROL - mmGRPH_CONTROL),
-       },
-       {
-               .crtc = (mmCRTC5_CRTC_CONTROL - mmCRTC_CONTROL),
-               .dcp = (mmDCP5_GRPH_CONTROL - mmGRPH_CONTROL),
-       }
-};
-
-/* set register offset */
-#define SR(reg_name)\
-       .reg_name = mm ## reg_name
-
-/* set register offset with instance */
-#define SRI(reg_name, block, id)\
-       .reg_name = mm ## block ## id ## _ ## reg_name
-
-#define ipp_regs(id)\
-[id] = {\
-               IPP_DCE100_REG_LIST_DCE_BASE(id)\
-}
-
-static const struct dce_ipp_registers ipp_regs[] = {
-               ipp_regs(0),
-               ipp_regs(1),
-               ipp_regs(2),
-               ipp_regs(3),
-               ipp_regs(4),
-               ipp_regs(5)
-};
-
-static const struct dce_ipp_shift ipp_shift = {
-               IPP_DCE100_MASK_SH_LIST_DCE_COMMON_BASE(__SHIFT)
-};
-
-static const struct dce_ipp_mask ipp_mask = {
-               IPP_DCE100_MASK_SH_LIST_DCE_COMMON_BASE(_MASK)
-};
-
-#define transform_regs(id)\
-[id] = {\
-               XFM_COMMON_REG_LIST_DCE100(id)\
-}
-
-static const struct dce_transform_registers xfm_regs[] = {
-               transform_regs(0),
-               transform_regs(1),
-               transform_regs(2),
-               transform_regs(3),
-               transform_regs(4),
-               transform_regs(5)
-};
-
-static const struct dce_transform_shift xfm_shift = {
-               XFM_COMMON_MASK_SH_LIST_DCE110(__SHIFT)
-};
-
-static const struct dce_transform_mask xfm_mask = {
-               XFM_COMMON_MASK_SH_LIST_DCE110(_MASK)
-};
-
-#define aux_regs(id)\
-[id] = {\
-       AUX_REG_LIST(id)\
-}
-
-static const struct dce110_link_enc_aux_registers link_enc_aux_regs[] = {
-               aux_regs(0),
-               aux_regs(1),
-               aux_regs(2),
-               aux_regs(3),
-               aux_regs(4),
-               aux_regs(5)
-};
-
-#define hpd_regs(id)\
-[id] = {\
-       HPD_REG_LIST(id)\
-}
-
-static const struct dce110_link_enc_hpd_registers link_enc_hpd_regs[] = {
-               hpd_regs(0),
-               hpd_regs(1),
-               hpd_regs(2),
-               hpd_regs(3),
-               hpd_regs(4),
-               hpd_regs(5)
-};
-
-#define link_regs(id)\
-[id] = {\
-       LE_DCE100_REG_LIST(id)\
-}
-
-static const struct dce110_link_enc_registers link_enc_regs[] = {
-       link_regs(0),
-       link_regs(1),
-       link_regs(2),
-       link_regs(3),
-       link_regs(4),
-       link_regs(5),
-       link_regs(6),
-};
-
-#define stream_enc_regs(id)\
-[id] = {\
-       SE_COMMON_REG_LIST_DCE_BASE(id),\
-       .AFMT_CNTL = 0,\
-}
-
-static const struct dce110_stream_enc_registers stream_enc_regs[] = {
-       stream_enc_regs(0),
-       stream_enc_regs(1),
-       stream_enc_regs(2),
-       stream_enc_regs(3),
-       stream_enc_regs(4),
-       stream_enc_regs(5),
-       stream_enc_regs(6)
-};
-
-static const struct dce_stream_encoder_shift se_shift = {
-               SE_COMMON_MASK_SH_LIST_DCE80_100(__SHIFT)
-};
-
-static const struct dce_stream_encoder_mask se_mask = {
-               SE_COMMON_MASK_SH_LIST_DCE80_100(_MASK)
-};
-
-static const struct dce_panel_cntl_registers panel_cntl_regs[] = {
-       { DCE_PANEL_CNTL_REG_LIST() }
-};
-
-static const struct dce_panel_cntl_shift panel_cntl_shift = {
-       DCE_PANEL_CNTL_MASK_SH_LIST(__SHIFT)
-};
-
-static const struct dce_panel_cntl_mask panel_cntl_mask = {
-       DCE_PANEL_CNTL_MASK_SH_LIST(_MASK)
-};
-
-#define opp_regs(id)\
-[id] = {\
-       OPP_DCE_100_REG_LIST(id),\
-}
-
-static const struct dce_opp_registers opp_regs[] = {
-       opp_regs(0),
-       opp_regs(1),
-       opp_regs(2),
-       opp_regs(3),
-       opp_regs(4),
-       opp_regs(5)
-};
-
-static const struct dce_opp_shift opp_shift = {
-       OPP_COMMON_MASK_SH_LIST_DCE_100(__SHIFT)
-};
-
-static const struct dce_opp_mask opp_mask = {
-       OPP_COMMON_MASK_SH_LIST_DCE_100(_MASK)
-};
-#define aux_engine_regs(id)\
-[id] = {\
-       AUX_COMMON_REG_LIST(id), \
-       .AUX_RESET_MASK = 0 \
-}
-
-static const struct dce110_aux_registers aux_engine_regs[] = {
-               aux_engine_regs(0),
-               aux_engine_regs(1),
-               aux_engine_regs(2),
-               aux_engine_regs(3),
-               aux_engine_regs(4),
-               aux_engine_regs(5)
-};
-
-#define audio_regs(id)\
-[id] = {\
-       AUD_COMMON_REG_LIST(id)\
-}
-
-static const struct dce_audio_registers audio_regs[] = {
-       audio_regs(0),
-       audio_regs(1),
-       audio_regs(2),
-       audio_regs(3),
-       audio_regs(4),
-       audio_regs(5),
-       audio_regs(6),
-};
-
-static const struct dce_audio_shift audio_shift = {
-               AUD_COMMON_MASK_SH_LIST(__SHIFT)
-};
-
-static const struct dce_audio_mask audio_mask = {
-               AUD_COMMON_MASK_SH_LIST(_MASK)
-};
-
-#define clk_src_regs(id)\
-[id] = {\
-       CS_COMMON_REG_LIST_DCE_100_110(id),\
-}
-
-static const struct dce110_clk_src_regs clk_src_regs[] = {
-       clk_src_regs(0),
-       clk_src_regs(1),
-       clk_src_regs(2)
-};
-
-static const struct dce110_clk_src_shift cs_shift = {
-               CS_COMMON_MASK_SH_LIST_DCE_COMMON_BASE(__SHIFT)
-};
-
-static const struct dce110_clk_src_mask cs_mask = {
-               CS_COMMON_MASK_SH_LIST_DCE_COMMON_BASE(_MASK)
-};
-
-static const struct dce_dmcu_registers dmcu_regs = {
-               DMCU_DCE110_COMMON_REG_LIST()
-};
-
-static const struct dce_dmcu_shift dmcu_shift = {
-               DMCU_MASK_SH_LIST_DCE110(__SHIFT)
-};
-
-static const struct dce_dmcu_mask dmcu_mask = {
-               DMCU_MASK_SH_LIST_DCE110(_MASK)
-};
-
-static const struct dce_abm_registers abm_regs = {
-               ABM_DCE110_COMMON_REG_LIST()
-};
-
-static const struct dce_abm_shift abm_shift = {
-               ABM_MASK_SH_LIST_DCE110(__SHIFT)
-};
-
-static const struct dce_abm_mask abm_mask = {
-               ABM_MASK_SH_LIST_DCE110(_MASK)
-};
-
-#define DCFE_MEM_PWR_CTRL_REG_BASE 0x1b03
-
-static const struct bios_registers bios_regs = {
-       .BIOS_SCRATCH_3 = mmBIOS_SCRATCH_3,
-       .BIOS_SCRATCH_6 = mmBIOS_SCRATCH_6
-};
-
-static const struct resource_caps res_cap = {
-       .num_timing_generator = 6,
-       .num_audio = 6,
-       .num_stream_encoder = 6,
-       .num_pll = 3,
-       .num_ddc = 6,
-};
-
-static const struct dc_plane_cap plane_cap = {
-       .type = DC_PLANE_TYPE_DCE_RGB,
-
-       .pixel_format_support = {
-                       .argb8888 = true,
-                       .nv12 = false,
-                       .fp16 = true
-       },
-
-       .max_upscale_factor = {
-                       .argb8888 = 16000,
-                       .nv12 = 1,
-                       .fp16 = 1
-       },
-
-       .max_downscale_factor = {
-                       .argb8888 = 250,
-                       .nv12 = 1,
-                       .fp16 = 1
-       }
-};
-
-static const struct dc_debug_options debug_defaults = {
-               .enable_legacy_fast_update = true,
-};
-
-#define CTX  ctx
-#define REG(reg) mm ## reg
-
-#ifndef mmCC_DC_HDMI_STRAPS
-#define mmCC_DC_HDMI_STRAPS 0x1918
-#define CC_DC_HDMI_STRAPS__HDMI_DISABLE_MASK 0x40
-#define CC_DC_HDMI_STRAPS__HDMI_DISABLE__SHIFT 0x6
-#define CC_DC_HDMI_STRAPS__AUDIO_STREAM_NUMBER_MASK 0x700
-#define CC_DC_HDMI_STRAPS__AUDIO_STREAM_NUMBER__SHIFT 0x8
-#endif
-
-static int map_transmitter_id_to_phy_instance(
-       enum transmitter transmitter)
-{
-       switch (transmitter) {
-       case TRANSMITTER_UNIPHY_A:
-               return 0;
-       case TRANSMITTER_UNIPHY_B:
-               return 1;
-       case TRANSMITTER_UNIPHY_C:
-               return 2;
-       case TRANSMITTER_UNIPHY_D:
-               return 3;
-       case TRANSMITTER_UNIPHY_E:
-               return 4;
-       case TRANSMITTER_UNIPHY_F:
-               return 5;
-       case TRANSMITTER_UNIPHY_G:
-               return 6;
-       default:
-               ASSERT(0);
-               return 0;
-       }
-}
-
-static void read_dce_straps(
-       struct dc_context *ctx,
-       struct resource_straps *straps)
-{
-       REG_GET_2(CC_DC_HDMI_STRAPS,
-                       HDMI_DISABLE, &straps->hdmi_disable,
-                       AUDIO_STREAM_NUMBER, &straps->audio_stream_number);
-
-       REG_GET(DC_PINSTRAPS, DC_PINSTRAPS_AUDIO, &straps->dc_pinstraps_audio);
-}
-
-static struct audio *create_audio(
-               struct dc_context *ctx, unsigned int inst)
-{
-       return dce_audio_create(ctx, inst,
-                       &audio_regs[inst], &audio_shift, &audio_mask);
-}
-
-static struct timing_generator *dce100_timing_generator_create(
-               struct dc_context *ctx,
-               uint32_t instance,
-               const struct dce110_timing_generator_offsets *offsets)
-{
-       struct dce110_timing_generator *tg110 =
-               kzalloc(sizeof(struct dce110_timing_generator), GFP_KERNEL);
-
-       if (!tg110)
-               return NULL;
-
-       dce110_timing_generator_construct(tg110, ctx, instance, offsets);
-       return &tg110->base;
-}
-
-static struct stream_encoder *dce100_stream_encoder_create(
-       enum engine_id eng_id,
-       struct dc_context *ctx)
-{
-       struct dce110_stream_encoder *enc110 =
-               kzalloc(sizeof(struct dce110_stream_encoder), GFP_KERNEL);
-
-       if (!enc110)
-               return NULL;
-
-       dce110_stream_encoder_construct(enc110, ctx, ctx->dc_bios, eng_id,
-                                       &stream_enc_regs[eng_id], &se_shift, &se_mask);
-       return &enc110->base;
-}
-
-#define SRII(reg_name, block, id)\
-       .reg_name[id] = mm ## block ## id ## _ ## reg_name
-
-static const struct dce_hwseq_registers hwseq_reg = {
-               HWSEQ_DCE10_REG_LIST()
-};
-
-static const struct dce_hwseq_shift hwseq_shift = {
-               HWSEQ_DCE10_MASK_SH_LIST(__SHIFT)
-};
-
-static const struct dce_hwseq_mask hwseq_mask = {
-               HWSEQ_DCE10_MASK_SH_LIST(_MASK)
-};
-
-static struct dce_hwseq *dce100_hwseq_create(
-       struct dc_context *ctx)
-{
-       struct dce_hwseq *hws = kzalloc(sizeof(struct dce_hwseq), GFP_KERNEL);
-
-       if (hws) {
-               hws->ctx = ctx;
-               hws->regs = &hwseq_reg;
-               hws->shifts = &hwseq_shift;
-               hws->masks = &hwseq_mask;
-       }
-       return hws;
-}
-
-static const struct resource_create_funcs res_create_funcs = {
-       .read_dce_straps = read_dce_straps,
-       .create_audio = create_audio,
-       .create_stream_encoder = dce100_stream_encoder_create,
-       .create_hwseq = dce100_hwseq_create,
-};
-
-#define mi_inst_regs(id) { \
-       MI_DCE8_REG_LIST(id), \
-       .MC_HUB_RDREQ_DMIF_LIMIT = mmMC_HUB_RDREQ_DMIF_LIMIT \
-}
-static const struct dce_mem_input_registers mi_regs[] = {
-               mi_inst_regs(0),
-               mi_inst_regs(1),
-               mi_inst_regs(2),
-               mi_inst_regs(3),
-               mi_inst_regs(4),
-               mi_inst_regs(5),
-};
-
-static const struct dce_mem_input_shift mi_shifts = {
-               MI_DCE8_MASK_SH_LIST(__SHIFT),
-               .ENABLE = MC_HUB_RDREQ_DMIF_LIMIT__ENABLE__SHIFT
-};
-
-static const struct dce_mem_input_mask mi_masks = {
-               MI_DCE8_MASK_SH_LIST(_MASK),
-               .ENABLE = MC_HUB_RDREQ_DMIF_LIMIT__ENABLE_MASK
-};
-
-static const struct dce110_aux_registers_shift aux_shift = {
-       DCE10_AUX_MASK_SH_LIST(__SHIFT)
-};
-
-static const struct dce110_aux_registers_mask aux_mask = {
-       DCE10_AUX_MASK_SH_LIST(_MASK)
-};
-
-static struct mem_input *dce100_mem_input_create(
-       struct dc_context *ctx,
-       uint32_t inst)
-{
-       struct dce_mem_input *dce_mi = kzalloc(sizeof(struct dce_mem_input),
-                                              GFP_KERNEL);
-
-       if (!dce_mi) {
-               BREAK_TO_DEBUGGER();
-               return NULL;
-       }
-
-       dce_mem_input_construct(dce_mi, ctx, inst, &mi_regs[inst], &mi_shifts, &mi_masks);
-       dce_mi->wa.single_head_rdreq_dmif_limit = 2;
-       return &dce_mi->base;
-}
-
-static void dce100_transform_destroy(struct transform **xfm)
-{
-       kfree(TO_DCE_TRANSFORM(*xfm));
-       *xfm = NULL;
-}
-
-static struct transform *dce100_transform_create(
-       struct dc_context *ctx,
-       uint32_t inst)
-{
-       struct dce_transform *transform =
-               kzalloc(sizeof(struct dce_transform), GFP_KERNEL);
-
-       if (!transform)
-               return NULL;
-
-       dce_transform_construct(transform, ctx, inst,
-                               &xfm_regs[inst], &xfm_shift, &xfm_mask);
-       return &transform->base;
-}
-
-static struct input_pixel_processor *dce100_ipp_create(
-       struct dc_context *ctx, uint32_t inst)
-{
-       struct dce_ipp *ipp = kzalloc(sizeof(struct dce_ipp), GFP_KERNEL);
-
-       if (!ipp) {
-               BREAK_TO_DEBUGGER();
-               return NULL;
-       }
-
-       dce_ipp_construct(ipp, ctx, inst,
-                       &ipp_regs[inst], &ipp_shift, &ipp_mask);
-       return &ipp->base;
-}
-
-static const struct encoder_feature_support link_enc_feature = {
-               .max_hdmi_deep_color = COLOR_DEPTH_121212,
-               .max_hdmi_pixel_clock = 300000,
-               .flags.bits.IS_HBR2_CAPABLE = true,
-               .flags.bits.IS_TPS3_CAPABLE = true
-};
-
-static struct link_encoder *dce100_link_encoder_create(
-       struct dc_context *ctx,
-       const struct encoder_init_data *enc_init_data)
-{
-       struct dce110_link_encoder *enc110 =
-               kzalloc(sizeof(struct dce110_link_encoder), GFP_KERNEL);
-       int link_regs_id;
-
-       if (!enc110)
-               return NULL;
-
-       link_regs_id =
-               map_transmitter_id_to_phy_instance(enc_init_data->transmitter);
-
-       dce110_link_encoder_construct(enc110,
-                                     enc_init_data,
-                                     &link_enc_feature,
-                                     &link_enc_regs[link_regs_id],
-                                     &link_enc_aux_regs[enc_init_data->channel - 1],
-                                     &link_enc_hpd_regs[enc_init_data->hpd_source]);
-       return &enc110->base;
-}
-
-static struct panel_cntl *dce100_panel_cntl_create(const struct panel_cntl_init_data *init_data)
-{
-       struct dce_panel_cntl *panel_cntl =
-               kzalloc(sizeof(struct dce_panel_cntl), GFP_KERNEL);
-
-       if (!panel_cntl)
-               return NULL;
-
-       dce_panel_cntl_construct(panel_cntl,
-                       init_data,
-                       &panel_cntl_regs[init_data->inst],
-                       &panel_cntl_shift,
-                       &panel_cntl_mask);
-
-       return &panel_cntl->base;
-}
-
-static struct output_pixel_processor *dce100_opp_create(
-       struct dc_context *ctx,
-       uint32_t inst)
-{
-       struct dce110_opp *opp =
-               kzalloc(sizeof(struct dce110_opp), GFP_KERNEL);
-
-       if (!opp)
-               return NULL;
-
-       dce110_opp_construct(opp,
-                            ctx, inst, &opp_regs[inst], &opp_shift, &opp_mask);
-       return &opp->base;
-}
-
-static struct dce_aux *dce100_aux_engine_create(
-       struct dc_context *ctx,
-       uint32_t inst)
-{
-       struct aux_engine_dce110 *aux_engine =
-               kzalloc(sizeof(struct aux_engine_dce110), GFP_KERNEL);
-
-       if (!aux_engine)
-               return NULL;
-
-       dce110_aux_engine_construct(aux_engine, ctx, inst,
-                                   SW_AUX_TIMEOUT_PERIOD_MULTIPLIER * AUX_TIMEOUT_PERIOD,
-                                   &aux_engine_regs[inst],
-                                       &aux_mask,
-                                       &aux_shift,
-                                       ctx->dc->caps.extended_aux_timeout_support);
-
-       return &aux_engine->base;
-}
-#define i2c_inst_regs(id) { I2C_HW_ENGINE_COMMON_REG_LIST(id) }
-
-static const struct dce_i2c_registers i2c_hw_regs[] = {
-               i2c_inst_regs(1),
-               i2c_inst_regs(2),
-               i2c_inst_regs(3),
-               i2c_inst_regs(4),
-               i2c_inst_regs(5),
-               i2c_inst_regs(6),
-};
-
-static const struct dce_i2c_shift i2c_shifts = {
-               I2C_COMMON_MASK_SH_LIST_DCE_COMMON_BASE(__SHIFT)
-};
-
-static const struct dce_i2c_mask i2c_masks = {
-               I2C_COMMON_MASK_SH_LIST_DCE_COMMON_BASE(_MASK)
-};
-
-static struct dce_i2c_hw *dce100_i2c_hw_create(
-       struct dc_context *ctx,
-       uint32_t inst)
-{
-       struct dce_i2c_hw *dce_i2c_hw =
-               kzalloc(sizeof(struct dce_i2c_hw), GFP_KERNEL);
-
-       if (!dce_i2c_hw)
-               return NULL;
-
-       dce100_i2c_hw_construct(dce_i2c_hw, ctx, inst,
-                                   &i2c_hw_regs[inst], &i2c_shifts, &i2c_masks);
-
-       return dce_i2c_hw;
-}
-static struct clock_source *dce100_clock_source_create(
-       struct dc_context *ctx,
-       struct dc_bios *bios,
-       enum clock_source_id id,
-       const struct dce110_clk_src_regs *regs,
-       bool dp_clk_src)
-{
-       struct dce110_clk_src *clk_src =
-               kzalloc(sizeof(struct dce110_clk_src), GFP_KERNEL);
-
-       if (!clk_src)
-               return NULL;
-
-       if (dce110_clk_src_construct(clk_src, ctx, bios, id,
-                       regs, &cs_shift, &cs_mask)) {
-               clk_src->base.dp_clk_src = dp_clk_src;
-               return &clk_src->base;
-       }
-
-       kfree(clk_src);
-       BREAK_TO_DEBUGGER();
-       return NULL;
-}
-
-static void dce100_clock_source_destroy(struct clock_source **clk_src)
-{
-       kfree(TO_DCE110_CLK_SRC(*clk_src));
-       *clk_src = NULL;
-}
-
-static void dce100_resource_destruct(struct dce110_resource_pool *pool)
-{
-       unsigned int i;
-
-       for (i = 0; i < pool->base.pipe_count; i++) {
-               if (pool->base.opps[i] != NULL)
-                       dce110_opp_destroy(&pool->base.opps[i]);
-
-               if (pool->base.transforms[i] != NULL)
-                       dce100_transform_destroy(&pool->base.transforms[i]);
-
-               if (pool->base.ipps[i] != NULL)
-                       dce_ipp_destroy(&pool->base.ipps[i]);
-
-               if (pool->base.mis[i] != NULL) {
-                       kfree(TO_DCE_MEM_INPUT(pool->base.mis[i]));
-                       pool->base.mis[i] = NULL;
-               }
-
-               if (pool->base.timing_generators[i] != NULL)    {
-                       kfree(DCE110TG_FROM_TG(pool->base.timing_generators[i]));
-                       pool->base.timing_generators[i] = NULL;
-               }
-       }
-
-       for (i = 0; i < pool->base.res_cap->num_ddc; i++) {
-               if (pool->base.engines[i] != NULL)
-                       dce110_engine_destroy(&pool->base.engines[i]);
-               if (pool->base.hw_i2cs[i] != NULL) {
-                       kfree(pool->base.hw_i2cs[i]);
-                       pool->base.hw_i2cs[i] = NULL;
-               }
-               if (pool->base.sw_i2cs[i] != NULL) {
-                       kfree(pool->base.sw_i2cs[i]);
-                       pool->base.sw_i2cs[i] = NULL;
-               }
-       }
-
-       for (i = 0; i < pool->base.stream_enc_count; i++) {
-               if (pool->base.stream_enc[i] != NULL)
-                       kfree(DCE110STRENC_FROM_STRENC(pool->base.stream_enc[i]));
-       }
-
-       for (i = 0; i < pool->base.clk_src_count; i++) {
-               if (pool->base.clock_sources[i] != NULL)
-                       dce100_clock_source_destroy(&pool->base.clock_sources[i]);
-       }
-
-       if (pool->base.dp_clock_source != NULL)
-               dce100_clock_source_destroy(&pool->base.dp_clock_source);
-
-       for (i = 0; i < pool->base.audio_count; i++)    {
-               if (pool->base.audios[i] != NULL)
-                       dce_aud_destroy(&pool->base.audios[i]);
-       }
-
-       if (pool->base.abm != NULL)
-                               dce_abm_destroy(&pool->base.abm);
-
-       if (pool->base.dmcu != NULL)
-                       dce_dmcu_destroy(&pool->base.dmcu);
-
-       if (pool->base.irqs != NULL)
-               dal_irq_service_destroy(&pool->base.irqs);
-}
-
-static enum dc_status build_mapped_resource(
-               const struct dc  *dc,
-               struct dc_state *context,
-               struct dc_stream_state *stream)
-{
-       struct pipe_ctx *pipe_ctx = resource_get_otg_master_for_stream(&context->res_ctx, stream);
-
-       if (!pipe_ctx)
-               return DC_ERROR_UNEXPECTED;
-
-       dce110_resource_build_pipe_hw_param(pipe_ctx);
-
-       resource_build_info_frame(pipe_ctx);
-
-       return DC_OK;
-}
-
-static bool dce100_validate_bandwidth(
-       struct dc  *dc,
-       struct dc_state *context,
-       bool fast_validate)
-{
-       int i;
-       bool at_least_one_pipe = false;
-
-       for (i = 0; i < dc->res_pool->pipe_count; i++) {
-               if (context->res_ctx.pipe_ctx[i].stream)
-                       at_least_one_pipe = true;
-       }
-
-       if (at_least_one_pipe) {
-               /* TODO implement when needed but for now hardcode max value*/
-               context->bw_ctx.bw.dce.dispclk_khz = 681000;
-               context->bw_ctx.bw.dce.yclk_khz = 250000 * MEMORY_TYPE_MULTIPLIER_CZ;
-       } else {
-               context->bw_ctx.bw.dce.dispclk_khz = 0;
-               context->bw_ctx.bw.dce.yclk_khz = 0;
-       }
-
-       return true;
-}
-
-static bool dce100_validate_surface_sets(
-               struct dc_state *context)
-{
-       int i;
-
-       for (i = 0; i < context->stream_count; i++) {
-               if (context->stream_status[i].plane_count == 0)
-                       continue;
-
-               if (context->stream_status[i].plane_count > 1)
-                       return false;
-
-               if (context->stream_status[i].plane_states[0]->format
-                               >= SURFACE_PIXEL_FORMAT_VIDEO_BEGIN)
-                       return false;
-       }
-
-       return true;
-}
-
-static enum dc_status dce100_validate_global(
-               struct dc  *dc,
-               struct dc_state *context)
-{
-       if (!dce100_validate_surface_sets(context))
-               return DC_FAIL_SURFACE_VALIDATE;
-
-       return DC_OK;
-}
-
-enum dc_status dce100_add_stream_to_ctx(
-               struct dc *dc,
-               struct dc_state *new_ctx,
-               struct dc_stream_state *dc_stream)
-{
-       enum dc_status result = DC_ERROR_UNEXPECTED;
-
-       result = resource_map_pool_resources(dc, new_ctx, dc_stream);
-
-       if (result == DC_OK)
-               result = resource_map_clock_resources(dc, new_ctx, dc_stream);
-
-       if (result == DC_OK)
-               result = build_mapped_resource(dc, new_ctx, dc_stream);
-
-       return result;
-}
-
-static void dce100_destroy_resource_pool(struct resource_pool **pool)
-{
-       struct dce110_resource_pool *dce110_pool = TO_DCE110_RES_POOL(*pool);
-
-       dce100_resource_destruct(dce110_pool);
-       kfree(dce110_pool);
-       *pool = NULL;
-}
-
-enum dc_status dce100_validate_plane(const struct dc_plane_state *plane_state, struct dc_caps *caps)
-{
-
-       if (plane_state->format < SURFACE_PIXEL_FORMAT_VIDEO_BEGIN)
-               return DC_OK;
-
-       return DC_FAIL_SURFACE_VALIDATE;
-}
-
-struct stream_encoder *dce100_find_first_free_match_stream_enc_for_link(
-               struct resource_context *res_ctx,
-               const struct resource_pool *pool,
-               struct dc_stream_state *stream)
-{
-       int i;
-       int j = -1;
-       struct dc_link *link = stream->link;
-
-       for (i = 0; i < pool->stream_enc_count; i++) {
-               if (!res_ctx->is_stream_enc_acquired[i] &&
-                               pool->stream_enc[i]) {
-                       /* Store first available for MST second display
-                        * in daisy chain use case
-                        */
-                       j = i;
-                       if (pool->stream_enc[i]->id ==
-                                       link->link_enc->preferred_engine)
-                               return pool->stream_enc[i];
-               }
-       }
-
-       /*
-        * below can happen in cases when stream encoder is acquired:
-        * 1) for second MST display in chain, so preferred engine already
-        * acquired;
-        * 2) for another link, which preferred engine already acquired by any
-        * MST configuration.
-        *
-        * If signal is of DP type and preferred engine not found, return last available
-        *
-        * TODO - This is just a patch up and a generic solution is
-        * required for non DP connectors.
-        */
-
-       if (j >= 0 && link->connector_signal == SIGNAL_TYPE_DISPLAY_PORT)
-               return pool->stream_enc[j];
-
-       return NULL;
-}
-
-static const struct resource_funcs dce100_res_pool_funcs = {
-       .destroy = dce100_destroy_resource_pool,
-       .link_enc_create = dce100_link_encoder_create,
-       .panel_cntl_create = dce100_panel_cntl_create,
-       .validate_bandwidth = dce100_validate_bandwidth,
-       .validate_plane = dce100_validate_plane,
-       .add_stream_to_ctx = dce100_add_stream_to_ctx,
-       .validate_global = dce100_validate_global,
-       .find_first_free_match_stream_enc_for_link = dce100_find_first_free_match_stream_enc_for_link
-};
-
-static bool dce100_resource_construct(
-       uint8_t num_virtual_links,
-       struct dc  *dc,
-       struct dce110_resource_pool *pool)
-{
-       unsigned int i;
-       struct dc_context *ctx = dc->ctx;
-       struct dc_bios *bp;
-
-       ctx->dc_bios->regs = &bios_regs;
-
-       pool->base.res_cap = &res_cap;
-       pool->base.funcs = &dce100_res_pool_funcs;
-       pool->base.underlay_pipe_index = NO_UNDERLAY_PIPE;
-
-       bp = ctx->dc_bios;
-
-       if (bp->fw_info_valid && bp->fw_info.external_clock_source_frequency_for_dp != 0) {
-               pool->base.dp_clock_source =
-                               dce100_clock_source_create(ctx, bp, CLOCK_SOURCE_ID_EXTERNAL, NULL, true);
-
-               pool->base.clock_sources[0] =
-                               dce100_clock_source_create(ctx, bp, CLOCK_SOURCE_ID_PLL0, &clk_src_regs[0], false);
-               pool->base.clock_sources[1] =
-                               dce100_clock_source_create(ctx, bp, CLOCK_SOURCE_ID_PLL1, &clk_src_regs[1], false);
-               pool->base.clock_sources[2] =
-                               dce100_clock_source_create(ctx, bp, CLOCK_SOURCE_ID_PLL2, &clk_src_regs[2], false);
-               pool->base.clk_src_count = 3;
-
-       } else {
-               pool->base.dp_clock_source =
-                               dce100_clock_source_create(ctx, bp, CLOCK_SOURCE_ID_PLL0, &clk_src_regs[0], true);
-
-               pool->base.clock_sources[0] =
-                               dce100_clock_source_create(ctx, bp, CLOCK_SOURCE_ID_PLL1, &clk_src_regs[1], false);
-               pool->base.clock_sources[1] =
-                               dce100_clock_source_create(ctx, bp, CLOCK_SOURCE_ID_PLL2, &clk_src_regs[2], false);
-               pool->base.clk_src_count = 2;
-       }
-
-       if (pool->base.dp_clock_source == NULL) {
-               dm_error("DC: failed to create dp clock source!\n");
-               BREAK_TO_DEBUGGER();
-               goto res_create_fail;
-       }
-
-       for (i = 0; i < pool->base.clk_src_count; i++) {
-               if (pool->base.clock_sources[i] == NULL) {
-                       dm_error("DC: failed to create clock sources!\n");
-                       BREAK_TO_DEBUGGER();
-                       goto res_create_fail;
-               }
-       }
-
-       pool->base.dmcu = dce_dmcu_create(ctx,
-                       &dmcu_regs,
-                       &dmcu_shift,
-                       &dmcu_mask);
-       if (pool->base.dmcu == NULL) {
-               dm_error("DC: failed to create dmcu!\n");
-               BREAK_TO_DEBUGGER();
-               goto res_create_fail;
-       }
-
-       pool->base.abm = dce_abm_create(ctx,
-                               &abm_regs,
-                               &abm_shift,
-                               &abm_mask);
-       if (pool->base.abm == NULL) {
-               dm_error("DC: failed to create abm!\n");
-               BREAK_TO_DEBUGGER();
-               goto res_create_fail;
-       }
-
-       {
-               struct irq_service_init_data init_data;
-               init_data.ctx = dc->ctx;
-               pool->base.irqs = dal_irq_service_dce110_create(&init_data);
-               if (!pool->base.irqs)
-                       goto res_create_fail;
-       }
-
-       /*************************************************
-       *  Resource + asic cap harcoding                *
-       *************************************************/
-       pool->base.underlay_pipe_index = NO_UNDERLAY_PIPE;
-       pool->base.pipe_count = res_cap.num_timing_generator;
-       pool->base.timing_generator_count = pool->base.res_cap->num_timing_generator;
-       dc->caps.max_downscale_ratio = 200;
-       dc->caps.i2c_speed_in_khz = 40;
-       dc->caps.i2c_speed_in_khz = 40;
-       dc->caps.max_cursor_size = 128;
-       dc->caps.min_horizontal_blanking_period = 80;
-       dc->caps.dual_link_dvi = true;
-       dc->caps.disable_dp_clk_share = true;
-       dc->caps.extended_aux_timeout_support = false;
-       dc->debug = debug_defaults;
-
-       for (i = 0; i < pool->base.pipe_count; i++) {
-               pool->base.timing_generators[i] =
-                       dce100_timing_generator_create(
-                               ctx,
-                               i,
-                               &dce100_tg_offsets[i]);
-               if (pool->base.timing_generators[i] == NULL) {
-                       BREAK_TO_DEBUGGER();
-                       dm_error("DC: failed to create tg!\n");
-                       goto res_create_fail;
-               }
-
-               pool->base.mis[i] = dce100_mem_input_create(ctx, i);
-               if (pool->base.mis[i] == NULL) {
-                       BREAK_TO_DEBUGGER();
-                       dm_error(
-                               "DC: failed to create memory input!\n");
-                       goto res_create_fail;
-               }
-
-               pool->base.ipps[i] = dce100_ipp_create(ctx, i);
-               if (pool->base.ipps[i] == NULL) {
-                       BREAK_TO_DEBUGGER();
-                       dm_error(
-                               "DC: failed to create input pixel processor!\n");
-                       goto res_create_fail;
-               }
-
-               pool->base.transforms[i] = dce100_transform_create(ctx, i);
-               if (pool->base.transforms[i] == NULL) {
-                       BREAK_TO_DEBUGGER();
-                       dm_error(
-                               "DC: failed to create transform!\n");
-                       goto res_create_fail;
-               }
-
-               pool->base.opps[i] = dce100_opp_create(ctx, i);
-               if (pool->base.opps[i] == NULL) {
-                       BREAK_TO_DEBUGGER();
-                       dm_error(
-                               "DC: failed to create output pixel processor!\n");
-                       goto res_create_fail;
-               }
-       }
-
-       for (i = 0; i < pool->base.res_cap->num_ddc; i++) {
-               pool->base.engines[i] = dce100_aux_engine_create(ctx, i);
-               if (pool->base.engines[i] == NULL) {
-                       BREAK_TO_DEBUGGER();
-                       dm_error(
-                               "DC:failed to create aux engine!!\n");
-                       goto res_create_fail;
-               }
-               pool->base.hw_i2cs[i] = dce100_i2c_hw_create(ctx, i);
-               if (pool->base.hw_i2cs[i] == NULL) {
-                       BREAK_TO_DEBUGGER();
-                       dm_error(
-                               "DC:failed to create i2c engine!!\n");
-                       goto res_create_fail;
-               }
-               pool->base.sw_i2cs[i] = NULL;
-       }
-
-       dc->caps.max_planes =  pool->base.pipe_count;
-
-       for (i = 0; i < dc->caps.max_planes; ++i)
-               dc->caps.planes[i] = plane_cap;
-
-       if (!resource_construct(num_virtual_links, dc, &pool->base,
-                       &res_create_funcs))
-               goto res_create_fail;
-
-       /* Create hardware sequencer */
-       dce100_hw_sequencer_construct(dc);
-       return true;
-
-res_create_fail:
-       dce100_resource_destruct(pool);
-
-       return false;
-}
-
-struct resource_pool *dce100_create_resource_pool(
-       uint8_t num_virtual_links,
-       struct dc  *dc)
-{
-       struct dce110_resource_pool *pool =
-               kzalloc(sizeof(struct dce110_resource_pool), GFP_KERNEL);
-
-       if (!pool)
-               return NULL;
-
-       if (dce100_resource_construct(num_virtual_links, dc, pool))
-               return &pool->base;
-
-       kfree(pool);
-       BREAK_TO_DEBUGGER();
-       return NULL;
-}
-
diff --git a/drivers/gpu/drm/amd/display/dc/dce100/dce100_resource.h b/drivers/gpu/drm/amd/display/dc/dce100/dce100_resource.h
deleted file mode 100644 (file)
index fecab7c..0000000
+++ /dev/null
@@ -1,54 +0,0 @@
-/*
- * Copyright 2017 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.
- *
- *
- */
-/*
- * dce100_resource.h
- *
- *  Created on: 2016-01-20
- *      Author: qyang
- */
-
-#ifndef DCE100_RESOURCE_H_
-#define DCE100_RESOURCE_H_
-
-struct dc;
-struct resource_pool;
-struct dc_validation_set;
-
-struct resource_pool *dce100_create_resource_pool(
-       uint8_t num_virtual_links,
-       struct dc *dc);
-
-enum dc_status dce100_validate_plane(const struct dc_plane_state *plane_state, struct dc_caps *caps);
-
-enum dc_status dce100_add_stream_to_ctx(
-               struct dc *dc,
-               struct dc_state *new_ctx,
-               struct dc_stream_state *dc_stream);
-
-struct stream_encoder *dce100_find_first_free_match_stream_enc_for_link(
-               struct resource_context *res_ctx,
-               const struct resource_pool *pool,
-               struct dc_stream_state *stream);
-
-#endif /* DCE100_RESOURCE_H_ */
index 695a50ed5ad2684dd640a42714b351e0ed0bf150..f0777d61c2cbb6b93d689392a097da89c80b5ff2 100644 (file)
@@ -26,8 +26,8 @@
 CFLAGS_$(AMDDALPATH)/dc/dce110/dce110_resource.o = $(call cc-disable-warning, override-init)
 
 DCE110 = dce110_timing_generator.o \
-dce110_compressor.o dce110_resource.o \
-dce110_opp_regamma_v.o dce110_opp_csc_v.o dce110_timing_generator_v.o \
+dce110_compressor.o dce110_opp_regamma_v.o \
+dce110_opp_csc_v.o dce110_timing_generator_v.o \
 dce110_mem_input_v.o dce110_opp_v.o dce110_transform_v.o
 
 AMD_DAL_DCE110 = $(addprefix $(AMDDALPATH)/dc/dce110/,$(DCE110))
diff --git a/drivers/gpu/drm/amd/display/dc/dce110/dce110_resource.c b/drivers/gpu/drm/amd/display/dc/dce110/dce110_resource.c
deleted file mode 100644 (file)
index fe518fd..0000000
+++ /dev/null
@@ -1,1551 +0,0 @@
-/*
- * Copyright 2012-15 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 "dm_services.h"
-
-#include "link_encoder.h"
-#include "stream_encoder.h"
-
-#include "resource.h"
-#include "dce110/dce110_resource.h"
-#include "include/irq_service_interface.h"
-#include "dce/dce_audio.h"
-#include "dce110/dce110_timing_generator.h"
-#include "irq/dce110/irq_service_dce110.h"
-#include "dce110/dce110_timing_generator_v.h"
-#include "dce/dce_link_encoder.h"
-#include "dce/dce_stream_encoder.h"
-#include "dce/dce_mem_input.h"
-#include "dce110/dce110_mem_input_v.h"
-#include "dce/dce_ipp.h"
-#include "dce/dce_transform.h"
-#include "dce110/dce110_transform_v.h"
-#include "dce/dce_opp.h"
-#include "dce110/dce110_opp_v.h"
-#include "dce/dce_clock_source.h"
-#include "dce/dce_hwseq.h"
-#include "dce110/dce110_hwseq.h"
-#include "dce/dce_aux.h"
-#include "dce/dce_abm.h"
-#include "dce/dce_dmcu.h"
-#include "dce/dce_i2c.h"
-#include "dce/dce_panel_cntl.h"
-
-#define DC_LOGGER \
-               dc->ctx->logger
-
-#include "dce110/dce110_compressor.h"
-
-#include "reg_helper.h"
-
-#include "dce/dce_11_0_d.h"
-#include "dce/dce_11_0_sh_mask.h"
-
-#ifndef mmMC_HUB_RDREQ_DMIF_LIMIT
-#include "gmc/gmc_8_2_d.h"
-#include "gmc/gmc_8_2_sh_mask.h"
-#endif
-
-#ifndef mmDP_DPHY_INTERNAL_CTRL
-       #define mmDP_DPHY_INTERNAL_CTRL 0x4aa7
-       #define mmDP0_DP_DPHY_INTERNAL_CTRL 0x4aa7
-       #define mmDP1_DP_DPHY_INTERNAL_CTRL 0x4ba7
-       #define mmDP2_DP_DPHY_INTERNAL_CTRL 0x4ca7
-       #define mmDP3_DP_DPHY_INTERNAL_CTRL 0x4da7
-       #define mmDP4_DP_DPHY_INTERNAL_CTRL 0x4ea7
-       #define mmDP5_DP_DPHY_INTERNAL_CTRL 0x4fa7
-       #define mmDP6_DP_DPHY_INTERNAL_CTRL 0x54a7
-       #define mmDP7_DP_DPHY_INTERNAL_CTRL 0x56a7
-       #define mmDP8_DP_DPHY_INTERNAL_CTRL 0x57a7
-#endif
-
-#ifndef mmBIOS_SCRATCH_2
-       #define mmBIOS_SCRATCH_2 0x05CB
-       #define mmBIOS_SCRATCH_3 0x05CC
-       #define mmBIOS_SCRATCH_6 0x05CF
-#endif
-
-#ifndef mmDP_DPHY_BS_SR_SWAP_CNTL
-       #define mmDP_DPHY_BS_SR_SWAP_CNTL                       0x4ADC
-       #define mmDP0_DP_DPHY_BS_SR_SWAP_CNTL                   0x4ADC
-       #define mmDP1_DP_DPHY_BS_SR_SWAP_CNTL                   0x4BDC
-       #define mmDP2_DP_DPHY_BS_SR_SWAP_CNTL                   0x4CDC
-       #define mmDP3_DP_DPHY_BS_SR_SWAP_CNTL                   0x4DDC
-       #define mmDP4_DP_DPHY_BS_SR_SWAP_CNTL                   0x4EDC
-       #define mmDP5_DP_DPHY_BS_SR_SWAP_CNTL                   0x4FDC
-       #define mmDP6_DP_DPHY_BS_SR_SWAP_CNTL                   0x54DC
-#endif
-
-#ifndef mmDP_DPHY_FAST_TRAINING
-       #define mmDP_DPHY_FAST_TRAINING                         0x4ABC
-       #define mmDP0_DP_DPHY_FAST_TRAINING                     0x4ABC
-       #define mmDP1_DP_DPHY_FAST_TRAINING                     0x4BBC
-       #define mmDP2_DP_DPHY_FAST_TRAINING                     0x4CBC
-       #define mmDP3_DP_DPHY_FAST_TRAINING                     0x4DBC
-       #define mmDP4_DP_DPHY_FAST_TRAINING                     0x4EBC
-       #define mmDP5_DP_DPHY_FAST_TRAINING                     0x4FBC
-       #define mmDP6_DP_DPHY_FAST_TRAINING                     0x54BC
-#endif
-
-#ifndef DPHY_RX_FAST_TRAINING_CAPABLE
-       #define DPHY_RX_FAST_TRAINING_CAPABLE 0x1
-#endif
-
-static const struct dce110_timing_generator_offsets dce110_tg_offsets[] = {
-       {
-               .crtc = (mmCRTC0_CRTC_CONTROL - mmCRTC_CONTROL),
-               .dcp =  (mmDCP0_GRPH_CONTROL - mmGRPH_CONTROL),
-       },
-       {
-               .crtc = (mmCRTC1_CRTC_CONTROL - mmCRTC_CONTROL),
-               .dcp = (mmDCP1_GRPH_CONTROL - mmGRPH_CONTROL),
-       },
-       {
-               .crtc = (mmCRTC2_CRTC_CONTROL - mmCRTC_CONTROL),
-               .dcp = (mmDCP2_GRPH_CONTROL - mmGRPH_CONTROL),
-       },
-       {
-               .crtc = (mmCRTC3_CRTC_CONTROL - mmCRTC_CONTROL),
-               .dcp =  (mmDCP3_GRPH_CONTROL - mmGRPH_CONTROL),
-       },
-       {
-               .crtc = (mmCRTC4_CRTC_CONTROL - mmCRTC_CONTROL),
-               .dcp = (mmDCP4_GRPH_CONTROL - mmGRPH_CONTROL),
-       },
-       {
-               .crtc = (mmCRTC5_CRTC_CONTROL - mmCRTC_CONTROL),
-               .dcp = (mmDCP5_GRPH_CONTROL - mmGRPH_CONTROL),
-       }
-};
-
-/* set register offset */
-#define SR(reg_name)\
-       .reg_name = mm ## reg_name
-
-/* set register offset with instance */
-#define SRI(reg_name, block, id)\
-       .reg_name = mm ## block ## id ## _ ## reg_name
-
-static const struct dce_dmcu_registers dmcu_regs = {
-               DMCU_DCE110_COMMON_REG_LIST()
-};
-
-static const struct dce_dmcu_shift dmcu_shift = {
-               DMCU_MASK_SH_LIST_DCE110(__SHIFT)
-};
-
-static const struct dce_dmcu_mask dmcu_mask = {
-               DMCU_MASK_SH_LIST_DCE110(_MASK)
-};
-
-static const struct dce_abm_registers abm_regs = {
-               ABM_DCE110_COMMON_REG_LIST()
-};
-
-static const struct dce_abm_shift abm_shift = {
-               ABM_MASK_SH_LIST_DCE110(__SHIFT)
-};
-
-static const struct dce_abm_mask abm_mask = {
-               ABM_MASK_SH_LIST_DCE110(_MASK)
-};
-
-#define ipp_regs(id)\
-[id] = {\
-               IPP_DCE110_REG_LIST_DCE_BASE(id)\
-}
-
-static const struct dce_ipp_registers ipp_regs[] = {
-               ipp_regs(0),
-               ipp_regs(1),
-               ipp_regs(2)
-};
-
-static const struct dce_ipp_shift ipp_shift = {
-               IPP_DCE100_MASK_SH_LIST_DCE_COMMON_BASE(__SHIFT)
-};
-
-static const struct dce_ipp_mask ipp_mask = {
-               IPP_DCE100_MASK_SH_LIST_DCE_COMMON_BASE(_MASK)
-};
-
-#define transform_regs(id)\
-[id] = {\
-               XFM_COMMON_REG_LIST_DCE110(id)\
-}
-
-static const struct dce_transform_registers xfm_regs[] = {
-               transform_regs(0),
-               transform_regs(1),
-               transform_regs(2)
-};
-
-static const struct dce_transform_shift xfm_shift = {
-               XFM_COMMON_MASK_SH_LIST_DCE110(__SHIFT)
-};
-
-static const struct dce_transform_mask xfm_mask = {
-               XFM_COMMON_MASK_SH_LIST_DCE110(_MASK)
-};
-
-#define aux_regs(id)\
-[id] = {\
-       AUX_REG_LIST(id)\
-}
-
-static const struct dce110_link_enc_aux_registers link_enc_aux_regs[] = {
-               aux_regs(0),
-               aux_regs(1),
-               aux_regs(2),
-               aux_regs(3),
-               aux_regs(4),
-               aux_regs(5)
-};
-
-#define hpd_regs(id)\
-[id] = {\
-       HPD_REG_LIST(id)\
-}
-
-static const struct dce110_link_enc_hpd_registers link_enc_hpd_regs[] = {
-               hpd_regs(0),
-               hpd_regs(1),
-               hpd_regs(2),
-               hpd_regs(3),
-               hpd_regs(4),
-               hpd_regs(5)
-};
-
-
-#define link_regs(id)\
-[id] = {\
-       LE_DCE110_REG_LIST(id)\
-}
-
-static const struct dce110_link_enc_registers link_enc_regs[] = {
-       link_regs(0),
-       link_regs(1),
-       link_regs(2),
-       link_regs(3),
-       link_regs(4),
-       link_regs(5),
-       link_regs(6),
-};
-
-#define stream_enc_regs(id)\
-[id] = {\
-       SE_COMMON_REG_LIST(id),\
-       .TMDS_CNTL = 0,\
-}
-
-static const struct dce110_stream_enc_registers stream_enc_regs[] = {
-       stream_enc_regs(0),
-       stream_enc_regs(1),
-       stream_enc_regs(2)
-};
-
-static const struct dce_stream_encoder_shift se_shift = {
-               SE_COMMON_MASK_SH_LIST_DCE110(__SHIFT)
-};
-
-static const struct dce_stream_encoder_mask se_mask = {
-               SE_COMMON_MASK_SH_LIST_DCE110(_MASK)
-};
-
-static const struct dce_panel_cntl_registers panel_cntl_regs[] = {
-       { DCE_PANEL_CNTL_REG_LIST() }
-};
-
-static const struct dce_panel_cntl_shift panel_cntl_shift = {
-       DCE_PANEL_CNTL_MASK_SH_LIST(__SHIFT)
-};
-
-static const struct dce_panel_cntl_mask panel_cntl_mask = {
-       DCE_PANEL_CNTL_MASK_SH_LIST(_MASK)
-};
-
-static const struct dce110_aux_registers_shift aux_shift = {
-       DCE_AUX_MASK_SH_LIST(__SHIFT)
-};
-
-static const struct dce110_aux_registers_mask aux_mask = {
-       DCE_AUX_MASK_SH_LIST(_MASK)
-};
-
-#define opp_regs(id)\
-[id] = {\
-       OPP_DCE_110_REG_LIST(id),\
-}
-
-static const struct dce_opp_registers opp_regs[] = {
-       opp_regs(0),
-       opp_regs(1),
-       opp_regs(2),
-       opp_regs(3),
-       opp_regs(4),
-       opp_regs(5)
-};
-
-static const struct dce_opp_shift opp_shift = {
-       OPP_COMMON_MASK_SH_LIST_DCE_110(__SHIFT)
-};
-
-static const struct dce_opp_mask opp_mask = {
-       OPP_COMMON_MASK_SH_LIST_DCE_110(_MASK)
-};
-
-#define aux_engine_regs(id)\
-[id] = {\
-       AUX_COMMON_REG_LIST(id), \
-       .AUX_RESET_MASK = 0 \
-}
-
-static const struct dce110_aux_registers aux_engine_regs[] = {
-               aux_engine_regs(0),
-               aux_engine_regs(1),
-               aux_engine_regs(2),
-               aux_engine_regs(3),
-               aux_engine_regs(4),
-               aux_engine_regs(5)
-};
-
-#define audio_regs(id)\
-[id] = {\
-       AUD_COMMON_REG_LIST(id)\
-}
-
-static const struct dce_audio_registers audio_regs[] = {
-       audio_regs(0),
-       audio_regs(1),
-       audio_regs(2),
-       audio_regs(3),
-       audio_regs(4),
-       audio_regs(5),
-       audio_regs(6),
-};
-
-static const struct dce_audio_shift audio_shift = {
-               AUD_COMMON_MASK_SH_LIST(__SHIFT)
-};
-
-static const struct dce_audio_mask audio_mask = {
-               AUD_COMMON_MASK_SH_LIST(_MASK)
-};
-
-/* AG TBD Needs to be reduced back to 3 pipes once dce10 hw sequencer implemented. */
-
-
-#define clk_src_regs(id)\
-[id] = {\
-       CS_COMMON_REG_LIST_DCE_100_110(id),\
-}
-
-static const struct dce110_clk_src_regs clk_src_regs[] = {
-       clk_src_regs(0),
-       clk_src_regs(1),
-       clk_src_regs(2)
-};
-
-static const struct dce110_clk_src_shift cs_shift = {
-               CS_COMMON_MASK_SH_LIST_DCE_COMMON_BASE(__SHIFT)
-};
-
-static const struct dce110_clk_src_mask cs_mask = {
-               CS_COMMON_MASK_SH_LIST_DCE_COMMON_BASE(_MASK)
-};
-
-static const struct bios_registers bios_regs = {
-       .BIOS_SCRATCH_3 = mmBIOS_SCRATCH_3,
-       .BIOS_SCRATCH_6 = mmBIOS_SCRATCH_6
-};
-
-static const struct resource_caps carrizo_resource_cap = {
-               .num_timing_generator = 3,
-               .num_video_plane = 1,
-               .num_audio = 3,
-               .num_stream_encoder = 3,
-               .num_pll = 2,
-               .num_ddc = 3,
-};
-
-static const struct resource_caps stoney_resource_cap = {
-               .num_timing_generator = 2,
-               .num_video_plane = 1,
-               .num_audio = 3,
-               .num_stream_encoder = 3,
-               .num_pll = 2,
-               .num_ddc = 3,
-};
-
-static const struct dc_plane_cap plane_cap = {
-               .type = DC_PLANE_TYPE_DCE_RGB,
-               .per_pixel_alpha = 1,
-
-               .pixel_format_support = {
-                               .argb8888 = true,
-                               .nv12 = false,
-                               .fp16 = true
-               },
-
-               .max_upscale_factor = {
-                               .argb8888 = 16000,
-                               .nv12 = 1,
-                               .fp16 = 1
-               },
-
-               .max_downscale_factor = {
-                               .argb8888 = 250,
-                               .nv12 = 1,
-                               .fp16 = 1
-               },
-               64,
-               64
-};
-
-static const struct dc_debug_options debug_defaults = {
-               .enable_legacy_fast_update = true,
-};
-
-static const struct dc_plane_cap underlay_plane_cap = {
-               .type = DC_PLANE_TYPE_DCE_UNDERLAY,
-               .per_pixel_alpha = 1,
-
-               .pixel_format_support = {
-                               .argb8888 = false,
-                               .nv12 = true,
-                               .fp16 = false
-               },
-
-               .max_upscale_factor = {
-                               .argb8888 = 1,
-                               .nv12 = 16000,
-                               .fp16 = 1
-               },
-
-               .max_downscale_factor = {
-                               .argb8888 = 1,
-                               .nv12 = 250,
-                               .fp16 = 1
-               },
-               64,
-               64
-};
-
-#define CTX  ctx
-#define REG(reg) mm ## reg
-
-#ifndef mmCC_DC_HDMI_STRAPS
-#define mmCC_DC_HDMI_STRAPS 0x4819
-#define CC_DC_HDMI_STRAPS__HDMI_DISABLE_MASK 0x40
-#define CC_DC_HDMI_STRAPS__HDMI_DISABLE__SHIFT 0x6
-#define CC_DC_HDMI_STRAPS__AUDIO_STREAM_NUMBER_MASK 0x700
-#define CC_DC_HDMI_STRAPS__AUDIO_STREAM_NUMBER__SHIFT 0x8
-#endif
-
-static int map_transmitter_id_to_phy_instance(
-       enum transmitter transmitter)
-{
-       switch (transmitter) {
-       case TRANSMITTER_UNIPHY_A:
-               return 0;
-       case TRANSMITTER_UNIPHY_B:
-               return 1;
-       case TRANSMITTER_UNIPHY_C:
-               return 2;
-       case TRANSMITTER_UNIPHY_D:
-               return 3;
-       case TRANSMITTER_UNIPHY_E:
-               return 4;
-       case TRANSMITTER_UNIPHY_F:
-               return 5;
-       case TRANSMITTER_UNIPHY_G:
-               return 6;
-       default:
-               ASSERT(0);
-               return 0;
-       }
-}
-
-static void read_dce_straps(
-       struct dc_context *ctx,
-       struct resource_straps *straps)
-{
-       REG_GET_2(CC_DC_HDMI_STRAPS,
-                       HDMI_DISABLE, &straps->hdmi_disable,
-                       AUDIO_STREAM_NUMBER, &straps->audio_stream_number);
-
-       REG_GET(DC_PINSTRAPS, DC_PINSTRAPS_AUDIO, &straps->dc_pinstraps_audio);
-}
-
-static struct audio *create_audio(
-               struct dc_context *ctx, unsigned int inst)
-{
-       return dce_audio_create(ctx, inst,
-                       &audio_regs[inst], &audio_shift, &audio_mask);
-}
-
-static struct timing_generator *dce110_timing_generator_create(
-               struct dc_context *ctx,
-               uint32_t instance,
-               const struct dce110_timing_generator_offsets *offsets)
-{
-       struct dce110_timing_generator *tg110 =
-               kzalloc(sizeof(struct dce110_timing_generator), GFP_KERNEL);
-
-       if (!tg110)
-               return NULL;
-
-       dce110_timing_generator_construct(tg110, ctx, instance, offsets);
-       return &tg110->base;
-}
-
-static struct stream_encoder *dce110_stream_encoder_create(
-       enum engine_id eng_id,
-       struct dc_context *ctx)
-{
-       struct dce110_stream_encoder *enc110 =
-               kzalloc(sizeof(struct dce110_stream_encoder), GFP_KERNEL);
-
-       if (!enc110)
-               return NULL;
-
-       dce110_stream_encoder_construct(enc110, ctx, ctx->dc_bios, eng_id,
-                                       &stream_enc_regs[eng_id],
-                                       &se_shift, &se_mask);
-       return &enc110->base;
-}
-
-#define SRII(reg_name, block, id)\
-       .reg_name[id] = mm ## block ## id ## _ ## reg_name
-
-static const struct dce_hwseq_registers hwseq_stoney_reg = {
-               HWSEQ_ST_REG_LIST()
-};
-
-static const struct dce_hwseq_registers hwseq_cz_reg = {
-               HWSEQ_CZ_REG_LIST()
-};
-
-static const struct dce_hwseq_shift hwseq_shift = {
-               HWSEQ_DCE11_MASK_SH_LIST(__SHIFT),
-};
-
-static const struct dce_hwseq_mask hwseq_mask = {
-               HWSEQ_DCE11_MASK_SH_LIST(_MASK),
-};
-
-static struct dce_hwseq *dce110_hwseq_create(
-       struct dc_context *ctx)
-{
-       struct dce_hwseq *hws = kzalloc(sizeof(struct dce_hwseq), GFP_KERNEL);
-
-       if (hws) {
-               hws->ctx = ctx;
-               hws->regs = ASIC_REV_IS_STONEY(ctx->asic_id.hw_internal_rev) ?
-                               &hwseq_stoney_reg : &hwseq_cz_reg;
-               hws->shifts = &hwseq_shift;
-               hws->masks = &hwseq_mask;
-               hws->wa.blnd_crtc_trigger = true;
-       }
-       return hws;
-}
-
-static const struct resource_create_funcs res_create_funcs = {
-       .read_dce_straps = read_dce_straps,
-       .create_audio = create_audio,
-       .create_stream_encoder = dce110_stream_encoder_create,
-       .create_hwseq = dce110_hwseq_create,
-};
-
-#define mi_inst_regs(id) { \
-       MI_DCE11_REG_LIST(id), \
-       .MC_HUB_RDREQ_DMIF_LIMIT = mmMC_HUB_RDREQ_DMIF_LIMIT \
-}
-static const struct dce_mem_input_registers mi_regs[] = {
-               mi_inst_regs(0),
-               mi_inst_regs(1),
-               mi_inst_regs(2),
-};
-
-static const struct dce_mem_input_shift mi_shifts = {
-               MI_DCE11_MASK_SH_LIST(__SHIFT),
-               .ENABLE = MC_HUB_RDREQ_DMIF_LIMIT__ENABLE__SHIFT
-};
-
-static const struct dce_mem_input_mask mi_masks = {
-               MI_DCE11_MASK_SH_LIST(_MASK),
-               .ENABLE = MC_HUB_RDREQ_DMIF_LIMIT__ENABLE_MASK
-};
-
-
-static struct mem_input *dce110_mem_input_create(
-       struct dc_context *ctx,
-       uint32_t inst)
-{
-       struct dce_mem_input *dce_mi = kzalloc(sizeof(struct dce_mem_input),
-                                              GFP_KERNEL);
-
-       if (!dce_mi) {
-               BREAK_TO_DEBUGGER();
-               return NULL;
-       }
-
-       dce_mem_input_construct(dce_mi, ctx, inst, &mi_regs[inst], &mi_shifts, &mi_masks);
-       dce_mi->wa.single_head_rdreq_dmif_limit = 3;
-       return &dce_mi->base;
-}
-
-static void dce110_transform_destroy(struct transform **xfm)
-{
-       kfree(TO_DCE_TRANSFORM(*xfm));
-       *xfm = NULL;
-}
-
-static struct transform *dce110_transform_create(
-       struct dc_context *ctx,
-       uint32_t inst)
-{
-       struct dce_transform *transform =
-               kzalloc(sizeof(struct dce_transform), GFP_KERNEL);
-
-       if (!transform)
-               return NULL;
-
-       dce_transform_construct(transform, ctx, inst,
-                               &xfm_regs[inst], &xfm_shift, &xfm_mask);
-       return &transform->base;
-}
-
-static struct input_pixel_processor *dce110_ipp_create(
-       struct dc_context *ctx, uint32_t inst)
-{
-       struct dce_ipp *ipp = kzalloc(sizeof(struct dce_ipp), GFP_KERNEL);
-
-       if (!ipp) {
-               BREAK_TO_DEBUGGER();
-               return NULL;
-       }
-
-       dce_ipp_construct(ipp, ctx, inst,
-                       &ipp_regs[inst], &ipp_shift, &ipp_mask);
-       return &ipp->base;
-}
-
-static const struct encoder_feature_support link_enc_feature = {
-               .max_hdmi_deep_color = COLOR_DEPTH_121212,
-               .max_hdmi_pixel_clock = 300000,
-               .flags.bits.IS_HBR2_CAPABLE = true,
-               .flags.bits.IS_TPS3_CAPABLE = true
-};
-
-static struct link_encoder *dce110_link_encoder_create(
-       struct dc_context *ctx,
-       const struct encoder_init_data *enc_init_data)
-{
-       struct dce110_link_encoder *enc110 =
-               kzalloc(sizeof(struct dce110_link_encoder), GFP_KERNEL);
-       int link_regs_id;
-
-       if (!enc110)
-               return NULL;
-
-       link_regs_id =
-               map_transmitter_id_to_phy_instance(enc_init_data->transmitter);
-
-       dce110_link_encoder_construct(enc110,
-                                     enc_init_data,
-                                     &link_enc_feature,
-                                     &link_enc_regs[link_regs_id],
-                                     &link_enc_aux_regs[enc_init_data->channel - 1],
-                                     &link_enc_hpd_regs[enc_init_data->hpd_source]);
-       return &enc110->base;
-}
-
-static struct panel_cntl *dce110_panel_cntl_create(const struct panel_cntl_init_data *init_data)
-{
-       struct dce_panel_cntl *panel_cntl =
-               kzalloc(sizeof(struct dce_panel_cntl), GFP_KERNEL);
-
-       if (!panel_cntl)
-               return NULL;
-
-       dce_panel_cntl_construct(panel_cntl,
-                       init_data,
-                       &panel_cntl_regs[init_data->inst],
-                       &panel_cntl_shift,
-                       &panel_cntl_mask);
-
-       return &panel_cntl->base;
-}
-
-static struct output_pixel_processor *dce110_opp_create(
-       struct dc_context *ctx,
-       uint32_t inst)
-{
-       struct dce110_opp *opp =
-               kzalloc(sizeof(struct dce110_opp), GFP_KERNEL);
-
-       if (!opp)
-               return NULL;
-
-       dce110_opp_construct(opp,
-                            ctx, inst, &opp_regs[inst], &opp_shift, &opp_mask);
-       return &opp->base;
-}
-
-static struct dce_aux *dce110_aux_engine_create(
-       struct dc_context *ctx,
-       uint32_t inst)
-{
-       struct aux_engine_dce110 *aux_engine =
-               kzalloc(sizeof(struct aux_engine_dce110), GFP_KERNEL);
-
-       if (!aux_engine)
-               return NULL;
-
-       dce110_aux_engine_construct(aux_engine, ctx, inst,
-                                   SW_AUX_TIMEOUT_PERIOD_MULTIPLIER * AUX_TIMEOUT_PERIOD,
-                                   &aux_engine_regs[inst],
-                                       &aux_mask,
-                                       &aux_shift,
-                                       ctx->dc->caps.extended_aux_timeout_support);
-
-       return &aux_engine->base;
-}
-#define i2c_inst_regs(id) { I2C_HW_ENGINE_COMMON_REG_LIST(id) }
-
-static const struct dce_i2c_registers i2c_hw_regs[] = {
-               i2c_inst_regs(1),
-               i2c_inst_regs(2),
-               i2c_inst_regs(3),
-               i2c_inst_regs(4),
-               i2c_inst_regs(5),
-               i2c_inst_regs(6),
-};
-
-static const struct dce_i2c_shift i2c_shifts = {
-               I2C_COMMON_MASK_SH_LIST_DCE110(__SHIFT)
-};
-
-static const struct dce_i2c_mask i2c_masks = {
-               I2C_COMMON_MASK_SH_LIST_DCE110(_MASK)
-};
-
-static struct dce_i2c_hw *dce110_i2c_hw_create(
-       struct dc_context *ctx,
-       uint32_t inst)
-{
-       struct dce_i2c_hw *dce_i2c_hw =
-               kzalloc(sizeof(struct dce_i2c_hw), GFP_KERNEL);
-
-       if (!dce_i2c_hw)
-               return NULL;
-
-       dce100_i2c_hw_construct(dce_i2c_hw, ctx, inst,
-                                   &i2c_hw_regs[inst], &i2c_shifts, &i2c_masks);
-
-       return dce_i2c_hw;
-}
-static struct clock_source *dce110_clock_source_create(
-       struct dc_context *ctx,
-       struct dc_bios *bios,
-       enum clock_source_id id,
-       const struct dce110_clk_src_regs *regs,
-       bool dp_clk_src)
-{
-       struct dce110_clk_src *clk_src =
-               kzalloc(sizeof(struct dce110_clk_src), GFP_KERNEL);
-
-       if (!clk_src)
-               return NULL;
-
-       if (dce110_clk_src_construct(clk_src, ctx, bios, id,
-                       regs, &cs_shift, &cs_mask)) {
-               clk_src->base.dp_clk_src = dp_clk_src;
-               return &clk_src->base;
-       }
-
-       kfree(clk_src);
-       BREAK_TO_DEBUGGER();
-       return NULL;
-}
-
-static void dce110_clock_source_destroy(struct clock_source **clk_src)
-{
-       struct dce110_clk_src *dce110_clk_src;
-
-       if (!clk_src)
-               return;
-
-       dce110_clk_src = TO_DCE110_CLK_SRC(*clk_src);
-
-       kfree(dce110_clk_src->dp_ss_params);
-       kfree(dce110_clk_src->hdmi_ss_params);
-       kfree(dce110_clk_src->dvi_ss_params);
-
-       kfree(dce110_clk_src);
-       *clk_src = NULL;
-}
-
-static void dce110_resource_destruct(struct dce110_resource_pool *pool)
-{
-       unsigned int i;
-
-       for (i = 0; i < pool->base.pipe_count; i++) {
-               if (pool->base.opps[i] != NULL)
-                       dce110_opp_destroy(&pool->base.opps[i]);
-
-               if (pool->base.transforms[i] != NULL)
-                       dce110_transform_destroy(&pool->base.transforms[i]);
-
-               if (pool->base.ipps[i] != NULL)
-                       dce_ipp_destroy(&pool->base.ipps[i]);
-
-               if (pool->base.mis[i] != NULL) {
-                       kfree(TO_DCE_MEM_INPUT(pool->base.mis[i]));
-                       pool->base.mis[i] = NULL;
-               }
-
-               if (pool->base.timing_generators[i] != NULL)    {
-                       kfree(DCE110TG_FROM_TG(pool->base.timing_generators[i]));
-                       pool->base.timing_generators[i] = NULL;
-               }
-       }
-
-       for (i = 0; i < pool->base.res_cap->num_ddc; i++) {
-               if (pool->base.engines[i] != NULL)
-                       dce110_engine_destroy(&pool->base.engines[i]);
-               if (pool->base.hw_i2cs[i] != NULL) {
-                       kfree(pool->base.hw_i2cs[i]);
-                       pool->base.hw_i2cs[i] = NULL;
-               }
-               if (pool->base.sw_i2cs[i] != NULL) {
-                       kfree(pool->base.sw_i2cs[i]);
-                       pool->base.sw_i2cs[i] = NULL;
-               }
-       }
-
-       for (i = 0; i < pool->base.stream_enc_count; i++) {
-               if (pool->base.stream_enc[i] != NULL)
-                       kfree(DCE110STRENC_FROM_STRENC(pool->base.stream_enc[i]));
-       }
-
-       for (i = 0; i < pool->base.clk_src_count; i++) {
-               if (pool->base.clock_sources[i] != NULL) {
-                       dce110_clock_source_destroy(&pool->base.clock_sources[i]);
-               }
-       }
-
-       if (pool->base.dp_clock_source != NULL)
-               dce110_clock_source_destroy(&pool->base.dp_clock_source);
-
-       for (i = 0; i < pool->base.audio_count; i++)    {
-               if (pool->base.audios[i] != NULL) {
-                       dce_aud_destroy(&pool->base.audios[i]);
-               }
-       }
-
-       if (pool->base.abm != NULL)
-               dce_abm_destroy(&pool->base.abm);
-
-       if (pool->base.dmcu != NULL)
-               dce_dmcu_destroy(&pool->base.dmcu);
-
-       if (pool->base.irqs != NULL) {
-               dal_irq_service_destroy(&pool->base.irqs);
-       }
-}
-
-
-static void get_pixel_clock_parameters(
-       const struct pipe_ctx *pipe_ctx,
-       struct pixel_clk_params *pixel_clk_params)
-{
-       const struct dc_stream_state *stream = pipe_ctx->stream;
-
-       /*TODO: is this halved for YCbCr 420? in that case we might want to move
-        * the pixel clock normalization for hdmi up to here instead of doing it
-        * in pll_adjust_pix_clk
-        */
-       pixel_clk_params->requested_pix_clk_100hz = stream->timing.pix_clk_100hz;
-       pixel_clk_params->encoder_object_id = stream->link->link_enc->id;
-       pixel_clk_params->signal_type = pipe_ctx->stream->signal;
-       pixel_clk_params->controller_id = pipe_ctx->stream_res.tg->inst + 1;
-       /* TODO: un-hardcode*/
-       pixel_clk_params->requested_sym_clk = LINK_RATE_LOW *
-                                               LINK_RATE_REF_FREQ_IN_KHZ;
-       pixel_clk_params->flags.ENABLE_SS = 0;
-       pixel_clk_params->color_depth =
-               stream->timing.display_color_depth;
-       pixel_clk_params->flags.DISPLAY_BLANKED = 1;
-       pixel_clk_params->flags.SUPPORT_YCBCR420 = (stream->timing.pixel_encoding ==
-                       PIXEL_ENCODING_YCBCR420);
-       pixel_clk_params->pixel_encoding = stream->timing.pixel_encoding;
-       if (stream->timing.pixel_encoding == PIXEL_ENCODING_YCBCR422) {
-               pixel_clk_params->color_depth = COLOR_DEPTH_888;
-       }
-       if (stream->timing.pixel_encoding == PIXEL_ENCODING_YCBCR420) {
-               pixel_clk_params->requested_pix_clk_100hz  = pixel_clk_params->requested_pix_clk_100hz / 2;
-       }
-       if (stream->timing.timing_3d_format == TIMING_3D_FORMAT_HW_FRAME_PACKING)
-               pixel_clk_params->requested_pix_clk_100hz *= 2;
-
-}
-
-void dce110_resource_build_pipe_hw_param(struct pipe_ctx *pipe_ctx)
-{
-       get_pixel_clock_parameters(pipe_ctx, &pipe_ctx->stream_res.pix_clk_params);
-       pipe_ctx->clock_source->funcs->get_pix_clk_dividers(
-               pipe_ctx->clock_source,
-               &pipe_ctx->stream_res.pix_clk_params,
-               &pipe_ctx->pll_settings);
-       resource_build_bit_depth_reduction_params(pipe_ctx->stream,
-                       &pipe_ctx->stream->bit_depth_params);
-       pipe_ctx->stream->clamping.pixel_encoding = pipe_ctx->stream->timing.pixel_encoding;
-}
-
-static bool is_surface_pixel_format_supported(struct pipe_ctx *pipe_ctx, unsigned int underlay_idx)
-{
-       if (pipe_ctx->pipe_idx != underlay_idx)
-               return true;
-       if (!pipe_ctx->plane_state)
-               return false;
-       if (pipe_ctx->plane_state->format < SURFACE_PIXEL_FORMAT_VIDEO_BEGIN)
-               return false;
-       return true;
-}
-
-static enum dc_status build_mapped_resource(
-               const struct dc *dc,
-               struct dc_state *context,
-               struct dc_stream_state *stream)
-{
-       struct pipe_ctx *pipe_ctx = resource_get_otg_master_for_stream(&context->res_ctx, stream);
-
-       if (!pipe_ctx)
-               return DC_ERROR_UNEXPECTED;
-
-       if (!is_surface_pixel_format_supported(pipe_ctx,
-                       dc->res_pool->underlay_pipe_index))
-               return DC_SURFACE_PIXEL_FORMAT_UNSUPPORTED;
-
-       dce110_resource_build_pipe_hw_param(pipe_ctx);
-
-       /* TODO: validate audio ASIC caps, encoder */
-
-       resource_build_info_frame(pipe_ctx);
-
-       return DC_OK;
-}
-
-static bool dce110_validate_bandwidth(
-       struct dc *dc,
-       struct dc_state *context,
-       bool fast_validate)
-{
-       bool result = false;
-
-       DC_LOG_BANDWIDTH_CALCS(
-               "%s: start",
-               __func__);
-
-       if (bw_calcs(
-                       dc->ctx,
-                       dc->bw_dceip,
-                       dc->bw_vbios,
-                       context->res_ctx.pipe_ctx,
-                       dc->res_pool->pipe_count,
-                       &context->bw_ctx.bw.dce))
-               result =  true;
-
-       if (!result)
-               DC_LOG_BANDWIDTH_VALIDATION("%s: %dx%d@%d Bandwidth validation failed!\n",
-                       __func__,
-                       context->streams[0]->timing.h_addressable,
-                       context->streams[0]->timing.v_addressable,
-                       context->streams[0]->timing.pix_clk_100hz / 10);
-
-       if (memcmp(&dc->current_state->bw_ctx.bw.dce,
-                       &context->bw_ctx.bw.dce, sizeof(context->bw_ctx.bw.dce))) {
-
-               DC_LOG_BANDWIDTH_CALCS(
-                       "%s: finish,\n"
-                       "nbpMark_b: %d nbpMark_a: %d urgentMark_b: %d urgentMark_a: %d\n"
-                       "stutMark_b: %d stutMark_a: %d\n"
-                       "nbpMark_b: %d nbpMark_a: %d urgentMark_b: %d urgentMark_a: %d\n"
-                       "stutMark_b: %d stutMark_a: %d\n"
-                       "nbpMark_b: %d nbpMark_a: %d urgentMark_b: %d urgentMark_a: %d\n"
-                       "stutMark_b: %d stutMark_a: %d stutter_mode_enable: %d\n"
-                       "cstate: %d pstate: %d nbpstate: %d sync: %d dispclk: %d\n"
-                       "sclk: %d sclk_sleep: %d yclk: %d blackout_recovery_time_us: %d\n"
-                       ,
-                       __func__,
-                       context->bw_ctx.bw.dce.nbp_state_change_wm_ns[0].b_mark,
-                       context->bw_ctx.bw.dce.nbp_state_change_wm_ns[0].a_mark,
-                       context->bw_ctx.bw.dce.urgent_wm_ns[0].b_mark,
-                       context->bw_ctx.bw.dce.urgent_wm_ns[0].a_mark,
-                       context->bw_ctx.bw.dce.stutter_exit_wm_ns[0].b_mark,
-                       context->bw_ctx.bw.dce.stutter_exit_wm_ns[0].a_mark,
-                       context->bw_ctx.bw.dce.nbp_state_change_wm_ns[1].b_mark,
-                       context->bw_ctx.bw.dce.nbp_state_change_wm_ns[1].a_mark,
-                       context->bw_ctx.bw.dce.urgent_wm_ns[1].b_mark,
-                       context->bw_ctx.bw.dce.urgent_wm_ns[1].a_mark,
-                       context->bw_ctx.bw.dce.stutter_exit_wm_ns[1].b_mark,
-                       context->bw_ctx.bw.dce.stutter_exit_wm_ns[1].a_mark,
-                       context->bw_ctx.bw.dce.nbp_state_change_wm_ns[2].b_mark,
-                       context->bw_ctx.bw.dce.nbp_state_change_wm_ns[2].a_mark,
-                       context->bw_ctx.bw.dce.urgent_wm_ns[2].b_mark,
-                       context->bw_ctx.bw.dce.urgent_wm_ns[2].a_mark,
-                       context->bw_ctx.bw.dce.stutter_exit_wm_ns[2].b_mark,
-                       context->bw_ctx.bw.dce.stutter_exit_wm_ns[2].a_mark,
-                       context->bw_ctx.bw.dce.stutter_mode_enable,
-                       context->bw_ctx.bw.dce.cpuc_state_change_enable,
-                       context->bw_ctx.bw.dce.cpup_state_change_enable,
-                       context->bw_ctx.bw.dce.nbp_state_change_enable,
-                       context->bw_ctx.bw.dce.all_displays_in_sync,
-                       context->bw_ctx.bw.dce.dispclk_khz,
-                       context->bw_ctx.bw.dce.sclk_khz,
-                       context->bw_ctx.bw.dce.sclk_deep_sleep_khz,
-                       context->bw_ctx.bw.dce.yclk_khz,
-                       context->bw_ctx.bw.dce.blackout_recovery_time_us);
-       }
-       return result;
-}
-
-static enum dc_status dce110_validate_plane(const struct dc_plane_state *plane_state,
-                                           struct dc_caps *caps)
-{
-       if (((plane_state->dst_rect.width * 2) < plane_state->src_rect.width) ||
-           ((plane_state->dst_rect.height * 2) < plane_state->src_rect.height))
-               return DC_FAIL_SURFACE_VALIDATE;
-
-       return DC_OK;
-}
-
-static bool dce110_validate_surface_sets(
-               struct dc_state *context)
-{
-       int i, j;
-
-       for (i = 0; i < context->stream_count; i++) {
-               if (context->stream_status[i].plane_count == 0)
-                       continue;
-
-               if (context->stream_status[i].plane_count > 2)
-                       return false;
-
-               for (j = 0; j < context->stream_status[i].plane_count; j++) {
-                       struct dc_plane_state *plane =
-                               context->stream_status[i].plane_states[j];
-
-                       /* underlay validation */
-                       if (plane->format >= SURFACE_PIXEL_FORMAT_VIDEO_BEGIN) {
-
-                               if ((plane->src_rect.width > 1920 ||
-                                       plane->src_rect.height > 1080))
-                                       return false;
-
-                               /* we don't have the logic to support underlay
-                                * only yet so block the use case where we get
-                                * NV12 plane as top layer
-                                */
-                               if (j == 0)
-                                       return false;
-
-                               /* irrespective of plane format,
-                                * stream should be RGB encoded
-                                */
-                               if (context->streams[i]->timing.pixel_encoding
-                                               != PIXEL_ENCODING_RGB)
-                                       return false;
-
-                       }
-
-               }
-       }
-
-       return true;
-}
-
-static enum dc_status dce110_validate_global(
-               struct dc *dc,
-               struct dc_state *context)
-{
-       if (!dce110_validate_surface_sets(context))
-               return DC_FAIL_SURFACE_VALIDATE;
-
-       return DC_OK;
-}
-
-static enum dc_status dce110_add_stream_to_ctx(
-               struct dc *dc,
-               struct dc_state *new_ctx,
-               struct dc_stream_state *dc_stream)
-{
-       enum dc_status result = DC_ERROR_UNEXPECTED;
-
-       result = resource_map_pool_resources(dc, new_ctx, dc_stream);
-
-       if (result == DC_OK)
-               result = resource_map_clock_resources(dc, new_ctx, dc_stream);
-
-
-       if (result == DC_OK)
-               result = build_mapped_resource(dc, new_ctx, dc_stream);
-
-       return result;
-}
-
-static struct pipe_ctx *dce110_acquire_underlay(
-               const struct dc_state *cur_ctx,
-               struct dc_state *new_ctx,
-               const struct resource_pool *pool,
-               const struct pipe_ctx *opp_head_pipe)
-{
-       struct dc_stream_state *stream = opp_head_pipe->stream;
-       struct dc *dc = stream->ctx->dc;
-       struct dce_hwseq *hws = dc->hwseq;
-       struct resource_context *res_ctx = &new_ctx->res_ctx;
-       unsigned int underlay_idx = pool->underlay_pipe_index;
-       struct pipe_ctx *pipe_ctx = &res_ctx->pipe_ctx[underlay_idx];
-
-       if (res_ctx->pipe_ctx[underlay_idx].stream)
-               return NULL;
-
-       pipe_ctx->stream_res.tg = pool->timing_generators[underlay_idx];
-       pipe_ctx->plane_res.mi = pool->mis[underlay_idx];
-       /*pipe_ctx->plane_res.ipp = res_ctx->pool->ipps[underlay_idx];*/
-       pipe_ctx->plane_res.xfm = pool->transforms[underlay_idx];
-       pipe_ctx->stream_res.opp = pool->opps[underlay_idx];
-       pipe_ctx->pipe_idx = underlay_idx;
-
-       pipe_ctx->stream = stream;
-
-       if (!dc->current_state->res_ctx.pipe_ctx[underlay_idx].stream) {
-               struct tg_color black_color = {0};
-               struct dc_bios *dcb = dc->ctx->dc_bios;
-
-               hws->funcs.enable_display_power_gating(
-                               dc,
-                               pipe_ctx->stream_res.tg->inst,
-                               dcb, PIPE_GATING_CONTROL_DISABLE);
-
-               /*
-                * This is for powering on underlay, so crtc does not
-                * need to be enabled
-                */
-
-               pipe_ctx->stream_res.tg->funcs->program_timing(pipe_ctx->stream_res.tg,
-                               &stream->timing,
-                               0,
-                               0,
-                               0,
-                               0,
-                               pipe_ctx->stream->signal,
-                               false);
-
-               pipe_ctx->stream_res.tg->funcs->enable_advanced_request(
-                               pipe_ctx->stream_res.tg,
-                               true,
-                               &stream->timing);
-
-               pipe_ctx->plane_res.mi->funcs->allocate_mem_input(pipe_ctx->plane_res.mi,
-                               stream->timing.h_total,
-                               stream->timing.v_total,
-                               stream->timing.pix_clk_100hz / 10,
-                               new_ctx->stream_count);
-
-               color_space_to_black_color(dc,
-                               COLOR_SPACE_YCBCR601, &black_color);
-               pipe_ctx->stream_res.tg->funcs->set_blank_color(
-                               pipe_ctx->stream_res.tg,
-                               &black_color);
-       }
-
-       return pipe_ctx;
-}
-
-static void dce110_destroy_resource_pool(struct resource_pool **pool)
-{
-       struct dce110_resource_pool *dce110_pool = TO_DCE110_RES_POOL(*pool);
-
-       dce110_resource_destruct(dce110_pool);
-       kfree(dce110_pool);
-       *pool = NULL;
-}
-
-struct stream_encoder *dce110_find_first_free_match_stream_enc_for_link(
-               struct resource_context *res_ctx,
-               const struct resource_pool *pool,
-               struct dc_stream_state *stream)
-{
-       int i;
-       int j = -1;
-       struct dc_link *link = stream->link;
-
-       for (i = 0; i < pool->stream_enc_count; i++) {
-               if (!res_ctx->is_stream_enc_acquired[i] &&
-                               pool->stream_enc[i]) {
-                       /* Store first available for MST second display
-                        * in daisy chain use case
-                        */
-                       j = i;
-                       if (pool->stream_enc[i]->id ==
-                                       link->link_enc->preferred_engine)
-                               return pool->stream_enc[i];
-               }
-       }
-
-       /*
-        * For CZ and later, we can allow DIG FE and BE to differ for all display types
-        */
-
-       if (j >= 0)
-               return pool->stream_enc[j];
-
-       return NULL;
-}
-
-
-static const struct resource_funcs dce110_res_pool_funcs = {
-       .destroy = dce110_destroy_resource_pool,
-       .link_enc_create = dce110_link_encoder_create,
-       .panel_cntl_create = dce110_panel_cntl_create,
-       .validate_bandwidth = dce110_validate_bandwidth,
-       .validate_plane = dce110_validate_plane,
-       .acquire_free_pipe_as_secondary_dpp_pipe = dce110_acquire_underlay,
-       .add_stream_to_ctx = dce110_add_stream_to_ctx,
-       .validate_global = dce110_validate_global,
-       .find_first_free_match_stream_enc_for_link = dce110_find_first_free_match_stream_enc_for_link
-};
-
-static bool underlay_create(struct dc_context *ctx, struct resource_pool *pool)
-{
-       struct dce110_timing_generator *dce110_tgv = kzalloc(sizeof(*dce110_tgv),
-                                                            GFP_KERNEL);
-       struct dce_transform *dce110_xfmv = kzalloc(sizeof(*dce110_xfmv),
-                                                   GFP_KERNEL);
-       struct dce_mem_input *dce110_miv = kzalloc(sizeof(*dce110_miv),
-                                                  GFP_KERNEL);
-       struct dce110_opp *dce110_oppv = kzalloc(sizeof(*dce110_oppv),
-                                                GFP_KERNEL);
-
-       if (!dce110_tgv || !dce110_xfmv || !dce110_miv || !dce110_oppv) {
-               kfree(dce110_tgv);
-               kfree(dce110_xfmv);
-               kfree(dce110_miv);
-               kfree(dce110_oppv);
-               return false;
-       }
-
-       dce110_opp_v_construct(dce110_oppv, ctx);
-
-       dce110_timing_generator_v_construct(dce110_tgv, ctx);
-       dce110_mem_input_v_construct(dce110_miv, ctx);
-       dce110_transform_v_construct(dce110_xfmv, ctx);
-
-       pool->opps[pool->pipe_count] = &dce110_oppv->base;
-       pool->timing_generators[pool->pipe_count] = &dce110_tgv->base;
-       pool->mis[pool->pipe_count] = &dce110_miv->base;
-       pool->transforms[pool->pipe_count] = &dce110_xfmv->base;
-       pool->pipe_count++;
-
-       /* update the public caps to indicate an underlay is available */
-       ctx->dc->caps.max_slave_planes = 1;
-       ctx->dc->caps.max_slave_yuv_planes = 1;
-       ctx->dc->caps.max_slave_rgb_planes = 0;
-
-       return true;
-}
-
-static void bw_calcs_data_update_from_pplib(struct dc *dc)
-{
-       struct dm_pp_clock_levels clks = {0};
-
-       /*do system clock*/
-       dm_pp_get_clock_levels_by_type(
-                       dc->ctx,
-                       DM_PP_CLOCK_TYPE_ENGINE_CLK,
-                       &clks);
-       /* convert all the clock fro kHz to fix point mHz */
-       dc->bw_vbios->high_sclk = bw_frc_to_fixed(
-                       clks.clocks_in_khz[clks.num_levels-1], 1000);
-       dc->bw_vbios->mid1_sclk  = bw_frc_to_fixed(
-                       clks.clocks_in_khz[clks.num_levels/8], 1000);
-       dc->bw_vbios->mid2_sclk  = bw_frc_to_fixed(
-                       clks.clocks_in_khz[clks.num_levels*2/8], 1000);
-       dc->bw_vbios->mid3_sclk  = bw_frc_to_fixed(
-                       clks.clocks_in_khz[clks.num_levels*3/8], 1000);
-       dc->bw_vbios->mid4_sclk  = bw_frc_to_fixed(
-                       clks.clocks_in_khz[clks.num_levels*4/8], 1000);
-       dc->bw_vbios->mid5_sclk  = bw_frc_to_fixed(
-                       clks.clocks_in_khz[clks.num_levels*5/8], 1000);
-       dc->bw_vbios->mid6_sclk  = bw_frc_to_fixed(
-                       clks.clocks_in_khz[clks.num_levels*6/8], 1000);
-       dc->bw_vbios->low_sclk  = bw_frc_to_fixed(
-                       clks.clocks_in_khz[0], 1000);
-       dc->sclk_lvls = clks;
-
-       /*do display clock*/
-       dm_pp_get_clock_levels_by_type(
-                       dc->ctx,
-                       DM_PP_CLOCK_TYPE_DISPLAY_CLK,
-                       &clks);
-       dc->bw_vbios->high_voltage_max_dispclk = bw_frc_to_fixed(
-                       clks.clocks_in_khz[clks.num_levels-1], 1000);
-       dc->bw_vbios->mid_voltage_max_dispclk  = bw_frc_to_fixed(
-                       clks.clocks_in_khz[clks.num_levels>>1], 1000);
-       dc->bw_vbios->low_voltage_max_dispclk  = bw_frc_to_fixed(
-                       clks.clocks_in_khz[0], 1000);
-
-       /*do memory clock*/
-       dm_pp_get_clock_levels_by_type(
-                       dc->ctx,
-                       DM_PP_CLOCK_TYPE_MEMORY_CLK,
-                       &clks);
-
-       dc->bw_vbios->low_yclk = bw_frc_to_fixed(
-               clks.clocks_in_khz[0] * MEMORY_TYPE_MULTIPLIER_CZ, 1000);
-       dc->bw_vbios->mid_yclk = bw_frc_to_fixed(
-               clks.clocks_in_khz[clks.num_levels>>1] * MEMORY_TYPE_MULTIPLIER_CZ,
-               1000);
-       dc->bw_vbios->high_yclk = bw_frc_to_fixed(
-               clks.clocks_in_khz[clks.num_levels-1] * MEMORY_TYPE_MULTIPLIER_CZ,
-               1000);
-}
-
-static const struct resource_caps *dce110_resource_cap(
-       struct hw_asic_id *asic_id)
-{
-       if (ASIC_REV_IS_STONEY(asic_id->hw_internal_rev))
-               return &stoney_resource_cap;
-       else
-               return &carrizo_resource_cap;
-}
-
-static bool dce110_resource_construct(
-       uint8_t num_virtual_links,
-       struct dc *dc,
-       struct dce110_resource_pool *pool,
-       struct hw_asic_id asic_id)
-{
-       unsigned int i;
-       struct dc_context *ctx = dc->ctx;
-       struct dc_bios *bp;
-
-       ctx->dc_bios->regs = &bios_regs;
-
-       pool->base.res_cap = dce110_resource_cap(&ctx->asic_id);
-       pool->base.funcs = &dce110_res_pool_funcs;
-
-       /*************************************************
-        *  Resource + asic cap harcoding                *
-        *************************************************/
-
-       pool->base.pipe_count = pool->base.res_cap->num_timing_generator;
-       pool->base.underlay_pipe_index = pool->base.pipe_count;
-       pool->base.timing_generator_count = pool->base.res_cap->num_timing_generator;
-       dc->caps.max_downscale_ratio = 150;
-       dc->caps.i2c_speed_in_khz = 40;
-       dc->caps.i2c_speed_in_khz_hdcp = 40;
-       dc->caps.max_cursor_size = 128;
-       dc->caps.min_horizontal_blanking_period = 80;
-       dc->caps.is_apu = true;
-       dc->caps.extended_aux_timeout_support = false;
-       dc->debug = debug_defaults;
-
-       /*************************************************
-        *  Create resources                             *
-        *************************************************/
-
-       bp = ctx->dc_bios;
-
-       if (bp->fw_info_valid && bp->fw_info.external_clock_source_frequency_for_dp != 0) {
-               pool->base.dp_clock_source =
-                               dce110_clock_source_create(ctx, bp, CLOCK_SOURCE_ID_EXTERNAL, NULL, true);
-
-               pool->base.clock_sources[0] =
-                               dce110_clock_source_create(ctx, bp, CLOCK_SOURCE_ID_PLL0,
-                                               &clk_src_regs[0], false);
-               pool->base.clock_sources[1] =
-                               dce110_clock_source_create(ctx, bp, CLOCK_SOURCE_ID_PLL1,
-                                               &clk_src_regs[1], false);
-
-               pool->base.clk_src_count = 2;
-
-               /* TODO: find out if CZ support 3 PLLs */
-       }
-
-       if (pool->base.dp_clock_source == NULL) {
-               dm_error("DC: failed to create dp clock source!\n");
-               BREAK_TO_DEBUGGER();
-               goto res_create_fail;
-       }
-
-       for (i = 0; i < pool->base.clk_src_count; i++) {
-               if (pool->base.clock_sources[i] == NULL) {
-                       dm_error("DC: failed to create clock sources!\n");
-                       BREAK_TO_DEBUGGER();
-                       goto res_create_fail;
-               }
-       }
-
-       pool->base.dmcu = dce_dmcu_create(ctx,
-                       &dmcu_regs,
-                       &dmcu_shift,
-                       &dmcu_mask);
-       if (pool->base.dmcu == NULL) {
-               dm_error("DC: failed to create dmcu!\n");
-               BREAK_TO_DEBUGGER();
-               goto res_create_fail;
-       }
-
-       pool->base.abm = dce_abm_create(ctx,
-                       &abm_regs,
-                       &abm_shift,
-                       &abm_mask);
-       if (pool->base.abm == NULL) {
-               dm_error("DC: failed to create abm!\n");
-               BREAK_TO_DEBUGGER();
-               goto res_create_fail;
-       }
-
-       {
-               struct irq_service_init_data init_data;
-               init_data.ctx = dc->ctx;
-               pool->base.irqs = dal_irq_service_dce110_create(&init_data);
-               if (!pool->base.irqs)
-                       goto res_create_fail;
-       }
-
-       for (i = 0; i < pool->base.pipe_count; i++) {
-               pool->base.timing_generators[i] = dce110_timing_generator_create(
-                               ctx, i, &dce110_tg_offsets[i]);
-               if (pool->base.timing_generators[i] == NULL) {
-                       BREAK_TO_DEBUGGER();
-                       dm_error("DC: failed to create tg!\n");
-                       goto res_create_fail;
-               }
-
-               pool->base.mis[i] = dce110_mem_input_create(ctx, i);
-               if (pool->base.mis[i] == NULL) {
-                       BREAK_TO_DEBUGGER();
-                       dm_error(
-                               "DC: failed to create memory input!\n");
-                       goto res_create_fail;
-               }
-
-               pool->base.ipps[i] = dce110_ipp_create(ctx, i);
-               if (pool->base.ipps[i] == NULL) {
-                       BREAK_TO_DEBUGGER();
-                       dm_error(
-                               "DC: failed to create input pixel processor!\n");
-                       goto res_create_fail;
-               }
-
-               pool->base.transforms[i] = dce110_transform_create(ctx, i);
-               if (pool->base.transforms[i] == NULL) {
-                       BREAK_TO_DEBUGGER();
-                       dm_error(
-                               "DC: failed to create transform!\n");
-                       goto res_create_fail;
-               }
-
-               pool->base.opps[i] = dce110_opp_create(ctx, i);
-               if (pool->base.opps[i] == NULL) {
-                       BREAK_TO_DEBUGGER();
-                       dm_error(
-                               "DC: failed to create output pixel processor!\n");
-                       goto res_create_fail;
-               }
-       }
-
-       for (i = 0; i < pool->base.res_cap->num_ddc; i++) {
-               pool->base.engines[i] = dce110_aux_engine_create(ctx, i);
-               if (pool->base.engines[i] == NULL) {
-                       BREAK_TO_DEBUGGER();
-                       dm_error(
-                               "DC:failed to create aux engine!!\n");
-                       goto res_create_fail;
-               }
-               pool->base.hw_i2cs[i] = dce110_i2c_hw_create(ctx, i);
-               if (pool->base.hw_i2cs[i] == NULL) {
-                       BREAK_TO_DEBUGGER();
-                       dm_error(
-                               "DC:failed to create i2c engine!!\n");
-                       goto res_create_fail;
-               }
-               pool->base.sw_i2cs[i] = NULL;
-       }
-
-       if (dc->config.fbc_support)
-               dc->fbc_compressor = dce110_compressor_create(ctx);
-
-       if (!underlay_create(ctx, &pool->base))
-               goto res_create_fail;
-
-       if (!resource_construct(num_virtual_links, dc, &pool->base,
-                       &res_create_funcs))
-               goto res_create_fail;
-
-       /* Create hardware sequencer */
-       dce110_hw_sequencer_construct(dc);
-
-       dc->caps.max_planes =  pool->base.pipe_count;
-
-       for (i = 0; i < pool->base.underlay_pipe_index; ++i)
-               dc->caps.planes[i] = plane_cap;
-
-       dc->caps.planes[pool->base.underlay_pipe_index] = underlay_plane_cap;
-
-       bw_calcs_init(dc->bw_dceip, dc->bw_vbios, dc->ctx->asic_id);
-
-       bw_calcs_data_update_from_pplib(dc);
-
-       return true;
-
-res_create_fail:
-       dce110_resource_destruct(pool);
-       return false;
-}
-
-struct resource_pool *dce110_create_resource_pool(
-       uint8_t num_virtual_links,
-       struct dc *dc,
-       struct hw_asic_id asic_id)
-{
-       struct dce110_resource_pool *pool =
-               kzalloc(sizeof(struct dce110_resource_pool), GFP_KERNEL);
-
-       if (!pool)
-               return NULL;
-
-       if (dce110_resource_construct(num_virtual_links, dc, pool, asic_id))
-               return &pool->base;
-
-       kfree(pool);
-       BREAK_TO_DEBUGGER();
-       return NULL;
-}
diff --git a/drivers/gpu/drm/amd/display/dc/dce110/dce110_resource.h b/drivers/gpu/drm/amd/display/dc/dce110/dce110_resource.h
deleted file mode 100644 (file)
index aa4531e..0000000
+++ /dev/null
@@ -1,54 +0,0 @@
-/*
-* Copyright 2012-15 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_RESOURCE_DCE110_H__
-#define __DC_RESOURCE_DCE110_H__
-
-#include "core_types.h"
-
-struct dc;
-struct resource_pool;
-
-#define TO_DCE110_RES_POOL(pool)\
-       container_of(pool, struct dce110_resource_pool, base)
-
-struct dce110_resource_pool {
-       struct resource_pool base;
-};
-
-void dce110_resource_build_pipe_hw_param(struct pipe_ctx *pipe_ctx);
-
-struct resource_pool *dce110_create_resource_pool(
-       uint8_t num_virtual_links,
-       struct dc *dc,
-       struct hw_asic_id asic_id);
-
-struct stream_encoder *dce110_find_first_free_match_stream_enc_for_link(
-               struct resource_context *res_ctx,
-               const struct resource_pool *pool,
-               struct dc_stream_state *stream);
-
-#endif /* __DC_RESOURCE_DCE110_H__ */
-
index e846ef58cab3f21547e8833a2c9d5151292f2a5a..7e92effec89447e7a8978c7339f02d08a3048f9a 100644 (file)
@@ -25,8 +25,7 @@
 
 CFLAGS_$(AMDDALPATH)/dc/dce112/dce112_resource.o = $(call cc-disable-warning, override-init)
 
-DCE112 = dce112_compressor.o \
-dce112_resource.o
+DCE112 = dce112_compressor.o
 
 AMD_DAL_DCE112 = $(addprefix $(AMDDALPATH)/dc/dce112/,$(DCE112))
 
diff --git a/drivers/gpu/drm/amd/display/dc/dce112/dce112_resource.c b/drivers/gpu/drm/amd/display/dc/dce112/dce112_resource.c
deleted file mode 100644 (file)
index d1edac4..0000000
+++ /dev/null
@@ -1,1431 +0,0 @@
-/*
-* Copyright 2012-15 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 "dm_services.h"
-
-#include "link_encoder.h"
-#include "stream_encoder.h"
-
-#include "resource.h"
-#include "include/irq_service_interface.h"
-#include "dce110/dce110_resource.h"
-#include "dce110/dce110_timing_generator.h"
-
-#include "irq/dce110/irq_service_dce110.h"
-#include "dce/dce_mem_input.h"
-#include "dce/dce_transform.h"
-#include "dce/dce_link_encoder.h"
-#include "dce/dce_stream_encoder.h"
-#include "dce/dce_audio.h"
-#include "dce/dce_opp.h"
-#include "dce/dce_ipp.h"
-#include "dce/dce_clock_source.h"
-
-#include "dce/dce_hwseq.h"
-#include "dce112/dce112_hwseq.h"
-#include "dce/dce_abm.h"
-#include "dce/dce_dmcu.h"
-#include "dce/dce_aux.h"
-#include "dce/dce_i2c.h"
-#include "dce/dce_panel_cntl.h"
-
-#include "reg_helper.h"
-
-#include "dce/dce_11_2_d.h"
-#include "dce/dce_11_2_sh_mask.h"
-
-#include "dce100/dce100_resource.h"
-#include "dce112_resource.h"
-
-#define DC_LOGGER                              \
-               dc->ctx->logger
-
-#ifndef mmDP_DPHY_INTERNAL_CTRL
-       #define mmDP_DPHY_INTERNAL_CTRL 0x4aa7
-       #define mmDP0_DP_DPHY_INTERNAL_CTRL 0x4aa7
-       #define mmDP1_DP_DPHY_INTERNAL_CTRL 0x4ba7
-       #define mmDP2_DP_DPHY_INTERNAL_CTRL 0x4ca7
-       #define mmDP3_DP_DPHY_INTERNAL_CTRL 0x4da7
-       #define mmDP4_DP_DPHY_INTERNAL_CTRL 0x4ea7
-       #define mmDP5_DP_DPHY_INTERNAL_CTRL 0x4fa7
-       #define mmDP6_DP_DPHY_INTERNAL_CTRL 0x54a7
-       #define mmDP7_DP_DPHY_INTERNAL_CTRL 0x56a7
-       #define mmDP8_DP_DPHY_INTERNAL_CTRL 0x57a7
-#endif
-
-#ifndef mmBIOS_SCRATCH_2
-       #define mmBIOS_SCRATCH_2 0x05CB
-       #define mmBIOS_SCRATCH_3 0x05CC
-       #define mmBIOS_SCRATCH_6 0x05CF
-#endif
-
-#ifndef mmDP_DPHY_BS_SR_SWAP_CNTL
-       #define mmDP_DPHY_BS_SR_SWAP_CNTL                       0x4ADC
-       #define mmDP0_DP_DPHY_BS_SR_SWAP_CNTL                   0x4ADC
-       #define mmDP1_DP_DPHY_BS_SR_SWAP_CNTL                   0x4BDC
-       #define mmDP2_DP_DPHY_BS_SR_SWAP_CNTL                   0x4CDC
-       #define mmDP3_DP_DPHY_BS_SR_SWAP_CNTL                   0x4DDC
-       #define mmDP4_DP_DPHY_BS_SR_SWAP_CNTL                   0x4EDC
-       #define mmDP5_DP_DPHY_BS_SR_SWAP_CNTL                   0x4FDC
-       #define mmDP6_DP_DPHY_BS_SR_SWAP_CNTL                   0x54DC
-#endif
-
-#ifndef mmDP_DPHY_FAST_TRAINING
-       #define mmDP_DPHY_FAST_TRAINING                         0x4ABC
-       #define mmDP0_DP_DPHY_FAST_TRAINING                     0x4ABC
-       #define mmDP1_DP_DPHY_FAST_TRAINING                     0x4BBC
-       #define mmDP2_DP_DPHY_FAST_TRAINING                     0x4CBC
-       #define mmDP3_DP_DPHY_FAST_TRAINING                     0x4DBC
-       #define mmDP4_DP_DPHY_FAST_TRAINING                     0x4EBC
-       #define mmDP5_DP_DPHY_FAST_TRAINING                     0x4FBC
-       #define mmDP6_DP_DPHY_FAST_TRAINING                     0x54BC
-#endif
-
-enum dce112_clk_src_array_id {
-       DCE112_CLK_SRC_PLL0,
-       DCE112_CLK_SRC_PLL1,
-       DCE112_CLK_SRC_PLL2,
-       DCE112_CLK_SRC_PLL3,
-       DCE112_CLK_SRC_PLL4,
-       DCE112_CLK_SRC_PLL5,
-
-       DCE112_CLK_SRC_TOTAL
-};
-
-static const struct dce110_timing_generator_offsets dce112_tg_offsets[] = {
-       {
-               .crtc = (mmCRTC0_CRTC_CONTROL - mmCRTC_CONTROL),
-               .dcp =  (mmDCP0_GRPH_CONTROL - mmGRPH_CONTROL),
-       },
-       {
-               .crtc = (mmCRTC1_CRTC_CONTROL - mmCRTC_CONTROL),
-               .dcp = (mmDCP1_GRPH_CONTROL - mmGRPH_CONTROL),
-       },
-       {
-               .crtc = (mmCRTC2_CRTC_CONTROL - mmCRTC_CONTROL),
-               .dcp = (mmDCP2_GRPH_CONTROL - mmGRPH_CONTROL),
-       },
-       {
-               .crtc = (mmCRTC3_CRTC_CONTROL - mmCRTC_CONTROL),
-               .dcp = (mmDCP3_GRPH_CONTROL - mmGRPH_CONTROL),
-       },
-       {
-               .crtc = (mmCRTC4_CRTC_CONTROL - mmCRTC_CONTROL),
-               .dcp = (mmDCP4_GRPH_CONTROL - mmGRPH_CONTROL),
-       },
-       {
-               .crtc = (mmCRTC5_CRTC_CONTROL - mmCRTC_CONTROL),
-               .dcp = (mmDCP5_GRPH_CONTROL - mmGRPH_CONTROL),
-       }
-};
-
-/* set register offset */
-#define SR(reg_name)\
-       .reg_name = mm ## reg_name
-
-/* set register offset with instance */
-#define SRI(reg_name, block, id)\
-       .reg_name = mm ## block ## id ## _ ## reg_name
-
-static const struct dce_dmcu_registers dmcu_regs = {
-               DMCU_DCE110_COMMON_REG_LIST()
-};
-
-static const struct dce_dmcu_shift dmcu_shift = {
-               DMCU_MASK_SH_LIST_DCE110(__SHIFT)
-};
-
-static const struct dce_dmcu_mask dmcu_mask = {
-               DMCU_MASK_SH_LIST_DCE110(_MASK)
-};
-
-static const struct dce_abm_registers abm_regs = {
-               ABM_DCE110_COMMON_REG_LIST()
-};
-
-static const struct dce_abm_shift abm_shift = {
-               ABM_MASK_SH_LIST_DCE110(__SHIFT)
-};
-
-static const struct dce_abm_mask abm_mask = {
-               ABM_MASK_SH_LIST_DCE110(_MASK)
-};
-
-static const struct dce110_aux_registers_shift aux_shift = {
-       DCE_AUX_MASK_SH_LIST(__SHIFT)
-};
-
-static const struct dce110_aux_registers_mask aux_mask = {
-       DCE_AUX_MASK_SH_LIST(_MASK)
-};
-
-#define ipp_regs(id)\
-[id] = {\
-               IPP_DCE110_REG_LIST_DCE_BASE(id)\
-}
-
-static const struct dce_ipp_registers ipp_regs[] = {
-               ipp_regs(0),
-               ipp_regs(1),
-               ipp_regs(2),
-               ipp_regs(3),
-               ipp_regs(4),
-               ipp_regs(5)
-};
-
-static const struct dce_ipp_shift ipp_shift = {
-               IPP_DCE100_MASK_SH_LIST_DCE_COMMON_BASE(__SHIFT)
-};
-
-static const struct dce_ipp_mask ipp_mask = {
-               IPP_DCE100_MASK_SH_LIST_DCE_COMMON_BASE(_MASK)
-};
-
-#define transform_regs(id)\
-[id] = {\
-               XFM_COMMON_REG_LIST_DCE110(id)\
-}
-
-static const struct dce_transform_registers xfm_regs[] = {
-               transform_regs(0),
-               transform_regs(1),
-               transform_regs(2),
-               transform_regs(3),
-               transform_regs(4),
-               transform_regs(5)
-};
-
-static const struct dce_transform_shift xfm_shift = {
-               XFM_COMMON_MASK_SH_LIST_DCE110(__SHIFT)
-};
-
-static const struct dce_transform_mask xfm_mask = {
-               XFM_COMMON_MASK_SH_LIST_DCE110(_MASK)
-};
-
-#define aux_regs(id)\
-[id] = {\
-       AUX_REG_LIST(id)\
-}
-
-static const struct dce110_link_enc_aux_registers link_enc_aux_regs[] = {
-               aux_regs(0),
-               aux_regs(1),
-               aux_regs(2),
-               aux_regs(3),
-               aux_regs(4),
-               aux_regs(5)
-};
-
-static const struct dce_panel_cntl_registers panel_cntl_regs[] = {
-       { DCE_PANEL_CNTL_REG_LIST() }
-};
-
-static const struct dce_panel_cntl_shift panel_cntl_shift = {
-       DCE_PANEL_CNTL_MASK_SH_LIST(__SHIFT)
-};
-
-static const struct dce_panel_cntl_mask panel_cntl_mask = {
-       DCE_PANEL_CNTL_MASK_SH_LIST(_MASK)
-};
-
-#define hpd_regs(id)\
-[id] = {\
-       HPD_REG_LIST(id)\
-}
-
-static const struct dce110_link_enc_hpd_registers link_enc_hpd_regs[] = {
-               hpd_regs(0),
-               hpd_regs(1),
-               hpd_regs(2),
-               hpd_regs(3),
-               hpd_regs(4),
-               hpd_regs(5)
-};
-
-#define link_regs(id)\
-[id] = {\
-       LE_DCE110_REG_LIST(id)\
-}
-
-static const struct dce110_link_enc_registers link_enc_regs[] = {
-       link_regs(0),
-       link_regs(1),
-       link_regs(2),
-       link_regs(3),
-       link_regs(4),
-       link_regs(5),
-       link_regs(6),
-};
-
-#define stream_enc_regs(id)\
-[id] = {\
-       SE_COMMON_REG_LIST(id),\
-       .TMDS_CNTL = 0,\
-}
-
-static const struct dce110_stream_enc_registers stream_enc_regs[] = {
-       stream_enc_regs(0),
-       stream_enc_regs(1),
-       stream_enc_regs(2),
-       stream_enc_regs(3),
-       stream_enc_regs(4),
-       stream_enc_regs(5)
-};
-
-static const struct dce_stream_encoder_shift se_shift = {
-               SE_COMMON_MASK_SH_LIST_DCE112(__SHIFT)
-};
-
-static const struct dce_stream_encoder_mask se_mask = {
-               SE_COMMON_MASK_SH_LIST_DCE112(_MASK)
-};
-
-#define opp_regs(id)\
-[id] = {\
-       OPP_DCE_112_REG_LIST(id),\
-}
-
-static const struct dce_opp_registers opp_regs[] = {
-       opp_regs(0),
-       opp_regs(1),
-       opp_regs(2),
-       opp_regs(3),
-       opp_regs(4),
-       opp_regs(5)
-};
-
-static const struct dce_opp_shift opp_shift = {
-       OPP_COMMON_MASK_SH_LIST_DCE_112(__SHIFT)
-};
-
-static const struct dce_opp_mask opp_mask = {
-       OPP_COMMON_MASK_SH_LIST_DCE_112(_MASK)
-};
-
-#define aux_engine_regs(id)\
-[id] = {\
-       AUX_COMMON_REG_LIST(id), \
-       .AUX_RESET_MASK = 0 \
-}
-
-static const struct dce110_aux_registers aux_engine_regs[] = {
-               aux_engine_regs(0),
-               aux_engine_regs(1),
-               aux_engine_regs(2),
-               aux_engine_regs(3),
-               aux_engine_regs(4),
-               aux_engine_regs(5)
-};
-
-#define audio_regs(id)\
-[id] = {\
-       AUD_COMMON_REG_LIST(id)\
-}
-
-static const struct dce_audio_registers audio_regs[] = {
-       audio_regs(0),
-       audio_regs(1),
-       audio_regs(2),
-       audio_regs(3),
-       audio_regs(4),
-       audio_regs(5)
-};
-
-static const struct dce_audio_shift audio_shift = {
-               AUD_COMMON_MASK_SH_LIST(__SHIFT)
-};
-
-static const struct dce_audio_mask audio_mask = {
-               AUD_COMMON_MASK_SH_LIST(_MASK)
-};
-
-#define clk_src_regs(index, id)\
-[index] = {\
-       CS_COMMON_REG_LIST_DCE_112(id),\
-}
-
-static const struct dce110_clk_src_regs clk_src_regs[] = {
-       clk_src_regs(0, A),
-       clk_src_regs(1, B),
-       clk_src_regs(2, C),
-       clk_src_regs(3, D),
-       clk_src_regs(4, E),
-       clk_src_regs(5, F)
-};
-
-static const struct dce110_clk_src_shift cs_shift = {
-               CS_COMMON_MASK_SH_LIST_DCE_112(__SHIFT)
-};
-
-static const struct dce110_clk_src_mask cs_mask = {
-               CS_COMMON_MASK_SH_LIST_DCE_112(_MASK)
-};
-
-static const struct bios_registers bios_regs = {
-       .BIOS_SCRATCH_3 = mmBIOS_SCRATCH_3,
-       .BIOS_SCRATCH_6 = mmBIOS_SCRATCH_6
-};
-
-static const struct resource_caps polaris_10_resource_cap = {
-               .num_timing_generator = 6,
-               .num_audio = 6,
-               .num_stream_encoder = 6,
-               .num_pll = 8, /* why 8? 6 combo PHY PLL + 2 regular PLLs? */
-               .num_ddc = 6,
-};
-
-static const struct resource_caps polaris_11_resource_cap = {
-               .num_timing_generator = 5,
-               .num_audio = 5,
-               .num_stream_encoder = 5,
-               .num_pll = 8, /* why 8? 6 combo PHY PLL + 2 regular PLLs? */
-               .num_ddc = 5,
-};
-
-static const struct dc_plane_cap plane_cap = {
-       .type = DC_PLANE_TYPE_DCE_RGB,
-
-       .pixel_format_support = {
-                       .argb8888 = true,
-                       .nv12 = false,
-                       .fp16 = true
-       },
-
-       .max_upscale_factor = {
-                       .argb8888 = 16000,
-                       .nv12 = 1,
-                       .fp16 = 1
-       },
-
-       .max_downscale_factor = {
-                       .argb8888 = 250,
-                       .nv12 = 1,
-                       .fp16 = 1
-       },
-       64,
-       64
-};
-
-static const struct dc_debug_options debug_defaults = {
-               .enable_legacy_fast_update = true,
-};
-
-#define CTX  ctx
-#define REG(reg) mm ## reg
-
-#ifndef mmCC_DC_HDMI_STRAPS
-#define mmCC_DC_HDMI_STRAPS 0x4819
-#define CC_DC_HDMI_STRAPS__HDMI_DISABLE_MASK 0x40
-#define CC_DC_HDMI_STRAPS__HDMI_DISABLE__SHIFT 0x6
-#define CC_DC_HDMI_STRAPS__AUDIO_STREAM_NUMBER_MASK 0x700
-#define CC_DC_HDMI_STRAPS__AUDIO_STREAM_NUMBER__SHIFT 0x8
-#endif
-
-static int map_transmitter_id_to_phy_instance(
-       enum transmitter transmitter)
-{
-       switch (transmitter) {
-       case TRANSMITTER_UNIPHY_A:
-               return 0;
-       case TRANSMITTER_UNIPHY_B:
-               return 1;
-       case TRANSMITTER_UNIPHY_C:
-               return 2;
-       case TRANSMITTER_UNIPHY_D:
-               return 3;
-       case TRANSMITTER_UNIPHY_E:
-               return 4;
-       case TRANSMITTER_UNIPHY_F:
-               return 5;
-       case TRANSMITTER_UNIPHY_G:
-               return 6;
-       default:
-               ASSERT(0);
-               return 0;
-       }
-}
-
-static void read_dce_straps(
-       struct dc_context *ctx,
-       struct resource_straps *straps)
-{
-       REG_GET_2(CC_DC_HDMI_STRAPS,
-                       HDMI_DISABLE, &straps->hdmi_disable,
-                       AUDIO_STREAM_NUMBER, &straps->audio_stream_number);
-
-       REG_GET(DC_PINSTRAPS, DC_PINSTRAPS_AUDIO, &straps->dc_pinstraps_audio);
-}
-
-static struct audio *create_audio(
-               struct dc_context *ctx, unsigned int inst)
-{
-       return dce_audio_create(ctx, inst,
-                       &audio_regs[inst], &audio_shift, &audio_mask);
-}
-
-
-static struct timing_generator *dce112_timing_generator_create(
-               struct dc_context *ctx,
-               uint32_t instance,
-               const struct dce110_timing_generator_offsets *offsets)
-{
-       struct dce110_timing_generator *tg110 =
-               kzalloc(sizeof(struct dce110_timing_generator), GFP_KERNEL);
-
-       if (!tg110)
-               return NULL;
-
-       dce110_timing_generator_construct(tg110, ctx, instance, offsets);
-       return &tg110->base;
-}
-
-static struct stream_encoder *dce112_stream_encoder_create(
-       enum engine_id eng_id,
-       struct dc_context *ctx)
-{
-       struct dce110_stream_encoder *enc110 =
-               kzalloc(sizeof(struct dce110_stream_encoder), GFP_KERNEL);
-
-       if (!enc110)
-               return NULL;
-
-       dce110_stream_encoder_construct(enc110, ctx, ctx->dc_bios, eng_id,
-                                       &stream_enc_regs[eng_id],
-                                       &se_shift, &se_mask);
-       return &enc110->base;
-}
-
-#define SRII(reg_name, block, id)\
-       .reg_name[id] = mm ## block ## id ## _ ## reg_name
-
-static const struct dce_hwseq_registers hwseq_reg = {
-               HWSEQ_DCE112_REG_LIST()
-};
-
-static const struct dce_hwseq_shift hwseq_shift = {
-               HWSEQ_DCE112_MASK_SH_LIST(__SHIFT)
-};
-
-static const struct dce_hwseq_mask hwseq_mask = {
-               HWSEQ_DCE112_MASK_SH_LIST(_MASK)
-};
-
-static struct dce_hwseq *dce112_hwseq_create(
-       struct dc_context *ctx)
-{
-       struct dce_hwseq *hws = kzalloc(sizeof(struct dce_hwseq), GFP_KERNEL);
-
-       if (hws) {
-               hws->ctx = ctx;
-               hws->regs = &hwseq_reg;
-               hws->shifts = &hwseq_shift;
-               hws->masks = &hwseq_mask;
-       }
-       return hws;
-}
-
-static const struct resource_create_funcs res_create_funcs = {
-       .read_dce_straps = read_dce_straps,
-       .create_audio = create_audio,
-       .create_stream_encoder = dce112_stream_encoder_create,
-       .create_hwseq = dce112_hwseq_create,
-};
-
-#define mi_inst_regs(id) { MI_DCE11_2_REG_LIST(id) }
-static const struct dce_mem_input_registers mi_regs[] = {
-               mi_inst_regs(0),
-               mi_inst_regs(1),
-               mi_inst_regs(2),
-               mi_inst_regs(3),
-               mi_inst_regs(4),
-               mi_inst_regs(5),
-};
-
-static const struct dce_mem_input_shift mi_shifts = {
-               MI_DCE11_2_MASK_SH_LIST(__SHIFT)
-};
-
-static const struct dce_mem_input_mask mi_masks = {
-               MI_DCE11_2_MASK_SH_LIST(_MASK)
-};
-
-static struct mem_input *dce112_mem_input_create(
-       struct dc_context *ctx,
-       uint32_t inst)
-{
-       struct dce_mem_input *dce_mi = kzalloc(sizeof(struct dce_mem_input),
-                                              GFP_KERNEL);
-
-       if (!dce_mi) {
-               BREAK_TO_DEBUGGER();
-               return NULL;
-       }
-
-       dce112_mem_input_construct(dce_mi, ctx, inst, &mi_regs[inst], &mi_shifts, &mi_masks);
-       return &dce_mi->base;
-}
-
-static void dce112_transform_destroy(struct transform **xfm)
-{
-       kfree(TO_DCE_TRANSFORM(*xfm));
-       *xfm = NULL;
-}
-
-static struct transform *dce112_transform_create(
-       struct dc_context *ctx,
-       uint32_t inst)
-{
-       struct dce_transform *transform =
-               kzalloc(sizeof(struct dce_transform), GFP_KERNEL);
-
-       if (!transform)
-               return NULL;
-
-       dce_transform_construct(transform, ctx, inst,
-                               &xfm_regs[inst], &xfm_shift, &xfm_mask);
-       transform->lb_memory_size = 0x1404; /*5124*/
-       return &transform->base;
-}
-
-static const struct encoder_feature_support link_enc_feature = {
-               .max_hdmi_deep_color = COLOR_DEPTH_121212,
-               .max_hdmi_pixel_clock = 600000,
-               .hdmi_ycbcr420_supported = true,
-               .dp_ycbcr420_supported = false,
-               .flags.bits.IS_HBR2_CAPABLE = true,
-               .flags.bits.IS_HBR3_CAPABLE = true,
-               .flags.bits.IS_TPS3_CAPABLE = true,
-               .flags.bits.IS_TPS4_CAPABLE = true
-};
-
-static struct link_encoder *dce112_link_encoder_create(
-       struct dc_context *ctx,
-       const struct encoder_init_data *enc_init_data)
-{
-       struct dce110_link_encoder *enc110 =
-               kzalloc(sizeof(struct dce110_link_encoder), GFP_KERNEL);
-       int link_regs_id;
-
-       if (!enc110)
-               return NULL;
-
-       link_regs_id =
-               map_transmitter_id_to_phy_instance(enc_init_data->transmitter);
-
-       dce110_link_encoder_construct(enc110,
-                                     enc_init_data,
-                                     &link_enc_feature,
-                                     &link_enc_regs[link_regs_id],
-                                     &link_enc_aux_regs[enc_init_data->channel - 1],
-                                     &link_enc_hpd_regs[enc_init_data->hpd_source]);
-       return &enc110->base;
-}
-
-static struct panel_cntl *dce112_panel_cntl_create(const struct panel_cntl_init_data *init_data)
-{
-       struct dce_panel_cntl *panel_cntl =
-               kzalloc(sizeof(struct dce_panel_cntl), GFP_KERNEL);
-
-       if (!panel_cntl)
-               return NULL;
-
-       dce_panel_cntl_construct(panel_cntl,
-                       init_data,
-                       &panel_cntl_regs[init_data->inst],
-                       &panel_cntl_shift,
-                       &panel_cntl_mask);
-
-       return &panel_cntl->base;
-}
-
-static struct input_pixel_processor *dce112_ipp_create(
-       struct dc_context *ctx, uint32_t inst)
-{
-       struct dce_ipp *ipp = kzalloc(sizeof(struct dce_ipp), GFP_KERNEL);
-
-       if (!ipp) {
-               BREAK_TO_DEBUGGER();
-               return NULL;
-       }
-
-       dce_ipp_construct(ipp, ctx, inst,
-                       &ipp_regs[inst], &ipp_shift, &ipp_mask);
-       return &ipp->base;
-}
-
-static struct output_pixel_processor *dce112_opp_create(
-       struct dc_context *ctx,
-       uint32_t inst)
-{
-       struct dce110_opp *opp =
-               kzalloc(sizeof(struct dce110_opp), GFP_KERNEL);
-
-       if (!opp)
-               return NULL;
-
-       dce110_opp_construct(opp,
-                            ctx, inst, &opp_regs[inst], &opp_shift, &opp_mask);
-       return &opp->base;
-}
-
-static struct dce_aux *dce112_aux_engine_create(
-       struct dc_context *ctx,
-       uint32_t inst)
-{
-       struct aux_engine_dce110 *aux_engine =
-               kzalloc(sizeof(struct aux_engine_dce110), GFP_KERNEL);
-
-       if (!aux_engine)
-               return NULL;
-
-       dce110_aux_engine_construct(aux_engine, ctx, inst,
-                                   SW_AUX_TIMEOUT_PERIOD_MULTIPLIER * AUX_TIMEOUT_PERIOD,
-                                   &aux_engine_regs[inst],
-                                       &aux_mask,
-                                       &aux_shift,
-                                       ctx->dc->caps.extended_aux_timeout_support);
-
-       return &aux_engine->base;
-}
-#define i2c_inst_regs(id) { I2C_HW_ENGINE_COMMON_REG_LIST(id) }
-
-static const struct dce_i2c_registers i2c_hw_regs[] = {
-               i2c_inst_regs(1),
-               i2c_inst_regs(2),
-               i2c_inst_regs(3),
-               i2c_inst_regs(4),
-               i2c_inst_regs(5),
-               i2c_inst_regs(6),
-};
-
-static const struct dce_i2c_shift i2c_shifts = {
-               I2C_COMMON_MASK_SH_LIST_DCE110(__SHIFT)
-};
-
-static const struct dce_i2c_mask i2c_masks = {
-               I2C_COMMON_MASK_SH_LIST_DCE110(_MASK)
-};
-
-static struct dce_i2c_hw *dce112_i2c_hw_create(
-       struct dc_context *ctx,
-       uint32_t inst)
-{
-       struct dce_i2c_hw *dce_i2c_hw =
-               kzalloc(sizeof(struct dce_i2c_hw), GFP_KERNEL);
-
-       if (!dce_i2c_hw)
-               return NULL;
-
-       dce112_i2c_hw_construct(dce_i2c_hw, ctx, inst,
-                                   &i2c_hw_regs[inst], &i2c_shifts, &i2c_masks);
-
-       return dce_i2c_hw;
-}
-static struct clock_source *dce112_clock_source_create(
-       struct dc_context *ctx,
-       struct dc_bios *bios,
-       enum clock_source_id id,
-       const struct dce110_clk_src_regs *regs,
-       bool dp_clk_src)
-{
-       struct dce110_clk_src *clk_src =
-               kzalloc(sizeof(struct dce110_clk_src), GFP_KERNEL);
-
-       if (!clk_src)
-               return NULL;
-
-       if (dce112_clk_src_construct(clk_src, ctx, bios, id,
-                       regs, &cs_shift, &cs_mask)) {
-               clk_src->base.dp_clk_src = dp_clk_src;
-               return &clk_src->base;
-       }
-
-       kfree(clk_src);
-       BREAK_TO_DEBUGGER();
-       return NULL;
-}
-
-static void dce112_clock_source_destroy(struct clock_source **clk_src)
-{
-       kfree(TO_DCE110_CLK_SRC(*clk_src));
-       *clk_src = NULL;
-}
-
-static void dce112_resource_destruct(struct dce110_resource_pool *pool)
-{
-       unsigned int i;
-
-       for (i = 0; i < pool->base.pipe_count; i++) {
-               if (pool->base.opps[i] != NULL)
-                       dce110_opp_destroy(&pool->base.opps[i]);
-
-               if (pool->base.transforms[i] != NULL)
-                       dce112_transform_destroy(&pool->base.transforms[i]);
-
-               if (pool->base.ipps[i] != NULL)
-                       dce_ipp_destroy(&pool->base.ipps[i]);
-
-               if (pool->base.mis[i] != NULL) {
-                       kfree(TO_DCE_MEM_INPUT(pool->base.mis[i]));
-                       pool->base.mis[i] = NULL;
-               }
-
-               if (pool->base.timing_generators[i] != NULL) {
-                       kfree(DCE110TG_FROM_TG(pool->base.timing_generators[i]));
-                       pool->base.timing_generators[i] = NULL;
-               }
-       }
-
-       for (i = 0; i < pool->base.res_cap->num_ddc; i++) {
-               if (pool->base.engines[i] != NULL)
-                       dce110_engine_destroy(&pool->base.engines[i]);
-               if (pool->base.hw_i2cs[i] != NULL) {
-                       kfree(pool->base.hw_i2cs[i]);
-                       pool->base.hw_i2cs[i] = NULL;
-               }
-               if (pool->base.sw_i2cs[i] != NULL) {
-                       kfree(pool->base.sw_i2cs[i]);
-                       pool->base.sw_i2cs[i] = NULL;
-               }
-       }
-
-       for (i = 0; i < pool->base.stream_enc_count; i++) {
-               if (pool->base.stream_enc[i] != NULL)
-                       kfree(DCE110STRENC_FROM_STRENC(pool->base.stream_enc[i]));
-       }
-
-       for (i = 0; i < pool->base.clk_src_count; i++) {
-               if (pool->base.clock_sources[i] != NULL) {
-                       dce112_clock_source_destroy(&pool->base.clock_sources[i]);
-               }
-       }
-
-       if (pool->base.dp_clock_source != NULL)
-               dce112_clock_source_destroy(&pool->base.dp_clock_source);
-
-       for (i = 0; i < pool->base.audio_count; i++)    {
-               if (pool->base.audios[i] != NULL) {
-                       dce_aud_destroy(&pool->base.audios[i]);
-               }
-       }
-
-       if (pool->base.abm != NULL)
-               dce_abm_destroy(&pool->base.abm);
-
-       if (pool->base.dmcu != NULL)
-               dce_dmcu_destroy(&pool->base.dmcu);
-
-       if (pool->base.irqs != NULL) {
-               dal_irq_service_destroy(&pool->base.irqs);
-       }
-}
-
-static struct clock_source *find_matching_pll(
-               struct resource_context *res_ctx,
-               const struct resource_pool *pool,
-               const struct dc_stream_state *const stream)
-{
-       switch (stream->link->link_enc->transmitter) {
-       case TRANSMITTER_UNIPHY_A:
-               return pool->clock_sources[DCE112_CLK_SRC_PLL0];
-       case TRANSMITTER_UNIPHY_B:
-               return pool->clock_sources[DCE112_CLK_SRC_PLL1];
-       case TRANSMITTER_UNIPHY_C:
-               return pool->clock_sources[DCE112_CLK_SRC_PLL2];
-       case TRANSMITTER_UNIPHY_D:
-               return pool->clock_sources[DCE112_CLK_SRC_PLL3];
-       case TRANSMITTER_UNIPHY_E:
-               return pool->clock_sources[DCE112_CLK_SRC_PLL4];
-       case TRANSMITTER_UNIPHY_F:
-               return pool->clock_sources[DCE112_CLK_SRC_PLL5];
-       default:
-               return NULL;
-       }
-
-       return NULL;
-}
-
-static enum dc_status build_mapped_resource(
-               const struct dc *dc,
-               struct dc_state *context,
-               struct dc_stream_state *stream)
-{
-       struct pipe_ctx *pipe_ctx = resource_get_otg_master_for_stream(&context->res_ctx, stream);
-
-       if (!pipe_ctx)
-               return DC_ERROR_UNEXPECTED;
-
-       dce110_resource_build_pipe_hw_param(pipe_ctx);
-
-       resource_build_info_frame(pipe_ctx);
-
-       return DC_OK;
-}
-
-bool dce112_validate_bandwidth(
-       struct dc *dc,
-       struct dc_state *context,
-       bool fast_validate)
-{
-       bool result = false;
-
-       DC_LOG_BANDWIDTH_CALCS(
-               "%s: start",
-               __func__);
-
-       if (bw_calcs(
-                       dc->ctx,
-                       dc->bw_dceip,
-                       dc->bw_vbios,
-                       context->res_ctx.pipe_ctx,
-                       dc->res_pool->pipe_count,
-                       &context->bw_ctx.bw.dce))
-               result = true;
-
-       if (!result)
-               DC_LOG_BANDWIDTH_VALIDATION(
-                       "%s: Bandwidth validation failed!",
-                       __func__);
-
-       if (memcmp(&dc->current_state->bw_ctx.bw.dce,
-                       &context->bw_ctx.bw.dce, sizeof(context->bw_ctx.bw.dce))) {
-
-               DC_LOG_BANDWIDTH_CALCS(
-                       "%s: finish,\n"
-                       "nbpMark_b: %d nbpMark_a: %d urgentMark_b: %d urgentMark_a: %d\n"
-                       "stutMark_b: %d stutMark_a: %d\n"
-                       "nbpMark_b: %d nbpMark_a: %d urgentMark_b: %d urgentMark_a: %d\n"
-                       "stutMark_b: %d stutMark_a: %d\n"
-                       "nbpMark_b: %d nbpMark_a: %d urgentMark_b: %d urgentMark_a: %d\n"
-                       "stutMark_b: %d stutMark_a: %d stutter_mode_enable: %d\n"
-                       "cstate: %d pstate: %d nbpstate: %d sync: %d dispclk: %d\n"
-                       "sclk: %d sclk_sleep: %d yclk: %d blackout_recovery_time_us: %d\n"
-                       ,
-                       __func__,
-                       context->bw_ctx.bw.dce.nbp_state_change_wm_ns[0].b_mark,
-                       context->bw_ctx.bw.dce.nbp_state_change_wm_ns[0].a_mark,
-                       context->bw_ctx.bw.dce.urgent_wm_ns[0].b_mark,
-                       context->bw_ctx.bw.dce.urgent_wm_ns[0].a_mark,
-                       context->bw_ctx.bw.dce.stutter_exit_wm_ns[0].b_mark,
-                       context->bw_ctx.bw.dce.stutter_exit_wm_ns[0].a_mark,
-                       context->bw_ctx.bw.dce.nbp_state_change_wm_ns[1].b_mark,
-                       context->bw_ctx.bw.dce.nbp_state_change_wm_ns[1].a_mark,
-                       context->bw_ctx.bw.dce.urgent_wm_ns[1].b_mark,
-                       context->bw_ctx.bw.dce.urgent_wm_ns[1].a_mark,
-                       context->bw_ctx.bw.dce.stutter_exit_wm_ns[1].b_mark,
-                       context->bw_ctx.bw.dce.stutter_exit_wm_ns[1].a_mark,
-                       context->bw_ctx.bw.dce.nbp_state_change_wm_ns[2].b_mark,
-                       context->bw_ctx.bw.dce.nbp_state_change_wm_ns[2].a_mark,
-                       context->bw_ctx.bw.dce.urgent_wm_ns[2].b_mark,
-                       context->bw_ctx.bw.dce.urgent_wm_ns[2].a_mark,
-                       context->bw_ctx.bw.dce.stutter_exit_wm_ns[2].b_mark,
-                       context->bw_ctx.bw.dce.stutter_exit_wm_ns[2].a_mark,
-                       context->bw_ctx.bw.dce.stutter_mode_enable,
-                       context->bw_ctx.bw.dce.cpuc_state_change_enable,
-                       context->bw_ctx.bw.dce.cpup_state_change_enable,
-                       context->bw_ctx.bw.dce.nbp_state_change_enable,
-                       context->bw_ctx.bw.dce.all_displays_in_sync,
-                       context->bw_ctx.bw.dce.dispclk_khz,
-                       context->bw_ctx.bw.dce.sclk_khz,
-                       context->bw_ctx.bw.dce.sclk_deep_sleep_khz,
-                       context->bw_ctx.bw.dce.yclk_khz,
-                       context->bw_ctx.bw.dce.blackout_recovery_time_us);
-       }
-       return result;
-}
-
-enum dc_status resource_map_phy_clock_resources(
-               const struct dc *dc,
-               struct dc_state *context,
-               struct dc_stream_state *stream)
-{
-
-       /* acquire new resources */
-       struct pipe_ctx *pipe_ctx = resource_get_otg_master_for_stream(
-                       &context->res_ctx, stream);
-
-       if (!pipe_ctx)
-               return DC_ERROR_UNEXPECTED;
-
-       if (dc_is_dp_signal(pipe_ctx->stream->signal)
-               || dc_is_virtual_signal(pipe_ctx->stream->signal))
-               pipe_ctx->clock_source =
-                               dc->res_pool->dp_clock_source;
-       else {
-               if (stream && stream->link && stream->link->link_enc)
-                       pipe_ctx->clock_source = find_matching_pll(
-                               &context->res_ctx, dc->res_pool,
-                               stream);
-       }
-
-       if (pipe_ctx->clock_source == NULL)
-               return DC_NO_CLOCK_SOURCE_RESOURCE;
-
-       resource_reference_clock_source(
-               &context->res_ctx,
-               dc->res_pool,
-               pipe_ctx->clock_source);
-
-       return DC_OK;
-}
-
-static bool dce112_validate_surface_sets(
-               struct dc_state *context)
-{
-       int i;
-
-       for (i = 0; i < context->stream_count; i++) {
-               if (context->stream_status[i].plane_count == 0)
-                       continue;
-
-               if (context->stream_status[i].plane_count > 1)
-                       return false;
-
-               if (context->stream_status[i].plane_states[0]->format
-                               >= SURFACE_PIXEL_FORMAT_VIDEO_BEGIN)
-                       return false;
-       }
-
-       return true;
-}
-
-enum dc_status dce112_add_stream_to_ctx(
-               struct dc *dc,
-               struct dc_state *new_ctx,
-               struct dc_stream_state *dc_stream)
-{
-       enum dc_status result;
-
-       result = resource_map_pool_resources(dc, new_ctx, dc_stream);
-
-       if (result == DC_OK)
-               result = resource_map_phy_clock_resources(dc, new_ctx, dc_stream);
-
-
-       if (result == DC_OK)
-               result = build_mapped_resource(dc, new_ctx, dc_stream);
-
-       return result;
-}
-
-static enum dc_status dce112_validate_global(
-               struct dc *dc,
-               struct dc_state *context)
-{
-       if (!dce112_validate_surface_sets(context))
-               return DC_FAIL_SURFACE_VALIDATE;
-
-       return DC_OK;
-}
-
-static void dce112_destroy_resource_pool(struct resource_pool **pool)
-{
-       struct dce110_resource_pool *dce110_pool = TO_DCE110_RES_POOL(*pool);
-
-       dce112_resource_destruct(dce110_pool);
-       kfree(dce110_pool);
-       *pool = NULL;
-}
-
-static const struct resource_funcs dce112_res_pool_funcs = {
-       .destroy = dce112_destroy_resource_pool,
-       .link_enc_create = dce112_link_encoder_create,
-       .panel_cntl_create = dce112_panel_cntl_create,
-       .validate_bandwidth = dce112_validate_bandwidth,
-       .validate_plane = dce100_validate_plane,
-       .add_stream_to_ctx = dce112_add_stream_to_ctx,
-       .validate_global = dce112_validate_global,
-       .find_first_free_match_stream_enc_for_link = dce110_find_first_free_match_stream_enc_for_link
-};
-
-static void bw_calcs_data_update_from_pplib(struct dc *dc)
-{
-       struct dm_pp_clock_levels_with_latency eng_clks = {0};
-       struct dm_pp_clock_levels_with_latency mem_clks = {0};
-       struct dm_pp_wm_sets_with_clock_ranges clk_ranges = {0};
-       struct dm_pp_clock_levels clks = {0};
-       int memory_type_multiplier = MEMORY_TYPE_MULTIPLIER_CZ;
-
-       if (dc->bw_vbios && dc->bw_vbios->memory_type == bw_def_hbm)
-               memory_type_multiplier = MEMORY_TYPE_HBM;
-
-       /*do system clock  TODO PPLIB: after PPLIB implement,
-        * then remove old way
-        */
-       if (!dm_pp_get_clock_levels_by_type_with_latency(
-                       dc->ctx,
-                       DM_PP_CLOCK_TYPE_ENGINE_CLK,
-                       &eng_clks)) {
-
-               /* This is only for temporary */
-               dm_pp_get_clock_levels_by_type(
-                               dc->ctx,
-                               DM_PP_CLOCK_TYPE_ENGINE_CLK,
-                               &clks);
-               /* convert all the clock fro kHz to fix point mHz */
-               dc->bw_vbios->high_sclk = bw_frc_to_fixed(
-                               clks.clocks_in_khz[clks.num_levels-1], 1000);
-               dc->bw_vbios->mid1_sclk  = bw_frc_to_fixed(
-                               clks.clocks_in_khz[clks.num_levels/8], 1000);
-               dc->bw_vbios->mid2_sclk  = bw_frc_to_fixed(
-                               clks.clocks_in_khz[clks.num_levels*2/8], 1000);
-               dc->bw_vbios->mid3_sclk  = bw_frc_to_fixed(
-                               clks.clocks_in_khz[clks.num_levels*3/8], 1000);
-               dc->bw_vbios->mid4_sclk  = bw_frc_to_fixed(
-                               clks.clocks_in_khz[clks.num_levels*4/8], 1000);
-               dc->bw_vbios->mid5_sclk  = bw_frc_to_fixed(
-                               clks.clocks_in_khz[clks.num_levels*5/8], 1000);
-               dc->bw_vbios->mid6_sclk  = bw_frc_to_fixed(
-                               clks.clocks_in_khz[clks.num_levels*6/8], 1000);
-               dc->bw_vbios->low_sclk  = bw_frc_to_fixed(
-                               clks.clocks_in_khz[0], 1000);
-
-               /*do memory clock*/
-               dm_pp_get_clock_levels_by_type(
-                               dc->ctx,
-                               DM_PP_CLOCK_TYPE_MEMORY_CLK,
-                               &clks);
-
-               dc->bw_vbios->low_yclk = bw_frc_to_fixed(
-                       clks.clocks_in_khz[0] * memory_type_multiplier, 1000);
-               dc->bw_vbios->mid_yclk = bw_frc_to_fixed(
-                       clks.clocks_in_khz[clks.num_levels>>1] * memory_type_multiplier,
-                       1000);
-               dc->bw_vbios->high_yclk = bw_frc_to_fixed(
-                       clks.clocks_in_khz[clks.num_levels-1] * memory_type_multiplier,
-                       1000);
-
-               return;
-       }
-
-       /* convert all the clock fro kHz to fix point mHz  TODO: wloop data */
-       dc->bw_vbios->high_sclk = bw_frc_to_fixed(
-               eng_clks.data[eng_clks.num_levels-1].clocks_in_khz, 1000);
-       dc->bw_vbios->mid1_sclk  = bw_frc_to_fixed(
-               eng_clks.data[eng_clks.num_levels/8].clocks_in_khz, 1000);
-       dc->bw_vbios->mid2_sclk  = bw_frc_to_fixed(
-               eng_clks.data[eng_clks.num_levels*2/8].clocks_in_khz, 1000);
-       dc->bw_vbios->mid3_sclk  = bw_frc_to_fixed(
-               eng_clks.data[eng_clks.num_levels*3/8].clocks_in_khz, 1000);
-       dc->bw_vbios->mid4_sclk  = bw_frc_to_fixed(
-               eng_clks.data[eng_clks.num_levels*4/8].clocks_in_khz, 1000);
-       dc->bw_vbios->mid5_sclk  = bw_frc_to_fixed(
-               eng_clks.data[eng_clks.num_levels*5/8].clocks_in_khz, 1000);
-       dc->bw_vbios->mid6_sclk  = bw_frc_to_fixed(
-               eng_clks.data[eng_clks.num_levels*6/8].clocks_in_khz, 1000);
-       dc->bw_vbios->low_sclk  = bw_frc_to_fixed(
-                       eng_clks.data[0].clocks_in_khz, 1000);
-
-       /*do memory clock*/
-       dm_pp_get_clock_levels_by_type_with_latency(
-                       dc->ctx,
-                       DM_PP_CLOCK_TYPE_MEMORY_CLK,
-                       &mem_clks);
-
-       /* we don't need to call PPLIB for validation clock since they
-        * also give us the highest sclk and highest mclk (UMA clock).
-        * ALSO always convert UMA clock (from PPLIB)  to YCLK (HW formula):
-        * YCLK = UMACLK*m_memoryTypeMultiplier
-        */
-       dc->bw_vbios->low_yclk = bw_frc_to_fixed(
-               mem_clks.data[0].clocks_in_khz * memory_type_multiplier, 1000);
-       dc->bw_vbios->mid_yclk = bw_frc_to_fixed(
-               mem_clks.data[mem_clks.num_levels>>1].clocks_in_khz * memory_type_multiplier,
-               1000);
-       dc->bw_vbios->high_yclk = bw_frc_to_fixed(
-               mem_clks.data[mem_clks.num_levels-1].clocks_in_khz * memory_type_multiplier,
-               1000);
-
-       /* Now notify PPLib/SMU about which Watermarks sets they should select
-        * depending on DPM state they are in. And update BW MGR GFX Engine and
-        * Memory clock member variables for Watermarks calculations for each
-        * Watermark Set
-        */
-       clk_ranges.num_wm_sets = 4;
-       clk_ranges.wm_clk_ranges[0].wm_set_id = WM_SET_A;
-       clk_ranges.wm_clk_ranges[0].wm_min_eng_clk_in_khz =
-                       eng_clks.data[0].clocks_in_khz;
-       clk_ranges.wm_clk_ranges[0].wm_max_eng_clk_in_khz =
-                       eng_clks.data[eng_clks.num_levels*3/8].clocks_in_khz - 1;
-       clk_ranges.wm_clk_ranges[0].wm_min_mem_clk_in_khz =
-                       mem_clks.data[0].clocks_in_khz;
-       clk_ranges.wm_clk_ranges[0].wm_max_mem_clk_in_khz =
-                       mem_clks.data[mem_clks.num_levels>>1].clocks_in_khz - 1;
-
-       clk_ranges.wm_clk_ranges[1].wm_set_id = WM_SET_B;
-       clk_ranges.wm_clk_ranges[1].wm_min_eng_clk_in_khz =
-                       eng_clks.data[eng_clks.num_levels*3/8].clocks_in_khz;
-       /* 5 GHz instead of data[7].clockInKHz to cover Overdrive */
-       clk_ranges.wm_clk_ranges[1].wm_max_eng_clk_in_khz = 5000000;
-       clk_ranges.wm_clk_ranges[1].wm_min_mem_clk_in_khz =
-                       mem_clks.data[0].clocks_in_khz;
-       clk_ranges.wm_clk_ranges[1].wm_max_mem_clk_in_khz =
-                       mem_clks.data[mem_clks.num_levels>>1].clocks_in_khz - 1;
-
-       clk_ranges.wm_clk_ranges[2].wm_set_id = WM_SET_C;
-       clk_ranges.wm_clk_ranges[2].wm_min_eng_clk_in_khz =
-                       eng_clks.data[0].clocks_in_khz;
-       clk_ranges.wm_clk_ranges[2].wm_max_eng_clk_in_khz =
-                       eng_clks.data[eng_clks.num_levels*3/8].clocks_in_khz - 1;
-       clk_ranges.wm_clk_ranges[2].wm_min_mem_clk_in_khz =
-                       mem_clks.data[mem_clks.num_levels>>1].clocks_in_khz;
-       /* 5 GHz instead of data[2].clockInKHz to cover Overdrive */
-       clk_ranges.wm_clk_ranges[2].wm_max_mem_clk_in_khz = 5000000;
-
-       clk_ranges.wm_clk_ranges[3].wm_set_id = WM_SET_D;
-       clk_ranges.wm_clk_ranges[3].wm_min_eng_clk_in_khz =
-                       eng_clks.data[eng_clks.num_levels*3/8].clocks_in_khz;
-       /* 5 GHz instead of data[7].clockInKHz to cover Overdrive */
-       clk_ranges.wm_clk_ranges[3].wm_max_eng_clk_in_khz = 5000000;
-       clk_ranges.wm_clk_ranges[3].wm_min_mem_clk_in_khz =
-                       mem_clks.data[mem_clks.num_levels>>1].clocks_in_khz;
-       /* 5 GHz instead of data[2].clockInKHz to cover Overdrive */
-       clk_ranges.wm_clk_ranges[3].wm_max_mem_clk_in_khz = 5000000;
-
-       /* Notify PP Lib/SMU which Watermarks to use for which clock ranges */
-       dm_pp_notify_wm_clock_changes(dc->ctx, &clk_ranges);
-}
-
-static const struct resource_caps *dce112_resource_cap(
-       struct hw_asic_id *asic_id)
-{
-       if (ASIC_REV_IS_POLARIS11_M(asic_id->hw_internal_rev) ||
-           ASIC_REV_IS_POLARIS12_V(asic_id->hw_internal_rev))
-               return &polaris_11_resource_cap;
-       else
-               return &polaris_10_resource_cap;
-}
-
-static bool dce112_resource_construct(
-       uint8_t num_virtual_links,
-       struct dc *dc,
-       struct dce110_resource_pool *pool)
-{
-       unsigned int i;
-       struct dc_context *ctx = dc->ctx;
-
-       ctx->dc_bios->regs = &bios_regs;
-
-       pool->base.res_cap = dce112_resource_cap(&ctx->asic_id);
-       pool->base.funcs = &dce112_res_pool_funcs;
-
-       /*************************************************
-        *  Resource + asic cap harcoding                *
-        *************************************************/
-       pool->base.underlay_pipe_index = NO_UNDERLAY_PIPE;
-       pool->base.pipe_count = pool->base.res_cap->num_timing_generator;
-       pool->base.timing_generator_count = pool->base.res_cap->num_timing_generator;
-       dc->caps.max_downscale_ratio = 200;
-       dc->caps.i2c_speed_in_khz = 100;
-       dc->caps.i2c_speed_in_khz_hdcp = 100; /*1.4 w/a not applied by default*/
-       dc->caps.max_cursor_size = 128;
-       dc->caps.min_horizontal_blanking_period = 80;
-       dc->caps.dual_link_dvi = true;
-       dc->caps.extended_aux_timeout_support = false;
-       dc->debug = debug_defaults;
-
-       /*************************************************
-        *  Create resources                             *
-        *************************************************/
-
-       pool->base.clock_sources[DCE112_CLK_SRC_PLL0] =
-                       dce112_clock_source_create(
-                               ctx, ctx->dc_bios,
-                               CLOCK_SOURCE_COMBO_PHY_PLL0,
-                               &clk_src_regs[0], false);
-       pool->base.clock_sources[DCE112_CLK_SRC_PLL1] =
-                       dce112_clock_source_create(
-                               ctx, ctx->dc_bios,
-                               CLOCK_SOURCE_COMBO_PHY_PLL1,
-                               &clk_src_regs[1], false);
-       pool->base.clock_sources[DCE112_CLK_SRC_PLL2] =
-                       dce112_clock_source_create(
-                               ctx, ctx->dc_bios,
-                               CLOCK_SOURCE_COMBO_PHY_PLL2,
-                               &clk_src_regs[2], false);
-       pool->base.clock_sources[DCE112_CLK_SRC_PLL3] =
-                       dce112_clock_source_create(
-                               ctx, ctx->dc_bios,
-                               CLOCK_SOURCE_COMBO_PHY_PLL3,
-                               &clk_src_regs[3], false);
-       pool->base.clock_sources[DCE112_CLK_SRC_PLL4] =
-                       dce112_clock_source_create(
-                               ctx, ctx->dc_bios,
-                               CLOCK_SOURCE_COMBO_PHY_PLL4,
-                               &clk_src_regs[4], false);
-       pool->base.clock_sources[DCE112_CLK_SRC_PLL5] =
-                       dce112_clock_source_create(
-                               ctx, ctx->dc_bios,
-                               CLOCK_SOURCE_COMBO_PHY_PLL5,
-                               &clk_src_regs[5], false);
-       pool->base.clk_src_count = DCE112_CLK_SRC_TOTAL;
-
-       pool->base.dp_clock_source =  dce112_clock_source_create(
-               ctx, ctx->dc_bios,
-               CLOCK_SOURCE_ID_DP_DTO, &clk_src_regs[0], true);
-
-
-       for (i = 0; i < pool->base.clk_src_count; i++) {
-               if (pool->base.clock_sources[i] == NULL) {
-                       dm_error("DC: failed to create clock sources!\n");
-                       BREAK_TO_DEBUGGER();
-                       goto res_create_fail;
-               }
-       }
-
-       pool->base.dmcu = dce_dmcu_create(ctx,
-                       &dmcu_regs,
-                       &dmcu_shift,
-                       &dmcu_mask);
-       if (pool->base.dmcu == NULL) {
-               dm_error("DC: failed to create dmcu!\n");
-               BREAK_TO_DEBUGGER();
-               goto res_create_fail;
-       }
-
-       pool->base.abm = dce_abm_create(ctx,
-                       &abm_regs,
-                       &abm_shift,
-                       &abm_mask);
-       if (pool->base.abm == NULL) {
-               dm_error("DC: failed to create abm!\n");
-               BREAK_TO_DEBUGGER();
-               goto res_create_fail;
-       }
-
-       {
-               struct irq_service_init_data init_data;
-               init_data.ctx = dc->ctx;
-               pool->base.irqs = dal_irq_service_dce110_create(&init_data);
-               if (!pool->base.irqs)
-                       goto res_create_fail;
-       }
-
-       for (i = 0; i < pool->base.pipe_count; i++) {
-               pool->base.timing_generators[i] =
-                               dce112_timing_generator_create(
-                                       ctx,
-                                       i,
-                                       &dce112_tg_offsets[i]);
-               if (pool->base.timing_generators[i] == NULL) {
-                       BREAK_TO_DEBUGGER();
-                       dm_error("DC: failed to create tg!\n");
-                       goto res_create_fail;
-               }
-
-               pool->base.mis[i] = dce112_mem_input_create(ctx, i);
-               if (pool->base.mis[i] == NULL) {
-                       BREAK_TO_DEBUGGER();
-                       dm_error(
-                               "DC: failed to create memory input!\n");
-                       goto res_create_fail;
-               }
-
-               pool->base.ipps[i] = dce112_ipp_create(ctx, i);
-               if (pool->base.ipps[i] == NULL) {
-                       BREAK_TO_DEBUGGER();
-                       dm_error(
-                               "DC:failed to create input pixel processor!\n");
-                       goto res_create_fail;
-               }
-
-               pool->base.transforms[i] = dce112_transform_create(ctx, i);
-               if (pool->base.transforms[i] == NULL) {
-                       BREAK_TO_DEBUGGER();
-                       dm_error(
-                               "DC: failed to create transform!\n");
-                       goto res_create_fail;
-               }
-
-               pool->base.opps[i] = dce112_opp_create(
-                       ctx,
-                       i);
-               if (pool->base.opps[i] == NULL) {
-                       BREAK_TO_DEBUGGER();
-                       dm_error(
-                               "DC:failed to create output pixel processor!\n");
-                       goto res_create_fail;
-               }
-       }
-
-       for (i = 0; i < pool->base.res_cap->num_ddc; i++) {
-               pool->base.engines[i] = dce112_aux_engine_create(ctx, i);
-               if (pool->base.engines[i] == NULL) {
-                       BREAK_TO_DEBUGGER();
-                       dm_error(
-                               "DC:failed to create aux engine!!\n");
-                       goto res_create_fail;
-               }
-               pool->base.hw_i2cs[i] = dce112_i2c_hw_create(ctx, i);
-               if (pool->base.hw_i2cs[i] == NULL) {
-                       BREAK_TO_DEBUGGER();
-                       dm_error(
-                               "DC:failed to create i2c engine!!\n");
-                       goto res_create_fail;
-               }
-               pool->base.sw_i2cs[i] = NULL;
-       }
-
-       if (!resource_construct(num_virtual_links, dc, &pool->base,
-                         &res_create_funcs))
-               goto res_create_fail;
-
-       dc->caps.max_planes =  pool->base.pipe_count;
-
-       for (i = 0; i < dc->caps.max_planes; ++i)
-               dc->caps.planes[i] = plane_cap;
-
-       /* Create hardware sequencer */
-       dce112_hw_sequencer_construct(dc);
-
-       bw_calcs_init(dc->bw_dceip, dc->bw_vbios, dc->ctx->asic_id);
-
-       bw_calcs_data_update_from_pplib(dc);
-
-       return true;
-
-res_create_fail:
-       dce112_resource_destruct(pool);
-       return false;
-}
-
-struct resource_pool *dce112_create_resource_pool(
-       uint8_t num_virtual_links,
-       struct dc *dc)
-{
-       struct dce110_resource_pool *pool =
-               kzalloc(sizeof(struct dce110_resource_pool), GFP_KERNEL);
-
-       if (!pool)
-               return NULL;
-
-       if (dce112_resource_construct(num_virtual_links, dc, pool))
-               return &pool->base;
-
-       kfree(pool);
-       BREAK_TO_DEBUGGER();
-       return NULL;
-}
diff --git a/drivers/gpu/drm/amd/display/dc/dce112/dce112_resource.h b/drivers/gpu/drm/amd/display/dc/dce112/dce112_resource.h
deleted file mode 100644 (file)
index 1f57ebc..0000000
+++ /dev/null
@@ -1,57 +0,0 @@
-/*
-* Copyright 2012-15 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_RESOURCE_DCE112_H__
-#define __DC_RESOURCE_DCE112_H__
-
-#include "core_types.h"
-
-struct dc;
-struct resource_pool;
-
-struct resource_pool *dce112_create_resource_pool(
-       uint8_t num_virtual_links,
-       struct dc *dc);
-
-enum dc_status dce112_validate_with_context(
-               struct dc *dc,
-               const struct dc_validation_set set[],
-               int set_count,
-               struct dc_state *context,
-               struct dc_state *old_context);
-
-bool dce112_validate_bandwidth(
-       struct dc *dc,
-       struct dc_state *context,
-       bool fast_validate);
-
-enum dc_status dce112_add_stream_to_ctx(
-               struct dc *dc,
-               struct dc_state *new_ctx,
-               struct dc_stream_state *dc_stream);
-
-
-#endif /* __DC_RESOURCE_DCE112_H__ */
-
index 097cf407a15d1872dc08a5fac1b0dc77ee4bb1fc..1e3ef68a452a568462cc085845536e6c8c0cb8bc 100644 (file)
@@ -26,7 +26,7 @@
 
 CFLAGS_$(AMDDALPATH)/dc/dce120/dce120_resource.o = $(call cc-disable-warning, override-init)
 
-DCE120 = dce120_resource.o dce120_timing_generator.o \
+DCE120 = dce120_timing_generator.o
 
 AMD_DAL_DCE120 = $(addprefix $(AMDDALPATH)/dc/dce120/,$(DCE120))
 
diff --git a/drivers/gpu/drm/amd/display/dc/dce120/dce120_resource.c b/drivers/gpu/drm/amd/display/dc/dce120/dce120_resource.c
deleted file mode 100644 (file)
index 962de79..0000000
+++ /dev/null
@@ -1,1288 +0,0 @@
-/*
-* Copyright 2012-15 Advanced Micro Devices, Inc.cls
-*
- *
- * 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 "dm_services.h"
-
-
-#include "stream_encoder.h"
-#include "resource.h"
-#include "include/irq_service_interface.h"
-#include "dce120_resource.h"
-
-#include "dce112/dce112_resource.h"
-
-#include "dce110/dce110_resource.h"
-#include "virtual/virtual_stream_encoder.h"
-#include "dce120_timing_generator.h"
-#include "irq/dce120/irq_service_dce120.h"
-#include "dce/dce_opp.h"
-#include "dce/dce_clock_source.h"
-#include "dce/dce_ipp.h"
-#include "dce/dce_mem_input.h"
-#include "dce/dce_panel_cntl.h"
-
-#include "dce110/dce110_hwseq.h"
-#include "dce120/dce120_hwseq.h"
-#include "dce/dce_transform.h"
-#include "clk_mgr.h"
-#include "dce/dce_audio.h"
-#include "dce/dce_link_encoder.h"
-#include "dce/dce_stream_encoder.h"
-#include "dce/dce_hwseq.h"
-#include "dce/dce_abm.h"
-#include "dce/dce_dmcu.h"
-#include "dce/dce_aux.h"
-#include "dce/dce_i2c.h"
-
-#include "dce/dce_12_0_offset.h"
-#include "dce/dce_12_0_sh_mask.h"
-#include "soc15_hw_ip.h"
-#include "vega10_ip_offset.h"
-#include "nbio/nbio_6_1_offset.h"
-#include "mmhub/mmhub_1_0_offset.h"
-#include "mmhub/mmhub_1_0_sh_mask.h"
-#include "reg_helper.h"
-
-#include "dce100/dce100_resource.h"
-
-#ifndef mmDP0_DP_DPHY_INTERNAL_CTRL
-       #define mmDP0_DP_DPHY_INTERNAL_CTRL             0x210f
-       #define mmDP0_DP_DPHY_INTERNAL_CTRL_BASE_IDX    2
-       #define mmDP1_DP_DPHY_INTERNAL_CTRL             0x220f
-       #define mmDP1_DP_DPHY_INTERNAL_CTRL_BASE_IDX    2
-       #define mmDP2_DP_DPHY_INTERNAL_CTRL             0x230f
-       #define mmDP2_DP_DPHY_INTERNAL_CTRL_BASE_IDX    2
-       #define mmDP3_DP_DPHY_INTERNAL_CTRL             0x240f
-       #define mmDP3_DP_DPHY_INTERNAL_CTRL_BASE_IDX    2
-       #define mmDP4_DP_DPHY_INTERNAL_CTRL             0x250f
-       #define mmDP4_DP_DPHY_INTERNAL_CTRL_BASE_IDX    2
-       #define mmDP5_DP_DPHY_INTERNAL_CTRL             0x260f
-       #define mmDP5_DP_DPHY_INTERNAL_CTRL_BASE_IDX    2
-       #define mmDP6_DP_DPHY_INTERNAL_CTRL             0x270f
-       #define mmDP6_DP_DPHY_INTERNAL_CTRL_BASE_IDX    2
-#endif
-
-enum dce120_clk_src_array_id {
-       DCE120_CLK_SRC_PLL0,
-       DCE120_CLK_SRC_PLL1,
-       DCE120_CLK_SRC_PLL2,
-       DCE120_CLK_SRC_PLL3,
-       DCE120_CLK_SRC_PLL4,
-       DCE120_CLK_SRC_PLL5,
-
-       DCE120_CLK_SRC_TOTAL
-};
-
-static const struct dce110_timing_generator_offsets dce120_tg_offsets[] = {
-       {
-               .crtc = (mmCRTC0_CRTC_CONTROL - mmCRTC0_CRTC_CONTROL),
-       },
-       {
-               .crtc = (mmCRTC1_CRTC_CONTROL - mmCRTC0_CRTC_CONTROL),
-       },
-       {
-               .crtc = (mmCRTC2_CRTC_CONTROL - mmCRTC0_CRTC_CONTROL),
-       },
-       {
-               .crtc = (mmCRTC3_CRTC_CONTROL - mmCRTC0_CRTC_CONTROL),
-       },
-       {
-               .crtc = (mmCRTC4_CRTC_CONTROL - mmCRTC0_CRTC_CONTROL),
-       },
-       {
-               .crtc = (mmCRTC5_CRTC_CONTROL - mmCRTC0_CRTC_CONTROL),
-       }
-};
-
-/* begin *********************
- * macros to expend register list macro defined in HW object header file */
-
-#define BASE_INNER(seg) \
-       DCE_BASE__INST0_SEG ## seg
-
-#define NBIO_BASE_INNER(seg) \
-       NBIF_BASE__INST0_SEG ## seg
-
-#define NBIO_BASE(seg) \
-       NBIO_BASE_INNER(seg)
-
-/* compile time expand base address. */
-#define BASE(seg) \
-       BASE_INNER(seg)
-
-#define SR(reg_name)\
-               .reg_name = BASE(mm ## reg_name ## _BASE_IDX) +  \
-                                       mm ## reg_name
-
-#define SRI(reg_name, block, id)\
-       .reg_name = BASE(mm ## block ## id ## _ ## reg_name ## _BASE_IDX) + \
-                                       mm ## block ## id ## _ ## reg_name
-
-/* MMHUB */
-#define MMHUB_BASE_INNER(seg) \
-       MMHUB_BASE__INST0_SEG ## seg
-
-#define MMHUB_BASE(seg) \
-       MMHUB_BASE_INNER(seg)
-
-#define MMHUB_SR(reg_name)\
-               .reg_name = MMHUB_BASE(mm ## reg_name ## _BASE_IDX) +  \
-                                       mm ## reg_name
-
-/* macros to expend register list macro defined in HW object header file
- * end *********************/
-
-
-static const struct dce_dmcu_registers dmcu_regs = {
-               DMCU_DCE110_COMMON_REG_LIST()
-};
-
-static const struct dce_dmcu_shift dmcu_shift = {
-               DMCU_MASK_SH_LIST_DCE110(__SHIFT)
-};
-
-static const struct dce_dmcu_mask dmcu_mask = {
-               DMCU_MASK_SH_LIST_DCE110(_MASK)
-};
-
-static const struct dce_abm_registers abm_regs = {
-               ABM_DCE110_COMMON_REG_LIST()
-};
-
-static const struct dce_abm_shift abm_shift = {
-               ABM_MASK_SH_LIST_DCE110(__SHIFT)
-};
-
-static const struct dce_abm_mask abm_mask = {
-               ABM_MASK_SH_LIST_DCE110(_MASK)
-};
-
-#define ipp_regs(id)\
-[id] = {\
-               IPP_DCE110_REG_LIST_DCE_BASE(id)\
-}
-
-static const struct dce_ipp_registers ipp_regs[] = {
-               ipp_regs(0),
-               ipp_regs(1),
-               ipp_regs(2),
-               ipp_regs(3),
-               ipp_regs(4),
-               ipp_regs(5)
-};
-
-static const struct dce_ipp_shift ipp_shift = {
-               IPP_DCE120_MASK_SH_LIST_SOC_BASE(__SHIFT)
-};
-
-static const struct dce_ipp_mask ipp_mask = {
-               IPP_DCE120_MASK_SH_LIST_SOC_BASE(_MASK)
-};
-
-#define transform_regs(id)\
-[id] = {\
-               XFM_COMMON_REG_LIST_DCE110(id)\
-}
-
-static const struct dce_transform_registers xfm_regs[] = {
-               transform_regs(0),
-               transform_regs(1),
-               transform_regs(2),
-               transform_regs(3),
-               transform_regs(4),
-               transform_regs(5)
-};
-
-static const struct dce_transform_shift xfm_shift = {
-               XFM_COMMON_MASK_SH_LIST_SOC_BASE(__SHIFT)
-};
-
-static const struct dce_transform_mask xfm_mask = {
-               XFM_COMMON_MASK_SH_LIST_SOC_BASE(_MASK)
-};
-
-#define aux_regs(id)\
-[id] = {\
-       AUX_REG_LIST(id)\
-}
-
-static const struct dce110_link_enc_aux_registers link_enc_aux_regs[] = {
-               aux_regs(0),
-               aux_regs(1),
-               aux_regs(2),
-               aux_regs(3),
-               aux_regs(4),
-               aux_regs(5)
-};
-
-#define hpd_regs(id)\
-[id] = {\
-       HPD_REG_LIST(id)\
-}
-
-static const struct dce110_link_enc_hpd_registers link_enc_hpd_regs[] = {
-               hpd_regs(0),
-               hpd_regs(1),
-               hpd_regs(2),
-               hpd_regs(3),
-               hpd_regs(4),
-               hpd_regs(5)
-};
-
-#define link_regs(id)\
-[id] = {\
-       LE_DCE120_REG_LIST(id), \
-       SRI(DP_DPHY_INTERNAL_CTRL, DP, id) \
-}
-
-static const struct dce110_link_enc_registers link_enc_regs[] = {
-       link_regs(0),
-       link_regs(1),
-       link_regs(2),
-       link_regs(3),
-       link_regs(4),
-       link_regs(5),
-       link_regs(6),
-};
-
-
-#define stream_enc_regs(id)\
-[id] = {\
-       SE_COMMON_REG_LIST(id),\
-       .TMDS_CNTL = 0,\
-}
-
-static const struct dce110_stream_enc_registers stream_enc_regs[] = {
-       stream_enc_regs(0),
-       stream_enc_regs(1),
-       stream_enc_regs(2),
-       stream_enc_regs(3),
-       stream_enc_regs(4),
-       stream_enc_regs(5)
-};
-
-static const struct dce_stream_encoder_shift se_shift = {
-               SE_COMMON_MASK_SH_LIST_DCE120(__SHIFT)
-};
-
-static const struct dce_stream_encoder_mask se_mask = {
-               SE_COMMON_MASK_SH_LIST_DCE120(_MASK)
-};
-
-static const struct dce_panel_cntl_registers panel_cntl_regs[] = {
-       { DCE_PANEL_CNTL_REG_LIST() }
-};
-
-static const struct dce_panel_cntl_shift panel_cntl_shift = {
-       DCE_PANEL_CNTL_MASK_SH_LIST(__SHIFT)
-};
-
-static const struct dce_panel_cntl_mask panel_cntl_mask = {
-       DCE_PANEL_CNTL_MASK_SH_LIST(_MASK)
-};
-
-static const struct dce110_aux_registers_shift aux_shift = {
-       DCE12_AUX_MASK_SH_LIST(__SHIFT)
-};
-
-static const struct dce110_aux_registers_mask aux_mask = {
-       DCE12_AUX_MASK_SH_LIST(_MASK)
-};
-
-#define opp_regs(id)\
-[id] = {\
-       OPP_DCE_120_REG_LIST(id),\
-}
-
-static const struct dce_opp_registers opp_regs[] = {
-       opp_regs(0),
-       opp_regs(1),
-       opp_regs(2),
-       opp_regs(3),
-       opp_regs(4),
-       opp_regs(5)
-};
-
-static const struct dce_opp_shift opp_shift = {
-       OPP_COMMON_MASK_SH_LIST_DCE_120(__SHIFT)
-};
-
-static const struct dce_opp_mask opp_mask = {
-       OPP_COMMON_MASK_SH_LIST_DCE_120(_MASK)
-};
- #define aux_engine_regs(id)\
-[id] = {\
-       AUX_COMMON_REG_LIST(id), \
-       .AUX_RESET_MASK = 0 \
-}
-
-static const struct dce110_aux_registers aux_engine_regs[] = {
-               aux_engine_regs(0),
-               aux_engine_regs(1),
-               aux_engine_regs(2),
-               aux_engine_regs(3),
-               aux_engine_regs(4),
-               aux_engine_regs(5)
-};
-
-#define audio_regs(id)\
-[id] = {\
-       AUD_COMMON_REG_LIST(id)\
-}
-
-static const struct dce_audio_registers audio_regs[] = {
-       audio_regs(0),
-       audio_regs(1),
-       audio_regs(2),
-       audio_regs(3),
-       audio_regs(4),
-       audio_regs(5),
-       audio_regs(6),
-};
-
-#define DCE120_AUD_COMMON_MASK_SH_LIST(mask_sh)\
-               SF(AZF0ENDPOINT0_AZALIA_F0_CODEC_ENDPOINT_INDEX, AZALIA_ENDPOINT_REG_INDEX, mask_sh),\
-               SF(AZF0ENDPOINT0_AZALIA_F0_CODEC_ENDPOINT_DATA, AZALIA_ENDPOINT_REG_DATA, mask_sh),\
-               AUD_COMMON_MASK_SH_LIST_BASE(mask_sh)
-
-static const struct dce_audio_shift audio_shift = {
-               DCE120_AUD_COMMON_MASK_SH_LIST(__SHIFT)
-};
-
-static const struct dce_audio_mask audio_mask = {
-               DCE120_AUD_COMMON_MASK_SH_LIST(_MASK)
-};
-
-static int map_transmitter_id_to_phy_instance(
-       enum transmitter transmitter)
-{
-       switch (transmitter) {
-       case TRANSMITTER_UNIPHY_A:
-               return 0;
-       case TRANSMITTER_UNIPHY_B:
-               return 1;
-       case TRANSMITTER_UNIPHY_C:
-               return 2;
-       case TRANSMITTER_UNIPHY_D:
-               return 3;
-       case TRANSMITTER_UNIPHY_E:
-               return 4;
-       case TRANSMITTER_UNIPHY_F:
-               return 5;
-       case TRANSMITTER_UNIPHY_G:
-               return 6;
-       default:
-               ASSERT(0);
-               return 0;
-       }
-}
-
-#define clk_src_regs(index, id)\
-[index] = {\
-       CS_COMMON_REG_LIST_DCE_112(id),\
-}
-
-static const struct dce110_clk_src_regs clk_src_regs[] = {
-       clk_src_regs(0, A),
-       clk_src_regs(1, B),
-       clk_src_regs(2, C),
-       clk_src_regs(3, D),
-       clk_src_regs(4, E),
-       clk_src_regs(5, F)
-};
-
-static const struct dce110_clk_src_shift cs_shift = {
-               CS_COMMON_MASK_SH_LIST_DCE_112(__SHIFT)
-};
-
-static const struct dce110_clk_src_mask cs_mask = {
-               CS_COMMON_MASK_SH_LIST_DCE_112(_MASK)
-};
-
-static struct output_pixel_processor *dce120_opp_create(
-       struct dc_context *ctx,
-       uint32_t inst)
-{
-       struct dce110_opp *opp =
-               kzalloc(sizeof(struct dce110_opp), GFP_KERNEL);
-
-       if (!opp)
-               return NULL;
-
-       dce110_opp_construct(opp,
-                            ctx, inst, &opp_regs[inst], &opp_shift, &opp_mask);
-       return &opp->base;
-}
-static struct dce_aux *dce120_aux_engine_create(
-       struct dc_context *ctx,
-       uint32_t inst)
-{
-       struct aux_engine_dce110 *aux_engine =
-               kzalloc(sizeof(struct aux_engine_dce110), GFP_KERNEL);
-
-       if (!aux_engine)
-               return NULL;
-
-       dce110_aux_engine_construct(aux_engine, ctx, inst,
-                                   SW_AUX_TIMEOUT_PERIOD_MULTIPLIER * AUX_TIMEOUT_PERIOD,
-                                   &aux_engine_regs[inst],
-                                       &aux_mask,
-                                       &aux_shift,
-                                       ctx->dc->caps.extended_aux_timeout_support);
-
-       return &aux_engine->base;
-}
-#define i2c_inst_regs(id) { I2C_HW_ENGINE_COMMON_REG_LIST(id) }
-
-static const struct dce_i2c_registers i2c_hw_regs[] = {
-               i2c_inst_regs(1),
-               i2c_inst_regs(2),
-               i2c_inst_regs(3),
-               i2c_inst_regs(4),
-               i2c_inst_regs(5),
-               i2c_inst_regs(6),
-};
-
-static const struct dce_i2c_shift i2c_shifts = {
-               I2C_COMMON_MASK_SH_LIST_DCE110(__SHIFT)
-};
-
-static const struct dce_i2c_mask i2c_masks = {
-               I2C_COMMON_MASK_SH_LIST_DCE110(_MASK)
-};
-
-static struct dce_i2c_hw *dce120_i2c_hw_create(
-       struct dc_context *ctx,
-       uint32_t inst)
-{
-       struct dce_i2c_hw *dce_i2c_hw =
-               kzalloc(sizeof(struct dce_i2c_hw), GFP_KERNEL);
-
-       if (!dce_i2c_hw)
-               return NULL;
-
-       dce112_i2c_hw_construct(dce_i2c_hw, ctx, inst,
-                                   &i2c_hw_regs[inst], &i2c_shifts, &i2c_masks);
-
-       return dce_i2c_hw;
-}
-static const struct bios_registers bios_regs = {
-       .BIOS_SCRATCH_3 = mmBIOS_SCRATCH_3 + NBIO_BASE(mmBIOS_SCRATCH_3_BASE_IDX),
-       .BIOS_SCRATCH_6 = mmBIOS_SCRATCH_6 + NBIO_BASE(mmBIOS_SCRATCH_6_BASE_IDX)
-};
-
-static const struct resource_caps res_cap = {
-               .num_timing_generator = 6,
-               .num_audio = 7,
-               .num_stream_encoder = 6,
-               .num_pll = 6,
-               .num_ddc = 6,
-};
-
-static const struct dc_plane_cap plane_cap = {
-       .type = DC_PLANE_TYPE_DCE_RGB,
-
-       .pixel_format_support = {
-                       .argb8888 = true,
-                       .nv12 = false,
-                       .fp16 = true
-       },
-
-       .max_upscale_factor = {
-                       .argb8888 = 16000,
-                       .nv12 = 1,
-                       .fp16 = 1
-       },
-
-       .max_downscale_factor = {
-                       .argb8888 = 250,
-                       .nv12 = 1,
-                       .fp16 = 1
-       }
-};
-
-static const struct dc_debug_options debug_defaults = {
-               .disable_clock_gate = true,
-               .enable_legacy_fast_update = true,
-};
-
-static struct clock_source *dce120_clock_source_create(
-       struct dc_context *ctx,
-       struct dc_bios *bios,
-       enum clock_source_id id,
-       const struct dce110_clk_src_regs *regs,
-       bool dp_clk_src)
-{
-       struct dce110_clk_src *clk_src =
-               kzalloc(sizeof(*clk_src), GFP_KERNEL);
-
-       if (!clk_src)
-               return NULL;
-
-       if (dce112_clk_src_construct(clk_src, ctx, bios, id,
-                                    regs, &cs_shift, &cs_mask)) {
-               clk_src->base.dp_clk_src = dp_clk_src;
-               return &clk_src->base;
-       }
-
-       kfree(clk_src);
-       BREAK_TO_DEBUGGER();
-       return NULL;
-}
-
-static void dce120_clock_source_destroy(struct clock_source **clk_src)
-{
-       kfree(TO_DCE110_CLK_SRC(*clk_src));
-       *clk_src = NULL;
-}
-
-
-static bool dce120_hw_sequencer_create(struct dc *dc)
-{
-       /* All registers used by dce11.2 match those in dce11 in offset and
-        * structure
-        */
-       dce120_hw_sequencer_construct(dc);
-
-       /*TODO  Move to separate file and Override what is needed */
-
-       return true;
-}
-
-static struct timing_generator *dce120_timing_generator_create(
-               struct dc_context *ctx,
-               uint32_t instance,
-               const struct dce110_timing_generator_offsets *offsets)
-{
-       struct dce110_timing_generator *tg110 =
-               kzalloc(sizeof(struct dce110_timing_generator), GFP_KERNEL);
-
-       if (!tg110)
-               return NULL;
-
-       dce120_timing_generator_construct(tg110, ctx, instance, offsets);
-       return &tg110->base;
-}
-
-static void dce120_transform_destroy(struct transform **xfm)
-{
-       kfree(TO_DCE_TRANSFORM(*xfm));
-       *xfm = NULL;
-}
-
-static void dce120_resource_destruct(struct dce110_resource_pool *pool)
-{
-       unsigned int i;
-
-       for (i = 0; i < pool->base.pipe_count; i++) {
-               if (pool->base.opps[i] != NULL)
-                       dce110_opp_destroy(&pool->base.opps[i]);
-
-               if (pool->base.transforms[i] != NULL)
-                       dce120_transform_destroy(&pool->base.transforms[i]);
-
-               if (pool->base.ipps[i] != NULL)
-                       dce_ipp_destroy(&pool->base.ipps[i]);
-
-               if (pool->base.mis[i] != NULL) {
-                       kfree(TO_DCE_MEM_INPUT(pool->base.mis[i]));
-                       pool->base.mis[i] = NULL;
-               }
-
-               if (pool->base.irqs != NULL) {
-                       dal_irq_service_destroy(&pool->base.irqs);
-               }
-
-               if (pool->base.timing_generators[i] != NULL) {
-                       kfree(DCE110TG_FROM_TG(pool->base.timing_generators[i]));
-                       pool->base.timing_generators[i] = NULL;
-               }
-       }
-
-       for (i = 0; i < pool->base.res_cap->num_ddc; i++) {
-               if (pool->base.engines[i] != NULL)
-                       dce110_engine_destroy(&pool->base.engines[i]);
-               if (pool->base.hw_i2cs[i] != NULL) {
-                       kfree(pool->base.hw_i2cs[i]);
-                       pool->base.hw_i2cs[i] = NULL;
-               }
-               if (pool->base.sw_i2cs[i] != NULL) {
-                       kfree(pool->base.sw_i2cs[i]);
-                       pool->base.sw_i2cs[i] = NULL;
-               }
-       }
-
-       for (i = 0; i < pool->base.audio_count; i++) {
-               if (pool->base.audios[i])
-                       dce_aud_destroy(&pool->base.audios[i]);
-       }
-
-       for (i = 0; i < pool->base.stream_enc_count; i++) {
-               if (pool->base.stream_enc[i] != NULL)
-                       kfree(DCE110STRENC_FROM_STRENC(pool->base.stream_enc[i]));
-       }
-
-       for (i = 0; i < pool->base.clk_src_count; i++) {
-               if (pool->base.clock_sources[i] != NULL)
-                       dce120_clock_source_destroy(
-                               &pool->base.clock_sources[i]);
-       }
-
-       if (pool->base.dp_clock_source != NULL)
-               dce120_clock_source_destroy(&pool->base.dp_clock_source);
-
-       if (pool->base.abm != NULL)
-               dce_abm_destroy(&pool->base.abm);
-
-       if (pool->base.dmcu != NULL)
-               dce_dmcu_destroy(&pool->base.dmcu);
-}
-
-static void read_dce_straps(
-       struct dc_context *ctx,
-       struct resource_straps *straps)
-{
-       uint32_t reg_val = dm_read_reg_soc15(ctx, mmCC_DC_MISC_STRAPS, 0);
-
-       straps->audio_stream_number = get_reg_field_value(reg_val,
-                                                         CC_DC_MISC_STRAPS,
-                                                         AUDIO_STREAM_NUMBER);
-       straps->hdmi_disable = get_reg_field_value(reg_val,
-                                                  CC_DC_MISC_STRAPS,
-                                                  HDMI_DISABLE);
-
-       reg_val = dm_read_reg_soc15(ctx, mmDC_PINSTRAPS, 0);
-       straps->dc_pinstraps_audio = get_reg_field_value(reg_val,
-                                                        DC_PINSTRAPS,
-                                                        DC_PINSTRAPS_AUDIO);
-}
-
-static struct audio *create_audio(
-               struct dc_context *ctx, unsigned int inst)
-{
-       return dce_audio_create(ctx, inst,
-                       &audio_regs[inst], &audio_shift, &audio_mask);
-}
-
-static const struct encoder_feature_support link_enc_feature = {
-               .max_hdmi_deep_color = COLOR_DEPTH_121212,
-               .max_hdmi_pixel_clock = 600000,
-               .hdmi_ycbcr420_supported = true,
-               .dp_ycbcr420_supported = false,
-               .flags.bits.IS_HBR2_CAPABLE = true,
-               .flags.bits.IS_HBR3_CAPABLE = true,
-               .flags.bits.IS_TPS3_CAPABLE = true,
-               .flags.bits.IS_TPS4_CAPABLE = true,
-};
-
-static struct link_encoder *dce120_link_encoder_create(
-       struct dc_context *ctx,
-       const struct encoder_init_data *enc_init_data)
-{
-       struct dce110_link_encoder *enc110 =
-               kzalloc(sizeof(struct dce110_link_encoder), GFP_KERNEL);
-       int link_regs_id;
-
-       if (!enc110)
-               return NULL;
-
-       link_regs_id =
-               map_transmitter_id_to_phy_instance(enc_init_data->transmitter);
-
-       dce110_link_encoder_construct(enc110,
-                                     enc_init_data,
-                                     &link_enc_feature,
-                                     &link_enc_regs[link_regs_id],
-                                     &link_enc_aux_regs[enc_init_data->channel - 1],
-                                     &link_enc_hpd_regs[enc_init_data->hpd_source]);
-
-       return &enc110->base;
-}
-
-static struct panel_cntl *dce120_panel_cntl_create(const struct panel_cntl_init_data *init_data)
-{
-       struct dce_panel_cntl *panel_cntl =
-               kzalloc(sizeof(struct dce_panel_cntl), GFP_KERNEL);
-
-       if (!panel_cntl)
-               return NULL;
-
-       dce_panel_cntl_construct(panel_cntl,
-                       init_data,
-                       &panel_cntl_regs[init_data->inst],
-                       &panel_cntl_shift,
-                       &panel_cntl_mask);
-
-       return &panel_cntl->base;
-}
-
-static struct input_pixel_processor *dce120_ipp_create(
-       struct dc_context *ctx, uint32_t inst)
-{
-       struct dce_ipp *ipp = kzalloc(sizeof(struct dce_ipp), GFP_KERNEL);
-
-       if (!ipp) {
-               BREAK_TO_DEBUGGER();
-               return NULL;
-       }
-
-       dce_ipp_construct(ipp, ctx, inst,
-                       &ipp_regs[inst], &ipp_shift, &ipp_mask);
-       return &ipp->base;
-}
-
-static struct stream_encoder *dce120_stream_encoder_create(
-       enum engine_id eng_id,
-       struct dc_context *ctx)
-{
-       struct dce110_stream_encoder *enc110 =
-               kzalloc(sizeof(struct dce110_stream_encoder), GFP_KERNEL);
-
-       if (!enc110)
-               return NULL;
-
-       dce110_stream_encoder_construct(enc110, ctx, ctx->dc_bios, eng_id,
-                                       &stream_enc_regs[eng_id],
-                                       &se_shift, &se_mask);
-       return &enc110->base;
-}
-
-#define SRII(reg_name, block, id)\
-       .reg_name[id] = BASE(mm ## block ## id ## _ ## reg_name ## _BASE_IDX) + \
-                                       mm ## block ## id ## _ ## reg_name
-
-static const struct dce_hwseq_registers hwseq_reg = {
-               HWSEQ_DCE120_REG_LIST()
-};
-
-static const struct dce_hwseq_shift hwseq_shift = {
-               HWSEQ_DCE12_MASK_SH_LIST(__SHIFT)
-};
-
-static const struct dce_hwseq_mask hwseq_mask = {
-               HWSEQ_DCE12_MASK_SH_LIST(_MASK)
-};
-
-/* HWSEQ regs for VG20 */
-static const struct dce_hwseq_registers dce121_hwseq_reg = {
-               HWSEQ_VG20_REG_LIST()
-};
-
-static const struct dce_hwseq_shift dce121_hwseq_shift = {
-               HWSEQ_VG20_MASK_SH_LIST(__SHIFT)
-};
-
-static const struct dce_hwseq_mask dce121_hwseq_mask = {
-               HWSEQ_VG20_MASK_SH_LIST(_MASK)
-};
-
-static struct dce_hwseq *dce120_hwseq_create(
-       struct dc_context *ctx)
-{
-       struct dce_hwseq *hws = kzalloc(sizeof(struct dce_hwseq), GFP_KERNEL);
-
-       if (hws) {
-               hws->ctx = ctx;
-               hws->regs = &hwseq_reg;
-               hws->shifts = &hwseq_shift;
-               hws->masks = &hwseq_mask;
-       }
-       return hws;
-}
-
-static struct dce_hwseq *dce121_hwseq_create(
-       struct dc_context *ctx)
-{
-       struct dce_hwseq *hws = kzalloc(sizeof(struct dce_hwseq), GFP_KERNEL);
-
-       if (hws) {
-               hws->ctx = ctx;
-               hws->regs = &dce121_hwseq_reg;
-               hws->shifts = &dce121_hwseq_shift;
-               hws->masks = &dce121_hwseq_mask;
-       }
-       return hws;
-}
-
-static const struct resource_create_funcs res_create_funcs = {
-       .read_dce_straps = read_dce_straps,
-       .create_audio = create_audio,
-       .create_stream_encoder = dce120_stream_encoder_create,
-       .create_hwseq = dce120_hwseq_create,
-};
-
-static const struct resource_create_funcs dce121_res_create_funcs = {
-       .read_dce_straps = read_dce_straps,
-       .create_audio = create_audio,
-       .create_stream_encoder = dce120_stream_encoder_create,
-       .create_hwseq = dce121_hwseq_create,
-};
-
-
-#define mi_inst_regs(id) { MI_DCE12_REG_LIST(id) }
-static const struct dce_mem_input_registers mi_regs[] = {
-               mi_inst_regs(0),
-               mi_inst_regs(1),
-               mi_inst_regs(2),
-               mi_inst_regs(3),
-               mi_inst_regs(4),
-               mi_inst_regs(5),
-};
-
-static const struct dce_mem_input_shift mi_shifts = {
-               MI_DCE12_MASK_SH_LIST(__SHIFT)
-};
-
-static const struct dce_mem_input_mask mi_masks = {
-               MI_DCE12_MASK_SH_LIST(_MASK)
-};
-
-static struct mem_input *dce120_mem_input_create(
-       struct dc_context *ctx,
-       uint32_t inst)
-{
-       struct dce_mem_input *dce_mi = kzalloc(sizeof(struct dce_mem_input),
-                                              GFP_KERNEL);
-
-       if (!dce_mi) {
-               BREAK_TO_DEBUGGER();
-               return NULL;
-       }
-
-       dce120_mem_input_construct(dce_mi, ctx, inst, &mi_regs[inst], &mi_shifts, &mi_masks);
-       return &dce_mi->base;
-}
-
-static struct transform *dce120_transform_create(
-       struct dc_context *ctx,
-       uint32_t inst)
-{
-       struct dce_transform *transform =
-               kzalloc(sizeof(struct dce_transform), GFP_KERNEL);
-
-       if (!transform)
-               return NULL;
-
-       dce_transform_construct(transform, ctx, inst,
-                               &xfm_regs[inst], &xfm_shift, &xfm_mask);
-       transform->lb_memory_size = 0x1404; /*5124*/
-       return &transform->base;
-}
-
-static void dce120_destroy_resource_pool(struct resource_pool **pool)
-{
-       struct dce110_resource_pool *dce110_pool = TO_DCE110_RES_POOL(*pool);
-
-       dce120_resource_destruct(dce110_pool);
-       kfree(dce110_pool);
-       *pool = NULL;
-}
-
-static const struct resource_funcs dce120_res_pool_funcs = {
-       .destroy = dce120_destroy_resource_pool,
-       .link_enc_create = dce120_link_encoder_create,
-       .panel_cntl_create = dce120_panel_cntl_create,
-       .validate_bandwidth = dce112_validate_bandwidth,
-       .validate_plane = dce100_validate_plane,
-       .add_stream_to_ctx = dce112_add_stream_to_ctx,
-       .find_first_free_match_stream_enc_for_link = dce110_find_first_free_match_stream_enc_for_link
-};
-
-static void bw_calcs_data_update_from_pplib(struct dc *dc)
-{
-       struct dm_pp_clock_levels_with_latency eng_clks = {0};
-       struct dm_pp_clock_levels_with_latency mem_clks = {0};
-       struct dm_pp_wm_sets_with_clock_ranges clk_ranges = {0};
-       int i;
-       unsigned int clk;
-       unsigned int latency;
-       /*original logic in dal3*/
-       int memory_type_multiplier = MEMORY_TYPE_MULTIPLIER_CZ;
-
-       /*do system clock*/
-       if (!dm_pp_get_clock_levels_by_type_with_latency(
-                               dc->ctx,
-                               DM_PP_CLOCK_TYPE_ENGINE_CLK,
-                               &eng_clks) || eng_clks.num_levels == 0) {
-
-               eng_clks.num_levels = 8;
-               clk = 300000;
-
-               for (i = 0; i < eng_clks.num_levels; i++) {
-                       eng_clks.data[i].clocks_in_khz = clk;
-                       clk += 100000;
-               }
-       }
-
-       /* convert all the clock fro kHz to fix point mHz  TODO: wloop data */
-       dc->bw_vbios->high_sclk = bw_frc_to_fixed(
-               eng_clks.data[eng_clks.num_levels-1].clocks_in_khz, 1000);
-       dc->bw_vbios->mid1_sclk  = bw_frc_to_fixed(
-               eng_clks.data[eng_clks.num_levels/8].clocks_in_khz, 1000);
-       dc->bw_vbios->mid2_sclk  = bw_frc_to_fixed(
-               eng_clks.data[eng_clks.num_levels*2/8].clocks_in_khz, 1000);
-       dc->bw_vbios->mid3_sclk  = bw_frc_to_fixed(
-               eng_clks.data[eng_clks.num_levels*3/8].clocks_in_khz, 1000);
-       dc->bw_vbios->mid4_sclk  = bw_frc_to_fixed(
-               eng_clks.data[eng_clks.num_levels*4/8].clocks_in_khz, 1000);
-       dc->bw_vbios->mid5_sclk  = bw_frc_to_fixed(
-               eng_clks.data[eng_clks.num_levels*5/8].clocks_in_khz, 1000);
-       dc->bw_vbios->mid6_sclk  = bw_frc_to_fixed(
-               eng_clks.data[eng_clks.num_levels*6/8].clocks_in_khz, 1000);
-       dc->bw_vbios->low_sclk  = bw_frc_to_fixed(
-                       eng_clks.data[0].clocks_in_khz, 1000);
-
-       /*do memory clock*/
-       if (!dm_pp_get_clock_levels_by_type_with_latency(
-                       dc->ctx,
-                       DM_PP_CLOCK_TYPE_MEMORY_CLK,
-                       &mem_clks) || mem_clks.num_levels == 0) {
-
-               mem_clks.num_levels = 3;
-               clk = 250000;
-               latency = 45;
-
-               for (i = 0; i < eng_clks.num_levels; i++) {
-                       mem_clks.data[i].clocks_in_khz = clk;
-                       mem_clks.data[i].latency_in_us = latency;
-                       clk += 500000;
-                       latency -= 5;
-               }
-
-       }
-
-       /* we don't need to call PPLIB for validation clock since they
-        * also give us the highest sclk and highest mclk (UMA clock).
-        * ALSO always convert UMA clock (from PPLIB)  to YCLK (HW formula):
-        * YCLK = UMACLK*m_memoryTypeMultiplier
-        */
-       if (dc->bw_vbios->memory_type == bw_def_hbm)
-               memory_type_multiplier = MEMORY_TYPE_HBM;
-
-       dc->bw_vbios->low_yclk = bw_frc_to_fixed(
-               mem_clks.data[0].clocks_in_khz * memory_type_multiplier, 1000);
-       dc->bw_vbios->mid_yclk = bw_frc_to_fixed(
-               mem_clks.data[mem_clks.num_levels>>1].clocks_in_khz * memory_type_multiplier,
-               1000);
-       dc->bw_vbios->high_yclk = bw_frc_to_fixed(
-               mem_clks.data[mem_clks.num_levels-1].clocks_in_khz * memory_type_multiplier,
-               1000);
-
-       /* Now notify PPLib/SMU about which Watermarks sets they should select
-        * depending on DPM state they are in. And update BW MGR GFX Engine and
-        * Memory clock member variables for Watermarks calculations for each
-        * Watermark Set
-        */
-       clk_ranges.num_wm_sets = 4;
-       clk_ranges.wm_clk_ranges[0].wm_set_id = WM_SET_A;
-       clk_ranges.wm_clk_ranges[0].wm_min_eng_clk_in_khz =
-                       eng_clks.data[0].clocks_in_khz;
-       clk_ranges.wm_clk_ranges[0].wm_max_eng_clk_in_khz =
-                       eng_clks.data[eng_clks.num_levels*3/8].clocks_in_khz - 1;
-       clk_ranges.wm_clk_ranges[0].wm_min_mem_clk_in_khz =
-                       mem_clks.data[0].clocks_in_khz;
-       clk_ranges.wm_clk_ranges[0].wm_max_mem_clk_in_khz =
-                       mem_clks.data[mem_clks.num_levels>>1].clocks_in_khz - 1;
-
-       clk_ranges.wm_clk_ranges[1].wm_set_id = WM_SET_B;
-       clk_ranges.wm_clk_ranges[1].wm_min_eng_clk_in_khz =
-                       eng_clks.data[eng_clks.num_levels*3/8].clocks_in_khz;
-       /* 5 GHz instead of data[7].clockInKHz to cover Overdrive */
-       clk_ranges.wm_clk_ranges[1].wm_max_eng_clk_in_khz = 5000000;
-       clk_ranges.wm_clk_ranges[1].wm_min_mem_clk_in_khz =
-                       mem_clks.data[0].clocks_in_khz;
-       clk_ranges.wm_clk_ranges[1].wm_max_mem_clk_in_khz =
-                       mem_clks.data[mem_clks.num_levels>>1].clocks_in_khz - 1;
-
-       clk_ranges.wm_clk_ranges[2].wm_set_id = WM_SET_C;
-       clk_ranges.wm_clk_ranges[2].wm_min_eng_clk_in_khz =
-                       eng_clks.data[0].clocks_in_khz;
-       clk_ranges.wm_clk_ranges[2].wm_max_eng_clk_in_khz =
-                       eng_clks.data[eng_clks.num_levels*3/8].clocks_in_khz - 1;
-       clk_ranges.wm_clk_ranges[2].wm_min_mem_clk_in_khz =
-                       mem_clks.data[mem_clks.num_levels>>1].clocks_in_khz;
-       /* 5 GHz instead of data[2].clockInKHz to cover Overdrive */
-       clk_ranges.wm_clk_ranges[2].wm_max_mem_clk_in_khz = 5000000;
-
-       clk_ranges.wm_clk_ranges[3].wm_set_id = WM_SET_D;
-       clk_ranges.wm_clk_ranges[3].wm_min_eng_clk_in_khz =
-                       eng_clks.data[eng_clks.num_levels*3/8].clocks_in_khz;
-       /* 5 GHz instead of data[7].clockInKHz to cover Overdrive */
-       clk_ranges.wm_clk_ranges[3].wm_max_eng_clk_in_khz = 5000000;
-       clk_ranges.wm_clk_ranges[3].wm_min_mem_clk_in_khz =
-                       mem_clks.data[mem_clks.num_levels>>1].clocks_in_khz;
-       /* 5 GHz instead of data[2].clockInKHz to cover Overdrive */
-       clk_ranges.wm_clk_ranges[3].wm_max_mem_clk_in_khz = 5000000;
-
-       /* Notify PP Lib/SMU which Watermarks to use for which clock ranges */
-       dm_pp_notify_wm_clock_changes(dc->ctx, &clk_ranges);
-}
-
-static uint32_t read_pipe_fuses(struct dc_context *ctx)
-{
-       uint32_t value = dm_read_reg_soc15(ctx, mmCC_DC_PIPE_DIS, 0);
-       /* VG20 support max 6 pipes */
-       value = value & 0x3f;
-       return value;
-}
-
-static bool dce120_resource_construct(
-       uint8_t num_virtual_links,
-       struct dc *dc,
-       struct dce110_resource_pool *pool)
-{
-       unsigned int i;
-       int j;
-       struct dc_context *ctx = dc->ctx;
-       struct irq_service_init_data irq_init_data;
-       static const struct resource_create_funcs *res_funcs;
-       bool is_vg20 = ASICREV_IS_VEGA20_P(ctx->asic_id.hw_internal_rev);
-       uint32_t pipe_fuses;
-
-       ctx->dc_bios->regs = &bios_regs;
-
-       pool->base.res_cap = &res_cap;
-       pool->base.funcs = &dce120_res_pool_funcs;
-
-       /* TODO: Fill more data from GreenlandAsicCapability.cpp */
-       pool->base.pipe_count = res_cap.num_timing_generator;
-       pool->base.timing_generator_count = pool->base.res_cap->num_timing_generator;
-       pool->base.underlay_pipe_index = NO_UNDERLAY_PIPE;
-
-       dc->caps.max_downscale_ratio = 200;
-       dc->caps.i2c_speed_in_khz = 100;
-       dc->caps.i2c_speed_in_khz_hdcp = 100; /*1.4 w/a not applied by default*/
-       dc->caps.max_cursor_size = 128;
-       dc->caps.min_horizontal_blanking_period = 80;
-       dc->caps.dual_link_dvi = true;
-       dc->caps.psp_setup_panel_mode = true;
-       dc->caps.extended_aux_timeout_support = false;
-       dc->debug = debug_defaults;
-
-       /*************************************************
-        *  Create resources                             *
-        *************************************************/
-
-       pool->base.clock_sources[DCE120_CLK_SRC_PLL0] =
-                       dce120_clock_source_create(ctx, ctx->dc_bios,
-                               CLOCK_SOURCE_COMBO_PHY_PLL0,
-                               &clk_src_regs[0], false);
-       pool->base.clock_sources[DCE120_CLK_SRC_PLL1] =
-                       dce120_clock_source_create(ctx, ctx->dc_bios,
-                               CLOCK_SOURCE_COMBO_PHY_PLL1,
-                               &clk_src_regs[1], false);
-       pool->base.clock_sources[DCE120_CLK_SRC_PLL2] =
-                       dce120_clock_source_create(ctx, ctx->dc_bios,
-                               CLOCK_SOURCE_COMBO_PHY_PLL2,
-                               &clk_src_regs[2], false);
-       pool->base.clock_sources[DCE120_CLK_SRC_PLL3] =
-                       dce120_clock_source_create(ctx, ctx->dc_bios,
-                               CLOCK_SOURCE_COMBO_PHY_PLL3,
-                               &clk_src_regs[3], false);
-       pool->base.clock_sources[DCE120_CLK_SRC_PLL4] =
-                       dce120_clock_source_create(ctx, ctx->dc_bios,
-                               CLOCK_SOURCE_COMBO_PHY_PLL4,
-                               &clk_src_regs[4], false);
-       pool->base.clock_sources[DCE120_CLK_SRC_PLL5] =
-                       dce120_clock_source_create(ctx, ctx->dc_bios,
-                               CLOCK_SOURCE_COMBO_PHY_PLL5,
-                               &clk_src_regs[5], false);
-       pool->base.clk_src_count = DCE120_CLK_SRC_TOTAL;
-
-       pool->base.dp_clock_source =
-                       dce120_clock_source_create(ctx, ctx->dc_bios,
-                               CLOCK_SOURCE_ID_DP_DTO,
-                               &clk_src_regs[0], true);
-
-       for (i = 0; i < pool->base.clk_src_count; i++) {
-               if (pool->base.clock_sources[i] == NULL) {
-                       dm_error("DC: failed to create clock sources!\n");
-                       BREAK_TO_DEBUGGER();
-                       goto clk_src_create_fail;
-               }
-       }
-
-       pool->base.dmcu = dce_dmcu_create(ctx,
-                       &dmcu_regs,
-                       &dmcu_shift,
-                       &dmcu_mask);
-       if (pool->base.dmcu == NULL) {
-               dm_error("DC: failed to create dmcu!\n");
-               BREAK_TO_DEBUGGER();
-               goto res_create_fail;
-       }
-
-       pool->base.abm = dce_abm_create(ctx,
-                       &abm_regs,
-                       &abm_shift,
-                       &abm_mask);
-       if (pool->base.abm == NULL) {
-               dm_error("DC: failed to create abm!\n");
-               BREAK_TO_DEBUGGER();
-               goto res_create_fail;
-       }
-
-
-       irq_init_data.ctx = dc->ctx;
-       pool->base.irqs = dal_irq_service_dce120_create(&irq_init_data);
-       if (!pool->base.irqs)
-               goto irqs_create_fail;
-
-       /* VG20: Pipe harvesting enabled, retrieve valid pipe fuses */
-       if (is_vg20)
-               pipe_fuses = read_pipe_fuses(ctx);
-
-       /* index to valid pipe resource */
-       j = 0;
-       for (i = 0; i < pool->base.pipe_count; i++) {
-               if (is_vg20) {
-                       if ((pipe_fuses & (1 << i)) != 0) {
-                               dm_error("DC: skip invalid pipe %d!\n", i);
-                               continue;
-                       }
-               }
-
-               pool->base.timing_generators[j] =
-                               dce120_timing_generator_create(
-                                       ctx,
-                                       i,
-                                       &dce120_tg_offsets[i]);
-               if (pool->base.timing_generators[j] == NULL) {
-                       BREAK_TO_DEBUGGER();
-                       dm_error("DC: failed to create tg!\n");
-                       goto controller_create_fail;
-               }
-
-               pool->base.mis[j] = dce120_mem_input_create(ctx, i);
-
-               if (pool->base.mis[j] == NULL) {
-                       BREAK_TO_DEBUGGER();
-                       dm_error(
-                               "DC: failed to create memory input!\n");
-                       goto controller_create_fail;
-               }
-
-               pool->base.ipps[j] = dce120_ipp_create(ctx, i);
-               if (pool->base.ipps[i] == NULL) {
-                       BREAK_TO_DEBUGGER();
-                       dm_error(
-                               "DC: failed to create input pixel processor!\n");
-                       goto controller_create_fail;
-               }
-
-               pool->base.transforms[j] = dce120_transform_create(ctx, i);
-               if (pool->base.transforms[i] == NULL) {
-                       BREAK_TO_DEBUGGER();
-                       dm_error(
-                               "DC: failed to create transform!\n");
-                       goto res_create_fail;
-               }
-
-               pool->base.opps[j] = dce120_opp_create(
-                       ctx,
-                       i);
-               if (pool->base.opps[j] == NULL) {
-                       BREAK_TO_DEBUGGER();
-                       dm_error(
-                               "DC: failed to create output pixel processor!\n");
-               }
-
-               /* check next valid pipe */
-               j++;
-       }
-
-       for (i = 0; i < pool->base.res_cap->num_ddc; i++) {
-               pool->base.engines[i] = dce120_aux_engine_create(ctx, i);
-               if (pool->base.engines[i] == NULL) {
-                       BREAK_TO_DEBUGGER();
-                       dm_error(
-                               "DC:failed to create aux engine!!\n");
-                       goto res_create_fail;
-               }
-               pool->base.hw_i2cs[i] = dce120_i2c_hw_create(ctx, i);
-               if (pool->base.hw_i2cs[i] == NULL) {
-                       BREAK_TO_DEBUGGER();
-                       dm_error(
-                               "DC:failed to create i2c engine!!\n");
-                       goto res_create_fail;
-               }
-               pool->base.sw_i2cs[i] = NULL;
-       }
-
-       /* valid pipe num */
-       pool->base.pipe_count = j;
-       pool->base.timing_generator_count = j;
-
-       if (is_vg20)
-               res_funcs = &dce121_res_create_funcs;
-       else
-               res_funcs = &res_create_funcs;
-
-       if (!resource_construct(num_virtual_links, dc, &pool->base, res_funcs))
-               goto res_create_fail;
-
-       /* Create hardware sequencer */
-       if (!dce120_hw_sequencer_create(dc))
-               goto controller_create_fail;
-
-       dc->caps.max_planes =  pool->base.pipe_count;
-
-       for (i = 0; i < dc->caps.max_planes; ++i)
-               dc->caps.planes[i] = plane_cap;
-
-       bw_calcs_init(dc->bw_dceip, dc->bw_vbios, dc->ctx->asic_id);
-
-       bw_calcs_data_update_from_pplib(dc);
-
-       return true;
-
-irqs_create_fail:
-controller_create_fail:
-clk_src_create_fail:
-res_create_fail:
-
-       dce120_resource_destruct(pool);
-
-       return false;
-}
-
-struct resource_pool *dce120_create_resource_pool(
-       uint8_t num_virtual_links,
-       struct dc *dc)
-{
-       struct dce110_resource_pool *pool =
-               kzalloc(sizeof(struct dce110_resource_pool), GFP_KERNEL);
-
-       if (!pool)
-               return NULL;
-
-       if (dce120_resource_construct(num_virtual_links, dc, pool))
-               return &pool->base;
-
-       kfree(pool);
-       BREAK_TO_DEBUGGER();
-       return NULL;
-}
diff --git a/drivers/gpu/drm/amd/display/dc/dce120/dce120_resource.h b/drivers/gpu/drm/amd/display/dc/dce120/dce120_resource.h
deleted file mode 100644 (file)
index 3d1f3cf..0000000
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
-* Copyright 2012-15 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_RESOURCE_DCE120_H__
-#define __DC_RESOURCE_DCE120_H__
-
-#include "core_types.h"
-
-struct dc;
-struct resource_pool;
-
-struct resource_pool *dce120_create_resource_pool(
-       uint8_t num_virtual_links,
-       struct dc *dc);
-
-#endif /* __DC_RESOURCE_DCE120_H__ */
-
index 93dd68c31275be2dc10bf370ac27922047e945de..7eefffbdc9253f840133a3e0ed6f8c4d74e4fa57 100644 (file)
@@ -25,8 +25,7 @@
 
 CFLAGS_$(AMDDALPATH)/dc/dce80/dce80_resource.o = $(call cc-disable-warning, override-init)
 
-DCE80 = dce80_timing_generator.o \
-       dce80_resource.o
+DCE80 = dce80_timing_generator.o
 
 AMD_DAL_DCE80 = $(addprefix $(AMDDALPATH)/dc/dce80/,$(DCE80))
 
diff --git a/drivers/gpu/drm/amd/display/dc/dce80/dce80_resource.c b/drivers/gpu/drm/amd/display/dc/dce80/dce80_resource.c
deleted file mode 100644 (file)
index 35a2cce..0000000
+++ /dev/null
@@ -1,1544 +0,0 @@
-/*
- * Copyright 2012-15 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 "dce/dce_8_0_d.h"
-#include "dce/dce_8_0_sh_mask.h"
-
-#include "dm_services.h"
-
-#include "link_encoder.h"
-#include "stream_encoder.h"
-
-#include "resource.h"
-#include "include/irq_service_interface.h"
-#include "irq/dce80/irq_service_dce80.h"
-#include "dce110/dce110_timing_generator.h"
-#include "dce110/dce110_resource.h"
-#include "dce80/dce80_timing_generator.h"
-#include "dce/dce_mem_input.h"
-#include "dce/dce_link_encoder.h"
-#include "dce/dce_stream_encoder.h"
-#include "dce/dce_ipp.h"
-#include "dce/dce_transform.h"
-#include "dce/dce_opp.h"
-#include "dce/dce_clock_source.h"
-#include "dce/dce_audio.h"
-#include "dce/dce_hwseq.h"
-#include "dce80/dce80_hwseq.h"
-#include "dce100/dce100_resource.h"
-#include "dce/dce_panel_cntl.h"
-
-#include "reg_helper.h"
-
-#include "dce/dce_dmcu.h"
-#include "dce/dce_aux.h"
-#include "dce/dce_abm.h"
-#include "dce/dce_i2c.h"
-/* TODO remove this include */
-
-#ifndef mmMC_HUB_RDREQ_DMIF_LIMIT
-#include "gmc/gmc_7_1_d.h"
-#include "gmc/gmc_7_1_sh_mask.h"
-#endif
-
-#include "dce80/dce80_resource.h"
-
-#ifndef mmDP_DPHY_INTERNAL_CTRL
-#define mmDP_DPHY_INTERNAL_CTRL                         0x1CDE
-#define mmDP0_DP_DPHY_INTERNAL_CTRL                     0x1CDE
-#define mmDP1_DP_DPHY_INTERNAL_CTRL                     0x1FDE
-#define mmDP2_DP_DPHY_INTERNAL_CTRL                     0x42DE
-#define mmDP3_DP_DPHY_INTERNAL_CTRL                     0x45DE
-#define mmDP4_DP_DPHY_INTERNAL_CTRL                     0x48DE
-#define mmDP5_DP_DPHY_INTERNAL_CTRL                     0x4BDE
-#define mmDP6_DP_DPHY_INTERNAL_CTRL                     0x4EDE
-#endif
-
-
-#ifndef mmBIOS_SCRATCH_2
-       #define mmBIOS_SCRATCH_2 0x05CB
-       #define mmBIOS_SCRATCH_3 0x05CC
-       #define mmBIOS_SCRATCH_6 0x05CF
-#endif
-
-#ifndef mmDP_DPHY_FAST_TRAINING
-       #define mmDP_DPHY_FAST_TRAINING                         0x1CCE
-       #define mmDP0_DP_DPHY_FAST_TRAINING                     0x1CCE
-       #define mmDP1_DP_DPHY_FAST_TRAINING                     0x1FCE
-       #define mmDP2_DP_DPHY_FAST_TRAINING                     0x42CE
-       #define mmDP3_DP_DPHY_FAST_TRAINING                     0x45CE
-       #define mmDP4_DP_DPHY_FAST_TRAINING                     0x48CE
-       #define mmDP5_DP_DPHY_FAST_TRAINING                     0x4BCE
-       #define mmDP6_DP_DPHY_FAST_TRAINING                     0x4ECE
-#endif
-
-
-#ifndef mmHPD_DC_HPD_CONTROL
-       #define mmHPD_DC_HPD_CONTROL                            0x189A
-       #define mmHPD0_DC_HPD_CONTROL                           0x189A
-       #define mmHPD1_DC_HPD_CONTROL                           0x18A2
-       #define mmHPD2_DC_HPD_CONTROL                           0x18AA
-       #define mmHPD3_DC_HPD_CONTROL                           0x18B2
-       #define mmHPD4_DC_HPD_CONTROL                           0x18BA
-       #define mmHPD5_DC_HPD_CONTROL                           0x18C2
-#endif
-
-#define DCE11_DIG_FE_CNTL 0x4a00
-#define DCE11_DIG_BE_CNTL 0x4a47
-#define DCE11_DP_SEC 0x4ac3
-
-static const struct dce110_timing_generator_offsets dce80_tg_offsets[] = {
-               {
-                       .crtc = (mmCRTC0_CRTC_CONTROL - mmCRTC_CONTROL),
-                       .dcp =  (mmGRPH_CONTROL - mmGRPH_CONTROL),
-                       .dmif = (mmDMIF_PG0_DPG_WATERMARK_MASK_CONTROL
-                                       - mmDPG_WATERMARK_MASK_CONTROL),
-               },
-               {
-                       .crtc = (mmCRTC1_CRTC_CONTROL - mmCRTC_CONTROL),
-                       .dcp = (mmDCP1_GRPH_CONTROL - mmGRPH_CONTROL),
-                       .dmif = (mmDMIF_PG1_DPG_WATERMARK_MASK_CONTROL
-                                       - mmDPG_WATERMARK_MASK_CONTROL),
-               },
-               {
-                       .crtc = (mmCRTC2_CRTC_CONTROL - mmCRTC_CONTROL),
-                       .dcp = (mmDCP2_GRPH_CONTROL - mmGRPH_CONTROL),
-                       .dmif = (mmDMIF_PG2_DPG_WATERMARK_MASK_CONTROL
-                                       - mmDPG_WATERMARK_MASK_CONTROL),
-               },
-               {
-                       .crtc = (mmCRTC3_CRTC_CONTROL - mmCRTC_CONTROL),
-                       .dcp = (mmDCP3_GRPH_CONTROL - mmGRPH_CONTROL),
-                       .dmif = (mmDMIF_PG3_DPG_WATERMARK_MASK_CONTROL
-                                       - mmDPG_WATERMARK_MASK_CONTROL),
-               },
-               {
-                       .crtc = (mmCRTC4_CRTC_CONTROL - mmCRTC_CONTROL),
-                       .dcp = (mmDCP4_GRPH_CONTROL - mmGRPH_CONTROL),
-                       .dmif = (mmDMIF_PG4_DPG_WATERMARK_MASK_CONTROL
-                                       - mmDPG_WATERMARK_MASK_CONTROL),
-               },
-               {
-                       .crtc = (mmCRTC5_CRTC_CONTROL - mmCRTC_CONTROL),
-                       .dcp = (mmDCP5_GRPH_CONTROL - mmGRPH_CONTROL),
-                       .dmif = (mmDMIF_PG5_DPG_WATERMARK_MASK_CONTROL
-                                       - mmDPG_WATERMARK_MASK_CONTROL),
-               }
-};
-
-/* set register offset */
-#define SR(reg_name)\
-       .reg_name = mm ## reg_name
-
-/* set register offset with instance */
-#define SRI(reg_name, block, id)\
-       .reg_name = mm ## block ## id ## _ ## reg_name
-
-#define ipp_regs(id)\
-[id] = {\
-               IPP_COMMON_REG_LIST_DCE_BASE(id)\
-}
-
-static const struct dce_ipp_registers ipp_regs[] = {
-               ipp_regs(0),
-               ipp_regs(1),
-               ipp_regs(2),
-               ipp_regs(3),
-               ipp_regs(4),
-               ipp_regs(5)
-};
-
-static const struct dce_ipp_shift ipp_shift = {
-               IPP_COMMON_MASK_SH_LIST_DCE_COMMON_BASE(__SHIFT)
-};
-
-static const struct dce_ipp_mask ipp_mask = {
-               IPP_COMMON_MASK_SH_LIST_DCE_COMMON_BASE(_MASK)
-};
-
-#define transform_regs(id)\
-[id] = {\
-               XFM_COMMON_REG_LIST_DCE80(id)\
-}
-
-static const struct dce_transform_registers xfm_regs[] = {
-               transform_regs(0),
-               transform_regs(1),
-               transform_regs(2),
-               transform_regs(3),
-               transform_regs(4),
-               transform_regs(5)
-};
-
-static const struct dce_transform_shift xfm_shift = {
-               XFM_COMMON_MASK_SH_LIST_DCE80(__SHIFT)
-};
-
-static const struct dce_transform_mask xfm_mask = {
-               XFM_COMMON_MASK_SH_LIST_DCE80(_MASK)
-};
-
-#define aux_regs(id)\
-[id] = {\
-       AUX_REG_LIST(id)\
-}
-
-static const struct dce110_link_enc_aux_registers link_enc_aux_regs[] = {
-       aux_regs(0),
-       aux_regs(1),
-       aux_regs(2),
-       aux_regs(3),
-       aux_regs(4),
-       aux_regs(5)
-};
-
-#define hpd_regs(id)\
-[id] = {\
-       HPD_REG_LIST(id)\
-}
-
-static const struct dce110_link_enc_hpd_registers link_enc_hpd_regs[] = {
-               hpd_regs(0),
-               hpd_regs(1),
-               hpd_regs(2),
-               hpd_regs(3),
-               hpd_regs(4),
-               hpd_regs(5)
-};
-
-#define link_regs(id)\
-[id] = {\
-       LE_DCE80_REG_LIST(id)\
-}
-
-static const struct dce110_link_enc_registers link_enc_regs[] = {
-       link_regs(0),
-       link_regs(1),
-       link_regs(2),
-       link_regs(3),
-       link_regs(4),
-       link_regs(5),
-       link_regs(6),
-};
-
-#define stream_enc_regs(id)\
-[id] = {\
-       SE_COMMON_REG_LIST_DCE_BASE(id),\
-       .AFMT_CNTL = 0,\
-}
-
-static const struct dce110_stream_enc_registers stream_enc_regs[] = {
-       stream_enc_regs(0),
-       stream_enc_regs(1),
-       stream_enc_regs(2),
-       stream_enc_regs(3),
-       stream_enc_regs(4),
-       stream_enc_regs(5),
-       stream_enc_regs(6)
-};
-
-static const struct dce_stream_encoder_shift se_shift = {
-               SE_COMMON_MASK_SH_LIST_DCE80_100(__SHIFT)
-};
-
-static const struct dce_stream_encoder_mask se_mask = {
-               SE_COMMON_MASK_SH_LIST_DCE80_100(_MASK)
-};
-
-static const struct dce_panel_cntl_registers panel_cntl_regs[] = {
-       { DCE_PANEL_CNTL_REG_LIST() }
-};
-
-static const struct dce_panel_cntl_shift panel_cntl_shift = {
-       DCE_PANEL_CNTL_MASK_SH_LIST(__SHIFT)
-};
-
-static const struct dce_panel_cntl_mask panel_cntl_mask = {
-       DCE_PANEL_CNTL_MASK_SH_LIST(_MASK)
-};
-
-#define opp_regs(id)\
-[id] = {\
-       OPP_DCE_80_REG_LIST(id),\
-}
-
-static const struct dce_opp_registers opp_regs[] = {
-       opp_regs(0),
-       opp_regs(1),
-       opp_regs(2),
-       opp_regs(3),
-       opp_regs(4),
-       opp_regs(5)
-};
-
-static const struct dce_opp_shift opp_shift = {
-       OPP_COMMON_MASK_SH_LIST_DCE_80(__SHIFT)
-};
-
-static const struct dce_opp_mask opp_mask = {
-       OPP_COMMON_MASK_SH_LIST_DCE_80(_MASK)
-};
-
-static const struct dce110_aux_registers_shift aux_shift = {
-       DCE10_AUX_MASK_SH_LIST(__SHIFT)
-};
-
-static const struct dce110_aux_registers_mask aux_mask = {
-       DCE10_AUX_MASK_SH_LIST(_MASK)
-};
-
-#define aux_engine_regs(id)\
-[id] = {\
-       AUX_COMMON_REG_LIST(id), \
-       .AUX_RESET_MASK = 0 \
-}
-
-static const struct dce110_aux_registers aux_engine_regs[] = {
-               aux_engine_regs(0),
-               aux_engine_regs(1),
-               aux_engine_regs(2),
-               aux_engine_regs(3),
-               aux_engine_regs(4),
-               aux_engine_regs(5)
-};
-
-#define audio_regs(id)\
-[id] = {\
-       AUD_COMMON_REG_LIST(id)\
-}
-
-static const struct dce_audio_registers audio_regs[] = {
-       audio_regs(0),
-       audio_regs(1),
-       audio_regs(2),
-       audio_regs(3),
-       audio_regs(4),
-       audio_regs(5),
-       audio_regs(6),
-};
-
-static const struct dce_audio_shift audio_shift = {
-               AUD_COMMON_MASK_SH_LIST(__SHIFT)
-};
-
-static const struct dce_audio_mask audio_mask = {
-               AUD_COMMON_MASK_SH_LIST(_MASK)
-};
-
-#define clk_src_regs(id)\
-[id] = {\
-       CS_COMMON_REG_LIST_DCE_80(id),\
-}
-
-
-static const struct dce110_clk_src_regs clk_src_regs[] = {
-       clk_src_regs(0),
-       clk_src_regs(1),
-       clk_src_regs(2)
-};
-
-static const struct dce110_clk_src_shift cs_shift = {
-               CS_COMMON_MASK_SH_LIST_DCE_COMMON_BASE(__SHIFT)
-};
-
-static const struct dce110_clk_src_mask cs_mask = {
-               CS_COMMON_MASK_SH_LIST_DCE_COMMON_BASE(_MASK)
-};
-
-static const struct bios_registers bios_regs = {
-       .BIOS_SCRATCH_3 = mmBIOS_SCRATCH_3,
-       .BIOS_SCRATCH_6 = mmBIOS_SCRATCH_6
-};
-
-static const struct resource_caps res_cap = {
-               .num_timing_generator = 6,
-               .num_audio = 6,
-               .num_stream_encoder = 6,
-               .num_pll = 3,
-               .num_ddc = 6,
-};
-
-static const struct resource_caps res_cap_81 = {
-               .num_timing_generator = 4,
-               .num_audio = 7,
-               .num_stream_encoder = 7,
-               .num_pll = 3,
-               .num_ddc = 6,
-};
-
-static const struct resource_caps res_cap_83 = {
-               .num_timing_generator = 2,
-               .num_audio = 6,
-               .num_stream_encoder = 6,
-               .num_pll = 2,
-               .num_ddc = 2,
-};
-
-static const struct dc_plane_cap plane_cap = {
-       .type = DC_PLANE_TYPE_DCE_RGB,
-
-       .pixel_format_support = {
-                       .argb8888 = true,
-                       .nv12 = false,
-                       .fp16 = true
-       },
-
-       .max_upscale_factor = {
-                       .argb8888 = 16000,
-                       .nv12 = 1,
-                       .fp16 = 1
-       },
-
-       .max_downscale_factor = {
-                       .argb8888 = 250,
-                       .nv12 = 1,
-                       .fp16 = 1
-       }
-};
-
-static const struct dc_debug_options debug_defaults = {
-               .enable_legacy_fast_update = true,
-};
-
-static const struct dce_dmcu_registers dmcu_regs = {
-               DMCU_DCE80_REG_LIST()
-};
-
-static const struct dce_dmcu_shift dmcu_shift = {
-               DMCU_MASK_SH_LIST_DCE80(__SHIFT)
-};
-
-static const struct dce_dmcu_mask dmcu_mask = {
-               DMCU_MASK_SH_LIST_DCE80(_MASK)
-};
-static const struct dce_abm_registers abm_regs = {
-               ABM_DCE110_COMMON_REG_LIST()
-};
-
-static const struct dce_abm_shift abm_shift = {
-               ABM_MASK_SH_LIST_DCE110(__SHIFT)
-};
-
-static const struct dce_abm_mask abm_mask = {
-               ABM_MASK_SH_LIST_DCE110(_MASK)
-};
-
-#define CTX  ctx
-#define REG(reg) mm ## reg
-
-#ifndef mmCC_DC_HDMI_STRAPS
-#define mmCC_DC_HDMI_STRAPS 0x1918
-#define CC_DC_HDMI_STRAPS__HDMI_DISABLE_MASK 0x40
-#define CC_DC_HDMI_STRAPS__HDMI_DISABLE__SHIFT 0x6
-#define CC_DC_HDMI_STRAPS__AUDIO_STREAM_NUMBER_MASK 0x700
-#define CC_DC_HDMI_STRAPS__AUDIO_STREAM_NUMBER__SHIFT 0x8
-#endif
-
-static int map_transmitter_id_to_phy_instance(
-       enum transmitter transmitter)
-{
-       switch (transmitter) {
-       case TRANSMITTER_UNIPHY_A:
-               return 0;
-       case TRANSMITTER_UNIPHY_B:
-               return 1;
-       case TRANSMITTER_UNIPHY_C:
-               return 2;
-       case TRANSMITTER_UNIPHY_D:
-               return 3;
-       case TRANSMITTER_UNIPHY_E:
-               return 4;
-       case TRANSMITTER_UNIPHY_F:
-               return 5;
-       case TRANSMITTER_UNIPHY_G:
-               return 6;
-       default:
-               ASSERT(0);
-               return 0;
-       }
-}
-
-static void read_dce_straps(
-       struct dc_context *ctx,
-       struct resource_straps *straps)
-{
-       REG_GET_2(CC_DC_HDMI_STRAPS,
-                       HDMI_DISABLE, &straps->hdmi_disable,
-                       AUDIO_STREAM_NUMBER, &straps->audio_stream_number);
-
-       REG_GET(DC_PINSTRAPS, DC_PINSTRAPS_AUDIO, &straps->dc_pinstraps_audio);
-}
-
-static struct audio *create_audio(
-               struct dc_context *ctx, unsigned int inst)
-{
-       return dce_audio_create(ctx, inst,
-                       &audio_regs[inst], &audio_shift, &audio_mask);
-}
-
-static struct timing_generator *dce80_timing_generator_create(
-               struct dc_context *ctx,
-               uint32_t instance,
-               const struct dce110_timing_generator_offsets *offsets)
-{
-       struct dce110_timing_generator *tg110 =
-               kzalloc(sizeof(struct dce110_timing_generator), GFP_KERNEL);
-
-       if (!tg110)
-               return NULL;
-
-       dce80_timing_generator_construct(tg110, ctx, instance, offsets);
-       return &tg110->base;
-}
-
-static struct output_pixel_processor *dce80_opp_create(
-       struct dc_context *ctx,
-       uint32_t inst)
-{
-       struct dce110_opp *opp =
-               kzalloc(sizeof(struct dce110_opp), GFP_KERNEL);
-
-       if (!opp)
-               return NULL;
-
-       dce110_opp_construct(opp,
-                            ctx, inst, &opp_regs[inst], &opp_shift, &opp_mask);
-       return &opp->base;
-}
-
-static struct dce_aux *dce80_aux_engine_create(
-       struct dc_context *ctx,
-       uint32_t inst)
-{
-       struct aux_engine_dce110 *aux_engine =
-               kzalloc(sizeof(struct aux_engine_dce110), GFP_KERNEL);
-
-       if (!aux_engine)
-               return NULL;
-
-       dce110_aux_engine_construct(aux_engine, ctx, inst,
-                                   SW_AUX_TIMEOUT_PERIOD_MULTIPLIER * AUX_TIMEOUT_PERIOD,
-                                   &aux_engine_regs[inst],
-                                       &aux_mask,
-                                       &aux_shift,
-                                       ctx->dc->caps.extended_aux_timeout_support);
-
-       return &aux_engine->base;
-}
-#define i2c_inst_regs(id) { I2C_HW_ENGINE_COMMON_REG_LIST(id) }
-
-static const struct dce_i2c_registers i2c_hw_regs[] = {
-               i2c_inst_regs(1),
-               i2c_inst_regs(2),
-               i2c_inst_regs(3),
-               i2c_inst_regs(4),
-               i2c_inst_regs(5),
-               i2c_inst_regs(6),
-};
-
-static const struct dce_i2c_shift i2c_shifts = {
-               I2C_COMMON_MASK_SH_LIST_DCE_COMMON_BASE(__SHIFT)
-};
-
-static const struct dce_i2c_mask i2c_masks = {
-               I2C_COMMON_MASK_SH_LIST_DCE_COMMON_BASE(_MASK)
-};
-
-static struct dce_i2c_hw *dce80_i2c_hw_create(
-       struct dc_context *ctx,
-       uint32_t inst)
-{
-       struct dce_i2c_hw *dce_i2c_hw =
-               kzalloc(sizeof(struct dce_i2c_hw), GFP_KERNEL);
-
-       if (!dce_i2c_hw)
-               return NULL;
-
-       dce_i2c_hw_construct(dce_i2c_hw, ctx, inst,
-                                   &i2c_hw_regs[inst], &i2c_shifts, &i2c_masks);
-
-       return dce_i2c_hw;
-}
-
-static struct dce_i2c_sw *dce80_i2c_sw_create(
-       struct dc_context *ctx)
-{
-       struct dce_i2c_sw *dce_i2c_sw =
-               kzalloc(sizeof(struct dce_i2c_sw), GFP_KERNEL);
-
-       if (!dce_i2c_sw)
-               return NULL;
-
-       dce_i2c_sw_construct(dce_i2c_sw, ctx);
-
-       return dce_i2c_sw;
-}
-static struct stream_encoder *dce80_stream_encoder_create(
-       enum engine_id eng_id,
-       struct dc_context *ctx)
-{
-       struct dce110_stream_encoder *enc110 =
-               kzalloc(sizeof(struct dce110_stream_encoder), GFP_KERNEL);
-
-       if (!enc110)
-               return NULL;
-
-       dce110_stream_encoder_construct(enc110, ctx, ctx->dc_bios, eng_id,
-                                       &stream_enc_regs[eng_id],
-                                       &se_shift, &se_mask);
-       return &enc110->base;
-}
-
-#define SRII(reg_name, block, id)\
-       .reg_name[id] = mm ## block ## id ## _ ## reg_name
-
-static const struct dce_hwseq_registers hwseq_reg = {
-               HWSEQ_DCE8_REG_LIST()
-};
-
-static const struct dce_hwseq_shift hwseq_shift = {
-               HWSEQ_DCE8_MASK_SH_LIST(__SHIFT)
-};
-
-static const struct dce_hwseq_mask hwseq_mask = {
-               HWSEQ_DCE8_MASK_SH_LIST(_MASK)
-};
-
-static struct dce_hwseq *dce80_hwseq_create(
-       struct dc_context *ctx)
-{
-       struct dce_hwseq *hws = kzalloc(sizeof(struct dce_hwseq), GFP_KERNEL);
-
-       if (hws) {
-               hws->ctx = ctx;
-               hws->regs = &hwseq_reg;
-               hws->shifts = &hwseq_shift;
-               hws->masks = &hwseq_mask;
-       }
-       return hws;
-}
-
-static const struct resource_create_funcs res_create_funcs = {
-       .read_dce_straps = read_dce_straps,
-       .create_audio = create_audio,
-       .create_stream_encoder = dce80_stream_encoder_create,
-       .create_hwseq = dce80_hwseq_create,
-};
-
-#define mi_inst_regs(id) { \
-       MI_DCE8_REG_LIST(id), \
-       .MC_HUB_RDREQ_DMIF_LIMIT = mmMC_HUB_RDREQ_DMIF_LIMIT \
-}
-static const struct dce_mem_input_registers mi_regs[] = {
-               mi_inst_regs(0),
-               mi_inst_regs(1),
-               mi_inst_regs(2),
-               mi_inst_regs(3),
-               mi_inst_regs(4),
-               mi_inst_regs(5),
-};
-
-static const struct dce_mem_input_shift mi_shifts = {
-               MI_DCE8_MASK_SH_LIST(__SHIFT),
-               .ENABLE = MC_HUB_RDREQ_DMIF_LIMIT__ENABLE__SHIFT
-};
-
-static const struct dce_mem_input_mask mi_masks = {
-               MI_DCE8_MASK_SH_LIST(_MASK),
-               .ENABLE = MC_HUB_RDREQ_DMIF_LIMIT__ENABLE_MASK
-};
-
-static struct mem_input *dce80_mem_input_create(
-       struct dc_context *ctx,
-       uint32_t inst)
-{
-       struct dce_mem_input *dce_mi = kzalloc(sizeof(struct dce_mem_input),
-                                              GFP_KERNEL);
-
-       if (!dce_mi) {
-               BREAK_TO_DEBUGGER();
-               return NULL;
-       }
-
-       dce_mem_input_construct(dce_mi, ctx, inst, &mi_regs[inst], &mi_shifts, &mi_masks);
-       dce_mi->wa.single_head_rdreq_dmif_limit = 2;
-       return &dce_mi->base;
-}
-
-static void dce80_transform_destroy(struct transform **xfm)
-{
-       kfree(TO_DCE_TRANSFORM(*xfm));
-       *xfm = NULL;
-}
-
-static struct transform *dce80_transform_create(
-       struct dc_context *ctx,
-       uint32_t inst)
-{
-       struct dce_transform *transform =
-               kzalloc(sizeof(struct dce_transform), GFP_KERNEL);
-
-       if (!transform)
-               return NULL;
-
-       dce_transform_construct(transform, ctx, inst,
-                               &xfm_regs[inst], &xfm_shift, &xfm_mask);
-       transform->prescaler_on = false;
-       return &transform->base;
-}
-
-static const struct encoder_feature_support link_enc_feature = {
-               .max_hdmi_deep_color = COLOR_DEPTH_121212,
-               .max_hdmi_pixel_clock = 297000,
-               .flags.bits.IS_HBR2_CAPABLE = true,
-               .flags.bits.IS_TPS3_CAPABLE = true
-};
-
-static struct link_encoder *dce80_link_encoder_create(
-       struct dc_context *ctx,
-       const struct encoder_init_data *enc_init_data)
-{
-       struct dce110_link_encoder *enc110 =
-               kzalloc(sizeof(struct dce110_link_encoder), GFP_KERNEL);
-       int link_regs_id;
-
-       if (!enc110)
-               return NULL;
-
-       link_regs_id =
-               map_transmitter_id_to_phy_instance(enc_init_data->transmitter);
-
-       dce110_link_encoder_construct(enc110,
-                                     enc_init_data,
-                                     &link_enc_feature,
-                                     &link_enc_regs[link_regs_id],
-                                     &link_enc_aux_regs[enc_init_data->channel - 1],
-                                     &link_enc_hpd_regs[enc_init_data->hpd_source]);
-       return &enc110->base;
-}
-
-static struct panel_cntl *dce80_panel_cntl_create(const struct panel_cntl_init_data *init_data)
-{
-       struct dce_panel_cntl *panel_cntl =
-               kzalloc(sizeof(struct dce_panel_cntl), GFP_KERNEL);
-
-       if (!panel_cntl)
-               return NULL;
-
-       dce_panel_cntl_construct(panel_cntl,
-                       init_data,
-                       &panel_cntl_regs[init_data->inst],
-                       &panel_cntl_shift,
-                       &panel_cntl_mask);
-
-       return &panel_cntl->base;
-}
-
-static struct clock_source *dce80_clock_source_create(
-       struct dc_context *ctx,
-       struct dc_bios *bios,
-       enum clock_source_id id,
-       const struct dce110_clk_src_regs *regs,
-       bool dp_clk_src)
-{
-       struct dce110_clk_src *clk_src =
-               kzalloc(sizeof(struct dce110_clk_src), GFP_KERNEL);
-
-       if (!clk_src)
-               return NULL;
-
-       if (dce110_clk_src_construct(clk_src, ctx, bios, id,
-                       regs, &cs_shift, &cs_mask)) {
-               clk_src->base.dp_clk_src = dp_clk_src;
-               return &clk_src->base;
-       }
-
-       kfree(clk_src);
-       BREAK_TO_DEBUGGER();
-       return NULL;
-}
-
-static void dce80_clock_source_destroy(struct clock_source **clk_src)
-{
-       kfree(TO_DCE110_CLK_SRC(*clk_src));
-       *clk_src = NULL;
-}
-
-static struct input_pixel_processor *dce80_ipp_create(
-       struct dc_context *ctx, uint32_t inst)
-{
-       struct dce_ipp *ipp = kzalloc(sizeof(struct dce_ipp), GFP_KERNEL);
-
-       if (!ipp) {
-               BREAK_TO_DEBUGGER();
-               return NULL;
-       }
-
-       dce_ipp_construct(ipp, ctx, inst,
-                       &ipp_regs[inst], &ipp_shift, &ipp_mask);
-       return &ipp->base;
-}
-
-static void dce80_resource_destruct(struct dce110_resource_pool *pool)
-{
-       unsigned int i;
-
-       for (i = 0; i < pool->base.pipe_count; i++) {
-               if (pool->base.opps[i] != NULL)
-                       dce110_opp_destroy(&pool->base.opps[i]);
-
-               if (pool->base.transforms[i] != NULL)
-                       dce80_transform_destroy(&pool->base.transforms[i]);
-
-               if (pool->base.ipps[i] != NULL)
-                       dce_ipp_destroy(&pool->base.ipps[i]);
-
-               if (pool->base.mis[i] != NULL) {
-                       kfree(TO_DCE_MEM_INPUT(pool->base.mis[i]));
-                       pool->base.mis[i] = NULL;
-               }
-
-               if (pool->base.timing_generators[i] != NULL)    {
-                       kfree(DCE110TG_FROM_TG(pool->base.timing_generators[i]));
-                       pool->base.timing_generators[i] = NULL;
-               }
-       }
-
-       for (i = 0; i < pool->base.res_cap->num_ddc; i++) {
-               if (pool->base.engines[i] != NULL)
-                       dce110_engine_destroy(&pool->base.engines[i]);
-               if (pool->base.hw_i2cs[i] != NULL) {
-                       kfree(pool->base.hw_i2cs[i]);
-                       pool->base.hw_i2cs[i] = NULL;
-               }
-               if (pool->base.sw_i2cs[i] != NULL) {
-                       kfree(pool->base.sw_i2cs[i]);
-                       pool->base.sw_i2cs[i] = NULL;
-               }
-       }
-
-       for (i = 0; i < pool->base.stream_enc_count; i++) {
-               if (pool->base.stream_enc[i] != NULL)
-                       kfree(DCE110STRENC_FROM_STRENC(pool->base.stream_enc[i]));
-       }
-
-       for (i = 0; i < pool->base.clk_src_count; i++) {
-               if (pool->base.clock_sources[i] != NULL) {
-                       dce80_clock_source_destroy(&pool->base.clock_sources[i]);
-               }
-       }
-
-       if (pool->base.abm != NULL)
-                       dce_abm_destroy(&pool->base.abm);
-
-       if (pool->base.dmcu != NULL)
-                       dce_dmcu_destroy(&pool->base.dmcu);
-
-       if (pool->base.dp_clock_source != NULL)
-               dce80_clock_source_destroy(&pool->base.dp_clock_source);
-
-       for (i = 0; i < pool->base.audio_count; i++)    {
-               if (pool->base.audios[i] != NULL) {
-                       dce_aud_destroy(&pool->base.audios[i]);
-               }
-       }
-
-       if (pool->base.irqs != NULL) {
-               dal_irq_service_destroy(&pool->base.irqs);
-       }
-}
-
-static bool dce80_validate_bandwidth(
-       struct dc *dc,
-       struct dc_state *context,
-       bool fast_validate)
-{
-       int i;
-       bool at_least_one_pipe = false;
-
-       for (i = 0; i < dc->res_pool->pipe_count; i++) {
-               if (context->res_ctx.pipe_ctx[i].stream)
-                       at_least_one_pipe = true;
-       }
-
-       if (at_least_one_pipe) {
-               /* TODO implement when needed but for now hardcode max value*/
-               context->bw_ctx.bw.dce.dispclk_khz = 681000;
-               context->bw_ctx.bw.dce.yclk_khz = 250000 * MEMORY_TYPE_MULTIPLIER_CZ;
-       } else {
-               context->bw_ctx.bw.dce.dispclk_khz = 0;
-               context->bw_ctx.bw.dce.yclk_khz = 0;
-       }
-
-       return true;
-}
-
-static bool dce80_validate_surface_sets(
-               struct dc_state *context)
-{
-       int i;
-
-       for (i = 0; i < context->stream_count; i++) {
-               if (context->stream_status[i].plane_count == 0)
-                       continue;
-
-               if (context->stream_status[i].plane_count > 1)
-                       return false;
-
-               if (context->stream_status[i].plane_states[0]->format
-                               >= SURFACE_PIXEL_FORMAT_VIDEO_BEGIN)
-                       return false;
-       }
-
-       return true;
-}
-
-static enum dc_status dce80_validate_global(
-               struct dc *dc,
-               struct dc_state *context)
-{
-       if (!dce80_validate_surface_sets(context))
-               return DC_FAIL_SURFACE_VALIDATE;
-
-       return DC_OK;
-}
-
-static void dce80_destroy_resource_pool(struct resource_pool **pool)
-{
-       struct dce110_resource_pool *dce110_pool = TO_DCE110_RES_POOL(*pool);
-
-       dce80_resource_destruct(dce110_pool);
-       kfree(dce110_pool);
-       *pool = NULL;
-}
-
-static const struct resource_funcs dce80_res_pool_funcs = {
-       .destroy = dce80_destroy_resource_pool,
-       .link_enc_create = dce80_link_encoder_create,
-       .panel_cntl_create = dce80_panel_cntl_create,
-       .validate_bandwidth = dce80_validate_bandwidth,
-       .validate_plane = dce100_validate_plane,
-       .add_stream_to_ctx = dce100_add_stream_to_ctx,
-       .validate_global = dce80_validate_global,
-       .find_first_free_match_stream_enc_for_link = dce100_find_first_free_match_stream_enc_for_link
-};
-
-static bool dce80_construct(
-       uint8_t num_virtual_links,
-       struct dc *dc,
-       struct dce110_resource_pool *pool)
-{
-       unsigned int i;
-       struct dc_context *ctx = dc->ctx;
-       struct dc_bios *bp;
-
-       ctx->dc_bios->regs = &bios_regs;
-
-       pool->base.res_cap = &res_cap;
-       pool->base.funcs = &dce80_res_pool_funcs;
-
-
-       /*************************************************
-        *  Resource + asic cap harcoding                *
-        *************************************************/
-       pool->base.underlay_pipe_index = NO_UNDERLAY_PIPE;
-       pool->base.pipe_count = res_cap.num_timing_generator;
-       pool->base.timing_generator_count = res_cap.num_timing_generator;
-       dc->caps.max_downscale_ratio = 200;
-       dc->caps.i2c_speed_in_khz = 40;
-       dc->caps.i2c_speed_in_khz_hdcp = 40;
-       dc->caps.max_cursor_size = 128;
-       dc->caps.min_horizontal_blanking_period = 80;
-       dc->caps.dual_link_dvi = true;
-       dc->caps.extended_aux_timeout_support = false;
-       dc->debug = debug_defaults;
-
-       /*************************************************
-        *  Create resources                             *
-        *************************************************/
-
-       bp = ctx->dc_bios;
-
-       if (bp->fw_info_valid && bp->fw_info.external_clock_source_frequency_for_dp != 0) {
-               pool->base.dp_clock_source =
-                               dce80_clock_source_create(ctx, bp, CLOCK_SOURCE_ID_EXTERNAL, NULL, true);
-
-               pool->base.clock_sources[0] =
-                               dce80_clock_source_create(ctx, bp, CLOCK_SOURCE_ID_PLL0, &clk_src_regs[0], false);
-               pool->base.clock_sources[1] =
-                               dce80_clock_source_create(ctx, bp, CLOCK_SOURCE_ID_PLL1, &clk_src_regs[1], false);
-               pool->base.clock_sources[2] =
-                               dce80_clock_source_create(ctx, bp, CLOCK_SOURCE_ID_PLL2, &clk_src_regs[2], false);
-               pool->base.clk_src_count = 3;
-
-       } else {
-               pool->base.dp_clock_source =
-                               dce80_clock_source_create(ctx, bp, CLOCK_SOURCE_ID_PLL0, &clk_src_regs[0], true);
-
-               pool->base.clock_sources[0] =
-                               dce80_clock_source_create(ctx, bp, CLOCK_SOURCE_ID_PLL1, &clk_src_regs[1], false);
-               pool->base.clock_sources[1] =
-                               dce80_clock_source_create(ctx, bp, CLOCK_SOURCE_ID_PLL2, &clk_src_regs[2], false);
-               pool->base.clk_src_count = 2;
-       }
-
-       if (pool->base.dp_clock_source == NULL) {
-               dm_error("DC: failed to create dp clock source!\n");
-               BREAK_TO_DEBUGGER();
-               goto res_create_fail;
-       }
-
-       for (i = 0; i < pool->base.clk_src_count; i++) {
-               if (pool->base.clock_sources[i] == NULL) {
-                       dm_error("DC: failed to create clock sources!\n");
-                       BREAK_TO_DEBUGGER();
-                       goto res_create_fail;
-               }
-       }
-
-       pool->base.dmcu = dce_dmcu_create(ctx,
-                       &dmcu_regs,
-                       &dmcu_shift,
-                       &dmcu_mask);
-       if (pool->base.dmcu == NULL) {
-               dm_error("DC: failed to create dmcu!\n");
-               BREAK_TO_DEBUGGER();
-               goto res_create_fail;
-       }
-
-       pool->base.abm = dce_abm_create(ctx,
-                       &abm_regs,
-                       &abm_shift,
-                       &abm_mask);
-       if (pool->base.abm == NULL) {
-               dm_error("DC: failed to create abm!\n");
-               BREAK_TO_DEBUGGER();
-               goto res_create_fail;
-       }
-
-       {
-               struct irq_service_init_data init_data;
-               init_data.ctx = dc->ctx;
-               pool->base.irqs = dal_irq_service_dce80_create(&init_data);
-               if (!pool->base.irqs)
-                       goto res_create_fail;
-       }
-
-       for (i = 0; i < pool->base.pipe_count; i++) {
-               pool->base.timing_generators[i] = dce80_timing_generator_create(
-                               ctx, i, &dce80_tg_offsets[i]);
-               if (pool->base.timing_generators[i] == NULL) {
-                       BREAK_TO_DEBUGGER();
-                       dm_error("DC: failed to create tg!\n");
-                       goto res_create_fail;
-               }
-
-               pool->base.mis[i] = dce80_mem_input_create(ctx, i);
-               if (pool->base.mis[i] == NULL) {
-                       BREAK_TO_DEBUGGER();
-                       dm_error("DC: failed to create memory input!\n");
-                       goto res_create_fail;
-               }
-
-               pool->base.ipps[i] = dce80_ipp_create(ctx, i);
-               if (pool->base.ipps[i] == NULL) {
-                       BREAK_TO_DEBUGGER();
-                       dm_error("DC: failed to create input pixel processor!\n");
-                       goto res_create_fail;
-               }
-
-               pool->base.transforms[i] = dce80_transform_create(ctx, i);
-               if (pool->base.transforms[i] == NULL) {
-                       BREAK_TO_DEBUGGER();
-                       dm_error("DC: failed to create transform!\n");
-                       goto res_create_fail;
-               }
-
-               pool->base.opps[i] = dce80_opp_create(ctx, i);
-               if (pool->base.opps[i] == NULL) {
-                       BREAK_TO_DEBUGGER();
-                       dm_error("DC: failed to create output pixel processor!\n");
-                       goto res_create_fail;
-               }
-       }
-
-       for (i = 0; i < pool->base.res_cap->num_ddc; i++) {
-               pool->base.engines[i] = dce80_aux_engine_create(ctx, i);
-               if (pool->base.engines[i] == NULL) {
-                       BREAK_TO_DEBUGGER();
-                       dm_error(
-                               "DC:failed to create aux engine!!\n");
-                       goto res_create_fail;
-               }
-               pool->base.hw_i2cs[i] = dce80_i2c_hw_create(ctx, i);
-               if (pool->base.hw_i2cs[i] == NULL) {
-                       BREAK_TO_DEBUGGER();
-                       dm_error(
-                               "DC:failed to create i2c engine!!\n");
-                       goto res_create_fail;
-               }
-               pool->base.sw_i2cs[i] = dce80_i2c_sw_create(ctx);
-               if (pool->base.sw_i2cs[i] == NULL) {
-                       BREAK_TO_DEBUGGER();
-                       dm_error(
-                               "DC:failed to create sw i2c!!\n");
-                       goto res_create_fail;
-               }
-       }
-
-       dc->caps.max_planes =  pool->base.pipe_count;
-
-       for (i = 0; i < dc->caps.max_planes; ++i)
-               dc->caps.planes[i] = plane_cap;
-
-       dc->caps.disable_dp_clk_share = true;
-
-       if (!resource_construct(num_virtual_links, dc, &pool->base,
-                       &res_create_funcs))
-               goto res_create_fail;
-
-       /* Create hardware sequencer */
-       dce80_hw_sequencer_construct(dc);
-
-       return true;
-
-res_create_fail:
-       dce80_resource_destruct(pool);
-       return false;
-}
-
-struct resource_pool *dce80_create_resource_pool(
-       uint8_t num_virtual_links,
-       struct dc *dc)
-{
-       struct dce110_resource_pool *pool =
-               kzalloc(sizeof(struct dce110_resource_pool), GFP_KERNEL);
-
-       if (!pool)
-               return NULL;
-
-       if (dce80_construct(num_virtual_links, dc, pool))
-               return &pool->base;
-
-       kfree(pool);
-       BREAK_TO_DEBUGGER();
-       return NULL;
-}
-
-static bool dce81_construct(
-       uint8_t num_virtual_links,
-       struct dc *dc,
-       struct dce110_resource_pool *pool)
-{
-       unsigned int i;
-       struct dc_context *ctx = dc->ctx;
-       struct dc_bios *bp;
-
-       ctx->dc_bios->regs = &bios_regs;
-
-       pool->base.res_cap = &res_cap_81;
-       pool->base.funcs = &dce80_res_pool_funcs;
-
-
-       /*************************************************
-        *  Resource + asic cap harcoding                *
-        *************************************************/
-       pool->base.underlay_pipe_index = NO_UNDERLAY_PIPE;
-       pool->base.pipe_count = res_cap_81.num_timing_generator;
-       pool->base.timing_generator_count = res_cap_81.num_timing_generator;
-       dc->caps.max_downscale_ratio = 200;
-       dc->caps.i2c_speed_in_khz = 40;
-       dc->caps.i2c_speed_in_khz_hdcp = 40;
-       dc->caps.max_cursor_size = 128;
-       dc->caps.min_horizontal_blanking_period = 80;
-       dc->caps.is_apu = true;
-
-       /*************************************************
-        *  Create resources                             *
-        *************************************************/
-
-       bp = ctx->dc_bios;
-
-       if (bp->fw_info_valid && bp->fw_info.external_clock_source_frequency_for_dp != 0) {
-               pool->base.dp_clock_source =
-                               dce80_clock_source_create(ctx, bp, CLOCK_SOURCE_ID_EXTERNAL, NULL, true);
-
-               pool->base.clock_sources[0] =
-                               dce80_clock_source_create(ctx, bp, CLOCK_SOURCE_ID_PLL0, &clk_src_regs[0], false);
-               pool->base.clock_sources[1] =
-                               dce80_clock_source_create(ctx, bp, CLOCK_SOURCE_ID_PLL1, &clk_src_regs[1], false);
-               pool->base.clock_sources[2] =
-                               dce80_clock_source_create(ctx, bp, CLOCK_SOURCE_ID_PLL2, &clk_src_regs[2], false);
-               pool->base.clk_src_count = 3;
-
-       } else {
-               pool->base.dp_clock_source =
-                               dce80_clock_source_create(ctx, bp, CLOCK_SOURCE_ID_PLL0, &clk_src_regs[0], true);
-
-               pool->base.clock_sources[0] =
-                               dce80_clock_source_create(ctx, bp, CLOCK_SOURCE_ID_PLL1, &clk_src_regs[1], false);
-               pool->base.clock_sources[1] =
-                               dce80_clock_source_create(ctx, bp, CLOCK_SOURCE_ID_PLL2, &clk_src_regs[2], false);
-               pool->base.clk_src_count = 2;
-       }
-
-       if (pool->base.dp_clock_source == NULL) {
-               dm_error("DC: failed to create dp clock source!\n");
-               BREAK_TO_DEBUGGER();
-               goto res_create_fail;
-       }
-
-       for (i = 0; i < pool->base.clk_src_count; i++) {
-               if (pool->base.clock_sources[i] == NULL) {
-                       dm_error("DC: failed to create clock sources!\n");
-                       BREAK_TO_DEBUGGER();
-                       goto res_create_fail;
-               }
-       }
-
-       pool->base.dmcu = dce_dmcu_create(ctx,
-                       &dmcu_regs,
-                       &dmcu_shift,
-                       &dmcu_mask);
-       if (pool->base.dmcu == NULL) {
-               dm_error("DC: failed to create dmcu!\n");
-               BREAK_TO_DEBUGGER();
-               goto res_create_fail;
-       }
-
-       pool->base.abm = dce_abm_create(ctx,
-                       &abm_regs,
-                       &abm_shift,
-                       &abm_mask);
-       if (pool->base.abm == NULL) {
-               dm_error("DC: failed to create abm!\n");
-               BREAK_TO_DEBUGGER();
-               goto res_create_fail;
-       }
-
-       {
-               struct irq_service_init_data init_data;
-               init_data.ctx = dc->ctx;
-               pool->base.irqs = dal_irq_service_dce80_create(&init_data);
-               if (!pool->base.irqs)
-                       goto res_create_fail;
-       }
-
-       for (i = 0; i < pool->base.pipe_count; i++) {
-               pool->base.timing_generators[i] = dce80_timing_generator_create(
-                               ctx, i, &dce80_tg_offsets[i]);
-               if (pool->base.timing_generators[i] == NULL) {
-                       BREAK_TO_DEBUGGER();
-                       dm_error("DC: failed to create tg!\n");
-                       goto res_create_fail;
-               }
-
-               pool->base.mis[i] = dce80_mem_input_create(ctx, i);
-               if (pool->base.mis[i] == NULL) {
-                       BREAK_TO_DEBUGGER();
-                       dm_error("DC: failed to create memory input!\n");
-                       goto res_create_fail;
-               }
-
-               pool->base.ipps[i] = dce80_ipp_create(ctx, i);
-               if (pool->base.ipps[i] == NULL) {
-                       BREAK_TO_DEBUGGER();
-                       dm_error("DC: failed to create input pixel processor!\n");
-                       goto res_create_fail;
-               }
-
-               pool->base.transforms[i] = dce80_transform_create(ctx, i);
-               if (pool->base.transforms[i] == NULL) {
-                       BREAK_TO_DEBUGGER();
-                       dm_error("DC: failed to create transform!\n");
-                       goto res_create_fail;
-               }
-
-               pool->base.opps[i] = dce80_opp_create(ctx, i);
-               if (pool->base.opps[i] == NULL) {
-                       BREAK_TO_DEBUGGER();
-                       dm_error("DC: failed to create output pixel processor!\n");
-                       goto res_create_fail;
-               }
-       }
-
-       for (i = 0; i < pool->base.res_cap->num_ddc; i++) {
-               pool->base.engines[i] = dce80_aux_engine_create(ctx, i);
-               if (pool->base.engines[i] == NULL) {
-                       BREAK_TO_DEBUGGER();
-                       dm_error(
-                               "DC:failed to create aux engine!!\n");
-                       goto res_create_fail;
-               }
-               pool->base.hw_i2cs[i] = dce80_i2c_hw_create(ctx, i);
-               if (pool->base.hw_i2cs[i] == NULL) {
-                       BREAK_TO_DEBUGGER();
-                       dm_error(
-                               "DC:failed to create i2c engine!!\n");
-                       goto res_create_fail;
-               }
-               pool->base.sw_i2cs[i] = dce80_i2c_sw_create(ctx);
-               if (pool->base.sw_i2cs[i] == NULL) {
-                       BREAK_TO_DEBUGGER();
-                       dm_error(
-                               "DC:failed to create sw i2c!!\n");
-                       goto res_create_fail;
-               }
-       }
-
-       dc->caps.max_planes =  pool->base.pipe_count;
-
-       for (i = 0; i < dc->caps.max_planes; ++i)
-               dc->caps.planes[i] = plane_cap;
-
-       dc->caps.disable_dp_clk_share = true;
-
-       if (!resource_construct(num_virtual_links, dc, &pool->base,
-                       &res_create_funcs))
-               goto res_create_fail;
-
-       /* Create hardware sequencer */
-       dce80_hw_sequencer_construct(dc);
-
-       return true;
-
-res_create_fail:
-       dce80_resource_destruct(pool);
-       return false;
-}
-
-struct resource_pool *dce81_create_resource_pool(
-       uint8_t num_virtual_links,
-       struct dc *dc)
-{
-       struct dce110_resource_pool *pool =
-               kzalloc(sizeof(struct dce110_resource_pool), GFP_KERNEL);
-
-       if (!pool)
-               return NULL;
-
-       if (dce81_construct(num_virtual_links, dc, pool))
-               return &pool->base;
-
-       kfree(pool);
-       BREAK_TO_DEBUGGER();
-       return NULL;
-}
-
-static bool dce83_construct(
-       uint8_t num_virtual_links,
-       struct dc *dc,
-       struct dce110_resource_pool *pool)
-{
-       unsigned int i;
-       struct dc_context *ctx = dc->ctx;
-       struct dc_bios *bp;
-
-       ctx->dc_bios->regs = &bios_regs;
-
-       pool->base.res_cap = &res_cap_83;
-       pool->base.funcs = &dce80_res_pool_funcs;
-
-
-       /*************************************************
-        *  Resource + asic cap harcoding                *
-        *************************************************/
-       pool->base.underlay_pipe_index = NO_UNDERLAY_PIPE;
-       pool->base.pipe_count = res_cap_83.num_timing_generator;
-       pool->base.timing_generator_count = res_cap_83.num_timing_generator;
-       dc->caps.max_downscale_ratio = 200;
-       dc->caps.i2c_speed_in_khz = 40;
-       dc->caps.i2c_speed_in_khz_hdcp = 40;
-       dc->caps.max_cursor_size = 128;
-       dc->caps.min_horizontal_blanking_period = 80;
-       dc->caps.is_apu = true;
-       dc->debug = debug_defaults;
-
-       /*************************************************
-        *  Create resources                             *
-        *************************************************/
-
-       bp = ctx->dc_bios;
-
-       if (bp->fw_info_valid && bp->fw_info.external_clock_source_frequency_for_dp != 0) {
-               pool->base.dp_clock_source =
-                               dce80_clock_source_create(ctx, bp, CLOCK_SOURCE_ID_EXTERNAL, NULL, true);
-
-               pool->base.clock_sources[0] =
-                               dce80_clock_source_create(ctx, bp, CLOCK_SOURCE_ID_PLL1, &clk_src_regs[0], false);
-               pool->base.clock_sources[1] =
-                               dce80_clock_source_create(ctx, bp, CLOCK_SOURCE_ID_PLL2, &clk_src_regs[1], false);
-               pool->base.clk_src_count = 2;
-
-       } else {
-               pool->base.dp_clock_source =
-                               dce80_clock_source_create(ctx, bp, CLOCK_SOURCE_ID_PLL1, &clk_src_regs[0], true);
-
-               pool->base.clock_sources[0] =
-                               dce80_clock_source_create(ctx, bp, CLOCK_SOURCE_ID_PLL2, &clk_src_regs[1], false);
-               pool->base.clk_src_count = 1;
-       }
-
-       if (pool->base.dp_clock_source == NULL) {
-               dm_error("DC: failed to create dp clock source!\n");
-               BREAK_TO_DEBUGGER();
-               goto res_create_fail;
-       }
-
-       for (i = 0; i < pool->base.clk_src_count; i++) {
-               if (pool->base.clock_sources[i] == NULL) {
-                       dm_error("DC: failed to create clock sources!\n");
-                       BREAK_TO_DEBUGGER();
-                       goto res_create_fail;
-               }
-       }
-
-       pool->base.dmcu = dce_dmcu_create(ctx,
-                       &dmcu_regs,
-                       &dmcu_shift,
-                       &dmcu_mask);
-       if (pool->base.dmcu == NULL) {
-               dm_error("DC: failed to create dmcu!\n");
-               BREAK_TO_DEBUGGER();
-               goto res_create_fail;
-       }
-
-       pool->base.abm = dce_abm_create(ctx,
-                       &abm_regs,
-                       &abm_shift,
-                       &abm_mask);
-       if (pool->base.abm == NULL) {
-               dm_error("DC: failed to create abm!\n");
-               BREAK_TO_DEBUGGER();
-               goto res_create_fail;
-       }
-
-       {
-               struct irq_service_init_data init_data;
-               init_data.ctx = dc->ctx;
-               pool->base.irqs = dal_irq_service_dce80_create(&init_data);
-               if (!pool->base.irqs)
-                       goto res_create_fail;
-       }
-
-       for (i = 0; i < pool->base.pipe_count; i++) {
-               pool->base.timing_generators[i] = dce80_timing_generator_create(
-                               ctx, i, &dce80_tg_offsets[i]);
-               if (pool->base.timing_generators[i] == NULL) {
-                       BREAK_TO_DEBUGGER();
-                       dm_error("DC: failed to create tg!\n");
-                       goto res_create_fail;
-               }
-
-               pool->base.mis[i] = dce80_mem_input_create(ctx, i);
-               if (pool->base.mis[i] == NULL) {
-                       BREAK_TO_DEBUGGER();
-                       dm_error("DC: failed to create memory input!\n");
-                       goto res_create_fail;
-               }
-
-               pool->base.ipps[i] = dce80_ipp_create(ctx, i);
-               if (pool->base.ipps[i] == NULL) {
-                       BREAK_TO_DEBUGGER();
-                       dm_error("DC: failed to create input pixel processor!\n");
-                       goto res_create_fail;
-               }
-
-               pool->base.transforms[i] = dce80_transform_create(ctx, i);
-               if (pool->base.transforms[i] == NULL) {
-                       BREAK_TO_DEBUGGER();
-                       dm_error("DC: failed to create transform!\n");
-                       goto res_create_fail;
-               }
-
-               pool->base.opps[i] = dce80_opp_create(ctx, i);
-               if (pool->base.opps[i] == NULL) {
-                       BREAK_TO_DEBUGGER();
-                       dm_error("DC: failed to create output pixel processor!\n");
-                       goto res_create_fail;
-               }
-       }
-
-       for (i = 0; i < pool->base.res_cap->num_ddc; i++) {
-               pool->base.engines[i] = dce80_aux_engine_create(ctx, i);
-               if (pool->base.engines[i] == NULL) {
-                       BREAK_TO_DEBUGGER();
-                       dm_error(
-                               "DC:failed to create aux engine!!\n");
-                       goto res_create_fail;
-               }
-               pool->base.hw_i2cs[i] = dce80_i2c_hw_create(ctx, i);
-               if (pool->base.hw_i2cs[i] == NULL) {
-                       BREAK_TO_DEBUGGER();
-                       dm_error(
-                               "DC:failed to create i2c engine!!\n");
-                       goto res_create_fail;
-               }
-               pool->base.sw_i2cs[i] = dce80_i2c_sw_create(ctx);
-               if (pool->base.sw_i2cs[i] == NULL) {
-                       BREAK_TO_DEBUGGER();
-                       dm_error(
-                               "DC:failed to create sw i2c!!\n");
-                       goto res_create_fail;
-               }
-       }
-
-       dc->caps.max_planes =  pool->base.pipe_count;
-
-       for (i = 0; i < dc->caps.max_planes; ++i)
-               dc->caps.planes[i] = plane_cap;
-
-       dc->caps.disable_dp_clk_share = true;
-
-       if (!resource_construct(num_virtual_links, dc, &pool->base,
-                       &res_create_funcs))
-               goto res_create_fail;
-
-       /* Create hardware sequencer */
-       dce80_hw_sequencer_construct(dc);
-
-       return true;
-
-res_create_fail:
-       dce80_resource_destruct(pool);
-       return false;
-}
-
-struct resource_pool *dce83_create_resource_pool(
-       uint8_t num_virtual_links,
-       struct dc *dc)
-{
-       struct dce110_resource_pool *pool =
-               kzalloc(sizeof(struct dce110_resource_pool), GFP_KERNEL);
-
-       if (!pool)
-               return NULL;
-
-       if (dce83_construct(num_virtual_links, dc, pool))
-               return &pool->base;
-
-       BREAK_TO_DEBUGGER();
-       return NULL;
-}
diff --git a/drivers/gpu/drm/amd/display/dc/dce80/dce80_resource.h b/drivers/gpu/drm/amd/display/dc/dce80/dce80_resource.h
deleted file mode 100644 (file)
index eff31ab..0000000
+++ /dev/null
@@ -1,47 +0,0 @@
-/*
-* Copyright 2012-15 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_RESOURCE_DCE80_H__
-#define __DC_RESOURCE_DCE80_H__
-
-#include "core_types.h"
-
-struct dc;
-struct resource_pool;
-
-struct resource_pool *dce80_create_resource_pool(
-       uint8_t num_virtual_links,
-       struct dc *dc);
-
-struct resource_pool *dce81_create_resource_pool(
-       uint8_t num_virtual_links,
-       struct dc *dc);
-
-struct resource_pool *dce83_create_resource_pool(
-       uint8_t num_virtual_links,
-       struct dc *dc);
-
-#endif /* __DC_RESOURCE_DCE80_H__ */
-
index 2d2007c3e2b614c6fbf333ddfb1a0b4f9ff7aada..1eb7418ced3aa4376fe5454fcd299334996a31e1 100644 (file)
@@ -22,7 +22,7 @@
 #
 # Makefile for DCN.
 
-DCN10 = dcn10_init.o dcn10_resource.o dcn10_ipp.o \
+DCN10 = dcn10_init.o dcn10_ipp.o \
                dcn10_hw_sequencer_debug.o \
                dcn10_dpp.o dcn10_opp.o dcn10_optc.o \
                dcn10_hubp.o dcn10_mpc.o \
diff --git a/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_resource.c b/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_resource.c
deleted file mode 100644 (file)
index b94c5c9..0000000
+++ /dev/null
@@ -1,1686 +0,0 @@
-/*
-* Copyright 2016 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 "dm_services.h"
-#include "dc.h"
-
-#include "dcn10_init.h"
-
-#include "resource.h"
-#include "include/irq_service_interface.h"
-#include "dcn10_resource.h"
-#include "dcn10_ipp.h"
-#include "dcn10_mpc.h"
-#include "irq/dcn10/irq_service_dcn10.h"
-#include "dcn10_dpp.h"
-#include "dcn10_optc.h"
-#include "dcn10/dcn10_hwseq.h"
-#include "dce110/dce110_hwseq.h"
-#include "dcn10_opp.h"
-#include "dcn10_link_encoder.h"
-#include "dcn10_stream_encoder.h"
-#include "dce/dce_clock_source.h"
-#include "dce/dce_audio.h"
-#include "dce/dce_hwseq.h"
-#include "virtual/virtual_stream_encoder.h"
-#include "dce110/dce110_resource.h"
-#include "dce112/dce112_resource.h"
-#include "dcn10_hubp.h"
-#include "dcn10_hubbub.h"
-#include "dce/dce_panel_cntl.h"
-
-#include "soc15_hw_ip.h"
-#include "vega10_ip_offset.h"
-
-#include "dcn/dcn_1_0_offset.h"
-#include "dcn/dcn_1_0_sh_mask.h"
-
-#include "nbio/nbio_7_0_offset.h"
-
-#include "mmhub/mmhub_9_1_offset.h"
-#include "mmhub/mmhub_9_1_sh_mask.h"
-
-#include "reg_helper.h"
-#include "dce/dce_abm.h"
-#include "dce/dce_dmcu.h"
-#include "dce/dce_aux.h"
-#include "dce/dce_i2c.h"
-
-#ifndef mmDP0_DP_DPHY_INTERNAL_CTRL
-       #define mmDP0_DP_DPHY_INTERNAL_CTRL             0x210f
-       #define mmDP0_DP_DPHY_INTERNAL_CTRL_BASE_IDX    2
-       #define mmDP1_DP_DPHY_INTERNAL_CTRL             0x220f
-       #define mmDP1_DP_DPHY_INTERNAL_CTRL_BASE_IDX    2
-       #define mmDP2_DP_DPHY_INTERNAL_CTRL             0x230f
-       #define mmDP2_DP_DPHY_INTERNAL_CTRL_BASE_IDX    2
-       #define mmDP3_DP_DPHY_INTERNAL_CTRL             0x240f
-       #define mmDP3_DP_DPHY_INTERNAL_CTRL_BASE_IDX    2
-       #define mmDP4_DP_DPHY_INTERNAL_CTRL             0x250f
-       #define mmDP4_DP_DPHY_INTERNAL_CTRL_BASE_IDX    2
-       #define mmDP5_DP_DPHY_INTERNAL_CTRL             0x260f
-       #define mmDP5_DP_DPHY_INTERNAL_CTRL_BASE_IDX    2
-       #define mmDP6_DP_DPHY_INTERNAL_CTRL             0x270f
-       #define mmDP6_DP_DPHY_INTERNAL_CTRL_BASE_IDX    2
-#endif
-
-
-enum dcn10_clk_src_array_id {
-       DCN10_CLK_SRC_PLL0,
-       DCN10_CLK_SRC_PLL1,
-       DCN10_CLK_SRC_PLL2,
-       DCN10_CLK_SRC_PLL3,
-       DCN10_CLK_SRC_TOTAL,
-       DCN101_CLK_SRC_TOTAL = DCN10_CLK_SRC_PLL3
-};
-
-/* begin *********************
- * macros to expend register list macro defined in HW object header file */
-
-/* DCN */
-#define BASE_INNER(seg) \
-       DCE_BASE__INST0_SEG ## seg
-
-#define BASE(seg) \
-       BASE_INNER(seg)
-
-#define SR(reg_name)\
-               .reg_name = BASE(mm ## reg_name ## _BASE_IDX) +  \
-                                       mm ## reg_name
-
-#define SRI(reg_name, block, id)\
-       .reg_name = BASE(mm ## block ## id ## _ ## reg_name ## _BASE_IDX) + \
-                                       mm ## block ## id ## _ ## reg_name
-
-
-#define SRII(reg_name, block, id)\
-       .reg_name[id] = BASE(mm ## block ## id ## _ ## reg_name ## _BASE_IDX) + \
-                                       mm ## block ## id ## _ ## reg_name
-
-#define VUPDATE_SRII(reg_name, block, id)\
-       .reg_name[id] = BASE(mm ## reg_name ## 0 ## _ ## block ## id ## _BASE_IDX) + \
-                                       mm ## reg_name ## 0 ## _ ## block ## id
-
-/* set field/register/bitfield name */
-#define SFRB(field_name, reg_name, bitfield, post_fix)\
-       .field_name = reg_name ## __ ## bitfield ## post_fix
-
-/* NBIO */
-#define NBIO_BASE_INNER(seg) \
-       NBIF_BASE__INST0_SEG ## seg
-
-#define NBIO_BASE(seg) \
-       NBIO_BASE_INNER(seg)
-
-#define NBIO_SR(reg_name)\
-               .reg_name = NBIO_BASE(mm ## reg_name ## _BASE_IDX) +  \
-                                       mm ## reg_name
-
-/* MMHUB */
-#define MMHUB_BASE_INNER(seg) \
-       MMHUB_BASE__INST0_SEG ## seg
-
-#define MMHUB_BASE(seg) \
-       MMHUB_BASE_INNER(seg)
-
-#define MMHUB_SR(reg_name)\
-               .reg_name = MMHUB_BASE(mm ## reg_name ## _BASE_IDX) +  \
-                                       mm ## reg_name
-
-/* macros to expend register list macro defined in HW object header file
- * end *********************/
-
-
-static const struct dce_dmcu_registers dmcu_regs = {
-               DMCU_DCN10_REG_LIST()
-};
-
-static const struct dce_dmcu_shift dmcu_shift = {
-               DMCU_MASK_SH_LIST_DCN10(__SHIFT)
-};
-
-static const struct dce_dmcu_mask dmcu_mask = {
-               DMCU_MASK_SH_LIST_DCN10(_MASK)
-};
-
-static const struct dce_abm_registers abm_regs = {
-               ABM_DCN10_REG_LIST(0)
-};
-
-static const struct dce_abm_shift abm_shift = {
-               ABM_MASK_SH_LIST_DCN10(__SHIFT)
-};
-
-static const struct dce_abm_mask abm_mask = {
-               ABM_MASK_SH_LIST_DCN10(_MASK)
-};
-
-#define stream_enc_regs(id)\
-[id] = {\
-       SE_DCN_REG_LIST(id)\
-}
-
-static const struct dcn10_stream_enc_registers stream_enc_regs[] = {
-       stream_enc_regs(0),
-       stream_enc_regs(1),
-       stream_enc_regs(2),
-       stream_enc_regs(3),
-};
-
-static const struct dcn10_stream_encoder_shift se_shift = {
-               SE_COMMON_MASK_SH_LIST_DCN10(__SHIFT)
-};
-
-static const struct dcn10_stream_encoder_mask se_mask = {
-               SE_COMMON_MASK_SH_LIST_DCN10(_MASK)
-};
-
-#define audio_regs(id)\
-[id] = {\
-               AUD_COMMON_REG_LIST(id)\
-}
-
-static const struct dce_audio_registers audio_regs[] = {
-       audio_regs(0),
-       audio_regs(1),
-       audio_regs(2),
-       audio_regs(3),
-};
-
-#define DCE120_AUD_COMMON_MASK_SH_LIST(mask_sh)\
-               SF(AZF0ENDPOINT0_AZALIA_F0_CODEC_ENDPOINT_INDEX, AZALIA_ENDPOINT_REG_INDEX, mask_sh),\
-               SF(AZF0ENDPOINT0_AZALIA_F0_CODEC_ENDPOINT_DATA, AZALIA_ENDPOINT_REG_DATA, mask_sh),\
-               AUD_COMMON_MASK_SH_LIST_BASE(mask_sh)
-
-static const struct dce_audio_shift audio_shift = {
-               DCE120_AUD_COMMON_MASK_SH_LIST(__SHIFT)
-};
-
-static const struct dce_audio_mask audio_mask = {
-               DCE120_AUD_COMMON_MASK_SH_LIST(_MASK)
-};
-
-#define aux_regs(id)\
-[id] = {\
-       AUX_REG_LIST(id)\
-}
-
-static const struct dcn10_link_enc_aux_registers link_enc_aux_regs[] = {
-               aux_regs(0),
-               aux_regs(1),
-               aux_regs(2),
-               aux_regs(3)
-};
-
-#define hpd_regs(id)\
-[id] = {\
-       HPD_REG_LIST(id)\
-}
-
-static const struct dcn10_link_enc_hpd_registers link_enc_hpd_regs[] = {
-               hpd_regs(0),
-               hpd_regs(1),
-               hpd_regs(2),
-               hpd_regs(3)
-};
-
-#define link_regs(id)\
-[id] = {\
-       LE_DCN10_REG_LIST(id), \
-       SRI(DP_DPHY_INTERNAL_CTRL, DP, id) \
-}
-
-static const struct dcn10_link_enc_registers link_enc_regs[] = {
-       link_regs(0),
-       link_regs(1),
-       link_regs(2),
-       link_regs(3)
-};
-
-static const struct dcn10_link_enc_shift le_shift = {
-               LINK_ENCODER_MASK_SH_LIST_DCN10(__SHIFT)
-};
-
-static const struct dcn10_link_enc_mask le_mask = {
-               LINK_ENCODER_MASK_SH_LIST_DCN10(_MASK)
-};
-
-static const struct dce_panel_cntl_registers panel_cntl_regs[] = {
-       { DCN_PANEL_CNTL_REG_LIST() }
-};
-
-static const struct dce_panel_cntl_shift panel_cntl_shift = {
-       DCE_PANEL_CNTL_MASK_SH_LIST(__SHIFT)
-};
-
-static const struct dce_panel_cntl_mask panel_cntl_mask = {
-       DCE_PANEL_CNTL_MASK_SH_LIST(_MASK)
-};
-
-static const struct dce110_aux_registers_shift aux_shift = {
-       DCN10_AUX_MASK_SH_LIST(__SHIFT)
-};
-
-static const struct dce110_aux_registers_mask aux_mask = {
-       DCN10_AUX_MASK_SH_LIST(_MASK)
-};
-
-#define ipp_regs(id)\
-[id] = {\
-       IPP_REG_LIST_DCN10(id),\
-}
-
-static const struct dcn10_ipp_registers ipp_regs[] = {
-       ipp_regs(0),
-       ipp_regs(1),
-       ipp_regs(2),
-       ipp_regs(3),
-};
-
-static const struct dcn10_ipp_shift ipp_shift = {
-               IPP_MASK_SH_LIST_DCN10(__SHIFT)
-};
-
-static const struct dcn10_ipp_mask ipp_mask = {
-               IPP_MASK_SH_LIST_DCN10(_MASK),
-};
-
-#define opp_regs(id)\
-[id] = {\
-       OPP_REG_LIST_DCN10(id),\
-}
-
-static const struct dcn10_opp_registers opp_regs[] = {
-       opp_regs(0),
-       opp_regs(1),
-       opp_regs(2),
-       opp_regs(3),
-};
-
-static const struct dcn10_opp_shift opp_shift = {
-               OPP_MASK_SH_LIST_DCN10(__SHIFT)
-};
-
-static const struct dcn10_opp_mask opp_mask = {
-               OPP_MASK_SH_LIST_DCN10(_MASK),
-};
-
-#define aux_engine_regs(id)\
-[id] = {\
-       AUX_COMMON_REG_LIST(id), \
-       .AUX_RESET_MASK = 0 \
-}
-
-static const struct dce110_aux_registers aux_engine_regs[] = {
-               aux_engine_regs(0),
-               aux_engine_regs(1),
-               aux_engine_regs(2),
-               aux_engine_regs(3),
-               aux_engine_regs(4),
-               aux_engine_regs(5)
-};
-
-#define tf_regs(id)\
-[id] = {\
-       TF_REG_LIST_DCN10(id),\
-}
-
-static const struct dcn_dpp_registers tf_regs[] = {
-       tf_regs(0),
-       tf_regs(1),
-       tf_regs(2),
-       tf_regs(3),
-};
-
-static const struct dcn_dpp_shift tf_shift = {
-       TF_REG_LIST_SH_MASK_DCN10(__SHIFT),
-       TF_DEBUG_REG_LIST_SH_DCN10
-
-};
-
-static const struct dcn_dpp_mask tf_mask = {
-       TF_REG_LIST_SH_MASK_DCN10(_MASK),
-       TF_DEBUG_REG_LIST_MASK_DCN10
-};
-
-static const struct dcn_mpc_registers mpc_regs = {
-               MPC_COMMON_REG_LIST_DCN1_0(0),
-               MPC_COMMON_REG_LIST_DCN1_0(1),
-               MPC_COMMON_REG_LIST_DCN1_0(2),
-               MPC_COMMON_REG_LIST_DCN1_0(3),
-               MPC_OUT_MUX_COMMON_REG_LIST_DCN1_0(0),
-               MPC_OUT_MUX_COMMON_REG_LIST_DCN1_0(1),
-               MPC_OUT_MUX_COMMON_REG_LIST_DCN1_0(2),
-               MPC_OUT_MUX_COMMON_REG_LIST_DCN1_0(3)
-};
-
-static const struct dcn_mpc_shift mpc_shift = {
-       MPC_COMMON_MASK_SH_LIST_DCN1_0(__SHIFT),\
-       SFRB(CUR_VUPDATE_LOCK_SET, CUR0_VUPDATE_LOCK_SET0, CUR0_VUPDATE_LOCK_SET, __SHIFT)
-};
-
-static const struct dcn_mpc_mask mpc_mask = {
-       MPC_COMMON_MASK_SH_LIST_DCN1_0(_MASK),\
-       SFRB(CUR_VUPDATE_LOCK_SET, CUR0_VUPDATE_LOCK_SET0, CUR0_VUPDATE_LOCK_SET, _MASK)
-};
-
-#define tg_regs(id)\
-[id] = {TG_COMMON_REG_LIST_DCN1_0(id)}
-
-static const struct dcn_optc_registers tg_regs[] = {
-       tg_regs(0),
-       tg_regs(1),
-       tg_regs(2),
-       tg_regs(3),
-};
-
-static const struct dcn_optc_shift tg_shift = {
-       TG_COMMON_MASK_SH_LIST_DCN1_0(__SHIFT)
-};
-
-static const struct dcn_optc_mask tg_mask = {
-       TG_COMMON_MASK_SH_LIST_DCN1_0(_MASK)
-};
-
-static const struct bios_registers bios_regs = {
-               NBIO_SR(BIOS_SCRATCH_3),
-               NBIO_SR(BIOS_SCRATCH_6)
-};
-
-#define hubp_regs(id)\
-[id] = {\
-       HUBP_REG_LIST_DCN10(id)\
-}
-
-static const struct dcn_mi_registers hubp_regs[] = {
-       hubp_regs(0),
-       hubp_regs(1),
-       hubp_regs(2),
-       hubp_regs(3),
-};
-
-static const struct dcn_mi_shift hubp_shift = {
-               HUBP_MASK_SH_LIST_DCN10(__SHIFT)
-};
-
-static const struct dcn_mi_mask hubp_mask = {
-               HUBP_MASK_SH_LIST_DCN10(_MASK)
-};
-
-static const struct dcn_hubbub_registers hubbub_reg = {
-               HUBBUB_REG_LIST_DCN10(0)
-};
-
-static const struct dcn_hubbub_shift hubbub_shift = {
-               HUBBUB_MASK_SH_LIST_DCN10(__SHIFT)
-};
-
-static const struct dcn_hubbub_mask hubbub_mask = {
-               HUBBUB_MASK_SH_LIST_DCN10(_MASK)
-};
-
-static int map_transmitter_id_to_phy_instance(
-       enum transmitter transmitter)
-{
-       switch (transmitter) {
-       case TRANSMITTER_UNIPHY_A:
-               return 0;
-       break;
-       case TRANSMITTER_UNIPHY_B:
-               return 1;
-       break;
-       case TRANSMITTER_UNIPHY_C:
-               return 2;
-       break;
-       case TRANSMITTER_UNIPHY_D:
-               return 3;
-       break;
-       default:
-               ASSERT(0);
-               return 0;
-       }
-}
-
-#define clk_src_regs(index, pllid)\
-[index] = {\
-       CS_COMMON_REG_LIST_DCN1_0(index, pllid),\
-}
-
-static const struct dce110_clk_src_regs clk_src_regs[] = {
-       clk_src_regs(0, A),
-       clk_src_regs(1, B),
-       clk_src_regs(2, C),
-       clk_src_regs(3, D)
-};
-
-static const struct dce110_clk_src_shift cs_shift = {
-               CS_COMMON_MASK_SH_LIST_DCN1_0(__SHIFT)
-};
-
-static const struct dce110_clk_src_mask cs_mask = {
-               CS_COMMON_MASK_SH_LIST_DCN1_0(_MASK)
-};
-
-static const struct resource_caps res_cap = {
-               .num_timing_generator = 4,
-               .num_opp = 4,
-               .num_video_plane = 4,
-               .num_audio = 4,
-               .num_stream_encoder = 4,
-               .num_pll = 4,
-               .num_ddc = 4,
-};
-
-static const struct resource_caps rv2_res_cap = {
-               .num_timing_generator = 3,
-               .num_opp = 3,
-               .num_video_plane = 3,
-               .num_audio = 3,
-               .num_stream_encoder = 3,
-               .num_pll = 3,
-               .num_ddc = 4,
-};
-
-static const struct dc_plane_cap plane_cap = {
-       .type = DC_PLANE_TYPE_DCN_UNIVERSAL,
-       .per_pixel_alpha = true,
-
-       .pixel_format_support = {
-                       .argb8888 = true,
-                       .nv12 = true,
-                       .fp16 = true,
-                       .p010 = true
-       },
-
-       .max_upscale_factor = {
-                       .argb8888 = 16000,
-                       .nv12 = 16000,
-                       .fp16 = 1
-       },
-
-       .max_downscale_factor = {
-                       .argb8888 = 250,
-                       .nv12 = 250,
-                       .fp16 = 1
-       }
-};
-
-static const struct dc_debug_options debug_defaults_drv = {
-               .sanity_checks = true,
-               .disable_dmcu = false,
-               .force_abm_enable = false,
-               .timing_trace = false,
-               .clock_trace = true,
-
-               /* raven smu dones't allow 0 disp clk,
-                * smu min disp clk limit is 50Mhz
-                * keep min disp clk 100Mhz avoid smu hang
-                */
-               .min_disp_clk_khz = 100000,
-
-               .disable_pplib_clock_request = false,
-               .disable_pplib_wm_range = false,
-               .pplib_wm_report_mode = WM_REPORT_DEFAULT,
-               .pipe_split_policy = MPC_SPLIT_DYNAMIC,
-               .force_single_disp_pipe_split = true,
-               .disable_dcc = DCC_ENABLE,
-               .voltage_align_fclk = true,
-               .disable_stereo_support = true,
-               .vsr_support = true,
-               .performance_trace = false,
-               .az_endpoint_mute_only = true,
-               .recovery_enabled = false, /*enable this by default after testing.*/
-               .max_downscale_src_width = 3840,
-               .underflow_assert_delay_us = 0xFFFFFFFF,
-               .enable_legacy_fast_update = true,
-               .using_dml2 = false,
-};
-
-static const struct dc_debug_options debug_defaults_diags = {
-               .disable_dmcu = false,
-               .force_abm_enable = false,
-               .timing_trace = true,
-               .clock_trace = true,
-               .disable_stutter = true,
-               .disable_pplib_clock_request = true,
-               .disable_pplib_wm_range = true,
-               .underflow_assert_delay_us = 0xFFFFFFFF,
-};
-
-static void dcn10_dpp_destroy(struct dpp **dpp)
-{
-       kfree(TO_DCN10_DPP(*dpp));
-       *dpp = NULL;
-}
-
-static struct dpp *dcn10_dpp_create(
-       struct dc_context *ctx,
-       uint32_t inst)
-{
-       struct dcn10_dpp *dpp =
-               kzalloc(sizeof(struct dcn10_dpp), GFP_KERNEL);
-
-       if (!dpp)
-               return NULL;
-
-       dpp1_construct(dpp, ctx, inst,
-                      &tf_regs[inst], &tf_shift, &tf_mask);
-       return &dpp->base;
-}
-
-static struct input_pixel_processor *dcn10_ipp_create(
-       struct dc_context *ctx, uint32_t inst)
-{
-       struct dcn10_ipp *ipp =
-               kzalloc(sizeof(struct dcn10_ipp), GFP_KERNEL);
-
-       if (!ipp) {
-               BREAK_TO_DEBUGGER();
-               return NULL;
-       }
-
-       dcn10_ipp_construct(ipp, ctx, inst,
-                       &ipp_regs[inst], &ipp_shift, &ipp_mask);
-       return &ipp->base;
-}
-
-
-static struct output_pixel_processor *dcn10_opp_create(
-       struct dc_context *ctx, uint32_t inst)
-{
-       struct dcn10_opp *opp =
-               kzalloc(sizeof(struct dcn10_opp), GFP_KERNEL);
-
-       if (!opp) {
-               BREAK_TO_DEBUGGER();
-               return NULL;
-       }
-
-       dcn10_opp_construct(opp, ctx, inst,
-                       &opp_regs[inst], &opp_shift, &opp_mask);
-       return &opp->base;
-}
-
-static struct dce_aux *dcn10_aux_engine_create(struct dc_context *ctx,
-                                              uint32_t inst)
-{
-       struct aux_engine_dce110 *aux_engine =
-               kzalloc(sizeof(struct aux_engine_dce110), GFP_KERNEL);
-
-       if (!aux_engine)
-               return NULL;
-
-       dce110_aux_engine_construct(aux_engine, ctx, inst,
-                                   SW_AUX_TIMEOUT_PERIOD_MULTIPLIER * AUX_TIMEOUT_PERIOD,
-                                   &aux_engine_regs[inst],
-                                       &aux_mask,
-                                       &aux_shift,
-                                       ctx->dc->caps.extended_aux_timeout_support);
-
-       return &aux_engine->base;
-}
-#define i2c_inst_regs(id) { I2C_HW_ENGINE_COMMON_REG_LIST(id) }
-
-static const struct dce_i2c_registers i2c_hw_regs[] = {
-               i2c_inst_regs(1),
-               i2c_inst_regs(2),
-               i2c_inst_regs(3),
-               i2c_inst_regs(4),
-               i2c_inst_regs(5),
-               i2c_inst_regs(6),
-};
-
-static const struct dce_i2c_shift i2c_shifts = {
-               I2C_COMMON_MASK_SH_LIST_DCE110(__SHIFT)
-};
-
-static const struct dce_i2c_mask i2c_masks = {
-               I2C_COMMON_MASK_SH_LIST_DCE110(_MASK)
-};
-
-static struct dce_i2c_hw *dcn10_i2c_hw_create(struct dc_context *ctx,
-                                             uint32_t inst)
-{
-       struct dce_i2c_hw *dce_i2c_hw =
-               kzalloc(sizeof(struct dce_i2c_hw), GFP_KERNEL);
-
-       if (!dce_i2c_hw)
-               return NULL;
-
-       dcn1_i2c_hw_construct(dce_i2c_hw, ctx, inst,
-                                   &i2c_hw_regs[inst], &i2c_shifts, &i2c_masks);
-
-       return dce_i2c_hw;
-}
-static struct mpc *dcn10_mpc_create(struct dc_context *ctx)
-{
-       struct dcn10_mpc *mpc10 = kzalloc(sizeof(struct dcn10_mpc),
-                                         GFP_KERNEL);
-
-       if (!mpc10)
-               return NULL;
-
-       dcn10_mpc_construct(mpc10, ctx,
-                       &mpc_regs,
-                       &mpc_shift,
-                       &mpc_mask,
-                       4);
-
-       return &mpc10->base;
-}
-
-static struct hubbub *dcn10_hubbub_create(struct dc_context *ctx)
-{
-       struct dcn10_hubbub *dcn10_hubbub = kzalloc(sizeof(struct dcn10_hubbub),
-                                         GFP_KERNEL);
-
-       if (!dcn10_hubbub)
-               return NULL;
-
-       hubbub1_construct(&dcn10_hubbub->base, ctx,
-                       &hubbub_reg,
-                       &hubbub_shift,
-                       &hubbub_mask);
-
-       return &dcn10_hubbub->base;
-}
-
-static struct timing_generator *dcn10_timing_generator_create(
-               struct dc_context *ctx,
-               uint32_t instance)
-{
-       struct optc *tgn10 =
-               kzalloc(sizeof(struct optc), GFP_KERNEL);
-
-       if (!tgn10)
-               return NULL;
-
-       tgn10->base.inst = instance;
-       tgn10->base.ctx = ctx;
-
-       tgn10->tg_regs = &tg_regs[instance];
-       tgn10->tg_shift = &tg_shift;
-       tgn10->tg_mask = &tg_mask;
-
-       dcn10_timing_generator_init(tgn10);
-
-       return &tgn10->base;
-}
-
-static const struct encoder_feature_support link_enc_feature = {
-               .max_hdmi_deep_color = COLOR_DEPTH_121212,
-               .max_hdmi_pixel_clock = 600000,
-               .hdmi_ycbcr420_supported = true,
-               .dp_ycbcr420_supported = true,
-               .flags.bits.IS_HBR2_CAPABLE = true,
-               .flags.bits.IS_HBR3_CAPABLE = true,
-               .flags.bits.IS_TPS3_CAPABLE = true,
-               .flags.bits.IS_TPS4_CAPABLE = true
-};
-
-static struct link_encoder *dcn10_link_encoder_create(
-       struct dc_context *ctx,
-       const struct encoder_init_data *enc_init_data)
-{
-       struct dcn10_link_encoder *enc10 =
-               kzalloc(sizeof(struct dcn10_link_encoder), GFP_KERNEL);
-       int link_regs_id;
-
-       if (!enc10)
-               return NULL;
-
-       link_regs_id =
-               map_transmitter_id_to_phy_instance(enc_init_data->transmitter);
-
-       dcn10_link_encoder_construct(enc10,
-                                     enc_init_data,
-                                     &link_enc_feature,
-                                     &link_enc_regs[link_regs_id],
-                                     &link_enc_aux_regs[enc_init_data->channel - 1],
-                                     &link_enc_hpd_regs[enc_init_data->hpd_source],
-                                     &le_shift,
-                                     &le_mask);
-
-       return &enc10->base;
-}
-
-static struct panel_cntl *dcn10_panel_cntl_create(const struct panel_cntl_init_data *init_data)
-{
-       struct dce_panel_cntl *panel_cntl =
-               kzalloc(sizeof(struct dce_panel_cntl), GFP_KERNEL);
-
-       if (!panel_cntl)
-               return NULL;
-
-       dce_panel_cntl_construct(panel_cntl,
-                       init_data,
-                       &panel_cntl_regs[init_data->inst],
-                       &panel_cntl_shift,
-                       &panel_cntl_mask);
-
-       return &panel_cntl->base;
-}
-
-static struct clock_source *dcn10_clock_source_create(
-       struct dc_context *ctx,
-       struct dc_bios *bios,
-       enum clock_source_id id,
-       const struct dce110_clk_src_regs *regs,
-       bool dp_clk_src)
-{
-       struct dce110_clk_src *clk_src =
-               kzalloc(sizeof(struct dce110_clk_src), GFP_KERNEL);
-
-       if (!clk_src)
-               return NULL;
-
-       if (dce112_clk_src_construct(clk_src, ctx, bios, id,
-                       regs, &cs_shift, &cs_mask)) {
-               clk_src->base.dp_clk_src = dp_clk_src;
-               return &clk_src->base;
-       }
-
-       kfree(clk_src);
-       BREAK_TO_DEBUGGER();
-       return NULL;
-}
-
-static void read_dce_straps(
-       struct dc_context *ctx,
-       struct resource_straps *straps)
-{
-       generic_reg_get(ctx, mmDC_PINSTRAPS + BASE(mmDC_PINSTRAPS_BASE_IDX),
-               FN(DC_PINSTRAPS, DC_PINSTRAPS_AUDIO), &straps->dc_pinstraps_audio);
-}
-
-static struct audio *create_audio(
-               struct dc_context *ctx, unsigned int inst)
-{
-       return dce_audio_create(ctx, inst,
-                       &audio_regs[inst], &audio_shift, &audio_mask);
-}
-
-static struct stream_encoder *dcn10_stream_encoder_create(
-       enum engine_id eng_id,
-       struct dc_context *ctx)
-{
-       struct dcn10_stream_encoder *enc1 =
-               kzalloc(sizeof(struct dcn10_stream_encoder), GFP_KERNEL);
-
-       if (!enc1)
-               return NULL;
-
-       dcn10_stream_encoder_construct(enc1, ctx, ctx->dc_bios, eng_id,
-                                       &stream_enc_regs[eng_id],
-                                       &se_shift, &se_mask);
-       return &enc1->base;
-}
-
-static const struct dce_hwseq_registers hwseq_reg = {
-               HWSEQ_DCN1_REG_LIST()
-};
-
-static const struct dce_hwseq_shift hwseq_shift = {
-               HWSEQ_DCN1_MASK_SH_LIST(__SHIFT)
-};
-
-static const struct dce_hwseq_mask hwseq_mask = {
-               HWSEQ_DCN1_MASK_SH_LIST(_MASK)
-};
-
-static struct dce_hwseq *dcn10_hwseq_create(
-       struct dc_context *ctx)
-{
-       struct dce_hwseq *hws = kzalloc(sizeof(struct dce_hwseq), GFP_KERNEL);
-
-       if (hws) {
-               hws->ctx = ctx;
-               hws->regs = &hwseq_reg;
-               hws->shifts = &hwseq_shift;
-               hws->masks = &hwseq_mask;
-               hws->wa.DEGVIDCN10_253 = true;
-               hws->wa.false_optc_underflow = true;
-               hws->wa.DEGVIDCN10_254 = true;
-
-               if ((ctx->asic_id.chip_family == FAMILY_RV) &&
-                       ASICREV_IS_RAVEN2(ctx->asic_id.hw_internal_rev))
-                       switch (ctx->asic_id.pci_revision_id) {
-                       case PRID_POLLOCK_94:
-                       case PRID_POLLOCK_95:
-                       case PRID_POLLOCK_E9:
-                       case PRID_POLLOCK_EA:
-                       case PRID_POLLOCK_EB:
-                               hws->wa.wait_hubpret_read_start_during_mpo_transition = true;
-                               break;
-                       default:
-                               hws->wa.wait_hubpret_read_start_during_mpo_transition = false;
-                               break;
-                       }
-       }
-       return hws;
-}
-
-static const struct resource_create_funcs res_create_funcs = {
-       .read_dce_straps = read_dce_straps,
-       .create_audio = create_audio,
-       .create_stream_encoder = dcn10_stream_encoder_create,
-       .create_hwseq = dcn10_hwseq_create,
-};
-
-static void dcn10_clock_source_destroy(struct clock_source **clk_src)
-{
-       kfree(TO_DCE110_CLK_SRC(*clk_src));
-       *clk_src = NULL;
-}
-
-static struct pp_smu_funcs *dcn10_pp_smu_create(struct dc_context *ctx)
-{
-       struct pp_smu_funcs *pp_smu = kzalloc(sizeof(*pp_smu), GFP_KERNEL);
-
-       if (!pp_smu)
-               return pp_smu;
-
-       dm_pp_get_funcs(ctx, pp_smu);
-       return pp_smu;
-}
-
-static void dcn10_resource_destruct(struct dcn10_resource_pool *pool)
-{
-       unsigned int i;
-
-       for (i = 0; i < pool->base.stream_enc_count; i++) {
-               if (pool->base.stream_enc[i] != NULL) {
-                       kfree(DCN10STRENC_FROM_STRENC(pool->base.stream_enc[i]));
-                       pool->base.stream_enc[i] = NULL;
-               }
-       }
-
-       if (pool->base.mpc != NULL) {
-               kfree(TO_DCN10_MPC(pool->base.mpc));
-               pool->base.mpc = NULL;
-       }
-
-       kfree(pool->base.hubbub);
-       pool->base.hubbub = NULL;
-
-       for (i = 0; i < pool->base.pipe_count; i++) {
-               if (pool->base.opps[i] != NULL)
-                       pool->base.opps[i]->funcs->opp_destroy(&pool->base.opps[i]);
-
-               if (pool->base.dpps[i] != NULL)
-                       dcn10_dpp_destroy(&pool->base.dpps[i]);
-
-               if (pool->base.ipps[i] != NULL)
-                       pool->base.ipps[i]->funcs->ipp_destroy(&pool->base.ipps[i]);
-
-               if (pool->base.hubps[i] != NULL) {
-                       kfree(TO_DCN10_HUBP(pool->base.hubps[i]));
-                       pool->base.hubps[i] = NULL;
-               }
-
-               if (pool->base.irqs != NULL) {
-                       dal_irq_service_destroy(&pool->base.irqs);
-               }
-
-               if (pool->base.timing_generators[i] != NULL)    {
-                       kfree(DCN10TG_FROM_TG(pool->base.timing_generators[i]));
-                       pool->base.timing_generators[i] = NULL;
-               }
-       }
-
-       for (i = 0; i < pool->base.res_cap->num_ddc; i++) {
-               if (pool->base.engines[i] != NULL)
-                       dce110_engine_destroy(&pool->base.engines[i]);
-               kfree(pool->base.hw_i2cs[i]);
-               pool->base.hw_i2cs[i] = NULL;
-               kfree(pool->base.sw_i2cs[i]);
-               pool->base.sw_i2cs[i] = NULL;
-       }
-
-       for (i = 0; i < pool->base.audio_count; i++) {
-               if (pool->base.audios[i])
-                       dce_aud_destroy(&pool->base.audios[i]);
-       }
-
-       for (i = 0; i < pool->base.clk_src_count; i++) {
-               if (pool->base.clock_sources[i] != NULL) {
-                       dcn10_clock_source_destroy(&pool->base.clock_sources[i]);
-                       pool->base.clock_sources[i] = NULL;
-               }
-       }
-
-       if (pool->base.dp_clock_source != NULL) {
-               dcn10_clock_source_destroy(&pool->base.dp_clock_source);
-               pool->base.dp_clock_source = NULL;
-       }
-
-       if (pool->base.abm != NULL)
-               dce_abm_destroy(&pool->base.abm);
-
-       if (pool->base.dmcu != NULL)
-               dce_dmcu_destroy(&pool->base.dmcu);
-
-       kfree(pool->base.pp_smu);
-}
-
-static struct hubp *dcn10_hubp_create(
-       struct dc_context *ctx,
-       uint32_t inst)
-{
-       struct dcn10_hubp *hubp1 =
-               kzalloc(sizeof(struct dcn10_hubp), GFP_KERNEL);
-
-       if (!hubp1)
-               return NULL;
-
-       dcn10_hubp_construct(hubp1, ctx, inst,
-                            &hubp_regs[inst], &hubp_shift, &hubp_mask);
-       return &hubp1->base;
-}
-
-static void get_pixel_clock_parameters(
-       const struct pipe_ctx *pipe_ctx,
-       struct pixel_clk_params *pixel_clk_params)
-{
-       const struct dc_stream_state *stream = pipe_ctx->stream;
-       pixel_clk_params->requested_pix_clk_100hz = stream->timing.pix_clk_100hz;
-       pixel_clk_params->encoder_object_id = stream->link->link_enc->id;
-       pixel_clk_params->signal_type = pipe_ctx->stream->signal;
-       pixel_clk_params->controller_id = pipe_ctx->stream_res.tg->inst + 1;
-       /* TODO: un-hardcode*/
-       pixel_clk_params->requested_sym_clk = LINK_RATE_LOW *
-               LINK_RATE_REF_FREQ_IN_KHZ;
-       pixel_clk_params->flags.ENABLE_SS = 0;
-       pixel_clk_params->color_depth =
-               stream->timing.display_color_depth;
-       pixel_clk_params->flags.DISPLAY_BLANKED = 1;
-       pixel_clk_params->pixel_encoding = stream->timing.pixel_encoding;
-
-       if (stream->timing.pixel_encoding == PIXEL_ENCODING_YCBCR422)
-               pixel_clk_params->color_depth = COLOR_DEPTH_888;
-
-       if (stream->timing.pixel_encoding == PIXEL_ENCODING_YCBCR420)
-               pixel_clk_params->requested_pix_clk_100hz  /= 2;
-       if (stream->timing.timing_3d_format == TIMING_3D_FORMAT_HW_FRAME_PACKING)
-               pixel_clk_params->requested_pix_clk_100hz *= 2;
-
-}
-
-static void build_clamping_params(struct dc_stream_state *stream)
-{
-       stream->clamping.clamping_level = CLAMPING_FULL_RANGE;
-       stream->clamping.c_depth = stream->timing.display_color_depth;
-       stream->clamping.pixel_encoding = stream->timing.pixel_encoding;
-}
-
-static void build_pipe_hw_param(struct pipe_ctx *pipe_ctx)
-{
-
-       get_pixel_clock_parameters(pipe_ctx, &pipe_ctx->stream_res.pix_clk_params);
-
-       pipe_ctx->clock_source->funcs->get_pix_clk_dividers(
-               pipe_ctx->clock_source,
-               &pipe_ctx->stream_res.pix_clk_params,
-               &pipe_ctx->pll_settings);
-
-       pipe_ctx->stream->clamping.pixel_encoding = pipe_ctx->stream->timing.pixel_encoding;
-
-       resource_build_bit_depth_reduction_params(pipe_ctx->stream,
-                                       &pipe_ctx->stream->bit_depth_params);
-       build_clamping_params(pipe_ctx->stream);
-}
-
-static enum dc_status build_mapped_resource(
-               const struct dc *dc,
-               struct dc_state *context,
-               struct dc_stream_state *stream)
-{
-       struct pipe_ctx *pipe_ctx = resource_get_otg_master_for_stream(&context->res_ctx, stream);
-
-       if (!pipe_ctx)
-               return DC_ERROR_UNEXPECTED;
-
-       build_pipe_hw_param(pipe_ctx);
-       return DC_OK;
-}
-
-static enum dc_status dcn10_add_stream_to_ctx(
-               struct dc *dc,
-               struct dc_state *new_ctx,
-               struct dc_stream_state *dc_stream)
-{
-       enum dc_status result = DC_ERROR_UNEXPECTED;
-
-       result = resource_map_pool_resources(dc, new_ctx, dc_stream);
-
-       if (result == DC_OK)
-               result = resource_map_phy_clock_resources(dc, new_ctx, dc_stream);
-
-
-       if (result == DC_OK)
-               result = build_mapped_resource(dc, new_ctx, dc_stream);
-
-       return result;
-}
-
-static struct pipe_ctx *dcn10_acquire_free_pipe_for_layer(
-               const struct dc_state *cur_ctx,
-               struct dc_state *new_ctx,
-               const struct resource_pool *pool,
-               const struct pipe_ctx *opp_head_pipe)
-{
-       struct resource_context *res_ctx = &new_ctx->res_ctx;
-       struct pipe_ctx *head_pipe = resource_get_otg_master_for_stream(res_ctx, opp_head_pipe->stream);
-       struct pipe_ctx *idle_pipe = resource_find_free_secondary_pipe_legacy(res_ctx, pool, head_pipe);
-
-       if (!head_pipe) {
-               ASSERT(0);
-               return NULL;
-       }
-
-       if (!idle_pipe)
-               return NULL;
-
-       idle_pipe->stream = head_pipe->stream;
-       idle_pipe->stream_res.tg = head_pipe->stream_res.tg;
-       idle_pipe->stream_res.abm = head_pipe->stream_res.abm;
-       idle_pipe->stream_res.opp = head_pipe->stream_res.opp;
-
-       idle_pipe->plane_res.hubp = pool->hubps[idle_pipe->pipe_idx];
-       idle_pipe->plane_res.ipp = pool->ipps[idle_pipe->pipe_idx];
-       idle_pipe->plane_res.dpp = pool->dpps[idle_pipe->pipe_idx];
-       idle_pipe->plane_res.mpcc_inst = pool->dpps[idle_pipe->pipe_idx]->inst;
-
-       return idle_pipe;
-}
-
-static bool dcn10_get_dcc_compression_cap(const struct dc *dc,
-               const struct dc_dcc_surface_param *input,
-               struct dc_surface_dcc_cap *output)
-{
-       return dc->res_pool->hubbub->funcs->get_dcc_compression_cap(
-                       dc->res_pool->hubbub,
-                       input,
-                       output);
-}
-
-static void dcn10_destroy_resource_pool(struct resource_pool **pool)
-{
-       struct dcn10_resource_pool *dcn10_pool = TO_DCN10_RES_POOL(*pool);
-
-       dcn10_resource_destruct(dcn10_pool);
-       kfree(dcn10_pool);
-       *pool = NULL;
-}
-
-static bool dcn10_validate_bandwidth(
-               struct dc *dc,
-               struct dc_state *context,
-               bool fast_validate)
-{
-       bool voltage_supported;
-
-       DC_FP_START();
-       voltage_supported = dcn_validate_bandwidth(dc, context, fast_validate);
-       DC_FP_END();
-
-       return voltage_supported;
-}
-
-static enum dc_status dcn10_validate_plane(const struct dc_plane_state *plane_state, struct dc_caps *caps)
-{
-       if (plane_state->format >= SURFACE_PIXEL_FORMAT_VIDEO_BEGIN
-                       && caps->max_video_width != 0
-                       && plane_state->src_rect.width > caps->max_video_width)
-               return DC_FAIL_SURFACE_VALIDATE;
-
-       return DC_OK;
-}
-
-static enum dc_status dcn10_validate_global(struct dc *dc, struct dc_state *context)
-{
-       int i, j;
-       bool video_down_scaled = false;
-       bool video_large = false;
-       bool desktop_large = false;
-       bool dcc_disabled = false;
-       bool mpo_enabled = false;
-
-       for (i = 0; i < context->stream_count; i++) {
-               if (context->stream_status[i].plane_count == 0)
-                       continue;
-
-               if (context->stream_status[i].plane_count > 2)
-                       return DC_FAIL_UNSUPPORTED_1;
-
-               if (context->stream_status[i].plane_count > 1)
-                       mpo_enabled = true;
-
-               for (j = 0; j < context->stream_status[i].plane_count; j++) {
-                       struct dc_plane_state *plane =
-                               context->stream_status[i].plane_states[j];
-
-
-                       if (plane->format >= SURFACE_PIXEL_FORMAT_VIDEO_BEGIN) {
-
-                               if (plane->src_rect.width > plane->dst_rect.width ||
-                                               plane->src_rect.height > plane->dst_rect.height)
-                                       video_down_scaled = true;
-
-                               if (plane->src_rect.width >= 3840)
-                                       video_large = true;
-
-                       } else {
-                               if (plane->src_rect.width >= 3840)
-                                       desktop_large = true;
-                               if (!plane->dcc.enable)
-                                       dcc_disabled = true;
-                       }
-               }
-       }
-
-       /* Disable MPO in multi-display configurations. */
-       if (context->stream_count > 1 && mpo_enabled)
-               return DC_FAIL_UNSUPPORTED_1;
-
-       /*
-        * Workaround: On DCN10 there is UMC issue that causes underflow when
-        * playing 4k video on 4k desktop with video downscaled and single channel
-        * memory
-        */
-       if (video_large && desktop_large && video_down_scaled && dcc_disabled &&
-                       dc->dcn_soc->number_of_channels == 1)
-               return DC_FAIL_SURFACE_VALIDATE;
-
-       return DC_OK;
-}
-
-static enum dc_status dcn10_patch_unknown_plane_state(struct dc_plane_state *plane_state)
-{
-       enum surface_pixel_format surf_pix_format = plane_state->format;
-       unsigned int bpp = resource_pixel_format_to_bpp(surf_pix_format);
-
-       enum swizzle_mode_values swizzle = DC_SW_LINEAR;
-
-       if (bpp == 64)
-               swizzle = DC_SW_64KB_D;
-       else
-               swizzle = DC_SW_64KB_S;
-
-       plane_state->tiling_info.gfx9.swizzle = swizzle;
-       return DC_OK;
-}
-
-struct stream_encoder *dcn10_find_first_free_match_stream_enc_for_link(
-               struct resource_context *res_ctx,
-               const struct resource_pool *pool,
-               struct dc_stream_state *stream)
-{
-       int i;
-       int j = -1;
-       struct dc_link *link = stream->link;
-
-       for (i = 0; i < pool->stream_enc_count; i++) {
-               if (!res_ctx->is_stream_enc_acquired[i] &&
-                               pool->stream_enc[i]) {
-                       /* Store first available for MST second display
-                        * in daisy chain use case
-                        */
-                       j = i;
-                       if (link->ep_type == DISPLAY_ENDPOINT_PHY && pool->stream_enc[i]->id ==
-                                       link->link_enc->preferred_engine)
-                               return pool->stream_enc[i];
-               }
-       }
-
-       /*
-        * For CZ and later, we can allow DIG FE and BE to differ for all display types
-        */
-
-       if (j >= 0)
-               return pool->stream_enc[j];
-
-       return NULL;
-}
-
-static const struct dc_cap_funcs cap_funcs = {
-       .get_dcc_compression_cap = dcn10_get_dcc_compression_cap
-};
-
-static const struct resource_funcs dcn10_res_pool_funcs = {
-       .destroy = dcn10_destroy_resource_pool,
-       .link_enc_create = dcn10_link_encoder_create,
-       .panel_cntl_create = dcn10_panel_cntl_create,
-       .validate_bandwidth = dcn10_validate_bandwidth,
-       .acquire_free_pipe_as_secondary_dpp_pipe = dcn10_acquire_free_pipe_for_layer,
-       .validate_plane = dcn10_validate_plane,
-       .validate_global = dcn10_validate_global,
-       .add_stream_to_ctx = dcn10_add_stream_to_ctx,
-       .patch_unknown_plane_state = dcn10_patch_unknown_plane_state,
-       .find_first_free_match_stream_enc_for_link = dcn10_find_first_free_match_stream_enc_for_link
-};
-
-static uint32_t read_pipe_fuses(struct dc_context *ctx)
-{
-       uint32_t value = dm_read_reg_soc15(ctx, mmCC_DC_PIPE_DIS, 0);
-       /* RV1 support max 4 pipes */
-       value = value & 0xf;
-       return value;
-}
-
-static bool verify_clock_values(struct dm_pp_clock_levels_with_voltage *clks)
-{
-       int i;
-
-       if (clks->num_levels == 0)
-               return false;
-
-       for (i = 0; i < clks->num_levels; i++)
-               /* Ensure that the result is sane */
-               if (clks->data[i].clocks_in_khz == 0)
-                       return false;
-
-       return true;
-}
-
-static bool dcn10_resource_construct(
-       uint8_t num_virtual_links,
-       struct dc *dc,
-       struct dcn10_resource_pool *pool)
-{
-       int i;
-       int j;
-       struct dc_context *ctx = dc->ctx;
-       uint32_t pipe_fuses = read_pipe_fuses(ctx);
-       struct dm_pp_clock_levels_with_voltage fclks = {0}, dcfclks = {0};
-       int min_fclk_khz, min_dcfclk_khz, socclk_khz;
-       bool res;
-
-       ctx->dc_bios->regs = &bios_regs;
-
-       if (ctx->dce_version == DCN_VERSION_1_01)
-               pool->base.res_cap = &rv2_res_cap;
-       else
-               pool->base.res_cap = &res_cap;
-       pool->base.funcs = &dcn10_res_pool_funcs;
-
-       /*
-        * TODO fill in from actual raven resource when we create
-        * more than virtual encoder
-        */
-
-       /*************************************************
-        *  Resource + asic cap harcoding                *
-        *************************************************/
-       pool->base.underlay_pipe_index = NO_UNDERLAY_PIPE;
-
-       /* max pipe num for ASIC before check pipe fuses */
-       pool->base.pipe_count = pool->base.res_cap->num_timing_generator;
-
-       if (dc->ctx->dce_version == DCN_VERSION_1_01)
-               pool->base.pipe_count = 3;
-       dc->caps.max_video_width = 3840;
-       dc->caps.max_downscale_ratio = 200;
-       dc->caps.i2c_speed_in_khz = 100;
-       dc->caps.i2c_speed_in_khz_hdcp = 100; /*1.4 w/a not applied by default*/
-       dc->caps.max_cursor_size = 256;
-       dc->caps.min_horizontal_blanking_period = 80;
-       dc->caps.max_slave_planes = 1;
-       dc->caps.max_slave_yuv_planes = 1;
-       dc->caps.max_slave_rgb_planes = 0;
-       dc->caps.is_apu = true;
-       dc->caps.post_blend_color_processing = false;
-       dc->caps.extended_aux_timeout_support = false;
-
-       /* Raven DP PHY HBR2 eye diagram pattern is not stable. Use TP4 */
-       dc->caps.force_dp_tps4_for_cp2520 = true;
-
-       /* Color pipeline capabilities */
-       dc->caps.color.dpp.dcn_arch = 1;
-       dc->caps.color.dpp.input_lut_shared = 1;
-       dc->caps.color.dpp.icsc = 1;
-       dc->caps.color.dpp.dgam_ram = 1;
-       dc->caps.color.dpp.dgam_rom_caps.srgb = 1;
-       dc->caps.color.dpp.dgam_rom_caps.bt2020 = 1;
-       dc->caps.color.dpp.dgam_rom_caps.gamma2_2 = 0;
-       dc->caps.color.dpp.dgam_rom_caps.pq = 0;
-       dc->caps.color.dpp.dgam_rom_caps.hlg = 0;
-       dc->caps.color.dpp.post_csc = 0;
-       dc->caps.color.dpp.gamma_corr = 0;
-       dc->caps.color.dpp.dgam_rom_for_yuv = 1;
-
-       dc->caps.color.dpp.hw_3d_lut = 0;
-       dc->caps.color.dpp.ogam_ram = 1; // RGAM on DCN1
-       dc->caps.color.dpp.ogam_rom_caps.srgb = 1;
-       dc->caps.color.dpp.ogam_rom_caps.bt2020 = 1;
-       dc->caps.color.dpp.ogam_rom_caps.gamma2_2 = 0;
-       dc->caps.color.dpp.ogam_rom_caps.pq = 0;
-       dc->caps.color.dpp.ogam_rom_caps.hlg = 0;
-       dc->caps.color.dpp.ocsc = 1;
-
-       /* no post-blend color operations */
-       dc->caps.color.mpc.gamut_remap = 0;
-       dc->caps.color.mpc.num_3dluts = 0;
-       dc->caps.color.mpc.shared_3d_lut = 0;
-       dc->caps.color.mpc.ogam_ram = 0;
-       dc->caps.color.mpc.ogam_rom_caps.srgb = 0;
-       dc->caps.color.mpc.ogam_rom_caps.bt2020 = 0;
-       dc->caps.color.mpc.ogam_rom_caps.gamma2_2 = 0;
-       dc->caps.color.mpc.ogam_rom_caps.pq = 0;
-       dc->caps.color.mpc.ogam_rom_caps.hlg = 0;
-       dc->caps.color.mpc.ocsc = 0;
-
-       if (dc->ctx->dce_environment == DCE_ENV_PRODUCTION_DRV)
-               dc->debug = debug_defaults_drv;
-       else
-               dc->debug = debug_defaults_diags;
-
-       /*************************************************
-        *  Create resources                             *
-        *************************************************/
-
-       pool->base.clock_sources[DCN10_CLK_SRC_PLL0] =
-                       dcn10_clock_source_create(ctx, ctx->dc_bios,
-                               CLOCK_SOURCE_COMBO_PHY_PLL0,
-                               &clk_src_regs[0], false);
-       pool->base.clock_sources[DCN10_CLK_SRC_PLL1] =
-                       dcn10_clock_source_create(ctx, ctx->dc_bios,
-                               CLOCK_SOURCE_COMBO_PHY_PLL1,
-                               &clk_src_regs[1], false);
-       pool->base.clock_sources[DCN10_CLK_SRC_PLL2] =
-                       dcn10_clock_source_create(ctx, ctx->dc_bios,
-                               CLOCK_SOURCE_COMBO_PHY_PLL2,
-                               &clk_src_regs[2], false);
-
-       if (dc->ctx->dce_version == DCN_VERSION_1_0) {
-               pool->base.clock_sources[DCN10_CLK_SRC_PLL3] =
-                               dcn10_clock_source_create(ctx, ctx->dc_bios,
-                                       CLOCK_SOURCE_COMBO_PHY_PLL3,
-                                       &clk_src_regs[3], false);
-       }
-
-       pool->base.clk_src_count = DCN10_CLK_SRC_TOTAL;
-
-       if (dc->ctx->dce_version == DCN_VERSION_1_01)
-               pool->base.clk_src_count = DCN101_CLK_SRC_TOTAL;
-
-       pool->base.dp_clock_source =
-                       dcn10_clock_source_create(ctx, ctx->dc_bios,
-                               CLOCK_SOURCE_ID_DP_DTO,
-                               /* todo: not reuse phy_pll registers */
-                               &clk_src_regs[0], true);
-
-       for (i = 0; i < pool->base.clk_src_count; i++) {
-               if (pool->base.clock_sources[i] == NULL) {
-                       dm_error("DC: failed to create clock sources!\n");
-                       BREAK_TO_DEBUGGER();
-                       goto fail;
-               }
-       }
-
-       pool->base.dmcu = dcn10_dmcu_create(ctx,
-                       &dmcu_regs,
-                       &dmcu_shift,
-                       &dmcu_mask);
-       if (pool->base.dmcu == NULL) {
-               dm_error("DC: failed to create dmcu!\n");
-               BREAK_TO_DEBUGGER();
-               goto fail;
-       }
-
-       pool->base.abm = dce_abm_create(ctx,
-                       &abm_regs,
-                       &abm_shift,
-                       &abm_mask);
-       if (pool->base.abm == NULL) {
-               dm_error("DC: failed to create abm!\n");
-               BREAK_TO_DEBUGGER();
-               goto fail;
-       }
-
-       dml_init_instance(&dc->dml, &dcn1_0_soc, &dcn1_0_ip, DML_PROJECT_RAVEN1);
-       memcpy(dc->dcn_ip, &dcn10_ip_defaults, sizeof(dcn10_ip_defaults));
-       memcpy(dc->dcn_soc, &dcn10_soc_defaults, sizeof(dcn10_soc_defaults));
-
-       DC_FP_START();
-       dcn10_resource_construct_fp(dc);
-       DC_FP_END();
-
-       if (!dc->config.is_vmin_only_asic)
-               if (ASICREV_IS_RAVEN2(dc->ctx->asic_id.hw_internal_rev))
-                       switch (dc->ctx->asic_id.pci_revision_id) {
-                       case PRID_DALI_DE:
-                       case PRID_DALI_DF:
-                       case PRID_DALI_E3:
-                       case PRID_DALI_E4:
-                       case PRID_POLLOCK_94:
-                       case PRID_POLLOCK_95:
-                       case PRID_POLLOCK_E9:
-                       case PRID_POLLOCK_EA:
-                       case PRID_POLLOCK_EB:
-                               dc->config.is_vmin_only_asic = true;
-                               break;
-                       default:
-                               break;
-                       }
-
-       pool->base.pp_smu = dcn10_pp_smu_create(ctx);
-
-       /*
-        * Right now SMU/PPLIB and DAL all have the AZ D3 force PME notification *
-        * implemented. So AZ D3 should work.For issue 197007.                   *
-        */
-       if (pool->base.pp_smu != NULL
-                       && pool->base.pp_smu->rv_funcs.set_pme_wa_enable != NULL)
-               dc->debug.az_endpoint_mute_only = false;
-
-
-       if (!dc->debug.disable_pplib_clock_request) {
-               /*
-                * TODO: This is not the proper way to obtain
-                * fabric_and_dram_bandwidth, should be min(fclk, memclk).
-                */
-               res = dm_pp_get_clock_levels_by_type_with_voltage(
-                               ctx, DM_PP_CLOCK_TYPE_FCLK, &fclks);
-
-               DC_FP_START();
-
-               if (res)
-                       res = verify_clock_values(&fclks);
-
-               if (res)
-                       dcn_bw_update_from_pplib_fclks(dc, &fclks);
-               else
-                       BREAK_TO_DEBUGGER();
-
-               DC_FP_END();
-
-               res = dm_pp_get_clock_levels_by_type_with_voltage(
-                       ctx, DM_PP_CLOCK_TYPE_DCFCLK, &dcfclks);
-
-               DC_FP_START();
-
-               if (res)
-                       res = verify_clock_values(&dcfclks);
-
-               if (res)
-                       dcn_bw_update_from_pplib_dcfclks(dc, &dcfclks);
-               else
-                       BREAK_TO_DEBUGGER();
-
-               DC_FP_END();
-       }
-
-       dcn_bw_sync_calcs_and_dml(dc);
-       if (!dc->debug.disable_pplib_wm_range) {
-               dc->res_pool = &pool->base;
-               DC_FP_START();
-               dcn_get_soc_clks(
-                       dc, &min_fclk_khz, &min_dcfclk_khz, &socclk_khz);
-               DC_FP_END();
-               dcn_bw_notify_pplib_of_wm_ranges(
-                       dc, min_fclk_khz, min_dcfclk_khz, socclk_khz);
-       }
-
-       {
-               struct irq_service_init_data init_data;
-               init_data.ctx = dc->ctx;
-               pool->base.irqs = dal_irq_service_dcn10_create(&init_data);
-               if (!pool->base.irqs)
-                       goto fail;
-       }
-
-       /* index to valid pipe resource  */
-       j = 0;
-       /* mem input -> ipp -> dpp -> opp -> TG */
-       for (i = 0; i < pool->base.pipe_count; i++) {
-               /* if pipe is disabled, skip instance of HW pipe,
-                * i.e, skip ASIC register instance
-                */
-               if ((pipe_fuses & (1 << i)) != 0)
-                       continue;
-
-               pool->base.hubps[j] = dcn10_hubp_create(ctx, i);
-               if (pool->base.hubps[j] == NULL) {
-                       BREAK_TO_DEBUGGER();
-                       dm_error(
-                               "DC: failed to create memory input!\n");
-                       goto fail;
-               }
-
-               pool->base.ipps[j] = dcn10_ipp_create(ctx, i);
-               if (pool->base.ipps[j] == NULL) {
-                       BREAK_TO_DEBUGGER();
-                       dm_error(
-                               "DC: failed to create input pixel processor!\n");
-                       goto fail;
-               }
-
-               pool->base.dpps[j] = dcn10_dpp_create(ctx, i);
-               if (pool->base.dpps[j] == NULL) {
-                       BREAK_TO_DEBUGGER();
-                       dm_error(
-                               "DC: failed to create dpp!\n");
-                       goto fail;
-               }
-
-               pool->base.opps[j] = dcn10_opp_create(ctx, i);
-               if (pool->base.opps[j] == NULL) {
-                       BREAK_TO_DEBUGGER();
-                       dm_error(
-                               "DC: failed to create output pixel processor!\n");
-                       goto fail;
-               }
-
-               pool->base.timing_generators[j] = dcn10_timing_generator_create(
-                               ctx, i);
-               if (pool->base.timing_generators[j] == NULL) {
-                       BREAK_TO_DEBUGGER();
-                       dm_error("DC: failed to create tg!\n");
-                       goto fail;
-               }
-               /* check next valid pipe */
-               j++;
-       }
-
-       for (i = 0; i < pool->base.res_cap->num_ddc; i++) {
-               pool->base.engines[i] = dcn10_aux_engine_create(ctx, i);
-               if (pool->base.engines[i] == NULL) {
-                       BREAK_TO_DEBUGGER();
-                       dm_error(
-                               "DC:failed to create aux engine!!\n");
-                       goto fail;
-               }
-               pool->base.hw_i2cs[i] = dcn10_i2c_hw_create(ctx, i);
-               if (pool->base.hw_i2cs[i] == NULL) {
-                       BREAK_TO_DEBUGGER();
-                       dm_error(
-                               "DC:failed to create hw i2c!!\n");
-                       goto fail;
-               }
-               pool->base.sw_i2cs[i] = NULL;
-       }
-
-       /* valid pipe num */
-       pool->base.pipe_count = j;
-       pool->base.timing_generator_count = j;
-
-       /* within dml lib, it is hard code to 4. If ASIC pipe is fused,
-        * the value may be changed
-        */
-       dc->dml.ip.max_num_dpp = pool->base.pipe_count;
-       dc->dcn_ip->max_num_dpp = pool->base.pipe_count;
-
-       pool->base.mpc = dcn10_mpc_create(ctx);
-       if (pool->base.mpc == NULL) {
-               BREAK_TO_DEBUGGER();
-               dm_error("DC: failed to create mpc!\n");
-               goto fail;
-       }
-
-       pool->base.hubbub = dcn10_hubbub_create(ctx);
-       if (pool->base.hubbub == NULL) {
-               BREAK_TO_DEBUGGER();
-               dm_error("DC: failed to create hubbub!\n");
-               goto fail;
-       }
-
-       if (!resource_construct(num_virtual_links, dc, &pool->base,
-                       &res_create_funcs))
-               goto fail;
-
-       dcn10_hw_sequencer_construct(dc);
-       dc->caps.max_planes =  pool->base.pipe_count;
-
-       for (i = 0; i < dc->caps.max_planes; ++i)
-               dc->caps.planes[i] = plane_cap;
-
-       dc->cap_funcs = cap_funcs;
-
-       return true;
-
-fail:
-
-       dcn10_resource_destruct(pool);
-
-       return false;
-}
-
-struct resource_pool *dcn10_create_resource_pool(
-               const struct dc_init_data *init_data,
-               struct dc *dc)
-{
-       struct dcn10_resource_pool *pool =
-               kzalloc(sizeof(struct dcn10_resource_pool), GFP_KERNEL);
-
-       if (!pool)
-               return NULL;
-
-       if (dcn10_resource_construct(init_data->num_virtual_links, dc, pool))
-               return &pool->base;
-
-       kfree(pool);
-       BREAK_TO_DEBUGGER();
-       return NULL;
-}
diff --git a/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_resource.h b/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_resource.h
deleted file mode 100644 (file)
index bf8e33c..0000000
+++ /dev/null
@@ -1,56 +0,0 @@
-/*
-* Copyright 2016 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_RESOURCE_DCN10_H__
-#define __DC_RESOURCE_DCN10_H__
-
-#include "core_types.h"
-#include "dml/dcn10/dcn10_fpu.h"
-
-#define TO_DCN10_RES_POOL(pool)\
-       container_of(pool, struct dcn10_resource_pool, base)
-
-struct dc;
-struct resource_pool;
-struct _vcs_dpi_display_pipe_params_st;
-
-extern struct _vcs_dpi_ip_params_st dcn1_0_ip;
-extern struct _vcs_dpi_soc_bounding_box_st dcn1_0_soc;
-
-struct dcn10_resource_pool {
-       struct resource_pool base;
-};
-struct resource_pool *dcn10_create_resource_pool(
-               const struct dc_init_data *init_data,
-               struct dc *dc);
-
-struct stream_encoder *dcn10_find_first_free_match_stream_enc_for_link(
-               struct resource_context *res_ctx,
-               const struct resource_pool *pool,
-               struct dc_stream_state *stream);
-
-
-#endif /* __DC_RESOURCE_DCN10_H__ */
-
index d7dc9696a8c826bace8d57f4090d203ece435fed..1cac1eca8111e481c540ce29c19133706d40efd1 100644 (file)
@@ -2,7 +2,7 @@
 #
 # Makefile for DCN.
 
-DCN20 = dcn20_resource.o dcn20_init.o dcn20_dpp.o dcn20_dpp_cm.o dcn20_hubp.o \
+DCN20 = dcn20_init.o dcn20_dpp.o dcn20_dpp_cm.o dcn20_hubp.o \
                dcn20_mpc.o dcn20_opp.o dcn20_hubbub.o dcn20_optc.o dcn20_mmhubbub.o \
                dcn20_stream_encoder.o dcn20_link_encoder.o dcn20_dccg.o \
                dcn20_vmid.o dcn20_dwb.o dcn20_dwb_scl.o
diff --git a/drivers/gpu/drm/amd/display/dc/dcn20/dcn20_resource.c b/drivers/gpu/drm/amd/display/dc/dcn20/dcn20_resource.c
deleted file mode 100644 (file)
index 0a422fb..0000000
+++ /dev/null
@@ -1,2789 +0,0 @@
-/*
-* Copyright 2016 Advanced Micro Devices, Inc.
- * Copyright 2019 Raptor Engineering, LLC
- *
- * 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 <linux/slab.h>
-
-#include "dm_services.h"
-#include "dc.h"
-
-#include "dcn20_init.h"
-
-#include "resource.h"
-#include "include/irq_service_interface.h"
-#include "dcn20/dcn20_resource.h"
-
-#include "dml/dcn20/dcn20_fpu.h"
-
-#include "dcn10/dcn10_hubp.h"
-#include "dcn10/dcn10_ipp.h"
-#include "dcn20_hubbub.h"
-#include "dcn20_mpc.h"
-#include "dcn20_hubp.h"
-#include "irq/dcn20/irq_service_dcn20.h"
-#include "dcn20_dpp.h"
-#include "dcn20_optc.h"
-#include "dcn20/dcn20_hwseq.h"
-#include "dce110/dce110_hwseq.h"
-#include "dcn10/dcn10_resource.h"
-#include "dcn20_opp.h"
-
-#include "dcn20_dsc.h"
-
-#include "dcn20_link_encoder.h"
-#include "dcn20_stream_encoder.h"
-#include "dce/dce_clock_source.h"
-#include "dce/dce_audio.h"
-#include "dce/dce_hwseq.h"
-#include "virtual/virtual_stream_encoder.h"
-#include "dce110/dce110_resource.h"
-#include "dml/display_mode_vba.h"
-#include "dcn20_dccg.h"
-#include "dcn20_vmid.h"
-#include "dce/dce_panel_cntl.h"
-
-#include "navi10_ip_offset.h"
-
-#include "dcn/dcn_2_0_0_offset.h"
-#include "dcn/dcn_2_0_0_sh_mask.h"
-#include "dpcs/dpcs_2_0_0_offset.h"
-#include "dpcs/dpcs_2_0_0_sh_mask.h"
-
-#include "nbio/nbio_2_3_offset.h"
-
-#include "dcn20/dcn20_dwb.h"
-#include "dcn20/dcn20_mmhubbub.h"
-
-#include "mmhub/mmhub_2_0_0_offset.h"
-#include "mmhub/mmhub_2_0_0_sh_mask.h"
-
-#include "reg_helper.h"
-#include "dce/dce_abm.h"
-#include "dce/dce_dmcu.h"
-#include "dce/dce_aux.h"
-#include "dce/dce_i2c.h"
-#include "vm_helper.h"
-#include "link_enc_cfg.h"
-
-#include "amdgpu_socbb.h"
-
-#include "link.h"
-#define DC_LOGGER_INIT(logger)
-
-#ifndef mmDP0_DP_DPHY_INTERNAL_CTRL
-       #define mmDP0_DP_DPHY_INTERNAL_CTRL             0x210f
-       #define mmDP0_DP_DPHY_INTERNAL_CTRL_BASE_IDX    2
-       #define mmDP1_DP_DPHY_INTERNAL_CTRL             0x220f
-       #define mmDP1_DP_DPHY_INTERNAL_CTRL_BASE_IDX    2
-       #define mmDP2_DP_DPHY_INTERNAL_CTRL             0x230f
-       #define mmDP2_DP_DPHY_INTERNAL_CTRL_BASE_IDX    2
-       #define mmDP3_DP_DPHY_INTERNAL_CTRL             0x240f
-       #define mmDP3_DP_DPHY_INTERNAL_CTRL_BASE_IDX    2
-       #define mmDP4_DP_DPHY_INTERNAL_CTRL             0x250f
-       #define mmDP4_DP_DPHY_INTERNAL_CTRL_BASE_IDX    2
-       #define mmDP5_DP_DPHY_INTERNAL_CTRL             0x260f
-       #define mmDP5_DP_DPHY_INTERNAL_CTRL_BASE_IDX    2
-       #define mmDP6_DP_DPHY_INTERNAL_CTRL             0x270f
-       #define mmDP6_DP_DPHY_INTERNAL_CTRL_BASE_IDX    2
-#endif
-
-
-enum dcn20_clk_src_array_id {
-       DCN20_CLK_SRC_PLL0,
-       DCN20_CLK_SRC_PLL1,
-       DCN20_CLK_SRC_PLL2,
-       DCN20_CLK_SRC_PLL3,
-       DCN20_CLK_SRC_PLL4,
-       DCN20_CLK_SRC_PLL5,
-       DCN20_CLK_SRC_TOTAL
-};
-
-/* begin *********************
- * macros to expend register list macro defined in HW object header file */
-
-/* DCN */
-#define BASE_INNER(seg) DCN_BASE__INST0_SEG ## seg
-
-#define BASE(seg) BASE_INNER(seg)
-
-#define SR(reg_name)\
-               .reg_name = BASE(mm ## reg_name ## _BASE_IDX) +  \
-                                       mm ## reg_name
-
-#define SRI(reg_name, block, id)\
-       .reg_name = BASE(mm ## block ## id ## _ ## reg_name ## _BASE_IDX) + \
-                                       mm ## block ## id ## _ ## reg_name
-
-#define SRI2_DWB(reg_name, block, id)\
-       .reg_name = BASE(mm ## reg_name ## _BASE_IDX) + \
-                                       mm ## reg_name
-#define SF_DWB(reg_name, field_name, post_fix)\
-       .field_name = reg_name ## __ ## field_name ## post_fix
-
-#define SF_DWB2(reg_name, block, id, field_name, post_fix)     \
-       .field_name = reg_name ## __ ## field_name ## post_fix
-
-#define SRIR(var_name, reg_name, block, id)\
-       .var_name = BASE(mm ## block ## id ## _ ## reg_name ## _BASE_IDX) + \
-                                       mm ## block ## id ## _ ## reg_name
-
-#define SRII(reg_name, block, id)\
-       .reg_name[id] = BASE(mm ## block ## id ## _ ## reg_name ## _BASE_IDX) + \
-                                       mm ## block ## id ## _ ## reg_name
-
-#define DCCG_SRII(reg_name, block, id)\
-       .block ## _ ## reg_name[id] = BASE(mm ## block ## id ## _ ## reg_name ## _BASE_IDX) + \
-                                       mm ## block ## id ## _ ## reg_name
-
-#define VUPDATE_SRII(reg_name, block, id)\
-       .reg_name[id] = BASE(mm ## reg_name ## _ ## block ## id ## _BASE_IDX) + \
-                                       mm ## reg_name ## _ ## block ## id
-
-/* NBIO */
-#define NBIO_BASE_INNER(seg) \
-       NBIO_BASE__INST0_SEG ## seg
-
-#define NBIO_BASE(seg) \
-       NBIO_BASE_INNER(seg)
-
-#define NBIO_SR(reg_name)\
-               .reg_name = NBIO_BASE(mm ## reg_name ## _BASE_IDX) + \
-                                       mm ## reg_name
-
-/* MMHUB */
-#define MMHUB_BASE_INNER(seg) \
-       MMHUB_BASE__INST0_SEG ## seg
-
-#define MMHUB_BASE(seg) \
-       MMHUB_BASE_INNER(seg)
-
-#define MMHUB_SR(reg_name)\
-               .reg_name = MMHUB_BASE(mmMM ## reg_name ## _BASE_IDX) + \
-                                       mmMM ## reg_name
-
-static const struct bios_registers bios_regs = {
-               NBIO_SR(BIOS_SCRATCH_3),
-               NBIO_SR(BIOS_SCRATCH_6)
-};
-
-#define clk_src_regs(index, pllid)\
-[index] = {\
-       CS_COMMON_REG_LIST_DCN2_0(index, pllid),\
-}
-
-static const struct dce110_clk_src_regs clk_src_regs[] = {
-       clk_src_regs(0, A),
-       clk_src_regs(1, B),
-       clk_src_regs(2, C),
-       clk_src_regs(3, D),
-       clk_src_regs(4, E),
-       clk_src_regs(5, F)
-};
-
-static const struct dce110_clk_src_shift cs_shift = {
-               CS_COMMON_MASK_SH_LIST_DCN2_0(__SHIFT)
-};
-
-static const struct dce110_clk_src_mask cs_mask = {
-               CS_COMMON_MASK_SH_LIST_DCN2_0(_MASK)
-};
-
-static const struct dce_dmcu_registers dmcu_regs = {
-               DMCU_DCN10_REG_LIST()
-};
-
-static const struct dce_dmcu_shift dmcu_shift = {
-               DMCU_MASK_SH_LIST_DCN10(__SHIFT)
-};
-
-static const struct dce_dmcu_mask dmcu_mask = {
-               DMCU_MASK_SH_LIST_DCN10(_MASK)
-};
-
-static const struct dce_abm_registers abm_regs = {
-               ABM_DCN20_REG_LIST()
-};
-
-static const struct dce_abm_shift abm_shift = {
-               ABM_MASK_SH_LIST_DCN20(__SHIFT)
-};
-
-static const struct dce_abm_mask abm_mask = {
-               ABM_MASK_SH_LIST_DCN20(_MASK)
-};
-
-#define audio_regs(id)\
-[id] = {\
-               AUD_COMMON_REG_LIST(id)\
-}
-
-static const struct dce_audio_registers audio_regs[] = {
-       audio_regs(0),
-       audio_regs(1),
-       audio_regs(2),
-       audio_regs(3),
-       audio_regs(4),
-       audio_regs(5),
-       audio_regs(6),
-};
-
-#define DCE120_AUD_COMMON_MASK_SH_LIST(mask_sh)\
-               SF(AZF0ENDPOINT0_AZALIA_F0_CODEC_ENDPOINT_INDEX, AZALIA_ENDPOINT_REG_INDEX, mask_sh),\
-               SF(AZF0ENDPOINT0_AZALIA_F0_CODEC_ENDPOINT_DATA, AZALIA_ENDPOINT_REG_DATA, mask_sh),\
-               AUD_COMMON_MASK_SH_LIST_BASE(mask_sh)
-
-static const struct dce_audio_shift audio_shift = {
-               DCE120_AUD_COMMON_MASK_SH_LIST(__SHIFT)
-};
-
-static const struct dce_audio_mask audio_mask = {
-               DCE120_AUD_COMMON_MASK_SH_LIST(_MASK)
-};
-
-#define stream_enc_regs(id)\
-[id] = {\
-       SE_DCN2_REG_LIST(id)\
-}
-
-static const struct dcn10_stream_enc_registers stream_enc_regs[] = {
-       stream_enc_regs(0),
-       stream_enc_regs(1),
-       stream_enc_regs(2),
-       stream_enc_regs(3),
-       stream_enc_regs(4),
-       stream_enc_regs(5),
-};
-
-static const struct dcn10_stream_encoder_shift se_shift = {
-               SE_COMMON_MASK_SH_LIST_DCN20(__SHIFT)
-};
-
-static const struct dcn10_stream_encoder_mask se_mask = {
-               SE_COMMON_MASK_SH_LIST_DCN20(_MASK)
-};
-
-
-#define aux_regs(id)\
-[id] = {\
-       DCN2_AUX_REG_LIST(id)\
-}
-
-static const struct dcn10_link_enc_aux_registers link_enc_aux_regs[] = {
-               aux_regs(0),
-               aux_regs(1),
-               aux_regs(2),
-               aux_regs(3),
-               aux_regs(4),
-               aux_regs(5)
-};
-
-#define hpd_regs(id)\
-[id] = {\
-       HPD_REG_LIST(id)\
-}
-
-static const struct dcn10_link_enc_hpd_registers link_enc_hpd_regs[] = {
-               hpd_regs(0),
-               hpd_regs(1),
-               hpd_regs(2),
-               hpd_regs(3),
-               hpd_regs(4),
-               hpd_regs(5)
-};
-
-#define link_regs(id, phyid)\
-[id] = {\
-       LE_DCN10_REG_LIST(id), \
-       UNIPHY_DCN2_REG_LIST(phyid), \
-       DPCS_DCN2_REG_LIST(id), \
-       SRI(DP_DPHY_INTERNAL_CTRL, DP, id) \
-}
-
-static const struct dcn10_link_enc_registers link_enc_regs[] = {
-       link_regs(0, A),
-       link_regs(1, B),
-       link_regs(2, C),
-       link_regs(3, D),
-       link_regs(4, E),
-       link_regs(5, F)
-};
-
-static const struct dcn10_link_enc_shift le_shift = {
-       LINK_ENCODER_MASK_SH_LIST_DCN20(__SHIFT),\
-       DPCS_DCN2_MASK_SH_LIST(__SHIFT)
-};
-
-static const struct dcn10_link_enc_mask le_mask = {
-       LINK_ENCODER_MASK_SH_LIST_DCN20(_MASK),\
-       DPCS_DCN2_MASK_SH_LIST(_MASK)
-};
-
-static const struct dce_panel_cntl_registers panel_cntl_regs[] = {
-       { DCN_PANEL_CNTL_REG_LIST() }
-};
-
-static const struct dce_panel_cntl_shift panel_cntl_shift = {
-       DCE_PANEL_CNTL_MASK_SH_LIST(__SHIFT)
-};
-
-static const struct dce_panel_cntl_mask panel_cntl_mask = {
-       DCE_PANEL_CNTL_MASK_SH_LIST(_MASK)
-};
-
-#define ipp_regs(id)\
-[id] = {\
-       IPP_REG_LIST_DCN20(id),\
-}
-
-static const struct dcn10_ipp_registers ipp_regs[] = {
-       ipp_regs(0),
-       ipp_regs(1),
-       ipp_regs(2),
-       ipp_regs(3),
-       ipp_regs(4),
-       ipp_regs(5),
-};
-
-static const struct dcn10_ipp_shift ipp_shift = {
-               IPP_MASK_SH_LIST_DCN20(__SHIFT)
-};
-
-static const struct dcn10_ipp_mask ipp_mask = {
-               IPP_MASK_SH_LIST_DCN20(_MASK),
-};
-
-#define opp_regs(id)\
-[id] = {\
-       OPP_REG_LIST_DCN20(id),\
-}
-
-static const struct dcn20_opp_registers opp_regs[] = {
-       opp_regs(0),
-       opp_regs(1),
-       opp_regs(2),
-       opp_regs(3),
-       opp_regs(4),
-       opp_regs(5),
-};
-
-static const struct dcn20_opp_shift opp_shift = {
-               OPP_MASK_SH_LIST_DCN20(__SHIFT)
-};
-
-static const struct dcn20_opp_mask opp_mask = {
-               OPP_MASK_SH_LIST_DCN20(_MASK)
-};
-
-#define aux_engine_regs(id)\
-[id] = {\
-       AUX_COMMON_REG_LIST0(id), \
-       .AUXN_IMPCAL = 0, \
-       .AUXP_IMPCAL = 0, \
-       .AUX_RESET_MASK = DP_AUX0_AUX_CONTROL__AUX_RESET_MASK, \
-}
-
-static const struct dce110_aux_registers aux_engine_regs[] = {
-               aux_engine_regs(0),
-               aux_engine_regs(1),
-               aux_engine_regs(2),
-               aux_engine_regs(3),
-               aux_engine_regs(4),
-               aux_engine_regs(5)
-};
-
-#define tf_regs(id)\
-[id] = {\
-       TF_REG_LIST_DCN20(id),\
-       TF_REG_LIST_DCN20_COMMON_APPEND(id),\
-}
-
-static const struct dcn2_dpp_registers tf_regs[] = {
-       tf_regs(0),
-       tf_regs(1),
-       tf_regs(2),
-       tf_regs(3),
-       tf_regs(4),
-       tf_regs(5),
-};
-
-static const struct dcn2_dpp_shift tf_shift = {
-               TF_REG_LIST_SH_MASK_DCN20(__SHIFT),
-               TF_DEBUG_REG_LIST_SH_DCN20
-};
-
-static const struct dcn2_dpp_mask tf_mask = {
-               TF_REG_LIST_SH_MASK_DCN20(_MASK),
-               TF_DEBUG_REG_LIST_MASK_DCN20
-};
-
-#define dwbc_regs_dcn2(id)\
-[id] = {\
-       DWBC_COMMON_REG_LIST_DCN2_0(id),\
-               }
-
-static const struct dcn20_dwbc_registers dwbc20_regs[] = {
-       dwbc_regs_dcn2(0),
-};
-
-static const struct dcn20_dwbc_shift dwbc20_shift = {
-       DWBC_COMMON_MASK_SH_LIST_DCN2_0(__SHIFT)
-};
-
-static const struct dcn20_dwbc_mask dwbc20_mask = {
-       DWBC_COMMON_MASK_SH_LIST_DCN2_0(_MASK)
-};
-
-#define mcif_wb_regs_dcn2(id)\
-[id] = {\
-       MCIF_WB_COMMON_REG_LIST_DCN2_0(id),\
-               }
-
-static const struct dcn20_mmhubbub_registers mcif_wb20_regs[] = {
-       mcif_wb_regs_dcn2(0),
-};
-
-static const struct dcn20_mmhubbub_shift mcif_wb20_shift = {
-       MCIF_WB_COMMON_MASK_SH_LIST_DCN2_0(__SHIFT)
-};
-
-static const struct dcn20_mmhubbub_mask mcif_wb20_mask = {
-       MCIF_WB_COMMON_MASK_SH_LIST_DCN2_0(_MASK)
-};
-
-static const struct dcn20_mpc_registers mpc_regs = {
-               MPC_REG_LIST_DCN2_0(0),
-               MPC_REG_LIST_DCN2_0(1),
-               MPC_REG_LIST_DCN2_0(2),
-               MPC_REG_LIST_DCN2_0(3),
-               MPC_REG_LIST_DCN2_0(4),
-               MPC_REG_LIST_DCN2_0(5),
-               MPC_OUT_MUX_REG_LIST_DCN2_0(0),
-               MPC_OUT_MUX_REG_LIST_DCN2_0(1),
-               MPC_OUT_MUX_REG_LIST_DCN2_0(2),
-               MPC_OUT_MUX_REG_LIST_DCN2_0(3),
-               MPC_OUT_MUX_REG_LIST_DCN2_0(4),
-               MPC_OUT_MUX_REG_LIST_DCN2_0(5),
-               MPC_DBG_REG_LIST_DCN2_0()
-};
-
-static const struct dcn20_mpc_shift mpc_shift = {
-       MPC_COMMON_MASK_SH_LIST_DCN2_0(__SHIFT),
-       MPC_DEBUG_REG_LIST_SH_DCN20
-};
-
-static const struct dcn20_mpc_mask mpc_mask = {
-       MPC_COMMON_MASK_SH_LIST_DCN2_0(_MASK),
-       MPC_DEBUG_REG_LIST_MASK_DCN20
-};
-
-#define tg_regs(id)\
-[id] = {TG_COMMON_REG_LIST_DCN2_0(id)}
-
-
-static const struct dcn_optc_registers tg_regs[] = {
-       tg_regs(0),
-       tg_regs(1),
-       tg_regs(2),
-       tg_regs(3),
-       tg_regs(4),
-       tg_regs(5)
-};
-
-static const struct dcn_optc_shift tg_shift = {
-       TG_COMMON_MASK_SH_LIST_DCN2_0(__SHIFT)
-};
-
-static const struct dcn_optc_mask tg_mask = {
-       TG_COMMON_MASK_SH_LIST_DCN2_0(_MASK)
-};
-
-#define hubp_regs(id)\
-[id] = {\
-       HUBP_REG_LIST_DCN20(id)\
-}
-
-static const struct dcn_hubp2_registers hubp_regs[] = {
-               hubp_regs(0),
-               hubp_regs(1),
-               hubp_regs(2),
-               hubp_regs(3),
-               hubp_regs(4),
-               hubp_regs(5)
-};
-
-static const struct dcn_hubp2_shift hubp_shift = {
-               HUBP_MASK_SH_LIST_DCN20(__SHIFT)
-};
-
-static const struct dcn_hubp2_mask hubp_mask = {
-               HUBP_MASK_SH_LIST_DCN20(_MASK)
-};
-
-static const struct dcn_hubbub_registers hubbub_reg = {
-               HUBBUB_REG_LIST_DCN20(0)
-};
-
-static const struct dcn_hubbub_shift hubbub_shift = {
-               HUBBUB_MASK_SH_LIST_DCN20(__SHIFT)
-};
-
-static const struct dcn_hubbub_mask hubbub_mask = {
-               HUBBUB_MASK_SH_LIST_DCN20(_MASK)
-};
-
-#define vmid_regs(id)\
-[id] = {\
-               DCN20_VMID_REG_LIST(id)\
-}
-
-static const struct dcn_vmid_registers vmid_regs[] = {
-       vmid_regs(0),
-       vmid_regs(1),
-       vmid_regs(2),
-       vmid_regs(3),
-       vmid_regs(4),
-       vmid_regs(5),
-       vmid_regs(6),
-       vmid_regs(7),
-       vmid_regs(8),
-       vmid_regs(9),
-       vmid_regs(10),
-       vmid_regs(11),
-       vmid_regs(12),
-       vmid_regs(13),
-       vmid_regs(14),
-       vmid_regs(15)
-};
-
-static const struct dcn20_vmid_shift vmid_shifts = {
-               DCN20_VMID_MASK_SH_LIST(__SHIFT)
-};
-
-static const struct dcn20_vmid_mask vmid_masks = {
-               DCN20_VMID_MASK_SH_LIST(_MASK)
-};
-
-static const struct dce110_aux_registers_shift aux_shift = {
-               DCN_AUX_MASK_SH_LIST(__SHIFT)
-};
-
-static const struct dce110_aux_registers_mask aux_mask = {
-               DCN_AUX_MASK_SH_LIST(_MASK)
-};
-
-static int map_transmitter_id_to_phy_instance(
-       enum transmitter transmitter)
-{
-       switch (transmitter) {
-       case TRANSMITTER_UNIPHY_A:
-               return 0;
-       break;
-       case TRANSMITTER_UNIPHY_B:
-               return 1;
-       break;
-       case TRANSMITTER_UNIPHY_C:
-               return 2;
-       break;
-       case TRANSMITTER_UNIPHY_D:
-               return 3;
-       break;
-       case TRANSMITTER_UNIPHY_E:
-               return 4;
-       break;
-       case TRANSMITTER_UNIPHY_F:
-               return 5;
-       break;
-       default:
-               ASSERT(0);
-               return 0;
-       }
-}
-
-#define dsc_regsDCN20(id)\
-[id] = {\
-       DSC_REG_LIST_DCN20(id)\
-}
-
-static const struct dcn20_dsc_registers dsc_regs[] = {
-       dsc_regsDCN20(0),
-       dsc_regsDCN20(1),
-       dsc_regsDCN20(2),
-       dsc_regsDCN20(3),
-       dsc_regsDCN20(4),
-       dsc_regsDCN20(5)
-};
-
-static const struct dcn20_dsc_shift dsc_shift = {
-       DSC_REG_LIST_SH_MASK_DCN20(__SHIFT)
-};
-
-static const struct dcn20_dsc_mask dsc_mask = {
-       DSC_REG_LIST_SH_MASK_DCN20(_MASK)
-};
-
-static const struct dccg_registers dccg_regs = {
-               DCCG_REG_LIST_DCN2()
-};
-
-static const struct dccg_shift dccg_shift = {
-               DCCG_MASK_SH_LIST_DCN2(__SHIFT)
-};
-
-static const struct dccg_mask dccg_mask = {
-               DCCG_MASK_SH_LIST_DCN2(_MASK)
-};
-
-static const struct resource_caps res_cap_nv10 = {
-               .num_timing_generator = 6,
-               .num_opp = 6,
-               .num_video_plane = 6,
-               .num_audio = 7,
-               .num_stream_encoder = 6,
-               .num_pll = 6,
-               .num_dwb = 1,
-               .num_ddc = 6,
-               .num_vmid = 16,
-               .num_dsc = 6,
-};
-
-static const struct dc_plane_cap plane_cap = {
-       .type = DC_PLANE_TYPE_DCN_UNIVERSAL,
-       .per_pixel_alpha = true,
-
-       .pixel_format_support = {
-                       .argb8888 = true,
-                       .nv12 = true,
-                       .fp16 = true,
-                       .p010 = true
-       },
-
-       .max_upscale_factor = {
-                       .argb8888 = 16000,
-                       .nv12 = 16000,
-                       .fp16 = 1
-       },
-
-       .max_downscale_factor = {
-                       .argb8888 = 250,
-                       .nv12 = 250,
-                       .fp16 = 1
-       },
-       16,
-       16
-};
-static const struct resource_caps res_cap_nv14 = {
-               .num_timing_generator = 5,
-               .num_opp = 5,
-               .num_video_plane = 5,
-               .num_audio = 6,
-               .num_stream_encoder = 5,
-               .num_pll = 5,
-               .num_dwb = 1,
-               .num_ddc = 5,
-               .num_vmid = 16,
-               .num_dsc = 5,
-};
-
-static const struct dc_debug_options debug_defaults_drv = {
-               .disable_dmcu = false,
-               .force_abm_enable = false,
-               .timing_trace = false,
-               .clock_trace = true,
-               .disable_pplib_clock_request = true,
-               .pipe_split_policy = MPC_SPLIT_AVOID_MULT_DISP,
-               .force_single_disp_pipe_split = false,
-               .disable_dcc = DCC_ENABLE,
-               .vsr_support = true,
-               .performance_trace = false,
-               .max_downscale_src_width = 5120,/*upto 5K*/
-               .disable_pplib_wm_range = false,
-               .scl_reset_length10 = true,
-               .sanity_checks = false,
-               .underflow_assert_delay_us = 0xFFFFFFFF,
-               .enable_legacy_fast_update = true,
-               .using_dml2 = false,
-};
-
-void dcn20_dpp_destroy(struct dpp **dpp)
-{
-       kfree(TO_DCN20_DPP(*dpp));
-       *dpp = NULL;
-}
-
-struct dpp *dcn20_dpp_create(
-       struct dc_context *ctx,
-       uint32_t inst)
-{
-       struct dcn20_dpp *dpp =
-               kzalloc(sizeof(struct dcn20_dpp), GFP_ATOMIC);
-
-       if (!dpp)
-               return NULL;
-
-       if (dpp2_construct(dpp, ctx, inst,
-                       &tf_regs[inst], &tf_shift, &tf_mask))
-               return &dpp->base;
-
-       BREAK_TO_DEBUGGER();
-       kfree(dpp);
-       return NULL;
-}
-
-struct input_pixel_processor *dcn20_ipp_create(
-       struct dc_context *ctx, uint32_t inst)
-{
-       struct dcn10_ipp *ipp =
-               kzalloc(sizeof(struct dcn10_ipp), GFP_ATOMIC);
-
-       if (!ipp) {
-               BREAK_TO_DEBUGGER();
-               return NULL;
-       }
-
-       dcn20_ipp_construct(ipp, ctx, inst,
-                       &ipp_regs[inst], &ipp_shift, &ipp_mask);
-       return &ipp->base;
-}
-
-
-struct output_pixel_processor *dcn20_opp_create(
-       struct dc_context *ctx, uint32_t inst)
-{
-       struct dcn20_opp *opp =
-               kzalloc(sizeof(struct dcn20_opp), GFP_ATOMIC);
-
-       if (!opp) {
-               BREAK_TO_DEBUGGER();
-               return NULL;
-       }
-
-       dcn20_opp_construct(opp, ctx, inst,
-                       &opp_regs[inst], &opp_shift, &opp_mask);
-       return &opp->base;
-}
-
-struct dce_aux *dcn20_aux_engine_create(
-       struct dc_context *ctx,
-       uint32_t inst)
-{
-       struct aux_engine_dce110 *aux_engine =
-               kzalloc(sizeof(struct aux_engine_dce110), GFP_ATOMIC);
-
-       if (!aux_engine)
-               return NULL;
-
-       dce110_aux_engine_construct(aux_engine, ctx, inst,
-                                   SW_AUX_TIMEOUT_PERIOD_MULTIPLIER * AUX_TIMEOUT_PERIOD,
-                                   &aux_engine_regs[inst],
-                                       &aux_mask,
-                                       &aux_shift,
-                                       ctx->dc->caps.extended_aux_timeout_support);
-
-       return &aux_engine->base;
-}
-#define i2c_inst_regs(id) { I2C_HW_ENGINE_COMMON_REG_LIST(id) }
-
-static const struct dce_i2c_registers i2c_hw_regs[] = {
-               i2c_inst_regs(1),
-               i2c_inst_regs(2),
-               i2c_inst_regs(3),
-               i2c_inst_regs(4),
-               i2c_inst_regs(5),
-               i2c_inst_regs(6),
-};
-
-static const struct dce_i2c_shift i2c_shifts = {
-               I2C_COMMON_MASK_SH_LIST_DCN2(__SHIFT)
-};
-
-static const struct dce_i2c_mask i2c_masks = {
-               I2C_COMMON_MASK_SH_LIST_DCN2(_MASK)
-};
-
-struct dce_i2c_hw *dcn20_i2c_hw_create(
-       struct dc_context *ctx,
-       uint32_t inst)
-{
-       struct dce_i2c_hw *dce_i2c_hw =
-               kzalloc(sizeof(struct dce_i2c_hw), GFP_ATOMIC);
-
-       if (!dce_i2c_hw)
-               return NULL;
-
-       dcn2_i2c_hw_construct(dce_i2c_hw, ctx, inst,
-                                   &i2c_hw_regs[inst], &i2c_shifts, &i2c_masks);
-
-       return dce_i2c_hw;
-}
-struct mpc *dcn20_mpc_create(struct dc_context *ctx)
-{
-       struct dcn20_mpc *mpc20 = kzalloc(sizeof(struct dcn20_mpc),
-                                         GFP_ATOMIC);
-
-       if (!mpc20)
-               return NULL;
-
-       dcn20_mpc_construct(mpc20, ctx,
-                       &mpc_regs,
-                       &mpc_shift,
-                       &mpc_mask,
-                       6);
-
-       return &mpc20->base;
-}
-
-struct hubbub *dcn20_hubbub_create(struct dc_context *ctx)
-{
-       int i;
-       struct dcn20_hubbub *hubbub = kzalloc(sizeof(struct dcn20_hubbub),
-                                         GFP_ATOMIC);
-
-       if (!hubbub)
-               return NULL;
-
-       hubbub2_construct(hubbub, ctx,
-                       &hubbub_reg,
-                       &hubbub_shift,
-                       &hubbub_mask);
-
-       for (i = 0; i < res_cap_nv10.num_vmid; i++) {
-               struct dcn20_vmid *vmid = &hubbub->vmid[i];
-
-               vmid->ctx = ctx;
-
-               vmid->regs = &vmid_regs[i];
-               vmid->shifts = &vmid_shifts;
-               vmid->masks = &vmid_masks;
-       }
-
-       return &hubbub->base;
-}
-
-struct timing_generator *dcn20_timing_generator_create(
-               struct dc_context *ctx,
-               uint32_t instance)
-{
-       struct optc *tgn10 =
-               kzalloc(sizeof(struct optc), GFP_ATOMIC);
-
-       if (!tgn10)
-               return NULL;
-
-       tgn10->base.inst = instance;
-       tgn10->base.ctx = ctx;
-
-       tgn10->tg_regs = &tg_regs[instance];
-       tgn10->tg_shift = &tg_shift;
-       tgn10->tg_mask = &tg_mask;
-
-       dcn20_timing_generator_init(tgn10);
-
-       return &tgn10->base;
-}
-
-static const struct encoder_feature_support link_enc_feature = {
-               .max_hdmi_deep_color = COLOR_DEPTH_121212,
-               .max_hdmi_pixel_clock = 600000,
-               .hdmi_ycbcr420_supported = true,
-               .dp_ycbcr420_supported = true,
-               .fec_supported = true,
-               .flags.bits.IS_HBR2_CAPABLE = true,
-               .flags.bits.IS_HBR3_CAPABLE = true,
-               .flags.bits.IS_TPS3_CAPABLE = true,
-               .flags.bits.IS_TPS4_CAPABLE = true
-};
-
-struct link_encoder *dcn20_link_encoder_create(
-       struct dc_context *ctx,
-       const struct encoder_init_data *enc_init_data)
-{
-       struct dcn20_link_encoder *enc20 =
-               kzalloc(sizeof(struct dcn20_link_encoder), GFP_KERNEL);
-       int link_regs_id;
-
-       if (!enc20)
-               return NULL;
-
-       link_regs_id =
-               map_transmitter_id_to_phy_instance(enc_init_data->transmitter);
-
-       dcn20_link_encoder_construct(enc20,
-                                     enc_init_data,
-                                     &link_enc_feature,
-                                     &link_enc_regs[link_regs_id],
-                                     &link_enc_aux_regs[enc_init_data->channel - 1],
-                                     &link_enc_hpd_regs[enc_init_data->hpd_source],
-                                     &le_shift,
-                                     &le_mask);
-
-       return &enc20->enc10.base;
-}
-
-static struct panel_cntl *dcn20_panel_cntl_create(const struct panel_cntl_init_data *init_data)
-{
-       struct dce_panel_cntl *panel_cntl =
-               kzalloc(sizeof(struct dce_panel_cntl), GFP_KERNEL);
-
-       if (!panel_cntl)
-               return NULL;
-
-       dce_panel_cntl_construct(panel_cntl,
-                       init_data,
-                       &panel_cntl_regs[init_data->inst],
-                       &panel_cntl_shift,
-                       &panel_cntl_mask);
-
-       return &panel_cntl->base;
-}
-
-static struct clock_source *dcn20_clock_source_create(
-       struct dc_context *ctx,
-       struct dc_bios *bios,
-       enum clock_source_id id,
-       const struct dce110_clk_src_regs *regs,
-       bool dp_clk_src)
-{
-       struct dce110_clk_src *clk_src =
-               kzalloc(sizeof(struct dce110_clk_src), GFP_ATOMIC);
-
-       if (!clk_src)
-               return NULL;
-
-       if (dcn20_clk_src_construct(clk_src, ctx, bios, id,
-                       regs, &cs_shift, &cs_mask)) {
-               clk_src->base.dp_clk_src = dp_clk_src;
-               return &clk_src->base;
-       }
-
-       kfree(clk_src);
-       BREAK_TO_DEBUGGER();
-       return NULL;
-}
-
-static void read_dce_straps(
-       struct dc_context *ctx,
-       struct resource_straps *straps)
-{
-       generic_reg_get(ctx, mmDC_PINSTRAPS + BASE(mmDC_PINSTRAPS_BASE_IDX),
-               FN(DC_PINSTRAPS, DC_PINSTRAPS_AUDIO), &straps->dc_pinstraps_audio);
-}
-
-static struct audio *dcn20_create_audio(
-               struct dc_context *ctx, unsigned int inst)
-{
-       return dce_audio_create(ctx, inst,
-                       &audio_regs[inst], &audio_shift, &audio_mask);
-}
-
-struct stream_encoder *dcn20_stream_encoder_create(
-       enum engine_id eng_id,
-       struct dc_context *ctx)
-{
-       struct dcn10_stream_encoder *enc1 =
-               kzalloc(sizeof(struct dcn10_stream_encoder), GFP_KERNEL);
-
-       if (!enc1)
-               return NULL;
-
-       if (ASICREV_IS_NAVI14_M(ctx->asic_id.hw_internal_rev)) {
-               if (eng_id >= ENGINE_ID_DIGD)
-                       eng_id++;
-       }
-
-       dcn20_stream_encoder_construct(enc1, ctx, ctx->dc_bios, eng_id,
-                                       &stream_enc_regs[eng_id],
-                                       &se_shift, &se_mask);
-
-       return &enc1->base;
-}
-
-static const struct dce_hwseq_registers hwseq_reg = {
-               HWSEQ_DCN2_REG_LIST()
-};
-
-static const struct dce_hwseq_shift hwseq_shift = {
-               HWSEQ_DCN2_MASK_SH_LIST(__SHIFT)
-};
-
-static const struct dce_hwseq_mask hwseq_mask = {
-               HWSEQ_DCN2_MASK_SH_LIST(_MASK)
-};
-
-struct dce_hwseq *dcn20_hwseq_create(
-       struct dc_context *ctx)
-{
-       struct dce_hwseq *hws = kzalloc(sizeof(struct dce_hwseq), GFP_KERNEL);
-
-       if (hws) {
-               hws->ctx = ctx;
-               hws->regs = &hwseq_reg;
-               hws->shifts = &hwseq_shift;
-               hws->masks = &hwseq_mask;
-       }
-       return hws;
-}
-
-static const struct resource_create_funcs res_create_funcs = {
-       .read_dce_straps = read_dce_straps,
-       .create_audio = dcn20_create_audio,
-       .create_stream_encoder = dcn20_stream_encoder_create,
-       .create_hwseq = dcn20_hwseq_create,
-};
-
-static void dcn20_pp_smu_destroy(struct pp_smu_funcs **pp_smu);
-
-void dcn20_clock_source_destroy(struct clock_source **clk_src)
-{
-       kfree(TO_DCE110_CLK_SRC(*clk_src));
-       *clk_src = NULL;
-}
-
-
-struct display_stream_compressor *dcn20_dsc_create(
-       struct dc_context *ctx, uint32_t inst)
-{
-       struct dcn20_dsc *dsc =
-               kzalloc(sizeof(struct dcn20_dsc), GFP_ATOMIC);
-
-       if (!dsc) {
-               BREAK_TO_DEBUGGER();
-               return NULL;
-       }
-
-       dsc2_construct(dsc, ctx, inst, &dsc_regs[inst], &dsc_shift, &dsc_mask);
-       return &dsc->base;
-}
-
-void dcn20_dsc_destroy(struct display_stream_compressor **dsc)
-{
-       kfree(container_of(*dsc, struct dcn20_dsc, base));
-       *dsc = NULL;
-}
-
-
-static void dcn20_resource_destruct(struct dcn20_resource_pool *pool)
-{
-       unsigned int i;
-
-       for (i = 0; i < pool->base.stream_enc_count; i++) {
-               if (pool->base.stream_enc[i] != NULL) {
-                       kfree(DCN10STRENC_FROM_STRENC(pool->base.stream_enc[i]));
-                       pool->base.stream_enc[i] = NULL;
-               }
-       }
-
-       for (i = 0; i < pool->base.res_cap->num_dsc; i++) {
-               if (pool->base.dscs[i] != NULL)
-                       dcn20_dsc_destroy(&pool->base.dscs[i]);
-       }
-
-       if (pool->base.mpc != NULL) {
-               kfree(TO_DCN20_MPC(pool->base.mpc));
-               pool->base.mpc = NULL;
-       }
-       if (pool->base.hubbub != NULL) {
-               kfree(pool->base.hubbub);
-               pool->base.hubbub = NULL;
-       }
-       for (i = 0; i < pool->base.pipe_count; i++) {
-               if (pool->base.dpps[i] != NULL)
-                       dcn20_dpp_destroy(&pool->base.dpps[i]);
-
-               if (pool->base.ipps[i] != NULL)
-                       pool->base.ipps[i]->funcs->ipp_destroy(&pool->base.ipps[i]);
-
-               if (pool->base.hubps[i] != NULL) {
-                       kfree(TO_DCN20_HUBP(pool->base.hubps[i]));
-                       pool->base.hubps[i] = NULL;
-               }
-
-               if (pool->base.irqs != NULL) {
-                       dal_irq_service_destroy(&pool->base.irqs);
-               }
-       }
-
-       for (i = 0; i < pool->base.res_cap->num_ddc; i++) {
-               if (pool->base.engines[i] != NULL)
-                       dce110_engine_destroy(&pool->base.engines[i]);
-               if (pool->base.hw_i2cs[i] != NULL) {
-                       kfree(pool->base.hw_i2cs[i]);
-                       pool->base.hw_i2cs[i] = NULL;
-               }
-               if (pool->base.sw_i2cs[i] != NULL) {
-                       kfree(pool->base.sw_i2cs[i]);
-                       pool->base.sw_i2cs[i] = NULL;
-               }
-       }
-
-       for (i = 0; i < pool->base.res_cap->num_opp; i++) {
-               if (pool->base.opps[i] != NULL)
-                       pool->base.opps[i]->funcs->opp_destroy(&pool->base.opps[i]);
-       }
-
-       for (i = 0; i < pool->base.res_cap->num_timing_generator; i++) {
-               if (pool->base.timing_generators[i] != NULL)    {
-                       kfree(DCN10TG_FROM_TG(pool->base.timing_generators[i]));
-                       pool->base.timing_generators[i] = NULL;
-               }
-       }
-
-       for (i = 0; i < pool->base.res_cap->num_dwb; i++) {
-               if (pool->base.dwbc[i] != NULL) {
-                       kfree(TO_DCN20_DWBC(pool->base.dwbc[i]));
-                       pool->base.dwbc[i] = NULL;
-               }
-               if (pool->base.mcif_wb[i] != NULL) {
-                       kfree(TO_DCN20_MMHUBBUB(pool->base.mcif_wb[i]));
-                       pool->base.mcif_wb[i] = NULL;
-               }
-       }
-
-       for (i = 0; i < pool->base.audio_count; i++) {
-               if (pool->base.audios[i])
-                       dce_aud_destroy(&pool->base.audios[i]);
-       }
-
-       for (i = 0; i < pool->base.clk_src_count; i++) {
-               if (pool->base.clock_sources[i] != NULL) {
-                       dcn20_clock_source_destroy(&pool->base.clock_sources[i]);
-                       pool->base.clock_sources[i] = NULL;
-               }
-       }
-
-       if (pool->base.dp_clock_source != NULL) {
-               dcn20_clock_source_destroy(&pool->base.dp_clock_source);
-               pool->base.dp_clock_source = NULL;
-       }
-
-
-       if (pool->base.abm != NULL)
-               dce_abm_destroy(&pool->base.abm);
-
-       if (pool->base.dmcu != NULL)
-               dce_dmcu_destroy(&pool->base.dmcu);
-
-       if (pool->base.dccg != NULL)
-               dcn_dccg_destroy(&pool->base.dccg);
-
-       if (pool->base.pp_smu != NULL)
-               dcn20_pp_smu_destroy(&pool->base.pp_smu);
-
-       if (pool->base.oem_device != NULL) {
-               struct dc *dc = pool->base.oem_device->ctx->dc;
-
-               dc->link_srv->destroy_ddc_service(&pool->base.oem_device);
-       }
-}
-
-struct hubp *dcn20_hubp_create(
-       struct dc_context *ctx,
-       uint32_t inst)
-{
-       struct dcn20_hubp *hubp2 =
-               kzalloc(sizeof(struct dcn20_hubp), GFP_ATOMIC);
-
-       if (!hubp2)
-               return NULL;
-
-       if (hubp2_construct(hubp2, ctx, inst,
-                       &hubp_regs[inst], &hubp_shift, &hubp_mask))
-               return &hubp2->base;
-
-       BREAK_TO_DEBUGGER();
-       kfree(hubp2);
-       return NULL;
-}
-
-static void get_pixel_clock_parameters(
-       struct pipe_ctx *pipe_ctx,
-       struct pixel_clk_params *pixel_clk_params)
-{
-       const struct dc_stream_state *stream = pipe_ctx->stream;
-       struct pipe_ctx *odm_pipe;
-       int opp_cnt = 1;
-       struct dc_link *link = stream->link;
-       struct link_encoder *link_enc = NULL;
-       struct dc *dc = pipe_ctx->stream->ctx->dc;
-       struct dce_hwseq *hws = dc->hwseq;
-
-       for (odm_pipe = pipe_ctx->next_odm_pipe; odm_pipe; odm_pipe = odm_pipe->next_odm_pipe)
-               opp_cnt++;
-
-       pixel_clk_params->requested_pix_clk_100hz = stream->timing.pix_clk_100hz;
-
-       link_enc = link_enc_cfg_get_link_enc(link);
-       if (link_enc)
-               pixel_clk_params->encoder_object_id = link_enc->id;
-
-       pixel_clk_params->signal_type = pipe_ctx->stream->signal;
-       pixel_clk_params->controller_id = pipe_ctx->stream_res.tg->inst + 1;
-       /* TODO: un-hardcode*/
-       /* TODO - DP2.0 HW: calculate requested_sym_clk for UHBR rates */
-       pixel_clk_params->requested_sym_clk = LINK_RATE_LOW *
-               LINK_RATE_REF_FREQ_IN_KHZ;
-       pixel_clk_params->flags.ENABLE_SS = 0;
-       pixel_clk_params->color_depth =
-               stream->timing.display_color_depth;
-       pixel_clk_params->flags.DISPLAY_BLANKED = 1;
-       pixel_clk_params->pixel_encoding = stream->timing.pixel_encoding;
-
-       if (stream->timing.pixel_encoding == PIXEL_ENCODING_YCBCR422)
-               pixel_clk_params->color_depth = COLOR_DEPTH_888;
-
-       if (opp_cnt == 4)
-               pixel_clk_params->requested_pix_clk_100hz /= 4;
-       else if (optc2_is_two_pixels_per_containter(&stream->timing) || opp_cnt == 2)
-               pixel_clk_params->requested_pix_clk_100hz /= 2;
-       else if (hws->funcs.is_dp_dig_pixel_rate_div_policy) {
-               if (hws->funcs.is_dp_dig_pixel_rate_div_policy(pipe_ctx))
-                       pixel_clk_params->requested_pix_clk_100hz /= 2;
-       }
-
-       if (stream->timing.timing_3d_format == TIMING_3D_FORMAT_HW_FRAME_PACKING)
-               pixel_clk_params->requested_pix_clk_100hz *= 2;
-
-}
-
-static void build_clamping_params(struct dc_stream_state *stream)
-{
-       stream->clamping.clamping_level = CLAMPING_FULL_RANGE;
-       stream->clamping.c_depth = stream->timing.display_color_depth;
-       stream->clamping.pixel_encoding = stream->timing.pixel_encoding;
-}
-
-static enum dc_status build_pipe_hw_param(struct pipe_ctx *pipe_ctx)
-{
-
-       get_pixel_clock_parameters(pipe_ctx, &pipe_ctx->stream_res.pix_clk_params);
-
-       pipe_ctx->clock_source->funcs->get_pix_clk_dividers(
-               pipe_ctx->clock_source,
-               &pipe_ctx->stream_res.pix_clk_params,
-               &pipe_ctx->pll_settings);
-
-       pipe_ctx->stream->clamping.pixel_encoding = pipe_ctx->stream->timing.pixel_encoding;
-
-       resource_build_bit_depth_reduction_params(pipe_ctx->stream,
-                                       &pipe_ctx->stream->bit_depth_params);
-       build_clamping_params(pipe_ctx->stream);
-
-       return DC_OK;
-}
-
-enum dc_status dcn20_build_mapped_resource(const struct dc *dc, struct dc_state *context, struct dc_stream_state *stream)
-{
-       enum dc_status status = DC_OK;
-       struct pipe_ctx *pipe_ctx = resource_get_otg_master_for_stream(&context->res_ctx, stream);
-
-       if (!pipe_ctx)
-               return DC_ERROR_UNEXPECTED;
-
-
-       status = build_pipe_hw_param(pipe_ctx);
-
-       return status;
-}
-
-
-void dcn20_acquire_dsc(const struct dc *dc,
-                       struct resource_context *res_ctx,
-                       struct display_stream_compressor **dsc,
-                       int pipe_idx)
-{
-       int i;
-       const struct resource_pool *pool = dc->res_pool;
-       struct display_stream_compressor *dsc_old = dc->current_state->res_ctx.pipe_ctx[pipe_idx].stream_res.dsc;
-
-       ASSERT(*dsc == NULL); /* If this ASSERT fails, dsc was not released properly */
-       *dsc = NULL;
-
-       /* Always do 1-to-1 mapping when number of DSCs is same as number of pipes */
-       if (pool->res_cap->num_dsc == pool->res_cap->num_opp) {
-               *dsc = pool->dscs[pipe_idx];
-               res_ctx->is_dsc_acquired[pipe_idx] = true;
-               return;
-       }
-
-       /* Return old DSC to avoid the need for re-programming */
-       if (dsc_old && !res_ctx->is_dsc_acquired[dsc_old->inst]) {
-               *dsc = dsc_old;
-               res_ctx->is_dsc_acquired[dsc_old->inst] = true;
-               return ;
-       }
-
-       /* Find first free DSC */
-       for (i = 0; i < pool->res_cap->num_dsc; i++)
-               if (!res_ctx->is_dsc_acquired[i]) {
-                       *dsc = pool->dscs[i];
-                       res_ctx->is_dsc_acquired[i] = true;
-                       break;
-               }
-}
-
-void dcn20_release_dsc(struct resource_context *res_ctx,
-                       const struct resource_pool *pool,
-                       struct display_stream_compressor **dsc)
-{
-       int i;
-
-       for (i = 0; i < pool->res_cap->num_dsc; i++)
-               if (pool->dscs[i] == *dsc) {
-                       res_ctx->is_dsc_acquired[i] = false;
-                       *dsc = NULL;
-                       break;
-               }
-}
-
-
-
-enum dc_status dcn20_add_dsc_to_stream_resource(struct dc *dc,
-               struct dc_state *dc_ctx,
-               struct dc_stream_state *dc_stream)
-{
-       enum dc_status result = DC_OK;
-       int i;
-
-       /* Get a DSC if required and available */
-       for (i = 0; i < dc->res_pool->pipe_count; i++) {
-               struct pipe_ctx *pipe_ctx = &dc_ctx->res_ctx.pipe_ctx[i];
-
-               if (pipe_ctx->top_pipe)
-                       continue;
-
-               if (pipe_ctx->stream != dc_stream)
-                       continue;
-
-               if (pipe_ctx->stream_res.dsc)
-                       continue;
-
-               dcn20_acquire_dsc(dc, &dc_ctx->res_ctx, &pipe_ctx->stream_res.dsc, i);
-
-               /* The number of DSCs can be less than the number of pipes */
-               if (!pipe_ctx->stream_res.dsc) {
-                       result = DC_NO_DSC_RESOURCE;
-               }
-
-               break;
-       }
-
-       return result;
-}
-
-
-static enum dc_status remove_dsc_from_stream_resource(struct dc *dc,
-               struct dc_state *new_ctx,
-               struct dc_stream_state *dc_stream)
-{
-       struct pipe_ctx *pipe_ctx = NULL;
-       int i;
-
-       for (i = 0; i < MAX_PIPES; i++) {
-               if (new_ctx->res_ctx.pipe_ctx[i].stream == dc_stream && !new_ctx->res_ctx.pipe_ctx[i].top_pipe) {
-                       pipe_ctx = &new_ctx->res_ctx.pipe_ctx[i];
-
-                       if (pipe_ctx->stream_res.dsc)
-                               dcn20_release_dsc(&new_ctx->res_ctx, dc->res_pool, &pipe_ctx->stream_res.dsc);
-               }
-       }
-
-       if (!pipe_ctx)
-               return DC_ERROR_UNEXPECTED;
-       else
-               return DC_OK;
-}
-
-
-enum dc_status dcn20_add_stream_to_ctx(struct dc *dc, struct dc_state *new_ctx, struct dc_stream_state *dc_stream)
-{
-       enum dc_status result = DC_ERROR_UNEXPECTED;
-
-       result = resource_map_pool_resources(dc, new_ctx, dc_stream);
-
-       if (result == DC_OK)
-               result = resource_map_phy_clock_resources(dc, new_ctx, dc_stream);
-
-       /* Get a DSC if required and available */
-       if (result == DC_OK && dc_stream->timing.flags.DSC)
-               result = dcn20_add_dsc_to_stream_resource(dc, new_ctx, dc_stream);
-
-       if (result == DC_OK)
-               result = dcn20_build_mapped_resource(dc, new_ctx, dc_stream);
-
-       return result;
-}
-
-
-enum dc_status dcn20_remove_stream_from_ctx(struct dc *dc, struct dc_state *new_ctx, struct dc_stream_state *dc_stream)
-{
-       enum dc_status result = DC_OK;
-
-       result = remove_dsc_from_stream_resource(dc, new_ctx, dc_stream);
-
-       return result;
-}
-
-/**
- * dcn20_split_stream_for_odm - Check if stream can be splited for ODM
- *
- * @dc: DC object with resource pool info required for pipe split
- * @res_ctx: Persistent state of resources
- * @prev_odm_pipe: Reference to the previous ODM pipe
- * @next_odm_pipe: Reference to the next ODM pipe
- *
- * This function takes a logically active pipe and a logically free pipe and
- * halves all the scaling parameters that need to be halved while populating
- * the free pipe with the required resources and configuring the next/previous
- * ODM pipe pointers.
- *
- * Return:
- * Return true if split stream for ODM is possible, otherwise, return false.
- */
-bool dcn20_split_stream_for_odm(
-               const struct dc *dc,
-               struct resource_context *res_ctx,
-               struct pipe_ctx *prev_odm_pipe,
-               struct pipe_ctx *next_odm_pipe)
-{
-       int pipe_idx = next_odm_pipe->pipe_idx;
-       const struct resource_pool *pool = dc->res_pool;
-
-       *next_odm_pipe = *prev_odm_pipe;
-
-       next_odm_pipe->pipe_idx = pipe_idx;
-       next_odm_pipe->plane_res.mi = pool->mis[next_odm_pipe->pipe_idx];
-       next_odm_pipe->plane_res.hubp = pool->hubps[next_odm_pipe->pipe_idx];
-       next_odm_pipe->plane_res.ipp = pool->ipps[next_odm_pipe->pipe_idx];
-       next_odm_pipe->plane_res.xfm = pool->transforms[next_odm_pipe->pipe_idx];
-       next_odm_pipe->plane_res.dpp = pool->dpps[next_odm_pipe->pipe_idx];
-       next_odm_pipe->plane_res.mpcc_inst = pool->dpps[next_odm_pipe->pipe_idx]->inst;
-       next_odm_pipe->stream_res.dsc = NULL;
-       if (prev_odm_pipe->next_odm_pipe && prev_odm_pipe->next_odm_pipe != next_odm_pipe) {
-               next_odm_pipe->next_odm_pipe = prev_odm_pipe->next_odm_pipe;
-               next_odm_pipe->next_odm_pipe->prev_odm_pipe = next_odm_pipe;
-       }
-       if (prev_odm_pipe->top_pipe && prev_odm_pipe->top_pipe->next_odm_pipe) {
-               prev_odm_pipe->top_pipe->next_odm_pipe->bottom_pipe = next_odm_pipe;
-               next_odm_pipe->top_pipe = prev_odm_pipe->top_pipe->next_odm_pipe;
-       }
-       if (prev_odm_pipe->bottom_pipe && prev_odm_pipe->bottom_pipe->next_odm_pipe) {
-               prev_odm_pipe->bottom_pipe->next_odm_pipe->top_pipe = next_odm_pipe;
-               next_odm_pipe->bottom_pipe = prev_odm_pipe->bottom_pipe->next_odm_pipe;
-       }
-       prev_odm_pipe->next_odm_pipe = next_odm_pipe;
-       next_odm_pipe->prev_odm_pipe = prev_odm_pipe;
-
-       if (prev_odm_pipe->plane_state) {
-               struct scaler_data *sd = &prev_odm_pipe->plane_res.scl_data;
-               int new_width;
-
-               /* HACTIVE halved for odm combine */
-               sd->h_active /= 2;
-               /* Calculate new vp and recout for left pipe */
-               /* Need at least 16 pixels width per side */
-               if (sd->recout.x + 16 >= sd->h_active)
-                       return false;
-               new_width = sd->h_active - sd->recout.x;
-               sd->viewport.width -= dc_fixpt_floor(dc_fixpt_mul_int(
-                               sd->ratios.horz, sd->recout.width - new_width));
-               sd->viewport_c.width -= dc_fixpt_floor(dc_fixpt_mul_int(
-                               sd->ratios.horz_c, sd->recout.width - new_width));
-               sd->recout.width = new_width;
-
-               /* Calculate new vp and recout for right pipe */
-               sd = &next_odm_pipe->plane_res.scl_data;
-               /* HACTIVE halved for odm combine */
-               sd->h_active /= 2;
-               /* Need at least 16 pixels width per side */
-               if (new_width <= 16)
-                       return false;
-               new_width = sd->recout.width + sd->recout.x - sd->h_active;
-               sd->viewport.width -= dc_fixpt_floor(dc_fixpt_mul_int(
-                               sd->ratios.horz, sd->recout.width - new_width));
-               sd->viewport_c.width -= dc_fixpt_floor(dc_fixpt_mul_int(
-                               sd->ratios.horz_c, sd->recout.width - new_width));
-               sd->recout.width = new_width;
-               sd->viewport.x += dc_fixpt_floor(dc_fixpt_mul_int(
-                               sd->ratios.horz, sd->h_active - sd->recout.x));
-               sd->viewport_c.x += dc_fixpt_floor(dc_fixpt_mul_int(
-                               sd->ratios.horz_c, sd->h_active - sd->recout.x));
-               sd->recout.x = 0;
-       }
-       if (!next_odm_pipe->top_pipe)
-               next_odm_pipe->stream_res.opp = pool->opps[next_odm_pipe->pipe_idx];
-       else
-               next_odm_pipe->stream_res.opp = next_odm_pipe->top_pipe->stream_res.opp;
-       if (next_odm_pipe->stream->timing.flags.DSC == 1 && !next_odm_pipe->top_pipe) {
-               dcn20_acquire_dsc(dc, res_ctx, &next_odm_pipe->stream_res.dsc, next_odm_pipe->pipe_idx);
-               ASSERT(next_odm_pipe->stream_res.dsc);
-               if (next_odm_pipe->stream_res.dsc == NULL)
-                       return false;
-       }
-
-       return true;
-}
-
-void dcn20_split_stream_for_mpc(
-               struct resource_context *res_ctx,
-               const struct resource_pool *pool,
-               struct pipe_ctx *primary_pipe,
-               struct pipe_ctx *secondary_pipe)
-{
-       int pipe_idx = secondary_pipe->pipe_idx;
-       struct pipe_ctx *sec_bot_pipe = secondary_pipe->bottom_pipe;
-
-       *secondary_pipe = *primary_pipe;
-       secondary_pipe->bottom_pipe = sec_bot_pipe;
-
-       secondary_pipe->pipe_idx = pipe_idx;
-       secondary_pipe->plane_res.mi = pool->mis[secondary_pipe->pipe_idx];
-       secondary_pipe->plane_res.hubp = pool->hubps[secondary_pipe->pipe_idx];
-       secondary_pipe->plane_res.ipp = pool->ipps[secondary_pipe->pipe_idx];
-       secondary_pipe->plane_res.xfm = pool->transforms[secondary_pipe->pipe_idx];
-       secondary_pipe->plane_res.dpp = pool->dpps[secondary_pipe->pipe_idx];
-       secondary_pipe->plane_res.mpcc_inst = pool->dpps[secondary_pipe->pipe_idx]->inst;
-       secondary_pipe->stream_res.dsc = NULL;
-       if (primary_pipe->bottom_pipe && primary_pipe->bottom_pipe != secondary_pipe) {
-               ASSERT(!secondary_pipe->bottom_pipe);
-               secondary_pipe->bottom_pipe = primary_pipe->bottom_pipe;
-               secondary_pipe->bottom_pipe->top_pipe = secondary_pipe;
-       }
-       primary_pipe->bottom_pipe = secondary_pipe;
-       secondary_pipe->top_pipe = primary_pipe;
-
-       ASSERT(primary_pipe->plane_state);
-}
-
-unsigned int dcn20_calc_max_scaled_time(
-               unsigned int time_per_pixel,
-               enum mmhubbub_wbif_mode mode,
-               unsigned int urgent_watermark)
-{
-       unsigned int time_per_byte = 0;
-       unsigned int total_y_free_entry = 0x200; /* two memory piece for luma */
-       unsigned int total_c_free_entry = 0x140; /* two memory piece for chroma */
-       unsigned int small_free_entry, max_free_entry;
-       unsigned int buf_lh_capability;
-       unsigned int max_scaled_time;
-
-       if (mode == PACKED_444) /* packed mode */
-               time_per_byte = time_per_pixel/4;
-       else if (mode == PLANAR_420_8BPC)
-               time_per_byte  = time_per_pixel;
-       else if (mode == PLANAR_420_10BPC) /* p010 */
-               time_per_byte  = time_per_pixel * 819/1024;
-
-       if (time_per_byte == 0)
-               time_per_byte = 1;
-
-       small_free_entry  = (total_y_free_entry > total_c_free_entry) ? total_c_free_entry : total_y_free_entry;
-       max_free_entry    = (mode == PACKED_444) ? total_y_free_entry + total_c_free_entry : small_free_entry;
-       buf_lh_capability = max_free_entry*time_per_byte*32/16; /* there is 4bit fraction */
-       max_scaled_time   = buf_lh_capability - urgent_watermark;
-       return max_scaled_time;
-}
-
-void dcn20_set_mcif_arb_params(
-               struct dc *dc,
-               struct dc_state *context,
-               display_e2e_pipe_params_st *pipes,
-               int pipe_cnt)
-{
-       enum mmhubbub_wbif_mode wbif_mode;
-       struct mcif_arb_params *wb_arb_params;
-       int i, j, dwb_pipe;
-
-       /* Writeback MCIF_WB arbitration parameters */
-       dwb_pipe = 0;
-       for (i = 0; i < dc->res_pool->pipe_count; i++) {
-
-               if (!context->res_ctx.pipe_ctx[i].stream)
-                       continue;
-
-               for (j = 0; j < MAX_DWB_PIPES; j++) {
-                       if (context->res_ctx.pipe_ctx[i].stream->writeback_info[j].wb_enabled == false)
-                               continue;
-
-                       //wb_arb_params = &context->res_ctx.pipe_ctx[i].stream->writeback_info[j].mcif_arb_params;
-                       wb_arb_params = &context->bw_ctx.bw.dcn.bw_writeback.mcif_wb_arb[dwb_pipe];
-
-                       if (context->res_ctx.pipe_ctx[i].stream->writeback_info[j].dwb_params.out_format == dwb_scaler_mode_yuv420) {
-                               if (context->res_ctx.pipe_ctx[i].stream->writeback_info[j].dwb_params.output_depth == DWB_OUTPUT_PIXEL_DEPTH_8BPC)
-                                       wbif_mode = PLANAR_420_8BPC;
-                               else
-                                       wbif_mode = PLANAR_420_10BPC;
-                       } else
-                               wbif_mode = PACKED_444;
-
-                       DC_FP_START();
-                       dcn20_fpu_set_wb_arb_params(wb_arb_params, context, pipes, pipe_cnt, i);
-                       DC_FP_END();
-
-                       wb_arb_params->slice_lines = 32;
-                       wb_arb_params->arbitration_slice = 2;
-                       wb_arb_params->max_scaled_time = dcn20_calc_max_scaled_time(wb_arb_params->time_per_pixel,
-                               wbif_mode,
-                               wb_arb_params->cli_watermark[0]); /* assume 4 watermark sets have the same value */
-
-                       dwb_pipe++;
-
-                       if (dwb_pipe >= MAX_DWB_PIPES)
-                               return;
-               }
-               if (dwb_pipe >= MAX_DWB_PIPES)
-                       return;
-       }
-}
-
-bool dcn20_validate_dsc(struct dc *dc, struct dc_state *new_ctx)
-{
-       int i;
-
-       /* Validate DSC config, dsc count validation is already done */
-       for (i = 0; i < dc->res_pool->pipe_count; i++) {
-               struct pipe_ctx *pipe_ctx = &new_ctx->res_ctx.pipe_ctx[i];
-               struct dc_stream_state *stream = pipe_ctx->stream;
-               struct dsc_config dsc_cfg;
-               struct pipe_ctx *odm_pipe;
-               int opp_cnt = 1;
-
-               for (odm_pipe = pipe_ctx->next_odm_pipe; odm_pipe; odm_pipe = odm_pipe->next_odm_pipe)
-                       opp_cnt++;
-
-               /* Only need to validate top pipe */
-               if (pipe_ctx->top_pipe || pipe_ctx->prev_odm_pipe || !stream || !stream->timing.flags.DSC)
-                       continue;
-
-               dsc_cfg.pic_width = (stream->timing.h_addressable + stream->timing.h_border_left
-                               + stream->timing.h_border_right) / opp_cnt;
-               dsc_cfg.pic_height = stream->timing.v_addressable + stream->timing.v_border_top
-                               + stream->timing.v_border_bottom;
-               dsc_cfg.pixel_encoding = stream->timing.pixel_encoding;
-               dsc_cfg.color_depth = stream->timing.display_color_depth;
-               dsc_cfg.is_odm = pipe_ctx->next_odm_pipe ? true : false;
-               dsc_cfg.dc_dsc_cfg = stream->timing.dsc_cfg;
-               dsc_cfg.dc_dsc_cfg.num_slices_h /= opp_cnt;
-
-               if (!pipe_ctx->stream_res.dsc->funcs->dsc_validate_stream(pipe_ctx->stream_res.dsc, &dsc_cfg))
-                       return false;
-       }
-       return true;
-}
-
-struct pipe_ctx *dcn20_find_secondary_pipe(struct dc *dc,
-               struct resource_context *res_ctx,
-               const struct resource_pool *pool,
-               const struct pipe_ctx *primary_pipe)
-{
-       struct pipe_ctx *secondary_pipe = NULL;
-
-       if (dc && primary_pipe) {
-               int j;
-               int preferred_pipe_idx = 0;
-
-               /* first check the prev dc state:
-                * if this primary pipe has a bottom pipe in prev. state
-                * and if the bottom pipe is still available (which it should be),
-                * pick that pipe as secondary
-                * Same logic applies for ODM pipes
-                */
-               if (dc->current_state->res_ctx.pipe_ctx[primary_pipe->pipe_idx].next_odm_pipe) {
-                       preferred_pipe_idx = dc->current_state->res_ctx.pipe_ctx[primary_pipe->pipe_idx].next_odm_pipe->pipe_idx;
-                       if (res_ctx->pipe_ctx[preferred_pipe_idx].stream == NULL) {
-                               secondary_pipe = &res_ctx->pipe_ctx[preferred_pipe_idx];
-                               secondary_pipe->pipe_idx = preferred_pipe_idx;
-                       }
-               }
-               if (secondary_pipe == NULL &&
-                               dc->current_state->res_ctx.pipe_ctx[primary_pipe->pipe_idx].bottom_pipe) {
-                       preferred_pipe_idx = dc->current_state->res_ctx.pipe_ctx[primary_pipe->pipe_idx].bottom_pipe->pipe_idx;
-                       if (res_ctx->pipe_ctx[preferred_pipe_idx].stream == NULL) {
-                               secondary_pipe = &res_ctx->pipe_ctx[preferred_pipe_idx];
-                               secondary_pipe->pipe_idx = preferred_pipe_idx;
-                       }
-               }
-
-               /*
-                * if this primary pipe does not have a bottom pipe in prev. state
-                * start backward and find a pipe that did not used to be a bottom pipe in
-                * prev. dc state. This way we make sure we keep the same assignment as
-                * last state and will not have to reprogram every pipe
-                */
-               if (secondary_pipe == NULL) {
-                       for (j = dc->res_pool->pipe_count - 1; j >= 0; j--) {
-                               if (dc->current_state->res_ctx.pipe_ctx[j].top_pipe == NULL
-                                               && dc->current_state->res_ctx.pipe_ctx[j].prev_odm_pipe == NULL) {
-                                       preferred_pipe_idx = j;
-
-                                       if (res_ctx->pipe_ctx[preferred_pipe_idx].stream == NULL) {
-                                               secondary_pipe = &res_ctx->pipe_ctx[preferred_pipe_idx];
-                                               secondary_pipe->pipe_idx = preferred_pipe_idx;
-                                               break;
-                                       }
-                               }
-                       }
-               }
-               /*
-                * We should never hit this assert unless assignments are shuffled around
-                * if this happens we will prob. hit a vsync tdr
-                */
-               ASSERT(secondary_pipe);
-               /*
-                * search backwards for the second pipe to keep pipe
-                * assignment more consistent
-                */
-               if (secondary_pipe == NULL) {
-                       for (j = dc->res_pool->pipe_count - 1; j >= 0; j--) {
-                               preferred_pipe_idx = j;
-
-                               if (res_ctx->pipe_ctx[preferred_pipe_idx].stream == NULL) {
-                                       secondary_pipe = &res_ctx->pipe_ctx[preferred_pipe_idx];
-                                       secondary_pipe->pipe_idx = preferred_pipe_idx;
-                                       break;
-                               }
-                       }
-               }
-       }
-
-       return secondary_pipe;
-}
-
-void dcn20_merge_pipes_for_validate(
-               struct dc *dc,
-               struct dc_state *context)
-{
-       int i;
-
-       /* merge previously split odm pipes since mode support needs to make the decision */
-       for (i = 0; i < dc->res_pool->pipe_count; i++) {
-               struct pipe_ctx *pipe = &context->res_ctx.pipe_ctx[i];
-               struct pipe_ctx *odm_pipe = pipe->next_odm_pipe;
-
-               if (pipe->prev_odm_pipe)
-                       continue;
-
-               pipe->next_odm_pipe = NULL;
-               while (odm_pipe) {
-                       struct pipe_ctx *next_odm_pipe = odm_pipe->next_odm_pipe;
-
-                       odm_pipe->plane_state = NULL;
-                       odm_pipe->stream = NULL;
-                       odm_pipe->top_pipe = NULL;
-                       odm_pipe->bottom_pipe = NULL;
-                       odm_pipe->prev_odm_pipe = NULL;
-                       odm_pipe->next_odm_pipe = NULL;
-                       if (odm_pipe->stream_res.dsc)
-                               dcn20_release_dsc(&context->res_ctx, dc->res_pool, &odm_pipe->stream_res.dsc);
-                       /* Clear plane_res and stream_res */
-                       memset(&odm_pipe->plane_res, 0, sizeof(odm_pipe->plane_res));
-                       memset(&odm_pipe->stream_res, 0, sizeof(odm_pipe->stream_res));
-                       odm_pipe = next_odm_pipe;
-               }
-               if (pipe->plane_state)
-                       resource_build_scaling_params(pipe);
-       }
-
-       /* merge previously mpc split pipes since mode support needs to make the decision */
-       for (i = 0; i < dc->res_pool->pipe_count; i++) {
-               struct pipe_ctx *pipe = &context->res_ctx.pipe_ctx[i];
-               struct pipe_ctx *hsplit_pipe = pipe->bottom_pipe;
-
-               if (!hsplit_pipe || hsplit_pipe->plane_state != pipe->plane_state)
-                       continue;
-
-               pipe->bottom_pipe = hsplit_pipe->bottom_pipe;
-               if (hsplit_pipe->bottom_pipe)
-                       hsplit_pipe->bottom_pipe->top_pipe = pipe;
-               hsplit_pipe->plane_state = NULL;
-               hsplit_pipe->stream = NULL;
-               hsplit_pipe->top_pipe = NULL;
-               hsplit_pipe->bottom_pipe = NULL;
-
-               /* Clear plane_res and stream_res */
-               memset(&hsplit_pipe->plane_res, 0, sizeof(hsplit_pipe->plane_res));
-               memset(&hsplit_pipe->stream_res, 0, sizeof(hsplit_pipe->stream_res));
-               if (pipe->plane_state)
-                       resource_build_scaling_params(pipe);
-       }
-}
-
-int dcn20_validate_apply_pipe_split_flags(
-               struct dc *dc,
-               struct dc_state *context,
-               int vlevel,
-               int *split,
-               bool *merge)
-{
-       int i, pipe_idx, vlevel_split;
-       int plane_count = 0;
-       bool force_split = false;
-       bool avoid_split = dc->debug.pipe_split_policy == MPC_SPLIT_AVOID;
-       struct vba_vars_st *v = &context->bw_ctx.dml.vba;
-       int max_mpc_comb = v->maxMpcComb;
-
-       if (context->stream_count > 1) {
-               if (dc->debug.pipe_split_policy == MPC_SPLIT_AVOID_MULT_DISP)
-                       avoid_split = true;
-       } else if (dc->debug.force_single_disp_pipe_split)
-                       force_split = true;
-
-       for (i = 0; i < dc->res_pool->pipe_count; i++) {
-               struct pipe_ctx *pipe = &context->res_ctx.pipe_ctx[i];
-
-               /**
-                * Workaround for avoiding pipe-split in cases where we'd split
-                * planes that are too small, resulting in splits that aren't
-                * valid for the scaler.
-                */
-               if (pipe->plane_state &&
-                   (pipe->plane_state->dst_rect.width <= 16 ||
-                    pipe->plane_state->dst_rect.height <= 16 ||
-                    pipe->plane_state->src_rect.width <= 16 ||
-                    pipe->plane_state->src_rect.height <= 16))
-                       avoid_split = true;
-
-               /* TODO: fix dc bugs and remove this split threshold thing */
-               if (pipe->stream && !pipe->prev_odm_pipe &&
-                               (!pipe->top_pipe || pipe->top_pipe->plane_state != pipe->plane_state))
-                       ++plane_count;
-       }
-       if (plane_count > dc->res_pool->pipe_count / 2)
-               avoid_split = true;
-
-       /* W/A: Mode timing with borders may not work well with pipe split, avoid for this corner case */
-       for (i = 0; i < dc->res_pool->pipe_count; i++) {
-               struct pipe_ctx *pipe = &context->res_ctx.pipe_ctx[i];
-               struct dc_crtc_timing timing;
-
-               if (!pipe->stream)
-                       continue;
-               else {
-                       timing = pipe->stream->timing;
-                       if (timing.h_border_left + timing.h_border_right
-                                       + timing.v_border_top + timing.v_border_bottom > 0) {
-                               avoid_split = true;
-                               break;
-                       }
-               }
-       }
-
-       /* Avoid split loop looks for lowest voltage level that allows most unsplit pipes possible */
-       if (avoid_split) {
-               for (i = 0, pipe_idx = 0; i < dc->res_pool->pipe_count; i++) {
-                       if (!context->res_ctx.pipe_ctx[i].stream)
-                               continue;
-
-                       for (vlevel_split = vlevel; vlevel <= context->bw_ctx.dml.soc.num_states; vlevel++)
-                               if (v->NoOfDPP[vlevel][0][pipe_idx] == 1 &&
-                                               v->ModeSupport[vlevel][0])
-                                       break;
-                       /* Impossible to not split this pipe */
-                       if (vlevel > context->bw_ctx.dml.soc.num_states)
-                               vlevel = vlevel_split;
-                       else
-                               max_mpc_comb = 0;
-                       pipe_idx++;
-               }
-               v->maxMpcComb = max_mpc_comb;
-       }
-
-       /* Split loop sets which pipe should be split based on dml outputs and dc flags */
-       for (i = 0, pipe_idx = 0; i < dc->res_pool->pipe_count; i++) {
-               struct pipe_ctx *pipe = &context->res_ctx.pipe_ctx[i];
-               int pipe_plane = v->pipe_plane[pipe_idx];
-               bool split4mpc = context->stream_count == 1 && plane_count == 1
-                               && dc->config.enable_4to1MPC && dc->res_pool->pipe_count >= 4;
-
-               if (!context->res_ctx.pipe_ctx[i].stream)
-                       continue;
-
-               if (split4mpc || v->NoOfDPP[vlevel][max_mpc_comb][pipe_plane] == 4)
-                       split[i] = 4;
-               else if (force_split || v->NoOfDPP[vlevel][max_mpc_comb][pipe_plane] == 2)
-                               split[i] = 2;
-
-               if ((pipe->stream->view_format ==
-                               VIEW_3D_FORMAT_SIDE_BY_SIDE ||
-                               pipe->stream->view_format ==
-                               VIEW_3D_FORMAT_TOP_AND_BOTTOM) &&
-                               (pipe->stream->timing.timing_3d_format ==
-                               TIMING_3D_FORMAT_TOP_AND_BOTTOM ||
-                                pipe->stream->timing.timing_3d_format ==
-                               TIMING_3D_FORMAT_SIDE_BY_SIDE))
-                       split[i] = 2;
-               if (dc->debug.force_odm_combine & (1 << pipe->stream_res.tg->inst)) {
-                       split[i] = 2;
-                       v->ODMCombineEnablePerState[vlevel][pipe_plane] = dm_odm_combine_mode_2to1;
-               }
-               if (dc->debug.force_odm_combine_4to1 & (1 << pipe->stream_res.tg->inst)) {
-                       split[i] = 4;
-                       v->ODMCombineEnablePerState[vlevel][pipe_plane] = dm_odm_combine_mode_4to1;
-               }
-               /*420 format workaround*/
-               if (pipe->stream->timing.h_addressable > 7680 &&
-                               pipe->stream->timing.pixel_encoding == PIXEL_ENCODING_YCBCR420) {
-                       split[i] = 4;
-               }
-               v->ODMCombineEnabled[pipe_plane] =
-                       v->ODMCombineEnablePerState[vlevel][pipe_plane];
-
-               if (v->ODMCombineEnabled[pipe_plane] == dm_odm_combine_mode_disabled) {
-                       if (resource_get_mpc_slice_count(pipe) == 2) {
-                               /*If need split for mpc but 2 way split already*/
-                               if (split[i] == 4)
-                                       split[i] = 2; /* 2 -> 4 MPC */
-                               else if (split[i] == 2)
-                                       split[i] = 0; /* 2 -> 2 MPC */
-                               else if (pipe->top_pipe && pipe->top_pipe->plane_state == pipe->plane_state)
-                                       merge[i] = true; /* 2 -> 1 MPC */
-                       } else if (resource_get_mpc_slice_count(pipe) == 4) {
-                               /*If need split for mpc but 4 way split already*/
-                               if (split[i] == 2 && ((pipe->top_pipe && !pipe->top_pipe->top_pipe)
-                                               || !pipe->bottom_pipe)) {
-                                       merge[i] = true; /* 4 -> 2 MPC */
-                               } else if (split[i] == 0 && pipe->top_pipe &&
-                                               pipe->top_pipe->plane_state == pipe->plane_state)
-                                       merge[i] = true; /* 4 -> 1 MPC */
-                               split[i] = 0;
-                       } else if (resource_get_odm_slice_count(pipe) > 1) {
-                               /* ODM -> MPC transition */
-                               if (pipe->prev_odm_pipe) {
-                                       split[i] = 0;
-                                       merge[i] = true;
-                               }
-                       }
-               } else {
-                       if (resource_get_odm_slice_count(pipe) == 2) {
-                               /*If need split for odm but 2 way split already*/
-                               if (split[i] == 4)
-                                       split[i] = 2; /* 2 -> 4 ODM */
-                               else if (split[i] == 2)
-                                       split[i] = 0; /* 2 -> 2 ODM */
-                               else if (pipe->prev_odm_pipe) {
-                                       ASSERT(0); /* NOT expected yet */
-                                       merge[i] = true; /* exit ODM */
-                               }
-                       } else if (resource_get_odm_slice_count(pipe) == 4) {
-                               /*If need split for odm but 4 way split already*/
-                               if (split[i] == 2 && ((pipe->prev_odm_pipe && !pipe->prev_odm_pipe->prev_odm_pipe)
-                                               || !pipe->next_odm_pipe)) {
-                                       merge[i] = true; /* 4 -> 2 ODM */
-                               } else if (split[i] == 0 && pipe->prev_odm_pipe) {
-                                       ASSERT(0); /* NOT expected yet */
-                                       merge[i] = true; /* exit ODM */
-                               }
-                               split[i] = 0;
-                       } else if (resource_get_mpc_slice_count(pipe) > 1) {
-                               /* MPC -> ODM transition */
-                               ASSERT(0); /* NOT expected yet */
-                               if (pipe->top_pipe && pipe->top_pipe->plane_state == pipe->plane_state) {
-                                       split[i] = 0;
-                                       merge[i] = true;
-                               }
-                       }
-               }
-
-               /* Adjust dppclk when split is forced, do not bother with dispclk */
-               if (split[i] != 0 && v->NoOfDPP[vlevel][max_mpc_comb][pipe_idx] == 1) {
-                       DC_FP_START();
-                       dcn20_fpu_adjust_dppclk(v, vlevel, max_mpc_comb, pipe_idx, false);
-                       DC_FP_END();
-               }
-               pipe_idx++;
-       }
-
-       return vlevel;
-}
-
-bool dcn20_fast_validate_bw(
-               struct dc *dc,
-               struct dc_state *context,
-               display_e2e_pipe_params_st *pipes,
-               int *pipe_cnt_out,
-               int *pipe_split_from,
-               int *vlevel_out,
-               bool fast_validate)
-{
-       bool out = false;
-       int split[MAX_PIPES] = { 0 };
-       int pipe_cnt, i, pipe_idx, vlevel;
-
-       ASSERT(pipes);
-       if (!pipes)
-               return false;
-
-       dcn20_merge_pipes_for_validate(dc, context);
-
-       DC_FP_START();
-       pipe_cnt = dc->res_pool->funcs->populate_dml_pipes(dc, context, pipes, fast_validate);
-       DC_FP_END();
-
-       *pipe_cnt_out = pipe_cnt;
-
-       if (!pipe_cnt) {
-               out = true;
-               goto validate_out;
-       }
-
-       vlevel = dml_get_voltage_level(&context->bw_ctx.dml, pipes, pipe_cnt);
-
-       if (vlevel > context->bw_ctx.dml.soc.num_states)
-               goto validate_fail;
-
-       vlevel = dcn20_validate_apply_pipe_split_flags(dc, context, vlevel, split, NULL);
-
-       /*initialize pipe_just_split_from to invalid idx*/
-       for (i = 0; i < MAX_PIPES; i++)
-               pipe_split_from[i] = -1;
-
-       for (i = 0, pipe_idx = -1; i < dc->res_pool->pipe_count; i++) {
-               struct pipe_ctx *pipe = &context->res_ctx.pipe_ctx[i];
-               struct pipe_ctx *hsplit_pipe = pipe->bottom_pipe;
-
-               if (!pipe->stream || pipe_split_from[i] >= 0)
-                       continue;
-
-               pipe_idx++;
-
-               if (!pipe->top_pipe && !pipe->plane_state && context->bw_ctx.dml.vba.ODMCombineEnabled[pipe_idx]) {
-                       hsplit_pipe = dcn20_find_secondary_pipe(dc, &context->res_ctx, dc->res_pool, pipe);
-                       ASSERT(hsplit_pipe);
-                       if (!dcn20_split_stream_for_odm(
-                                       dc, &context->res_ctx,
-                                       pipe, hsplit_pipe))
-                               goto validate_fail;
-                       pipe_split_from[hsplit_pipe->pipe_idx] = pipe_idx;
-                       dcn20_build_mapped_resource(dc, context, pipe->stream);
-               }
-
-               if (!pipe->plane_state)
-                       continue;
-               /* Skip 2nd half of already split pipe */
-               if (pipe->top_pipe && pipe->plane_state == pipe->top_pipe->plane_state)
-                       continue;
-
-               /* We do not support mpo + odm at the moment */
-               if (hsplit_pipe && hsplit_pipe->plane_state != pipe->plane_state
-                               && context->bw_ctx.dml.vba.ODMCombineEnabled[pipe_idx])
-                       goto validate_fail;
-
-               if (split[i] == 2) {
-                       if (!hsplit_pipe || hsplit_pipe->plane_state != pipe->plane_state) {
-                               /* pipe not split previously needs split */
-                               hsplit_pipe = dcn20_find_secondary_pipe(dc, &context->res_ctx, dc->res_pool, pipe);
-                               ASSERT(hsplit_pipe);
-                               if (!hsplit_pipe) {
-                                       DC_FP_START();
-                                       dcn20_fpu_adjust_dppclk(&context->bw_ctx.dml.vba, vlevel, context->bw_ctx.dml.vba.maxMpcComb, pipe_idx, true);
-                                       DC_FP_END();
-                                       continue;
-                               }
-                               if (context->bw_ctx.dml.vba.ODMCombineEnabled[pipe_idx]) {
-                                       if (!dcn20_split_stream_for_odm(
-                                                       dc, &context->res_ctx,
-                                                       pipe, hsplit_pipe))
-                                               goto validate_fail;
-                                       dcn20_build_mapped_resource(dc, context, pipe->stream);
-                               } else {
-                                       dcn20_split_stream_for_mpc(
-                                                       &context->res_ctx, dc->res_pool,
-                                                       pipe, hsplit_pipe);
-                                       resource_build_scaling_params(pipe);
-                                       resource_build_scaling_params(hsplit_pipe);
-                               }
-                               pipe_split_from[hsplit_pipe->pipe_idx] = pipe_idx;
-                       }
-               } else if (hsplit_pipe && hsplit_pipe->plane_state == pipe->plane_state) {
-                       /* merge should already have been done */
-                       ASSERT(0);
-               }
-       }
-       /* Actual dsc count per stream dsc validation*/
-       if (!dcn20_validate_dsc(dc, context)) {
-               context->bw_ctx.dml.vba.ValidationStatus[context->bw_ctx.dml.vba.soc.num_states] =
-                               DML_FAIL_DSC_VALIDATION_FAILURE;
-               goto validate_fail;
-       }
-
-       *vlevel_out = vlevel;
-
-       out = true;
-       goto validate_out;
-
-validate_fail:
-       out = false;
-
-validate_out:
-       return out;
-}
-
-bool dcn20_validate_bandwidth(struct dc *dc, struct dc_state *context,
-               bool fast_validate)
-{
-       bool voltage_supported;
-       display_e2e_pipe_params_st *pipes;
-
-       pipes = kcalloc(dc->res_pool->pipe_count, sizeof(display_e2e_pipe_params_st), GFP_KERNEL);
-       if (!pipes)
-               return false;
-
-       DC_FP_START();
-       voltage_supported = dcn20_validate_bandwidth_fp(dc, context, fast_validate, pipes);
-       DC_FP_END();
-
-       kfree(pipes);
-       return voltage_supported;
-}
-
-struct pipe_ctx *dcn20_acquire_free_pipe_for_layer(
-               const struct dc_state *cur_ctx,
-               struct dc_state *new_ctx,
-               const struct resource_pool *pool,
-               const struct pipe_ctx *opp_head)
-{
-       struct resource_context *res_ctx = &new_ctx->res_ctx;
-       struct pipe_ctx *otg_master = resource_get_otg_master_for_stream(res_ctx, opp_head->stream);
-       struct pipe_ctx *sec_dpp_pipe = resource_find_free_secondary_pipe_legacy(res_ctx, pool, otg_master);
-
-       ASSERT(otg_master);
-
-       if (!sec_dpp_pipe)
-               return NULL;
-
-       sec_dpp_pipe->stream = opp_head->stream;
-       sec_dpp_pipe->stream_res.tg = opp_head->stream_res.tg;
-       sec_dpp_pipe->stream_res.opp = opp_head->stream_res.opp;
-
-       sec_dpp_pipe->plane_res.hubp = pool->hubps[sec_dpp_pipe->pipe_idx];
-       sec_dpp_pipe->plane_res.ipp = pool->ipps[sec_dpp_pipe->pipe_idx];
-       sec_dpp_pipe->plane_res.dpp = pool->dpps[sec_dpp_pipe->pipe_idx];
-       sec_dpp_pipe->plane_res.mpcc_inst = pool->dpps[sec_dpp_pipe->pipe_idx]->inst;
-
-       return sec_dpp_pipe;
-}
-
-bool dcn20_get_dcc_compression_cap(const struct dc *dc,
-               const struct dc_dcc_surface_param *input,
-               struct dc_surface_dcc_cap *output)
-{
-       return dc->res_pool->hubbub->funcs->get_dcc_compression_cap(
-                       dc->res_pool->hubbub,
-                       input,
-                       output);
-}
-
-static void dcn20_destroy_resource_pool(struct resource_pool **pool)
-{
-       struct dcn20_resource_pool *dcn20_pool = TO_DCN20_RES_POOL(*pool);
-
-       dcn20_resource_destruct(dcn20_pool);
-       kfree(dcn20_pool);
-       *pool = NULL;
-}
-
-
-static struct dc_cap_funcs cap_funcs = {
-       .get_dcc_compression_cap = dcn20_get_dcc_compression_cap
-};
-
-
-enum dc_status dcn20_patch_unknown_plane_state(struct dc_plane_state *plane_state)
-{
-       enum surface_pixel_format surf_pix_format = plane_state->format;
-       unsigned int bpp = resource_pixel_format_to_bpp(surf_pix_format);
-
-       plane_state->tiling_info.gfx9.swizzle = DC_SW_64KB_S;
-       if (bpp == 64)
-               plane_state->tiling_info.gfx9.swizzle = DC_SW_64KB_D;
-
-       return DC_OK;
-}
-
-void dcn20_release_pipe(struct dc_state *context,
-                       struct pipe_ctx *pipe,
-                       const struct resource_pool *pool)
-{
-       if (resource_is_pipe_type(pipe, OPP_HEAD) && pipe->stream_res.dsc)
-               dcn20_release_dsc(&context->res_ctx, pool, &pipe->stream_res.dsc);
-       memset(pipe, 0, sizeof(*pipe));
-}
-
-static const struct resource_funcs dcn20_res_pool_funcs = {
-       .destroy = dcn20_destroy_resource_pool,
-       .link_enc_create = dcn20_link_encoder_create,
-       .panel_cntl_create = dcn20_panel_cntl_create,
-       .validate_bandwidth = dcn20_validate_bandwidth,
-       .acquire_free_pipe_as_secondary_dpp_pipe = dcn20_acquire_free_pipe_for_layer,
-       .release_pipe = dcn20_release_pipe,
-       .add_stream_to_ctx = dcn20_add_stream_to_ctx,
-       .add_dsc_to_stream_resource = dcn20_add_dsc_to_stream_resource,
-       .remove_stream_from_ctx = dcn20_remove_stream_from_ctx,
-       .populate_dml_writeback_from_context = dcn20_populate_dml_writeback_from_context,
-       .patch_unknown_plane_state = dcn20_patch_unknown_plane_state,
-       .set_mcif_arb_params = dcn20_set_mcif_arb_params,
-       .populate_dml_pipes = dcn20_populate_dml_pipes_from_context,
-       .find_first_free_match_stream_enc_for_link = dcn10_find_first_free_match_stream_enc_for_link
-};
-
-bool dcn20_dwbc_create(struct dc_context *ctx, struct resource_pool *pool)
-{
-       int i;
-       uint32_t pipe_count = pool->res_cap->num_dwb;
-
-       for (i = 0; i < pipe_count; i++) {
-               struct dcn20_dwbc *dwbc20 = kzalloc(sizeof(struct dcn20_dwbc),
-                                                   GFP_KERNEL);
-
-               if (!dwbc20) {
-                       dm_error("DC: failed to create dwbc20!\n");
-                       return false;
-               }
-               dcn20_dwbc_construct(dwbc20, ctx,
-                               &dwbc20_regs[i],
-                               &dwbc20_shift,
-                               &dwbc20_mask,
-                               i);
-               pool->dwbc[i] = &dwbc20->base;
-       }
-       return true;
-}
-
-bool dcn20_mmhubbub_create(struct dc_context *ctx, struct resource_pool *pool)
-{
-       int i;
-       uint32_t pipe_count = pool->res_cap->num_dwb;
-
-       ASSERT(pipe_count > 0);
-
-       for (i = 0; i < pipe_count; i++) {
-               struct dcn20_mmhubbub *mcif_wb20 = kzalloc(sizeof(struct dcn20_mmhubbub),
-                                                   GFP_KERNEL);
-
-               if (!mcif_wb20) {
-                       dm_error("DC: failed to create mcif_wb20!\n");
-                       return false;
-               }
-
-               dcn20_mmhubbub_construct(mcif_wb20, ctx,
-                               &mcif_wb20_regs[i],
-                               &mcif_wb20_shift,
-                               &mcif_wb20_mask,
-                               i);
-
-               pool->mcif_wb[i] = &mcif_wb20->base;
-       }
-       return true;
-}
-
-static struct pp_smu_funcs *dcn20_pp_smu_create(struct dc_context *ctx)
-{
-       struct pp_smu_funcs *pp_smu = kzalloc(sizeof(*pp_smu), GFP_ATOMIC);
-
-       if (!pp_smu)
-               return pp_smu;
-
-       dm_pp_get_funcs(ctx, pp_smu);
-
-       if (pp_smu->ctx.ver != PP_SMU_VER_NV)
-               pp_smu = memset(pp_smu, 0, sizeof(struct pp_smu_funcs));
-
-       return pp_smu;
-}
-
-static void dcn20_pp_smu_destroy(struct pp_smu_funcs **pp_smu)
-{
-       if (pp_smu && *pp_smu) {
-               kfree(*pp_smu);
-               *pp_smu = NULL;
-       }
-}
-
-static struct _vcs_dpi_soc_bounding_box_st *get_asic_rev_soc_bb(
-       uint32_t hw_internal_rev)
-{
-       if (ASICREV_IS_NAVI14_M(hw_internal_rev))
-               return &dcn2_0_nv14_soc;
-
-       if (ASICREV_IS_NAVI12_P(hw_internal_rev))
-               return &dcn2_0_nv12_soc;
-
-       return &dcn2_0_soc;
-}
-
-static struct _vcs_dpi_ip_params_st *get_asic_rev_ip_params(
-       uint32_t hw_internal_rev)
-{
-       /* NV14 */
-       if (ASICREV_IS_NAVI14_M(hw_internal_rev))
-               return &dcn2_0_nv14_ip;
-
-       /* NV12 and NV10 */
-       return &dcn2_0_ip;
-}
-
-static enum dml_project get_dml_project_version(uint32_t hw_internal_rev)
-{
-       return DML_PROJECT_NAVI10v2;
-}
-
-static bool init_soc_bounding_box(struct dc *dc,
-                                 struct dcn20_resource_pool *pool)
-{
-       struct _vcs_dpi_soc_bounding_box_st *loaded_bb =
-                       get_asic_rev_soc_bb(dc->ctx->asic_id.hw_internal_rev);
-       struct _vcs_dpi_ip_params_st *loaded_ip =
-                       get_asic_rev_ip_params(dc->ctx->asic_id.hw_internal_rev);
-
-       DC_LOGGER_INIT(dc->ctx->logger);
-
-       if (pool->base.pp_smu) {
-               struct pp_smu_nv_clock_table max_clocks = {0};
-               unsigned int uclk_states[8] = {0};
-               unsigned int num_states = 0;
-               enum pp_smu_status status;
-               bool clock_limits_available = false;
-               bool uclk_states_available = false;
-
-               if (pool->base.pp_smu->nv_funcs.get_uclk_dpm_states) {
-                       status = (pool->base.pp_smu->nv_funcs.get_uclk_dpm_states)
-                               (&pool->base.pp_smu->nv_funcs.pp_smu, uclk_states, &num_states);
-
-                       uclk_states_available = (status == PP_SMU_RESULT_OK);
-               }
-
-               if (pool->base.pp_smu->nv_funcs.get_maximum_sustainable_clocks) {
-                       status = (*pool->base.pp_smu->nv_funcs.get_maximum_sustainable_clocks)
-                                       (&pool->base.pp_smu->nv_funcs.pp_smu, &max_clocks);
-                       /* SMU cannot set DCF clock to anything equal to or higher than SOC clock
-                        */
-                       if (max_clocks.dcfClockInKhz >= max_clocks.socClockInKhz)
-                               max_clocks.dcfClockInKhz = max_clocks.socClockInKhz - 1000;
-                       clock_limits_available = (status == PP_SMU_RESULT_OK);
-               }
-
-               if (clock_limits_available && uclk_states_available && num_states) {
-                       DC_FP_START();
-                       dcn20_update_bounding_box(dc, loaded_bb, &max_clocks, uclk_states, num_states);
-                       DC_FP_END();
-               } else if (clock_limits_available) {
-                       DC_FP_START();
-                       dcn20_cap_soc_clocks(loaded_bb, max_clocks);
-                       DC_FP_END();
-               }
-       }
-
-       loaded_ip->max_num_otg = pool->base.res_cap->num_timing_generator;
-       loaded_ip->max_num_dpp = pool->base.pipe_count;
-       DC_FP_START();
-       dcn20_patch_bounding_box(dc, loaded_bb);
-       DC_FP_END();
-       return true;
-}
-
-static bool dcn20_resource_construct(
-       uint8_t num_virtual_links,
-       struct dc *dc,
-       struct dcn20_resource_pool *pool)
-{
-       int i;
-       struct dc_context *ctx = dc->ctx;
-       struct irq_service_init_data init_data;
-       struct ddc_service_init_data ddc_init_data = {0};
-       struct _vcs_dpi_soc_bounding_box_st *loaded_bb =
-                       get_asic_rev_soc_bb(ctx->asic_id.hw_internal_rev);
-       struct _vcs_dpi_ip_params_st *loaded_ip =
-                       get_asic_rev_ip_params(ctx->asic_id.hw_internal_rev);
-       enum dml_project dml_project_version =
-                       get_dml_project_version(ctx->asic_id.hw_internal_rev);
-
-       ctx->dc_bios->regs = &bios_regs;
-       pool->base.funcs = &dcn20_res_pool_funcs;
-
-       if (ASICREV_IS_NAVI14_M(ctx->asic_id.hw_internal_rev)) {
-               pool->base.res_cap = &res_cap_nv14;
-               pool->base.pipe_count = 5;
-               pool->base.mpcc_count = 5;
-       } else {
-               pool->base.res_cap = &res_cap_nv10;
-               pool->base.pipe_count = 6;
-               pool->base.mpcc_count = 6;
-       }
-       /*************************************************
-        *  Resource + asic cap harcoding                *
-        *************************************************/
-       pool->base.underlay_pipe_index = NO_UNDERLAY_PIPE;
-
-       dc->caps.max_downscale_ratio = 200;
-       dc->caps.i2c_speed_in_khz = 100;
-       dc->caps.i2c_speed_in_khz_hdcp = 100; /*1.4 w/a not applied by default*/
-       dc->caps.max_cursor_size = 256;
-       dc->caps.min_horizontal_blanking_period = 80;
-       dc->caps.dmdata_alloc_size = 2048;
-
-       dc->caps.max_slave_planes = 1;
-       dc->caps.max_slave_yuv_planes = 1;
-       dc->caps.max_slave_rgb_planes = 1;
-       dc->caps.post_blend_color_processing = true;
-       dc->caps.force_dp_tps4_for_cp2520 = true;
-       dc->caps.extended_aux_timeout_support = true;
-
-       /* Color pipeline capabilities */
-       dc->caps.color.dpp.dcn_arch = 1;
-       dc->caps.color.dpp.input_lut_shared = 0;
-       dc->caps.color.dpp.icsc = 1;
-       dc->caps.color.dpp.dgam_ram = 1;
-       dc->caps.color.dpp.dgam_rom_caps.srgb = 1;
-       dc->caps.color.dpp.dgam_rom_caps.bt2020 = 1;
-       dc->caps.color.dpp.dgam_rom_caps.gamma2_2 = 0;
-       dc->caps.color.dpp.dgam_rom_caps.pq = 0;
-       dc->caps.color.dpp.dgam_rom_caps.hlg = 0;
-       dc->caps.color.dpp.post_csc = 0;
-       dc->caps.color.dpp.gamma_corr = 0;
-       dc->caps.color.dpp.dgam_rom_for_yuv = 1;
-
-       dc->caps.color.dpp.hw_3d_lut = 1;
-       dc->caps.color.dpp.ogam_ram = 1;
-       // no OGAM ROM on DCN2, only MPC ROM
-       dc->caps.color.dpp.ogam_rom_caps.srgb = 0;
-       dc->caps.color.dpp.ogam_rom_caps.bt2020 = 0;
-       dc->caps.color.dpp.ogam_rom_caps.gamma2_2 = 0;
-       dc->caps.color.dpp.ogam_rom_caps.pq = 0;
-       dc->caps.color.dpp.ogam_rom_caps.hlg = 0;
-       dc->caps.color.dpp.ocsc = 0;
-
-       dc->caps.color.mpc.gamut_remap = 0;
-       dc->caps.color.mpc.num_3dluts = 0;
-       dc->caps.color.mpc.shared_3d_lut = 0;
-       dc->caps.color.mpc.ogam_ram = 1;
-       dc->caps.color.mpc.ogam_rom_caps.srgb = 0;
-       dc->caps.color.mpc.ogam_rom_caps.bt2020 = 0;
-       dc->caps.color.mpc.ogam_rom_caps.gamma2_2 = 0;
-       dc->caps.color.mpc.ogam_rom_caps.pq = 0;
-       dc->caps.color.mpc.ogam_rom_caps.hlg = 0;
-       dc->caps.color.mpc.ocsc = 1;
-
-       dc->caps.dp_hdmi21_pcon_support = true;
-
-       if (dc->ctx->dce_environment == DCE_ENV_PRODUCTION_DRV)
-               dc->debug = debug_defaults_drv;
-
-       //dcn2.0x
-       dc->work_arounds.dedcn20_305_wa = true;
-
-       // Init the vm_helper
-       if (dc->vm_helper)
-               vm_helper_init(dc->vm_helper, 16);
-
-       /*************************************************
-        *  Create resources                             *
-        *************************************************/
-
-       pool->base.clock_sources[DCN20_CLK_SRC_PLL0] =
-                       dcn20_clock_source_create(ctx, ctx->dc_bios,
-                               CLOCK_SOURCE_COMBO_PHY_PLL0,
-                               &clk_src_regs[0], false);
-       pool->base.clock_sources[DCN20_CLK_SRC_PLL1] =
-                       dcn20_clock_source_create(ctx, ctx->dc_bios,
-                               CLOCK_SOURCE_COMBO_PHY_PLL1,
-                               &clk_src_regs[1], false);
-       pool->base.clock_sources[DCN20_CLK_SRC_PLL2] =
-                       dcn20_clock_source_create(ctx, ctx->dc_bios,
-                               CLOCK_SOURCE_COMBO_PHY_PLL2,
-                               &clk_src_regs[2], false);
-       pool->base.clock_sources[DCN20_CLK_SRC_PLL3] =
-                       dcn20_clock_source_create(ctx, ctx->dc_bios,
-                               CLOCK_SOURCE_COMBO_PHY_PLL3,
-                               &clk_src_regs[3], false);
-       pool->base.clock_sources[DCN20_CLK_SRC_PLL4] =
-                       dcn20_clock_source_create(ctx, ctx->dc_bios,
-                               CLOCK_SOURCE_COMBO_PHY_PLL4,
-                               &clk_src_regs[4], false);
-       pool->base.clock_sources[DCN20_CLK_SRC_PLL5] =
-                       dcn20_clock_source_create(ctx, ctx->dc_bios,
-                               CLOCK_SOURCE_COMBO_PHY_PLL5,
-                               &clk_src_regs[5], false);
-       pool->base.clk_src_count = DCN20_CLK_SRC_TOTAL;
-       /* todo: not reuse phy_pll registers */
-       pool->base.dp_clock_source =
-                       dcn20_clock_source_create(ctx, ctx->dc_bios,
-                               CLOCK_SOURCE_ID_DP_DTO,
-                               &clk_src_regs[0], true);
-
-       for (i = 0; i < pool->base.clk_src_count; i++) {
-               if (pool->base.clock_sources[i] == NULL) {
-                       dm_error("DC: failed to create clock sources!\n");
-                       BREAK_TO_DEBUGGER();
-                       goto create_fail;
-               }
-       }
-
-       pool->base.dccg = dccg2_create(ctx, &dccg_regs, &dccg_shift, &dccg_mask);
-       if (pool->base.dccg == NULL) {
-               dm_error("DC: failed to create dccg!\n");
-               BREAK_TO_DEBUGGER();
-               goto create_fail;
-       }
-
-       pool->base.dmcu = dcn20_dmcu_create(ctx,
-                       &dmcu_regs,
-                       &dmcu_shift,
-                       &dmcu_mask);
-       if (pool->base.dmcu == NULL) {
-               dm_error("DC: failed to create dmcu!\n");
-               BREAK_TO_DEBUGGER();
-               goto create_fail;
-       }
-
-       pool->base.abm = dce_abm_create(ctx,
-                       &abm_regs,
-                       &abm_shift,
-                       &abm_mask);
-       if (pool->base.abm == NULL) {
-               dm_error("DC: failed to create abm!\n");
-               BREAK_TO_DEBUGGER();
-               goto create_fail;
-       }
-
-       pool->base.pp_smu = dcn20_pp_smu_create(ctx);
-
-
-       if (!init_soc_bounding_box(dc, pool)) {
-               dm_error("DC: failed to initialize soc bounding box!\n");
-               BREAK_TO_DEBUGGER();
-               goto create_fail;
-       }
-
-       dml_init_instance(&dc->dml, loaded_bb, loaded_ip, dml_project_version);
-
-       if (!dc->debug.disable_pplib_wm_range) {
-               struct pp_smu_wm_range_sets ranges = {0};
-               int i = 0;
-
-               ranges.num_reader_wm_sets = 0;
-
-               if (loaded_bb->num_states == 1) {
-                       ranges.reader_wm_sets[0].wm_inst = i;
-                       ranges.reader_wm_sets[0].min_drain_clk_mhz = PP_SMU_WM_SET_RANGE_CLK_UNCONSTRAINED_MIN;
-                       ranges.reader_wm_sets[0].max_drain_clk_mhz = PP_SMU_WM_SET_RANGE_CLK_UNCONSTRAINED_MAX;
-                       ranges.reader_wm_sets[0].min_fill_clk_mhz = PP_SMU_WM_SET_RANGE_CLK_UNCONSTRAINED_MIN;
-                       ranges.reader_wm_sets[0].max_fill_clk_mhz = PP_SMU_WM_SET_RANGE_CLK_UNCONSTRAINED_MAX;
-
-                       ranges.num_reader_wm_sets = 1;
-               } else if (loaded_bb->num_states > 1) {
-                       for (i = 0; i < 4 && i < loaded_bb->num_states; i++) {
-                               ranges.reader_wm_sets[i].wm_inst = i;
-                               ranges.reader_wm_sets[i].min_drain_clk_mhz = PP_SMU_WM_SET_RANGE_CLK_UNCONSTRAINED_MIN;
-                               ranges.reader_wm_sets[i].max_drain_clk_mhz = PP_SMU_WM_SET_RANGE_CLK_UNCONSTRAINED_MAX;
-                               DC_FP_START();
-                               dcn20_fpu_set_wm_ranges(i, &ranges, loaded_bb);
-                               DC_FP_END();
-
-                               ranges.num_reader_wm_sets = i + 1;
-                       }
-
-                       ranges.reader_wm_sets[0].min_fill_clk_mhz = PP_SMU_WM_SET_RANGE_CLK_UNCONSTRAINED_MIN;
-                       ranges.reader_wm_sets[ranges.num_reader_wm_sets - 1].max_fill_clk_mhz = PP_SMU_WM_SET_RANGE_CLK_UNCONSTRAINED_MAX;
-               }
-
-               ranges.num_writer_wm_sets = 1;
-
-               ranges.writer_wm_sets[0].wm_inst = 0;
-               ranges.writer_wm_sets[0].min_fill_clk_mhz = PP_SMU_WM_SET_RANGE_CLK_UNCONSTRAINED_MIN;
-               ranges.writer_wm_sets[0].max_fill_clk_mhz = PP_SMU_WM_SET_RANGE_CLK_UNCONSTRAINED_MAX;
-               ranges.writer_wm_sets[0].min_drain_clk_mhz = PP_SMU_WM_SET_RANGE_CLK_UNCONSTRAINED_MIN;
-               ranges.writer_wm_sets[0].max_drain_clk_mhz = PP_SMU_WM_SET_RANGE_CLK_UNCONSTRAINED_MAX;
-
-               /* Notify PP Lib/SMU which Watermarks to use for which clock ranges */
-               if (pool->base.pp_smu->nv_funcs.set_wm_ranges)
-                       pool->base.pp_smu->nv_funcs.set_wm_ranges(&pool->base.pp_smu->nv_funcs.pp_smu, &ranges);
-       }
-
-       init_data.ctx = dc->ctx;
-       pool->base.irqs = dal_irq_service_dcn20_create(&init_data);
-       if (!pool->base.irqs)
-               goto create_fail;
-
-       /* mem input -> ipp -> dpp -> opp -> TG */
-       for (i = 0; i < pool->base.pipe_count; i++) {
-               pool->base.hubps[i] = dcn20_hubp_create(ctx, i);
-               if (pool->base.hubps[i] == NULL) {
-                       BREAK_TO_DEBUGGER();
-                       dm_error(
-                               "DC: failed to create memory input!\n");
-                       goto create_fail;
-               }
-
-               pool->base.ipps[i] = dcn20_ipp_create(ctx, i);
-               if (pool->base.ipps[i] == NULL) {
-                       BREAK_TO_DEBUGGER();
-                       dm_error(
-                               "DC: failed to create input pixel processor!\n");
-                       goto create_fail;
-               }
-
-               pool->base.dpps[i] = dcn20_dpp_create(ctx, i);
-               if (pool->base.dpps[i] == NULL) {
-                       BREAK_TO_DEBUGGER();
-                       dm_error(
-                               "DC: failed to create dpps!\n");
-                       goto create_fail;
-               }
-       }
-       for (i = 0; i < pool->base.res_cap->num_ddc; i++) {
-               pool->base.engines[i] = dcn20_aux_engine_create(ctx, i);
-               if (pool->base.engines[i] == NULL) {
-                       BREAK_TO_DEBUGGER();
-                       dm_error(
-                               "DC:failed to create aux engine!!\n");
-                       goto create_fail;
-               }
-               pool->base.hw_i2cs[i] = dcn20_i2c_hw_create(ctx, i);
-               if (pool->base.hw_i2cs[i] == NULL) {
-                       BREAK_TO_DEBUGGER();
-                       dm_error(
-                               "DC:failed to create hw i2c!!\n");
-                       goto create_fail;
-               }
-               pool->base.sw_i2cs[i] = NULL;
-       }
-
-       for (i = 0; i < pool->base.res_cap->num_opp; i++) {
-               pool->base.opps[i] = dcn20_opp_create(ctx, i);
-               if (pool->base.opps[i] == NULL) {
-                       BREAK_TO_DEBUGGER();
-                       dm_error(
-                               "DC: failed to create output pixel processor!\n");
-                       goto create_fail;
-               }
-       }
-
-       for (i = 0; i < pool->base.res_cap->num_timing_generator; i++) {
-               pool->base.timing_generators[i] = dcn20_timing_generator_create(
-                               ctx, i);
-               if (pool->base.timing_generators[i] == NULL) {
-                       BREAK_TO_DEBUGGER();
-                       dm_error("DC: failed to create tg!\n");
-                       goto create_fail;
-               }
-       }
-
-       pool->base.timing_generator_count = i;
-
-       pool->base.mpc = dcn20_mpc_create(ctx);
-       if (pool->base.mpc == NULL) {
-               BREAK_TO_DEBUGGER();
-               dm_error("DC: failed to create mpc!\n");
-               goto create_fail;
-       }
-
-       pool->base.hubbub = dcn20_hubbub_create(ctx);
-       if (pool->base.hubbub == NULL) {
-               BREAK_TO_DEBUGGER();
-               dm_error("DC: failed to create hubbub!\n");
-               goto create_fail;
-       }
-
-       for (i = 0; i < pool->base.res_cap->num_dsc; i++) {
-               pool->base.dscs[i] = dcn20_dsc_create(ctx, i);
-               if (pool->base.dscs[i] == NULL) {
-                       BREAK_TO_DEBUGGER();
-                       dm_error("DC: failed to create display stream compressor %d!\n", i);
-                       goto create_fail;
-               }
-       }
-
-       if (!dcn20_dwbc_create(ctx, &pool->base)) {
-               BREAK_TO_DEBUGGER();
-               dm_error("DC: failed to create dwbc!\n");
-               goto create_fail;
-       }
-       if (!dcn20_mmhubbub_create(ctx, &pool->base)) {
-               BREAK_TO_DEBUGGER();
-               dm_error("DC: failed to create mcif_wb!\n");
-               goto create_fail;
-       }
-
-       if (!resource_construct(num_virtual_links, dc, &pool->base,
-                       &res_create_funcs))
-               goto create_fail;
-
-       dcn20_hw_sequencer_construct(dc);
-
-       // IF NV12, set PG function pointer to NULL. It's not that
-       // PG isn't supported for NV12, it's that we don't want to
-       // program the registers because that will cause more power
-       // to be consumed. We could have created dcn20_init_hw to get
-       // the same effect by checking ASIC rev, but there was a
-       // request at some point to not check ASIC rev on hw sequencer.
-       if (ASICREV_IS_NAVI12_P(dc->ctx->asic_id.hw_internal_rev)) {
-               dc->hwseq->funcs.enable_power_gating_plane = NULL;
-               dc->debug.disable_dpp_power_gate = true;
-               dc->debug.disable_hubp_power_gate = true;
-       }
-
-
-       dc->caps.max_planes =  pool->base.pipe_count;
-
-       for (i = 0; i < dc->caps.max_planes; ++i)
-               dc->caps.planes[i] = plane_cap;
-
-       dc->cap_funcs = cap_funcs;
-
-       if (dc->ctx->dc_bios->fw_info.oem_i2c_present) {
-               ddc_init_data.ctx = dc->ctx;
-               ddc_init_data.link = NULL;
-               ddc_init_data.id.id = dc->ctx->dc_bios->fw_info.oem_i2c_obj_id;
-               ddc_init_data.id.enum_id = 0;
-               ddc_init_data.id.type = OBJECT_TYPE_GENERIC;
-               pool->base.oem_device = dc->link_srv->create_ddc_service(&ddc_init_data);
-       } else {
-               pool->base.oem_device = NULL;
-       }
-
-       return true;
-
-create_fail:
-
-       dcn20_resource_destruct(pool);
-
-       return false;
-}
-
-struct resource_pool *dcn20_create_resource_pool(
-               const struct dc_init_data *init_data,
-               struct dc *dc)
-{
-       struct dcn20_resource_pool *pool =
-               kzalloc(sizeof(struct dcn20_resource_pool), GFP_ATOMIC);
-
-       if (!pool)
-               return NULL;
-
-       if (dcn20_resource_construct(init_data->num_virtual_links, dc, pool))
-               return &pool->base;
-
-       BREAK_TO_DEBUGGER();
-       kfree(pool);
-       return NULL;
-}
diff --git a/drivers/gpu/drm/amd/display/dc/dcn20/dcn20_resource.h b/drivers/gpu/drm/amd/display/dc/dcn20/dcn20_resource.h
deleted file mode 100644 (file)
index 37ecacc..0000000
+++ /dev/null
@@ -1,170 +0,0 @@
-/*
-* Copyright 2017 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_RESOURCE_DCN20_H__
-#define __DC_RESOURCE_DCN20_H__
-
-#include "core_types.h"
-#include "dml/dcn20/dcn20_fpu.h"
-
-#define TO_DCN20_RES_POOL(pool)\
-       container_of(pool, struct dcn20_resource_pool, base)
-
-struct dc;
-struct resource_pool;
-struct _vcs_dpi_display_pipe_params_st;
-
-extern struct _vcs_dpi_ip_params_st dcn2_0_ip;
-extern struct _vcs_dpi_ip_params_st dcn2_0_nv14_ip;
-extern struct _vcs_dpi_soc_bounding_box_st dcn2_0_soc;
-extern struct _vcs_dpi_soc_bounding_box_st dcn2_0_nv14_soc;
-extern struct _vcs_dpi_soc_bounding_box_st dcn2_0_nv12_soc;
-
-struct dcn20_resource_pool {
-       struct resource_pool base;
-};
-struct resource_pool *dcn20_create_resource_pool(
-               const struct dc_init_data *init_data,
-               struct dc *dc);
-
-struct link_encoder *dcn20_link_encoder_create(
-       struct dc_context *ctx,
-       const struct encoder_init_data *enc_init_data);
-
-unsigned int dcn20_calc_max_scaled_time(
-               unsigned int time_per_pixel,
-               enum mmhubbub_wbif_mode mode,
-               unsigned int urgent_watermark);
-
-struct pipe_ctx *dcn20_acquire_free_pipe_for_layer(
-               const struct dc_state *cur_ctx,
-               struct dc_state *new_ctx,
-               const struct resource_pool *pool,
-               const struct pipe_ctx *opp_head_pipe);
-void dcn20_release_pipe(struct dc_state *context,
-                       struct pipe_ctx *pipe,
-                       const struct resource_pool *pool);
-struct stream_encoder *dcn20_stream_encoder_create(
-       enum engine_id eng_id,
-       struct dc_context *ctx);
-
-struct dce_hwseq *dcn20_hwseq_create(
-       struct dc_context *ctx);
-
-bool dcn20_get_dcc_compression_cap(const struct dc *dc,
-               const struct dc_dcc_surface_param *input,
-               struct dc_surface_dcc_cap *output);
-
-void dcn20_dpp_destroy(struct dpp **dpp);
-
-struct dpp *dcn20_dpp_create(
-       struct dc_context *ctx,
-       uint32_t inst);
-
-struct input_pixel_processor *dcn20_ipp_create(
-       struct dc_context *ctx, uint32_t inst);
-
-struct output_pixel_processor *dcn20_opp_create(
-       struct dc_context *ctx, uint32_t inst);
-
-struct dce_aux *dcn20_aux_engine_create(
-       struct dc_context *ctx, uint32_t inst);
-
-struct dce_i2c_hw *dcn20_i2c_hw_create(
-       struct dc_context *ctx,
-       uint32_t inst);
-
-void dcn20_clock_source_destroy(struct clock_source **clk_src);
-
-struct display_stream_compressor *dcn20_dsc_create(
-       struct dc_context *ctx, uint32_t inst);
-void dcn20_dsc_destroy(struct display_stream_compressor **dsc);
-
-struct hubp *dcn20_hubp_create(
-       struct dc_context *ctx,
-       uint32_t inst);
-struct timing_generator *dcn20_timing_generator_create(
-               struct dc_context *ctx,
-               uint32_t instance);
-struct mpc *dcn20_mpc_create(struct dc_context *ctx);
-struct hubbub *dcn20_hubbub_create(struct dc_context *ctx);
-
-bool dcn20_dwbc_create(struct dc_context *ctx, struct resource_pool *pool);
-bool dcn20_mmhubbub_create(struct dc_context *ctx, struct resource_pool *pool);
-
-void dcn20_set_mcif_arb_params(
-               struct dc *dc,
-               struct dc_state *context,
-               display_e2e_pipe_params_st *pipes,
-               int pipe_cnt);
-bool dcn20_validate_bandwidth(struct dc *dc, struct dc_state *context, bool fast_validate);
-void dcn20_merge_pipes_for_validate(
-               struct dc *dc,
-               struct dc_state *context);
-int dcn20_validate_apply_pipe_split_flags(
-               struct dc *dc,
-               struct dc_state *context,
-               int vlevel,
-               int *split,
-               bool *merge);
-void dcn20_release_dsc(struct resource_context *res_ctx,
-                       const struct resource_pool *pool,
-                       struct display_stream_compressor **dsc);
-bool dcn20_validate_dsc(struct dc *dc, struct dc_state *new_ctx);
-void dcn20_split_stream_for_mpc(
-               struct resource_context *res_ctx,
-               const struct resource_pool *pool,
-               struct pipe_ctx *primary_pipe,
-               struct pipe_ctx *secondary_pipe);
-bool dcn20_split_stream_for_odm(
-               const struct dc *dc,
-               struct resource_context *res_ctx,
-               struct pipe_ctx *prev_odm_pipe,
-               struct pipe_ctx *next_odm_pipe);
-void dcn20_acquire_dsc(const struct dc *dc,
-                       struct resource_context *res_ctx,
-                       struct display_stream_compressor **dsc,
-                       int pipe_idx);
-struct pipe_ctx *dcn20_find_secondary_pipe(struct dc *dc,
-               struct resource_context *res_ctx,
-               const struct resource_pool *pool,
-               const struct pipe_ctx *primary_pipe);
-bool dcn20_fast_validate_bw(
-               struct dc *dc,
-               struct dc_state *context,
-               display_e2e_pipe_params_st *pipes,
-               int *pipe_cnt_out,
-               int *pipe_split_from,
-               int *vlevel_out,
-               bool fast_validate);
-
-enum dc_status dcn20_build_mapped_resource(const struct dc *dc, struct dc_state *context, struct dc_stream_state *stream);
-enum dc_status dcn20_add_stream_to_ctx(struct dc *dc, struct dc_state *new_ctx, struct dc_stream_state *dc_stream);
-enum dc_status dcn20_add_dsc_to_stream_resource(struct dc *dc, struct dc_state *dc_ctx, struct dc_stream_state *dc_stream);
-enum dc_status dcn20_remove_stream_from_ctx(struct dc *dc, struct dc_state *new_ctx, struct dc_stream_state *dc_stream);
-enum dc_status dcn20_patch_unknown_plane_state(struct dc_plane_state *plane_state);
-
-#endif /* __DC_RESOURCE_DCN20_H__ */
-
index 3a41a97b0729caf44d551fc203a6daeff72fcc7c..c069a894db925b0909d8e2331c217d620253ef2d 100644 (file)
@@ -1,7 +1,7 @@
 # SPDX-License-Identifier: MIT
 #
 # Makefile for DCN.
-DCN201 = dcn201_init.o dcn201_resource.o \
+DCN201 = dcn201_init.o \
        dcn201_hubbub.o\
        dcn201_mpc.o dcn201_hubp.o dcn201_opp.o dcn201_optc.o dcn201_dpp.o \
        dcn201_dccg.o dcn201_link_encoder.o
diff --git a/drivers/gpu/drm/amd/display/dc/dcn201/dcn201_resource.c b/drivers/gpu/drm/amd/display/dc/dcn201/dcn201_resource.c
deleted file mode 100644 (file)
index bca22d8..0000000
+++ /dev/null
@@ -1,1308 +0,0 @@
-/*
-* Copyright 2016 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 "dm_services.h"
-#include "dc.h"
-
-#include "dcn201_init.h"
-#include "dml/dcn20/dcn20_fpu.h"
-#include "resource.h"
-#include "include/irq_service_interface.h"
-#include "dcn201_resource.h"
-
-#include "dcn20/dcn20_resource.h"
-
-#include "dcn10/dcn10_hubp.h"
-#include "dcn10/dcn10_ipp.h"
-#include "dcn201_mpc.h"
-#include "dcn201_hubp.h"
-#include "irq/dcn201/irq_service_dcn201.h"
-#include "dcn201/dcn201_dpp.h"
-#include "dcn201/dcn201_hubbub.h"
-#include "dcn201_dccg.h"
-#include "dcn201_optc.h"
-#include "dcn201/dcn201_hwseq.h"
-#include "dce110/dce110_hwseq.h"
-#include "dcn201_opp.h"
-#include "dcn201/dcn201_link_encoder.h"
-#include "dcn20/dcn20_stream_encoder.h"
-#include "dce/dce_clock_source.h"
-#include "dce/dce_audio.h"
-#include "dce/dce_hwseq.h"
-#include "virtual/virtual_stream_encoder.h"
-#include "dce110/dce110_resource.h"
-#include "dce/dce_aux.h"
-#include "dce/dce_i2c.h"
-#include "dcn201_hubbub.h"
-#include "dcn10/dcn10_resource.h"
-
-#include "cyan_skillfish_ip_offset.h"
-
-#include "dcn/dcn_2_0_3_offset.h"
-#include "dcn/dcn_2_0_3_sh_mask.h"
-#include "dpcs/dpcs_2_0_3_offset.h"
-#include "dpcs/dpcs_2_0_3_sh_mask.h"
-
-#include "mmhub/mmhub_2_0_0_offset.h"
-#include "mmhub/mmhub_2_0_0_sh_mask.h"
-#include "nbio/nbio_7_4_offset.h"
-
-#include "reg_helper.h"
-
-#define MIN_DISP_CLK_KHZ 100000
-#define MIN_DPP_CLK_KHZ 100000
-
-static struct _vcs_dpi_ip_params_st dcn201_ip = {
-       .gpuvm_enable = 0,
-       .hostvm_enable = 0,
-       .gpuvm_max_page_table_levels = 4,
-       .hostvm_max_page_table_levels = 4,
-       .hostvm_cached_page_table_levels = 0,
-       .pte_group_size_bytes = 2048,
-       .rob_buffer_size_kbytes = 168,
-       .det_buffer_size_kbytes = 164,
-       .dpte_buffer_size_in_pte_reqs_luma = 84,
-       .pde_proc_buffer_size_64k_reqs = 48,
-       .dpp_output_buffer_pixels = 2560,
-       .opp_output_buffer_lines = 1,
-       .pixel_chunk_size_kbytes = 8,
-       .pte_chunk_size_kbytes = 2,
-       .meta_chunk_size_kbytes = 2,
-       .writeback_chunk_size_kbytes = 2,
-       .line_buffer_size_bits = 789504,
-       .is_line_buffer_bpp_fixed = 0,
-       .line_buffer_fixed_bpp = 0,
-       .dcc_supported = true,
-       .max_line_buffer_lines = 12,
-       .writeback_luma_buffer_size_kbytes = 12,
-       .writeback_chroma_buffer_size_kbytes = 8,
-       .writeback_chroma_line_buffer_width_pixels = 4,
-       .writeback_max_hscl_ratio = 1,
-       .writeback_max_vscl_ratio = 1,
-       .writeback_min_hscl_ratio = 1,
-       .writeback_min_vscl_ratio = 1,
-       .writeback_max_hscl_taps = 12,
-       .writeback_max_vscl_taps = 12,
-       .writeback_line_buffer_luma_buffer_size = 0,
-       .writeback_line_buffer_chroma_buffer_size = 9600,
-       .cursor_buffer_size = 8,
-       .cursor_chunk_size = 2,
-       .max_num_otg = 2,
-       .max_num_dpp = 4,
-       .max_num_wb = 0,
-       .max_dchub_pscl_bw_pix_per_clk = 4,
-       .max_pscl_lb_bw_pix_per_clk = 2,
-       .max_lb_vscl_bw_pix_per_clk = 4,
-       .max_vscl_hscl_bw_pix_per_clk = 4,
-       .max_hscl_ratio = 8,
-       .max_vscl_ratio = 8,
-       .hscl_mults = 4,
-       .vscl_mults = 4,
-       .max_hscl_taps = 8,
-       .max_vscl_taps = 8,
-       .dispclk_ramp_margin_percent = 1,
-       .underscan_factor = 1.10,
-       .min_vblank_lines = 30,
-       .dppclk_delay_subtotal = 77,
-       .dppclk_delay_scl_lb_only = 16,
-       .dppclk_delay_scl = 50,
-       .dppclk_delay_cnvc_formatter = 8,
-       .dppclk_delay_cnvc_cursor = 6,
-       .dispclk_delay_subtotal = 87,
-       .dcfclk_cstate_latency = 10,
-       .max_inter_dcn_tile_repeaters = 8,
-       .number_of_cursors = 1,
-};
-
-static struct _vcs_dpi_soc_bounding_box_st dcn201_soc = {
-       .clock_limits = {
-                       {
-                               .state = 0,
-                               .dscclk_mhz = 400.0,
-                               .dcfclk_mhz = 1000.0,
-                               .fabricclk_mhz = 200.0,
-                               .dispclk_mhz = 300.0,
-                               .dppclk_mhz = 300.0,
-                               .phyclk_mhz = 810.0,
-                               .socclk_mhz = 1254.0,
-                               .dram_speed_mts = 2000.0,
-                       },
-                       {
-                               .state = 1,
-                               .dscclk_mhz = 400.0,
-                               .dcfclk_mhz = 1000.0,
-                               .fabricclk_mhz = 250.0,
-                               .dispclk_mhz = 1200.0,
-                               .dppclk_mhz = 1200.0,
-                               .phyclk_mhz = 810.0,
-                               .socclk_mhz = 1254.0,
-                               .dram_speed_mts = 3600.0,
-                       },
-                       {
-                               .state = 2,
-                               .dscclk_mhz = 400.0,
-                               .dcfclk_mhz = 1000.0,
-                               .fabricclk_mhz = 750.0,
-                               .dispclk_mhz = 1200.0,
-                               .dppclk_mhz = 1200.0,
-                               .phyclk_mhz = 810.0,
-                               .socclk_mhz = 1254.0,
-                               .dram_speed_mts = 6800.0,
-                       },
-                       {
-                               .state = 3,
-                               .dscclk_mhz = 400.0,
-                               .dcfclk_mhz = 1000.0,
-                               .fabricclk_mhz = 250.0,
-                               .dispclk_mhz = 1200.0,
-                               .dppclk_mhz = 1200.0,
-                               .phyclk_mhz = 810.0,
-                               .socclk_mhz = 1254.0,
-                               .dram_speed_mts = 14000.0,
-                       },
-                       {
-                               .state = 4,
-                               .dscclk_mhz = 400.0,
-                               .dcfclk_mhz = 1000.0,
-                               .fabricclk_mhz = 750.0,
-                               .dispclk_mhz = 1200.0,
-                               .dppclk_mhz = 1200.0,
-                               .phyclk_mhz = 810.0,
-                               .socclk_mhz = 1254.0,
-                               .dram_speed_mts = 14000.0,
-                       }
-               },
-       .num_states = 4,
-       .sr_exit_time_us = 9.0,
-       .sr_enter_plus_exit_time_us = 11.0,
-       .urgent_latency_us = 4.0,
-       .urgent_latency_pixel_data_only_us = 4.0,
-       .urgent_latency_pixel_mixed_with_vm_data_us = 4.0,
-       .urgent_latency_vm_data_only_us = 4.0,
-       .urgent_out_of_order_return_per_channel_pixel_only_bytes = 256,
-       .urgent_out_of_order_return_per_channel_pixel_and_vm_bytes = 256,
-       .urgent_out_of_order_return_per_channel_vm_only_bytes = 256,
-       .pct_ideal_dram_sdp_bw_after_urgent_pixel_only = 80.0,
-       .pct_ideal_dram_sdp_bw_after_urgent_pixel_and_vm = 80.0,
-       .pct_ideal_dram_sdp_bw_after_urgent_vm_only = 80.0,
-       .max_avg_sdp_bw_use_normal_percent = 80.0,
-       .max_avg_dram_bw_use_normal_percent = 69.0,
-       .writeback_latency_us = 12.0,
-       .ideal_dram_bw_after_urgent_percent = 80.0,
-       .max_request_size_bytes = 256,
-       .dram_channel_width_bytes = 2,
-       .fabric_datapath_to_dcn_data_return_bytes = 64,
-       .dcn_downspread_percent = 0.3,
-       .downspread_percent = 0.3,
-       .dram_page_open_time_ns = 50.0,
-       .dram_rw_turnaround_time_ns = 17.5,
-       .dram_return_buffer_per_channel_bytes = 8192,
-       .round_trip_ping_latency_dcfclk_cycles = 128,
-       .urgent_out_of_order_return_per_channel_bytes = 256,
-       .channel_interleave_bytes = 256,
-       .num_banks = 8,
-       .num_chans = 16,
-       .vmm_page_size_bytes = 4096,
-       .dram_clock_change_latency_us = 250.0,
-       .writeback_dram_clock_change_latency_us = 23.0,
-       .return_bus_width_bytes = 64,
-       .dispclk_dppclk_vco_speed_mhz = 3000,
-       .use_urgent_burst_bw = 0,
-};
-
-enum dcn20_clk_src_array_id {
-       DCN20_CLK_SRC_PLL0,
-       DCN20_CLK_SRC_PLL1,
-       DCN20_CLK_SRC_TOTAL_DCN201
-};
-
-/* begin *********************
- * macros to expend register list macro defined in HW object header file */
-
-/* DCN */
-
-#undef BASE_INNER
-#define BASE_INNER(seg) DMU_BASE__INST0_SEG ## seg
-
-#define BASE(seg) BASE_INNER(seg)
-
-#define SR(reg_name)\
-               .reg_name = BASE(mm ## reg_name ## _BASE_IDX) +  \
-                                       mm ## reg_name
-
-#define SRI(reg_name, block, id)\
-       .reg_name = BASE(mm ## block ## id ## _ ## reg_name ## _BASE_IDX) + \
-                                       mm ## block ## id ## _ ## reg_name
-
-#define SRIR(var_name, reg_name, block, id)\
-       .var_name = BASE(mm ## block ## id ## _ ## reg_name ## _BASE_IDX) + \
-                                       mm ## block ## id ## _ ## reg_name
-
-#define SRII(reg_name, block, id)\
-       .reg_name[id] = BASE(mm ## block ## id ## _ ## reg_name ## _BASE_IDX) + \
-                                       mm ## block ## id ## _ ## reg_name
-
-#define SRI_IX(reg_name, block, id)\
-       .reg_name = ix ## block ## id ## _ ## reg_name
-
-#define DCCG_SRII(reg_name, block, id)\
-       .block ## _ ## reg_name[id] = BASE(mm ## block ## id ## _ ## reg_name ## _BASE_IDX) + \
-                                       mm ## block ## id ## _ ## reg_name
-
-#define VUPDATE_SRII(reg_name, block, id)\
-       .reg_name[id] = BASE(mm ## reg_name ## _ ## block ## id ## _BASE_IDX) + \
-                                       mm ## reg_name ## _ ## block ## id
-
-/* NBIO */
-#define NBIO_BASE_INNER(seg) \
-       NBIO_BASE__INST0_SEG ## seg
-
-#define NBIO_BASE(seg) \
-       NBIO_BASE_INNER(seg)
-
-#define NBIO_SR(reg_name)\
-               .reg_name = NBIO_BASE(mm ## reg_name ## _BASE_IDX) + \
-                                       mm ## reg_name
-
-/* MMHUB */
-#define MMHUB_BASE_INNER(seg) \
-       MMHUB_BASE__INST0_SEG ## seg
-
-#define MMHUB_BASE(seg) \
-       MMHUB_BASE_INNER(seg)
-
-#define MMHUB_SR(reg_name)\
-               .reg_name = MMHUB_BASE(mmMM ## reg_name ## _BASE_IDX) + \
-                                       mmMM ## reg_name
-
-static const struct bios_registers bios_regs = {
-               NBIO_SR(BIOS_SCRATCH_3),
-               NBIO_SR(BIOS_SCRATCH_6)
-};
-
-#define clk_src_regs(index, pllid)\
-[index] = {\
-       CS_COMMON_REG_LIST_DCN201(index, pllid),\
-}
-
-static const struct dce110_clk_src_regs clk_src_regs[] = {
-       clk_src_regs(0, A),
-       clk_src_regs(1, B)
-};
-
-static const struct dce110_clk_src_shift cs_shift = {
-               CS_COMMON_MASK_SH_LIST_DCN2_0(__SHIFT)
-};
-
-static const struct dce110_clk_src_mask cs_mask = {
-               CS_COMMON_MASK_SH_LIST_DCN2_0(_MASK)
-};
-
-#define audio_regs(id)\
-[id] = {\
-               AUD_COMMON_REG_LIST(id)\
-}
-
-static const struct dce_audio_registers audio_regs[] = {
-       audio_regs(0),
-       audio_regs(1),
-};
-
-#define DCE120_AUD_COMMON_MASK_SH_LIST(mask_sh)\
-               SF(AZF0ENDPOINT0_AZALIA_F0_CODEC_ENDPOINT_INDEX, AZALIA_ENDPOINT_REG_INDEX, mask_sh),\
-               SF(AZF0ENDPOINT0_AZALIA_F0_CODEC_ENDPOINT_DATA, AZALIA_ENDPOINT_REG_DATA, mask_sh),\
-               AUD_COMMON_MASK_SH_LIST_BASE(mask_sh)
-
-static const struct dce_audio_shift audio_shift = {
-               DCE120_AUD_COMMON_MASK_SH_LIST(__SHIFT)
-};
-
-static const struct dce_audio_mask audio_mask = {
-               DCE120_AUD_COMMON_MASK_SH_LIST(_MASK)
-};
-
-#define stream_enc_regs(id)\
-[id] = {\
-       SE_DCN2_REG_LIST(id)\
-}
-
-static const struct dcn10_stream_enc_registers stream_enc_regs[] = {
-       stream_enc_regs(0),
-       stream_enc_regs(1)
-};
-
-static const struct dcn10_stream_encoder_shift se_shift = {
-               SE_COMMON_MASK_SH_LIST_DCN20(__SHIFT)
-};
-
-static const struct dcn10_stream_encoder_mask se_mask = {
-               SE_COMMON_MASK_SH_LIST_DCN20(_MASK)
-};
-
-static const struct dce110_aux_registers_shift aux_shift = {
-       DCN_AUX_MASK_SH_LIST(__SHIFT)
-};
-
-static const struct dce110_aux_registers_mask aux_mask = {
-       DCN_AUX_MASK_SH_LIST(_MASK)
-};
-
-#define aux_regs(id)\
-[id] = {\
-       DCN2_AUX_REG_LIST(id)\
-}
-
-static const struct dcn10_link_enc_aux_registers link_enc_aux_regs[] = {
-               aux_regs(0),
-               aux_regs(1),
-};
-
-#define hpd_regs(id)\
-[id] = {\
-       HPD_REG_LIST(id)\
-}
-
-static const struct dcn10_link_enc_hpd_registers link_enc_hpd_regs[] = {
-               hpd_regs(0),
-               hpd_regs(1),
-};
-
-#define link_regs(id, phyid)\
-[id] = {\
-       LE_DCN_COMMON_REG_LIST(id), \
-       UNIPHY_DCN2_REG_LIST(phyid) \
-}
-
-static const struct dcn10_link_enc_registers link_enc_regs[] = {
-       link_regs(0, A),
-       link_regs(1, B),
-};
-
-#define LINK_ENCODER_MASK_SH_LIST_DCN201(mask_sh)\
-       LINK_ENCODER_MASK_SH_LIST_DCN20(mask_sh)
-
-static const struct dcn10_link_enc_shift le_shift = {
-               LINK_ENCODER_MASK_SH_LIST_DCN201(__SHIFT)
-};
-
-static const struct dcn10_link_enc_mask le_mask = {
-               LINK_ENCODER_MASK_SH_LIST_DCN201(_MASK)
-};
-
-#define ipp_regs(id)\
-[id] = {\
-               IPP_REG_LIST_DCN201(id),\
-}
-
-static const struct dcn10_ipp_registers ipp_regs[] = {
-       ipp_regs(0),
-       ipp_regs(1),
-       ipp_regs(2),
-       ipp_regs(3),
-};
-
-static const struct dcn10_ipp_shift ipp_shift = {
-               IPP_MASK_SH_LIST_DCN201(__SHIFT)
-};
-
-static const struct dcn10_ipp_mask ipp_mask = {
-               IPP_MASK_SH_LIST_DCN201(_MASK)
-};
-
-#define opp_regs(id)\
-[id] = {\
-       OPP_REG_LIST_DCN201(id),\
-}
-
-static const struct dcn201_opp_registers opp_regs[] = {
-       opp_regs(0),
-       opp_regs(1),
-};
-
-static const struct dcn201_opp_shift opp_shift = {
-               OPP_MASK_SH_LIST_DCN201(__SHIFT)
-};
-
-static const struct dcn201_opp_mask opp_mask = {
-               OPP_MASK_SH_LIST_DCN201(_MASK)
-};
-
-#define aux_engine_regs(id)\
-[id] = {\
-       AUX_COMMON_REG_LIST0(id), \
-       .AUX_RESET_MASK = 0 \
-}
-
-static const struct dce110_aux_registers aux_engine_regs[] = {
-               aux_engine_regs(0),
-               aux_engine_regs(1)
-};
-
-#define tf_regs(id)\
-[id] = {\
-       TF_REG_LIST_DCN201(id),\
-}
-
-static const struct dcn201_dpp_registers tf_regs[] = {
-       tf_regs(0),
-       tf_regs(1),
-       tf_regs(2),
-       tf_regs(3),
-};
-
-static const struct dcn201_dpp_shift tf_shift = {
-               TF_REG_LIST_SH_MASK_DCN201(__SHIFT)
-};
-
-static const struct dcn201_dpp_mask tf_mask = {
-               TF_REG_LIST_SH_MASK_DCN201(_MASK)
-};
-
-static const struct dcn201_mpc_registers mpc_regs = {
-               MPC_REG_LIST_DCN201(0),
-               MPC_REG_LIST_DCN201(1),
-               MPC_REG_LIST_DCN201(2),
-               MPC_REG_LIST_DCN201(3),
-               MPC_REG_LIST_DCN201(4),
-               MPC_OUT_MUX_REG_LIST_DCN201(0),
-               MPC_OUT_MUX_REG_LIST_DCN201(1),
-};
-
-static const struct dcn201_mpc_shift mpc_shift = {
-       MPC_COMMON_MASK_SH_LIST_DCN201(__SHIFT)
-};
-
-static const struct dcn201_mpc_mask mpc_mask = {
-       MPC_COMMON_MASK_SH_LIST_DCN201(_MASK)
-};
-
-#define tg_regs_dcn201(id)\
-[id] = {TG_COMMON_REG_LIST_DCN201(id)}
-
-static const struct dcn_optc_registers tg_regs[] = {
-       tg_regs_dcn201(0),
-       tg_regs_dcn201(1)
-};
-
-static const struct dcn_optc_shift tg_shift = {
-       TG_COMMON_MASK_SH_LIST_DCN201(__SHIFT)
-};
-
-static const struct dcn_optc_mask tg_mask = {
-       TG_COMMON_MASK_SH_LIST_DCN201(_MASK)
-};
-
-#define hubp_regsDCN201(id)\
-[id] = {\
-       HUBP_REG_LIST_DCN201(id)\
-}
-
-static const struct dcn201_hubp_registers hubp_regs[] = {
-               hubp_regsDCN201(0),
-               hubp_regsDCN201(1),
-               hubp_regsDCN201(2),
-               hubp_regsDCN201(3)
-};
-
-static const struct dcn201_hubp_shift hubp_shift = {
-               HUBP_MASK_SH_LIST_DCN201(__SHIFT)
-};
-
-static const struct dcn201_hubp_mask hubp_mask = {
-               HUBP_MASK_SH_LIST_DCN201(_MASK)
-};
-
-static const struct dcn_hubbub_registers hubbub_reg = {
-               HUBBUB_REG_LIST_DCN201(0)
-};
-
-static const struct dcn_hubbub_shift hubbub_shift = {
-               HUBBUB_MASK_SH_LIST_DCN201(__SHIFT)
-};
-
-static const struct dcn_hubbub_mask hubbub_mask = {
-               HUBBUB_MASK_SH_LIST_DCN201(_MASK)
-};
-
-
-static const struct dccg_registers dccg_regs = {
-               DCCG_COMMON_REG_LIST_DCN_BASE()
-};
-
-static const struct dccg_shift dccg_shift = {
-               DCCG_COMMON_MASK_SH_LIST_DCN_COMMON_BASE(__SHIFT)
-};
-
-static const struct dccg_mask dccg_mask = {
-               DCCG_COMMON_MASK_SH_LIST_DCN_COMMON_BASE(_MASK)
-};
-
-static const struct resource_caps res_cap_dnc201 = {
-               .num_timing_generator = 2,
-               .num_opp = 2,
-               .num_video_plane = 4,
-               .num_audio = 2,
-               .num_stream_encoder = 2,
-               .num_pll = 2,
-               .num_ddc = 2,
-};
-
-static const struct dc_plane_cap plane_cap = {
-       .type = DC_PLANE_TYPE_DCN_UNIVERSAL,
-       .per_pixel_alpha = true,
-
-       .pixel_format_support = {
-                       .argb8888 = true,
-                       .nv12 = false,
-                       .fp16 = true,
-                       .p010 = false,
-       },
-
-       .max_upscale_factor = {
-                       .argb8888 = 16000,
-                       .nv12 = 16000,
-                       .fp16 = 1
-       },
-
-       .max_downscale_factor = {
-                       .argb8888 = 250,
-                       .nv12 = 250,
-                       .fp16 = 250
-       },
-       64,
-       64
-};
-
-static const struct dc_debug_options debug_defaults_drv = {
-               .disable_dmcu = true,
-               .force_abm_enable = false,
-               .timing_trace = false,
-               .clock_trace = true,
-               .disable_pplib_clock_request = true,
-               .pipe_split_policy = MPC_SPLIT_DYNAMIC,
-               .force_single_disp_pipe_split = false,
-               .disable_dcc = DCC_ENABLE,
-               .vsr_support = true,
-               .performance_trace = false,
-               .az_endpoint_mute_only = true,
-               .max_downscale_src_width = 3840,
-               .disable_pplib_wm_range = true,
-               .scl_reset_length10 = true,
-               .sanity_checks = false,
-               .underflow_assert_delay_us = 0xFFFFFFFF,
-               .enable_tri_buf = false,
-               .enable_legacy_fast_update = true,
-               .using_dml2 = false,
-};
-
-static void dcn201_dpp_destroy(struct dpp **dpp)
-{
-       kfree(TO_DCN201_DPP(*dpp));
-       *dpp = NULL;
-}
-
-static struct dpp *dcn201_dpp_create(
-       struct dc_context *ctx,
-       uint32_t inst)
-{
-       struct dcn201_dpp *dpp =
-               kzalloc(sizeof(struct dcn201_dpp), GFP_ATOMIC);
-
-       if (!dpp)
-               return NULL;
-
-       if (dpp201_construct(dpp, ctx, inst,
-                       &tf_regs[inst], &tf_shift, &tf_mask))
-               return &dpp->base;
-
-       kfree(dpp);
-       return NULL;
-}
-
-static struct input_pixel_processor *dcn201_ipp_create(
-       struct dc_context *ctx, uint32_t inst)
-{
-       struct dcn10_ipp *ipp =
-               kzalloc(sizeof(struct dcn10_ipp), GFP_ATOMIC);
-
-       if (!ipp) {
-               return NULL;
-       }
-
-       dcn20_ipp_construct(ipp, ctx, inst,
-                       &ipp_regs[inst], &ipp_shift, &ipp_mask);
-       return &ipp->base;
-}
-
-
-static struct output_pixel_processor *dcn201_opp_create(
-       struct dc_context *ctx, uint32_t inst)
-{
-       struct dcn201_opp *opp =
-               kzalloc(sizeof(struct dcn201_opp), GFP_ATOMIC);
-
-       if (!opp) {
-               return NULL;
-       }
-
-       dcn201_opp_construct(opp, ctx, inst,
-                       &opp_regs[inst], &opp_shift, &opp_mask);
-       return &opp->base;
-}
-
-static struct dce_aux *dcn201_aux_engine_create(struct dc_context *ctx,
-                                               uint32_t inst)
-{
-       struct aux_engine_dce110 *aux_engine =
-               kzalloc(sizeof(struct aux_engine_dce110), GFP_ATOMIC);
-
-       if (!aux_engine)
-               return NULL;
-
-       dce110_aux_engine_construct(aux_engine, ctx, inst,
-                                   SW_AUX_TIMEOUT_PERIOD_MULTIPLIER * AUX_TIMEOUT_PERIOD,
-                                   &aux_engine_regs[inst],
-                                       &aux_mask,
-                                       &aux_shift,
-                                       ctx->dc->caps.extended_aux_timeout_support);
-
-       return &aux_engine->base;
-}
-#define i2c_inst_regs(id) { I2C_HW_ENGINE_COMMON_REG_LIST(id) }
-
-static const struct dce_i2c_registers i2c_hw_regs[] = {
-               i2c_inst_regs(1),
-               i2c_inst_regs(2),
-};
-
-static const struct dce_i2c_shift i2c_shifts = {
-               I2C_COMMON_MASK_SH_LIST_DCN2(__SHIFT)
-};
-
-static const struct dce_i2c_mask i2c_masks = {
-               I2C_COMMON_MASK_SH_LIST_DCN2(_MASK)
-};
-
-static struct dce_i2c_hw *dcn201_i2c_hw_create(struct dc_context *ctx,
-                                              uint32_t inst)
-{
-       struct dce_i2c_hw *dce_i2c_hw =
-               kzalloc(sizeof(struct dce_i2c_hw), GFP_ATOMIC);
-
-       if (!dce_i2c_hw)
-               return NULL;
-
-       dcn2_i2c_hw_construct(dce_i2c_hw, ctx, inst,
-                                   &i2c_hw_regs[inst], &i2c_shifts, &i2c_masks);
-
-       return dce_i2c_hw;
-}
-
-static struct mpc *dcn201_mpc_create(struct dc_context *ctx, uint32_t num_mpcc)
-{
-       struct dcn201_mpc *mpc201 = kzalloc(sizeof(struct dcn201_mpc),
-                                           GFP_ATOMIC);
-
-       if (!mpc201)
-               return NULL;
-
-       dcn201_mpc_construct(mpc201, ctx,
-                       &mpc_regs,
-                       &mpc_shift,
-                       &mpc_mask,
-                       num_mpcc);
-
-       return &mpc201->base;
-}
-
-static struct hubbub *dcn201_hubbub_create(struct dc_context *ctx)
-{
-       struct dcn20_hubbub *hubbub = kzalloc(sizeof(struct dcn20_hubbub),
-                                         GFP_ATOMIC);
-
-       if (!hubbub)
-               return NULL;
-
-       hubbub201_construct(hubbub, ctx,
-                       &hubbub_reg,
-                       &hubbub_shift,
-                       &hubbub_mask);
-
-       return &hubbub->base;
-}
-
-static struct timing_generator *dcn201_timing_generator_create(
-               struct dc_context *ctx,
-               uint32_t instance)
-{
-       struct optc *tgn10 =
-               kzalloc(sizeof(struct optc), GFP_ATOMIC);
-
-       if (!tgn10)
-               return NULL;
-
-       tgn10->base.inst = instance;
-       tgn10->base.ctx = ctx;
-
-       tgn10->tg_regs = &tg_regs[instance];
-       tgn10->tg_shift = &tg_shift;
-       tgn10->tg_mask = &tg_mask;
-
-       dcn201_timing_generator_init(tgn10);
-
-       return &tgn10->base;
-}
-
-static const struct encoder_feature_support link_enc_feature = {
-               .max_hdmi_deep_color = COLOR_DEPTH_121212,
-               .max_hdmi_pixel_clock = 600000,
-               .hdmi_ycbcr420_supported = true,
-               .dp_ycbcr420_supported = true,
-               .fec_supported = true,
-               .flags.bits.IS_HBR2_CAPABLE = true,
-               .flags.bits.IS_HBR3_CAPABLE = true,
-               .flags.bits.IS_TPS3_CAPABLE = true,
-               .flags.bits.IS_TPS4_CAPABLE = true
-};
-
-static struct link_encoder *dcn201_link_encoder_create(
-       struct dc_context *ctx,
-       const struct encoder_init_data *enc_init_data)
-{
-       struct dcn20_link_encoder *enc20 =
-               kzalloc(sizeof(struct dcn20_link_encoder), GFP_ATOMIC);
-       struct dcn10_link_encoder *enc10 = &enc20->enc10;
-
-       if (!enc20)
-               return NULL;
-
-       dcn201_link_encoder_construct(enc20,
-                       enc_init_data,
-                       &link_enc_feature,
-                       &link_enc_regs[enc_init_data->transmitter],
-                       &link_enc_aux_regs[enc_init_data->channel - 1],
-                       &link_enc_hpd_regs[enc_init_data->hpd_source],
-                       &le_shift,
-                       &le_mask);
-
-       return &enc10->base;
-}
-
-static struct clock_source *dcn201_clock_source_create(
-       struct dc_context *ctx,
-       struct dc_bios *bios,
-       enum clock_source_id id,
-       const struct dce110_clk_src_regs *regs,
-       bool dp_clk_src)
-{
-       struct dce110_clk_src *clk_src =
-               kzalloc(sizeof(struct dce110_clk_src), GFP_ATOMIC);
-
-       if (!clk_src)
-               return NULL;
-
-       if (dce112_clk_src_construct(clk_src, ctx, bios, id,
-                       regs, &cs_shift, &cs_mask)) {
-               clk_src->base.dp_clk_src = dp_clk_src;
-               return &clk_src->base;
-       }
-       kfree(clk_src);
-       return NULL;
-}
-
-static void read_dce_straps(
-       struct dc_context *ctx,
-       struct resource_straps *straps)
-{
-       generic_reg_get(ctx, mmDC_PINSTRAPS + BASE(mmDC_PINSTRAPS_BASE_IDX),
-
-               FN(DC_PINSTRAPS, DC_PINSTRAPS_AUDIO), &straps->dc_pinstraps_audio);
-}
-
-static struct audio *dcn201_create_audio(
-               struct dc_context *ctx, unsigned int inst)
-{
-       return dce_audio_create(ctx, inst,
-                       &audio_regs[inst], &audio_shift, &audio_mask);
-}
-
-static struct stream_encoder *dcn201_stream_encoder_create(
-       enum engine_id eng_id,
-       struct dc_context *ctx)
-{
-       struct dcn10_stream_encoder *enc1 =
-               kzalloc(sizeof(struct dcn10_stream_encoder), GFP_ATOMIC);
-
-       if (!enc1)
-               return NULL;
-
-       dcn20_stream_encoder_construct(enc1, ctx, ctx->dc_bios, eng_id,
-                                       &stream_enc_regs[eng_id],
-                                       &se_shift, &se_mask);
-
-       return &enc1->base;
-}
-
-static const struct dce_hwseq_registers hwseq_reg = {
-               HWSEQ_DCN201_REG_LIST()
-};
-
-static const struct dce_hwseq_shift hwseq_shift = {
-               HWSEQ_DCN201_MASK_SH_LIST(__SHIFT)
-};
-
-static const struct dce_hwseq_mask hwseq_mask = {
-               HWSEQ_DCN201_MASK_SH_LIST(_MASK)
-};
-
-static struct dce_hwseq *dcn201_hwseq_create(
-       struct dc_context *ctx)
-{
-       struct dce_hwseq *hws = kzalloc(sizeof(struct dce_hwseq), GFP_ATOMIC);
-
-       if (hws) {
-               hws->ctx = ctx;
-               hws->regs = &hwseq_reg;
-               hws->shifts = &hwseq_shift;
-               hws->masks = &hwseq_mask;
-       }
-       return hws;
-}
-
-static const struct resource_create_funcs res_create_funcs = {
-       .read_dce_straps = read_dce_straps,
-       .create_audio = dcn201_create_audio,
-       .create_stream_encoder = dcn201_stream_encoder_create,
-       .create_hwseq = dcn201_hwseq_create,
-};
-
-static void dcn201_clock_source_destroy(struct clock_source **clk_src)
-{
-       kfree(TO_DCE110_CLK_SRC(*clk_src));
-       *clk_src = NULL;
-}
-
-static void dcn201_resource_destruct(struct dcn201_resource_pool *pool)
-{
-       unsigned int i;
-
-       for (i = 0; i < pool->base.stream_enc_count; i++) {
-               if (pool->base.stream_enc[i] != NULL) {
-                       kfree(DCN10STRENC_FROM_STRENC(pool->base.stream_enc[i]));
-                       pool->base.stream_enc[i] = NULL;
-               }
-       }
-
-
-       if (pool->base.mpc != NULL) {
-               kfree(TO_DCN201_MPC(pool->base.mpc));
-               pool->base.mpc = NULL;
-       }
-
-       if (pool->base.hubbub != NULL) {
-               kfree(pool->base.hubbub);
-               pool->base.hubbub = NULL;
-       }
-
-       for (i = 0; i < pool->base.pipe_count; i++) {
-               if (pool->base.dpps[i] != NULL)
-                       dcn201_dpp_destroy(&pool->base.dpps[i]);
-
-               if (pool->base.ipps[i] != NULL)
-                       pool->base.ipps[i]->funcs->ipp_destroy(&pool->base.ipps[i]);
-
-               if (pool->base.hubps[i] != NULL) {
-                       kfree(TO_DCN10_HUBP(pool->base.hubps[i]));
-                       pool->base.hubps[i] = NULL;
-               }
-
-               if (pool->base.irqs != NULL) {
-                       dal_irq_service_destroy(&pool->base.irqs);
-               }
-       }
-
-       for (i = 0; i < pool->base.res_cap->num_opp; i++) {
-               if (pool->base.opps[i] != NULL)
-                       pool->base.opps[i]->funcs->opp_destroy(&pool->base.opps[i]);
-       }
-
-       for (i = 0; i < pool->base.res_cap->num_timing_generator; i++) {
-               if (pool->base.timing_generators[i] != NULL)    {
-                       kfree(DCN10TG_FROM_TG(pool->base.timing_generators[i]));
-                       pool->base.timing_generators[i] = NULL;
-               }
-       }
-       for (i = 0; i < pool->base.audio_count; i++) {
-               if (pool->base.audios[i])
-                       dce_aud_destroy(&pool->base.audios[i]);
-       }
-
-       for (i = 0; i < pool->base.clk_src_count; i++) {
-               if (pool->base.clock_sources[i] != NULL) {
-                       dcn201_clock_source_destroy(&pool->base.clock_sources[i]);
-                       pool->base.clock_sources[i] = NULL;
-               }
-       }
-
-       if (pool->base.dp_clock_source != NULL) {
-               dcn201_clock_source_destroy(&pool->base.dp_clock_source);
-               pool->base.dp_clock_source = NULL;
-       }
-
-       if (pool->base.dccg != NULL)
-               dcn_dccg_destroy(&pool->base.dccg);
-}
-
-static struct hubp *dcn201_hubp_create(
-       struct dc_context *ctx,
-       uint32_t inst)
-{
-       struct dcn201_hubp *hubp201 =
-               kzalloc(sizeof(struct dcn201_hubp), GFP_ATOMIC);
-
-       if (!hubp201)
-               return NULL;
-
-       if (dcn201_hubp_construct(hubp201, ctx, inst,
-                       &hubp_regs[inst], &hubp_shift, &hubp_mask))
-               return &hubp201->base;
-
-       kfree(hubp201);
-       return NULL;
-}
-
-static struct pipe_ctx *dcn201_acquire_free_pipe_for_layer(
-               const struct dc_state *cur_ctx,
-               struct dc_state *new_ctx,
-               const struct resource_pool *pool,
-               const struct pipe_ctx *opp_head_pipe)
-{
-       struct resource_context *res_ctx = &new_ctx->res_ctx;
-       struct pipe_ctx *head_pipe = resource_get_otg_master_for_stream(res_ctx, opp_head_pipe->stream);
-       struct pipe_ctx *idle_pipe = resource_find_free_secondary_pipe_legacy(res_ctx, pool, head_pipe);
-
-       if (!head_pipe)
-               ASSERT(0);
-
-       if (!idle_pipe)
-               return NULL;
-
-       idle_pipe->stream = head_pipe->stream;
-       idle_pipe->stream_res.tg = head_pipe->stream_res.tg;
-       idle_pipe->stream_res.opp = head_pipe->stream_res.opp;
-
-       idle_pipe->plane_res.hubp = pool->hubps[idle_pipe->pipe_idx];
-       idle_pipe->plane_res.ipp = pool->ipps[idle_pipe->pipe_idx];
-       idle_pipe->plane_res.dpp = pool->dpps[idle_pipe->pipe_idx];
-       idle_pipe->plane_res.mpcc_inst = pool->dpps[idle_pipe->pipe_idx]->inst;
-
-       return idle_pipe;
-}
-
-static bool dcn201_get_dcc_compression_cap(const struct dc *dc,
-               const struct dc_dcc_surface_param *input,
-               struct dc_surface_dcc_cap *output)
-{
-       return dc->res_pool->hubbub->funcs->get_dcc_compression_cap(
-                       dc->res_pool->hubbub,
-                       input,
-                       output);
-}
-
-static void dcn201_populate_dml_writeback_from_context(struct dc *dc,
-                                                      struct resource_context *res_ctx,
-                                                      display_e2e_pipe_params_st *pipes)
-{
-       DC_FP_START();
-       dcn201_populate_dml_writeback_from_context_fpu(dc, res_ctx, pipes);
-       DC_FP_END();
-}
-
-static void dcn201_destroy_resource_pool(struct resource_pool **pool)
-{
-       struct dcn201_resource_pool *dcn201_pool = TO_DCN201_RES_POOL(*pool);
-
-       dcn201_resource_destruct(dcn201_pool);
-       kfree(dcn201_pool);
-       *pool = NULL;
-}
-
-static void dcn201_link_init(struct dc_link *link)
-{
-       if (link->ctx->dc_bios->integrated_info)
-               link->dp_ss_off = !link->ctx->dc_bios->integrated_info->dp_ss_control;
-}
-
-static struct dc_cap_funcs cap_funcs = {
-       .get_dcc_compression_cap = dcn201_get_dcc_compression_cap,
-};
-
-static struct resource_funcs dcn201_res_pool_funcs = {
-       .link_init = dcn201_link_init,
-       .destroy = dcn201_destroy_resource_pool,
-       .link_enc_create = dcn201_link_encoder_create,
-       .panel_cntl_create = NULL,
-       .validate_bandwidth = dcn20_validate_bandwidth,
-       .populate_dml_pipes = dcn20_populate_dml_pipes_from_context,
-       .add_stream_to_ctx = dcn20_add_stream_to_ctx,
-       .add_dsc_to_stream_resource = NULL,
-       .remove_stream_from_ctx = dcn20_remove_stream_from_ctx,
-       .acquire_free_pipe_as_secondary_dpp_pipe = dcn201_acquire_free_pipe_for_layer,
-       .release_pipe = dcn20_release_pipe,
-       .populate_dml_writeback_from_context = dcn201_populate_dml_writeback_from_context,
-       .patch_unknown_plane_state = dcn20_patch_unknown_plane_state,
-       .set_mcif_arb_params = dcn20_set_mcif_arb_params,
-       .find_first_free_match_stream_enc_for_link = dcn10_find_first_free_match_stream_enc_for_link
-};
-
-static bool dcn201_resource_construct(
-       uint8_t num_virtual_links,
-       struct dc *dc,
-       struct dcn201_resource_pool *pool)
-{
-       int i;
-       struct dc_context *ctx = dc->ctx;
-
-       ctx->dc_bios->regs = &bios_regs;
-
-       pool->base.res_cap = &res_cap_dnc201;
-       pool->base.funcs = &dcn201_res_pool_funcs;
-
-       /*************************************************
-        *  Resource + asic cap harcoding                *
-        *************************************************/
-       pool->base.underlay_pipe_index = NO_UNDERLAY_PIPE;
-
-       pool->base.pipe_count = 4;
-       pool->base.mpcc_count = 5;
-       dc->caps.max_downscale_ratio = 200;
-       dc->caps.i2c_speed_in_khz = 100;
-       dc->caps.i2c_speed_in_khz_hdcp = 5; /*1.5 w/a applied by default*/
-       dc->caps.max_cursor_size = 256;
-       dc->caps.min_horizontal_blanking_period = 80;
-       dc->caps.dmdata_alloc_size = 2048;
-
-       dc->caps.max_slave_planes = 1;
-       dc->caps.max_slave_yuv_planes = 1;
-       dc->caps.max_slave_rgb_planes = 1;
-       dc->caps.post_blend_color_processing = true;
-       dc->caps.force_dp_tps4_for_cp2520 = true;
-       dc->caps.extended_aux_timeout_support = true;
-
-       /* Color pipeline capabilities */
-       dc->caps.color.dpp.dcn_arch = 1;
-       dc->caps.color.dpp.input_lut_shared = 0;
-       dc->caps.color.dpp.icsc = 1;
-       dc->caps.color.dpp.dgam_ram = 1;
-       dc->caps.color.dpp.dgam_rom_caps.srgb = 1;
-       dc->caps.color.dpp.dgam_rom_caps.bt2020 = 1;
-       dc->caps.color.dpp.dgam_rom_caps.gamma2_2 = 0;
-       dc->caps.color.dpp.dgam_rom_caps.pq = 0;
-       dc->caps.color.dpp.dgam_rom_caps.hlg = 0;
-       dc->caps.color.dpp.post_csc = 0;
-       dc->caps.color.dpp.gamma_corr = 0;
-       dc->caps.color.dpp.dgam_rom_for_yuv = 1;
-
-       dc->caps.color.dpp.hw_3d_lut = 1;
-       dc->caps.color.dpp.ogam_ram = 1;
-       // no OGAM ROM on DCN2
-       dc->caps.color.dpp.ogam_rom_caps.srgb = 0;
-       dc->caps.color.dpp.ogam_rom_caps.bt2020 = 0;
-       dc->caps.color.dpp.ogam_rom_caps.gamma2_2 = 0;
-       dc->caps.color.dpp.ogam_rom_caps.pq = 0;
-       dc->caps.color.dpp.ogam_rom_caps.hlg = 0;
-       dc->caps.color.dpp.ocsc = 0;
-
-       dc->caps.color.mpc.gamut_remap = 0;
-       dc->caps.color.mpc.num_3dluts = 0;
-       dc->caps.color.mpc.shared_3d_lut = 0;
-       dc->caps.color.mpc.ogam_ram = 1;
-       dc->caps.color.mpc.ogam_rom_caps.srgb = 0;
-       dc->caps.color.mpc.ogam_rom_caps.bt2020 = 0;
-       dc->caps.color.mpc.ogam_rom_caps.gamma2_2 = 0;
-       dc->caps.color.mpc.ogam_rom_caps.pq = 0;
-       dc->caps.color.mpc.ogam_rom_caps.hlg = 0;
-       dc->caps.color.mpc.ocsc = 1;
-
-       dc->debug = debug_defaults_drv;
-
-       /*a0 only, remove later*/
-       dc->work_arounds.no_connect_phy_config  = true;
-       dc->work_arounds.dedcn20_305_wa = true;
-       /*************************************************
-        *  Create resources                             *
-        *************************************************/
-
-       pool->base.clock_sources[DCN20_CLK_SRC_PLL0] =
-                       dcn201_clock_source_create(ctx, ctx->dc_bios,
-                               CLOCK_SOURCE_COMBO_PHY_PLL0,
-                               &clk_src_regs[0], false);
-       pool->base.clock_sources[DCN20_CLK_SRC_PLL1] =
-                       dcn201_clock_source_create(ctx, ctx->dc_bios,
-                               CLOCK_SOURCE_COMBO_PHY_PLL1,
-                               &clk_src_regs[1], false);
-
-       pool->base.clk_src_count = DCN20_CLK_SRC_TOTAL_DCN201;
-
-       /* todo: not reuse phy_pll registers */
-       pool->base.dp_clock_source =
-                       dcn201_clock_source_create(ctx, ctx->dc_bios,
-                               CLOCK_SOURCE_ID_DP_DTO,
-                               &clk_src_regs[0], true);
-
-       for (i = 0; i < pool->base.clk_src_count; i++) {
-               if (pool->base.clock_sources[i] == NULL) {
-                       dm_error("DC: failed to create clock sources!\n");
-                       goto create_fail;
-               }
-       }
-
-       pool->base.dccg = dccg201_create(ctx, &dccg_regs, &dccg_shift, &dccg_mask);
-       if (pool->base.dccg == NULL) {
-               dm_error("DC: failed to create dccg!\n");
-               goto create_fail;
-       }
-
-       dcn201_ip.max_num_otg = pool->base.res_cap->num_timing_generator;
-       dcn201_ip.max_num_dpp = pool->base.pipe_count;
-       dml_init_instance(&dc->dml, &dcn201_soc, &dcn201_ip, DML_PROJECT_DCN201);
-       {
-               struct irq_service_init_data init_data;
-               init_data.ctx = dc->ctx;
-               pool->base.irqs = dal_irq_service_dcn201_create(&init_data);
-               if (!pool->base.irqs)
-                       goto create_fail;
-       }
-
-       /* mem input -> ipp -> dpp -> opp -> TG */
-       for (i = 0; i < pool->base.pipe_count; i++) {
-               pool->base.hubps[i] = dcn201_hubp_create(ctx, i);
-               if (pool->base.hubps[i] == NULL) {
-                       dm_error(
-                               "DC: failed to create memory input!\n");
-                       goto create_fail;
-               }
-
-               pool->base.ipps[i] = dcn201_ipp_create(ctx, i);
-               if (pool->base.ipps[i] == NULL) {
-                       dm_error(
-                               "DC: failed to create input pixel processor!\n");
-                       goto create_fail;
-               }
-
-               pool->base.dpps[i] = dcn201_dpp_create(ctx, i);
-               if (pool->base.dpps[i] == NULL) {
-                       dm_error(
-                               "DC: failed to create dpps!\n");
-                       goto create_fail;
-               }
-       }
-
-       for (i = 0; i < pool->base.res_cap->num_opp; i++) {
-               pool->base.opps[i] = dcn201_opp_create(ctx, i);
-               if (pool->base.opps[i] == NULL) {
-                       dm_error(
-                               "DC: failed to create output pixel processor!\n");
-                       goto create_fail;
-               }
-       }
-
-       for (i = 0; i < pool->base.res_cap->num_ddc; i++) {
-               pool->base.engines[i] = dcn201_aux_engine_create(ctx, i);
-               if (pool->base.engines[i] == NULL) {
-                       dm_error(
-                               "DC:failed to create aux engine!!\n");
-                       goto create_fail;
-               }
-               pool->base.hw_i2cs[i] = dcn201_i2c_hw_create(ctx, i);
-               if (pool->base.hw_i2cs[i] == NULL) {
-                       dm_error(
-                               "DC:failed to create hw i2c!!\n");
-                       goto create_fail;
-               }
-               pool->base.sw_i2cs[i] = NULL;
-       }
-
-       for (i = 0; i < pool->base.res_cap->num_timing_generator; i++) {
-               pool->base.timing_generators[i] = dcn201_timing_generator_create(
-                               ctx, i);
-               if (pool->base.timing_generators[i] == NULL) {
-                       dm_error("DC: failed to create tg!\n");
-                       goto create_fail;
-               }
-       }
-
-       pool->base.timing_generator_count = i;
-
-       pool->base.mpc = dcn201_mpc_create(ctx, pool->base.mpcc_count);
-       if (pool->base.mpc == NULL) {
-               dm_error("DC: failed to create mpc!\n");
-               goto create_fail;
-       }
-
-       pool->base.hubbub = dcn201_hubbub_create(ctx);
-       if (pool->base.hubbub == NULL) {
-               dm_error("DC: failed to create hubbub!\n");
-               goto create_fail;
-       }
-
-       if (!resource_construct(num_virtual_links, dc, &pool->base,
-                       &res_create_funcs))
-               goto create_fail;
-
-       dcn201_hw_sequencer_construct(dc);
-
-       dc->caps.max_planes =  pool->base.pipe_count;
-
-       for (i = 0; i < dc->caps.max_planes; ++i)
-               dc->caps.planes[i] = plane_cap;
-
-       dc->cap_funcs = cap_funcs;
-
-       return true;
-
-create_fail:
-
-       dcn201_resource_destruct(pool);
-
-       return false;
-}
-
-struct resource_pool *dcn201_create_resource_pool(
-               const struct dc_init_data *init_data,
-               struct dc *dc)
-{
-       struct dcn201_resource_pool *pool =
-               kzalloc(sizeof(struct dcn201_resource_pool), GFP_ATOMIC);
-
-       if (!pool)
-               return NULL;
-
-       if (dcn201_resource_construct(init_data->num_virtual_links, dc, pool))
-               return &pool->base;
-
-       kfree(pool);
-       return NULL;
-}
diff --git a/drivers/gpu/drm/amd/display/dc/dcn201/dcn201_resource.h b/drivers/gpu/drm/amd/display/dc/dcn201/dcn201_resource.h
deleted file mode 100644 (file)
index e0467d1..0000000
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
-* Copyright 2017 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_RESOURCE_DCN201_H__
-#define __DC_RESOURCE_DCN201_H__
-
-#include "core_types.h"
-
-#define RRDPCS_PHY_DP_TX_PSTATE_POWER_UP    0x00000000
-#define RRDPCS_PHY_DP_TX_PSTATE_HOLD        0x00000001
-#define RRDPCS_PHY_DP_TX_PSTATE_HOLD_OFF    0x00000002
-#define RRDPCS_PHY_DP_TX_PSTATE_POWER_DOWN  0x00000003
-
-#define TO_DCN201_RES_POOL(pool)\
-       container_of(pool, struct dcn201_resource_pool, base)
-
-struct dc;
-struct resource_pool;
-struct _vcs_dpi_display_pipe_params_st;
-
-struct dcn201_resource_pool {
-       struct resource_pool base;
-};
-struct resource_pool *dcn201_create_resource_pool(
-               const struct dc_init_data *init_data,
-               struct dc *dc);
-
-#endif /* __DC_RESOURCE_DCN201_H__ */
index ce1be0afae4a910f9cd365063df1d8852c2df689..dd1eea7212f47058530c2cbbed849c4c85b1884c 100644 (file)
@@ -2,7 +2,7 @@
 #
 # Makefile for DCN21.
 
-DCN21 = dcn21_init.o dcn21_hubp.o dcn21_hubbub.o dcn21_resource.o \
+DCN21 = dcn21_init.o dcn21_hubp.o dcn21_hubbub.o \
         dcn21_link_encoder.o dcn21_dccg.o
 
 AMD_DAL_DCN21 = $(addprefix $(AMDDALPATH)/dc/dcn21/,$(DCN21))
diff --git a/drivers/gpu/drm/amd/display/dc/dcn21/dcn21_resource.c b/drivers/gpu/drm/amd/display/dc/dcn21/dcn21_resource.c
deleted file mode 100644 (file)
index 42277b2..0000000
+++ /dev/null
@@ -1,1745 +0,0 @@
-/*
-* Copyright 2018 Advanced Micro Devices, Inc.
- * Copyright 2019 Raptor Engineering, LLC
- *
- * 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 <linux/slab.h>
-
-#include "dm_services.h"
-#include "dc.h"
-
-#include "dcn21_init.h"
-
-#include "resource.h"
-#include "include/irq_service_interface.h"
-#include "dcn20/dcn20_resource.h"
-#include "dcn21/dcn21_resource.h"
-
-#include "dml/dcn20/dcn20_fpu.h"
-
-#include "clk_mgr.h"
-#include "dcn10/dcn10_hubp.h"
-#include "dcn10/dcn10_ipp.h"
-#include "dcn20/dcn20_hubbub.h"
-#include "dcn20/dcn20_mpc.h"
-#include "dcn20/dcn20_hubp.h"
-#include "dcn21_hubp.h"
-#include "irq/dcn21/irq_service_dcn21.h"
-#include "dcn20/dcn20_dpp.h"
-#include "dcn20/dcn20_optc.h"
-#include "dcn21/dcn21_hwseq.h"
-#include "dce110/dce110_hwseq.h"
-#include "dcn20/dcn20_opp.h"
-#include "dcn20/dcn20_dsc.h"
-#include "dcn21/dcn21_link_encoder.h"
-#include "dcn20/dcn20_stream_encoder.h"
-#include "dce/dce_clock_source.h"
-#include "dce/dce_audio.h"
-#include "dce/dce_hwseq.h"
-#include "virtual/virtual_stream_encoder.h"
-#include "dml/display_mode_vba.h"
-#include "dcn20/dcn20_dccg.h"
-#include "dcn21/dcn21_dccg.h"
-#include "dcn21_hubbub.h"
-#include "dcn10/dcn10_resource.h"
-#include "dce/dce_panel_cntl.h"
-
-#include "dcn20/dcn20_dwb.h"
-#include "dcn20/dcn20_mmhubbub.h"
-#include "dpcs/dpcs_2_1_0_offset.h"
-#include "dpcs/dpcs_2_1_0_sh_mask.h"
-
-#include "renoir_ip_offset.h"
-#include "dcn/dcn_2_1_0_offset.h"
-#include "dcn/dcn_2_1_0_sh_mask.h"
-
-#include "nbio/nbio_7_0_offset.h"
-
-#include "mmhub/mmhub_2_0_0_offset.h"
-#include "mmhub/mmhub_2_0_0_sh_mask.h"
-
-#include "reg_helper.h"
-#include "dce/dce_abm.h"
-#include "dce/dce_dmcu.h"
-#include "dce/dce_aux.h"
-#include "dce/dce_i2c.h"
-#include "dcn21_resource.h"
-#include "vm_helper.h"
-#include "dcn20/dcn20_vmid.h"
-#include "dce/dmub_psr.h"
-#include "dce/dmub_abm.h"
-
-/* begin *********************
- * macros to expend register list macro defined in HW object header file */
-
-/* DCN */
-#define BASE_INNER(seg) DMU_BASE__INST0_SEG ## seg
-
-#define BASE(seg) BASE_INNER(seg)
-
-#define SR(reg_name)\
-               .reg_name = BASE(mm ## reg_name ## _BASE_IDX) +  \
-                                       mm ## reg_name
-
-#define SRI(reg_name, block, id)\
-       .reg_name = BASE(mm ## block ## id ## _ ## reg_name ## _BASE_IDX) + \
-                                       mm ## block ## id ## _ ## reg_name
-
-#define SRIR(var_name, reg_name, block, id)\
-       .var_name = BASE(mm ## block ## id ## _ ## reg_name ## _BASE_IDX) + \
-                                       mm ## block ## id ## _ ## reg_name
-
-#define SRII(reg_name, block, id)\
-       .reg_name[id] = BASE(mm ## block ## id ## _ ## reg_name ## _BASE_IDX) + \
-                                       mm ## block ## id ## _ ## reg_name
-
-#define DCCG_SRII(reg_name, block, id)\
-       .block ## _ ## reg_name[id] = BASE(mm ## block ## id ## _ ## reg_name ## _BASE_IDX) + \
-                                       mm ## block ## id ## _ ## reg_name
-
-#define VUPDATE_SRII(reg_name, block, id)\
-       .reg_name[id] = BASE(mm ## reg_name ## _ ## block ## id ## _BASE_IDX) + \
-                                       mm ## reg_name ## _ ## block ## id
-
-/* NBIO */
-#define NBIO_BASE_INNER(seg) \
-       NBIF0_BASE__INST0_SEG ## seg
-
-#define NBIO_BASE(seg) \
-       NBIO_BASE_INNER(seg)
-
-#define NBIO_SR(reg_name)\
-               .reg_name = NBIO_BASE(mm ## reg_name ## _BASE_IDX) + \
-                                       mm ## reg_name
-
-/* MMHUB */
-#define MMHUB_BASE_INNER(seg) \
-       MMHUB_BASE__INST0_SEG ## seg
-
-#define MMHUB_BASE(seg) \
-       MMHUB_BASE_INNER(seg)
-
-#define MMHUB_SR(reg_name)\
-               .reg_name = MMHUB_BASE(mmMM ## reg_name ## _BASE_IDX) + \
-                                       mmMM ## reg_name
-
-#define clk_src_regs(index, pllid)\
-[index] = {\
-       CS_COMMON_REG_LIST_DCN2_1(index, pllid),\
-}
-
-static const struct dce110_clk_src_regs clk_src_regs[] = {
-       clk_src_regs(0, A),
-       clk_src_regs(1, B),
-       clk_src_regs(2, C),
-       clk_src_regs(3, D),
-       clk_src_regs(4, E),
-};
-
-static const struct dce110_clk_src_shift cs_shift = {
-               CS_COMMON_MASK_SH_LIST_DCN2_0(__SHIFT)
-};
-
-static const struct dce110_clk_src_mask cs_mask = {
-               CS_COMMON_MASK_SH_LIST_DCN2_0(_MASK)
-};
-
-static const struct bios_registers bios_regs = {
-               NBIO_SR(BIOS_SCRATCH_3),
-               NBIO_SR(BIOS_SCRATCH_6)
-};
-
-static const struct dce_dmcu_registers dmcu_regs = {
-               DMCU_DCN20_REG_LIST()
-};
-
-static const struct dce_dmcu_shift dmcu_shift = {
-               DMCU_MASK_SH_LIST_DCN10(__SHIFT)
-};
-
-static const struct dce_dmcu_mask dmcu_mask = {
-               DMCU_MASK_SH_LIST_DCN10(_MASK)
-};
-
-static const struct dce_abm_registers abm_regs = {
-               ABM_DCN20_REG_LIST()
-};
-
-static const struct dce_abm_shift abm_shift = {
-               ABM_MASK_SH_LIST_DCN20(__SHIFT)
-};
-
-static const struct dce_abm_mask abm_mask = {
-               ABM_MASK_SH_LIST_DCN20(_MASK)
-};
-
-#define audio_regs(id)\
-[id] = {\
-               AUD_COMMON_REG_LIST(id)\
-}
-
-static const struct dce_audio_registers audio_regs[] = {
-       audio_regs(0),
-       audio_regs(1),
-       audio_regs(2),
-       audio_regs(3),
-       audio_regs(4),
-       audio_regs(5),
-};
-
-#define DCE120_AUD_COMMON_MASK_SH_LIST(mask_sh)\
-               SF(AZF0ENDPOINT0_AZALIA_F0_CODEC_ENDPOINT_INDEX, AZALIA_ENDPOINT_REG_INDEX, mask_sh),\
-               SF(AZF0ENDPOINT0_AZALIA_F0_CODEC_ENDPOINT_DATA, AZALIA_ENDPOINT_REG_DATA, mask_sh),\
-               AUD_COMMON_MASK_SH_LIST_BASE(mask_sh)
-
-static const struct dce_audio_shift audio_shift = {
-               DCE120_AUD_COMMON_MASK_SH_LIST(__SHIFT)
-};
-
-static const struct dce_audio_mask audio_mask = {
-               DCE120_AUD_COMMON_MASK_SH_LIST(_MASK)
-};
-
-static const struct dccg_registers dccg_regs = {
-               DCCG_COMMON_REG_LIST_DCN_BASE()
-};
-
-static const struct dccg_shift dccg_shift = {
-               DCCG_MASK_SH_LIST_DCN2_1(__SHIFT)
-};
-
-static const struct dccg_mask dccg_mask = {
-               DCCG_MASK_SH_LIST_DCN2_1(_MASK)
-};
-
-#define opp_regs(id)\
-[id] = {\
-       OPP_REG_LIST_DCN20(id),\
-}
-
-static const struct dcn20_opp_registers opp_regs[] = {
-       opp_regs(0),
-       opp_regs(1),
-       opp_regs(2),
-       opp_regs(3),
-       opp_regs(4),
-       opp_regs(5),
-};
-
-static const struct dcn20_opp_shift opp_shift = {
-               OPP_MASK_SH_LIST_DCN20(__SHIFT)
-};
-
-static const struct dcn20_opp_mask opp_mask = {
-               OPP_MASK_SH_LIST_DCN20(_MASK)
-};
-
-#define tg_regs(id)\
-[id] = {TG_COMMON_REG_LIST_DCN2_0(id)}
-
-static const struct dcn_optc_registers tg_regs[] = {
-       tg_regs(0),
-       tg_regs(1),
-       tg_regs(2),
-       tg_regs(3)
-};
-
-static const struct dcn_optc_shift tg_shift = {
-       TG_COMMON_MASK_SH_LIST_DCN2_0(__SHIFT)
-};
-
-static const struct dcn_optc_mask tg_mask = {
-       TG_COMMON_MASK_SH_LIST_DCN2_0(_MASK)
-};
-
-static const struct dcn20_mpc_registers mpc_regs = {
-               MPC_REG_LIST_DCN2_0(0),
-               MPC_REG_LIST_DCN2_0(1),
-               MPC_REG_LIST_DCN2_0(2),
-               MPC_REG_LIST_DCN2_0(3),
-               MPC_REG_LIST_DCN2_0(4),
-               MPC_REG_LIST_DCN2_0(5),
-               MPC_OUT_MUX_REG_LIST_DCN2_0(0),
-               MPC_OUT_MUX_REG_LIST_DCN2_0(1),
-               MPC_OUT_MUX_REG_LIST_DCN2_0(2),
-               MPC_OUT_MUX_REG_LIST_DCN2_0(3),
-               MPC_DBG_REG_LIST_DCN2_0()
-};
-
-static const struct dcn20_mpc_shift mpc_shift = {
-       MPC_COMMON_MASK_SH_LIST_DCN2_0(__SHIFT),
-       MPC_DEBUG_REG_LIST_SH_DCN20
-};
-
-static const struct dcn20_mpc_mask mpc_mask = {
-       MPC_COMMON_MASK_SH_LIST_DCN2_0(_MASK),
-       MPC_DEBUG_REG_LIST_MASK_DCN20
-};
-
-#define hubp_regs(id)\
-[id] = {\
-       HUBP_REG_LIST_DCN21(id)\
-}
-
-static const struct dcn_hubp2_registers hubp_regs[] = {
-               hubp_regs(0),
-               hubp_regs(1),
-               hubp_regs(2),
-               hubp_regs(3)
-};
-
-static const struct dcn_hubp2_shift hubp_shift = {
-               HUBP_MASK_SH_LIST_DCN21(__SHIFT)
-};
-
-static const struct dcn_hubp2_mask hubp_mask = {
-               HUBP_MASK_SH_LIST_DCN21(_MASK)
-};
-
-static const struct dcn_hubbub_registers hubbub_reg = {
-               HUBBUB_REG_LIST_DCN21()
-};
-
-static const struct dcn_hubbub_shift hubbub_shift = {
-               HUBBUB_MASK_SH_LIST_DCN21(__SHIFT)
-};
-
-static const struct dcn_hubbub_mask hubbub_mask = {
-               HUBBUB_MASK_SH_LIST_DCN21(_MASK)
-};
-
-
-#define vmid_regs(id)\
-[id] = {\
-               DCN20_VMID_REG_LIST(id)\
-}
-
-static const struct dcn_vmid_registers vmid_regs[] = {
-       vmid_regs(0),
-       vmid_regs(1),
-       vmid_regs(2),
-       vmid_regs(3),
-       vmid_regs(4),
-       vmid_regs(5),
-       vmid_regs(6),
-       vmid_regs(7),
-       vmid_regs(8),
-       vmid_regs(9),
-       vmid_regs(10),
-       vmid_regs(11),
-       vmid_regs(12),
-       vmid_regs(13),
-       vmid_regs(14),
-       vmid_regs(15)
-};
-
-static const struct dcn20_vmid_shift vmid_shifts = {
-               DCN20_VMID_MASK_SH_LIST(__SHIFT)
-};
-
-static const struct dcn20_vmid_mask vmid_masks = {
-               DCN20_VMID_MASK_SH_LIST(_MASK)
-};
-
-#define dsc_regsDCN20(id)\
-[id] = {\
-       DSC_REG_LIST_DCN20(id)\
-}
-
-static const struct dcn20_dsc_registers dsc_regs[] = {
-       dsc_regsDCN20(0),
-       dsc_regsDCN20(1),
-       dsc_regsDCN20(2),
-       dsc_regsDCN20(3),
-       dsc_regsDCN20(4),
-       dsc_regsDCN20(5)
-};
-
-static const struct dcn20_dsc_shift dsc_shift = {
-       DSC_REG_LIST_SH_MASK_DCN20(__SHIFT)
-};
-
-static const struct dcn20_dsc_mask dsc_mask = {
-       DSC_REG_LIST_SH_MASK_DCN20(_MASK)
-};
-
-#define ipp_regs(id)\
-[id] = {\
-       IPP_REG_LIST_DCN20(id),\
-}
-
-static const struct dcn10_ipp_registers ipp_regs[] = {
-       ipp_regs(0),
-       ipp_regs(1),
-       ipp_regs(2),
-       ipp_regs(3),
-};
-
-static const struct dcn10_ipp_shift ipp_shift = {
-               IPP_MASK_SH_LIST_DCN20(__SHIFT)
-};
-
-static const struct dcn10_ipp_mask ipp_mask = {
-               IPP_MASK_SH_LIST_DCN20(_MASK),
-};
-
-#define opp_regs(id)\
-[id] = {\
-       OPP_REG_LIST_DCN20(id),\
-}
-
-
-#define aux_engine_regs(id)\
-[id] = {\
-       AUX_COMMON_REG_LIST0(id), \
-       .AUXN_IMPCAL = 0, \
-       .AUXP_IMPCAL = 0, \
-       .AUX_RESET_MASK = DP_AUX0_AUX_CONTROL__AUX_RESET_MASK, \
-}
-
-static const struct dce110_aux_registers aux_engine_regs[] = {
-               aux_engine_regs(0),
-               aux_engine_regs(1),
-               aux_engine_regs(2),
-               aux_engine_regs(3),
-               aux_engine_regs(4),
-};
-
-#define tf_regs(id)\
-[id] = {\
-       TF_REG_LIST_DCN20(id),\
-       TF_REG_LIST_DCN20_COMMON_APPEND(id),\
-}
-
-static const struct dcn2_dpp_registers tf_regs[] = {
-       tf_regs(0),
-       tf_regs(1),
-       tf_regs(2),
-       tf_regs(3),
-};
-
-static const struct dcn2_dpp_shift tf_shift = {
-               TF_REG_LIST_SH_MASK_DCN20(__SHIFT),
-               TF_DEBUG_REG_LIST_SH_DCN20
-};
-
-static const struct dcn2_dpp_mask tf_mask = {
-               TF_REG_LIST_SH_MASK_DCN20(_MASK),
-               TF_DEBUG_REG_LIST_MASK_DCN20
-};
-
-#define stream_enc_regs(id)\
-[id] = {\
-       SE_DCN2_REG_LIST(id)\
-}
-
-static const struct dcn10_stream_enc_registers stream_enc_regs[] = {
-       stream_enc_regs(0),
-       stream_enc_regs(1),
-       stream_enc_regs(2),
-       stream_enc_regs(3),
-       stream_enc_regs(4),
-};
-
-static const struct dce110_aux_registers_shift aux_shift = {
-       DCN_AUX_MASK_SH_LIST(__SHIFT)
-};
-
-static const struct dce110_aux_registers_mask aux_mask = {
-       DCN_AUX_MASK_SH_LIST(_MASK)
-};
-
-static const struct dcn10_stream_encoder_shift se_shift = {
-               SE_COMMON_MASK_SH_LIST_DCN20(__SHIFT)
-};
-
-static const struct dcn10_stream_encoder_mask se_mask = {
-               SE_COMMON_MASK_SH_LIST_DCN20(_MASK)
-};
-
-static void dcn21_pp_smu_destroy(struct pp_smu_funcs **pp_smu);
-
-static struct input_pixel_processor *dcn21_ipp_create(
-       struct dc_context *ctx, uint32_t inst)
-{
-       struct dcn10_ipp *ipp =
-               kzalloc(sizeof(struct dcn10_ipp), GFP_KERNEL);
-
-       if (!ipp) {
-               BREAK_TO_DEBUGGER();
-               return NULL;
-       }
-
-       dcn20_ipp_construct(ipp, ctx, inst,
-                       &ipp_regs[inst], &ipp_shift, &ipp_mask);
-       return &ipp->base;
-}
-
-static struct dpp *dcn21_dpp_create(
-       struct dc_context *ctx,
-       uint32_t inst)
-{
-       struct dcn20_dpp *dpp =
-               kzalloc(sizeof(struct dcn20_dpp), GFP_KERNEL);
-
-       if (!dpp)
-               return NULL;
-
-       if (dpp2_construct(dpp, ctx, inst,
-                       &tf_regs[inst], &tf_shift, &tf_mask))
-               return &dpp->base;
-
-       BREAK_TO_DEBUGGER();
-       kfree(dpp);
-       return NULL;
-}
-
-static struct dce_aux *dcn21_aux_engine_create(
-       struct dc_context *ctx,
-       uint32_t inst)
-{
-       struct aux_engine_dce110 *aux_engine =
-               kzalloc(sizeof(struct aux_engine_dce110), GFP_KERNEL);
-
-       if (!aux_engine)
-               return NULL;
-
-       dce110_aux_engine_construct(aux_engine, ctx, inst,
-                                   SW_AUX_TIMEOUT_PERIOD_MULTIPLIER * AUX_TIMEOUT_PERIOD,
-                                   &aux_engine_regs[inst],
-                                       &aux_mask,
-                                       &aux_shift,
-                                       ctx->dc->caps.extended_aux_timeout_support);
-
-       return &aux_engine->base;
-}
-
-#define i2c_inst_regs(id) { I2C_HW_ENGINE_COMMON_REG_LIST(id) }
-
-static const struct dce_i2c_registers i2c_hw_regs[] = {
-               i2c_inst_regs(1),
-               i2c_inst_regs(2),
-               i2c_inst_regs(3),
-               i2c_inst_regs(4),
-               i2c_inst_regs(5),
-};
-
-static const struct dce_i2c_shift i2c_shifts = {
-               I2C_COMMON_MASK_SH_LIST_DCN2(__SHIFT)
-};
-
-static const struct dce_i2c_mask i2c_masks = {
-               I2C_COMMON_MASK_SH_LIST_DCN2(_MASK)
-};
-
-static struct dce_i2c_hw *dcn21_i2c_hw_create(struct dc_context *ctx,
-                                             uint32_t inst)
-{
-       struct dce_i2c_hw *dce_i2c_hw =
-               kzalloc(sizeof(struct dce_i2c_hw), GFP_KERNEL);
-
-       if (!dce_i2c_hw)
-               return NULL;
-
-       dcn2_i2c_hw_construct(dce_i2c_hw, ctx, inst,
-                                   &i2c_hw_regs[inst], &i2c_shifts, &i2c_masks);
-
-       return dce_i2c_hw;
-}
-
-static const struct resource_caps res_cap_rn = {
-               .num_timing_generator = 4,
-               .num_opp = 4,
-               .num_video_plane = 4,
-               .num_audio = 4, // 4 audio endpoints.  4 audio streams
-               .num_stream_encoder = 5,
-               .num_pll = 5,  // maybe 3 because the last two used for USB-c
-               .num_dwb = 1,
-               .num_ddc = 5,
-               .num_vmid = 16,
-               .num_dsc = 3,
-};
-
-#ifdef DIAGS_BUILD
-static const struct resource_caps res_cap_rn_FPGA_4pipe = {
-               .num_timing_generator = 4,
-               .num_opp = 4,
-               .num_video_plane = 4,
-               .num_audio = 7,
-               .num_stream_encoder = 4,
-               .num_pll = 4,
-               .num_dwb = 1,
-               .num_ddc = 4,
-               .num_dsc = 0,
-};
-
-static const struct resource_caps res_cap_rn_FPGA_2pipe_dsc = {
-               .num_timing_generator = 2,
-               .num_opp = 2,
-               .num_video_plane = 2,
-               .num_audio = 7,
-               .num_stream_encoder = 2,
-               .num_pll = 4,
-               .num_dwb = 1,
-               .num_ddc = 4,
-               .num_dsc = 2,
-};
-#endif
-
-static const struct dc_plane_cap plane_cap = {
-       .type = DC_PLANE_TYPE_DCN_UNIVERSAL,
-       .per_pixel_alpha = true,
-
-       .pixel_format_support = {
-                       .argb8888 = true,
-                       .nv12 = true,
-                       .fp16 = true,
-                       .p010 = true
-       },
-
-       .max_upscale_factor = {
-                       .argb8888 = 16000,
-                       .nv12 = 16000,
-                       .fp16 = 16000
-       },
-
-       .max_downscale_factor = {
-                       .argb8888 = 250,
-                       .nv12 = 250,
-                       .fp16 = 250
-       },
-       64,
-       64
-};
-
-static const struct dc_debug_options debug_defaults_drv = {
-               .disable_dmcu = false,
-               .force_abm_enable = false,
-               .timing_trace = false,
-               .clock_trace = true,
-               .disable_pplib_clock_request = true,
-               .min_disp_clk_khz = 100000,
-               .pipe_split_policy = MPC_SPLIT_DYNAMIC,
-               .force_single_disp_pipe_split = false,
-               .disable_dcc = DCC_ENABLE,
-               .vsr_support = true,
-               .performance_trace = false,
-               .max_downscale_src_width = 4096,
-               .disable_pplib_wm_range = false,
-               .scl_reset_length10 = true,
-               .sanity_checks = true,
-               .disable_48mhz_pwrdwn = false,
-               .usbc_combo_phy_reset_wa = true,
-               .dmub_command_table = true,
-               .use_max_lb = true,
-               .enable_legacy_fast_update = true,
-               .using_dml2 = false,
-};
-
-static const struct dc_panel_config panel_config_defaults = {
-               .psr = {
-                       .disable_psr = false,
-                       .disallow_psrsu = false,
-                       .disallow_replay = false,
-               },
-               .ilr = {
-                       .optimize_edp_link_rate = true,
-               },
-};
-
-enum dcn20_clk_src_array_id {
-       DCN20_CLK_SRC_PLL0,
-       DCN20_CLK_SRC_PLL1,
-       DCN20_CLK_SRC_PLL2,
-       DCN20_CLK_SRC_PLL3,
-       DCN20_CLK_SRC_PLL4,
-       DCN20_CLK_SRC_TOTAL_DCN21
-};
-
-static void dcn21_resource_destruct(struct dcn21_resource_pool *pool)
-{
-       unsigned int i;
-
-       for (i = 0; i < pool->base.stream_enc_count; i++) {
-               if (pool->base.stream_enc[i] != NULL) {
-                       kfree(DCN10STRENC_FROM_STRENC(pool->base.stream_enc[i]));
-                       pool->base.stream_enc[i] = NULL;
-               }
-       }
-
-       for (i = 0; i < pool->base.res_cap->num_dsc; i++) {
-               if (pool->base.dscs[i] != NULL)
-                       dcn20_dsc_destroy(&pool->base.dscs[i]);
-       }
-
-       if (pool->base.mpc != NULL) {
-               kfree(TO_DCN20_MPC(pool->base.mpc));
-               pool->base.mpc = NULL;
-       }
-       if (pool->base.hubbub != NULL) {
-               kfree(pool->base.hubbub);
-               pool->base.hubbub = NULL;
-       }
-       for (i = 0; i < pool->base.pipe_count; i++) {
-               if (pool->base.dpps[i] != NULL)
-                       dcn20_dpp_destroy(&pool->base.dpps[i]);
-
-               if (pool->base.ipps[i] != NULL)
-                       pool->base.ipps[i]->funcs->ipp_destroy(&pool->base.ipps[i]);
-
-               if (pool->base.hubps[i] != NULL) {
-                       kfree(TO_DCN20_HUBP(pool->base.hubps[i]));
-                       pool->base.hubps[i] = NULL;
-               }
-
-               if (pool->base.irqs != NULL) {
-                       dal_irq_service_destroy(&pool->base.irqs);
-               }
-       }
-
-       for (i = 0; i < pool->base.res_cap->num_ddc; i++) {
-               if (pool->base.engines[i] != NULL)
-                       dce110_engine_destroy(&pool->base.engines[i]);
-               if (pool->base.hw_i2cs[i] != NULL) {
-                       kfree(pool->base.hw_i2cs[i]);
-                       pool->base.hw_i2cs[i] = NULL;
-               }
-               if (pool->base.sw_i2cs[i] != NULL) {
-                       kfree(pool->base.sw_i2cs[i]);
-                       pool->base.sw_i2cs[i] = NULL;
-               }
-       }
-
-       for (i = 0; i < pool->base.res_cap->num_opp; i++) {
-               if (pool->base.opps[i] != NULL)
-                       pool->base.opps[i]->funcs->opp_destroy(&pool->base.opps[i]);
-       }
-
-       for (i = 0; i < pool->base.res_cap->num_timing_generator; i++) {
-               if (pool->base.timing_generators[i] != NULL)    {
-                       kfree(DCN10TG_FROM_TG(pool->base.timing_generators[i]));
-                       pool->base.timing_generators[i] = NULL;
-               }
-       }
-
-       for (i = 0; i < pool->base.res_cap->num_dwb; i++) {
-               if (pool->base.dwbc[i] != NULL) {
-                       kfree(TO_DCN20_DWBC(pool->base.dwbc[i]));
-                       pool->base.dwbc[i] = NULL;
-               }
-               if (pool->base.mcif_wb[i] != NULL) {
-                       kfree(TO_DCN20_MMHUBBUB(pool->base.mcif_wb[i]));
-                       pool->base.mcif_wb[i] = NULL;
-               }
-       }
-
-       for (i = 0; i < pool->base.audio_count; i++) {
-               if (pool->base.audios[i])
-                       dce_aud_destroy(&pool->base.audios[i]);
-       }
-
-       for (i = 0; i < pool->base.clk_src_count; i++) {
-               if (pool->base.clock_sources[i] != NULL) {
-                       dcn20_clock_source_destroy(&pool->base.clock_sources[i]);
-                       pool->base.clock_sources[i] = NULL;
-               }
-       }
-
-       if (pool->base.dp_clock_source != NULL) {
-               dcn20_clock_source_destroy(&pool->base.dp_clock_source);
-               pool->base.dp_clock_source = NULL;
-       }
-
-       if (pool->base.abm != NULL) {
-               if (pool->base.abm->ctx->dc->config.disable_dmcu)
-                       dmub_abm_destroy(&pool->base.abm);
-               else
-                       dce_abm_destroy(&pool->base.abm);
-       }
-
-       if (pool->base.dmcu != NULL)
-               dce_dmcu_destroy(&pool->base.dmcu);
-
-       if (pool->base.psr != NULL)
-               dmub_psr_destroy(&pool->base.psr);
-
-       if (pool->base.dccg != NULL)
-               dcn_dccg_destroy(&pool->base.dccg);
-
-       if (pool->base.pp_smu != NULL)
-               dcn21_pp_smu_destroy(&pool->base.pp_smu);
-}
-
-bool dcn21_fast_validate_bw(struct dc *dc,
-                           struct dc_state *context,
-                           display_e2e_pipe_params_st *pipes,
-                           int *pipe_cnt_out,
-                           int *pipe_split_from,
-                           int *vlevel_out,
-                           bool fast_validate)
-{
-       bool out = false;
-       int split[MAX_PIPES] = { 0 };
-       int pipe_cnt, i, pipe_idx, vlevel;
-
-       ASSERT(pipes);
-       if (!pipes)
-               return false;
-
-       dcn20_merge_pipes_for_validate(dc, context);
-
-       DC_FP_START();
-       pipe_cnt = dc->res_pool->funcs->populate_dml_pipes(dc, context, pipes, fast_validate);
-       DC_FP_END();
-
-       *pipe_cnt_out = pipe_cnt;
-
-       if (!pipe_cnt) {
-               out = true;
-               goto validate_out;
-       }
-       /*
-        * DML favors voltage over p-state, but we're more interested in
-        * supporting p-state over voltage. We can't support p-state in
-        * prefetch mode > 0 so try capping the prefetch mode to start.
-        */
-       context->bw_ctx.dml.soc.allow_dram_self_refresh_or_dram_clock_change_in_vblank =
-                               dm_allow_self_refresh_and_mclk_switch;
-       vlevel = dml_get_voltage_level(&context->bw_ctx.dml, pipes, pipe_cnt);
-
-       if (vlevel > context->bw_ctx.dml.soc.num_states) {
-               /*
-                * If mode is unsupported or there's still no p-state support then
-                * fall back to favoring voltage.
-                *
-                * We don't actually support prefetch mode 2, so require that we
-                * at least support prefetch mode 1.
-                */
-               context->bw_ctx.dml.soc.allow_dram_self_refresh_or_dram_clock_change_in_vblank =
-                                       dm_allow_self_refresh;
-               vlevel = dml_get_voltage_level(&context->bw_ctx.dml, pipes, pipe_cnt);
-               if (vlevel > context->bw_ctx.dml.soc.num_states)
-                       goto validate_fail;
-       }
-
-       vlevel = dcn20_validate_apply_pipe_split_flags(dc, context, vlevel, split, NULL);
-
-       for (i = 0, pipe_idx = 0; i < dc->res_pool->pipe_count; i++) {
-               struct pipe_ctx *pipe = &context->res_ctx.pipe_ctx[i];
-               struct pipe_ctx *mpo_pipe = pipe->bottom_pipe;
-               struct vba_vars_st *vba = &context->bw_ctx.dml.vba;
-
-               if (!pipe->stream)
-                       continue;
-
-               /* We only support full screen mpo with ODM */
-               if (vba->ODMCombineEnabled[vba->pipe_plane[pipe_idx]] != dm_odm_combine_mode_disabled
-                               && pipe->plane_state && mpo_pipe
-                               && memcmp(&mpo_pipe->plane_state->clip_rect,
-                                               &pipe->stream->src,
-                                               sizeof(struct rect)) != 0) {
-                       ASSERT(mpo_pipe->plane_state != pipe->plane_state);
-                       goto validate_fail;
-               }
-               pipe_idx++;
-       }
-
-       /*initialize pipe_just_split_from to invalid idx*/
-       for (i = 0; i < MAX_PIPES; i++)
-               pipe_split_from[i] = -1;
-
-       for (i = 0, pipe_idx = -1; i < dc->res_pool->pipe_count; i++) {
-               struct pipe_ctx *pipe = &context->res_ctx.pipe_ctx[i];
-               struct pipe_ctx *hsplit_pipe = pipe->bottom_pipe;
-
-               if (!pipe->stream || pipe_split_from[i] >= 0)
-                       continue;
-
-               pipe_idx++;
-
-               if (!pipe->top_pipe && !pipe->plane_state && context->bw_ctx.dml.vba.ODMCombineEnabled[pipe_idx]) {
-                       hsplit_pipe = dcn20_find_secondary_pipe(dc, &context->res_ctx, dc->res_pool, pipe);
-                       ASSERT(hsplit_pipe);
-                       if (!dcn20_split_stream_for_odm(
-                                       dc, &context->res_ctx,
-                                       pipe, hsplit_pipe))
-                               goto validate_fail;
-                       pipe_split_from[hsplit_pipe->pipe_idx] = pipe_idx;
-                       dcn20_build_mapped_resource(dc, context, pipe->stream);
-               }
-
-               if (!pipe->plane_state)
-                       continue;
-               /* Skip 2nd half of already split pipe */
-               if (pipe->top_pipe && pipe->plane_state == pipe->top_pipe->plane_state)
-                       continue;
-
-               if (split[i] == 2) {
-                       if (!hsplit_pipe || hsplit_pipe->plane_state != pipe->plane_state) {
-                               /* pipe not split previously needs split */
-                               hsplit_pipe = dcn20_find_secondary_pipe(dc, &context->res_ctx, dc->res_pool, pipe);
-                               ASSERT(hsplit_pipe);
-                               if (!hsplit_pipe) {
-                                       DC_FP_START();
-                                       dcn20_fpu_adjust_dppclk(&context->bw_ctx.dml.vba, vlevel, context->bw_ctx.dml.vba.maxMpcComb, pipe_idx, true);
-                                       DC_FP_END();
-                                       continue;
-                               }
-                               if (context->bw_ctx.dml.vba.ODMCombineEnabled[pipe_idx]) {
-                                       if (!dcn20_split_stream_for_odm(
-                                                       dc, &context->res_ctx,
-                                                       pipe, hsplit_pipe))
-                                               goto validate_fail;
-                                       dcn20_build_mapped_resource(dc, context, pipe->stream);
-                               } else {
-                                       dcn20_split_stream_for_mpc(
-                                                       &context->res_ctx, dc->res_pool,
-                                                       pipe, hsplit_pipe);
-                                       resource_build_scaling_params(pipe);
-                                       resource_build_scaling_params(hsplit_pipe);
-                               }
-                               pipe_split_from[hsplit_pipe->pipe_idx] = pipe_idx;
-                       }
-               } else if (hsplit_pipe && hsplit_pipe->plane_state == pipe->plane_state) {
-                       /* merge should already have been done */
-                       ASSERT(0);
-               }
-       }
-       /* Actual dsc count per stream dsc validation*/
-       if (!dcn20_validate_dsc(dc, context)) {
-               context->bw_ctx.dml.vba.ValidationStatus[context->bw_ctx.dml.vba.soc.num_states] =
-                               DML_FAIL_DSC_VALIDATION_FAILURE;
-               goto validate_fail;
-       }
-
-       *vlevel_out = vlevel;
-
-       out = true;
-       goto validate_out;
-
-validate_fail:
-       out = false;
-
-validate_out:
-       return out;
-}
-
-/*
- * Some of the functions further below use the FPU, so we need to wrap this
- * with DC_FP_START()/DC_FP_END(). Use the same approach as for
- * dcn20_validate_bandwidth in dcn20_resource.c.
- */
-static bool dcn21_validate_bandwidth(struct dc *dc, struct dc_state *context,
-               bool fast_validate)
-{
-       bool voltage_supported;
-       display_e2e_pipe_params_st *pipes;
-
-       pipes = kcalloc(dc->res_pool->pipe_count, sizeof(display_e2e_pipe_params_st), GFP_KERNEL);
-       if (!pipes)
-               return false;
-
-       DC_FP_START();
-       voltage_supported = dcn21_validate_bandwidth_fp(dc, context, fast_validate, pipes);
-       DC_FP_END();
-
-       kfree(pipes);
-       return voltage_supported;
-}
-
-static void dcn21_destroy_resource_pool(struct resource_pool **pool)
-{
-       struct dcn21_resource_pool *dcn21_pool = TO_DCN21_RES_POOL(*pool);
-
-       dcn21_resource_destruct(dcn21_pool);
-       kfree(dcn21_pool);
-       *pool = NULL;
-}
-
-static struct clock_source *dcn21_clock_source_create(
-               struct dc_context *ctx,
-               struct dc_bios *bios,
-               enum clock_source_id id,
-               const struct dce110_clk_src_regs *regs,
-               bool dp_clk_src)
-{
-       struct dce110_clk_src *clk_src =
-               kzalloc(sizeof(struct dce110_clk_src), GFP_KERNEL);
-
-       if (!clk_src)
-               return NULL;
-
-       if (dcn20_clk_src_construct(clk_src, ctx, bios, id,
-                       regs, &cs_shift, &cs_mask)) {
-               clk_src->base.dp_clk_src = dp_clk_src;
-               return &clk_src->base;
-       }
-
-       kfree(clk_src);
-       BREAK_TO_DEBUGGER();
-       return NULL;
-}
-
-static struct hubp *dcn21_hubp_create(
-       struct dc_context *ctx,
-       uint32_t inst)
-{
-       struct dcn21_hubp *hubp21 =
-               kzalloc(sizeof(struct dcn21_hubp), GFP_KERNEL);
-
-       if (!hubp21)
-               return NULL;
-
-       if (hubp21_construct(hubp21, ctx, inst,
-                       &hubp_regs[inst], &hubp_shift, &hubp_mask))
-               return &hubp21->base;
-
-       BREAK_TO_DEBUGGER();
-       kfree(hubp21);
-       return NULL;
-}
-
-static struct hubbub *dcn21_hubbub_create(struct dc_context *ctx)
-{
-       int i;
-
-       struct dcn20_hubbub *hubbub = kzalloc(sizeof(struct dcn20_hubbub),
-                                         GFP_KERNEL);
-
-       if (!hubbub)
-               return NULL;
-
-       hubbub21_construct(hubbub, ctx,
-                       &hubbub_reg,
-                       &hubbub_shift,
-                       &hubbub_mask);
-
-       for (i = 0; i < res_cap_rn.num_vmid; i++) {
-               struct dcn20_vmid *vmid = &hubbub->vmid[i];
-
-               vmid->ctx = ctx;
-
-               vmid->regs = &vmid_regs[i];
-               vmid->shifts = &vmid_shifts;
-               vmid->masks = &vmid_masks;
-       }
-       hubbub->num_vmid = res_cap_rn.num_vmid;
-
-       return &hubbub->base;
-}
-
-static struct output_pixel_processor *dcn21_opp_create(struct dc_context *ctx,
-                                                      uint32_t inst)
-{
-       struct dcn20_opp *opp =
-               kzalloc(sizeof(struct dcn20_opp), GFP_KERNEL);
-
-       if (!opp) {
-               BREAK_TO_DEBUGGER();
-               return NULL;
-       }
-
-       dcn20_opp_construct(opp, ctx, inst,
-                       &opp_regs[inst], &opp_shift, &opp_mask);
-       return &opp->base;
-}
-
-static struct timing_generator *dcn21_timing_generator_create(struct dc_context *ctx,
-                                                             uint32_t instance)
-{
-       struct optc *tgn10 =
-               kzalloc(sizeof(struct optc), GFP_KERNEL);
-
-       if (!tgn10)
-               return NULL;
-
-       tgn10->base.inst = instance;
-       tgn10->base.ctx = ctx;
-
-       tgn10->tg_regs = &tg_regs[instance];
-       tgn10->tg_shift = &tg_shift;
-       tgn10->tg_mask = &tg_mask;
-
-       dcn20_timing_generator_init(tgn10);
-
-       return &tgn10->base;
-}
-
-static struct mpc *dcn21_mpc_create(struct dc_context *ctx)
-{
-       struct dcn20_mpc *mpc20 = kzalloc(sizeof(struct dcn20_mpc),
-                                         GFP_KERNEL);
-
-       if (!mpc20)
-               return NULL;
-
-       dcn20_mpc_construct(mpc20, ctx,
-                       &mpc_regs,
-                       &mpc_shift,
-                       &mpc_mask,
-                       6);
-
-       return &mpc20->base;
-}
-
-static void read_dce_straps(
-       struct dc_context *ctx,
-       struct resource_straps *straps)
-{
-       generic_reg_get(ctx, mmDC_PINSTRAPS + BASE(mmDC_PINSTRAPS_BASE_IDX),
-               FN(DC_PINSTRAPS, DC_PINSTRAPS_AUDIO), &straps->dc_pinstraps_audio);
-
-}
-
-
-static struct display_stream_compressor *dcn21_dsc_create(struct dc_context *ctx,
-                                                         uint32_t inst)
-{
-       struct dcn20_dsc *dsc =
-               kzalloc(sizeof(struct dcn20_dsc), GFP_KERNEL);
-
-       if (!dsc) {
-               BREAK_TO_DEBUGGER();
-               return NULL;
-       }
-
-       dsc2_construct(dsc, ctx, inst, &dsc_regs[inst], &dsc_shift, &dsc_mask);
-       return &dsc->base;
-}
-
-static struct pp_smu_funcs *dcn21_pp_smu_create(struct dc_context *ctx)
-{
-       struct pp_smu_funcs *pp_smu = kzalloc(sizeof(*pp_smu), GFP_KERNEL);
-
-       if (!pp_smu)
-               return pp_smu;
-
-       dm_pp_get_funcs(ctx, pp_smu);
-
-       if (pp_smu->ctx.ver != PP_SMU_VER_RN)
-               pp_smu = memset(pp_smu, 0, sizeof(struct pp_smu_funcs));
-
-
-       return pp_smu;
-}
-
-static void dcn21_pp_smu_destroy(struct pp_smu_funcs **pp_smu)
-{
-       if (pp_smu && *pp_smu) {
-               kfree(*pp_smu);
-               *pp_smu = NULL;
-       }
-}
-
-static struct audio *dcn21_create_audio(
-               struct dc_context *ctx, unsigned int inst)
-{
-       return dce_audio_create(ctx, inst,
-                       &audio_regs[inst], &audio_shift, &audio_mask);
-}
-
-static struct dc_cap_funcs cap_funcs = {
-       .get_dcc_compression_cap = dcn20_get_dcc_compression_cap
-};
-
-static struct stream_encoder *dcn21_stream_encoder_create(enum engine_id eng_id,
-                                                         struct dc_context *ctx)
-{
-       struct dcn10_stream_encoder *enc1 =
-               kzalloc(sizeof(struct dcn10_stream_encoder), GFP_KERNEL);
-
-       if (!enc1)
-               return NULL;
-
-       dcn20_stream_encoder_construct(enc1, ctx, ctx->dc_bios, eng_id,
-                                       &stream_enc_regs[eng_id],
-                                       &se_shift, &se_mask);
-
-       return &enc1->base;
-}
-
-static const struct dce_hwseq_registers hwseq_reg = {
-               HWSEQ_DCN21_REG_LIST()
-};
-
-static const struct dce_hwseq_shift hwseq_shift = {
-               HWSEQ_DCN21_MASK_SH_LIST(__SHIFT)
-};
-
-static const struct dce_hwseq_mask hwseq_mask = {
-               HWSEQ_DCN21_MASK_SH_LIST(_MASK)
-};
-
-static struct dce_hwseq *dcn21_hwseq_create(
-       struct dc_context *ctx)
-{
-       struct dce_hwseq *hws = kzalloc(sizeof(struct dce_hwseq), GFP_KERNEL);
-
-       if (hws) {
-               hws->ctx = ctx;
-               hws->regs = &hwseq_reg;
-               hws->shifts = &hwseq_shift;
-               hws->masks = &hwseq_mask;
-               hws->wa.DEGVIDCN21 = true;
-               hws->wa.disallow_self_refresh_during_multi_plane_transition = true;
-       }
-       return hws;
-}
-
-static const struct resource_create_funcs res_create_funcs = {
-       .read_dce_straps = read_dce_straps,
-       .create_audio = dcn21_create_audio,
-       .create_stream_encoder = dcn21_stream_encoder_create,
-       .create_hwseq = dcn21_hwseq_create,
-};
-
-static const struct encoder_feature_support link_enc_feature = {
-               .max_hdmi_deep_color = COLOR_DEPTH_121212,
-               .max_hdmi_pixel_clock = 600000,
-               .hdmi_ycbcr420_supported = true,
-               .dp_ycbcr420_supported = true,
-               .fec_supported = true,
-               .flags.bits.IS_HBR2_CAPABLE = true,
-               .flags.bits.IS_HBR3_CAPABLE = true,
-               .flags.bits.IS_TPS3_CAPABLE = true,
-               .flags.bits.IS_TPS4_CAPABLE = true
-};
-
-
-#define link_regs(id, phyid)\
-[id] = {\
-       LE_DCN2_REG_LIST(id), \
-       UNIPHY_DCN2_REG_LIST(phyid), \
-       DPCS_DCN21_REG_LIST(id), \
-       SRI(DP_DPHY_INTERNAL_CTRL, DP, id) \
-}
-
-static const struct dcn10_link_enc_registers link_enc_regs[] = {
-       link_regs(0, A),
-       link_regs(1, B),
-       link_regs(2, C),
-       link_regs(3, D),
-       link_regs(4, E),
-};
-
-static const struct dce_panel_cntl_registers panel_cntl_regs[] = {
-       { DCN_PANEL_CNTL_REG_LIST() }
-};
-
-static const struct dce_panel_cntl_shift panel_cntl_shift = {
-       DCE_PANEL_CNTL_MASK_SH_LIST(__SHIFT)
-};
-
-static const struct dce_panel_cntl_mask panel_cntl_mask = {
-       DCE_PANEL_CNTL_MASK_SH_LIST(_MASK)
-};
-
-#define aux_regs(id)\
-[id] = {\
-       DCN2_AUX_REG_LIST(id)\
-}
-
-static const struct dcn10_link_enc_aux_registers link_enc_aux_regs[] = {
-               aux_regs(0),
-               aux_regs(1),
-               aux_regs(2),
-               aux_regs(3),
-               aux_regs(4)
-};
-
-#define hpd_regs(id)\
-[id] = {\
-       HPD_REG_LIST(id)\
-}
-
-static const struct dcn10_link_enc_hpd_registers link_enc_hpd_regs[] = {
-               hpd_regs(0),
-               hpd_regs(1),
-               hpd_regs(2),
-               hpd_regs(3),
-               hpd_regs(4)
-};
-
-static const struct dcn10_link_enc_shift le_shift = {
-       LINK_ENCODER_MASK_SH_LIST_DCN20(__SHIFT),\
-       DPCS_DCN21_MASK_SH_LIST(__SHIFT)
-};
-
-static const struct dcn10_link_enc_mask le_mask = {
-       LINK_ENCODER_MASK_SH_LIST_DCN20(_MASK),\
-       DPCS_DCN21_MASK_SH_LIST(_MASK)
-};
-
-static int map_transmitter_id_to_phy_instance(
-       enum transmitter transmitter)
-{
-       switch (transmitter) {
-       case TRANSMITTER_UNIPHY_A:
-               return 0;
-       break;
-       case TRANSMITTER_UNIPHY_B:
-               return 1;
-       break;
-       case TRANSMITTER_UNIPHY_C:
-               return 2;
-       break;
-       case TRANSMITTER_UNIPHY_D:
-               return 3;
-       break;
-       case TRANSMITTER_UNIPHY_E:
-               return 4;
-       break;
-       default:
-               ASSERT(0);
-               return 0;
-       }
-}
-
-static struct link_encoder *dcn21_link_encoder_create(
-       struct dc_context *ctx,
-       const struct encoder_init_data *enc_init_data)
-{
-       struct dcn21_link_encoder *enc21 =
-               kzalloc(sizeof(struct dcn21_link_encoder), GFP_KERNEL);
-       int link_regs_id;
-
-       if (!enc21)
-               return NULL;
-
-       link_regs_id =
-               map_transmitter_id_to_phy_instance(enc_init_data->transmitter);
-
-       dcn21_link_encoder_construct(enc21,
-                                     enc_init_data,
-                                     &link_enc_feature,
-                                     &link_enc_regs[link_regs_id],
-                                     &link_enc_aux_regs[enc_init_data->channel - 1],
-                                     &link_enc_hpd_regs[enc_init_data->hpd_source],
-                                     &le_shift,
-                                     &le_mask);
-
-       return &enc21->enc10.base;
-}
-
-static struct panel_cntl *dcn21_panel_cntl_create(const struct panel_cntl_init_data *init_data)
-{
-       struct dce_panel_cntl *panel_cntl =
-               kzalloc(sizeof(struct dce_panel_cntl), GFP_KERNEL);
-
-       if (!panel_cntl)
-               return NULL;
-
-       dce_panel_cntl_construct(panel_cntl,
-                       init_data,
-                       &panel_cntl_regs[init_data->inst],
-                       &panel_cntl_shift,
-                       &panel_cntl_mask);
-
-       return &panel_cntl->base;
-}
-
-static void dcn21_get_panel_config_defaults(struct dc_panel_config *panel_config)
-{
-       *panel_config = panel_config_defaults;
-}
-
-#define CTX ctx
-
-#define REG(reg_name) \
-       (DCN_BASE.instance[0].segment[mm ## reg_name ## _BASE_IDX] + mm ## reg_name)
-
-static uint32_t read_pipe_fuses(struct dc_context *ctx)
-{
-       uint32_t value = REG_READ(CC_DC_PIPE_DIS);
-       /* RV1 support max 4 pipes */
-       value = value & 0xf;
-       return value;
-}
-
-static enum dc_status dcn21_patch_unknown_plane_state(struct dc_plane_state *plane_state)
-{
-       if (plane_state->ctx->dc->debug.disable_dcc == DCC_ENABLE) {
-               plane_state->dcc.enable = 1;
-               /* align to our worst case block width */
-               plane_state->dcc.meta_pitch = ((plane_state->src_rect.width + 1023) / 1024) * 1024;
-       }
-
-       return dcn20_patch_unknown_plane_state(plane_state);
-}
-
-static const struct resource_funcs dcn21_res_pool_funcs = {
-       .destroy = dcn21_destroy_resource_pool,
-       .link_enc_create = dcn21_link_encoder_create,
-       .panel_cntl_create = dcn21_panel_cntl_create,
-       .validate_bandwidth = dcn21_validate_bandwidth,
-       .populate_dml_pipes = dcn21_populate_dml_pipes_from_context,
-       .add_stream_to_ctx = dcn20_add_stream_to_ctx,
-       .add_dsc_to_stream_resource = dcn20_add_dsc_to_stream_resource,
-       .remove_stream_from_ctx = dcn20_remove_stream_from_ctx,
-       .acquire_free_pipe_as_secondary_dpp_pipe = dcn20_acquire_free_pipe_for_layer,
-       .release_pipe = dcn20_release_pipe,
-       .populate_dml_writeback_from_context = dcn20_populate_dml_writeback_from_context,
-       .patch_unknown_plane_state = dcn21_patch_unknown_plane_state,
-       .set_mcif_arb_params = dcn20_set_mcif_arb_params,
-       .find_first_free_match_stream_enc_for_link = dcn10_find_first_free_match_stream_enc_for_link,
-       .update_bw_bounding_box = dcn21_update_bw_bounding_box,
-       .get_panel_config_defaults = dcn21_get_panel_config_defaults,
-};
-
-static bool dcn21_resource_construct(
-       uint8_t num_virtual_links,
-       struct dc *dc,
-       struct dcn21_resource_pool *pool)
-{
-       int i, j;
-       struct dc_context *ctx = dc->ctx;
-       struct irq_service_init_data init_data;
-       uint32_t pipe_fuses = read_pipe_fuses(ctx);
-       uint32_t num_pipes;
-
-       ctx->dc_bios->regs = &bios_regs;
-
-       pool->base.res_cap = &res_cap_rn;
-#ifdef DIAGS_BUILD
-       if (IS_FPGA_MAXIMUS_DC(dc->ctx->dce_environment))
-               //pool->base.res_cap = &res_cap_nv10_FPGA_2pipe_dsc;
-               pool->base.res_cap = &res_cap_rn_FPGA_4pipe;
-#endif
-
-       pool->base.funcs = &dcn21_res_pool_funcs;
-
-       /*************************************************
-        *  Resource + asic cap harcoding                *
-        *************************************************/
-       pool->base.underlay_pipe_index = NO_UNDERLAY_PIPE;
-
-       /* max pipe num for ASIC before check pipe fuses */
-       pool->base.pipe_count = pool->base.res_cap->num_timing_generator;
-
-       dc->caps.max_downscale_ratio = 200;
-       dc->caps.i2c_speed_in_khz = 100;
-       dc->caps.i2c_speed_in_khz_hdcp = 5; /*1.4 w/a applied by default*/
-       dc->caps.max_cursor_size = 256;
-       dc->caps.min_horizontal_blanking_period = 80;
-       dc->caps.dmdata_alloc_size = 2048;
-
-       dc->caps.max_slave_planes = 1;
-       dc->caps.max_slave_yuv_planes = 1;
-       dc->caps.max_slave_rgb_planes = 1;
-       dc->caps.post_blend_color_processing = true;
-       dc->caps.force_dp_tps4_for_cp2520 = true;
-       dc->caps.extended_aux_timeout_support = true;
-       dc->caps.dmcub_support = true;
-       dc->caps.is_apu = true;
-
-       /* Color pipeline capabilities */
-       dc->caps.color.dpp.dcn_arch = 1;
-       dc->caps.color.dpp.input_lut_shared = 0;
-       dc->caps.color.dpp.icsc = 1;
-       dc->caps.color.dpp.dgam_ram = 1;
-       dc->caps.color.dpp.dgam_rom_caps.srgb = 1;
-       dc->caps.color.dpp.dgam_rom_caps.bt2020 = 1;
-       dc->caps.color.dpp.dgam_rom_caps.gamma2_2 = 0;
-       dc->caps.color.dpp.dgam_rom_caps.pq = 0;
-       dc->caps.color.dpp.dgam_rom_caps.hlg = 0;
-       dc->caps.color.dpp.post_csc = 0;
-       dc->caps.color.dpp.gamma_corr = 0;
-       dc->caps.color.dpp.dgam_rom_for_yuv = 1;
-
-       dc->caps.color.dpp.hw_3d_lut = 1;
-       dc->caps.color.dpp.ogam_ram = 1;
-       // no OGAM ROM on DCN2
-       dc->caps.color.dpp.ogam_rom_caps.srgb = 0;
-       dc->caps.color.dpp.ogam_rom_caps.bt2020 = 0;
-       dc->caps.color.dpp.ogam_rom_caps.gamma2_2 = 0;
-       dc->caps.color.dpp.ogam_rom_caps.pq = 0;
-       dc->caps.color.dpp.ogam_rom_caps.hlg = 0;
-       dc->caps.color.dpp.ocsc = 0;
-
-       dc->caps.color.mpc.gamut_remap = 0;
-       dc->caps.color.mpc.num_3dluts = 0;
-       dc->caps.color.mpc.shared_3d_lut = 0;
-       dc->caps.color.mpc.ogam_ram = 1;
-       dc->caps.color.mpc.ogam_rom_caps.srgb = 0;
-       dc->caps.color.mpc.ogam_rom_caps.bt2020 = 0;
-       dc->caps.color.mpc.ogam_rom_caps.gamma2_2 = 0;
-       dc->caps.color.mpc.ogam_rom_caps.pq = 0;
-       dc->caps.color.mpc.ogam_rom_caps.hlg = 0;
-       dc->caps.color.mpc.ocsc = 1;
-
-       dc->caps.dp_hdmi21_pcon_support = true;
-
-       if (dc->ctx->dce_environment == DCE_ENV_PRODUCTION_DRV)
-               dc->debug = debug_defaults_drv;
-
-       // Init the vm_helper
-       if (dc->vm_helper)
-               vm_helper_init(dc->vm_helper, 16);
-
-       /*************************************************
-        *  Create resources                             *
-        *************************************************/
-
-       pool->base.clock_sources[DCN20_CLK_SRC_PLL0] =
-                       dcn21_clock_source_create(ctx, ctx->dc_bios,
-                               CLOCK_SOURCE_COMBO_PHY_PLL0,
-                               &clk_src_regs[0], false);
-       pool->base.clock_sources[DCN20_CLK_SRC_PLL1] =
-                       dcn21_clock_source_create(ctx, ctx->dc_bios,
-                               CLOCK_SOURCE_COMBO_PHY_PLL1,
-                               &clk_src_regs[1], false);
-       pool->base.clock_sources[DCN20_CLK_SRC_PLL2] =
-                       dcn21_clock_source_create(ctx, ctx->dc_bios,
-                               CLOCK_SOURCE_COMBO_PHY_PLL2,
-                               &clk_src_regs[2], false);
-       pool->base.clock_sources[DCN20_CLK_SRC_PLL3] =
-                       dcn21_clock_source_create(ctx, ctx->dc_bios,
-                               CLOCK_SOURCE_COMBO_PHY_PLL3,
-                               &clk_src_regs[3], false);
-       pool->base.clock_sources[DCN20_CLK_SRC_PLL4] =
-                       dcn21_clock_source_create(ctx, ctx->dc_bios,
-                               CLOCK_SOURCE_COMBO_PHY_PLL4,
-                               &clk_src_regs[4], false);
-
-       pool->base.clk_src_count = DCN20_CLK_SRC_TOTAL_DCN21;
-
-       /* todo: not reuse phy_pll registers */
-       pool->base.dp_clock_source =
-                       dcn21_clock_source_create(ctx, ctx->dc_bios,
-                               CLOCK_SOURCE_ID_DP_DTO,
-                               &clk_src_regs[0], true);
-
-       for (i = 0; i < pool->base.clk_src_count; i++) {
-               if (pool->base.clock_sources[i] == NULL) {
-                       dm_error("DC: failed to create clock sources!\n");
-                       BREAK_TO_DEBUGGER();
-                       goto create_fail;
-               }
-       }
-
-       pool->base.dccg = dccg21_create(ctx, &dccg_regs, &dccg_shift, &dccg_mask);
-       if (pool->base.dccg == NULL) {
-               dm_error("DC: failed to create dccg!\n");
-               BREAK_TO_DEBUGGER();
-               goto create_fail;
-       }
-
-       if (!dc->config.disable_dmcu) {
-               pool->base.dmcu = dcn21_dmcu_create(ctx,
-                               &dmcu_regs,
-                               &dmcu_shift,
-                               &dmcu_mask);
-               if (pool->base.dmcu == NULL) {
-                       dm_error("DC: failed to create dmcu!\n");
-                       BREAK_TO_DEBUGGER();
-                       goto create_fail;
-               }
-
-               dc->debug.dmub_command_table = false;
-       }
-
-       if (dc->config.disable_dmcu) {
-               pool->base.psr = dmub_psr_create(ctx);
-
-               if (pool->base.psr == NULL) {
-                       dm_error("DC: failed to create psr obj!\n");
-                       BREAK_TO_DEBUGGER();
-                       goto create_fail;
-               }
-       }
-
-       if (dc->config.disable_dmcu)
-               pool->base.abm = dmub_abm_create(ctx,
-                       &abm_regs,
-                       &abm_shift,
-                       &abm_mask);
-       else
-               pool->base.abm = dce_abm_create(ctx,
-                       &abm_regs,
-                       &abm_shift,
-                       &abm_mask);
-
-       pool->base.pp_smu = dcn21_pp_smu_create(ctx);
-
-       num_pipes = dcn2_1_ip.max_num_dpp;
-
-       for (i = 0; i < dcn2_1_ip.max_num_dpp; i++)
-               if (pipe_fuses & 1 << i)
-                       num_pipes--;
-       dcn2_1_ip.max_num_dpp = num_pipes;
-       dcn2_1_ip.max_num_otg = num_pipes;
-
-       dml_init_instance(&dc->dml, &dcn2_1_soc, &dcn2_1_ip, DML_PROJECT_DCN21);
-
-       init_data.ctx = dc->ctx;
-       pool->base.irqs = dal_irq_service_dcn21_create(&init_data);
-       if (!pool->base.irqs)
-               goto create_fail;
-
-       j = 0;
-       /* mem input -> ipp -> dpp -> opp -> TG */
-       for (i = 0; i < pool->base.pipe_count; i++) {
-               /* if pipe is disabled, skip instance of HW pipe,
-                * i.e, skip ASIC register instance
-                */
-               if ((pipe_fuses & (1 << i)) != 0)
-                       continue;
-
-               pool->base.hubps[j] = dcn21_hubp_create(ctx, i);
-               if (pool->base.hubps[j] == NULL) {
-                       BREAK_TO_DEBUGGER();
-                       dm_error(
-                               "DC: failed to create memory input!\n");
-                       goto create_fail;
-               }
-
-               pool->base.ipps[j] = dcn21_ipp_create(ctx, i);
-               if (pool->base.ipps[j] == NULL) {
-                       BREAK_TO_DEBUGGER();
-                       dm_error(
-                               "DC: failed to create input pixel processor!\n");
-                       goto create_fail;
-               }
-
-               pool->base.dpps[j] = dcn21_dpp_create(ctx, i);
-               if (pool->base.dpps[j] == NULL) {
-                       BREAK_TO_DEBUGGER();
-                       dm_error(
-                               "DC: failed to create dpps!\n");
-                       goto create_fail;
-               }
-
-               pool->base.opps[j] = dcn21_opp_create(ctx, i);
-               if (pool->base.opps[j] == NULL) {
-                       BREAK_TO_DEBUGGER();
-                       dm_error(
-                               "DC: failed to create output pixel processor!\n");
-                       goto create_fail;
-               }
-
-               pool->base.timing_generators[j] = dcn21_timing_generator_create(
-                               ctx, i);
-               if (pool->base.timing_generators[j] == NULL) {
-                       BREAK_TO_DEBUGGER();
-                       dm_error("DC: failed to create tg!\n");
-                       goto create_fail;
-               }
-               j++;
-       }
-
-       for (i = 0; i < pool->base.res_cap->num_ddc; i++) {
-               pool->base.engines[i] = dcn21_aux_engine_create(ctx, i);
-               if (pool->base.engines[i] == NULL) {
-                       BREAK_TO_DEBUGGER();
-                       dm_error(
-                               "DC:failed to create aux engine!!\n");
-                       goto create_fail;
-               }
-               pool->base.hw_i2cs[i] = dcn21_i2c_hw_create(ctx, i);
-               if (pool->base.hw_i2cs[i] == NULL) {
-                       BREAK_TO_DEBUGGER();
-                       dm_error(
-                               "DC:failed to create hw i2c!!\n");
-                       goto create_fail;
-               }
-               pool->base.sw_i2cs[i] = NULL;
-       }
-
-       pool->base.timing_generator_count = j;
-       pool->base.pipe_count = j;
-       pool->base.mpcc_count = j;
-
-       pool->base.mpc = dcn21_mpc_create(ctx);
-       if (pool->base.mpc == NULL) {
-               BREAK_TO_DEBUGGER();
-               dm_error("DC: failed to create mpc!\n");
-               goto create_fail;
-       }
-
-       pool->base.hubbub = dcn21_hubbub_create(ctx);
-       if (pool->base.hubbub == NULL) {
-               BREAK_TO_DEBUGGER();
-               dm_error("DC: failed to create hubbub!\n");
-               goto create_fail;
-       }
-
-       for (i = 0; i < pool->base.res_cap->num_dsc; i++) {
-               pool->base.dscs[i] = dcn21_dsc_create(ctx, i);
-               if (pool->base.dscs[i] == NULL) {
-                       BREAK_TO_DEBUGGER();
-                       dm_error("DC: failed to create display stream compressor %d!\n", i);
-                       goto create_fail;
-               }
-       }
-
-       if (!dcn20_dwbc_create(ctx, &pool->base)) {
-               BREAK_TO_DEBUGGER();
-               dm_error("DC: failed to create dwbc!\n");
-               goto create_fail;
-       }
-       if (!dcn20_mmhubbub_create(ctx, &pool->base)) {
-               BREAK_TO_DEBUGGER();
-               dm_error("DC: failed to create mcif_wb!\n");
-               goto create_fail;
-       }
-
-       if (!resource_construct(num_virtual_links, dc, &pool->base,
-                       &res_create_funcs))
-               goto create_fail;
-
-       dcn21_hw_sequencer_construct(dc);
-
-       dc->caps.max_planes =  pool->base.pipe_count;
-
-       for (i = 0; i < dc->caps.max_planes; ++i)
-               dc->caps.planes[i] = plane_cap;
-
-       dc->cap_funcs = cap_funcs;
-
-       return true;
-
-create_fail:
-
-       dcn21_resource_destruct(pool);
-
-       return false;
-}
-
-struct resource_pool *dcn21_create_resource_pool(
-               const struct dc_init_data *init_data,
-               struct dc *dc)
-{
-       struct dcn21_resource_pool *pool =
-               kzalloc(sizeof(struct dcn21_resource_pool), GFP_KERNEL);
-
-       if (!pool)
-               return NULL;
-
-       if (dcn21_resource_construct(init_data->num_virtual_links, dc, pool))
-               return &pool->base;
-
-       BREAK_TO_DEBUGGER();
-       kfree(pool);
-       return NULL;
-}
diff --git a/drivers/gpu/drm/amd/display/dc/dcn21/dcn21_resource.h b/drivers/gpu/drm/amd/display/dc/dcn21/dcn21_resource.h
deleted file mode 100644 (file)
index f7ecc00..0000000
+++ /dev/null
@@ -1,56 +0,0 @@
-/*
- * Copyright 2018 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 _DCN21_RESOURCE_H_
-#define _DCN21_RESOURCE_H_
-
-#include "core_types.h"
-
-#define TO_DCN21_RES_POOL(pool)\
-       container_of(pool, struct dcn21_resource_pool, base)
-
-struct dc;
-struct resource_pool;
-struct _vcs_dpi_display_pipe_params_st;
-
-extern struct _vcs_dpi_ip_params_st dcn2_1_ip;
-extern struct _vcs_dpi_soc_bounding_box_st dcn2_1_soc;
-
-struct dcn21_resource_pool {
-       struct resource_pool base;
-};
-struct resource_pool *dcn21_create_resource_pool(
-               const struct dc_init_data *init_data,
-               struct dc *dc);
-bool dcn21_fast_validate_bw(
-               struct dc *dc,
-               struct dc_state *context,
-               display_e2e_pipe_params_st *pipes,
-               int *pipe_cnt_out,
-               int *pipe_split_from,
-               int *vlevel_out,
-               bool fast_validate);
-
-#endif /* _DCN21_RESOURCE_H_ */
index af4d2065d2c13fe757411ab5be29ccce29d44024..9dcf06c0954d59b715a72c80a0c2ee04fcf1e60c 100644 (file)
@@ -38,7 +38,6 @@ DCN30 := \
        dcn30_dwb_cm.o \
        dcn30_cm_common.o \
        dcn30_mmhubbub.o \
-       dcn30_resource.o \
        dcn30_dio_link_encoder.o
 
 
diff --git a/drivers/gpu/drm/amd/display/dc/dcn30/dcn30_resource.c b/drivers/gpu/drm/amd/display/dc/dcn30/dcn30_resource.c
deleted file mode 100644 (file)
index 7b259cb..0000000
+++ /dev/null
@@ -1,2611 +0,0 @@
-/*
- * 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
- *
- */
-
-
-#include "dm_services.h"
-#include "dc.h"
-
-#include "dcn30_init.h"
-
-#include "resource.h"
-#include "include/irq_service_interface.h"
-#include "dcn20/dcn20_resource.h"
-
-#include "dcn30_resource.h"
-
-#include "dcn10/dcn10_ipp.h"
-#include "dcn30/dcn30_hubbub.h"
-#include "dcn30/dcn30_mpc.h"
-#include "dcn30/dcn30_hubp.h"
-#include "irq/dcn30/irq_service_dcn30.h"
-#include "dcn30/dcn30_dpp.h"
-#include "dcn30/dcn30_optc.h"
-#include "dcn20/dcn20_hwseq.h"
-#include "dcn30/dcn30_hwseq.h"
-#include "dce110/dce110_hwseq.h"
-#include "dcn30/dcn30_opp.h"
-#include "dcn20/dcn20_dsc.h"
-#include "dcn30/dcn30_vpg.h"
-#include "dcn30/dcn30_afmt.h"
-#include "dcn30/dcn30_dio_stream_encoder.h"
-#include "dcn30/dcn30_dio_link_encoder.h"
-#include "dce/dce_clock_source.h"
-#include "dce/dce_audio.h"
-#include "dce/dce_hwseq.h"
-#include "clk_mgr.h"
-#include "virtual/virtual_stream_encoder.h"
-#include "dce110/dce110_resource.h"
-#include "dml/display_mode_vba.h"
-#include "dcn30/dcn30_dccg.h"
-#include "dcn10/dcn10_resource.h"
-#include "link.h"
-#include "dce/dce_panel_cntl.h"
-
-#include "dcn30/dcn30_dwb.h"
-#include "dcn30/dcn30_mmhubbub.h"
-
-#include "sienna_cichlid_ip_offset.h"
-#include "dcn/dcn_3_0_0_offset.h"
-#include "dcn/dcn_3_0_0_sh_mask.h"
-
-#include "nbio/nbio_7_4_offset.h"
-
-#include "dpcs/dpcs_3_0_0_offset.h"
-#include "dpcs/dpcs_3_0_0_sh_mask.h"
-
-#include "mmhub/mmhub_2_0_0_offset.h"
-#include "mmhub/mmhub_2_0_0_sh_mask.h"
-
-#include "reg_helper.h"
-#include "dce/dmub_abm.h"
-#include "dce/dmub_psr.h"
-#include "dce/dce_aux.h"
-#include "dce/dce_i2c.h"
-
-#include "dml/dcn30/dcn30_fpu.h"
-#include "dml/dcn30/display_mode_vba_30.h"
-#include "vm_helper.h"
-#include "dcn20/dcn20_vmid.h"
-#include "amdgpu_socbb.h"
-#include "dc_dmub_srv.h"
-
-#define DC_LOGGER \
-       dc->ctx->logger
-#define DC_LOGGER_INIT(logger)
-
-enum dcn30_clk_src_array_id {
-       DCN30_CLK_SRC_PLL0,
-       DCN30_CLK_SRC_PLL1,
-       DCN30_CLK_SRC_PLL2,
-       DCN30_CLK_SRC_PLL3,
-       DCN30_CLK_SRC_PLL4,
-       DCN30_CLK_SRC_PLL5,
-       DCN30_CLK_SRC_TOTAL
-};
-
-/* begin *********************
- * macros to expend register list macro defined in HW object header file
- */
-
-/* DCN */
-#define BASE_INNER(seg) DCN_BASE__INST0_SEG ## seg
-
-#define BASE(seg) BASE_INNER(seg)
-
-#define SR(reg_name)\
-               .reg_name = BASE(mm ## reg_name ## _BASE_IDX) +  \
-                                       mm ## reg_name
-
-#define SRI(reg_name, block, id)\
-       .reg_name = BASE(mm ## block ## id ## _ ## reg_name ## _BASE_IDX) + \
-                                       mm ## block ## id ## _ ## reg_name
-
-#define SRI2(reg_name, block, id)\
-       .reg_name = BASE(mm ## reg_name ## _BASE_IDX) + \
-                                       mm ## reg_name
-
-#define SRIR(var_name, reg_name, block, id)\
-       .var_name = BASE(mm ## block ## id ## _ ## reg_name ## _BASE_IDX) + \
-                                       mm ## block ## id ## _ ## reg_name
-
-#define SRII(reg_name, block, id)\
-       .reg_name[id] = BASE(mm ## block ## id ## _ ## reg_name ## _BASE_IDX) + \
-                                       mm ## block ## id ## _ ## reg_name
-
-#define SRII_MPC_RMU(reg_name, block, id)\
-       .RMU##_##reg_name[id] = BASE(mm ## block ## id ## _ ## reg_name ## _BASE_IDX) + \
-                                       mm ## block ## id ## _ ## reg_name
-
-#define SRII_DWB(reg_name, temp_name, block, id)\
-       .reg_name[id] = BASE(mm ## block ## id ## _ ## temp_name ## _BASE_IDX) + \
-                                       mm ## block ## id ## _ ## temp_name
-
-#define SF_DWB2(reg_name, block, id, field_name, post_fix)     \
-       .field_name = reg_name ## __ ## field_name ## post_fix
-
-#define DCCG_SRII(reg_name, block, id)\
-       .block ## _ ## reg_name[id] = BASE(mm ## block ## id ## _ ## reg_name ## _BASE_IDX) + \
-                                       mm ## block ## id ## _ ## reg_name
-
-#define VUPDATE_SRII(reg_name, block, id)\
-       .reg_name[id] = BASE(mm ## reg_name ## _ ## block ## id ## _BASE_IDX) + \
-                                       mm ## reg_name ## _ ## block ## id
-
-/* NBIO */
-#define NBIO_BASE_INNER(seg) \
-       NBIO_BASE__INST0_SEG ## seg
-
-#define NBIO_BASE(seg) \
-       NBIO_BASE_INNER(seg)
-
-#define NBIO_SR(reg_name)\
-               .reg_name = NBIO_BASE(mm ## reg_name ## _BASE_IDX) + \
-                                       mm ## reg_name
-
-/* MMHUB */
-#define MMHUB_BASE_INNER(seg) \
-       MMHUB_BASE__INST0_SEG ## seg
-
-#define MMHUB_BASE(seg) \
-       MMHUB_BASE_INNER(seg)
-
-#define MMHUB_SR(reg_name)\
-               .reg_name = MMHUB_BASE(mmMM ## reg_name ## _BASE_IDX) + \
-                                       mmMM ## reg_name
-
-/* CLOCK */
-#define CLK_BASE_INNER(seg) \
-       CLK_BASE__INST0_SEG ## seg
-
-#define CLK_BASE(seg) \
-       CLK_BASE_INNER(seg)
-
-#define CLK_SRI(reg_name, block, inst)\
-       .reg_name = CLK_BASE(mm ## block ## _ ## inst ## _ ## reg_name ## _BASE_IDX) + \
-                                       mm ## block ## _ ## inst ## _ ## reg_name
-
-
-static const struct bios_registers bios_regs = {
-               NBIO_SR(BIOS_SCRATCH_3),
-               NBIO_SR(BIOS_SCRATCH_6)
-};
-
-#define clk_src_regs(index, pllid)\
-[index] = {\
-       CS_COMMON_REG_LIST_DCN2_0(index, pllid),\
-}
-
-static const struct dce110_clk_src_regs clk_src_regs[] = {
-       clk_src_regs(0, A),
-       clk_src_regs(1, B),
-       clk_src_regs(2, C),
-       clk_src_regs(3, D),
-       clk_src_regs(4, E),
-       clk_src_regs(5, F)
-};
-
-static const struct dce110_clk_src_shift cs_shift = {
-               CS_COMMON_MASK_SH_LIST_DCN2_0(__SHIFT)
-};
-
-static const struct dce110_clk_src_mask cs_mask = {
-               CS_COMMON_MASK_SH_LIST_DCN2_0(_MASK)
-};
-
-#define abm_regs(id)\
-[id] = {\
-               ABM_DCN30_REG_LIST(id)\
-}
-
-static const struct dce_abm_registers abm_regs[] = {
-               abm_regs(0),
-               abm_regs(1),
-               abm_regs(2),
-               abm_regs(3),
-               abm_regs(4),
-               abm_regs(5),
-};
-
-static const struct dce_abm_shift abm_shift = {
-               ABM_MASK_SH_LIST_DCN30(__SHIFT)
-};
-
-static const struct dce_abm_mask abm_mask = {
-               ABM_MASK_SH_LIST_DCN30(_MASK)
-};
-
-
-
-#define audio_regs(id)\
-[id] = {\
-               AUD_COMMON_REG_LIST(id)\
-}
-
-static const struct dce_audio_registers audio_regs[] = {
-       audio_regs(0),
-       audio_regs(1),
-       audio_regs(2),
-       audio_regs(3),
-       audio_regs(4),
-       audio_regs(5),
-       audio_regs(6)
-};
-
-#define DCE120_AUD_COMMON_MASK_SH_LIST(mask_sh)\
-               SF(AZF0ENDPOINT0_AZALIA_F0_CODEC_ENDPOINT_INDEX, AZALIA_ENDPOINT_REG_INDEX, mask_sh),\
-               SF(AZF0ENDPOINT0_AZALIA_F0_CODEC_ENDPOINT_DATA, AZALIA_ENDPOINT_REG_DATA, mask_sh),\
-               AUD_COMMON_MASK_SH_LIST_BASE(mask_sh)
-
-static const struct dce_audio_shift audio_shift = {
-               DCE120_AUD_COMMON_MASK_SH_LIST(__SHIFT)
-};
-
-static const struct dce_audio_mask audio_mask = {
-               DCE120_AUD_COMMON_MASK_SH_LIST(_MASK)
-};
-
-#define vpg_regs(id)\
-[id] = {\
-       VPG_DCN3_REG_LIST(id)\
-}
-
-static const struct dcn30_vpg_registers vpg_regs[] = {
-       vpg_regs(0),
-       vpg_regs(1),
-       vpg_regs(2),
-       vpg_regs(3),
-       vpg_regs(4),
-       vpg_regs(5),
-       vpg_regs(6),
-};
-
-static const struct dcn30_vpg_shift vpg_shift = {
-       DCN3_VPG_MASK_SH_LIST(__SHIFT)
-};
-
-static const struct dcn30_vpg_mask vpg_mask = {
-       DCN3_VPG_MASK_SH_LIST(_MASK)
-};
-
-#define afmt_regs(id)\
-[id] = {\
-       AFMT_DCN3_REG_LIST(id)\
-}
-
-static const struct dcn30_afmt_registers afmt_regs[] = {
-       afmt_regs(0),
-       afmt_regs(1),
-       afmt_regs(2),
-       afmt_regs(3),
-       afmt_regs(4),
-       afmt_regs(5),
-       afmt_regs(6),
-};
-
-static const struct dcn30_afmt_shift afmt_shift = {
-       DCN3_AFMT_MASK_SH_LIST(__SHIFT)
-};
-
-static const struct dcn30_afmt_mask afmt_mask = {
-       DCN3_AFMT_MASK_SH_LIST(_MASK)
-};
-
-#define stream_enc_regs(id)\
-[id] = {\
-       SE_DCN3_REG_LIST(id)\
-}
-
-static const struct dcn10_stream_enc_registers stream_enc_regs[] = {
-       stream_enc_regs(0),
-       stream_enc_regs(1),
-       stream_enc_regs(2),
-       stream_enc_regs(3),
-       stream_enc_regs(4),
-       stream_enc_regs(5)
-};
-
-static const struct dcn10_stream_encoder_shift se_shift = {
-               SE_COMMON_MASK_SH_LIST_DCN30(__SHIFT)
-};
-
-static const struct dcn10_stream_encoder_mask se_mask = {
-               SE_COMMON_MASK_SH_LIST_DCN30(_MASK)
-};
-
-
-#define aux_regs(id)\
-[id] = {\
-       DCN2_AUX_REG_LIST(id)\
-}
-
-static const struct dcn10_link_enc_aux_registers link_enc_aux_regs[] = {
-               aux_regs(0),
-               aux_regs(1),
-               aux_regs(2),
-               aux_regs(3),
-               aux_regs(4),
-               aux_regs(5)
-};
-
-#define hpd_regs(id)\
-[id] = {\
-       HPD_REG_LIST(id)\
-}
-
-static const struct dcn10_link_enc_hpd_registers link_enc_hpd_regs[] = {
-               hpd_regs(0),
-               hpd_regs(1),
-               hpd_regs(2),
-               hpd_regs(3),
-               hpd_regs(4),
-               hpd_regs(5)
-};
-
-#define link_regs(id, phyid)\
-[id] = {\
-       LE_DCN3_REG_LIST(id), \
-       UNIPHY_DCN2_REG_LIST(phyid), \
-       DPCS_DCN2_REG_LIST(id), \
-       SRI(DP_DPHY_INTERNAL_CTRL, DP, id) \
-}
-
-static const struct dce110_aux_registers_shift aux_shift = {
-       DCN_AUX_MASK_SH_LIST(__SHIFT)
-};
-
-static const struct dce110_aux_registers_mask aux_mask = {
-       DCN_AUX_MASK_SH_LIST(_MASK)
-};
-
-static const struct dcn10_link_enc_registers link_enc_regs[] = {
-       link_regs(0, A),
-       link_regs(1, B),
-       link_regs(2, C),
-       link_regs(3, D),
-       link_regs(4, E),
-       link_regs(5, F)
-};
-
-static const struct dcn10_link_enc_shift le_shift = {
-       LINK_ENCODER_MASK_SH_LIST_DCN30(__SHIFT),\
-       DPCS_DCN2_MASK_SH_LIST(__SHIFT)
-};
-
-static const struct dcn10_link_enc_mask le_mask = {
-       LINK_ENCODER_MASK_SH_LIST_DCN30(_MASK),\
-       DPCS_DCN2_MASK_SH_LIST(_MASK)
-};
-
-
-static const struct dce_panel_cntl_registers panel_cntl_regs[] = {
-       { DCN_PANEL_CNTL_REG_LIST() }
-};
-
-static const struct dce_panel_cntl_shift panel_cntl_shift = {
-       DCE_PANEL_CNTL_MASK_SH_LIST(__SHIFT)
-};
-
-static const struct dce_panel_cntl_mask panel_cntl_mask = {
-       DCE_PANEL_CNTL_MASK_SH_LIST(_MASK)
-};
-
-#define dpp_regs(id)\
-[id] = {\
-       DPP_REG_LIST_DCN30(id),\
-}
-
-static const struct dcn3_dpp_registers dpp_regs[] = {
-       dpp_regs(0),
-       dpp_regs(1),
-       dpp_regs(2),
-       dpp_regs(3),
-       dpp_regs(4),
-       dpp_regs(5),
-};
-
-static const struct dcn3_dpp_shift tf_shift = {
-               DPP_REG_LIST_SH_MASK_DCN30(__SHIFT)
-};
-
-static const struct dcn3_dpp_mask tf_mask = {
-               DPP_REG_LIST_SH_MASK_DCN30(_MASK)
-};
-
-#define opp_regs(id)\
-[id] = {\
-       OPP_REG_LIST_DCN30(id),\
-}
-
-static const struct dcn20_opp_registers opp_regs[] = {
-       opp_regs(0),
-       opp_regs(1),
-       opp_regs(2),
-       opp_regs(3),
-       opp_regs(4),
-       opp_regs(5)
-};
-
-static const struct dcn20_opp_shift opp_shift = {
-       OPP_MASK_SH_LIST_DCN20(__SHIFT)
-};
-
-static const struct dcn20_opp_mask opp_mask = {
-       OPP_MASK_SH_LIST_DCN20(_MASK)
-};
-
-#define aux_engine_regs(id)\
-[id] = {\
-       AUX_COMMON_REG_LIST0(id), \
-       .AUXN_IMPCAL = 0, \
-       .AUXP_IMPCAL = 0, \
-       .AUX_RESET_MASK = DP_AUX0_AUX_CONTROL__AUX_RESET_MASK, \
-}
-
-static const struct dce110_aux_registers aux_engine_regs[] = {
-               aux_engine_regs(0),
-               aux_engine_regs(1),
-               aux_engine_regs(2),
-               aux_engine_regs(3),
-               aux_engine_regs(4),
-               aux_engine_regs(5)
-};
-
-#define dwbc_regs_dcn3(id)\
-[id] = {\
-       DWBC_COMMON_REG_LIST_DCN30(id),\
-}
-
-static const struct dcn30_dwbc_registers dwbc30_regs[] = {
-       dwbc_regs_dcn3(0),
-};
-
-static const struct dcn30_dwbc_shift dwbc30_shift = {
-       DWBC_COMMON_MASK_SH_LIST_DCN30(__SHIFT)
-};
-
-static const struct dcn30_dwbc_mask dwbc30_mask = {
-       DWBC_COMMON_MASK_SH_LIST_DCN30(_MASK)
-};
-
-#define mcif_wb_regs_dcn3(id)\
-[id] = {\
-       MCIF_WB_COMMON_REG_LIST_DCN30(id),\
-}
-
-static const struct dcn30_mmhubbub_registers mcif_wb30_regs[] = {
-       mcif_wb_regs_dcn3(0)
-};
-
-static const struct dcn30_mmhubbub_shift mcif_wb30_shift = {
-       MCIF_WB_COMMON_MASK_SH_LIST_DCN30(__SHIFT)
-};
-
-static const struct dcn30_mmhubbub_mask mcif_wb30_mask = {
-       MCIF_WB_COMMON_MASK_SH_LIST_DCN30(_MASK)
-};
-
-#define dsc_regsDCN20(id)\
-[id] = {\
-       DSC_REG_LIST_DCN20(id)\
-}
-
-static const struct dcn20_dsc_registers dsc_regs[] = {
-       dsc_regsDCN20(0),
-       dsc_regsDCN20(1),
-       dsc_regsDCN20(2),
-       dsc_regsDCN20(3),
-       dsc_regsDCN20(4),
-       dsc_regsDCN20(5)
-};
-
-static const struct dcn20_dsc_shift dsc_shift = {
-       DSC_REG_LIST_SH_MASK_DCN20(__SHIFT)
-};
-
-static const struct dcn20_dsc_mask dsc_mask = {
-       DSC_REG_LIST_SH_MASK_DCN20(_MASK)
-};
-
-static const struct dcn30_mpc_registers mpc_regs = {
-               MPC_REG_LIST_DCN3_0(0),
-               MPC_REG_LIST_DCN3_0(1),
-               MPC_REG_LIST_DCN3_0(2),
-               MPC_REG_LIST_DCN3_0(3),
-               MPC_REG_LIST_DCN3_0(4),
-               MPC_REG_LIST_DCN3_0(5),
-               MPC_OUT_MUX_REG_LIST_DCN3_0(0),
-               MPC_OUT_MUX_REG_LIST_DCN3_0(1),
-               MPC_OUT_MUX_REG_LIST_DCN3_0(2),
-               MPC_OUT_MUX_REG_LIST_DCN3_0(3),
-               MPC_OUT_MUX_REG_LIST_DCN3_0(4),
-               MPC_OUT_MUX_REG_LIST_DCN3_0(5),
-               MPC_RMU_GLOBAL_REG_LIST_DCN3AG,
-               MPC_RMU_REG_LIST_DCN3AG(0),
-               MPC_RMU_REG_LIST_DCN3AG(1),
-               MPC_RMU_REG_LIST_DCN3AG(2),
-               MPC_DWB_MUX_REG_LIST_DCN3_0(0),
-};
-
-static const struct dcn30_mpc_shift mpc_shift = {
-       MPC_COMMON_MASK_SH_LIST_DCN30(__SHIFT)
-};
-
-static const struct dcn30_mpc_mask mpc_mask = {
-       MPC_COMMON_MASK_SH_LIST_DCN30(_MASK)
-};
-
-#define optc_regs(id)\
-[id] = {OPTC_COMMON_REG_LIST_DCN3_0(id)}
-
-
-static const struct dcn_optc_registers optc_regs[] = {
-       optc_regs(0),
-       optc_regs(1),
-       optc_regs(2),
-       optc_regs(3),
-       optc_regs(4),
-       optc_regs(5)
-};
-
-static const struct dcn_optc_shift optc_shift = {
-       OPTC_COMMON_MASK_SH_LIST_DCN30(__SHIFT)
-};
-
-static const struct dcn_optc_mask optc_mask = {
-       OPTC_COMMON_MASK_SH_LIST_DCN30(_MASK)
-};
-
-#define hubp_regs(id)\
-[id] = {\
-       HUBP_REG_LIST_DCN30(id)\
-}
-
-static const struct dcn_hubp2_registers hubp_regs[] = {
-               hubp_regs(0),
-               hubp_regs(1),
-               hubp_regs(2),
-               hubp_regs(3),
-               hubp_regs(4),
-               hubp_regs(5)
-};
-
-static const struct dcn_hubp2_shift hubp_shift = {
-               HUBP_MASK_SH_LIST_DCN30(__SHIFT)
-};
-
-static const struct dcn_hubp2_mask hubp_mask = {
-               HUBP_MASK_SH_LIST_DCN30(_MASK)
-};
-
-static const struct dcn_hubbub_registers hubbub_reg = {
-               HUBBUB_REG_LIST_DCN30(0)
-};
-
-static const struct dcn_hubbub_shift hubbub_shift = {
-               HUBBUB_MASK_SH_LIST_DCN30(__SHIFT)
-};
-
-static const struct dcn_hubbub_mask hubbub_mask = {
-               HUBBUB_MASK_SH_LIST_DCN30(_MASK)
-};
-
-static const struct dccg_registers dccg_regs = {
-               DCCG_REG_LIST_DCN30()
-};
-
-static const struct dccg_shift dccg_shift = {
-               DCCG_MASK_SH_LIST_DCN3(__SHIFT)
-};
-
-static const struct dccg_mask dccg_mask = {
-               DCCG_MASK_SH_LIST_DCN3(_MASK)
-};
-
-static const struct dce_hwseq_registers hwseq_reg = {
-               HWSEQ_DCN30_REG_LIST()
-};
-
-static const struct dce_hwseq_shift hwseq_shift = {
-               HWSEQ_DCN30_MASK_SH_LIST(__SHIFT)
-};
-
-static const struct dce_hwseq_mask hwseq_mask = {
-               HWSEQ_DCN30_MASK_SH_LIST(_MASK)
-};
-#define vmid_regs(id)\
-[id] = {\
-               DCN20_VMID_REG_LIST(id)\
-}
-
-static const struct dcn_vmid_registers vmid_regs[] = {
-       vmid_regs(0),
-       vmid_regs(1),
-       vmid_regs(2),
-       vmid_regs(3),
-       vmid_regs(4),
-       vmid_regs(5),
-       vmid_regs(6),
-       vmid_regs(7),
-       vmid_regs(8),
-       vmid_regs(9),
-       vmid_regs(10),
-       vmid_regs(11),
-       vmid_regs(12),
-       vmid_regs(13),
-       vmid_regs(14),
-       vmid_regs(15)
-};
-
-static const struct dcn20_vmid_shift vmid_shifts = {
-               DCN20_VMID_MASK_SH_LIST(__SHIFT)
-};
-
-static const struct dcn20_vmid_mask vmid_masks = {
-               DCN20_VMID_MASK_SH_LIST(_MASK)
-};
-
-static const struct resource_caps res_cap_dcn3 = {
-       .num_timing_generator = 6,
-       .num_opp = 6,
-       .num_video_plane = 6,
-       .num_audio = 6,
-       .num_stream_encoder = 6,
-       .num_pll = 6,
-       .num_dwb = 1,
-       .num_ddc = 6,
-       .num_vmid = 16,
-       .num_mpc_3dlut = 3,
-       .num_dsc = 6,
-};
-
-static const struct dc_plane_cap plane_cap = {
-       .type = DC_PLANE_TYPE_DCN_UNIVERSAL,
-       .per_pixel_alpha = true,
-
-       .pixel_format_support = {
-                       .argb8888 = true,
-                       .nv12 = true,
-                       .fp16 = true,
-                       .p010 = true,
-                       .ayuv = false,
-       },
-
-       .max_upscale_factor = {
-                       .argb8888 = 16000,
-                       .nv12 = 16000,
-                       .fp16 = 16000
-       },
-
-       /* 6:1 downscaling ratio: 1000/6 = 166.666 */
-       .max_downscale_factor = {
-                       .argb8888 = 167,
-                       .nv12 = 167,
-                       .fp16 = 167
-       },
-       16,
-       16
-};
-
-static const struct dc_debug_options debug_defaults_drv = {
-       .disable_dmcu = true, //No DMCU on DCN30
-       .force_abm_enable = false,
-       .timing_trace = false,
-       .clock_trace = true,
-       .disable_pplib_clock_request = true,
-       .pipe_split_policy = MPC_SPLIT_DYNAMIC,
-       .force_single_disp_pipe_split = false,
-       .disable_dcc = DCC_ENABLE,
-       .vsr_support = true,
-       .performance_trace = false,
-       .max_downscale_src_width = 7680,/*upto 8K*/
-       .disable_pplib_wm_range = false,
-       .scl_reset_length10 = true,
-       .sanity_checks = false,
-       .underflow_assert_delay_us = 0xFFFFFFFF,
-       .dwb_fi_phase = -1, // -1 = disable,
-       .dmub_command_table = true,
-       .use_max_lb = true,
-       .exit_idle_opt_for_cursor_updates = true,
-       .enable_legacy_fast_update = false,
-       .using_dml2 = false,
-};
-
-static const struct dc_panel_config panel_config_defaults = {
-       .psr = {
-               .disable_psr = false,
-               .disallow_psrsu = false,
-               .disallow_replay = false,
-       },
-};
-
-static void dcn30_dpp_destroy(struct dpp **dpp)
-{
-       kfree(TO_DCN20_DPP(*dpp));
-       *dpp = NULL;
-}
-
-static struct dpp *dcn30_dpp_create(
-       struct dc_context *ctx,
-       uint32_t inst)
-{
-       struct dcn3_dpp *dpp =
-               kzalloc(sizeof(struct dcn3_dpp), GFP_KERNEL);
-
-       if (!dpp)
-               return NULL;
-
-       if (dpp3_construct(dpp, ctx, inst,
-                       &dpp_regs[inst], &tf_shift, &tf_mask))
-               return &dpp->base;
-
-       BREAK_TO_DEBUGGER();
-       kfree(dpp);
-       return NULL;
-}
-
-static struct output_pixel_processor *dcn30_opp_create(
-       struct dc_context *ctx, uint32_t inst)
-{
-       struct dcn20_opp *opp =
-               kzalloc(sizeof(struct dcn20_opp), GFP_KERNEL);
-
-       if (!opp) {
-               BREAK_TO_DEBUGGER();
-               return NULL;
-       }
-
-       dcn20_opp_construct(opp, ctx, inst,
-                       &opp_regs[inst], &opp_shift, &opp_mask);
-       return &opp->base;
-}
-
-static struct dce_aux *dcn30_aux_engine_create(
-       struct dc_context *ctx,
-       uint32_t inst)
-{
-       struct aux_engine_dce110 *aux_engine =
-               kzalloc(sizeof(struct aux_engine_dce110), GFP_KERNEL);
-
-       if (!aux_engine)
-               return NULL;
-
-       dce110_aux_engine_construct(aux_engine, ctx, inst,
-                                   SW_AUX_TIMEOUT_PERIOD_MULTIPLIER * AUX_TIMEOUT_PERIOD,
-                                   &aux_engine_regs[inst],
-                                       &aux_mask,
-                                       &aux_shift,
-                                       ctx->dc->caps.extended_aux_timeout_support);
-
-       return &aux_engine->base;
-}
-
-#define i2c_inst_regs(id) { I2C_HW_ENGINE_COMMON_REG_LIST_DCN30(id) }
-
-static const struct dce_i2c_registers i2c_hw_regs[] = {
-               i2c_inst_regs(1),
-               i2c_inst_regs(2),
-               i2c_inst_regs(3),
-               i2c_inst_regs(4),
-               i2c_inst_regs(5),
-               i2c_inst_regs(6),
-};
-
-static const struct dce_i2c_shift i2c_shifts = {
-               I2C_COMMON_MASK_SH_LIST_DCN30(__SHIFT)
-};
-
-static const struct dce_i2c_mask i2c_masks = {
-               I2C_COMMON_MASK_SH_LIST_DCN30(_MASK)
-};
-
-static struct dce_i2c_hw *dcn30_i2c_hw_create(
-       struct dc_context *ctx,
-       uint32_t inst)
-{
-       struct dce_i2c_hw *dce_i2c_hw =
-               kzalloc(sizeof(struct dce_i2c_hw), GFP_KERNEL);
-
-       if (!dce_i2c_hw)
-               return NULL;
-
-       dcn2_i2c_hw_construct(dce_i2c_hw, ctx, inst,
-                                   &i2c_hw_regs[inst], &i2c_shifts, &i2c_masks);
-
-       return dce_i2c_hw;
-}
-
-static struct mpc *dcn30_mpc_create(
-               struct dc_context *ctx,
-               int num_mpcc,
-               int num_rmu)
-{
-       struct dcn30_mpc *mpc30 = kzalloc(sizeof(struct dcn30_mpc),
-                                         GFP_KERNEL);
-
-       if (!mpc30)
-               return NULL;
-
-       dcn30_mpc_construct(mpc30, ctx,
-                       &mpc_regs,
-                       &mpc_shift,
-                       &mpc_mask,
-                       num_mpcc,
-                       num_rmu);
-
-       return &mpc30->base;
-}
-
-static struct hubbub *dcn30_hubbub_create(struct dc_context *ctx)
-{
-       int i;
-
-       struct dcn20_hubbub *hubbub3 = kzalloc(sizeof(struct dcn20_hubbub),
-                                         GFP_KERNEL);
-
-       if (!hubbub3)
-               return NULL;
-
-       hubbub3_construct(hubbub3, ctx,
-                       &hubbub_reg,
-                       &hubbub_shift,
-                       &hubbub_mask);
-
-
-       for (i = 0; i < res_cap_dcn3.num_vmid; i++) {
-               struct dcn20_vmid *vmid = &hubbub3->vmid[i];
-
-               vmid->ctx = ctx;
-
-               vmid->regs = &vmid_regs[i];
-               vmid->shifts = &vmid_shifts;
-               vmid->masks = &vmid_masks;
-       }
-
-       return &hubbub3->base;
-}
-
-static struct timing_generator *dcn30_timing_generator_create(
-               struct dc_context *ctx,
-               uint32_t instance)
-{
-       struct optc *tgn10 =
-               kzalloc(sizeof(struct optc), GFP_KERNEL);
-
-       if (!tgn10)
-               return NULL;
-
-       tgn10->base.inst = instance;
-       tgn10->base.ctx = ctx;
-
-       tgn10->tg_regs = &optc_regs[instance];
-       tgn10->tg_shift = &optc_shift;
-       tgn10->tg_mask = &optc_mask;
-
-       dcn30_timing_generator_init(tgn10);
-
-       return &tgn10->base;
-}
-
-static const struct encoder_feature_support link_enc_feature = {
-               .max_hdmi_deep_color = COLOR_DEPTH_121212,
-               .max_hdmi_pixel_clock = 600000,
-               .hdmi_ycbcr420_supported = true,
-               .dp_ycbcr420_supported = true,
-               .fec_supported = true,
-               .flags.bits.IS_HBR2_CAPABLE = true,
-               .flags.bits.IS_HBR3_CAPABLE = true,
-               .flags.bits.IS_TPS3_CAPABLE = true,
-               .flags.bits.IS_TPS4_CAPABLE = true
-};
-
-static struct link_encoder *dcn30_link_encoder_create(
-       struct dc_context *ctx,
-       const struct encoder_init_data *enc_init_data)
-{
-       struct dcn20_link_encoder *enc20 =
-               kzalloc(sizeof(struct dcn20_link_encoder), GFP_KERNEL);
-
-       if (!enc20)
-               return NULL;
-
-       dcn30_link_encoder_construct(enc20,
-                       enc_init_data,
-                       &link_enc_feature,
-                       &link_enc_regs[enc_init_data->transmitter],
-                       &link_enc_aux_regs[enc_init_data->channel - 1],
-                       &link_enc_hpd_regs[enc_init_data->hpd_source],
-                       &le_shift,
-                       &le_mask);
-
-       return &enc20->enc10.base;
-}
-
-static struct panel_cntl *dcn30_panel_cntl_create(const struct panel_cntl_init_data *init_data)
-{
-       struct dce_panel_cntl *panel_cntl =
-               kzalloc(sizeof(struct dce_panel_cntl), GFP_KERNEL);
-
-       if (!panel_cntl)
-               return NULL;
-
-       dce_panel_cntl_construct(panel_cntl,
-                       init_data,
-                       &panel_cntl_regs[init_data->inst],
-                       &panel_cntl_shift,
-                       &panel_cntl_mask);
-
-       return &panel_cntl->base;
-}
-
-static void read_dce_straps(
-       struct dc_context *ctx,
-       struct resource_straps *straps)
-{
-       generic_reg_get(ctx, mmDC_PINSTRAPS + BASE(mmDC_PINSTRAPS_BASE_IDX),
-               FN(DC_PINSTRAPS, DC_PINSTRAPS_AUDIO), &straps->dc_pinstraps_audio);
-
-}
-
-static struct audio *dcn30_create_audio(
-               struct dc_context *ctx, unsigned int inst)
-{
-       return dce_audio_create(ctx, inst,
-                       &audio_regs[inst], &audio_shift, &audio_mask);
-}
-
-static struct vpg *dcn30_vpg_create(
-       struct dc_context *ctx,
-       uint32_t inst)
-{
-       struct dcn30_vpg *vpg3 = kzalloc(sizeof(struct dcn30_vpg), GFP_KERNEL);
-
-       if (!vpg3)
-               return NULL;
-
-       vpg3_construct(vpg3, ctx, inst,
-                       &vpg_regs[inst],
-                       &vpg_shift,
-                       &vpg_mask);
-
-       return &vpg3->base;
-}
-
-static struct afmt *dcn30_afmt_create(
-       struct dc_context *ctx,
-       uint32_t inst)
-{
-       struct dcn30_afmt *afmt3 = kzalloc(sizeof(struct dcn30_afmt), GFP_KERNEL);
-
-       if (!afmt3)
-               return NULL;
-
-       afmt3_construct(afmt3, ctx, inst,
-                       &afmt_regs[inst],
-                       &afmt_shift,
-                       &afmt_mask);
-
-       return &afmt3->base;
-}
-
-static struct stream_encoder *dcn30_stream_encoder_create(enum engine_id eng_id,
-                                                         struct dc_context *ctx)
-{
-       struct dcn10_stream_encoder *enc1;
-       struct vpg *vpg;
-       struct afmt *afmt;
-       int vpg_inst;
-       int afmt_inst;
-
-       /* Mapping of VPG, AFMT, DME register blocks to DIO block instance */
-       if (eng_id <= ENGINE_ID_DIGF) {
-               vpg_inst = eng_id;
-               afmt_inst = eng_id;
-       } else
-               return NULL;
-
-       enc1 = kzalloc(sizeof(struct dcn10_stream_encoder), GFP_KERNEL);
-       vpg = dcn30_vpg_create(ctx, vpg_inst);
-       afmt = dcn30_afmt_create(ctx, afmt_inst);
-
-       if (!enc1 || !vpg || !afmt) {
-               kfree(enc1);
-               kfree(vpg);
-               kfree(afmt);
-               return NULL;
-       }
-
-       dcn30_dio_stream_encoder_construct(enc1, ctx, ctx->dc_bios,
-                                       eng_id, vpg, afmt,
-                                       &stream_enc_regs[eng_id],
-                                       &se_shift, &se_mask);
-
-       return &enc1->base;
-}
-
-static struct dce_hwseq *dcn30_hwseq_create(struct dc_context *ctx)
-{
-       struct dce_hwseq *hws = kzalloc(sizeof(struct dce_hwseq), GFP_KERNEL);
-
-       if (hws) {
-               hws->ctx = ctx;
-               hws->regs = &hwseq_reg;
-               hws->shifts = &hwseq_shift;
-               hws->masks = &hwseq_mask;
-       }
-       return hws;
-}
-static const struct resource_create_funcs res_create_funcs = {
-       .read_dce_straps = read_dce_straps,
-       .create_audio = dcn30_create_audio,
-       .create_stream_encoder = dcn30_stream_encoder_create,
-       .create_hwseq = dcn30_hwseq_create,
-};
-
-static void dcn30_resource_destruct(struct dcn30_resource_pool *pool)
-{
-       unsigned int i;
-
-       for (i = 0; i < pool->base.stream_enc_count; i++) {
-               if (pool->base.stream_enc[i] != NULL) {
-                       if (pool->base.stream_enc[i]->vpg != NULL) {
-                               kfree(DCN30_VPG_FROM_VPG(pool->base.stream_enc[i]->vpg));
-                               pool->base.stream_enc[i]->vpg = NULL;
-                       }
-                       if (pool->base.stream_enc[i]->afmt != NULL) {
-                               kfree(DCN30_AFMT_FROM_AFMT(pool->base.stream_enc[i]->afmt));
-                               pool->base.stream_enc[i]->afmt = NULL;
-                       }
-                       kfree(DCN10STRENC_FROM_STRENC(pool->base.stream_enc[i]));
-                       pool->base.stream_enc[i] = NULL;
-               }
-       }
-
-       for (i = 0; i < pool->base.res_cap->num_dsc; i++) {
-               if (pool->base.dscs[i] != NULL)
-                       dcn20_dsc_destroy(&pool->base.dscs[i]);
-       }
-
-       if (pool->base.mpc != NULL) {
-               kfree(TO_DCN20_MPC(pool->base.mpc));
-               pool->base.mpc = NULL;
-       }
-       if (pool->base.hubbub != NULL) {
-               kfree(pool->base.hubbub);
-               pool->base.hubbub = NULL;
-       }
-       for (i = 0; i < pool->base.pipe_count; i++) {
-               if (pool->base.dpps[i] != NULL)
-                       dcn30_dpp_destroy(&pool->base.dpps[i]);
-
-               if (pool->base.ipps[i] != NULL)
-                       pool->base.ipps[i]->funcs->ipp_destroy(&pool->base.ipps[i]);
-
-               if (pool->base.hubps[i] != NULL) {
-                       kfree(TO_DCN20_HUBP(pool->base.hubps[i]));
-                       pool->base.hubps[i] = NULL;
-               }
-
-               if (pool->base.irqs != NULL) {
-                       dal_irq_service_destroy(&pool->base.irqs);
-               }
-       }
-
-       for (i = 0; i < pool->base.res_cap->num_ddc; i++) {
-               if (pool->base.engines[i] != NULL)
-                       dce110_engine_destroy(&pool->base.engines[i]);
-               if (pool->base.hw_i2cs[i] != NULL) {
-                       kfree(pool->base.hw_i2cs[i]);
-                       pool->base.hw_i2cs[i] = NULL;
-               }
-               if (pool->base.sw_i2cs[i] != NULL) {
-                       kfree(pool->base.sw_i2cs[i]);
-                       pool->base.sw_i2cs[i] = NULL;
-               }
-       }
-
-       for (i = 0; i < pool->base.res_cap->num_opp; i++) {
-               if (pool->base.opps[i] != NULL)
-                       pool->base.opps[i]->funcs->opp_destroy(&pool->base.opps[i]);
-       }
-
-       for (i = 0; i < pool->base.res_cap->num_timing_generator; i++) {
-               if (pool->base.timing_generators[i] != NULL)    {
-                       kfree(DCN10TG_FROM_TG(pool->base.timing_generators[i]));
-                       pool->base.timing_generators[i] = NULL;
-               }
-       }
-
-       for (i = 0; i < pool->base.res_cap->num_dwb; i++) {
-               if (pool->base.dwbc[i] != NULL) {
-                       kfree(TO_DCN30_DWBC(pool->base.dwbc[i]));
-                       pool->base.dwbc[i] = NULL;
-               }
-               if (pool->base.mcif_wb[i] != NULL) {
-                       kfree(TO_DCN30_MMHUBBUB(pool->base.mcif_wb[i]));
-                       pool->base.mcif_wb[i] = NULL;
-               }
-       }
-
-       for (i = 0; i < pool->base.audio_count; i++) {
-               if (pool->base.audios[i])
-                       dce_aud_destroy(&pool->base.audios[i]);
-       }
-
-       for (i = 0; i < pool->base.clk_src_count; i++) {
-               if (pool->base.clock_sources[i] != NULL) {
-                       dcn20_clock_source_destroy(&pool->base.clock_sources[i]);
-                       pool->base.clock_sources[i] = NULL;
-               }
-       }
-
-       for (i = 0; i < pool->base.res_cap->num_mpc_3dlut; i++) {
-               if (pool->base.mpc_lut[i] != NULL) {
-                       dc_3dlut_func_release(pool->base.mpc_lut[i]);
-                       pool->base.mpc_lut[i] = NULL;
-               }
-               if (pool->base.mpc_shaper[i] != NULL) {
-                       dc_transfer_func_release(pool->base.mpc_shaper[i]);
-                       pool->base.mpc_shaper[i] = NULL;
-               }
-       }
-
-       if (pool->base.dp_clock_source != NULL) {
-               dcn20_clock_source_destroy(&pool->base.dp_clock_source);
-               pool->base.dp_clock_source = NULL;
-       }
-
-       for (i = 0; i < pool->base.pipe_count; i++) {
-               if (pool->base.multiple_abms[i] != NULL)
-                       dce_abm_destroy(&pool->base.multiple_abms[i]);
-       }
-
-       if (pool->base.psr != NULL)
-               dmub_psr_destroy(&pool->base.psr);
-
-       if (pool->base.dccg != NULL)
-               dcn_dccg_destroy(&pool->base.dccg);
-
-       if (pool->base.oem_device != NULL) {
-               struct dc *dc = pool->base.oem_device->ctx->dc;
-
-               dc->link_srv->destroy_ddc_service(&pool->base.oem_device);
-       }
-}
-
-static struct hubp *dcn30_hubp_create(
-       struct dc_context *ctx,
-       uint32_t inst)
-{
-       struct dcn20_hubp *hubp2 =
-               kzalloc(sizeof(struct dcn20_hubp), GFP_KERNEL);
-
-       if (!hubp2)
-               return NULL;
-
-       if (hubp3_construct(hubp2, ctx, inst,
-                       &hubp_regs[inst], &hubp_shift, &hubp_mask))
-               return &hubp2->base;
-
-       BREAK_TO_DEBUGGER();
-       kfree(hubp2);
-       return NULL;
-}
-
-static bool dcn30_dwbc_create(struct dc_context *ctx, struct resource_pool *pool)
-{
-       int i;
-       uint32_t pipe_count = pool->res_cap->num_dwb;
-
-       for (i = 0; i < pipe_count; i++) {
-               struct dcn30_dwbc *dwbc30 = kzalloc(sizeof(struct dcn30_dwbc),
-                                                   GFP_KERNEL);
-
-               if (!dwbc30) {
-                       dm_error("DC: failed to create dwbc30!\n");
-                       return false;
-               }
-
-               dcn30_dwbc_construct(dwbc30, ctx,
-                               &dwbc30_regs[i],
-                               &dwbc30_shift,
-                               &dwbc30_mask,
-                               i);
-
-               pool->dwbc[i] = &dwbc30->base;
-       }
-       return true;
-}
-
-static bool dcn30_mmhubbub_create(struct dc_context *ctx, struct resource_pool *pool)
-{
-       int i;
-       uint32_t pipe_count = pool->res_cap->num_dwb;
-
-       for (i = 0; i < pipe_count; i++) {
-               struct dcn30_mmhubbub *mcif_wb30 = kzalloc(sizeof(struct dcn30_mmhubbub),
-                                                   GFP_KERNEL);
-
-               if (!mcif_wb30) {
-                       dm_error("DC: failed to create mcif_wb30!\n");
-                       return false;
-               }
-
-               dcn30_mmhubbub_construct(mcif_wb30, ctx,
-                               &mcif_wb30_regs[i],
-                               &mcif_wb30_shift,
-                               &mcif_wb30_mask,
-                               i);
-
-               pool->mcif_wb[i] = &mcif_wb30->base;
-       }
-       return true;
-}
-
-static struct display_stream_compressor *dcn30_dsc_create(
-       struct dc_context *ctx, uint32_t inst)
-{
-       struct dcn20_dsc *dsc =
-               kzalloc(sizeof(struct dcn20_dsc), GFP_KERNEL);
-
-       if (!dsc) {
-               BREAK_TO_DEBUGGER();
-               return NULL;
-       }
-
-       dsc2_construct(dsc, ctx, inst, &dsc_regs[inst], &dsc_shift, &dsc_mask);
-       return &dsc->base;
-}
-
-enum dc_status dcn30_add_stream_to_ctx(struct dc *dc, struct dc_state *new_ctx, struct dc_stream_state *dc_stream)
-{
-
-       return dcn20_add_stream_to_ctx(dc, new_ctx, dc_stream);
-}
-
-static void dcn30_destroy_resource_pool(struct resource_pool **pool)
-{
-       struct dcn30_resource_pool *dcn30_pool = TO_DCN30_RES_POOL(*pool);
-
-       dcn30_resource_destruct(dcn30_pool);
-       kfree(dcn30_pool);
-       *pool = NULL;
-}
-
-static struct clock_source *dcn30_clock_source_create(
-               struct dc_context *ctx,
-               struct dc_bios *bios,
-               enum clock_source_id id,
-               const struct dce110_clk_src_regs *regs,
-               bool dp_clk_src)
-{
-       struct dce110_clk_src *clk_src =
-               kzalloc(sizeof(struct dce110_clk_src), GFP_KERNEL);
-
-       if (!clk_src)
-               return NULL;
-
-       if (dcn3_clk_src_construct(clk_src, ctx, bios, id,
-                       regs, &cs_shift, &cs_mask)) {
-               clk_src->base.dp_clk_src = dp_clk_src;
-               return &clk_src->base;
-       }
-
-       kfree(clk_src);
-       BREAK_TO_DEBUGGER();
-       return NULL;
-}
-
-int dcn30_populate_dml_pipes_from_context(
-       struct dc *dc, struct dc_state *context,
-       display_e2e_pipe_params_st *pipes,
-       bool fast_validate)
-{
-       int i, pipe_cnt;
-       struct resource_context *res_ctx = &context->res_ctx;
-
-       DC_FP_START();
-       dcn20_populate_dml_pipes_from_context(dc, context, pipes, fast_validate);
-       DC_FP_END();
-
-       for (i = 0, pipe_cnt = 0; i < dc->res_pool->pipe_count; i++) {
-               if (!res_ctx->pipe_ctx[i].stream)
-                       continue;
-
-               pipes[pipe_cnt++].pipe.scale_ratio_depth.lb_depth =
-                       dm_lb_16;
-       }
-
-       return pipe_cnt;
-}
-
-void dcn30_populate_dml_writeback_from_context(
-       struct dc *dc, struct resource_context *res_ctx, display_e2e_pipe_params_st *pipes)
-{
-       DC_FP_START();
-       dcn30_fpu_populate_dml_writeback_from_context(dc, res_ctx, pipes);
-       DC_FP_END();
-}
-
-unsigned int dcn30_calc_max_scaled_time(
-               unsigned int time_per_pixel,
-               enum mmhubbub_wbif_mode mode,
-               unsigned int urgent_watermark)
-{
-       unsigned int time_per_byte = 0;
-       unsigned int total_free_entry = 0xb40;
-       unsigned int buf_lh_capability;
-       unsigned int max_scaled_time;
-
-       if (mode == PACKED_444) /* packed mode 32 bpp */
-               time_per_byte = time_per_pixel/4;
-       else if (mode == PACKED_444_FP16) /* packed mode 64 bpp */
-               time_per_byte = time_per_pixel/8;
-
-       if (time_per_byte == 0)
-               time_per_byte = 1;
-
-       buf_lh_capability = (total_free_entry*time_per_byte*32) >> 6; /* time_per_byte is in u6.6*/
-       max_scaled_time   = buf_lh_capability - urgent_watermark;
-       return max_scaled_time;
-}
-
-void dcn30_set_mcif_arb_params(
-               struct dc *dc,
-               struct dc_state *context,
-               display_e2e_pipe_params_st *pipes,
-               int pipe_cnt)
-{
-       enum mmhubbub_wbif_mode wbif_mode;
-       struct display_mode_lib *dml = &context->bw_ctx.dml;
-       struct mcif_arb_params *wb_arb_params;
-       int i, j, dwb_pipe;
-
-       /* Writeback MCIF_WB arbitration parameters */
-       dwb_pipe = 0;
-       for (i = 0; i < dc->res_pool->pipe_count; i++) {
-
-               if (!context->res_ctx.pipe_ctx[i].stream)
-                       continue;
-
-               for (j = 0; j < MAX_DWB_PIPES; j++) {
-                       struct dc_writeback_info *writeback_info = &context->res_ctx.pipe_ctx[i].stream->writeback_info[j];
-
-                       if (writeback_info->wb_enabled == false)
-                               continue;
-
-                       //wb_arb_params = &context->res_ctx.pipe_ctx[i].stream->writeback_info[j].mcif_arb_params;
-                       wb_arb_params = &context->bw_ctx.bw.dcn.bw_writeback.mcif_wb_arb[dwb_pipe];
-
-                       if (writeback_info->dwb_params.cnv_params.fc_out_format == DWB_OUT_FORMAT_64BPP_ARGB ||
-                               writeback_info->dwb_params.cnv_params.fc_out_format == DWB_OUT_FORMAT_64BPP_RGBA)
-                               wbif_mode = PACKED_444_FP16;
-                       else
-                               wbif_mode = PACKED_444;
-
-                       DC_FP_START();
-                       dcn30_fpu_set_mcif_arb_params(wb_arb_params, dml, pipes, pipe_cnt, j);
-                       DC_FP_END();
-                       wb_arb_params->time_per_pixel = (1000000 << 6) / context->res_ctx.pipe_ctx[i].stream->phy_pix_clk; /* time_per_pixel should be in u6.6 format */
-                       wb_arb_params->slice_lines = 32;
-                       wb_arb_params->arbitration_slice = 2; /* irrelevant since there is no YUV output */
-                       wb_arb_params->max_scaled_time = dcn30_calc_max_scaled_time(wb_arb_params->time_per_pixel,
-                                       wbif_mode,
-                                       wb_arb_params->cli_watermark[0]); /* assume 4 watermark sets have the same value */
-
-                       dwb_pipe++;
-
-                       if (dwb_pipe >= MAX_DWB_PIPES)
-                               return;
-               }
-               if (dwb_pipe >= MAX_DWB_PIPES)
-                       return;
-       }
-
-}
-
-static struct dc_cap_funcs cap_funcs = {
-       .get_dcc_compression_cap = dcn20_get_dcc_compression_cap
-};
-
-bool dcn30_acquire_post_bldn_3dlut(
-               struct resource_context *res_ctx,
-               const struct resource_pool *pool,
-               int mpcc_id,
-               struct dc_3dlut **lut,
-               struct dc_transfer_func **shaper)
-{
-       int i;
-       bool ret = false;
-       union dc_3dlut_state *state;
-
-       ASSERT(*lut == NULL && *shaper == NULL);
-       *lut = NULL;
-       *shaper = NULL;
-
-       for (i = 0; i < pool->res_cap->num_mpc_3dlut; i++) {
-               if (!res_ctx->is_mpc_3dlut_acquired[i]) {
-                       *lut = pool->mpc_lut[i];
-                       *shaper = pool->mpc_shaper[i];
-                       state = &pool->mpc_lut[i]->state;
-                       res_ctx->is_mpc_3dlut_acquired[i] = true;
-                       state->bits.rmu_idx_valid = 1;
-                       state->bits.rmu_mux_num = i;
-                       if (state->bits.rmu_mux_num == 0)
-                               state->bits.mpc_rmu0_mux = mpcc_id;
-                       else if (state->bits.rmu_mux_num == 1)
-                               state->bits.mpc_rmu1_mux = mpcc_id;
-                       else if (state->bits.rmu_mux_num == 2)
-                               state->bits.mpc_rmu2_mux = mpcc_id;
-                       ret = true;
-                       break;
-               }
-       }
-       return ret;
-}
-
-bool dcn30_release_post_bldn_3dlut(
-               struct resource_context *res_ctx,
-               const struct resource_pool *pool,
-               struct dc_3dlut **lut,
-               struct dc_transfer_func **shaper)
-{
-       int i;
-       bool ret = false;
-
-       for (i = 0; i < pool->res_cap->num_mpc_3dlut; i++) {
-               if (pool->mpc_lut[i] == *lut && pool->mpc_shaper[i] == *shaper) {
-                       res_ctx->is_mpc_3dlut_acquired[i] = false;
-                       pool->mpc_lut[i]->state.raw = 0;
-                       *lut = NULL;
-                       *shaper = NULL;
-                       ret = true;
-                       break;
-               }
-       }
-       return ret;
-}
-
-static bool is_soc_bounding_box_valid(struct dc *dc)
-{
-       uint32_t hw_internal_rev = dc->ctx->asic_id.hw_internal_rev;
-
-       if (ASICREV_IS_SIENNA_CICHLID_P(hw_internal_rev))
-               return true;
-
-       return false;
-}
-
-static bool init_soc_bounding_box(struct dc *dc,
-                                 struct dcn30_resource_pool *pool)
-{
-       struct _vcs_dpi_soc_bounding_box_st *loaded_bb = &dcn3_0_soc;
-       struct _vcs_dpi_ip_params_st *loaded_ip = &dcn3_0_ip;
-
-       DC_LOGGER_INIT(dc->ctx->logger);
-
-       if (!is_soc_bounding_box_valid(dc)) {
-               DC_LOG_ERROR("%s: not valid soc bounding box\n", __func__);
-               return false;
-       }
-
-       loaded_ip->max_num_otg = pool->base.res_cap->num_timing_generator;
-       loaded_ip->max_num_dpp = pool->base.pipe_count;
-       loaded_ip->clamp_min_dcfclk = dc->config.clamp_min_dcfclk;
-       dcn20_patch_bounding_box(dc, loaded_bb);
-       DC_FP_START();
-       patch_dcn30_soc_bounding_box(dc, &dcn3_0_soc);
-       DC_FP_END();
-
-       return true;
-}
-
-static bool dcn30_split_stream_for_mpc_or_odm(
-               const struct dc *dc,
-               struct resource_context *res_ctx,
-               struct pipe_ctx *pri_pipe,
-               struct pipe_ctx *sec_pipe,
-               bool odm)
-{
-       int pipe_idx = sec_pipe->pipe_idx;
-       const struct resource_pool *pool = dc->res_pool;
-
-       *sec_pipe = *pri_pipe;
-
-       sec_pipe->pipe_idx = pipe_idx;
-       sec_pipe->plane_res.mi = pool->mis[pipe_idx];
-       sec_pipe->plane_res.hubp = pool->hubps[pipe_idx];
-       sec_pipe->plane_res.ipp = pool->ipps[pipe_idx];
-       sec_pipe->plane_res.xfm = pool->transforms[pipe_idx];
-       sec_pipe->plane_res.dpp = pool->dpps[pipe_idx];
-       sec_pipe->plane_res.mpcc_inst = pool->dpps[pipe_idx]->inst;
-       sec_pipe->stream_res.dsc = NULL;
-       if (odm) {
-               if (pri_pipe->next_odm_pipe) {
-                       ASSERT(pri_pipe->next_odm_pipe != sec_pipe);
-                       sec_pipe->next_odm_pipe = pri_pipe->next_odm_pipe;
-                       sec_pipe->next_odm_pipe->prev_odm_pipe = sec_pipe;
-               }
-               if (pri_pipe->top_pipe && pri_pipe->top_pipe->next_odm_pipe) {
-                       pri_pipe->top_pipe->next_odm_pipe->bottom_pipe = sec_pipe;
-                       sec_pipe->top_pipe = pri_pipe->top_pipe->next_odm_pipe;
-               }
-               if (pri_pipe->bottom_pipe && pri_pipe->bottom_pipe->next_odm_pipe) {
-                       pri_pipe->bottom_pipe->next_odm_pipe->top_pipe = sec_pipe;
-                       sec_pipe->bottom_pipe = pri_pipe->bottom_pipe->next_odm_pipe;
-               }
-               pri_pipe->next_odm_pipe = sec_pipe;
-               sec_pipe->prev_odm_pipe = pri_pipe;
-
-               if (!sec_pipe->top_pipe)
-                       sec_pipe->stream_res.opp = pool->opps[pipe_idx];
-               else
-                       sec_pipe->stream_res.opp = sec_pipe->top_pipe->stream_res.opp;
-               if (sec_pipe->stream->timing.flags.DSC == 1) {
-                       dcn20_acquire_dsc(dc, res_ctx, &sec_pipe->stream_res.dsc, pipe_idx);
-                       ASSERT(sec_pipe->stream_res.dsc);
-                       if (sec_pipe->stream_res.dsc == NULL)
-                               return false;
-               }
-       } else {
-               if (pri_pipe->bottom_pipe) {
-                       ASSERT(pri_pipe->bottom_pipe != sec_pipe);
-                       sec_pipe->bottom_pipe = pri_pipe->bottom_pipe;
-                       sec_pipe->bottom_pipe->top_pipe = sec_pipe;
-               }
-               pri_pipe->bottom_pipe = sec_pipe;
-               sec_pipe->top_pipe = pri_pipe;
-
-               ASSERT(pri_pipe->plane_state);
-       }
-
-       return true;
-}
-
-static struct pipe_ctx *dcn30_find_split_pipe(
-               struct dc *dc,
-               struct dc_state *context,
-               int old_index)
-{
-       struct pipe_ctx *pipe = NULL;
-       int i;
-
-       if (old_index >= 0 && context->res_ctx.pipe_ctx[old_index].stream == NULL) {
-               pipe = &context->res_ctx.pipe_ctx[old_index];
-               pipe->pipe_idx = old_index;
-       }
-
-       if (!pipe)
-               for (i = dc->res_pool->pipe_count - 1; i >= 0; i--) {
-                       if (dc->current_state->res_ctx.pipe_ctx[i].top_pipe == NULL
-                                       && dc->current_state->res_ctx.pipe_ctx[i].prev_odm_pipe == NULL) {
-                               if (context->res_ctx.pipe_ctx[i].stream == NULL) {
-                                       pipe = &context->res_ctx.pipe_ctx[i];
-                                       pipe->pipe_idx = i;
-                                       break;
-                               }
-                       }
-               }
-
-       /*
-        * May need to fix pipes getting tossed from 1 opp to another on flip
-        * Add for debugging transient underflow during topology updates:
-        * ASSERT(pipe);
-        */
-       if (!pipe)
-               for (i = dc->res_pool->pipe_count - 1; i >= 0; i--) {
-                       if (context->res_ctx.pipe_ctx[i].stream == NULL) {
-                               pipe = &context->res_ctx.pipe_ctx[i];
-                               pipe->pipe_idx = i;
-                               break;
-                       }
-               }
-
-       return pipe;
-}
-
-noinline bool dcn30_internal_validate_bw(
-               struct dc *dc,
-               struct dc_state *context,
-               display_e2e_pipe_params_st *pipes,
-               int *pipe_cnt_out,
-               int *vlevel_out,
-               bool fast_validate,
-               bool allow_self_refresh_only)
-{
-       bool out = false;
-       bool repopulate_pipes = false;
-       int split[MAX_PIPES] = { 0 };
-       bool merge[MAX_PIPES] = { false };
-       bool newly_split[MAX_PIPES] = { false };
-       int pipe_cnt, i, pipe_idx, vlevel;
-       struct vba_vars_st *vba = &context->bw_ctx.dml.vba;
-
-       ASSERT(pipes);
-       if (!pipes)
-               return false;
-
-       context->bw_ctx.dml.vba.maxMpcComb = 0;
-       context->bw_ctx.dml.vba.VoltageLevel = 0;
-       context->bw_ctx.dml.vba.DRAMClockChangeSupport[0][0] = dm_dram_clock_change_vactive;
-       dc->res_pool->funcs->update_soc_for_wm_a(dc, context);
-       pipe_cnt = dc->res_pool->funcs->populate_dml_pipes(dc, context, pipes, fast_validate);
-
-       if (!pipe_cnt) {
-               out = true;
-               goto validate_out;
-       }
-
-       dml_log_pipe_params(&context->bw_ctx.dml, pipes, pipe_cnt);
-
-       if (!fast_validate || !allow_self_refresh_only) {
-               /*
-                * DML favors voltage over p-state, but we're more interested in
-                * supporting p-state over voltage. We can't support p-state in
-                * prefetch mode > 0 so try capping the prefetch mode to start.
-                */
-               context->bw_ctx.dml.soc.allow_dram_self_refresh_or_dram_clock_change_in_vblank =
-                       dm_allow_self_refresh_and_mclk_switch;
-               vlevel = dml_get_voltage_level(&context->bw_ctx.dml, pipes, pipe_cnt);
-               /* This may adjust vlevel and maxMpcComb */
-               if (vlevel < context->bw_ctx.dml.soc.num_states)
-                       vlevel = dcn20_validate_apply_pipe_split_flags(dc, context, vlevel, split, merge);
-       }
-       if (allow_self_refresh_only &&
-           (fast_validate || vlevel == context->bw_ctx.dml.soc.num_states ||
-                       vba->DRAMClockChangeSupport[vlevel][vba->maxMpcComb] == dm_dram_clock_change_unsupported)) {
-               /*
-                * If mode is unsupported or there's still no p-state support
-                * then fall back to favoring voltage.
-                *
-                * We don't actually support prefetch mode 2, so require that we
-                * at least support prefetch mode 1.
-                */
-               context->bw_ctx.dml.soc.allow_dram_self_refresh_or_dram_clock_change_in_vblank =
-                       dm_allow_self_refresh;
-
-               vlevel = dml_get_voltage_level(&context->bw_ctx.dml, pipes, pipe_cnt);
-               if (vlevel < context->bw_ctx.dml.soc.num_states) {
-                       memset(split, 0, sizeof(split));
-                       memset(merge, 0, sizeof(merge));
-                       vlevel = dcn20_validate_apply_pipe_split_flags(dc, context, vlevel, split, merge);
-               }
-       }
-
-       dml_log_mode_support_params(&context->bw_ctx.dml);
-
-       if (vlevel == context->bw_ctx.dml.soc.num_states)
-               goto validate_fail;
-
-       if (!dc->config.enable_windowed_mpo_odm) {
-               for (i = 0, pipe_idx = 0; i < dc->res_pool->pipe_count; i++) {
-                       struct pipe_ctx *pipe = &context->res_ctx.pipe_ctx[i];
-                       struct pipe_ctx *mpo_pipe = pipe->bottom_pipe;
-
-                       if (!pipe->stream)
-                               continue;
-
-                       /* We only support full screen mpo with ODM */
-                       if (vba->ODMCombineEnabled[vba->pipe_plane[pipe_idx]] != dm_odm_combine_mode_disabled
-                                       && pipe->plane_state && mpo_pipe
-                                       && memcmp(&mpo_pipe->plane_state->clip_rect,
-                                                       &pipe->stream->src,
-                                                       sizeof(struct rect)) != 0) {
-                               ASSERT(mpo_pipe->plane_state != pipe->plane_state);
-                               goto validate_fail;
-                       }
-                       pipe_idx++;
-               }
-       }
-
-       /* merge pipes if necessary */
-       for (i = 0; i < dc->res_pool->pipe_count; i++) {
-               struct pipe_ctx *pipe = &context->res_ctx.pipe_ctx[i];
-
-               /*skip pipes that don't need merging*/
-               if (!merge[i])
-                       continue;
-
-               /* 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));
-                       repopulate_pipes = true;
-               } 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));
-                       repopulate_pipes = true;
-               } else
-                       ASSERT(0); /* Should never try to merge master pipe */
-
-       }
-
-       for (i = 0, pipe_idx = -1; i < dc->res_pool->pipe_count; i++) {
-               struct pipe_ctx *pipe = &context->res_ctx.pipe_ctx[i];
-               struct pipe_ctx *old_pipe = &dc->current_state->res_ctx.pipe_ctx[i];
-               struct pipe_ctx *hsplit_pipe = NULL;
-               bool odm;
-               int old_index = -1;
-
-               if (!pipe->stream || newly_split[i])
-                       continue;
-
-               pipe_idx++;
-               odm = vba->ODMCombineEnabled[vba->pipe_plane[pipe_idx]] != dm_odm_combine_mode_disabled;
-
-               if (!pipe->plane_state && !odm)
-                       continue;
-
-               if (split[i]) {
-                       if (odm) {
-                               if (split[i] == 4 && old_pipe->next_odm_pipe && old_pipe->next_odm_pipe->next_odm_pipe)
-                                       old_index = old_pipe->next_odm_pipe->next_odm_pipe->pipe_idx;
-                               else if (old_pipe->next_odm_pipe)
-                                       old_index = old_pipe->next_odm_pipe->pipe_idx;
-                       } else {
-                               if (split[i] == 4 && old_pipe->bottom_pipe && old_pipe->bottom_pipe->bottom_pipe &&
-                                               old_pipe->bottom_pipe->bottom_pipe->plane_state == old_pipe->plane_state)
-                                       old_index = old_pipe->bottom_pipe->bottom_pipe->pipe_idx;
-                               else if (old_pipe->bottom_pipe &&
-                                               old_pipe->bottom_pipe->plane_state == old_pipe->plane_state)
-                                       old_index = old_pipe->bottom_pipe->pipe_idx;
-                       }
-                       hsplit_pipe = dcn30_find_split_pipe(dc, context, old_index);
-                       ASSERT(hsplit_pipe);
-                       if (!hsplit_pipe)
-                               goto validate_fail;
-
-                       if (!dcn30_split_stream_for_mpc_or_odm(
-                                       dc, &context->res_ctx,
-                                       pipe, hsplit_pipe, odm))
-                               goto validate_fail;
-
-                       newly_split[hsplit_pipe->pipe_idx] = true;
-                       repopulate_pipes = true;
-               }
-               if (split[i] == 4) {
-                       struct pipe_ctx *pipe_4to1;
-
-                       if (odm && old_pipe->next_odm_pipe)
-                               old_index = old_pipe->next_odm_pipe->pipe_idx;
-                       else if (!odm && old_pipe->bottom_pipe &&
-                                               old_pipe->bottom_pipe->plane_state == old_pipe->plane_state)
-                               old_index = old_pipe->bottom_pipe->pipe_idx;
-                       else
-                               old_index = -1;
-                       pipe_4to1 = dcn30_find_split_pipe(dc, context, old_index);
-                       ASSERT(pipe_4to1);
-                       if (!pipe_4to1)
-                               goto validate_fail;
-                       if (!dcn30_split_stream_for_mpc_or_odm(
-                                       dc, &context->res_ctx,
-                                       pipe, pipe_4to1, odm))
-                               goto validate_fail;
-                       newly_split[pipe_4to1->pipe_idx] = true;
-
-                       if (odm && old_pipe->next_odm_pipe && old_pipe->next_odm_pipe->next_odm_pipe
-                                       && old_pipe->next_odm_pipe->next_odm_pipe->next_odm_pipe)
-                               old_index = old_pipe->next_odm_pipe->next_odm_pipe->next_odm_pipe->pipe_idx;
-                       else if (!odm && old_pipe->bottom_pipe && old_pipe->bottom_pipe->bottom_pipe &&
-                                       old_pipe->bottom_pipe->bottom_pipe->bottom_pipe &&
-                                       old_pipe->bottom_pipe->bottom_pipe->bottom_pipe->plane_state == old_pipe->plane_state)
-                               old_index = old_pipe->bottom_pipe->bottom_pipe->bottom_pipe->pipe_idx;
-                       else
-                               old_index = -1;
-                       pipe_4to1 = dcn30_find_split_pipe(dc, context, old_index);
-                       ASSERT(pipe_4to1);
-                       if (!pipe_4to1)
-                               goto validate_fail;
-                       if (!dcn30_split_stream_for_mpc_or_odm(
-                                       dc, &context->res_ctx,
-                                       hsplit_pipe, pipe_4to1, odm))
-                               goto validate_fail;
-                       newly_split[pipe_4to1->pipe_idx] = true;
-               }
-               if (odm)
-                       dcn20_build_mapped_resource(dc, context, pipe->stream);
-       }
-
-       for (i = 0; i < dc->res_pool->pipe_count; i++) {
-               struct pipe_ctx *pipe = &context->res_ctx.pipe_ctx[i];
-
-               if (pipe->plane_state) {
-                       if (!resource_build_scaling_params(pipe))
-                               goto validate_fail;
-               }
-       }
-
-       /* Actual dsc count per stream dsc validation*/
-       if (!dcn20_validate_dsc(dc, context)) {
-               vba->ValidationStatus[vba->soc.num_states] = DML_FAIL_DSC_VALIDATION_FAILURE;
-               goto validate_fail;
-       }
-
-       if (repopulate_pipes)
-               pipe_cnt = dc->res_pool->funcs->populate_dml_pipes(dc, context, pipes, fast_validate);
-       context->bw_ctx.dml.vba.VoltageLevel = vlevel;
-       *vlevel_out = vlevel;
-       *pipe_cnt_out = pipe_cnt;
-
-       out = true;
-       goto validate_out;
-
-validate_fail:
-       out = false;
-
-validate_out:
-       return out;
-}
-
-static int get_refresh_rate(struct dc_state *context)
-{
-       int refresh_rate = 0;
-       int h_v_total = 0;
-       struct dc_crtc_timing *timing = NULL;
-
-       if (context == NULL || context->streams[0] == NULL)
-               return 0;
-
-       /* check if refresh rate at least 120hz */
-       timing = &context->streams[0]->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;
-}
-
-#define MAX_STRETCHED_V_BLANK 500 // in micro-seconds
-/*
- * 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_state *context)
-{
-       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;
-
-       if (context == NULL || context->streams[0] == NULL)
-               return 0;
-
-       /* check if refresh rate at least 120hz */
-       timing = &context->streams[0]->timing;
-       if (timing == NULL)
-               return 0;
-
-       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_state *context)
-{
-       int refresh_rate_max_stretch_100hz;
-       int min_refresh_100hz;
-
-       if (context == NULL || context->streams[0] == NULL)
-               return false;
-
-       refresh_rate_max_stretch_100hz = get_frame_rate_at_max_stretch_100hz(context);
-       min_refresh_100hz = context->streams[0]->timing.min_refresh_in_uhz / 10000;
-
-       if (refresh_rate_max_stretch_100hz < min_refresh_100hz)
-               return false;
-
-       return true;
-}
-
-bool dcn30_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;
-
-       if (context == NULL || context->streams[0] == NULL)
-               return false;
-
-       if (context->streams[0]->sink->edid_caps.panel_patch.disable_fams)
-               return false;
-
-       if (dc->debug.disable_fams)
-               return false;
-
-       if (!dc->caps.dmub_caps.mclk_sw)
-               return false;
-
-       if (context->bw_ctx.bw.dcn.clk.fw_based_mclk_switching_shut_down)
-               return false;
-
-       /* more then 1 monitor connected */
-       if (context->stream_count != 1)
-               return false;
-
-       refresh_rate = get_refresh_rate(context);
-       if (refresh_rate < minimum_refreshrate_supported)
-               return false;
-
-       if (!is_refresh_rate_support_mclk_switch_using_fw_based_vblank_stretch(context))
-               return false;
-
-       if (!context->streams[0]->allow_freesync)
-               return false;
-
-       if (context->streams[0]->vrr_active_variable && dc->debug.disable_fams_gaming)
-               return false;
-
-       context->streams[0]->fpo_in_use = true;
-
-       return true;
-}
-
-/*
- * set up FPO watermarks, pstate, dram latency
- */
-void dcn30_setup_mclk_switch_using_fw_based_vblank_stretch(struct dc *dc, struct dc_state *context)
-{
-       ASSERT(dc != NULL && context != NULL);
-       if (dc == NULL || context == NULL)
-               return;
-
-       /* Set wm_a.pstate so high natural MCLK switches are impossible: 4 seconds */
-       context->bw_ctx.bw.dcn.watermarks.a.cstate_pstate.pstate_change_ns = 4U * 1000U * 1000U * 1000U;
-}
-
-void dcn30_update_soc_for_wm_a(struct dc *dc, struct dc_state *context)
-{
-       DC_FP_START();
-       dcn30_fpu_update_soc_for_wm_a(dc, context);
-       DC_FP_END();
-}
-
-void dcn30_calculate_wm_and_dlg(
-               struct dc *dc, struct dc_state *context,
-               display_e2e_pipe_params_st *pipes,
-               int pipe_cnt,
-               int vlevel)
-{
-       DC_FP_START();
-       dcn30_fpu_calculate_wm_and_dlg(dc, context, pipes, pipe_cnt, vlevel);
-       DC_FP_END();
-}
-
-bool dcn30_validate_bandwidth(struct dc *dc,
-               struct dc_state *context,
-               bool fast_validate)
-{
-       bool out = false;
-
-       BW_VAL_TRACE_SETUP();
-
-       int vlevel = 0;
-       int pipe_cnt = 0;
-       display_e2e_pipe_params_st *pipes = kzalloc(dc->res_pool->pipe_count * sizeof(display_e2e_pipe_params_st), GFP_KERNEL);
-       DC_LOGGER_INIT(dc->ctx->logger);
-
-       BW_VAL_TRACE_COUNT();
-
-       DC_FP_START();
-       out = dcn30_internal_validate_bw(dc, context, pipes, &pipe_cnt, &vlevel, fast_validate, true);
-       DC_FP_END();
-
-       if (pipe_cnt == 0)
-               goto validate_out;
-
-       if (!out)
-               goto validate_fail;
-
-       BW_VAL_TRACE_END_VOLTAGE_LEVEL();
-
-       if (fast_validate) {
-               BW_VAL_TRACE_SKIP(fast);
-               goto validate_out;
-       }
-
-       DC_FP_START();
-       if (dc->res_pool->funcs->calculate_wm_and_dlg)
-               dc->res_pool->funcs->calculate_wm_and_dlg(dc, context, pipes, pipe_cnt, vlevel);
-       DC_FP_END();
-
-       BW_VAL_TRACE_END_WATERMARKS();
-
-       goto validate_out;
-
-validate_fail:
-       DC_LOG_WARNING("Mode Validation Warning: %s failed validation.\n",
-               dml_get_status_message(context->bw_ctx.dml.vba.ValidationStatus[context->bw_ctx.dml.vba.soc.num_states]));
-
-       BW_VAL_TRACE_SKIP(fail);
-       out = false;
-
-validate_out:
-       kfree(pipes);
-
-       BW_VAL_TRACE_FINISH();
-
-       return out;
-}
-
-void dcn30_update_bw_bounding_box(struct dc *dc, struct clk_bw_params *bw_params)
-{
-       unsigned int i, j;
-       unsigned int num_states = 0;
-
-       unsigned int dcfclk_mhz[DC__VOLTAGE_STATES] = {0};
-       unsigned int dram_speed_mts[DC__VOLTAGE_STATES] = {0};
-       unsigned int optimal_uclk_for_dcfclk_sta_targets[DC__VOLTAGE_STATES] = {0};
-       unsigned int optimal_dcfclk_for_uclk[DC__VOLTAGE_STATES] = {0};
-
-       unsigned int dcfclk_sta_targets[DC__VOLTAGE_STATES] = {694, 875, 1000, 1200};
-       unsigned int num_dcfclk_sta_targets = 4;
-       unsigned int num_uclk_states;
-
-       struct dc_bounding_box_max_clk dcn30_bb_max_clk;
-
-       memset(&dcn30_bb_max_clk, 0, sizeof(dcn30_bb_max_clk));
-
-       if (dc->ctx->dc_bios->vram_info.num_chans)
-               dcn3_0_soc.num_chans = dc->ctx->dc_bios->vram_info.num_chans;
-
-       DC_FP_START();
-       dcn30_fpu_update_dram_channel_width_bytes(dc);
-       DC_FP_END();
-
-       if (bw_params->clk_table.entries[0].memclk_mhz) {
-
-               for (i = 0; i < MAX_NUM_DPM_LVL; i++) {
-                       if (bw_params->clk_table.entries[i].dcfclk_mhz > dcn30_bb_max_clk.max_dcfclk_mhz)
-                               dcn30_bb_max_clk.max_dcfclk_mhz = bw_params->clk_table.entries[i].dcfclk_mhz;
-                       if (bw_params->clk_table.entries[i].dispclk_mhz > dcn30_bb_max_clk.max_dispclk_mhz)
-                               dcn30_bb_max_clk.max_dispclk_mhz = bw_params->clk_table.entries[i].dispclk_mhz;
-                       if (bw_params->clk_table.entries[i].dppclk_mhz > dcn30_bb_max_clk.max_dppclk_mhz)
-                               dcn30_bb_max_clk.max_dppclk_mhz = bw_params->clk_table.entries[i].dppclk_mhz;
-                       if (bw_params->clk_table.entries[i].phyclk_mhz > dcn30_bb_max_clk.max_phyclk_mhz)
-                               dcn30_bb_max_clk.max_phyclk_mhz = bw_params->clk_table.entries[i].phyclk_mhz;
-               }
-
-               DC_FP_START();
-               dcn30_fpu_update_max_clk(&dcn30_bb_max_clk);
-               DC_FP_END();
-
-               if (dcn30_bb_max_clk.max_dcfclk_mhz > dcfclk_sta_targets[num_dcfclk_sta_targets-1]) {
-                       // If max DCFCLK is greater than the max DCFCLK STA target, insert into the DCFCLK STA target array
-                       dcfclk_sta_targets[num_dcfclk_sta_targets] = dcn30_bb_max_clk.max_dcfclk_mhz;
-                       num_dcfclk_sta_targets++;
-               } else if (dcn30_bb_max_clk.max_dcfclk_mhz < dcfclk_sta_targets[num_dcfclk_sta_targets-1]) {
-                       // If max DCFCLK is less than the max DCFCLK STA target, cap values and remove duplicates
-                       for (i = 0; i < num_dcfclk_sta_targets; i++) {
-                               if (dcfclk_sta_targets[i] > dcn30_bb_max_clk.max_dcfclk_mhz) {
-                                       dcfclk_sta_targets[i] = dcn30_bb_max_clk.max_dcfclk_mhz;
-                                       break;
-                               }
-                       }
-                       // Update size of array since we "removed" duplicates
-                       num_dcfclk_sta_targets = i + 1;
-               }
-
-               num_uclk_states = bw_params->clk_table.num_entries;
-
-               // Calculate optimal dcfclk for each uclk
-               for (i = 0; i < num_uclk_states; i++) {
-                       DC_FP_START();
-                       dcn30_fpu_get_optimal_dcfclk_fclk_for_uclk(bw_params->clk_table.entries[i].memclk_mhz * 16,
-                                       &optimal_dcfclk_for_uclk[i], NULL);
-                       DC_FP_END();
-                       if (optimal_dcfclk_for_uclk[i] < bw_params->clk_table.entries[0].dcfclk_mhz) {
-                               optimal_dcfclk_for_uclk[i] = bw_params->clk_table.entries[0].dcfclk_mhz;
-                       }
-               }
-
-               // Calculate optimal uclk for each dcfclk sta target
-               for (i = 0; i < num_dcfclk_sta_targets; i++) {
-                       for (j = 0; j < num_uclk_states; j++) {
-                               if (dcfclk_sta_targets[i] < optimal_dcfclk_for_uclk[j]) {
-                                       optimal_uclk_for_dcfclk_sta_targets[i] =
-                                                       bw_params->clk_table.entries[j].memclk_mhz * 16;
-                                       break;
-                               }
-                       }
-               }
-
-               i = 0;
-               j = 0;
-               // create the final dcfclk and uclk table
-               while (i < num_dcfclk_sta_targets && j < num_uclk_states && num_states < DC__VOLTAGE_STATES) {
-                       if (dcfclk_sta_targets[i] < optimal_dcfclk_for_uclk[j] && i < num_dcfclk_sta_targets) {
-                               dcfclk_mhz[num_states] = dcfclk_sta_targets[i];
-                               dram_speed_mts[num_states++] = optimal_uclk_for_dcfclk_sta_targets[i++];
-                       } else {
-                               if (j < num_uclk_states && optimal_dcfclk_for_uclk[j] <= dcn30_bb_max_clk.max_dcfclk_mhz) {
-                                       dcfclk_mhz[num_states] = optimal_dcfclk_for_uclk[j];
-                                       dram_speed_mts[num_states++] = bw_params->clk_table.entries[j++].memclk_mhz * 16;
-                               } else {
-                                       j = num_uclk_states;
-                               }
-                       }
-               }
-
-               while (i < num_dcfclk_sta_targets && num_states < DC__VOLTAGE_STATES) {
-                       dcfclk_mhz[num_states] = dcfclk_sta_targets[i];
-                       dram_speed_mts[num_states++] = optimal_uclk_for_dcfclk_sta_targets[i++];
-               }
-
-               while (j < num_uclk_states && num_states < DC__VOLTAGE_STATES &&
-                               optimal_dcfclk_for_uclk[j] <= dcn30_bb_max_clk.max_dcfclk_mhz) {
-                       dcfclk_mhz[num_states] = optimal_dcfclk_for_uclk[j];
-                       dram_speed_mts[num_states++] = bw_params->clk_table.entries[j++].memclk_mhz * 16;
-               }
-
-               dcn3_0_soc.num_states = num_states;
-               DC_FP_START();
-               dcn30_fpu_update_bw_bounding_box(dc, bw_params, &dcn30_bb_max_clk, dcfclk_mhz, dram_speed_mts);
-               DC_FP_END();
-       }
-}
-
-static void dcn30_get_panel_config_defaults(struct dc_panel_config *panel_config)
-{
-       *panel_config = panel_config_defaults;
-}
-
-static const struct resource_funcs dcn30_res_pool_funcs = {
-       .destroy = dcn30_destroy_resource_pool,
-       .link_enc_create = dcn30_link_encoder_create,
-       .panel_cntl_create = dcn30_panel_cntl_create,
-       .validate_bandwidth = dcn30_validate_bandwidth,
-       .calculate_wm_and_dlg = dcn30_calculate_wm_and_dlg,
-       .update_soc_for_wm_a = dcn30_update_soc_for_wm_a,
-       .populate_dml_pipes = dcn30_populate_dml_pipes_from_context,
-       .acquire_free_pipe_as_secondary_dpp_pipe = dcn20_acquire_free_pipe_for_layer,
-       .release_pipe = dcn20_release_pipe,
-       .add_stream_to_ctx = dcn30_add_stream_to_ctx,
-       .add_dsc_to_stream_resource = dcn20_add_dsc_to_stream_resource,
-       .remove_stream_from_ctx = dcn20_remove_stream_from_ctx,
-       .populate_dml_writeback_from_context = dcn30_populate_dml_writeback_from_context,
-       .set_mcif_arb_params = dcn30_set_mcif_arb_params,
-       .find_first_free_match_stream_enc_for_link = dcn10_find_first_free_match_stream_enc_for_link,
-       .acquire_post_bldn_3dlut = dcn30_acquire_post_bldn_3dlut,
-       .release_post_bldn_3dlut = dcn30_release_post_bldn_3dlut,
-       .update_bw_bounding_box = dcn30_update_bw_bounding_box,
-       .patch_unknown_plane_state = dcn20_patch_unknown_plane_state,
-       .get_panel_config_defaults = dcn30_get_panel_config_defaults,
-};
-
-#define CTX ctx
-
-#define REG(reg_name) \
-       (DCN_BASE.instance[0].segment[mm ## reg_name ## _BASE_IDX] + mm ## reg_name)
-
-static uint32_t read_pipe_fuses(struct dc_context *ctx)
-{
-       uint32_t value = REG_READ(CC_DC_PIPE_DIS);
-       /* Support for max 6 pipes */
-       value = value & 0x3f;
-       return value;
-}
-
-static bool dcn30_resource_construct(
-       uint8_t num_virtual_links,
-       struct dc *dc,
-       struct dcn30_resource_pool *pool)
-{
-       int i;
-       struct dc_context *ctx = dc->ctx;
-       struct irq_service_init_data init_data;
-       struct ddc_service_init_data ddc_init_data = {0};
-       uint32_t pipe_fuses = read_pipe_fuses(ctx);
-       uint32_t num_pipes = 0;
-
-       if (!(pipe_fuses == 0 || pipe_fuses == 0x3e)) {
-               BREAK_TO_DEBUGGER();
-               dm_error("DC: Unexpected fuse recipe for navi2x !\n");
-               /* fault to single pipe */
-               pipe_fuses = 0x3e;
-       }
-
-       DC_FP_START();
-
-       ctx->dc_bios->regs = &bios_regs;
-
-       pool->base.res_cap = &res_cap_dcn3;
-
-       pool->base.funcs = &dcn30_res_pool_funcs;
-
-       /*************************************************
-        *  Resource + asic cap harcoding                *
-        *************************************************/
-       pool->base.underlay_pipe_index = NO_UNDERLAY_PIPE;
-       pool->base.pipe_count = pool->base.res_cap->num_timing_generator;
-       pool->base.mpcc_count = pool->base.res_cap->num_timing_generator;
-       dc->caps.max_downscale_ratio = 600;
-       dc->caps.i2c_speed_in_khz = 100;
-       dc->caps.i2c_speed_in_khz_hdcp = 100; /*1.4 w/a not applied by default*/
-       dc->caps.max_cursor_size = 256;
-       dc->caps.min_horizontal_blanking_period = 80;
-       dc->caps.dmdata_alloc_size = 2048;
-       dc->caps.mall_size_per_mem_channel = 8;
-       /* total size = mall per channel * num channels * 1024 * 1024 */
-       dc->caps.mall_size_total = dc->caps.mall_size_per_mem_channel * dc->ctx->dc_bios->vram_info.num_chans * 1048576;
-       dc->caps.cursor_cache_size = dc->caps.max_cursor_size * dc->caps.max_cursor_size * 8;
-
-       dc->caps.max_slave_planes = 2;
-       dc->caps.max_slave_yuv_planes = 2;
-       dc->caps.max_slave_rgb_planes = 2;
-       dc->caps.post_blend_color_processing = true;
-       dc->caps.force_dp_tps4_for_cp2520 = true;
-       dc->caps.extended_aux_timeout_support = true;
-       dc->caps.dmcub_support = true;
-
-       /* Color pipeline capabilities */
-       dc->caps.color.dpp.dcn_arch = 1;
-       dc->caps.color.dpp.input_lut_shared = 0;
-       dc->caps.color.dpp.icsc = 1;
-       dc->caps.color.dpp.dgam_ram = 0; // must use gamma_corr
-       dc->caps.color.dpp.dgam_rom_caps.srgb = 1;
-       dc->caps.color.dpp.dgam_rom_caps.bt2020 = 1;
-       dc->caps.color.dpp.dgam_rom_caps.gamma2_2 = 1;
-       dc->caps.color.dpp.dgam_rom_caps.pq = 1;
-       dc->caps.color.dpp.dgam_rom_caps.hlg = 1;
-       dc->caps.color.dpp.post_csc = 1;
-       dc->caps.color.dpp.gamma_corr = 1;
-       dc->caps.color.dpp.dgam_rom_for_yuv = 0;
-
-       dc->caps.color.dpp.hw_3d_lut = 1;
-       dc->caps.color.dpp.ogam_ram = 1;
-       // no OGAM ROM on DCN3
-       dc->caps.color.dpp.ogam_rom_caps.srgb = 0;
-       dc->caps.color.dpp.ogam_rom_caps.bt2020 = 0;
-       dc->caps.color.dpp.ogam_rom_caps.gamma2_2 = 0;
-       dc->caps.color.dpp.ogam_rom_caps.pq = 0;
-       dc->caps.color.dpp.ogam_rom_caps.hlg = 0;
-       dc->caps.color.dpp.ocsc = 0;
-
-       dc->caps.color.mpc.gamut_remap = 1;
-       dc->caps.color.mpc.num_3dluts = pool->base.res_cap->num_mpc_3dlut; //3
-       dc->caps.color.mpc.ogam_ram = 1;
-       dc->caps.color.mpc.ogam_rom_caps.srgb = 0;
-       dc->caps.color.mpc.ogam_rom_caps.bt2020 = 0;
-       dc->caps.color.mpc.ogam_rom_caps.gamma2_2 = 0;
-       dc->caps.color.mpc.ogam_rom_caps.pq = 0;
-       dc->caps.color.mpc.ogam_rom_caps.hlg = 0;
-       dc->caps.color.mpc.ocsc = 1;
-
-       dc->caps.dp_hdmi21_pcon_support = true;
-       dc->caps.max_v_total = (1 << 15) - 1;
-
-       /* read VBIOS LTTPR caps */
-       {
-               if (ctx->dc_bios->funcs->get_lttpr_caps) {
-                       enum bp_result bp_query_result;
-                       uint8_t is_vbios_lttpr_enable = 0;
-
-                       bp_query_result = ctx->dc_bios->funcs->get_lttpr_caps(ctx->dc_bios, &is_vbios_lttpr_enable);
-                       dc->caps.vbios_lttpr_enable = (bp_query_result == BP_RESULT_OK) && !!is_vbios_lttpr_enable;
-               }
-
-               if (ctx->dc_bios->funcs->get_lttpr_interop) {
-                       enum bp_result bp_query_result;
-                       uint8_t is_vbios_interop_enabled = 0;
-
-                       bp_query_result = ctx->dc_bios->funcs->get_lttpr_interop(ctx->dc_bios,
-                                       &is_vbios_interop_enabled);
-                       dc->caps.vbios_lttpr_aware = (bp_query_result == BP_RESULT_OK) && !!is_vbios_interop_enabled;
-               }
-       }
-
-       if (dc->ctx->dce_environment == DCE_ENV_PRODUCTION_DRV)
-               dc->debug = debug_defaults_drv;
-
-       // Init the vm_helper
-       if (dc->vm_helper)
-               vm_helper_init(dc->vm_helper, 16);
-
-       /*************************************************
-        *  Create resources                             *
-        *************************************************/
-
-       /* Clock Sources for Pixel Clock*/
-       pool->base.clock_sources[DCN30_CLK_SRC_PLL0] =
-                       dcn30_clock_source_create(ctx, ctx->dc_bios,
-                               CLOCK_SOURCE_COMBO_PHY_PLL0,
-                               &clk_src_regs[0], false);
-       pool->base.clock_sources[DCN30_CLK_SRC_PLL1] =
-                       dcn30_clock_source_create(ctx, ctx->dc_bios,
-                               CLOCK_SOURCE_COMBO_PHY_PLL1,
-                               &clk_src_regs[1], false);
-       pool->base.clock_sources[DCN30_CLK_SRC_PLL2] =
-                       dcn30_clock_source_create(ctx, ctx->dc_bios,
-                               CLOCK_SOURCE_COMBO_PHY_PLL2,
-                               &clk_src_regs[2], false);
-       pool->base.clock_sources[DCN30_CLK_SRC_PLL3] =
-                       dcn30_clock_source_create(ctx, ctx->dc_bios,
-                               CLOCK_SOURCE_COMBO_PHY_PLL3,
-                               &clk_src_regs[3], false);
-       pool->base.clock_sources[DCN30_CLK_SRC_PLL4] =
-                       dcn30_clock_source_create(ctx, ctx->dc_bios,
-                               CLOCK_SOURCE_COMBO_PHY_PLL4,
-                               &clk_src_regs[4], false);
-       pool->base.clock_sources[DCN30_CLK_SRC_PLL5] =
-                       dcn30_clock_source_create(ctx, ctx->dc_bios,
-                               CLOCK_SOURCE_COMBO_PHY_PLL5,
-                               &clk_src_regs[5], false);
-
-       pool->base.clk_src_count = DCN30_CLK_SRC_TOTAL;
-
-       /* todo: not reuse phy_pll registers */
-       pool->base.dp_clock_source =
-                       dcn30_clock_source_create(ctx, ctx->dc_bios,
-                               CLOCK_SOURCE_ID_DP_DTO,
-                               &clk_src_regs[0], true);
-
-       for (i = 0; i < pool->base.clk_src_count; i++) {
-               if (pool->base.clock_sources[i] == NULL) {
-                       dm_error("DC: failed to create clock sources!\n");
-                       BREAK_TO_DEBUGGER();
-                       goto create_fail;
-               }
-       }
-
-       /* DCCG */
-       pool->base.dccg = dccg30_create(ctx, &dccg_regs, &dccg_shift, &dccg_mask);
-       if (pool->base.dccg == NULL) {
-               dm_error("DC: failed to create dccg!\n");
-               BREAK_TO_DEBUGGER();
-               goto create_fail;
-       }
-
-       /* PP Lib and SMU interfaces */
-       init_soc_bounding_box(dc, pool);
-
-       num_pipes = dcn3_0_ip.max_num_dpp;
-
-       for (i = 0; i < dcn3_0_ip.max_num_dpp; i++)
-               if (pipe_fuses & 1 << i)
-                       num_pipes--;
-
-       dcn3_0_ip.max_num_dpp = num_pipes;
-       dcn3_0_ip.max_num_otg = num_pipes;
-
-       dml_init_instance(&dc->dml, &dcn3_0_soc, &dcn3_0_ip, DML_PROJECT_DCN30);
-
-       /* IRQ */
-       init_data.ctx = dc->ctx;
-       pool->base.irqs = dal_irq_service_dcn30_create(&init_data);
-       if (!pool->base.irqs)
-               goto create_fail;
-
-       /* HUBBUB */
-       pool->base.hubbub = dcn30_hubbub_create(ctx);
-       if (pool->base.hubbub == NULL) {
-               BREAK_TO_DEBUGGER();
-               dm_error("DC: failed to create hubbub!\n");
-               goto create_fail;
-       }
-
-       /* HUBPs, DPPs, OPPs and TGs */
-       for (i = 0; i < pool->base.pipe_count; i++) {
-               pool->base.hubps[i] = dcn30_hubp_create(ctx, i);
-               if (pool->base.hubps[i] == NULL) {
-                       BREAK_TO_DEBUGGER();
-                       dm_error(
-                               "DC: failed to create hubps!\n");
-                       goto create_fail;
-               }
-
-               pool->base.dpps[i] = dcn30_dpp_create(ctx, i);
-               if (pool->base.dpps[i] == NULL) {
-                       BREAK_TO_DEBUGGER();
-                       dm_error(
-                               "DC: failed to create dpps!\n");
-                       goto create_fail;
-               }
-       }
-
-       for (i = 0; i < pool->base.res_cap->num_opp; i++) {
-               pool->base.opps[i] = dcn30_opp_create(ctx, i);
-               if (pool->base.opps[i] == NULL) {
-                       BREAK_TO_DEBUGGER();
-                       dm_error(
-                               "DC: failed to create output pixel processor!\n");
-                       goto create_fail;
-               }
-       }
-
-       for (i = 0; i < pool->base.res_cap->num_timing_generator; i++) {
-               pool->base.timing_generators[i] = dcn30_timing_generator_create(
-                               ctx, i);
-               if (pool->base.timing_generators[i] == NULL) {
-                       BREAK_TO_DEBUGGER();
-                       dm_error("DC: failed to create tg!\n");
-                       goto create_fail;
-               }
-       }
-       pool->base.timing_generator_count = i;
-       /* PSR */
-       pool->base.psr = dmub_psr_create(ctx);
-
-       if (pool->base.psr == NULL) {
-               dm_error("DC: failed to create PSR obj!\n");
-               BREAK_TO_DEBUGGER();
-               goto create_fail;
-       }
-
-       /* ABM */
-       for (i = 0; i < pool->base.res_cap->num_timing_generator; i++) {
-               pool->base.multiple_abms[i] = dmub_abm_create(ctx,
-                               &abm_regs[i],
-                               &abm_shift,
-                               &abm_mask);
-               if (pool->base.multiple_abms[i] == NULL) {
-                       dm_error("DC: failed to create abm for pipe %d!\n", i);
-                       BREAK_TO_DEBUGGER();
-                       goto create_fail;
-               }
-       }
-       /* MPC and DSC */
-       pool->base.mpc = dcn30_mpc_create(ctx, pool->base.mpcc_count, pool->base.res_cap->num_mpc_3dlut);
-       if (pool->base.mpc == NULL) {
-               BREAK_TO_DEBUGGER();
-               dm_error("DC: failed to create mpc!\n");
-               goto create_fail;
-       }
-
-       for (i = 0; i < pool->base.res_cap->num_dsc; i++) {
-               pool->base.dscs[i] = dcn30_dsc_create(ctx, i);
-               if (pool->base.dscs[i] == NULL) {
-                       BREAK_TO_DEBUGGER();
-                       dm_error("DC: failed to create display stream compressor %d!\n", i);
-                       goto create_fail;
-               }
-       }
-
-       /* DWB and MMHUBBUB */
-       if (!dcn30_dwbc_create(ctx, &pool->base)) {
-               BREAK_TO_DEBUGGER();
-               dm_error("DC: failed to create dwbc!\n");
-               goto create_fail;
-       }
-
-       if (!dcn30_mmhubbub_create(ctx, &pool->base)) {
-               BREAK_TO_DEBUGGER();
-               dm_error("DC: failed to create mcif_wb!\n");
-               goto create_fail;
-       }
-
-       /* AUX and I2C */
-       for (i = 0; i < pool->base.res_cap->num_ddc; i++) {
-               pool->base.engines[i] = dcn30_aux_engine_create(ctx, i);
-               if (pool->base.engines[i] == NULL) {
-                       BREAK_TO_DEBUGGER();
-                       dm_error(
-                               "DC:failed to create aux engine!!\n");
-                       goto create_fail;
-               }
-               pool->base.hw_i2cs[i] = dcn30_i2c_hw_create(ctx, i);
-               if (pool->base.hw_i2cs[i] == NULL) {
-                       BREAK_TO_DEBUGGER();
-                       dm_error(
-                               "DC:failed to create hw i2c!!\n");
-                       goto create_fail;
-               }
-               pool->base.sw_i2cs[i] = NULL;
-       }
-
-       /* Audio, Stream Encoders including DIG and virtual, MPC 3D LUTs */
-       if (!resource_construct(num_virtual_links, dc, &pool->base,
-                       &res_create_funcs))
-               goto create_fail;
-
-       /* HW Sequencer and Plane caps */
-       dcn30_hw_sequencer_construct(dc);
-
-       dc->caps.max_planes =  pool->base.pipe_count;
-
-       for (i = 0; i < dc->caps.max_planes; ++i)
-               dc->caps.planes[i] = plane_cap;
-
-       dc->cap_funcs = cap_funcs;
-
-       if (dc->ctx->dc_bios->fw_info.oem_i2c_present) {
-               ddc_init_data.ctx = dc->ctx;
-               ddc_init_data.link = NULL;
-               ddc_init_data.id.id = dc->ctx->dc_bios->fw_info.oem_i2c_obj_id;
-               ddc_init_data.id.enum_id = 0;
-               ddc_init_data.id.type = OBJECT_TYPE_GENERIC;
-               pool->base.oem_device = dc->link_srv->create_ddc_service(&ddc_init_data);
-       } else {
-               pool->base.oem_device = NULL;
-       }
-
-       DC_FP_END();
-
-       return true;
-
-create_fail:
-
-       DC_FP_END();
-       dcn30_resource_destruct(pool);
-
-       return false;
-}
-
-struct resource_pool *dcn30_create_resource_pool(
-               const struct dc_init_data *init_data,
-               struct dc *dc)
-{
-       struct dcn30_resource_pool *pool =
-               kzalloc(sizeof(struct dcn30_resource_pool), GFP_KERNEL);
-
-       if (!pool)
-               return NULL;
-
-       if (dcn30_resource_construct(init_data->num_virtual_links, dc, pool))
-               return &pool->base;
-
-       BREAK_TO_DEBUGGER();
-       kfree(pool);
-       return NULL;
-}
diff --git a/drivers/gpu/drm/amd/display/dc/dcn30/dcn30_resource.h b/drivers/gpu/drm/amd/display/dc/dcn30/dcn30_resource.h
deleted file mode 100644 (file)
index 8e6b8b7..0000000
+++ /dev/null
@@ -1,108 +0,0 @@
-/*
- * 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
- *
- */
-
-#ifndef _DCN30_RESOURCE_H_
-#define _DCN30_RESOURCE_H_
-
-#include "core_types.h"
-
-#define TO_DCN30_RES_POOL(pool)\
-       container_of(pool, struct dcn30_resource_pool, base)
-
-struct dc;
-struct resource_pool;
-struct _vcs_dpi_display_pipe_params_st;
-
-extern struct _vcs_dpi_ip_params_st dcn3_0_ip;
-extern struct _vcs_dpi_soc_bounding_box_st dcn3_0_soc;
-
-struct dcn30_resource_pool {
-       struct resource_pool base;
-};
-struct resource_pool *dcn30_create_resource_pool(
-               const struct dc_init_data *init_data,
-               struct dc *dc);
-
-void dcn30_set_mcif_arb_params(
-               struct dc *dc,
-               struct dc_state *context,
-               display_e2e_pipe_params_st *pipes,
-               int pipe_cnt);
-
-unsigned int dcn30_calc_max_scaled_time(
-               unsigned int time_per_pixel,
-               enum mmhubbub_wbif_mode mode,
-               unsigned int urgent_watermark);
-
-bool dcn30_validate_bandwidth(struct dc *dc, struct dc_state *context,
-               bool fast_validate);
-bool dcn30_internal_validate_bw(
-               struct dc *dc,
-               struct dc_state *context,
-               display_e2e_pipe_params_st *pipes,
-               int *pipe_cnt_out,
-               int *vlevel_out,
-               bool fast_validate,
-               bool allow_self_refresh_only);
-void dcn30_calculate_wm_and_dlg(
-               struct dc *dc, struct dc_state *context,
-               display_e2e_pipe_params_st *pipes,
-               int pipe_cnt,
-               int vlevel);
-void dcn30_update_soc_for_wm_a(struct dc *dc, struct dc_state *context);
-void dcn30_populate_dml_writeback_from_context(
-               struct dc *dc, struct resource_context *res_ctx, display_e2e_pipe_params_st *pipes);
-
-int dcn30_populate_dml_pipes_from_context(
-       struct dc *dc, struct dc_state *context,
-       display_e2e_pipe_params_st *pipes,
-       bool fast_validate);
-
-bool dcn30_acquire_post_bldn_3dlut(
-               struct resource_context *res_ctx,
-               const struct resource_pool *pool,
-               int mpcc_id,
-               struct dc_3dlut **lut,
-               struct dc_transfer_func **shaper);
-
-bool dcn30_release_post_bldn_3dlut(
-               struct resource_context *res_ctx,
-               const struct resource_pool *pool,
-               struct dc_3dlut **lut,
-               struct dc_transfer_func **shaper);
-
-enum dc_status dcn30_add_stream_to_ctx(
-               struct dc *dc,
-               struct dc_state *new_ctx,
-               struct dc_stream_state *dc_stream);
-
-void dcn30_update_bw_bounding_box(struct dc *dc, struct clk_bw_params *bw_params);
-
-bool dcn30_can_support_mclk_switch_using_fw_based_vblank_stretch(struct dc *dc, struct dc_state *context);
-void dcn30_setup_mclk_switch_using_fw_based_vblank_stretch(struct dc *dc, struct dc_state *context);
-int dcn30_find_dummy_latency_index_for_fw_based_mclk_switch(struct dc *dc, struct dc_state *context,
-               display_e2e_pipe_params_st *pipes, int pipe_cnt, int vlevel);
-
-#endif /* _DCN30_RESOURCE_H_ */
index 30fbc5e06dcaaa723843dcd9197b37db6c955bcc..cbf59d7e78c4fd934e21413f4028e032b11a09a1 100644 (file)
@@ -10,7 +10,7 @@
 #
 # Makefile for dcn30.
 
-DCN301 = dcn301_init.o dcn301_resource.o dcn301_dccg.o \
+DCN301 = dcn301_init.o dcn301_dccg.o \
                dcn301_dio_link_encoder.o dcn301_panel_cntl.o dcn301_hubbub.o \
                dcn301_optc.o
 
diff --git a/drivers/gpu/drm/amd/display/dc/dcn301/dcn301_resource.c b/drivers/gpu/drm/amd/display/dc/dcn301/dcn301_resource.c
deleted file mode 100644 (file)
index f3b75f2..0000000
+++ /dev/null
@@ -1,1728 +0,0 @@
-/*
- * Copyright 2019-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 "dm_services.h"
-#include "dc.h"
-
-#include "dcn301_init.h"
-
-#include "resource.h"
-#include "include/irq_service_interface.h"
-#include "dcn30/dcn30_resource.h"
-#include "dcn301_resource.h"
-
-#include "dcn20/dcn20_resource.h"
-
-#include "dcn10/dcn10_ipp.h"
-#include "dcn301/dcn301_hubbub.h"
-#include "dcn30/dcn30_mpc.h"
-#include "dcn30/dcn30_hubp.h"
-#include "irq/dcn30/irq_service_dcn30.h"
-#include "dcn30/dcn30_dpp.h"
-#include "dcn301/dcn301_optc.h"
-#include "dcn20/dcn20_hwseq.h"
-#include "dcn30/dcn30_hwseq.h"
-#include "dce110/dce110_hwseq.h"
-#include "dcn30/dcn30_opp.h"
-#include "dcn20/dcn20_dsc.h"
-#include "dcn30/dcn30_vpg.h"
-#include "dcn30/dcn30_afmt.h"
-#include "dce/dce_clock_source.h"
-#include "dce/dce_audio.h"
-#include "dce/dce_hwseq.h"
-#include "clk_mgr.h"
-#include "virtual/virtual_stream_encoder.h"
-#include "dce110/dce110_resource.h"
-#include "dml/display_mode_vba.h"
-#include "dcn301/dcn301_dccg.h"
-#include "dcn10/dcn10_resource.h"
-#include "dcn30/dcn30_dio_stream_encoder.h"
-#include "dcn301/dcn301_dio_link_encoder.h"
-#include "dcn301_panel_cntl.h"
-
-#include "vangogh_ip_offset.h"
-
-#include "dcn30/dcn30_dwb.h"
-#include "dcn30/dcn30_mmhubbub.h"
-
-#include "dcn/dcn_3_0_1_offset.h"
-#include "dcn/dcn_3_0_1_sh_mask.h"
-
-#include "nbio/nbio_7_2_0_offset.h"
-
-#include "dpcs/dpcs_3_0_0_offset.h"
-#include "dpcs/dpcs_3_0_0_sh_mask.h"
-
-#include "reg_helper.h"
-#include "dce/dmub_abm.h"
-#include "dce/dce_aux.h"
-#include "dce/dce_i2c.h"
-
-#include "dml/dcn30/dcn30_fpu.h"
-
-#include "dml/dcn30/display_mode_vba_30.h"
-#include "dml/dcn301/dcn301_fpu.h"
-#include "vm_helper.h"
-#include "dcn20/dcn20_vmid.h"
-#include "amdgpu_socbb.h"
-
-#define TO_DCN301_RES_POOL(pool)\
-       container_of(pool, struct dcn301_resource_pool, base)
-
-#define DC_LOGGER \
-       dc->ctx->logger
-#define DC_LOGGER_INIT(logger)
-
-enum dcn301_clk_src_array_id {
-       DCN301_CLK_SRC_PLL0,
-       DCN301_CLK_SRC_PLL1,
-       DCN301_CLK_SRC_PLL2,
-       DCN301_CLK_SRC_PLL3,
-       DCN301_CLK_SRC_TOTAL
-};
-
-/* begin *********************
- * macros to expend register list macro defined in HW object header file
- */
-
-/* DCN */
-#define BASE_INNER(seg) DCN_BASE__INST0_SEG ## seg
-
-#define BASE(seg) BASE_INNER(seg)
-
-#define SR(reg_name)\
-               .reg_name = BASE(mm ## reg_name ## _BASE_IDX) +  \
-                                       mm ## reg_name
-
-#define SRI(reg_name, block, id)\
-       .reg_name = BASE(mm ## block ## id ## _ ## reg_name ## _BASE_IDX) + \
-                                       mm ## block ## id ## _ ## reg_name
-
-#define SRI2(reg_name, block, id)\
-       .reg_name = BASE(mm ## reg_name ## _BASE_IDX) + \
-                                       mm ## reg_name
-
-#define SRIR(var_name, reg_name, block, id)\
-       .var_name = BASE(mm ## block ## id ## _ ## reg_name ## _BASE_IDX) + \
-                                       mm ## block ## id ## _ ## reg_name
-
-#define SRII(reg_name, block, id)\
-       .reg_name[id] = BASE(mm ## block ## id ## _ ## reg_name ## _BASE_IDX) + \
-                                       mm ## block ## id ## _ ## reg_name
-
-#define SRII2(reg_name_pre, reg_name_post, id)\
-       .reg_name_pre ## _ ##  reg_name_post[id] = BASE(mm ## reg_name_pre \
-                       ## id ## _ ## reg_name_post ## _BASE_IDX) + \
-                       mm ## reg_name_pre ## id ## _ ## reg_name_post
-
-#define SRII_MPC_RMU(reg_name, block, id)\
-       .RMU##_##reg_name[id] = BASE(mm ## block ## id ## _ ## reg_name ## _BASE_IDX) + \
-                                       mm ## block ## id ## _ ## reg_name
-
-#define SRII_DWB(reg_name, temp_name, block, id)\
-       .reg_name[id] = BASE(mm ## block ## id ## _ ## temp_name ## _BASE_IDX) + \
-                                       mm ## block ## id ## _ ## temp_name
-
-#define SF_DWB2(reg_name, block, id, field_name, post_fix)     \
-       .field_name = reg_name ## __ ## field_name ## post_fix
-
-#define DCCG_SRII(reg_name, block, id)\
-       .block ## _ ## reg_name[id] = BASE(mm ## block ## id ## _ ## reg_name ## _BASE_IDX) + \
-                                       mm ## block ## id ## _ ## reg_name
-
-#define VUPDATE_SRII(reg_name, block, id)\
-       .reg_name[id] = BASE(mm ## reg_name ## _ ## block ## id ## _BASE_IDX) + \
-                                       mm ## reg_name ## _ ## block ## id
-
-/* NBIO */
-#define NBIO_BASE_INNER(seg) \
-       NBIO_BASE__INST0_SEG ## seg
-
-#define NBIO_BASE(seg) \
-       NBIO_BASE_INNER(seg)
-
-#define NBIO_SR(reg_name)\
-               .reg_name = NBIO_BASE(regBIF_BX0_ ## reg_name ## _BASE_IDX) + \
-                                       regBIF_BX0_ ## reg_name
-
-/* MMHUB */
-#define MMHUB_BASE_INNER(seg) \
-       MMHUB_BASE__INST0_SEG ## seg
-
-#define MMHUB_BASE(seg) \
-       MMHUB_BASE_INNER(seg)
-
-#define MMHUB_SR(reg_name)\
-               .reg_name = MMHUB_BASE(regMM ## reg_name ## _BASE_IDX) + \
-                                       regMM ## reg_name
-
-/* CLOCK */
-#define CLK_BASE_INNER(seg) \
-       CLK_BASE__INST0_SEG ## seg
-
-#define CLK_BASE(seg) \
-       CLK_BASE_INNER(seg)
-
-#define CLK_SRI(reg_name, block, inst)\
-       .reg_name = CLK_BASE(mm ## block ## _ ## inst ## _ ## reg_name ## _BASE_IDX) + \
-                                       mm ## block ## _ ## inst ## _ ## reg_name
-
-static const struct bios_registers bios_regs = {
-               NBIO_SR(BIOS_SCRATCH_3),
-               NBIO_SR(BIOS_SCRATCH_6)
-};
-
-#define clk_src_regs(index, pllid)\
-[index] = {\
-       CS_COMMON_REG_LIST_DCN3_01(index, pllid),\
-}
-
-static const struct dce110_clk_src_regs clk_src_regs[] = {
-       clk_src_regs(0, A),
-       clk_src_regs(1, B),
-       clk_src_regs(2, C),
-       clk_src_regs(3, D)
-};
-
-static const struct dce110_clk_src_shift cs_shift = {
-               CS_COMMON_MASK_SH_LIST_DCN2_0(__SHIFT)
-};
-
-static const struct dce110_clk_src_mask cs_mask = {
-               CS_COMMON_MASK_SH_LIST_DCN2_0(_MASK)
-};
-
-#define abm_regs(id)\
-[id] = {\
-               ABM_DCN301_REG_LIST(id)\
-}
-
-static const struct dce_abm_registers abm_regs[] = {
-               abm_regs(0),
-               abm_regs(1),
-               abm_regs(2),
-               abm_regs(3),
-};
-
-static const struct dce_abm_shift abm_shift = {
-               ABM_MASK_SH_LIST_DCN30(__SHIFT)
-};
-
-static const struct dce_abm_mask abm_mask = {
-               ABM_MASK_SH_LIST_DCN30(_MASK)
-};
-
-#define audio_regs(id)\
-[id] = {\
-               AUD_COMMON_REG_LIST(id)\
-}
-
-static const struct dce_audio_registers audio_regs[] = {
-       audio_regs(0),
-       audio_regs(1),
-       audio_regs(2),
-       audio_regs(3),
-       audio_regs(4),
-       audio_regs(5),
-       audio_regs(6)
-};
-
-#define DCE120_AUD_COMMON_MASK_SH_LIST(mask_sh)\
-               SF(AZF0ENDPOINT0_AZALIA_F0_CODEC_ENDPOINT_INDEX, AZALIA_ENDPOINT_REG_INDEX, mask_sh),\
-               SF(AZF0ENDPOINT0_AZALIA_F0_CODEC_ENDPOINT_DATA, AZALIA_ENDPOINT_REG_DATA, mask_sh),\
-               AUD_COMMON_MASK_SH_LIST_BASE(mask_sh)
-
-static const struct dce_audio_shift audio_shift = {
-               DCE120_AUD_COMMON_MASK_SH_LIST(__SHIFT)
-};
-
-static const struct dce_audio_mask audio_mask = {
-               DCE120_AUD_COMMON_MASK_SH_LIST(_MASK)
-};
-
-#define vpg_regs(id)\
-[id] = {\
-       VPG_DCN3_REG_LIST(id)\
-}
-
-static const struct dcn30_vpg_registers vpg_regs[] = {
-       vpg_regs(0),
-       vpg_regs(1),
-       vpg_regs(2),
-       vpg_regs(3),
-};
-
-static const struct dcn30_vpg_shift vpg_shift = {
-       DCN3_VPG_MASK_SH_LIST(__SHIFT)
-};
-
-static const struct dcn30_vpg_mask vpg_mask = {
-       DCN3_VPG_MASK_SH_LIST(_MASK)
-};
-
-#define afmt_regs(id)\
-[id] = {\
-       AFMT_DCN3_REG_LIST(id)\
-}
-
-static const struct dcn30_afmt_registers afmt_regs[] = {
-       afmt_regs(0),
-       afmt_regs(1),
-       afmt_regs(2),
-       afmt_regs(3),
-};
-
-static const struct dcn30_afmt_shift afmt_shift = {
-       DCN3_AFMT_MASK_SH_LIST(__SHIFT)
-};
-
-static const struct dcn30_afmt_mask afmt_mask = {
-       DCN3_AFMT_MASK_SH_LIST(_MASK)
-};
-
-#define stream_enc_regs(id)\
-[id] = {\
-       SE_DCN3_REG_LIST(id)\
-}
-
-static const struct dcn10_stream_enc_registers stream_enc_regs[] = {
-       stream_enc_regs(0),
-       stream_enc_regs(1),
-       stream_enc_regs(2),
-       stream_enc_regs(3),
-};
-
-static const struct dcn10_stream_encoder_shift se_shift = {
-               SE_COMMON_MASK_SH_LIST_DCN30(__SHIFT)
-};
-
-static const struct dcn10_stream_encoder_mask se_mask = {
-               SE_COMMON_MASK_SH_LIST_DCN30(_MASK)
-};
-
-
-#define aux_regs(id)\
-[id] = {\
-       DCN2_AUX_REG_LIST(id)\
-}
-
-static const struct dcn10_link_enc_aux_registers link_enc_aux_regs[] = {
-               aux_regs(0),
-               aux_regs(1),
-               aux_regs(2),
-               aux_regs(3),
-};
-
-#define hpd_regs(id)\
-[id] = {\
-       HPD_REG_LIST(id)\
-}
-
-static const struct dcn10_link_enc_hpd_registers link_enc_hpd_regs[] = {
-               hpd_regs(0),
-               hpd_regs(1),
-               hpd_regs(2),
-               hpd_regs(3),
-};
-
-
-#define link_regs(id, phyid)\
-[id] = {\
-       LE_DCN301_REG_LIST(id), \
-       UNIPHY_DCN2_REG_LIST(phyid), \
-       DPCS_DCN2_REG_LIST(id), \
-       SRI(DP_DPHY_INTERNAL_CTRL, DP, id) \
-}
-
-static const struct dce110_aux_registers_shift aux_shift = {
-       DCN_AUX_MASK_SH_LIST(__SHIFT)
-};
-
-static const struct dce110_aux_registers_mask aux_mask = {
-       DCN_AUX_MASK_SH_LIST(_MASK)
-};
-
-static const struct dcn10_link_enc_registers link_enc_regs[] = {
-       link_regs(0, A),
-       link_regs(1, B),
-       link_regs(2, C),
-       link_regs(3, D),
-};
-
-static const struct dcn10_link_enc_shift le_shift = {
-       LINK_ENCODER_MASK_SH_LIST_DCN301(__SHIFT),\
-       DPCS_DCN2_MASK_SH_LIST(__SHIFT)
-};
-
-static const struct dcn10_link_enc_mask le_mask = {
-       LINK_ENCODER_MASK_SH_LIST_DCN301(_MASK),\
-       DPCS_DCN2_MASK_SH_LIST(_MASK)
-};
-
-#define panel_cntl_regs(id)\
-[id] = {\
-       DCN301_PANEL_CNTL_REG_LIST(id),\
-}
-
-static const struct dce_panel_cntl_registers panel_cntl_regs[] = {
-       panel_cntl_regs(0),
-       panel_cntl_regs(1),
-};
-
-static const struct dcn301_panel_cntl_shift panel_cntl_shift = {
-       DCN301_PANEL_CNTL_MASK_SH_LIST(__SHIFT)
-};
-
-static const struct dcn301_panel_cntl_mask panel_cntl_mask = {
-       DCN301_PANEL_CNTL_MASK_SH_LIST(_MASK)
-};
-
-#define dpp_regs(id)\
-[id] = {\
-       DPP_REG_LIST_DCN30(id),\
-}
-
-static const struct dcn3_dpp_registers dpp_regs[] = {
-       dpp_regs(0),
-       dpp_regs(1),
-       dpp_regs(2),
-       dpp_regs(3),
-};
-
-static const struct dcn3_dpp_shift tf_shift = {
-               DPP_REG_LIST_SH_MASK_DCN30(__SHIFT)
-};
-
-static const struct dcn3_dpp_mask tf_mask = {
-               DPP_REG_LIST_SH_MASK_DCN30(_MASK)
-};
-
-#define opp_regs(id)\
-[id] = {\
-       OPP_REG_LIST_DCN30(id),\
-}
-
-static const struct dcn20_opp_registers opp_regs[] = {
-       opp_regs(0),
-       opp_regs(1),
-       opp_regs(2),
-       opp_regs(3),
-};
-
-static const struct dcn20_opp_shift opp_shift = {
-       OPP_MASK_SH_LIST_DCN20(__SHIFT)
-};
-
-static const struct dcn20_opp_mask opp_mask = {
-       OPP_MASK_SH_LIST_DCN20(_MASK)
-};
-
-#define aux_engine_regs(id)\
-[id] = {\
-       AUX_COMMON_REG_LIST0(id), \
-       .AUXN_IMPCAL = 0, \
-       .AUXP_IMPCAL = 0, \
-       .AUX_RESET_MASK = DP_AUX0_AUX_CONTROL__AUX_RESET_MASK, \
-}
-
-static const struct dce110_aux_registers aux_engine_regs[] = {
-               aux_engine_regs(0),
-               aux_engine_regs(1),
-               aux_engine_regs(2),
-               aux_engine_regs(3),
-};
-
-#define dwbc_regs_dcn3(id)\
-[id] = {\
-       DWBC_COMMON_REG_LIST_DCN30(id),\
-}
-
-static const struct dcn30_dwbc_registers dwbc30_regs[] = {
-       dwbc_regs_dcn3(0),
-};
-
-static const struct dcn30_dwbc_shift dwbc30_shift = {
-       DWBC_COMMON_MASK_SH_LIST_DCN30(__SHIFT)
-};
-
-static const struct dcn30_dwbc_mask dwbc30_mask = {
-       DWBC_COMMON_MASK_SH_LIST_DCN30(_MASK)
-};
-
-#define mcif_wb_regs_dcn3(id)\
-[id] = {\
-       MCIF_WB_COMMON_REG_LIST_DCN30(id),\
-}
-
-static const struct dcn30_mmhubbub_registers mcif_wb30_regs[] = {
-       mcif_wb_regs_dcn3(0)
-};
-
-static const struct dcn30_mmhubbub_shift mcif_wb30_shift = {
-       MCIF_WB_COMMON_MASK_SH_LIST_DCN30(__SHIFT)
-};
-
-static const struct dcn30_mmhubbub_mask mcif_wb30_mask = {
-       MCIF_WB_COMMON_MASK_SH_LIST_DCN30(_MASK)
-};
-
-#define dsc_regsDCN20(id)\
-[id] = {\
-       DSC_REG_LIST_DCN20(id)\
-}
-
-static const struct dcn20_dsc_registers dsc_regs[] = {
-       dsc_regsDCN20(0),
-       dsc_regsDCN20(1),
-       dsc_regsDCN20(2),
-};
-
-static const struct dcn20_dsc_shift dsc_shift = {
-       DSC_REG_LIST_SH_MASK_DCN20(__SHIFT)
-};
-
-static const struct dcn20_dsc_mask dsc_mask = {
-       DSC_REG_LIST_SH_MASK_DCN20(_MASK)
-};
-
-static const struct dcn30_mpc_registers mpc_regs = {
-               MPC_REG_LIST_DCN3_0(0),
-               MPC_REG_LIST_DCN3_0(1),
-               MPC_REG_LIST_DCN3_0(2),
-               MPC_REG_LIST_DCN3_0(3),
-               MPC_OUT_MUX_REG_LIST_DCN3_0(0),
-               MPC_OUT_MUX_REG_LIST_DCN3_0(1),
-               MPC_OUT_MUX_REG_LIST_DCN3_0(2),
-               MPC_OUT_MUX_REG_LIST_DCN3_0(3),
-               MPC_RMU_GLOBAL_REG_LIST_DCN3AG,
-               MPC_RMU_REG_LIST_DCN3AG(0),
-               MPC_RMU_REG_LIST_DCN3AG(1),
-               MPC_DWB_MUX_REG_LIST_DCN3_0(0),
-};
-
-static const struct dcn30_mpc_shift mpc_shift = {
-       MPC_COMMON_MASK_SH_LIST_DCN30(__SHIFT)
-};
-
-static const struct dcn30_mpc_mask mpc_mask = {
-       MPC_COMMON_MASK_SH_LIST_DCN30(_MASK)
-};
-
-#define optc_regs(id)\
-[id] = {OPTC_COMMON_REG_LIST_DCN3_0(id)}
-
-
-static const struct dcn_optc_registers optc_regs[] = {
-       optc_regs(0),
-       optc_regs(1),
-       optc_regs(2),
-       optc_regs(3),
-};
-
-static const struct dcn_optc_shift optc_shift = {
-       OPTC_COMMON_MASK_SH_LIST_DCN30(__SHIFT)
-};
-
-static const struct dcn_optc_mask optc_mask = {
-       OPTC_COMMON_MASK_SH_LIST_DCN30(_MASK)
-};
-
-#define hubp_regs(id)\
-[id] = {\
-       HUBP_REG_LIST_DCN30(id)\
-}
-
-static const struct dcn_hubp2_registers hubp_regs[] = {
-               hubp_regs(0),
-               hubp_regs(1),
-               hubp_regs(2),
-               hubp_regs(3),
-};
-
-static const struct dcn_hubp2_shift hubp_shift = {
-               HUBP_MASK_SH_LIST_DCN30(__SHIFT)
-};
-
-static const struct dcn_hubp2_mask hubp_mask = {
-               HUBP_MASK_SH_LIST_DCN30(_MASK)
-};
-
-static const struct dcn_hubbub_registers hubbub_reg = {
-               HUBBUB_REG_LIST_DCN301(0)
-};
-
-static const struct dcn_hubbub_shift hubbub_shift = {
-               HUBBUB_MASK_SH_LIST_DCN301(__SHIFT)
-};
-
-static const struct dcn_hubbub_mask hubbub_mask = {
-               HUBBUB_MASK_SH_LIST_DCN301(_MASK)
-};
-
-static const struct dccg_registers dccg_regs = {
-               DCCG_REG_LIST_DCN301()
-};
-
-static const struct dccg_shift dccg_shift = {
-               DCCG_MASK_SH_LIST_DCN301(__SHIFT)
-};
-
-static const struct dccg_mask dccg_mask = {
-               DCCG_MASK_SH_LIST_DCN301(_MASK)
-};
-
-static const struct dce_hwseq_registers hwseq_reg = {
-               HWSEQ_DCN301_REG_LIST()
-};
-
-static const struct dce_hwseq_shift hwseq_shift = {
-               HWSEQ_DCN301_MASK_SH_LIST(__SHIFT)
-};
-
-static const struct dce_hwseq_mask hwseq_mask = {
-               HWSEQ_DCN301_MASK_SH_LIST(_MASK)
-};
-#define vmid_regs(id)\
-[id] = {\
-               DCN20_VMID_REG_LIST(id)\
-}
-
-static const struct dcn_vmid_registers vmid_regs[] = {
-       vmid_regs(0),
-       vmid_regs(1),
-       vmid_regs(2),
-       vmid_regs(3),
-       vmid_regs(4),
-       vmid_regs(5),
-       vmid_regs(6),
-       vmid_regs(7),
-       vmid_regs(8),
-       vmid_regs(9),
-       vmid_regs(10),
-       vmid_regs(11),
-       vmid_regs(12),
-       vmid_regs(13),
-       vmid_regs(14),
-       vmid_regs(15)
-};
-
-static const struct dcn20_vmid_shift vmid_shifts = {
-               DCN20_VMID_MASK_SH_LIST(__SHIFT)
-};
-
-static const struct dcn20_vmid_mask vmid_masks = {
-               DCN20_VMID_MASK_SH_LIST(_MASK)
-};
-
-static struct resource_caps res_cap_dcn301 = {
-       .num_timing_generator = 4,
-       .num_opp = 4,
-       .num_video_plane = 4,
-       .num_audio = 4,
-       .num_stream_encoder = 4,
-       .num_pll = 4,
-       .num_dwb = 1,
-       .num_ddc = 4,
-       .num_vmid = 16,
-       .num_mpc_3dlut = 2,
-       .num_dsc = 3,
-};
-
-static const struct dc_plane_cap plane_cap = {
-       .type = DC_PLANE_TYPE_DCN_UNIVERSAL,
-       .per_pixel_alpha = true,
-
-       .pixel_format_support = {
-                       .argb8888 = true,
-                       .nv12 = true,
-                       .fp16 = true,
-                       .p010 = true,
-                       .ayuv = false,
-       },
-
-       .max_upscale_factor = {
-                       .argb8888 = 16000,
-                       .nv12 = 16000,
-                       .fp16 = 16000
-       },
-
-       /* 6:1 downscaling ratio: 1000/6 = 166.666 */
-       .max_downscale_factor = {
-                       .argb8888 = 167,
-                       .nv12 = 167,
-                       .fp16 = 167 
-       },
-       64,
-       64
-};
-
-static const struct dc_debug_options debug_defaults_drv = {
-       .disable_dmcu = true,
-       .force_abm_enable = false,
-       .timing_trace = false,
-       .clock_trace = true,
-       .disable_dpp_power_gate = false,
-       .disable_hubp_power_gate = false,
-       .disable_clock_gate = true,
-       .disable_pplib_clock_request = true,
-       .disable_pplib_wm_range = true,
-       .pipe_split_policy = MPC_SPLIT_DYNAMIC,
-       .force_single_disp_pipe_split = false,
-       .disable_dcc = DCC_ENABLE,
-       .vsr_support = true,
-       .performance_trace = false,
-       .max_downscale_src_width = 7680,/*upto 8K*/
-       .scl_reset_length10 = true,
-       .sanity_checks = false,
-       .underflow_assert_delay_us = 0xFFFFFFFF,
-       .dwb_fi_phase = -1, // -1 = disable
-       .dmub_command_table = true,
-       .use_max_lb = false,
-       .exit_idle_opt_for_cursor_updates = true,
-       .using_dml2 = false,
-};
-
-static void dcn301_dpp_destroy(struct dpp **dpp)
-{
-       kfree(TO_DCN20_DPP(*dpp));
-       *dpp = NULL;
-}
-
-static struct dpp *dcn301_dpp_create(struct dc_context *ctx, uint32_t inst)
-{
-       struct dcn3_dpp *dpp =
-               kzalloc(sizeof(struct dcn3_dpp), GFP_KERNEL);
-
-       if (!dpp)
-               return NULL;
-
-       if (dpp3_construct(dpp, ctx, inst,
-                       &dpp_regs[inst], &tf_shift, &tf_mask))
-               return &dpp->base;
-
-       BREAK_TO_DEBUGGER();
-       kfree(dpp);
-       return NULL;
-}
-static struct output_pixel_processor *dcn301_opp_create(struct dc_context *ctx,
-                                                       uint32_t inst)
-{
-       struct dcn20_opp *opp =
-               kzalloc(sizeof(struct dcn20_opp), GFP_KERNEL);
-
-       if (!opp) {
-               BREAK_TO_DEBUGGER();
-               return NULL;
-       }
-
-       dcn20_opp_construct(opp, ctx, inst,
-                       &opp_regs[inst], &opp_shift, &opp_mask);
-       return &opp->base;
-}
-
-static struct dce_aux *dcn301_aux_engine_create(struct dc_context *ctx, uint32_t inst)
-{
-       struct aux_engine_dce110 *aux_engine =
-               kzalloc(sizeof(struct aux_engine_dce110), GFP_KERNEL);
-
-       if (!aux_engine)
-               return NULL;
-
-       dce110_aux_engine_construct(aux_engine, ctx, inst,
-                                   SW_AUX_TIMEOUT_PERIOD_MULTIPLIER * AUX_TIMEOUT_PERIOD,
-                                   &aux_engine_regs[inst],
-                                       &aux_mask,
-                                       &aux_shift,
-                                       ctx->dc->caps.extended_aux_timeout_support);
-
-       return &aux_engine->base;
-}
-#define i2c_inst_regs(id) { I2C_HW_ENGINE_COMMON_REG_LIST(id) }
-
-static const struct dce_i2c_registers i2c_hw_regs[] = {
-               i2c_inst_regs(1),
-               i2c_inst_regs(2),
-               i2c_inst_regs(3),
-               i2c_inst_regs(4),
-};
-
-static const struct dce_i2c_shift i2c_shifts = {
-               I2C_COMMON_MASK_SH_LIST_DCN2(__SHIFT)
-};
-
-static const struct dce_i2c_mask i2c_masks = {
-               I2C_COMMON_MASK_SH_LIST_DCN2(_MASK)
-};
-
-static struct dce_i2c_hw *dcn301_i2c_hw_create(struct dc_context *ctx, uint32_t inst)
-{
-       struct dce_i2c_hw *dce_i2c_hw =
-               kzalloc(sizeof(struct dce_i2c_hw), GFP_KERNEL);
-
-       if (!dce_i2c_hw)
-               return NULL;
-
-       dcn2_i2c_hw_construct(dce_i2c_hw, ctx, inst,
-                                   &i2c_hw_regs[inst], &i2c_shifts, &i2c_masks);
-
-       return dce_i2c_hw;
-}
-static struct mpc *dcn301_mpc_create(
-               struct dc_context *ctx,
-               int num_mpcc,
-               int num_rmu)
-{
-       struct dcn30_mpc *mpc30 = kzalloc(sizeof(struct dcn30_mpc),
-                                         GFP_KERNEL);
-
-       if (!mpc30)
-               return NULL;
-
-       dcn30_mpc_construct(mpc30, ctx,
-                       &mpc_regs,
-                       &mpc_shift,
-                       &mpc_mask,
-                       num_mpcc,
-                       num_rmu);
-
-       return &mpc30->base;
-}
-
-static struct hubbub *dcn301_hubbub_create(struct dc_context *ctx)
-{
-       int i;
-
-       struct dcn20_hubbub *hubbub3 = kzalloc(sizeof(struct dcn20_hubbub),
-                                         GFP_KERNEL);
-
-       if (!hubbub3)
-               return NULL;
-
-       hubbub301_construct(hubbub3, ctx,
-                       &hubbub_reg,
-                       &hubbub_shift,
-                       &hubbub_mask);
-
-
-       for (i = 0; i < res_cap_dcn301.num_vmid; i++) {
-               struct dcn20_vmid *vmid = &hubbub3->vmid[i];
-
-               vmid->ctx = ctx;
-
-               vmid->regs = &vmid_regs[i];
-               vmid->shifts = &vmid_shifts;
-               vmid->masks = &vmid_masks;
-       }
-
-       hubbub3->num_vmid = res_cap_dcn301.num_vmid;
-
-       return &hubbub3->base;
-}
-
-static struct timing_generator *dcn301_timing_generator_create(
-       struct dc_context *ctx, uint32_t instance)
-{
-       struct optc *tgn10 =
-               kzalloc(sizeof(struct optc), GFP_KERNEL);
-
-       if (!tgn10)
-               return NULL;
-
-       tgn10->base.inst = instance;
-       tgn10->base.ctx = ctx;
-
-       tgn10->tg_regs = &optc_regs[instance];
-       tgn10->tg_shift = &optc_shift;
-       tgn10->tg_mask = &optc_mask;
-
-       dcn301_timing_generator_init(tgn10);
-
-       return &tgn10->base;
-}
-
-static const struct encoder_feature_support link_enc_feature = {
-               .max_hdmi_deep_color = COLOR_DEPTH_121212,
-               .max_hdmi_pixel_clock = 600000,
-               .hdmi_ycbcr420_supported = true,
-               .dp_ycbcr420_supported = true,
-               .fec_supported = true,
-               .flags.bits.IS_HBR2_CAPABLE = true,
-               .flags.bits.IS_HBR3_CAPABLE = true,
-               .flags.bits.IS_TPS3_CAPABLE = true,
-               .flags.bits.IS_TPS4_CAPABLE = true
-};
-
-static struct link_encoder *dcn301_link_encoder_create(
-       struct dc_context *ctx,
-       const struct encoder_init_data *enc_init_data)
-{
-       struct dcn20_link_encoder *enc20 =
-               kzalloc(sizeof(struct dcn20_link_encoder), GFP_KERNEL);
-
-       if (!enc20)
-               return NULL;
-
-       dcn301_link_encoder_construct(enc20,
-                       enc_init_data,
-                       &link_enc_feature,
-                       &link_enc_regs[enc_init_data->transmitter],
-                       &link_enc_aux_regs[enc_init_data->channel - 1],
-                       &link_enc_hpd_regs[enc_init_data->hpd_source],
-                       &le_shift,
-                       &le_mask);
-
-       return &enc20->enc10.base;
-}
-
-static struct panel_cntl *dcn301_panel_cntl_create(const struct panel_cntl_init_data *init_data)
-{
-       struct dcn301_panel_cntl *panel_cntl =
-               kzalloc(sizeof(struct dcn301_panel_cntl), GFP_KERNEL);
-
-       if (!panel_cntl)
-               return NULL;
-
-       dcn301_panel_cntl_construct(panel_cntl,
-                       init_data,
-                       &panel_cntl_regs[init_data->inst],
-                       &panel_cntl_shift,
-                       &panel_cntl_mask);
-
-       return &panel_cntl->base;
-}
-
-
-#define CTX ctx
-
-#define REG(reg_name) \
-       (DCN_BASE.instance[0].segment[mm ## reg_name ## _BASE_IDX] + mm ## reg_name)
-
-static uint32_t read_pipe_fuses(struct dc_context *ctx)
-{
-       uint32_t value = REG_READ(CC_DC_PIPE_DIS);
-       /* RV1 support max 4 pipes */
-       value = value & 0xf;
-       return value;
-}
-
-
-static void read_dce_straps(
-       struct dc_context *ctx,
-       struct resource_straps *straps)
-{
-       generic_reg_get(ctx, mmDC_PINSTRAPS + BASE(mmDC_PINSTRAPS_BASE_IDX),
-               FN(DC_PINSTRAPS, DC_PINSTRAPS_AUDIO), &straps->dc_pinstraps_audio);
-
-}
-
-static struct audio *dcn301_create_audio(
-               struct dc_context *ctx, unsigned int inst)
-{
-       return dce_audio_create(ctx, inst,
-                       &audio_regs[inst], &audio_shift, &audio_mask);
-}
-
-static struct vpg *dcn301_vpg_create(
-       struct dc_context *ctx,
-       uint32_t inst)
-{
-       struct dcn30_vpg *vpg3 = kzalloc(sizeof(struct dcn30_vpg), GFP_KERNEL);
-
-       if (!vpg3)
-               return NULL;
-
-       vpg3_construct(vpg3, ctx, inst,
-                       &vpg_regs[inst],
-                       &vpg_shift,
-                       &vpg_mask);
-
-       return &vpg3->base;
-}
-
-static struct afmt *dcn301_afmt_create(
-       struct dc_context *ctx,
-       uint32_t inst)
-{
-       struct dcn30_afmt *afmt3 = kzalloc(sizeof(struct dcn30_afmt), GFP_KERNEL);
-
-       if (!afmt3)
-               return NULL;
-
-       afmt3_construct(afmt3, ctx, inst,
-                       &afmt_regs[inst],
-                       &afmt_shift,
-                       &afmt_mask);
-
-       return &afmt3->base;
-}
-
-static struct stream_encoder *dcn301_stream_encoder_create(enum engine_id eng_id,
-                                                          struct dc_context *ctx)
-{
-       struct dcn10_stream_encoder *enc1;
-       struct vpg *vpg;
-       struct afmt *afmt;
-       int vpg_inst;
-       int afmt_inst;
-
-       /* Mapping of VPG, AFMT, DME register blocks to DIO block instance */
-       if (eng_id <= ENGINE_ID_DIGF) {
-               vpg_inst = eng_id;
-               afmt_inst = eng_id;
-       } else
-               return NULL;
-
-       enc1 = kzalloc(sizeof(struct dcn10_stream_encoder), GFP_KERNEL);
-       vpg = dcn301_vpg_create(ctx, vpg_inst);
-       afmt = dcn301_afmt_create(ctx, afmt_inst);
-
-       if (!enc1 || !vpg || !afmt) {
-               kfree(enc1);
-               kfree(vpg);
-               kfree(afmt);
-               return NULL;
-       }
-
-       dcn30_dio_stream_encoder_construct(enc1, ctx, ctx->dc_bios,
-                                       eng_id, vpg, afmt,
-                                       &stream_enc_regs[eng_id],
-                                       &se_shift, &se_mask);
-
-       return &enc1->base;
-}
-
-static struct dce_hwseq *dcn301_hwseq_create(struct dc_context *ctx)
-{
-       struct dce_hwseq *hws = kzalloc(sizeof(struct dce_hwseq), GFP_KERNEL);
-
-       if (hws) {
-               hws->ctx = ctx;
-               hws->regs = &hwseq_reg;
-               hws->shifts = &hwseq_shift;
-               hws->masks = &hwseq_mask;
-       }
-       return hws;
-}
-static const struct resource_create_funcs res_create_funcs = {
-       .read_dce_straps = read_dce_straps,
-       .create_audio = dcn301_create_audio,
-       .create_stream_encoder = dcn301_stream_encoder_create,
-       .create_hwseq = dcn301_hwseq_create,
-};
-
-static void dcn301_destruct(struct dcn301_resource_pool *pool)
-{
-       unsigned int i;
-
-       for (i = 0; i < pool->base.stream_enc_count; i++) {
-               if (pool->base.stream_enc[i] != NULL) {
-                       if (pool->base.stream_enc[i]->vpg != NULL) {
-                               kfree(DCN30_VPG_FROM_VPG(pool->base.stream_enc[i]->vpg));
-                               pool->base.stream_enc[i]->vpg = NULL;
-                       }
-                       if (pool->base.stream_enc[i]->afmt != NULL) {
-                               kfree(DCN30_AFMT_FROM_AFMT(pool->base.stream_enc[i]->afmt));
-                               pool->base.stream_enc[i]->afmt = NULL;
-                       }
-                       kfree(DCN10STRENC_FROM_STRENC(pool->base.stream_enc[i]));
-                       pool->base.stream_enc[i] = NULL;
-               }
-       }
-
-       for (i = 0; i < pool->base.res_cap->num_dsc; i++) {
-               if (pool->base.dscs[i] != NULL)
-                       dcn20_dsc_destroy(&pool->base.dscs[i]);
-       }
-
-       if (pool->base.mpc != NULL) {
-               kfree(TO_DCN20_MPC(pool->base.mpc));
-               pool->base.mpc = NULL;
-       }
-       if (pool->base.hubbub != NULL) {
-               kfree(pool->base.hubbub);
-               pool->base.hubbub = NULL;
-       }
-       for (i = 0; i < pool->base.pipe_count; i++) {
-               if (pool->base.dpps[i] != NULL)
-                       dcn301_dpp_destroy(&pool->base.dpps[i]);
-
-               if (pool->base.ipps[i] != NULL)
-                       pool->base.ipps[i]->funcs->ipp_destroy(&pool->base.ipps[i]);
-
-               if (pool->base.hubps[i] != NULL) {
-                       kfree(TO_DCN20_HUBP(pool->base.hubps[i]));
-                       pool->base.hubps[i] = NULL;
-               }
-
-               if (pool->base.irqs != NULL) {
-                       dal_irq_service_destroy(&pool->base.irqs);
-               }
-       }
-
-       for (i = 0; i < pool->base.res_cap->num_ddc; i++) {
-               if (pool->base.engines[i] != NULL)
-                       dce110_engine_destroy(&pool->base.engines[i]);
-               if (pool->base.hw_i2cs[i] != NULL) {
-                       kfree(pool->base.hw_i2cs[i]);
-                       pool->base.hw_i2cs[i] = NULL;
-               }
-               if (pool->base.sw_i2cs[i] != NULL) {
-                       kfree(pool->base.sw_i2cs[i]);
-                       pool->base.sw_i2cs[i] = NULL;
-               }
-       }
-
-       for (i = 0; i < pool->base.res_cap->num_opp; i++) {
-               if (pool->base.opps[i] != NULL)
-                       pool->base.opps[i]->funcs->opp_destroy(&pool->base.opps[i]);
-       }
-
-       for (i = 0; i < pool->base.res_cap->num_timing_generator; i++) {
-               if (pool->base.timing_generators[i] != NULL)    {
-                       kfree(DCN10TG_FROM_TG(pool->base.timing_generators[i]));
-                       pool->base.timing_generators[i] = NULL;
-               }
-       }
-
-       for (i = 0; i < pool->base.res_cap->num_dwb; i++) {
-               if (pool->base.dwbc[i] != NULL) {
-                       kfree(TO_DCN30_DWBC(pool->base.dwbc[i]));
-                       pool->base.dwbc[i] = NULL;
-               }
-               if (pool->base.mcif_wb[i] != NULL) {
-                       kfree(TO_DCN30_MMHUBBUB(pool->base.mcif_wb[i]));
-                       pool->base.mcif_wb[i] = NULL;
-               }
-       }
-
-       for (i = 0; i < pool->base.audio_count; i++) {
-               if (pool->base.audios[i])
-                       dce_aud_destroy(&pool->base.audios[i]);
-       }
-
-       for (i = 0; i < pool->base.clk_src_count; i++) {
-               if (pool->base.clock_sources[i] != NULL) {
-                       dcn20_clock_source_destroy(&pool->base.clock_sources[i]);
-                       pool->base.clock_sources[i] = NULL;
-               }
-       }
-
-       for (i = 0; i < pool->base.res_cap->num_mpc_3dlut; i++) {
-               if (pool->base.mpc_lut[i] != NULL) {
-                       dc_3dlut_func_release(pool->base.mpc_lut[i]);
-                       pool->base.mpc_lut[i] = NULL;
-               }
-               if (pool->base.mpc_shaper[i] != NULL) {
-                       dc_transfer_func_release(pool->base.mpc_shaper[i]);
-                       pool->base.mpc_shaper[i] = NULL;
-               }
-       }
-
-       if (pool->base.dp_clock_source != NULL) {
-               dcn20_clock_source_destroy(&pool->base.dp_clock_source);
-               pool->base.dp_clock_source = NULL;
-       }
-
-       for (i = 0; i < pool->base.res_cap->num_timing_generator; i++) {
-               if (pool->base.multiple_abms[i] != NULL)
-                       dce_abm_destroy(&pool->base.multiple_abms[i]);
-       }
-
-       if (pool->base.dccg != NULL)
-               dcn_dccg_destroy(&pool->base.dccg);
-}
-
-static struct hubp *dcn301_hubp_create(struct dc_context *ctx, uint32_t inst)
-{
-       struct dcn20_hubp *hubp2 =
-               kzalloc(sizeof(struct dcn20_hubp), GFP_KERNEL);
-
-       if (!hubp2)
-               return NULL;
-
-       if (hubp3_construct(hubp2, ctx, inst,
-                       &hubp_regs[inst], &hubp_shift, &hubp_mask))
-               return &hubp2->base;
-
-       BREAK_TO_DEBUGGER();
-       kfree(hubp2);
-       return NULL;
-}
-
-static bool dcn301_dwbc_create(struct dc_context *ctx, struct resource_pool *pool)
-{
-       int i;
-       uint32_t pipe_count = pool->res_cap->num_dwb;
-
-       for (i = 0; i < pipe_count; i++) {
-               struct dcn30_dwbc *dwbc30 = kzalloc(sizeof(struct dcn30_dwbc),
-                                                   GFP_KERNEL);
-
-               if (!dwbc30) {
-                       dm_error("DC: failed to create dwbc30!\n");
-                       return false;
-               }
-
-               dcn30_dwbc_construct(dwbc30, ctx,
-                               &dwbc30_regs[i],
-                               &dwbc30_shift,
-                               &dwbc30_mask,
-                               i);
-
-               pool->dwbc[i] = &dwbc30->base;
-       }
-       return true;
-}
-
-static bool dcn301_mmhubbub_create(struct dc_context *ctx, struct resource_pool *pool)
-{
-       int i;
-       uint32_t pipe_count = pool->res_cap->num_dwb;
-
-       for (i = 0; i < pipe_count; i++) {
-               struct dcn30_mmhubbub *mcif_wb30 = kzalloc(sizeof(struct dcn30_mmhubbub),
-                                                   GFP_KERNEL);
-
-               if (!mcif_wb30) {
-                       dm_error("DC: failed to create mcif_wb30!\n");
-                       return false;
-               }
-
-               dcn30_mmhubbub_construct(mcif_wb30, ctx,
-                               &mcif_wb30_regs[i],
-                               &mcif_wb30_shift,
-                               &mcif_wb30_mask,
-                               i);
-
-               pool->mcif_wb[i] = &mcif_wb30->base;
-       }
-       return true;
-}
-
-static struct display_stream_compressor *dcn301_dsc_create(
-       struct dc_context *ctx, uint32_t inst)
-{
-       struct dcn20_dsc *dsc =
-               kzalloc(sizeof(struct dcn20_dsc), GFP_KERNEL);
-
-       if (!dsc) {
-               BREAK_TO_DEBUGGER();
-               return NULL;
-       }
-
-       dsc2_construct(dsc, ctx, inst, &dsc_regs[inst], &dsc_shift, &dsc_mask);
-       return &dsc->base;
-}
-
-
-static void dcn301_destroy_resource_pool(struct resource_pool **pool)
-{
-       struct dcn301_resource_pool *dcn301_pool = TO_DCN301_RES_POOL(*pool);
-
-       dcn301_destruct(dcn301_pool);
-       kfree(dcn301_pool);
-       *pool = NULL;
-}
-
-static struct clock_source *dcn301_clock_source_create(
-               struct dc_context *ctx,
-               struct dc_bios *bios,
-               enum clock_source_id id,
-               const struct dce110_clk_src_regs *regs,
-               bool dp_clk_src)
-{
-       struct dce110_clk_src *clk_src =
-               kzalloc(sizeof(struct dce110_clk_src), GFP_KERNEL);
-
-       if (!clk_src)
-               return NULL;
-
-       if (dcn301_clk_src_construct(clk_src, ctx, bios, id,
-                       regs, &cs_shift, &cs_mask)) {
-               clk_src->base.dp_clk_src = dp_clk_src;
-               return &clk_src->base;
-       }
-
-       kfree(clk_src);
-       BREAK_TO_DEBUGGER();
-       return NULL;
-}
-
-static struct dc_cap_funcs cap_funcs = {
-       .get_dcc_compression_cap = dcn20_get_dcc_compression_cap
-};
-
-
-static bool is_soc_bounding_box_valid(struct dc *dc)
-{
-       uint32_t hw_internal_rev = dc->ctx->asic_id.hw_internal_rev;
-
-       if (ASICREV_IS_VANGOGH(hw_internal_rev))
-               return true;
-
-       return false;
-}
-
-static bool init_soc_bounding_box(struct dc *dc,
-                                 struct dcn301_resource_pool *pool)
-{
-       struct _vcs_dpi_soc_bounding_box_st *loaded_bb = &dcn3_01_soc;
-       struct _vcs_dpi_ip_params_st *loaded_ip = &dcn3_01_ip;
-
-       DC_LOGGER_INIT(dc->ctx->logger);
-
-       if (!is_soc_bounding_box_valid(dc)) {
-               DC_LOG_ERROR("%s: not valid soc bounding box\n", __func__);
-               return false;
-       }
-
-       loaded_ip->max_num_otg = pool->base.res_cap->num_timing_generator;
-       loaded_ip->max_num_dpp = pool->base.pipe_count;
-       DC_FP_START();
-       dcn20_patch_bounding_box(dc, loaded_bb);
-       DC_FP_END();
-
-       if (dc->ctx->dc_bios->funcs->get_soc_bb_info) {
-               struct bp_soc_bb_info bb_info = {0};
-
-               if (dc->ctx->dc_bios->funcs->get_soc_bb_info(dc->ctx->dc_bios, &bb_info) == BP_RESULT_OK) {
-                       DC_FP_START();
-                       dcn301_fpu_init_soc_bounding_box(bb_info);
-                       DC_FP_END();
-               }
-       }
-
-       return true;
-}
-
-
-static void set_wm_ranges(
-               struct pp_smu_funcs *pp_smu,
-               struct _vcs_dpi_soc_bounding_box_st *loaded_bb)
-{
-       struct pp_smu_wm_range_sets ranges = {0};
-       int i;
-
-       ranges.num_reader_wm_sets = 0;
-
-       if (loaded_bb->num_states == 1) {
-               ranges.reader_wm_sets[0].wm_inst = 0;
-               ranges.reader_wm_sets[0].min_drain_clk_mhz = PP_SMU_WM_SET_RANGE_CLK_UNCONSTRAINED_MIN;
-               ranges.reader_wm_sets[0].max_drain_clk_mhz = PP_SMU_WM_SET_RANGE_CLK_UNCONSTRAINED_MAX;
-               ranges.reader_wm_sets[0].min_fill_clk_mhz = PP_SMU_WM_SET_RANGE_CLK_UNCONSTRAINED_MIN;
-               ranges.reader_wm_sets[0].max_fill_clk_mhz = PP_SMU_WM_SET_RANGE_CLK_UNCONSTRAINED_MAX;
-
-               ranges.num_reader_wm_sets = 1;
-       } else if (loaded_bb->num_states > 1) {
-               for (i = 0; i < 4 && i < loaded_bb->num_states; i++) {
-                       ranges.reader_wm_sets[i].wm_inst = i;
-                       ranges.reader_wm_sets[i].min_drain_clk_mhz = PP_SMU_WM_SET_RANGE_CLK_UNCONSTRAINED_MIN;
-                       ranges.reader_wm_sets[i].max_drain_clk_mhz = PP_SMU_WM_SET_RANGE_CLK_UNCONSTRAINED_MAX;
-                       DC_FP_START();
-                       dcn301_fpu_set_wm_ranges(i, &ranges, loaded_bb);
-                       DC_FP_END();
-                       ranges.num_reader_wm_sets = i + 1;
-               }
-
-               ranges.reader_wm_sets[0].min_fill_clk_mhz = PP_SMU_WM_SET_RANGE_CLK_UNCONSTRAINED_MIN;
-               ranges.reader_wm_sets[ranges.num_reader_wm_sets - 1].max_fill_clk_mhz = PP_SMU_WM_SET_RANGE_CLK_UNCONSTRAINED_MAX;
-       }
-
-       ranges.num_writer_wm_sets = 1;
-
-       ranges.writer_wm_sets[0].wm_inst = 0;
-       ranges.writer_wm_sets[0].min_fill_clk_mhz = PP_SMU_WM_SET_RANGE_CLK_UNCONSTRAINED_MIN;
-       ranges.writer_wm_sets[0].max_fill_clk_mhz = PP_SMU_WM_SET_RANGE_CLK_UNCONSTRAINED_MAX;
-       ranges.writer_wm_sets[0].min_drain_clk_mhz = PP_SMU_WM_SET_RANGE_CLK_UNCONSTRAINED_MIN;
-       ranges.writer_wm_sets[0].max_drain_clk_mhz = PP_SMU_WM_SET_RANGE_CLK_UNCONSTRAINED_MAX;
-
-       /* Notify PP Lib/SMU which Watermarks to use for which clock ranges */
-       pp_smu->nv_funcs.set_wm_ranges(&pp_smu->nv_funcs.pp_smu, &ranges);
-}
-
-static void dcn301_calculate_wm_and_dlg(
-               struct dc *dc, struct dc_state *context,
-               display_e2e_pipe_params_st *pipes,
-               int pipe_cnt,
-               int vlevel)
-{
-       DC_FP_START();
-       dcn301_calculate_wm_and_dlg_fp(dc, context, pipes, pipe_cnt, vlevel);
-       DC_FP_END();
-}
-
-static struct resource_funcs dcn301_res_pool_funcs = {
-       .destroy = dcn301_destroy_resource_pool,
-       .link_enc_create = dcn301_link_encoder_create,
-       .panel_cntl_create = dcn301_panel_cntl_create,
-       .validate_bandwidth = dcn30_validate_bandwidth,
-       .calculate_wm_and_dlg = dcn301_calculate_wm_and_dlg,
-       .update_soc_for_wm_a = dcn30_update_soc_for_wm_a,
-       .populate_dml_pipes = dcn30_populate_dml_pipes_from_context,
-       .acquire_free_pipe_as_secondary_dpp_pipe = dcn20_acquire_free_pipe_for_layer,
-       .release_pipe = dcn20_release_pipe,
-       .add_stream_to_ctx = dcn30_add_stream_to_ctx,
-       .add_dsc_to_stream_resource = dcn20_add_dsc_to_stream_resource,
-       .remove_stream_from_ctx = dcn20_remove_stream_from_ctx,
-       .populate_dml_writeback_from_context = dcn30_populate_dml_writeback_from_context,
-       .set_mcif_arb_params = dcn30_set_mcif_arb_params,
-       .find_first_free_match_stream_enc_for_link = dcn10_find_first_free_match_stream_enc_for_link,
-       .acquire_post_bldn_3dlut = dcn30_acquire_post_bldn_3dlut,
-       .release_post_bldn_3dlut = dcn30_release_post_bldn_3dlut,
-       .update_bw_bounding_box = dcn301_update_bw_bounding_box,
-       .patch_unknown_plane_state = dcn20_patch_unknown_plane_state
-};
-
-static bool dcn301_resource_construct(
-       uint8_t num_virtual_links,
-       struct dc *dc,
-       struct dcn301_resource_pool *pool)
-{
-       int i, j;
-       struct dc_context *ctx = dc->ctx;
-       struct irq_service_init_data init_data;
-       uint32_t pipe_fuses = read_pipe_fuses(ctx);
-       uint32_t num_pipes = 0;
-
-       DC_LOGGER_INIT(dc->ctx->logger);
-
-       ctx->dc_bios->regs = &bios_regs;
-
-       if (dc->ctx->asic_id.chip_id == DEVICE_ID_VGH_1435)
-               res_cap_dcn301.num_pll = 2;
-       pool->base.res_cap = &res_cap_dcn301;
-
-       pool->base.funcs = &dcn301_res_pool_funcs;
-
-       /*************************************************
-        *  Resource + asic cap harcoding                *
-        *************************************************/
-       pool->base.underlay_pipe_index = NO_UNDERLAY_PIPE;
-       pool->base.pipe_count = pool->base.res_cap->num_timing_generator;
-       pool->base.mpcc_count = pool->base.res_cap->num_timing_generator;
-       dc->caps.max_downscale_ratio = 600;
-       dc->caps.i2c_speed_in_khz = 100;
-       dc->caps.i2c_speed_in_khz_hdcp = 5; /*1.4 w/a enabled by default*/
-       dc->caps.max_cursor_size = 256;
-       dc->caps.min_horizontal_blanking_period = 80;
-       dc->caps.dmdata_alloc_size = 2048;
-       dc->caps.max_slave_planes = 2;
-       dc->caps.max_slave_yuv_planes = 2;
-       dc->caps.max_slave_rgb_planes = 2;
-       dc->caps.is_apu = true;
-       dc->caps.post_blend_color_processing = true;
-       dc->caps.force_dp_tps4_for_cp2520 = true;
-       dc->caps.extended_aux_timeout_support = true;
-       dc->caps.dmcub_support = true;
-
-       /* Color pipeline capabilities */
-       dc->caps.color.dpp.dcn_arch = 1;
-       dc->caps.color.dpp.input_lut_shared = 0;
-       dc->caps.color.dpp.icsc = 1;
-       dc->caps.color.dpp.dgam_ram = 0; // must use gamma_corr
-       dc->caps.color.dpp.dgam_rom_caps.srgb = 1;
-       dc->caps.color.dpp.dgam_rom_caps.bt2020 = 1;
-       dc->caps.color.dpp.dgam_rom_caps.gamma2_2 = 1;
-       dc->caps.color.dpp.dgam_rom_caps.pq = 1;
-       dc->caps.color.dpp.dgam_rom_caps.hlg = 1;
-       dc->caps.color.dpp.post_csc = 1;
-       dc->caps.color.dpp.gamma_corr = 1;
-       dc->caps.color.dpp.dgam_rom_for_yuv = 0;
-
-       dc->caps.color.dpp.hw_3d_lut = 1;
-       dc->caps.color.dpp.ogam_ram = 1;
-       // no OGAM ROM on DCN301
-       dc->caps.color.dpp.ogam_rom_caps.srgb = 0;
-       dc->caps.color.dpp.ogam_rom_caps.bt2020 = 0;
-       dc->caps.color.dpp.ogam_rom_caps.gamma2_2 = 0;
-       dc->caps.color.dpp.ogam_rom_caps.pq = 0;
-       dc->caps.color.dpp.ogam_rom_caps.hlg = 0;
-       dc->caps.color.dpp.ocsc = 0;
-
-       dc->caps.color.mpc.gamut_remap = 1;
-       dc->caps.color.mpc.num_3dluts = pool->base.res_cap->num_mpc_3dlut; //2
-       dc->caps.color.mpc.ogam_ram = 1;
-       dc->caps.color.mpc.ogam_rom_caps.srgb = 0;
-       dc->caps.color.mpc.ogam_rom_caps.bt2020 = 0;
-       dc->caps.color.mpc.ogam_rom_caps.gamma2_2 = 0;
-       dc->caps.color.mpc.ogam_rom_caps.pq = 0;
-       dc->caps.color.mpc.ogam_rom_caps.hlg = 0;
-       dc->caps.color.mpc.ocsc = 1;
-
-       dc->caps.dp_hdmi21_pcon_support = true;
-
-       /* read VBIOS LTTPR caps */
-       if (ctx->dc_bios->funcs->get_lttpr_caps) {
-               enum bp_result bp_query_result;
-               uint8_t is_vbios_lttpr_enable = 0;
-
-               bp_query_result = ctx->dc_bios->funcs->get_lttpr_caps(ctx->dc_bios, &is_vbios_lttpr_enable);
-               dc->caps.vbios_lttpr_enable = (bp_query_result == BP_RESULT_OK) && !!is_vbios_lttpr_enable;
-       }
-
-       if (ctx->dc_bios->funcs->get_lttpr_interop) {
-               enum bp_result bp_query_result;
-               uint8_t is_vbios_interop_enabled = 0;
-
-               bp_query_result = ctx->dc_bios->funcs->get_lttpr_interop(ctx->dc_bios, &is_vbios_interop_enabled);
-               dc->caps.vbios_lttpr_aware = (bp_query_result == BP_RESULT_OK) && !!is_vbios_interop_enabled;
-       }
-
-       if (dc->ctx->dce_environment == DCE_ENV_PRODUCTION_DRV)
-               dc->debug = debug_defaults_drv;
-
-       // Init the vm_helper
-       if (dc->vm_helper)
-               vm_helper_init(dc->vm_helper, 16);
-
-       /*************************************************
-        *  Create resources                             *
-        *************************************************/
-
-       /* Clock Sources for Pixel Clock*/
-       pool->base.clock_sources[DCN301_CLK_SRC_PLL0] =
-                       dcn301_clock_source_create(ctx, ctx->dc_bios,
-                               CLOCK_SOURCE_COMBO_PHY_PLL0,
-                               &clk_src_regs[0], false);
-       pool->base.clock_sources[DCN301_CLK_SRC_PLL1] =
-                       dcn301_clock_source_create(ctx, ctx->dc_bios,
-                               CLOCK_SOURCE_COMBO_PHY_PLL1,
-                               &clk_src_regs[1], false);
-       pool->base.clock_sources[DCN301_CLK_SRC_PLL2] =
-                       dcn301_clock_source_create(ctx, ctx->dc_bios,
-                               CLOCK_SOURCE_COMBO_PHY_PLL2,
-                               &clk_src_regs[2], false);
-       pool->base.clock_sources[DCN301_CLK_SRC_PLL3] =
-                       dcn301_clock_source_create(ctx, ctx->dc_bios,
-                               CLOCK_SOURCE_COMBO_PHY_PLL3,
-                               &clk_src_regs[3], false);
-
-       pool->base.clk_src_count = DCN301_CLK_SRC_TOTAL;
-
-       /* todo: not reuse phy_pll registers */
-       pool->base.dp_clock_source =
-                       dcn301_clock_source_create(ctx, ctx->dc_bios,
-                               CLOCK_SOURCE_ID_DP_DTO,
-                               &clk_src_regs[0], true);
-
-       for (i = 0; i < pool->base.clk_src_count; i++) {
-               if (pool->base.clock_sources[i] == NULL) {
-                       dm_error("DC: failed to create clock sources!\n");
-                       BREAK_TO_DEBUGGER();
-                       goto create_fail;
-               }
-       }
-
-       /* DCCG */
-       pool->base.dccg = dccg301_create(ctx, &dccg_regs, &dccg_shift, &dccg_mask);
-       if (pool->base.dccg == NULL) {
-               dm_error("DC: failed to create dccg!\n");
-               BREAK_TO_DEBUGGER();
-               goto create_fail;
-       }
-
-       init_soc_bounding_box(dc, pool);
-
-       if (!dc->debug.disable_pplib_wm_range && pool->base.pp_smu->nv_funcs.set_wm_ranges)
-               set_wm_ranges(pool->base.pp_smu, &dcn3_01_soc);
-
-       num_pipes = dcn3_01_ip.max_num_dpp;
-
-       for (i = 0; i < dcn3_01_ip.max_num_dpp; i++)
-               if (pipe_fuses & 1 << i)
-                       num_pipes--;
-       dcn3_01_ip.max_num_dpp = num_pipes;
-       dcn3_01_ip.max_num_otg = num_pipes;
-
-
-       dml_init_instance(&dc->dml, &dcn3_01_soc, &dcn3_01_ip, DML_PROJECT_DCN30);
-
-       /* IRQ */
-       init_data.ctx = dc->ctx;
-       pool->base.irqs = dal_irq_service_dcn30_create(&init_data);
-       if (!pool->base.irqs)
-               goto create_fail;
-
-       /* HUBBUB */
-       pool->base.hubbub = dcn301_hubbub_create(ctx);
-       if (pool->base.hubbub == NULL) {
-               BREAK_TO_DEBUGGER();
-               dm_error("DC: failed to create hubbub!\n");
-               goto create_fail;
-       }
-
-       j = 0;
-       /* HUBPs, DPPs, OPPs and TGs */
-       for (i = 0; i < pool->base.pipe_count; i++) {
-
-               /* if pipe is disabled, skip instance of HW pipe,
-                * i.e, skip ASIC register instance
-                */
-               if ((pipe_fuses & (1 << i)) != 0) {
-                       DC_LOG_DEBUG("%s: fusing pipe %d\n", __func__, i);
-                       continue;
-               }
-
-               pool->base.hubps[j] = dcn301_hubp_create(ctx, i);
-               if (pool->base.hubps[j] == NULL) {
-                       BREAK_TO_DEBUGGER();
-                       dm_error(
-                               "DC: failed to create hubps!\n");
-                       goto create_fail;
-               }
-
-               pool->base.dpps[j] = dcn301_dpp_create(ctx, i);
-               if (pool->base.dpps[j] == NULL) {
-                       BREAK_TO_DEBUGGER();
-                       dm_error(
-                               "DC: failed to create dpps!\n");
-                       goto create_fail;
-               }
-
-               pool->base.opps[j] = dcn301_opp_create(ctx, i);
-               if (pool->base.opps[j] == NULL) {
-                       BREAK_TO_DEBUGGER();
-                       dm_error(
-                               "DC: failed to create output pixel processor!\n");
-                       goto create_fail;
-               }
-
-               pool->base.timing_generators[j] = dcn301_timing_generator_create(ctx, i);
-               if (pool->base.timing_generators[j] == NULL) {
-                       BREAK_TO_DEBUGGER();
-                       dm_error("DC: failed to create tg!\n");
-                       goto create_fail;
-               }
-               j++;
-       }
-       pool->base.timing_generator_count = j;
-       pool->base.pipe_count = j;
-       pool->base.mpcc_count = j;
-
-       /* ABM (or ABMs for NV2x) */
-       /* TODO: */
-       for (i = 0; i < pool->base.res_cap->num_timing_generator; i++) {
-               pool->base.multiple_abms[i] = dmub_abm_create(ctx,
-                               &abm_regs[i],
-                               &abm_shift,
-                               &abm_mask);
-               if (pool->base.multiple_abms[i] == NULL) {
-                       dm_error("DC: failed to create abm for pipe %d!\n", i);
-                       BREAK_TO_DEBUGGER();
-                       goto create_fail;
-               }
-       }
-
-       /* MPC and DSC */
-       pool->base.mpc = dcn301_mpc_create(ctx, pool->base.mpcc_count, pool->base.res_cap->num_mpc_3dlut);
-       if (pool->base.mpc == NULL) {
-               BREAK_TO_DEBUGGER();
-               dm_error("DC: failed to create mpc!\n");
-               goto create_fail;
-       }
-
-       for (i = 0; i < pool->base.res_cap->num_dsc; i++) {
-               pool->base.dscs[i] = dcn301_dsc_create(ctx, i);
-               if (pool->base.dscs[i] == NULL) {
-                       BREAK_TO_DEBUGGER();
-                       dm_error("DC: failed to create display stream compressor %d!\n", i);
-                       goto create_fail;
-               }
-       }
-
-       /* DWB and MMHUBBUB */
-       if (!dcn301_dwbc_create(ctx, &pool->base)) {
-               BREAK_TO_DEBUGGER();
-               dm_error("DC: failed to create dwbc!\n");
-               goto create_fail;
-       }
-
-       if (!dcn301_mmhubbub_create(ctx, &pool->base)) {
-               BREAK_TO_DEBUGGER();
-               dm_error("DC: failed to create mcif_wb!\n");
-               goto create_fail;
-       }
-
-       /* AUX and I2C */
-       for (i = 0; i < pool->base.res_cap->num_ddc; i++) {
-               pool->base.engines[i] = dcn301_aux_engine_create(ctx, i);
-               if (pool->base.engines[i] == NULL) {
-                       BREAK_TO_DEBUGGER();
-                       dm_error(
-                               "DC:failed to create aux engine!!\n");
-                       goto create_fail;
-               }
-               pool->base.hw_i2cs[i] = dcn301_i2c_hw_create(ctx, i);
-               if (pool->base.hw_i2cs[i] == NULL) {
-                       BREAK_TO_DEBUGGER();
-                       dm_error(
-                               "DC:failed to create hw i2c!!\n");
-                       goto create_fail;
-               }
-               pool->base.sw_i2cs[i] = NULL;
-       }
-
-       /* Audio, Stream Encoders including HPO and virtual, MPC 3D LUTs */
-       if (!resource_construct(num_virtual_links, dc, &pool->base,
-                       &res_create_funcs))
-               goto create_fail;
-
-       /* HW Sequencer and Plane caps */
-       dcn301_hw_sequencer_construct(dc);
-
-       dc->caps.max_planes =  pool->base.pipe_count;
-
-       for (i = 0; i < dc->caps.max_planes; ++i)
-               dc->caps.planes[i] = plane_cap;
-
-       dc->cap_funcs = cap_funcs;
-
-       return true;
-
-create_fail:
-
-       dcn301_destruct(pool);
-
-       return false;
-}
-
-struct resource_pool *dcn301_create_resource_pool(
-               const struct dc_init_data *init_data,
-               struct dc *dc)
-{
-       struct dcn301_resource_pool *pool =
-               kzalloc(sizeof(struct dcn301_resource_pool), GFP_KERNEL);
-
-       if (!pool)
-               return NULL;
-
-       if (dcn301_resource_construct(init_data->num_virtual_links, dc, pool))
-               return &pool->base;
-
-       BREAK_TO_DEBUGGER();
-       kfree(pool);
-       return NULL;
-}
diff --git a/drivers/gpu/drm/amd/display/dc/dcn301/dcn301_resource.h b/drivers/gpu/drm/amd/display/dc/dcn301/dcn301_resource.h
deleted file mode 100644 (file)
index ae86726..0000000
+++ /dev/null
@@ -1,45 +0,0 @@
-/*
- * 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
- *
- */
-
-#ifndef _DCN301_RESOURCE_H_
-#define _DCN301_RESOURCE_H_
-
-#include "core_types.h"
-
-struct dc;
-struct resource_pool;
-struct _vcs_dpi_display_pipe_params_st;
-
-extern struct _vcs_dpi_ip_params_st dcn3_01_ip;
-extern struct _vcs_dpi_soc_bounding_box_st dcn3_01_soc;
-
-struct dcn301_resource_pool {
-       struct resource_pool base;
-};
-struct resource_pool *dcn301_create_resource_pool(
-               const struct dc_init_data *init_data,
-               struct dc *dc);
-
-#endif /* _DCN301_RESOURCE_H_ */
index 95b66baf39e91109ceb0b88668e227cb5cd1b29c..0fcd03569d74e7d91df2b61cc0ad1d1e8d62ea8f 100644 (file)
@@ -5,7 +5,7 @@
 #
 # Makefile for dcn302.
 
-DCN3_02 = dcn302_init.o dcn302_resource.o
+DCN3_02 = dcn302_init.o
 
 AMD_DAL_DCN3_02 = $(addprefix $(AMDDALPATH)/dc/dcn302/,$(DCN3_02))
 
diff --git a/drivers/gpu/drm/amd/display/dc/dcn302/dcn302_resource.c b/drivers/gpu/drm/amd/display/dc/dcn302/dcn302_resource.c
deleted file mode 100644 (file)
index 63ac984..0000000
+++ /dev/null
@@ -1,1518 +0,0 @@
-/*
- * 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
- *
- */
-
-#include "dcn302_init.h"
-#include "dcn302_resource.h"
-#include "dcn302_dccg.h"
-#include "irq/dcn302/irq_service_dcn302.h"
-
-#include "dcn30/dcn30_dio_link_encoder.h"
-#include "dcn30/dcn30_dio_stream_encoder.h"
-#include "dcn30/dcn30_dwb.h"
-#include "dcn30/dcn30_dpp.h"
-#include "dcn30/dcn30_hubbub.h"
-#include "dcn30/dcn30_hubp.h"
-#include "dcn30/dcn30_mmhubbub.h"
-#include "dcn30/dcn30_mpc.h"
-#include "dcn30/dcn30_opp.h"
-#include "dcn30/dcn30_optc.h"
-#include "dcn30/dcn30_resource.h"
-
-#include "dcn20/dcn20_dsc.h"
-#include "dcn20/dcn20_resource.h"
-
-#include "dml/dcn30/dcn30_fpu.h"
-
-#include "dcn10/dcn10_resource.h"
-
-#include "link.h"
-#include "dce/dce_abm.h"
-#include "dce/dce_audio.h"
-#include "dce/dce_aux.h"
-#include "dce/dce_clock_source.h"
-#include "dce/dce_hwseq.h"
-#include "dce/dce_i2c_hw.h"
-#include "dce/dce_panel_cntl.h"
-#include "dce/dmub_abm.h"
-#include "dce/dmub_psr.h"
-#include "clk_mgr.h"
-
-#include "hw_sequencer_private.h"
-#include "reg_helper.h"
-#include "resource.h"
-#include "vm_helper.h"
-
-#include "dml/dcn302/dcn302_fpu.h"
-
-#include "dimgrey_cavefish_ip_offset.h"
-#include "dcn/dcn_3_0_2_offset.h"
-#include "dcn/dcn_3_0_2_sh_mask.h"
-#include "dpcs/dpcs_3_0_0_offset.h"
-#include "dpcs/dpcs_3_0_0_sh_mask.h"
-#include "nbio/nbio_7_4_offset.h"
-#include "amdgpu_socbb.h"
-
-#define DC_LOGGER \
-       dc->ctx->logger
-#define DC_LOGGER_INIT(logger)
-
-static const struct dc_debug_options debug_defaults_drv = {
-               .disable_dmcu = true,
-               .force_abm_enable = false,
-               .timing_trace = false,
-               .clock_trace = true,
-               .disable_pplib_clock_request = true,
-               .pipe_split_policy = MPC_SPLIT_DYNAMIC,
-               .force_single_disp_pipe_split = false,
-               .disable_dcc = DCC_ENABLE,
-               .vsr_support = true,
-               .performance_trace = false,
-               .max_downscale_src_width = 7680,/*upto 8K*/
-               .disable_pplib_wm_range = false,
-               .scl_reset_length10 = true,
-               .sanity_checks = false,
-               .underflow_assert_delay_us = 0xFFFFFFFF,
-               .dwb_fi_phase = -1, // -1 = disable,
-               .dmub_command_table = true,
-               .use_max_lb = true,
-               .exit_idle_opt_for_cursor_updates = true,
-               .enable_legacy_fast_update = false,
-               .using_dml2 = false,
-};
-
-static const struct dc_panel_config panel_config_defaults = {
-               .psr = {
-                       .disable_psr = false,
-                       .disallow_psrsu = false,
-                       .disallow_replay = false,
-               },
-};
-
-enum dcn302_clk_src_array_id {
-       DCN302_CLK_SRC_PLL0,
-       DCN302_CLK_SRC_PLL1,
-       DCN302_CLK_SRC_PLL2,
-       DCN302_CLK_SRC_PLL3,
-       DCN302_CLK_SRC_PLL4,
-       DCN302_CLK_SRC_TOTAL
-};
-
-static const struct resource_caps res_cap_dcn302 = {
-               .num_timing_generator = 5,
-               .num_opp = 5,
-               .num_video_plane = 5,
-               .num_audio = 5,
-               .num_stream_encoder = 5,
-               .num_dwb = 1,
-               .num_ddc = 5,
-               .num_vmid = 16,
-               .num_mpc_3dlut = 2,
-               .num_dsc = 5,
-};
-
-static const struct dc_plane_cap plane_cap = {
-               .type = DC_PLANE_TYPE_DCN_UNIVERSAL,
-               .per_pixel_alpha = true,
-               .pixel_format_support = {
-                               .argb8888 = true,
-                               .nv12 = true,
-                               .fp16 = true,
-                               .p010 = true,
-                               .ayuv = false,
-               },
-               .max_upscale_factor = {
-                               .argb8888 = 16000,
-                               .nv12 = 16000,
-                               .fp16 = 16000
-               },
-               /* 6:1 downscaling ratio: 1000/6 = 166.666 */
-               .max_downscale_factor = {
-                               .argb8888 = 167,
-                               .nv12 = 167,
-                               .fp16 = 167
-               },
-               16,
-               16
-};
-
-/* NBIO */
-#define NBIO_BASE_INNER(seg) \
-               NBIO_BASE__INST0_SEG ## seg
-
-#define NBIO_BASE(seg) \
-               NBIO_BASE_INNER(seg)
-
-#define NBIO_SR(reg_name)\
-               .reg_name = NBIO_BASE(mm ## reg_name ## _BASE_IDX) + \
-               mm ## reg_name
-
-/* DCN */
-#define BASE_INNER(seg) DCN_BASE__INST0_SEG ## seg
-
-#define BASE(seg) BASE_INNER(seg)
-
-#define SR(reg_name)\
-               .reg_name = BASE(mm ## reg_name ## _BASE_IDX) + mm ## reg_name
-
-#define SF(reg_name, field_name, post_fix)\
-               .field_name = reg_name ## __ ## field_name ## post_fix
-
-#define SRI(reg_name, block, id)\
-               .reg_name = BASE(mm ## block ## id ## _ ## reg_name ## _BASE_IDX) + mm ## block ## id ## _ ## reg_name
-
-#define SRI2(reg_name, block, id)\
-               .reg_name = BASE(mm ## reg_name ## _BASE_IDX) + mm ## reg_name
-
-#define SRII(reg_name, block, id)\
-               .reg_name[id] = BASE(mm ## block ## id ## _ ## reg_name ## _BASE_IDX) + \
-               mm ## block ## id ## _ ## reg_name
-
-#define DCCG_SRII(reg_name, block, id)\
-               .block ## _ ## reg_name[id] = BASE(mm ## block ## id ## _ ## reg_name ## _BASE_IDX) + \
-               mm ## block ## id ## _ ## reg_name
-
-#define VUPDATE_SRII(reg_name, block, id)\
-               .reg_name[id] = BASE(mm ## reg_name ## _ ## block ## id ## _BASE_IDX) + \
-               mm ## reg_name ## _ ## block ## id
-
-#define SRII_DWB(reg_name, temp_name, block, id)\
-               .reg_name[id] = BASE(mm ## block ## id ## _ ## temp_name ## _BASE_IDX) + \
-               mm ## block ## id ## _ ## temp_name
-
-#define SF_DWB2(reg_name, block, id, field_name, post_fix)     \
-       .field_name = reg_name ## __ ## field_name ## post_fix
-
-#define SRII_MPC_RMU(reg_name, block, id)\
-               .RMU##_##reg_name[id] = BASE(mm ## block ## id ## _ ## reg_name ## _BASE_IDX) + \
-               mm ## block ## id ## _ ## reg_name
-
-static const struct dcn_hubbub_registers hubbub_reg = {
-               HUBBUB_REG_LIST_DCN30(0)
-};
-
-static const struct dcn_hubbub_shift hubbub_shift = {
-               HUBBUB_MASK_SH_LIST_DCN30(__SHIFT)
-};
-
-static const struct dcn_hubbub_mask hubbub_mask = {
-               HUBBUB_MASK_SH_LIST_DCN30(_MASK)
-};
-
-#define vmid_regs(id)\
-               [id] = { DCN20_VMID_REG_LIST(id) }
-
-static const struct dcn_vmid_registers vmid_regs[] = {
-               vmid_regs(0),
-               vmid_regs(1),
-               vmid_regs(2),
-               vmid_regs(3),
-               vmid_regs(4),
-               vmid_regs(5),
-               vmid_regs(6),
-               vmid_regs(7),
-               vmid_regs(8),
-               vmid_regs(9),
-               vmid_regs(10),
-               vmid_regs(11),
-               vmid_regs(12),
-               vmid_regs(13),
-               vmid_regs(14),
-               vmid_regs(15)
-};
-
-static const struct dcn20_vmid_shift vmid_shifts = {
-               DCN20_VMID_MASK_SH_LIST(__SHIFT)
-};
-
-static const struct dcn20_vmid_mask vmid_masks = {
-               DCN20_VMID_MASK_SH_LIST(_MASK)
-};
-
-static struct hubbub *dcn302_hubbub_create(struct dc_context *ctx)
-{
-       int i;
-
-       struct dcn20_hubbub *hubbub3 = kzalloc(sizeof(struct dcn20_hubbub), GFP_KERNEL);
-
-       if (!hubbub3)
-               return NULL;
-
-       hubbub3_construct(hubbub3, ctx, &hubbub_reg, &hubbub_shift, &hubbub_mask);
-
-       for (i = 0; i < res_cap_dcn302.num_vmid; i++) {
-               struct dcn20_vmid *vmid = &hubbub3->vmid[i];
-
-               vmid->ctx = ctx;
-
-               vmid->regs = &vmid_regs[i];
-               vmid->shifts = &vmid_shifts;
-               vmid->masks = &vmid_masks;
-       }
-
-       return &hubbub3->base;
-}
-
-#define vpg_regs(id)\
-               [id] = { VPG_DCN3_REG_LIST(id) }
-
-static const struct dcn30_vpg_registers vpg_regs[] = {
-               vpg_regs(0),
-               vpg_regs(1),
-               vpg_regs(2),
-               vpg_regs(3),
-               vpg_regs(4),
-               vpg_regs(5)
-};
-
-static const struct dcn30_vpg_shift vpg_shift = {
-               DCN3_VPG_MASK_SH_LIST(__SHIFT)
-};
-
-static const struct dcn30_vpg_mask vpg_mask = {
-               DCN3_VPG_MASK_SH_LIST(_MASK)
-};
-
-static struct vpg *dcn302_vpg_create(struct dc_context *ctx, uint32_t inst)
-{
-       struct dcn30_vpg *vpg3 = kzalloc(sizeof(struct dcn30_vpg), GFP_KERNEL);
-
-       if (!vpg3)
-               return NULL;
-
-       vpg3_construct(vpg3, ctx, inst, &vpg_regs[inst], &vpg_shift, &vpg_mask);
-
-       return &vpg3->base;
-}
-
-#define afmt_regs(id)\
-               [id] = { AFMT_DCN3_REG_LIST(id) }
-
-static const struct dcn30_afmt_registers afmt_regs[] = {
-               afmt_regs(0),
-               afmt_regs(1),
-               afmt_regs(2),
-               afmt_regs(3),
-               afmt_regs(4),
-               afmt_regs(5)
-};
-
-static const struct dcn30_afmt_shift afmt_shift = {
-               DCN3_AFMT_MASK_SH_LIST(__SHIFT)
-};
-
-static const struct dcn30_afmt_mask afmt_mask = {
-               DCN3_AFMT_MASK_SH_LIST(_MASK)
-};
-
-static struct afmt *dcn302_afmt_create(struct dc_context *ctx, uint32_t inst)
-{
-       struct dcn30_afmt *afmt3 = kzalloc(sizeof(struct dcn30_afmt), GFP_KERNEL);
-
-       if (!afmt3)
-               return NULL;
-
-       afmt3_construct(afmt3, ctx, inst, &afmt_regs[inst], &afmt_shift, &afmt_mask);
-
-       return &afmt3->base;
-}
-
-#define audio_regs(id)\
-               [id] = { AUD_COMMON_REG_LIST(id) }
-
-static const struct dce_audio_registers audio_regs[] = {
-               audio_regs(0),
-               audio_regs(1),
-               audio_regs(2),
-               audio_regs(3),
-               audio_regs(4),
-               audio_regs(5),
-               audio_regs(6)
-};
-
-#define DCE120_AUD_COMMON_MASK_SH_LIST(mask_sh)\
-               SF(AZF0ENDPOINT0_AZALIA_F0_CODEC_ENDPOINT_INDEX, AZALIA_ENDPOINT_REG_INDEX, mask_sh),\
-               SF(AZF0ENDPOINT0_AZALIA_F0_CODEC_ENDPOINT_DATA, AZALIA_ENDPOINT_REG_DATA, mask_sh),\
-               AUD_COMMON_MASK_SH_LIST_BASE(mask_sh)
-
-static const struct dce_audio_shift audio_shift = {
-               DCE120_AUD_COMMON_MASK_SH_LIST(__SHIFT)
-};
-
-static const struct dce_audio_mask audio_mask = {
-               DCE120_AUD_COMMON_MASK_SH_LIST(_MASK)
-};
-
-static struct audio *dcn302_create_audio(struct dc_context *ctx, unsigned int inst)
-{
-       return dce_audio_create(ctx, inst, &audio_regs[inst], &audio_shift, &audio_mask);
-}
-
-#define stream_enc_regs(id)\
-               [id] = { SE_DCN3_REG_LIST(id) }
-
-static const struct dcn10_stream_enc_registers stream_enc_regs[] = {
-               stream_enc_regs(0),
-               stream_enc_regs(1),
-               stream_enc_regs(2),
-               stream_enc_regs(3),
-               stream_enc_regs(4)
-};
-
-static const struct dcn10_stream_encoder_shift se_shift = {
-               SE_COMMON_MASK_SH_LIST_DCN30(__SHIFT)
-};
-
-static const struct dcn10_stream_encoder_mask se_mask = {
-               SE_COMMON_MASK_SH_LIST_DCN30(_MASK)
-};
-
-static struct stream_encoder *dcn302_stream_encoder_create(enum engine_id eng_id, struct dc_context *ctx)
-{
-       struct dcn10_stream_encoder *enc1;
-       struct vpg *vpg;
-       struct afmt *afmt;
-       int vpg_inst;
-       int afmt_inst;
-
-       /* Mapping of VPG, AFMT, DME register blocks to DIO block instance */
-       if (eng_id <= ENGINE_ID_DIGE) {
-               vpg_inst = eng_id;
-               afmt_inst = eng_id;
-       } else
-               return NULL;
-
-       enc1 = kzalloc(sizeof(struct dcn10_stream_encoder), GFP_KERNEL);
-       vpg = dcn302_vpg_create(ctx, vpg_inst);
-       afmt = dcn302_afmt_create(ctx, afmt_inst);
-
-       if (!enc1 || !vpg || !afmt) {
-               kfree(enc1);
-               kfree(vpg);
-               kfree(afmt);
-               return NULL;
-       }
-
-       dcn30_dio_stream_encoder_construct(enc1, ctx, ctx->dc_bios, eng_id, vpg, afmt, &stream_enc_regs[eng_id],
-                       &se_shift, &se_mask);
-
-       return &enc1->base;
-}
-
-#define clk_src_regs(index, pllid)\
-               [index] = { CS_COMMON_REG_LIST_DCN3_02(index, pllid) }
-
-static const struct dce110_clk_src_regs clk_src_regs[] = {
-               clk_src_regs(0, A),
-               clk_src_regs(1, B),
-               clk_src_regs(2, C),
-               clk_src_regs(3, D),
-               clk_src_regs(4, E)
-};
-
-static const struct dce110_clk_src_shift cs_shift = {
-               CS_COMMON_MASK_SH_LIST_DCN2_0(__SHIFT)
-};
-
-static const struct dce110_clk_src_mask cs_mask = {
-               CS_COMMON_MASK_SH_LIST_DCN2_0(_MASK)
-};
-
-static struct clock_source *dcn302_clock_source_create(struct dc_context *ctx, struct dc_bios *bios,
-               enum clock_source_id id, const struct dce110_clk_src_regs *regs, bool dp_clk_src)
-{
-       struct dce110_clk_src *clk_src = kzalloc(sizeof(struct dce110_clk_src), GFP_KERNEL);
-
-       if (!clk_src)
-               return NULL;
-
-       if (dcn3_clk_src_construct(clk_src, ctx, bios, id, regs, &cs_shift, &cs_mask)) {
-               clk_src->base.dp_clk_src = dp_clk_src;
-               return &clk_src->base;
-       }
-
-       kfree(clk_src);
-       BREAK_TO_DEBUGGER();
-       return NULL;
-}
-
-static const struct dce_hwseq_registers hwseq_reg = {
-               HWSEQ_DCN302_REG_LIST()
-};
-
-static const struct dce_hwseq_shift hwseq_shift = {
-               HWSEQ_DCN302_MASK_SH_LIST(__SHIFT)
-};
-
-static const struct dce_hwseq_mask hwseq_mask = {
-               HWSEQ_DCN302_MASK_SH_LIST(_MASK)
-};
-
-static struct dce_hwseq *dcn302_hwseq_create(struct dc_context *ctx)
-{
-       struct dce_hwseq *hws = kzalloc(sizeof(struct dce_hwseq), GFP_KERNEL);
-
-       if (hws) {
-               hws->ctx = ctx;
-               hws->regs = &hwseq_reg;
-               hws->shifts = &hwseq_shift;
-               hws->masks = &hwseq_mask;
-       }
-       return hws;
-}
-
-#define hubp_regs(id)\
-               [id] = { HUBP_REG_LIST_DCN30(id) }
-
-static const struct dcn_hubp2_registers hubp_regs[] = {
-               hubp_regs(0),
-               hubp_regs(1),
-               hubp_regs(2),
-               hubp_regs(3),
-               hubp_regs(4)
-};
-
-static const struct dcn_hubp2_shift hubp_shift = {
-               HUBP_MASK_SH_LIST_DCN30(__SHIFT)
-};
-
-static const struct dcn_hubp2_mask hubp_mask = {
-               HUBP_MASK_SH_LIST_DCN30(_MASK)
-};
-
-static struct hubp *dcn302_hubp_create(struct dc_context *ctx, uint32_t inst)
-{
-       struct dcn20_hubp *hubp2 = kzalloc(sizeof(struct dcn20_hubp), GFP_KERNEL);
-
-       if (!hubp2)
-               return NULL;
-
-       if (hubp3_construct(hubp2, ctx, inst, &hubp_regs[inst], &hubp_shift, &hubp_mask))
-               return &hubp2->base;
-
-       BREAK_TO_DEBUGGER();
-       kfree(hubp2);
-       return NULL;
-}
-
-#define dpp_regs(id)\
-               [id] = { DPP_REG_LIST_DCN30(id) }
-
-static const struct dcn3_dpp_registers dpp_regs[] = {
-               dpp_regs(0),
-               dpp_regs(1),
-               dpp_regs(2),
-               dpp_regs(3),
-               dpp_regs(4)
-};
-
-static const struct dcn3_dpp_shift tf_shift = {
-               DPP_REG_LIST_SH_MASK_DCN30(__SHIFT)
-};
-
-static const struct dcn3_dpp_mask tf_mask = {
-               DPP_REG_LIST_SH_MASK_DCN30(_MASK)
-};
-
-static struct dpp *dcn302_dpp_create(struct dc_context *ctx, uint32_t inst)
-{
-       struct dcn3_dpp *dpp = kzalloc(sizeof(struct dcn3_dpp), GFP_KERNEL);
-
-       if (!dpp)
-               return NULL;
-
-       if (dpp3_construct(dpp, ctx, inst, &dpp_regs[inst], &tf_shift, &tf_mask))
-               return &dpp->base;
-
-       BREAK_TO_DEBUGGER();
-       kfree(dpp);
-       return NULL;
-}
-
-#define opp_regs(id)\
-               [id] = { OPP_REG_LIST_DCN30(id) }
-
-static const struct dcn20_opp_registers opp_regs[] = {
-               opp_regs(0),
-               opp_regs(1),
-               opp_regs(2),
-               opp_regs(3),
-               opp_regs(4)
-};
-
-static const struct dcn20_opp_shift opp_shift = {
-               OPP_MASK_SH_LIST_DCN20(__SHIFT)
-};
-
-static const struct dcn20_opp_mask opp_mask = {
-               OPP_MASK_SH_LIST_DCN20(_MASK)
-};
-
-static struct output_pixel_processor *dcn302_opp_create(struct dc_context *ctx, uint32_t inst)
-{
-       struct dcn20_opp *opp = kzalloc(sizeof(struct dcn20_opp), GFP_KERNEL);
-
-       if (!opp) {
-               BREAK_TO_DEBUGGER();
-               return NULL;
-       }
-
-       dcn20_opp_construct(opp, ctx, inst, &opp_regs[inst], &opp_shift, &opp_mask);
-       return &opp->base;
-}
-
-#define optc_regs(id)\
-               [id] = { OPTC_COMMON_REG_LIST_DCN3_0(id) }
-
-static const struct dcn_optc_registers optc_regs[] = {
-               optc_regs(0),
-               optc_regs(1),
-               optc_regs(2),
-               optc_regs(3),
-               optc_regs(4)
-};
-
-static const struct dcn_optc_shift optc_shift = {
-               OPTC_COMMON_MASK_SH_LIST_DCN30(__SHIFT)
-};
-
-static const struct dcn_optc_mask optc_mask = {
-               OPTC_COMMON_MASK_SH_LIST_DCN30(_MASK)
-};
-
-static struct timing_generator *dcn302_timing_generator_create(struct dc_context *ctx, uint32_t instance)
-{
-       struct optc *tgn10 = kzalloc(sizeof(struct optc), GFP_KERNEL);
-
-       if (!tgn10)
-               return NULL;
-
-       tgn10->base.inst = instance;
-       tgn10->base.ctx = ctx;
-
-       tgn10->tg_regs = &optc_regs[instance];
-       tgn10->tg_shift = &optc_shift;
-       tgn10->tg_mask = &optc_mask;
-
-       dcn30_timing_generator_init(tgn10);
-
-       return &tgn10->base;
-}
-
-static const struct dcn30_mpc_registers mpc_regs = {
-               MPC_REG_LIST_DCN3_0(0),
-               MPC_REG_LIST_DCN3_0(1),
-               MPC_REG_LIST_DCN3_0(2),
-               MPC_REG_LIST_DCN3_0(3),
-               MPC_REG_LIST_DCN3_0(4),
-               MPC_OUT_MUX_REG_LIST_DCN3_0(0),
-               MPC_OUT_MUX_REG_LIST_DCN3_0(1),
-               MPC_OUT_MUX_REG_LIST_DCN3_0(2),
-               MPC_OUT_MUX_REG_LIST_DCN3_0(3),
-               MPC_OUT_MUX_REG_LIST_DCN3_0(4),
-               MPC_RMU_GLOBAL_REG_LIST_DCN3AG,
-               MPC_RMU_REG_LIST_DCN3AG(0),
-               MPC_RMU_REG_LIST_DCN3AG(1),
-               MPC_RMU_REG_LIST_DCN3AG(2),
-               MPC_DWB_MUX_REG_LIST_DCN3_0(0),
-};
-
-static const struct dcn30_mpc_shift mpc_shift = {
-               MPC_COMMON_MASK_SH_LIST_DCN30(__SHIFT)
-};
-
-static const struct dcn30_mpc_mask mpc_mask = {
-               MPC_COMMON_MASK_SH_LIST_DCN30(_MASK)
-};
-
-static struct mpc *dcn302_mpc_create(struct dc_context *ctx, int num_mpcc, int num_rmu)
-{
-       struct dcn30_mpc *mpc30 = kzalloc(sizeof(struct dcn30_mpc), GFP_KERNEL);
-
-       if (!mpc30)
-               return NULL;
-
-       dcn30_mpc_construct(mpc30, ctx, &mpc_regs, &mpc_shift, &mpc_mask, num_mpcc, num_rmu);
-
-       return &mpc30->base;
-}
-
-#define dsc_regsDCN20(id)\
-[id] = { DSC_REG_LIST_DCN20(id) }
-
-static const struct dcn20_dsc_registers dsc_regs[] = {
-               dsc_regsDCN20(0),
-               dsc_regsDCN20(1),
-               dsc_regsDCN20(2),
-               dsc_regsDCN20(3),
-               dsc_regsDCN20(4)
-};
-
-static const struct dcn20_dsc_shift dsc_shift = {
-               DSC_REG_LIST_SH_MASK_DCN20(__SHIFT)
-};
-
-static const struct dcn20_dsc_mask dsc_mask = {
-               DSC_REG_LIST_SH_MASK_DCN20(_MASK)
-};
-
-static struct display_stream_compressor *dcn302_dsc_create(struct dc_context *ctx, uint32_t inst)
-{
-       struct dcn20_dsc *dsc = kzalloc(sizeof(struct dcn20_dsc), GFP_KERNEL);
-
-       if (!dsc) {
-               BREAK_TO_DEBUGGER();
-               return NULL;
-       }
-
-       dsc2_construct(dsc, ctx, inst, &dsc_regs[inst], &dsc_shift, &dsc_mask);
-       return &dsc->base;
-}
-
-#define dwbc_regs_dcn3(id)\
-[id] = { DWBC_COMMON_REG_LIST_DCN30(id) }
-
-static const struct dcn30_dwbc_registers dwbc30_regs[] = {
-               dwbc_regs_dcn3(0)
-};
-
-static const struct dcn30_dwbc_shift dwbc30_shift = {
-               DWBC_COMMON_MASK_SH_LIST_DCN30(__SHIFT)
-};
-
-static const struct dcn30_dwbc_mask dwbc30_mask = {
-               DWBC_COMMON_MASK_SH_LIST_DCN30(_MASK)
-};
-
-static bool dcn302_dwbc_create(struct dc_context *ctx, struct resource_pool *pool)
-{
-       int i;
-       uint32_t pipe_count = pool->res_cap->num_dwb;
-
-       for (i = 0; i < pipe_count; i++) {
-               struct dcn30_dwbc *dwbc30 = kzalloc(sizeof(struct dcn30_dwbc), GFP_KERNEL);
-
-               if (!dwbc30) {
-                       dm_error("DC: failed to create dwbc30!\n");
-                       return false;
-               }
-
-               dcn30_dwbc_construct(dwbc30, ctx, &dwbc30_regs[i], &dwbc30_shift, &dwbc30_mask, i);
-
-               pool->dwbc[i] = &dwbc30->base;
-       }
-       return true;
-}
-
-#define mcif_wb_regs_dcn3(id)\
-[id] = { MCIF_WB_COMMON_REG_LIST_DCN30(id) }
-
-static const struct dcn30_mmhubbub_registers mcif_wb30_regs[] = {
-               mcif_wb_regs_dcn3(0)
-};
-
-static const struct dcn30_mmhubbub_shift mcif_wb30_shift = {
-               MCIF_WB_COMMON_MASK_SH_LIST_DCN30(__SHIFT)
-};
-
-static const struct dcn30_mmhubbub_mask mcif_wb30_mask = {
-               MCIF_WB_COMMON_MASK_SH_LIST_DCN30(_MASK)
-};
-
-static bool dcn302_mmhubbub_create(struct dc_context *ctx, struct resource_pool *pool)
-{
-       int i;
-       uint32_t pipe_count = pool->res_cap->num_dwb;
-
-       for (i = 0; i < pipe_count; i++) {
-               struct dcn30_mmhubbub *mcif_wb30 = kzalloc(sizeof(struct dcn30_mmhubbub), GFP_KERNEL);
-
-               if (!mcif_wb30) {
-                       dm_error("DC: failed to create mcif_wb30!\n");
-                       return false;
-               }
-
-               dcn30_mmhubbub_construct(mcif_wb30, ctx, &mcif_wb30_regs[i], &mcif_wb30_shift, &mcif_wb30_mask, i);
-
-               pool->mcif_wb[i] = &mcif_wb30->base;
-       }
-       return true;
-}
-
-#define aux_engine_regs(id)\
-[id] = {\
-               AUX_COMMON_REG_LIST0(id), \
-               .AUXN_IMPCAL = 0, \
-               .AUXP_IMPCAL = 0, \
-               .AUX_RESET_MASK = DP_AUX0_AUX_CONTROL__AUX_RESET_MASK, \
-}
-
-static const struct dce110_aux_registers aux_engine_regs[] = {
-               aux_engine_regs(0),
-               aux_engine_regs(1),
-               aux_engine_regs(2),
-               aux_engine_regs(3),
-               aux_engine_regs(4)
-};
-
-static const struct dce110_aux_registers_shift aux_shift = {
-               DCN_AUX_MASK_SH_LIST(__SHIFT)
-};
-
-static const struct dce110_aux_registers_mask aux_mask = {
-               DCN_AUX_MASK_SH_LIST(_MASK)
-};
-
-static struct dce_aux *dcn302_aux_engine_create(struct dc_context *ctx, uint32_t inst)
-{
-       struct aux_engine_dce110 *aux_engine = kzalloc(sizeof(struct aux_engine_dce110), GFP_KERNEL);
-
-       if (!aux_engine)
-               return NULL;
-
-       dce110_aux_engine_construct(aux_engine, ctx, inst, SW_AUX_TIMEOUT_PERIOD_MULTIPLIER * AUX_TIMEOUT_PERIOD,
-                       &aux_engine_regs[inst], &aux_mask, &aux_shift, ctx->dc->caps.extended_aux_timeout_support);
-
-       return &aux_engine->base;
-}
-
-#define i2c_inst_regs(id) { I2C_HW_ENGINE_COMMON_REG_LIST(id) }
-
-static const struct dce_i2c_registers i2c_hw_regs[] = {
-               i2c_inst_regs(1),
-               i2c_inst_regs(2),
-               i2c_inst_regs(3),
-               i2c_inst_regs(4),
-               i2c_inst_regs(5)
-};
-
-static const struct dce_i2c_shift i2c_shifts = {
-               I2C_COMMON_MASK_SH_LIST_DCN2(__SHIFT)
-};
-
-static const struct dce_i2c_mask i2c_masks = {
-               I2C_COMMON_MASK_SH_LIST_DCN2(_MASK)
-};
-
-static struct dce_i2c_hw *dcn302_i2c_hw_create(struct dc_context *ctx, uint32_t inst)
-{
-       struct dce_i2c_hw *dce_i2c_hw = kzalloc(sizeof(struct dce_i2c_hw), GFP_KERNEL);
-
-       if (!dce_i2c_hw)
-               return NULL;
-
-       dcn2_i2c_hw_construct(dce_i2c_hw, ctx, inst, &i2c_hw_regs[inst], &i2c_shifts, &i2c_masks);
-
-       return dce_i2c_hw;
-}
-
-static const struct encoder_feature_support link_enc_feature = {
-               .max_hdmi_deep_color = COLOR_DEPTH_121212,
-               .max_hdmi_pixel_clock = 600000,
-               .hdmi_ycbcr420_supported = true,
-               .dp_ycbcr420_supported = true,
-               .fec_supported = true,
-               .flags.bits.IS_HBR2_CAPABLE = true,
-               .flags.bits.IS_HBR3_CAPABLE = true,
-               .flags.bits.IS_TPS3_CAPABLE = true,
-               .flags.bits.IS_TPS4_CAPABLE = true
-};
-
-#define link_regs(id, phyid)\
-               [id] = {\
-                               LE_DCN3_REG_LIST(id), \
-                               UNIPHY_DCN2_REG_LIST(phyid), \
-                               DPCS_DCN2_REG_LIST(id), \
-                               SRI(DP_DPHY_INTERNAL_CTRL, DP, id) \
-               }
-
-static const struct dcn10_link_enc_registers link_enc_regs[] = {
-               link_regs(0, A),
-               link_regs(1, B),
-               link_regs(2, C),
-               link_regs(3, D),
-               link_regs(4, E)
-};
-
-static const struct dcn10_link_enc_shift le_shift = {
-               LINK_ENCODER_MASK_SH_LIST_DCN30(__SHIFT),
-               DPCS_DCN2_MASK_SH_LIST(__SHIFT)
-};
-
-static const struct dcn10_link_enc_mask le_mask = {
-               LINK_ENCODER_MASK_SH_LIST_DCN30(_MASK),
-               DPCS_DCN2_MASK_SH_LIST(_MASK)
-};
-
-#define aux_regs(id)\
-               [id] = { DCN2_AUX_REG_LIST(id) }
-
-static const struct dcn10_link_enc_aux_registers link_enc_aux_regs[] = {
-               aux_regs(0),
-               aux_regs(1),
-               aux_regs(2),
-               aux_regs(3),
-               aux_regs(4)
-};
-
-#define hpd_regs(id)\
-               [id] = { HPD_REG_LIST(id) }
-
-static const struct dcn10_link_enc_hpd_registers link_enc_hpd_regs[] = {
-               hpd_regs(0),
-               hpd_regs(1),
-               hpd_regs(2),
-               hpd_regs(3),
-               hpd_regs(4)
-};
-
-static struct link_encoder *dcn302_link_encoder_create(
-       struct dc_context *ctx,
-       const struct encoder_init_data *enc_init_data)
-{
-       struct dcn20_link_encoder *enc20 = kzalloc(sizeof(struct dcn20_link_encoder), GFP_KERNEL);
-
-       if (!enc20)
-               return NULL;
-
-       dcn30_link_encoder_construct(enc20, enc_init_data, &link_enc_feature,
-                       &link_enc_regs[enc_init_data->transmitter], &link_enc_aux_regs[enc_init_data->channel - 1],
-                       &link_enc_hpd_regs[enc_init_data->hpd_source], &le_shift, &le_mask);
-
-       return &enc20->enc10.base;
-}
-
-static const struct dce_panel_cntl_registers panel_cntl_regs[] = {
-               { DCN_PANEL_CNTL_REG_LIST() }
-};
-
-static const struct dce_panel_cntl_shift panel_cntl_shift = {
-               DCE_PANEL_CNTL_MASK_SH_LIST(__SHIFT)
-};
-
-static const struct dce_panel_cntl_mask panel_cntl_mask = {
-               DCE_PANEL_CNTL_MASK_SH_LIST(_MASK)
-};
-
-static struct panel_cntl *dcn302_panel_cntl_create(const struct panel_cntl_init_data *init_data)
-{
-       struct dce_panel_cntl *panel_cntl = kzalloc(sizeof(struct dce_panel_cntl), GFP_KERNEL);
-
-       if (!panel_cntl)
-               return NULL;
-
-       dce_panel_cntl_construct(panel_cntl, init_data, &panel_cntl_regs[init_data->inst],
-                       &panel_cntl_shift, &panel_cntl_mask);
-
-       return &panel_cntl->base;
-}
-
-static void read_dce_straps(struct dc_context *ctx, struct resource_straps *straps)
-{
-       generic_reg_get(ctx, mmDC_PINSTRAPS + BASE(mmDC_PINSTRAPS_BASE_IDX),
-                       FN(DC_PINSTRAPS, DC_PINSTRAPS_AUDIO), &straps->dc_pinstraps_audio);
-}
-
-static const struct resource_create_funcs res_create_funcs = {
-               .read_dce_straps = read_dce_straps,
-               .create_audio = dcn302_create_audio,
-               .create_stream_encoder = dcn302_stream_encoder_create,
-               .create_hwseq = dcn302_hwseq_create,
-};
-
-static bool is_soc_bounding_box_valid(struct dc *dc)
-{
-       uint32_t hw_internal_rev = dc->ctx->asic_id.hw_internal_rev;
-
-       if (ASICREV_IS_DIMGREY_CAVEFISH_P(hw_internal_rev))
-               return true;
-
-       return false;
-}
-
-static bool init_soc_bounding_box(struct dc *dc,  struct resource_pool *pool)
-{
-       struct _vcs_dpi_soc_bounding_box_st *loaded_bb = &dcn3_02_soc;
-       struct _vcs_dpi_ip_params_st *loaded_ip = &dcn3_02_ip;
-
-       DC_LOGGER_INIT(dc->ctx->logger);
-
-       if (!is_soc_bounding_box_valid(dc)) {
-               DC_LOG_ERROR("%s: not valid soc bounding box\n", __func__);
-               return false;
-       }
-
-       loaded_ip->max_num_otg = pool->pipe_count;
-       loaded_ip->max_num_dpp = pool->pipe_count;
-       loaded_ip->clamp_min_dcfclk = dc->config.clamp_min_dcfclk;
-       DC_FP_START();
-       dcn20_patch_bounding_box(dc, loaded_bb);
-       DC_FP_END();
-
-       if (dc->ctx->dc_bios->funcs->get_soc_bb_info) {
-               struct bp_soc_bb_info bb_info = { 0 };
-
-               if (dc->ctx->dc_bios->funcs->get_soc_bb_info(
-                           dc->ctx->dc_bios, &bb_info) == BP_RESULT_OK) {
-
-                               DC_FP_START();
-                               dcn302_fpu_init_soc_bounding_box(bb_info);
-                               DC_FP_END();
-               }
-       }
-
-       return true;
-}
-
-static void dcn302_resource_destruct(struct resource_pool *pool)
-{
-       unsigned int i;
-
-       for (i = 0; i < pool->stream_enc_count; i++) {
-               if (pool->stream_enc[i] != NULL) {
-                       if (pool->stream_enc[i]->vpg != NULL) {
-                               kfree(DCN30_VPG_FROM_VPG(pool->stream_enc[i]->vpg));
-                               pool->stream_enc[i]->vpg = NULL;
-                       }
-                       if (pool->stream_enc[i]->afmt != NULL) {
-                               kfree(DCN30_AFMT_FROM_AFMT(pool->stream_enc[i]->afmt));
-                               pool->stream_enc[i]->afmt = NULL;
-                       }
-                       kfree(DCN10STRENC_FROM_STRENC(pool->stream_enc[i]));
-                       pool->stream_enc[i] = NULL;
-               }
-       }
-
-       for (i = 0; i < pool->res_cap->num_dsc; i++) {
-               if (pool->dscs[i] != NULL)
-                       dcn20_dsc_destroy(&pool->dscs[i]);
-       }
-
-       if (pool->mpc != NULL) {
-               kfree(TO_DCN20_MPC(pool->mpc));
-               pool->mpc = NULL;
-       }
-
-       if (pool->hubbub != NULL) {
-               kfree(pool->hubbub);
-               pool->hubbub = NULL;
-       }
-
-       for (i = 0; i < pool->pipe_count; i++) {
-               if (pool->dpps[i] != NULL) {
-                       kfree(TO_DCN20_DPP(pool->dpps[i]));
-                       pool->dpps[i] = NULL;
-               }
-
-               if (pool->hubps[i] != NULL) {
-                       kfree(TO_DCN20_HUBP(pool->hubps[i]));
-                       pool->hubps[i] = NULL;
-               }
-
-               if (pool->irqs != NULL)
-                       dal_irq_service_destroy(&pool->irqs);
-       }
-
-       for (i = 0; i < pool->res_cap->num_ddc; i++) {
-               if (pool->engines[i] != NULL)
-                       dce110_engine_destroy(&pool->engines[i]);
-               if (pool->hw_i2cs[i] != NULL) {
-                       kfree(pool->hw_i2cs[i]);
-                       pool->hw_i2cs[i] = NULL;
-               }
-               if (pool->sw_i2cs[i] != NULL) {
-                       kfree(pool->sw_i2cs[i]);
-                       pool->sw_i2cs[i] = NULL;
-               }
-       }
-
-       for (i = 0; i < pool->res_cap->num_opp; i++) {
-               if (pool->opps[i] != NULL)
-                       pool->opps[i]->funcs->opp_destroy(&pool->opps[i]);
-       }
-
-       for (i = 0; i < pool->res_cap->num_timing_generator; i++) {
-               if (pool->timing_generators[i] != NULL) {
-                       kfree(DCN10TG_FROM_TG(pool->timing_generators[i]));
-                       pool->timing_generators[i] = NULL;
-               }
-       }
-
-       for (i = 0; i < pool->res_cap->num_dwb; i++) {
-               if (pool->dwbc[i] != NULL) {
-                       kfree(TO_DCN30_DWBC(pool->dwbc[i]));
-                       pool->dwbc[i] = NULL;
-               }
-               if (pool->mcif_wb[i] != NULL) {
-                       kfree(TO_DCN30_MMHUBBUB(pool->mcif_wb[i]));
-                       pool->mcif_wb[i] = NULL;
-               }
-       }
-
-       for (i = 0; i < pool->audio_count; i++) {
-               if (pool->audios[i])
-                       dce_aud_destroy(&pool->audios[i]);
-       }
-
-       for (i = 0; i < pool->clk_src_count; i++) {
-               if (pool->clock_sources[i] != NULL)
-                       dcn20_clock_source_destroy(&pool->clock_sources[i]);
-       }
-
-       if (pool->dp_clock_source != NULL)
-               dcn20_clock_source_destroy(&pool->dp_clock_source);
-
-       for (i = 0; i < pool->res_cap->num_mpc_3dlut; i++) {
-               if (pool->mpc_lut[i] != NULL) {
-                       dc_3dlut_func_release(pool->mpc_lut[i]);
-                       pool->mpc_lut[i] = NULL;
-               }
-               if (pool->mpc_shaper[i] != NULL) {
-                       dc_transfer_func_release(pool->mpc_shaper[i]);
-                       pool->mpc_shaper[i] = NULL;
-               }
-       }
-
-       for (i = 0; i < pool->pipe_count; i++) {
-               if (pool->multiple_abms[i] != NULL)
-                       dce_abm_destroy(&pool->multiple_abms[i]);
-       }
-
-       if (pool->psr != NULL)
-               dmub_psr_destroy(&pool->psr);
-
-       if (pool->dccg != NULL)
-               dcn_dccg_destroy(&pool->dccg);
-
-       if (pool->oem_device != NULL) {
-               struct dc *dc = pool->oem_device->ctx->dc;
-
-               dc->link_srv->destroy_ddc_service(&pool->oem_device);
-       }
-}
-
-static void dcn302_destroy_resource_pool(struct resource_pool **pool)
-{
-       dcn302_resource_destruct(*pool);
-       kfree(*pool);
-       *pool = NULL;
-}
-
-void dcn302_update_bw_bounding_box(struct dc *dc, struct clk_bw_params *bw_params)
-{
-       DC_FP_START();
-       dcn302_fpu_update_bw_bounding_box(dc, bw_params);
-       DC_FP_END();
-}
-
-static void dcn302_get_panel_config_defaults(struct dc_panel_config *panel_config)
-{
-       *panel_config = panel_config_defaults;
-}
-
-static struct resource_funcs dcn302_res_pool_funcs = {
-               .destroy = dcn302_destroy_resource_pool,
-               .link_enc_create = dcn302_link_encoder_create,
-               .panel_cntl_create = dcn302_panel_cntl_create,
-               .validate_bandwidth = dcn30_validate_bandwidth,
-               .calculate_wm_and_dlg = dcn30_calculate_wm_and_dlg,
-               .update_soc_for_wm_a = dcn30_update_soc_for_wm_a,
-               .populate_dml_pipes = dcn30_populate_dml_pipes_from_context,
-               .acquire_free_pipe_as_secondary_dpp_pipe = dcn20_acquire_free_pipe_for_layer,
-               .release_pipe = dcn20_release_pipe,
-               .add_stream_to_ctx = dcn30_add_stream_to_ctx,
-               .add_dsc_to_stream_resource = dcn20_add_dsc_to_stream_resource,
-               .remove_stream_from_ctx = dcn20_remove_stream_from_ctx,
-               .populate_dml_writeback_from_context = dcn30_populate_dml_writeback_from_context,
-               .set_mcif_arb_params = dcn30_set_mcif_arb_params,
-               .find_first_free_match_stream_enc_for_link = dcn10_find_first_free_match_stream_enc_for_link,
-               .acquire_post_bldn_3dlut = dcn30_acquire_post_bldn_3dlut,
-               .release_post_bldn_3dlut = dcn30_release_post_bldn_3dlut,
-               .update_bw_bounding_box = dcn302_update_bw_bounding_box,
-               .patch_unknown_plane_state = dcn20_patch_unknown_plane_state,
-               .get_panel_config_defaults = dcn302_get_panel_config_defaults,
-};
-
-static struct dc_cap_funcs cap_funcs = {
-               .get_dcc_compression_cap = dcn20_get_dcc_compression_cap
-};
-
-static const struct bios_registers bios_regs = {
-               NBIO_SR(BIOS_SCRATCH_3),
-               NBIO_SR(BIOS_SCRATCH_6)
-};
-
-static const struct dccg_registers dccg_regs = {
-               DCCG_REG_LIST_DCN3_02()
-};
-
-static const struct dccg_shift dccg_shift = {
-               DCCG_MASK_SH_LIST_DCN3_02(__SHIFT)
-};
-
-static const struct dccg_mask dccg_mask = {
-               DCCG_MASK_SH_LIST_DCN3_02(_MASK)
-};
-
-#define abm_regs(id)\
-               [id] = { ABM_DCN302_REG_LIST(id) }
-
-static const struct dce_abm_registers abm_regs[] = {
-               abm_regs(0),
-               abm_regs(1),
-               abm_regs(2),
-               abm_regs(3),
-               abm_regs(4)
-};
-
-static const struct dce_abm_shift abm_shift = {
-               ABM_MASK_SH_LIST_DCN30(__SHIFT)
-};
-
-static const struct dce_abm_mask abm_mask = {
-               ABM_MASK_SH_LIST_DCN30(_MASK)
-};
-
-static bool dcn302_resource_construct(
-               uint8_t num_virtual_links,
-               struct dc *dc,
-               struct resource_pool *pool)
-{
-       int i;
-       struct dc_context *ctx = dc->ctx;
-       struct irq_service_init_data init_data;
-       struct ddc_service_init_data ddc_init_data = {0};
-
-       ctx->dc_bios->regs = &bios_regs;
-
-       pool->res_cap = &res_cap_dcn302;
-
-       pool->funcs = &dcn302_res_pool_funcs;
-
-       /*************************************************
-        *  Resource + asic cap harcoding                *
-        *************************************************/
-       pool->underlay_pipe_index = NO_UNDERLAY_PIPE;
-       pool->pipe_count = pool->res_cap->num_timing_generator;
-       pool->mpcc_count = pool->res_cap->num_timing_generator;
-       dc->caps.max_downscale_ratio = 600;
-       dc->caps.i2c_speed_in_khz = 100;
-       dc->caps.i2c_speed_in_khz_hdcp = 5; /*1.4 w/a applied by derfault*/
-       dc->caps.max_cursor_size = 256;
-       dc->caps.min_horizontal_blanking_period = 80;
-       dc->caps.dmdata_alloc_size = 2048;
-       dc->caps.mall_size_per_mem_channel = 4;
-       /* total size = mall per channel * num channels * 1024 * 1024 */
-       dc->caps.mall_size_total = dc->caps.mall_size_per_mem_channel * dc->ctx->dc_bios->vram_info.num_chans * 1048576;
-       dc->caps.cursor_cache_size = dc->caps.max_cursor_size * dc->caps.max_cursor_size * 8;
-       dc->caps.max_slave_planes = 2;
-       dc->caps.max_slave_yuv_planes = 2;
-       dc->caps.max_slave_rgb_planes = 2;
-       dc->caps.post_blend_color_processing = true;
-       dc->caps.force_dp_tps4_for_cp2520 = true;
-       dc->caps.extended_aux_timeout_support = true;
-       dc->caps.dmcub_support = true;
-       dc->caps.max_v_total = (1 << 15) - 1;
-
-       /* Color pipeline capabilities */
-       dc->caps.color.dpp.dcn_arch = 1;
-       dc->caps.color.dpp.input_lut_shared = 0;
-       dc->caps.color.dpp.icsc = 1;
-       dc->caps.color.dpp.dgam_ram = 0; // must use gamma_corr
-       dc->caps.color.dpp.dgam_rom_caps.srgb = 1;
-       dc->caps.color.dpp.dgam_rom_caps.bt2020 = 1;
-       dc->caps.color.dpp.dgam_rom_caps.gamma2_2 = 1;
-       dc->caps.color.dpp.dgam_rom_caps.pq = 1;
-       dc->caps.color.dpp.dgam_rom_caps.hlg = 1;
-       dc->caps.color.dpp.post_csc = 1;
-       dc->caps.color.dpp.gamma_corr = 1;
-       dc->caps.color.dpp.dgam_rom_for_yuv = 0;
-
-       dc->caps.color.dpp.hw_3d_lut = 1;
-       dc->caps.color.dpp.ogam_ram = 1;
-       // no OGAM ROM on DCN3
-       dc->caps.color.dpp.ogam_rom_caps.srgb = 0;
-       dc->caps.color.dpp.ogam_rom_caps.bt2020 = 0;
-       dc->caps.color.dpp.ogam_rom_caps.gamma2_2 = 0;
-       dc->caps.color.dpp.ogam_rom_caps.pq = 0;
-       dc->caps.color.dpp.ogam_rom_caps.hlg = 0;
-       dc->caps.color.dpp.ocsc = 0;
-
-       dc->caps.color.mpc.gamut_remap = 1;
-       dc->caps.color.mpc.num_3dluts = pool->res_cap->num_mpc_3dlut; //3
-       dc->caps.color.mpc.ogam_ram = 1;
-       dc->caps.color.mpc.ogam_rom_caps.srgb = 0;
-       dc->caps.color.mpc.ogam_rom_caps.bt2020 = 0;
-       dc->caps.color.mpc.ogam_rom_caps.gamma2_2 = 0;
-       dc->caps.color.mpc.ogam_rom_caps.pq = 0;
-       dc->caps.color.mpc.ogam_rom_caps.hlg = 0;
-       dc->caps.color.mpc.ocsc = 1;
-
-       dc->caps.dp_hdmi21_pcon_support = true;
-
-       /* read VBIOS LTTPR caps */
-       if (ctx->dc_bios->funcs->get_lttpr_caps) {
-               enum bp_result bp_query_result;
-               uint8_t is_vbios_lttpr_enable = 0;
-
-               bp_query_result = ctx->dc_bios->funcs->get_lttpr_caps(ctx->dc_bios, &is_vbios_lttpr_enable);
-               dc->caps.vbios_lttpr_enable = (bp_query_result == BP_RESULT_OK) && !!is_vbios_lttpr_enable;
-       }
-
-       if (ctx->dc_bios->funcs->get_lttpr_interop) {
-               enum bp_result bp_query_result;
-               uint8_t is_vbios_interop_enabled = 0;
-
-               bp_query_result = ctx->dc_bios->funcs->get_lttpr_interop(ctx->dc_bios,
-                               &is_vbios_interop_enabled);
-               dc->caps.vbios_lttpr_aware = (bp_query_result == BP_RESULT_OK) && !!is_vbios_interop_enabled;
-       }
-
-       if (dc->ctx->dce_environment == DCE_ENV_PRODUCTION_DRV)
-               dc->debug = debug_defaults_drv;
-
-       // Init the vm_helper
-       if (dc->vm_helper)
-               vm_helper_init(dc->vm_helper, 16);
-
-       /*************************************************
-        *  Create resources                             *
-        *************************************************/
-
-       /* Clock Sources for Pixel Clock*/
-       pool->clock_sources[DCN302_CLK_SRC_PLL0] =
-                       dcn302_clock_source_create(ctx, ctx->dc_bios,
-                                       CLOCK_SOURCE_COMBO_PHY_PLL0,
-                                       &clk_src_regs[0], false);
-       pool->clock_sources[DCN302_CLK_SRC_PLL1] =
-                       dcn302_clock_source_create(ctx, ctx->dc_bios,
-                                       CLOCK_SOURCE_COMBO_PHY_PLL1,
-                                       &clk_src_regs[1], false);
-       pool->clock_sources[DCN302_CLK_SRC_PLL2] =
-                       dcn302_clock_source_create(ctx, ctx->dc_bios,
-                                       CLOCK_SOURCE_COMBO_PHY_PLL2,
-                                       &clk_src_regs[2], false);
-       pool->clock_sources[DCN302_CLK_SRC_PLL3] =
-                       dcn302_clock_source_create(ctx, ctx->dc_bios,
-                                       CLOCK_SOURCE_COMBO_PHY_PLL3,
-                                       &clk_src_regs[3], false);
-       pool->clock_sources[DCN302_CLK_SRC_PLL4] =
-                       dcn302_clock_source_create(ctx, ctx->dc_bios,
-                                       CLOCK_SOURCE_COMBO_PHY_PLL4,
-                                       &clk_src_regs[4], false);
-
-       pool->clk_src_count = DCN302_CLK_SRC_TOTAL;
-
-       /* todo: not reuse phy_pll registers */
-       pool->dp_clock_source =
-                       dcn302_clock_source_create(ctx, ctx->dc_bios,
-                                       CLOCK_SOURCE_ID_DP_DTO,
-                                       &clk_src_regs[0], true);
-
-       for (i = 0; i < pool->clk_src_count; i++) {
-               if (pool->clock_sources[i] == NULL) {
-                       dm_error("DC: failed to create clock sources!\n");
-                       BREAK_TO_DEBUGGER();
-                       goto create_fail;
-               }
-       }
-
-       /* DCCG */
-       pool->dccg = dccg30_create(ctx, &dccg_regs, &dccg_shift, &dccg_mask);
-       if (pool->dccg == NULL) {
-               dm_error("DC: failed to create dccg!\n");
-               BREAK_TO_DEBUGGER();
-               goto create_fail;
-       }
-
-       /* PP Lib and SMU interfaces */
-       init_soc_bounding_box(dc, pool);
-
-       /* DML */
-       dml_init_instance(&dc->dml, &dcn3_02_soc, &dcn3_02_ip, DML_PROJECT_DCN30);
-
-       /* IRQ */
-       init_data.ctx = dc->ctx;
-       pool->irqs = dal_irq_service_dcn302_create(&init_data);
-       if (!pool->irqs)
-               goto create_fail;
-
-       /* HUBBUB */
-       pool->hubbub = dcn302_hubbub_create(ctx);
-       if (pool->hubbub == NULL) {
-               BREAK_TO_DEBUGGER();
-               dm_error("DC: failed to create hubbub!\n");
-               goto create_fail;
-       }
-
-       /* HUBPs, DPPs, OPPs and TGs */
-       for (i = 0; i < pool->pipe_count; i++) {
-               pool->hubps[i] = dcn302_hubp_create(ctx, i);
-               if (pool->hubps[i] == NULL) {
-                       BREAK_TO_DEBUGGER();
-                       dm_error("DC: failed to create hubps!\n");
-                       goto create_fail;
-               }
-
-               pool->dpps[i] = dcn302_dpp_create(ctx, i);
-               if (pool->dpps[i] == NULL) {
-                       BREAK_TO_DEBUGGER();
-                       dm_error("DC: failed to create dpps!\n");
-                       goto create_fail;
-               }
-       }
-
-       for (i = 0; i < pool->res_cap->num_opp; i++) {
-               pool->opps[i] = dcn302_opp_create(ctx, i);
-               if (pool->opps[i] == NULL) {
-                       BREAK_TO_DEBUGGER();
-                       dm_error("DC: failed to create output pixel processor!\n");
-                       goto create_fail;
-               }
-       }
-
-       for (i = 0; i < pool->res_cap->num_timing_generator; i++) {
-               pool->timing_generators[i] = dcn302_timing_generator_create(ctx, i);
-               if (pool->timing_generators[i] == NULL) {
-                       BREAK_TO_DEBUGGER();
-                       dm_error("DC: failed to create tg!\n");
-                       goto create_fail;
-               }
-       }
-       pool->timing_generator_count = i;
-
-       /* PSR */
-       pool->psr = dmub_psr_create(ctx);
-       if (pool->psr == NULL) {
-               dm_error("DC: failed to create psr!\n");
-               BREAK_TO_DEBUGGER();
-               goto create_fail;
-       }
-
-       /* ABMs */
-       for (i = 0; i < pool->res_cap->num_timing_generator; i++) {
-               pool->multiple_abms[i] = dmub_abm_create(ctx, &abm_regs[i], &abm_shift, &abm_mask);
-               if (pool->multiple_abms[i] == NULL) {
-                       dm_error("DC: failed to create abm for pipe %d!\n", i);
-                       BREAK_TO_DEBUGGER();
-                       goto create_fail;
-               }
-       }
-
-       /* MPC and DSC */
-       pool->mpc = dcn302_mpc_create(ctx, pool->mpcc_count, pool->res_cap->num_mpc_3dlut);
-       if (pool->mpc == NULL) {
-               BREAK_TO_DEBUGGER();
-               dm_error("DC: failed to create mpc!\n");
-               goto create_fail;
-       }
-
-       for (i = 0; i < pool->res_cap->num_dsc; i++) {
-               pool->dscs[i] = dcn302_dsc_create(ctx, i);
-               if (pool->dscs[i] == NULL) {
-                       BREAK_TO_DEBUGGER();
-                       dm_error("DC: failed to create display stream compressor %d!\n", i);
-                       goto create_fail;
-               }
-       }
-
-       /* DWB and MMHUBBUB */
-       if (!dcn302_dwbc_create(ctx, pool)) {
-               BREAK_TO_DEBUGGER();
-               dm_error("DC: failed to create dwbc!\n");
-               goto create_fail;
-       }
-
-       if (!dcn302_mmhubbub_create(ctx, pool)) {
-               BREAK_TO_DEBUGGER();
-               dm_error("DC: failed to create mcif_wb!\n");
-               goto create_fail;
-       }
-
-       /* AUX and I2C */
-       for (i = 0; i < pool->res_cap->num_ddc; i++) {
-               pool->engines[i] = dcn302_aux_engine_create(ctx, i);
-               if (pool->engines[i] == NULL) {
-                       BREAK_TO_DEBUGGER();
-                       dm_error("DC:failed to create aux engine!!\n");
-                       goto create_fail;
-               }
-               pool->hw_i2cs[i] = dcn302_i2c_hw_create(ctx, i);
-               if (pool->hw_i2cs[i] == NULL) {
-                       BREAK_TO_DEBUGGER();
-                       dm_error("DC:failed to create hw i2c!!\n");
-                       goto create_fail;
-               }
-               pool->sw_i2cs[i] = NULL;
-       }
-
-       /* Audio, Stream Encoders including HPO and virtual, MPC 3D LUTs */
-       if (!resource_construct(num_virtual_links, dc, pool,
-                       &res_create_funcs))
-               goto create_fail;
-
-       /* HW Sequencer and Plane caps */
-       dcn302_hw_sequencer_construct(dc);
-
-       dc->caps.max_planes =  pool->pipe_count;
-
-       for (i = 0; i < dc->caps.max_planes; ++i)
-               dc->caps.planes[i] = plane_cap;
-
-       dc->cap_funcs = cap_funcs;
-
-       if (dc->ctx->dc_bios->fw_info.oem_i2c_present) {
-               ddc_init_data.ctx = dc->ctx;
-               ddc_init_data.link = NULL;
-               ddc_init_data.id.id = dc->ctx->dc_bios->fw_info.oem_i2c_obj_id;
-               ddc_init_data.id.enum_id = 0;
-               ddc_init_data.id.type = OBJECT_TYPE_GENERIC;
-               pool->oem_device = dc->link_srv->create_ddc_service(&ddc_init_data);
-       } else {
-               pool->oem_device = NULL;
-       }
-
-       return true;
-
-create_fail:
-
-       dcn302_resource_destruct(pool);
-
-       return false;
-}
-
-struct resource_pool *dcn302_create_resource_pool(const struct dc_init_data *init_data, struct dc *dc)
-{
-       struct resource_pool *pool = kzalloc(sizeof(struct resource_pool), GFP_KERNEL);
-
-       if (!pool)
-               return NULL;
-
-       if (dcn302_resource_construct(init_data->num_virtual_links, dc, pool))
-               return pool;
-
-       BREAK_TO_DEBUGGER();
-       kfree(pool);
-       return NULL;
-}
diff --git a/drivers/gpu/drm/amd/display/dc/dcn302/dcn302_resource.h b/drivers/gpu/drm/amd/display/dc/dcn302/dcn302_resource.h
deleted file mode 100644 (file)
index 9f24e73..0000000
+++ /dev/null
@@ -1,38 +0,0 @@
-/*
- * 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
- *
- */
-
-#ifndef _DCN302_RESOURCE_H_
-#define _DCN302_RESOURCE_H_
-
-#include "core_types.h"
-
-extern struct _vcs_dpi_ip_params_st dcn3_02_ip;
-extern struct _vcs_dpi_soc_bounding_box_st dcn3_02_soc;
-
-struct resource_pool *dcn302_create_resource_pool(const struct dc_init_data *init_data, struct dc *dc);
-
-void dcn302_update_bw_bounding_box(struct dc *dc, struct clk_bw_params *bw_params);
-
-#endif /* _DCN302_RESOURCE_H_ */
index d7b3ad780e5db8f129c6859f3dbdea4380f5240f..a954e316aca25475cda9a9567a9025867934fea0 100644 (file)
@@ -6,7 +6,7 @@
 #
 # Makefile for dcn303.
 
-DCN3_03 = dcn303_init.o dcn303_resource.o
+DCN3_03 = dcn303_init.o
 
 AMD_DAL_DCN3_03 = $(addprefix $(AMDDALPATH)/dc/dcn303/,$(DCN3_03))
 
diff --git a/drivers/gpu/drm/amd/display/dc/dcn303/dcn303_resource.c b/drivers/gpu/drm/amd/display/dc/dcn303/dcn303_resource.c
deleted file mode 100644 (file)
index 49cb7fd..0000000
+++ /dev/null
@@ -1,1448 +0,0 @@
-// SPDX-License-Identifier: MIT
-/*
- * Copyright (C) 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 "dcn303_init.h"
-#include "dcn303_resource.h"
-#include "dcn303_dccg.h"
-#include "irq/dcn303/irq_service_dcn303.h"
-
-#include "dcn30/dcn30_dio_link_encoder.h"
-#include "dcn30/dcn30_dio_stream_encoder.h"
-#include "dcn30/dcn30_dpp.h"
-#include "dcn30/dcn30_dwb.h"
-#include "dcn30/dcn30_hubbub.h"
-#include "dcn30/dcn30_hubp.h"
-#include "dcn30/dcn30_mmhubbub.h"
-#include "dcn30/dcn30_mpc.h"
-#include "dcn30/dcn30_opp.h"
-#include "dcn30/dcn30_optc.h"
-#include "dcn30/dcn30_resource.h"
-
-#include "dcn20/dcn20_dsc.h"
-#include "dcn20/dcn20_resource.h"
-
-#include "dml/dcn30/dcn30_fpu.h"
-
-#include "dcn10/dcn10_resource.h"
-
-#include "link.h"
-
-#include "dce/dce_abm.h"
-#include "dce/dce_audio.h"
-#include "dce/dce_aux.h"
-#include "dce/dce_clock_source.h"
-#include "dce/dce_hwseq.h"
-#include "dce/dce_i2c_hw.h"
-#include "dce/dce_panel_cntl.h"
-#include "dce/dmub_abm.h"
-#include "dce/dmub_psr.h"
-#include "clk_mgr.h"
-
-#include "hw_sequencer_private.h"
-#include "reg_helper.h"
-#include "resource.h"
-#include "vm_helper.h"
-
-#include "sienna_cichlid_ip_offset.h"
-#include "dcn/dcn_3_0_3_offset.h"
-#include "dcn/dcn_3_0_3_sh_mask.h"
-#include "dpcs/dpcs_3_0_3_offset.h"
-#include "dpcs/dpcs_3_0_3_sh_mask.h"
-#include "nbio/nbio_2_3_offset.h"
-
-#include "dml/dcn303/dcn303_fpu.h"
-
-#define DC_LOGGER \
-       dc->ctx->logger
-#define DC_LOGGER_INIT(logger)
-
-
-static const struct dc_debug_options debug_defaults_drv = {
-               .disable_dmcu = true,
-               .force_abm_enable = false,
-               .timing_trace = false,
-               .clock_trace = true,
-               .disable_pplib_clock_request = true,
-               .pipe_split_policy = MPC_SPLIT_AVOID,
-               .force_single_disp_pipe_split = false,
-               .disable_dcc = DCC_ENABLE,
-               .vsr_support = true,
-               .performance_trace = false,
-               .max_downscale_src_width = 7680,/*upto 8K*/
-               .disable_pplib_wm_range = false,
-               .scl_reset_length10 = true,
-               .sanity_checks = false,
-               .underflow_assert_delay_us = 0xFFFFFFFF,
-               .dwb_fi_phase = -1, // -1 = disable,
-               .dmub_command_table = true,
-               .exit_idle_opt_for_cursor_updates = true,
-               .disable_idle_power_optimizations = false,
-               .using_dml2 = false,
-};
-
-static const struct dc_panel_config panel_config_defaults = {
-               .psr = {
-                       .disable_psr = false,
-                       .disallow_psrsu = false,
-                       .disallow_replay = false,
-               },
-};
-
-enum dcn303_clk_src_array_id {
-       DCN303_CLK_SRC_PLL0,
-       DCN303_CLK_SRC_PLL1,
-       DCN303_CLK_SRC_TOTAL
-};
-
-static const struct resource_caps res_cap_dcn303 = {
-               .num_timing_generator = 2,
-               .num_opp = 2,
-               .num_video_plane = 2,
-               .num_audio = 2,
-               .num_stream_encoder = 2,
-               .num_dwb = 1,
-               .num_ddc = 2,
-               .num_vmid = 16,
-               .num_mpc_3dlut = 1,
-               .num_dsc = 2,
-};
-
-static const struct dc_plane_cap plane_cap = {
-               .type = DC_PLANE_TYPE_DCN_UNIVERSAL,
-               .per_pixel_alpha = true,
-               .pixel_format_support = {
-                               .argb8888 = true,
-                               .nv12 = true,
-                               .fp16 = true,
-                               .p010 = true,
-                               .ayuv = false,
-               },
-               .max_upscale_factor = {
-                               .argb8888 = 16000,
-                               .nv12 = 16000,
-                               .fp16 = 16000
-               },
-               .max_downscale_factor = {
-                               .argb8888 = 600,
-                               .nv12 = 600,
-                               .fp16 = 600
-               },
-               16,
-               16
-};
-
-/* NBIO */
-#define NBIO_BASE_INNER(seg) \
-               NBIO_BASE__INST0_SEG ## seg
-
-#define NBIO_BASE(seg) \
-               NBIO_BASE_INNER(seg)
-
-#define NBIO_SR(reg_name)\
-               .reg_name = NBIO_BASE(mm ## reg_name ## _BASE_IDX) + \
-               mm ## reg_name
-
-/* DCN */
-#define BASE_INNER(seg) DCN_BASE__INST0_SEG ## seg
-
-#define BASE(seg) BASE_INNER(seg)
-
-#define SR(reg_name)\
-               .reg_name = BASE(mm ## reg_name ## _BASE_IDX) + mm ## reg_name
-
-#define SF(reg_name, field_name, post_fix)\
-               .field_name = reg_name ## __ ## field_name ## post_fix
-
-#define SRI(reg_name, block, id)\
-               .reg_name = BASE(mm ## block ## id ## _ ## reg_name ## _BASE_IDX) + mm ## block ## id ## _ ## reg_name
-
-#define SRI2(reg_name, block, id)\
-               .reg_name = BASE(mm ## reg_name ## _BASE_IDX) + mm ## reg_name
-
-#define SRII(reg_name, block, id)\
-               .reg_name[id] = BASE(mm ## block ## id ## _ ## reg_name ## _BASE_IDX) + \
-               mm ## block ## id ## _ ## reg_name
-
-#define DCCG_SRII(reg_name, block, id)\
-               .block ## _ ## reg_name[id] = BASE(mm ## block ## id ## _ ## reg_name ## _BASE_IDX) + \
-               mm ## block ## id ## _ ## reg_name
-
-#define VUPDATE_SRII(reg_name, block, id)\
-               .reg_name[id] = BASE(mm ## reg_name ## _ ## block ## id ## _BASE_IDX) + \
-               mm ## reg_name ## _ ## block ## id
-
-#define SRII_DWB(reg_name, temp_name, block, id)\
-               .reg_name[id] = BASE(mm ## block ## id ## _ ## temp_name ## _BASE_IDX) + \
-               mm ## block ## id ## _ ## temp_name
-
-#define SF_DWB2(reg_name, block, id, field_name, post_fix)     \
-       .field_name = reg_name ## __ ## field_name ## post_fix
-
-#define SRII_MPC_RMU(reg_name, block, id)\
-               .RMU##_##reg_name[id] = BASE(mm ## block ## id ## _ ## reg_name ## _BASE_IDX) + \
-               mm ## block ## id ## _ ## reg_name
-
-static const struct dcn_hubbub_registers hubbub_reg = {
-               HUBBUB_REG_LIST_DCN30(0)
-};
-
-static const struct dcn_hubbub_shift hubbub_shift = {
-               HUBBUB_MASK_SH_LIST_DCN30(__SHIFT)
-};
-
-static const struct dcn_hubbub_mask hubbub_mask = {
-               HUBBUB_MASK_SH_LIST_DCN30(_MASK)
-};
-
-#define vmid_regs(id)\
-               [id] = { DCN20_VMID_REG_LIST(id) }
-
-static const struct dcn_vmid_registers vmid_regs[] = {
-               vmid_regs(0),
-               vmid_regs(1),
-               vmid_regs(2),
-               vmid_regs(3),
-               vmid_regs(4),
-               vmid_regs(5),
-               vmid_regs(6),
-               vmid_regs(7),
-               vmid_regs(8),
-               vmid_regs(9),
-               vmid_regs(10),
-               vmid_regs(11),
-               vmid_regs(12),
-               vmid_regs(13),
-               vmid_regs(14),
-               vmid_regs(15)
-};
-
-static const struct dcn20_vmid_shift vmid_shifts = {
-               DCN20_VMID_MASK_SH_LIST(__SHIFT)
-};
-
-static const struct dcn20_vmid_mask vmid_masks = {
-               DCN20_VMID_MASK_SH_LIST(_MASK)
-};
-
-static struct hubbub *dcn303_hubbub_create(struct dc_context *ctx)
-{
-       int i;
-
-       struct dcn20_hubbub *hubbub3 = kzalloc(sizeof(struct dcn20_hubbub), GFP_KERNEL);
-
-       if (!hubbub3)
-               return NULL;
-
-       hubbub3_construct(hubbub3, ctx, &hubbub_reg, &hubbub_shift, &hubbub_mask);
-
-       for (i = 0; i < res_cap_dcn303.num_vmid; i++) {
-               struct dcn20_vmid *vmid = &hubbub3->vmid[i];
-
-               vmid->ctx = ctx;
-
-               vmid->regs = &vmid_regs[i];
-               vmid->shifts = &vmid_shifts;
-               vmid->masks = &vmid_masks;
-       }
-
-       return &hubbub3->base;
-}
-
-#define vpg_regs(id)\
-               [id] = { VPG_DCN3_REG_LIST(id) }
-
-static const struct dcn30_vpg_registers vpg_regs[] = {
-               vpg_regs(0),
-               vpg_regs(1),
-               vpg_regs(2)
-};
-
-static const struct dcn30_vpg_shift vpg_shift = {
-               DCN3_VPG_MASK_SH_LIST(__SHIFT)
-};
-
-static const struct dcn30_vpg_mask vpg_mask = {
-               DCN3_VPG_MASK_SH_LIST(_MASK)
-};
-
-static struct vpg *dcn303_vpg_create(struct dc_context *ctx, uint32_t inst)
-{
-       struct dcn30_vpg *vpg3 = kzalloc(sizeof(struct dcn30_vpg), GFP_KERNEL);
-
-       if (!vpg3)
-               return NULL;
-
-       vpg3_construct(vpg3, ctx, inst, &vpg_regs[inst], &vpg_shift, &vpg_mask);
-
-       return &vpg3->base;
-}
-
-#define afmt_regs(id)\
-               [id] = { AFMT_DCN3_REG_LIST(id) }
-
-static const struct dcn30_afmt_registers afmt_regs[] = {
-               afmt_regs(0),
-               afmt_regs(1),
-               afmt_regs(2)
-};
-
-static const struct dcn30_afmt_shift afmt_shift = {
-               DCN3_AFMT_MASK_SH_LIST(__SHIFT)
-};
-
-static const struct dcn30_afmt_mask afmt_mask = {
-               DCN3_AFMT_MASK_SH_LIST(_MASK)
-};
-
-static struct afmt *dcn303_afmt_create(struct dc_context *ctx, uint32_t inst)
-{
-       struct dcn30_afmt *afmt3 = kzalloc(sizeof(struct dcn30_afmt), GFP_KERNEL);
-
-       if (!afmt3)
-               return NULL;
-
-       afmt3_construct(afmt3, ctx, inst, &afmt_regs[inst], &afmt_shift, &afmt_mask);
-
-       return &afmt3->base;
-}
-
-#define audio_regs(id)\
-               [id] = { AUD_COMMON_REG_LIST(id) }
-
-static const struct dce_audio_registers audio_regs[] = {
-               audio_regs(0),
-               audio_regs(1),
-               audio_regs(2),
-               audio_regs(3),
-               audio_regs(4),
-               audio_regs(5),
-               audio_regs(6)
-};
-
-#define DCE120_AUD_COMMON_MASK_SH_LIST(mask_sh)\
-               SF(AZF0ENDPOINT0_AZALIA_F0_CODEC_ENDPOINT_INDEX, AZALIA_ENDPOINT_REG_INDEX, mask_sh),\
-               SF(AZF0ENDPOINT0_AZALIA_F0_CODEC_ENDPOINT_DATA, AZALIA_ENDPOINT_REG_DATA, mask_sh),\
-               AUD_COMMON_MASK_SH_LIST_BASE(mask_sh)
-
-static const struct dce_audio_shift audio_shift = {
-               DCE120_AUD_COMMON_MASK_SH_LIST(__SHIFT)
-};
-
-static const struct dce_audio_mask audio_mask = {
-               DCE120_AUD_COMMON_MASK_SH_LIST(_MASK)
-};
-
-static struct audio *dcn303_create_audio(struct dc_context *ctx, unsigned int inst)
-{
-       return dce_audio_create(ctx, inst, &audio_regs[inst], &audio_shift, &audio_mask);
-}
-
-#define stream_enc_regs(id)\
-               [id] = { SE_DCN3_REG_LIST(id) }
-
-static const struct dcn10_stream_enc_registers stream_enc_regs[] = {
-               stream_enc_regs(0),
-               stream_enc_regs(1)
-};
-
-static const struct dcn10_stream_encoder_shift se_shift = {
-               SE_COMMON_MASK_SH_LIST_DCN30(__SHIFT)
-};
-
-static const struct dcn10_stream_encoder_mask se_mask = {
-               SE_COMMON_MASK_SH_LIST_DCN30(_MASK)
-};
-
-static struct stream_encoder *dcn303_stream_encoder_create(enum engine_id eng_id, struct dc_context *ctx)
-{
-       struct dcn10_stream_encoder *enc1;
-       struct vpg *vpg;
-       struct afmt *afmt;
-       int vpg_inst;
-       int afmt_inst;
-
-       /* Mapping of VPG, AFMT, DME register blocks to DIO block instance */
-       if (eng_id <= ENGINE_ID_DIGB) {
-               vpg_inst = eng_id;
-               afmt_inst = eng_id;
-       } else
-               return NULL;
-
-       enc1 = kzalloc(sizeof(struct dcn10_stream_encoder), GFP_KERNEL);
-       vpg = dcn303_vpg_create(ctx, vpg_inst);
-       afmt = dcn303_afmt_create(ctx, afmt_inst);
-
-       if (!enc1 || !vpg || !afmt) {
-               kfree(enc1);
-               kfree(vpg);
-               kfree(afmt);
-               return NULL;
-       }
-
-       dcn30_dio_stream_encoder_construct(enc1, ctx, ctx->dc_bios, eng_id, vpg, afmt, &stream_enc_regs[eng_id],
-                       &se_shift, &se_mask);
-
-       return &enc1->base;
-}
-
-#define clk_src_regs(index, pllid)\
-               [index] = { CS_COMMON_REG_LIST_DCN3_03(index, pllid) }
-
-static const struct dce110_clk_src_regs clk_src_regs[] = {
-               clk_src_regs(0, A),
-               clk_src_regs(1, B)
-};
-
-static const struct dce110_clk_src_shift cs_shift = {
-               CS_COMMON_MASK_SH_LIST_DCN2_0(__SHIFT)
-};
-
-static const struct dce110_clk_src_mask cs_mask = {
-               CS_COMMON_MASK_SH_LIST_DCN2_0(_MASK)
-};
-
-static struct clock_source *dcn303_clock_source_create(struct dc_context *ctx, struct dc_bios *bios,
-               enum clock_source_id id, const struct dce110_clk_src_regs *regs, bool dp_clk_src)
-{
-       struct dce110_clk_src *clk_src = kzalloc(sizeof(struct dce110_clk_src), GFP_KERNEL);
-
-       if (!clk_src)
-               return NULL;
-
-       if (dcn3_clk_src_construct(clk_src, ctx, bios, id, regs, &cs_shift, &cs_mask)) {
-               clk_src->base.dp_clk_src = dp_clk_src;
-               return &clk_src->base;
-       }
-
-       kfree(clk_src);
-       BREAK_TO_DEBUGGER();
-       return NULL;
-}
-
-static const struct dce_hwseq_registers hwseq_reg = {
-               HWSEQ_DCN303_REG_LIST()
-};
-
-static const struct dce_hwseq_shift hwseq_shift = {
-               HWSEQ_DCN303_MASK_SH_LIST(__SHIFT)
-};
-
-static const struct dce_hwseq_mask hwseq_mask = {
-               HWSEQ_DCN303_MASK_SH_LIST(_MASK)
-};
-
-static struct dce_hwseq *dcn303_hwseq_create(struct dc_context *ctx)
-{
-       struct dce_hwseq *hws = kzalloc(sizeof(struct dce_hwseq), GFP_KERNEL);
-
-       if (hws) {
-               hws->ctx = ctx;
-               hws->regs = &hwseq_reg;
-               hws->shifts = &hwseq_shift;
-               hws->masks = &hwseq_mask;
-       }
-       return hws;
-}
-
-#define hubp_regs(id)\
-               [id] = { HUBP_REG_LIST_DCN30(id) }
-
-static const struct dcn_hubp2_registers hubp_regs[] = {
-               hubp_regs(0),
-               hubp_regs(1)
-};
-
-static const struct dcn_hubp2_shift hubp_shift = {
-               HUBP_MASK_SH_LIST_DCN30(__SHIFT)
-};
-
-static const struct dcn_hubp2_mask hubp_mask = {
-               HUBP_MASK_SH_LIST_DCN30(_MASK)
-};
-
-static struct hubp *dcn303_hubp_create(struct dc_context *ctx, uint32_t inst)
-{
-       struct dcn20_hubp *hubp2 = kzalloc(sizeof(struct dcn20_hubp), GFP_KERNEL);
-
-       if (!hubp2)
-               return NULL;
-
-       if (hubp3_construct(hubp2, ctx, inst, &hubp_regs[inst], &hubp_shift, &hubp_mask))
-               return &hubp2->base;
-
-       BREAK_TO_DEBUGGER();
-       kfree(hubp2);
-       return NULL;
-}
-
-#define dpp_regs(id)\
-               [id] = { DPP_REG_LIST_DCN30(id) }
-
-static const struct dcn3_dpp_registers dpp_regs[] = {
-               dpp_regs(0),
-               dpp_regs(1)
-};
-
-static const struct dcn3_dpp_shift tf_shift = {
-               DPP_REG_LIST_SH_MASK_DCN30(__SHIFT)
-};
-
-static const struct dcn3_dpp_mask tf_mask = {
-               DPP_REG_LIST_SH_MASK_DCN30(_MASK)
-};
-
-static struct dpp *dcn303_dpp_create(struct dc_context *ctx, uint32_t inst)
-{
-       struct dcn3_dpp *dpp = kzalloc(sizeof(struct dcn3_dpp), GFP_KERNEL);
-
-       if (!dpp)
-               return NULL;
-
-       if (dpp3_construct(dpp, ctx, inst, &dpp_regs[inst], &tf_shift, &tf_mask))
-               return &dpp->base;
-
-       BREAK_TO_DEBUGGER();
-       kfree(dpp);
-       return NULL;
-}
-
-#define opp_regs(id)\
-               [id] = { OPP_REG_LIST_DCN30(id) }
-
-static const struct dcn20_opp_registers opp_regs[] = {
-               opp_regs(0),
-               opp_regs(1)
-};
-
-static const struct dcn20_opp_shift opp_shift = {
-               OPP_MASK_SH_LIST_DCN20(__SHIFT)
-};
-
-static const struct dcn20_opp_mask opp_mask = {
-               OPP_MASK_SH_LIST_DCN20(_MASK)
-};
-
-static struct output_pixel_processor *dcn303_opp_create(struct dc_context *ctx, uint32_t inst)
-{
-       struct dcn20_opp *opp = kzalloc(sizeof(struct dcn20_opp), GFP_KERNEL);
-
-       if (!opp) {
-               BREAK_TO_DEBUGGER();
-               return NULL;
-       }
-
-       dcn20_opp_construct(opp, ctx, inst, &opp_regs[inst], &opp_shift, &opp_mask);
-       return &opp->base;
-}
-
-#define optc_regs(id)\
-               [id] = { OPTC_COMMON_REG_LIST_DCN3_0(id) }
-
-static const struct dcn_optc_registers optc_regs[] = {
-               optc_regs(0),
-               optc_regs(1)
-};
-
-static const struct dcn_optc_shift optc_shift = {
-               OPTC_COMMON_MASK_SH_LIST_DCN30(__SHIFT)
-};
-
-static const struct dcn_optc_mask optc_mask = {
-               OPTC_COMMON_MASK_SH_LIST_DCN30(_MASK)
-};
-
-static struct timing_generator *dcn303_timing_generator_create(struct dc_context *ctx, uint32_t instance)
-{
-       struct optc *tgn10 = kzalloc(sizeof(struct optc), GFP_KERNEL);
-
-       if (!tgn10)
-               return NULL;
-
-       tgn10->base.inst = instance;
-       tgn10->base.ctx = ctx;
-
-       tgn10->tg_regs = &optc_regs[instance];
-       tgn10->tg_shift = &optc_shift;
-       tgn10->tg_mask = &optc_mask;
-
-       dcn30_timing_generator_init(tgn10);
-
-       return &tgn10->base;
-}
-
-static const struct dcn30_mpc_registers mpc_regs = {
-               MPC_REG_LIST_DCN3_0(0),
-               MPC_REG_LIST_DCN3_0(1),
-               MPC_OUT_MUX_REG_LIST_DCN3_0(0),
-               MPC_OUT_MUX_REG_LIST_DCN3_0(1),
-               MPC_RMU_GLOBAL_REG_LIST_DCN3AG,
-               MPC_RMU_REG_LIST_DCN3AG(0),
-               MPC_DWB_MUX_REG_LIST_DCN3_0(0),
-};
-
-static const struct dcn30_mpc_shift mpc_shift = {
-               MPC_COMMON_MASK_SH_LIST_DCN303(__SHIFT)
-};
-
-static const struct dcn30_mpc_mask mpc_mask = {
-               MPC_COMMON_MASK_SH_LIST_DCN303(_MASK)
-};
-
-static struct mpc *dcn303_mpc_create(struct dc_context *ctx, int num_mpcc, int num_rmu)
-{
-       struct dcn30_mpc *mpc30 = kzalloc(sizeof(struct dcn30_mpc), GFP_KERNEL);
-
-       if (!mpc30)
-               return NULL;
-
-       dcn30_mpc_construct(mpc30, ctx, &mpc_regs, &mpc_shift, &mpc_mask, num_mpcc, num_rmu);
-
-       return &mpc30->base;
-}
-
-#define dsc_regsDCN20(id)\
-[id] = { DSC_REG_LIST_DCN20(id) }
-
-static const struct dcn20_dsc_registers dsc_regs[] = {
-               dsc_regsDCN20(0),
-               dsc_regsDCN20(1)
-};
-
-static const struct dcn20_dsc_shift dsc_shift = {
-               DSC_REG_LIST_SH_MASK_DCN20(__SHIFT)
-};
-
-static const struct dcn20_dsc_mask dsc_mask = {
-               DSC_REG_LIST_SH_MASK_DCN20(_MASK)
-};
-
-static struct display_stream_compressor *dcn303_dsc_create(struct dc_context *ctx, uint32_t inst)
-{
-       struct dcn20_dsc *dsc = kzalloc(sizeof(struct dcn20_dsc), GFP_KERNEL);
-
-       if (!dsc) {
-               BREAK_TO_DEBUGGER();
-               return NULL;
-       }
-
-       dsc2_construct(dsc, ctx, inst, &dsc_regs[inst], &dsc_shift, &dsc_mask);
-       return &dsc->base;
-}
-
-#define dwbc_regs_dcn3(id)\
-[id] = { DWBC_COMMON_REG_LIST_DCN30(id) }
-
-static const struct dcn30_dwbc_registers dwbc30_regs[] = {
-               dwbc_regs_dcn3(0)
-};
-
-static const struct dcn30_dwbc_shift dwbc30_shift = {
-               DWBC_COMMON_MASK_SH_LIST_DCN30(__SHIFT)
-};
-
-static const struct dcn30_dwbc_mask dwbc30_mask = {
-               DWBC_COMMON_MASK_SH_LIST_DCN30(_MASK)
-};
-
-static bool dcn303_dwbc_create(struct dc_context *ctx, struct resource_pool *pool)
-{
-       int i;
-       uint32_t pipe_count = pool->res_cap->num_dwb;
-
-       for (i = 0; i < pipe_count; i++) {
-               struct dcn30_dwbc *dwbc30 = kzalloc(sizeof(struct dcn30_dwbc), GFP_KERNEL);
-
-               if (!dwbc30) {
-                       dm_error("DC: failed to create dwbc30!\n");
-                       return false;
-               }
-
-               dcn30_dwbc_construct(dwbc30, ctx, &dwbc30_regs[i], &dwbc30_shift, &dwbc30_mask, i);
-
-               pool->dwbc[i] = &dwbc30->base;
-       }
-       return true;
-}
-
-#define mcif_wb_regs_dcn3(id)\
-[id] = { MCIF_WB_COMMON_REG_LIST_DCN30(id) }
-
-static const struct dcn30_mmhubbub_registers mcif_wb30_regs[] = {
-               mcif_wb_regs_dcn3(0)
-};
-
-static const struct dcn30_mmhubbub_shift mcif_wb30_shift = {
-               MCIF_WB_COMMON_MASK_SH_LIST_DCN30(__SHIFT)
-};
-
-static const struct dcn30_mmhubbub_mask mcif_wb30_mask = {
-               MCIF_WB_COMMON_MASK_SH_LIST_DCN30(_MASK)
-};
-
-static bool dcn303_mmhubbub_create(struct dc_context *ctx, struct resource_pool *pool)
-{
-       int i;
-       uint32_t pipe_count = pool->res_cap->num_dwb;
-
-       for (i = 0; i < pipe_count; i++) {
-               struct dcn30_mmhubbub *mcif_wb30 = kzalloc(sizeof(struct dcn30_mmhubbub), GFP_KERNEL);
-
-               if (!mcif_wb30) {
-                       dm_error("DC: failed to create mcif_wb30!\n");
-                       return false;
-               }
-
-               dcn30_mmhubbub_construct(mcif_wb30, ctx, &mcif_wb30_regs[i], &mcif_wb30_shift, &mcif_wb30_mask, i);
-
-               pool->mcif_wb[i] = &mcif_wb30->base;
-       }
-       return true;
-}
-
-#define aux_engine_regs(id)\
-[id] = {\
-               AUX_COMMON_REG_LIST0(id), \
-               .AUXN_IMPCAL = 0, \
-               .AUXP_IMPCAL = 0, \
-               .AUX_RESET_MASK = DP_AUX0_AUX_CONTROL__AUX_RESET_MASK, \
-}
-
-static const struct dce110_aux_registers aux_engine_regs[] = {
-               aux_engine_regs(0),
-               aux_engine_regs(1)
-};
-
-static const struct dce110_aux_registers_shift aux_shift = {
-               DCN_AUX_MASK_SH_LIST(__SHIFT)
-};
-
-static const struct dce110_aux_registers_mask aux_mask = {
-               DCN_AUX_MASK_SH_LIST(_MASK)
-};
-
-static struct dce_aux *dcn303_aux_engine_create(struct dc_context *ctx, uint32_t inst)
-{
-       struct aux_engine_dce110 *aux_engine = kzalloc(sizeof(struct aux_engine_dce110), GFP_KERNEL);
-
-       if (!aux_engine)
-               return NULL;
-
-       dce110_aux_engine_construct(aux_engine, ctx, inst, SW_AUX_TIMEOUT_PERIOD_MULTIPLIER * AUX_TIMEOUT_PERIOD,
-                       &aux_engine_regs[inst], &aux_mask, &aux_shift, ctx->dc->caps.extended_aux_timeout_support);
-
-       return &aux_engine->base;
-}
-
-#define i2c_inst_regs(id) { I2C_HW_ENGINE_COMMON_REG_LIST(id) }
-
-static const struct dce_i2c_registers i2c_hw_regs[] = {
-               i2c_inst_regs(1),
-               i2c_inst_regs(2)
-};
-
-static const struct dce_i2c_shift i2c_shifts = {
-               I2C_COMMON_MASK_SH_LIST_DCN2(__SHIFT)
-};
-
-static const struct dce_i2c_mask i2c_masks = {
-               I2C_COMMON_MASK_SH_LIST_DCN2(_MASK)
-};
-
-static struct dce_i2c_hw *dcn303_i2c_hw_create(struct dc_context *ctx, uint32_t inst)
-{
-       struct dce_i2c_hw *dce_i2c_hw = kzalloc(sizeof(struct dce_i2c_hw), GFP_KERNEL);
-
-       if (!dce_i2c_hw)
-               return NULL;
-
-       dcn2_i2c_hw_construct(dce_i2c_hw, ctx, inst, &i2c_hw_regs[inst], &i2c_shifts, &i2c_masks);
-
-       return dce_i2c_hw;
-}
-
-static const struct encoder_feature_support link_enc_feature = {
-               .max_hdmi_deep_color = COLOR_DEPTH_121212,
-               .max_hdmi_pixel_clock = 600000,
-               .hdmi_ycbcr420_supported = true,
-               .dp_ycbcr420_supported = true,
-               .fec_supported = true,
-               .flags.bits.IS_HBR2_CAPABLE = true,
-               .flags.bits.IS_HBR3_CAPABLE = true,
-               .flags.bits.IS_TPS3_CAPABLE = true,
-               .flags.bits.IS_TPS4_CAPABLE = true
-};
-
-#define link_regs(id, phyid)\
-               [id] = {\
-                               LE_DCN3_REG_LIST(id), \
-                               UNIPHY_DCN2_REG_LIST(phyid), \
-                               SRI(DP_DPHY_INTERNAL_CTRL, DP, id) \
-               }
-
-static const struct dcn10_link_enc_registers link_enc_regs[] = {
-               link_regs(0, A),
-               link_regs(1, B)
-};
-
-static const struct dcn10_link_enc_shift le_shift = {
-               LINK_ENCODER_MASK_SH_LIST_DCN30(__SHIFT),
-               DPCS_DCN2_MASK_SH_LIST(__SHIFT)
-};
-
-static const struct dcn10_link_enc_mask le_mask = {
-               LINK_ENCODER_MASK_SH_LIST_DCN30(_MASK),
-               DPCS_DCN2_MASK_SH_LIST(_MASK)
-};
-
-#define aux_regs(id)\
-               [id] = { DCN2_AUX_REG_LIST(id) }
-
-static const struct dcn10_link_enc_aux_registers link_enc_aux_regs[] = {
-               aux_regs(0),
-               aux_regs(1)
-};
-
-#define hpd_regs(id)\
-               [id] = { HPD_REG_LIST(id) }
-
-static const struct dcn10_link_enc_hpd_registers link_enc_hpd_regs[] = {
-               hpd_regs(0),
-               hpd_regs(1)
-};
-
-static struct link_encoder *dcn303_link_encoder_create(
-       struct dc_context *ctx,
-       const struct encoder_init_data *enc_init_data)
-{
-       struct dcn20_link_encoder *enc20 = kzalloc(sizeof(struct dcn20_link_encoder), GFP_KERNEL);
-
-       if (!enc20)
-               return NULL;
-
-       dcn30_link_encoder_construct(enc20, enc_init_data, &link_enc_feature,
-                       &link_enc_regs[enc_init_data->transmitter], &link_enc_aux_regs[enc_init_data->channel - 1],
-                       &link_enc_hpd_regs[enc_init_data->hpd_source], &le_shift, &le_mask);
-
-       return &enc20->enc10.base;
-}
-
-static const struct dce_panel_cntl_registers panel_cntl_regs[] = {
-               { DCN_PANEL_CNTL_REG_LIST() }
-};
-
-static const struct dce_panel_cntl_shift panel_cntl_shift = {
-               DCE_PANEL_CNTL_MASK_SH_LIST(__SHIFT)
-};
-
-static const struct dce_panel_cntl_mask panel_cntl_mask = {
-               DCE_PANEL_CNTL_MASK_SH_LIST(_MASK)
-};
-
-static struct panel_cntl *dcn303_panel_cntl_create(const struct panel_cntl_init_data *init_data)
-{
-       struct dce_panel_cntl *panel_cntl = kzalloc(sizeof(struct dce_panel_cntl), GFP_KERNEL);
-
-       if (!panel_cntl)
-               return NULL;
-
-       dce_panel_cntl_construct(panel_cntl, init_data, &panel_cntl_regs[init_data->inst],
-                       &panel_cntl_shift, &panel_cntl_mask);
-
-       return &panel_cntl->base;
-}
-
-static void read_dce_straps(struct dc_context *ctx, struct resource_straps *straps)
-{
-       generic_reg_get(ctx, mmDC_PINSTRAPS + BASE(mmDC_PINSTRAPS_BASE_IDX),
-                       FN(DC_PINSTRAPS, DC_PINSTRAPS_AUDIO), &straps->dc_pinstraps_audio);
-}
-
-static const struct resource_create_funcs res_create_funcs = {
-               .read_dce_straps = read_dce_straps,
-               .create_audio = dcn303_create_audio,
-               .create_stream_encoder = dcn303_stream_encoder_create,
-               .create_hwseq = dcn303_hwseq_create,
-};
-
-static bool is_soc_bounding_box_valid(struct dc *dc)
-{
-       uint32_t hw_internal_rev = dc->ctx->asic_id.hw_internal_rev;
-
-       if (ASICREV_IS_BEIGE_GOBY_P(hw_internal_rev))
-               return true;
-
-       return false;
-}
-
-static bool init_soc_bounding_box(struct dc *dc,  struct resource_pool *pool)
-{
-       struct _vcs_dpi_soc_bounding_box_st *loaded_bb = &dcn3_03_soc;
-       struct _vcs_dpi_ip_params_st *loaded_ip = &dcn3_03_ip;
-
-       DC_LOGGER_INIT(dc->ctx->logger);
-
-       if (!is_soc_bounding_box_valid(dc)) {
-               DC_LOG_ERROR("%s: not valid soc bounding box/n", __func__);
-               return false;
-       }
-
-       loaded_ip->max_num_otg = pool->pipe_count;
-       loaded_ip->max_num_dpp = pool->pipe_count;
-       loaded_ip->clamp_min_dcfclk = dc->config.clamp_min_dcfclk;
-       DC_FP_START();
-       dcn20_patch_bounding_box(dc, loaded_bb);
-       DC_FP_END();
-
-       if (dc->ctx->dc_bios->funcs->get_soc_bb_info) {
-               struct bp_soc_bb_info bb_info = { 0 };
-
-               if (dc->ctx->dc_bios->funcs->get_soc_bb_info(
-                           dc->ctx->dc_bios, &bb_info) == BP_RESULT_OK) {
-                                       DC_FP_START();
-                                       dcn303_fpu_init_soc_bounding_box(bb_info);
-                                       DC_FP_END();
-               }
-       }
-
-       return true;
-}
-
-static void dcn303_resource_destruct(struct resource_pool *pool)
-{
-       unsigned int i;
-
-       for (i = 0; i < pool->stream_enc_count; i++) {
-               if (pool->stream_enc[i] != NULL) {
-                       if (pool->stream_enc[i]->vpg != NULL) {
-                               kfree(DCN30_VPG_FROM_VPG(pool->stream_enc[i]->vpg));
-                               pool->stream_enc[i]->vpg = NULL;
-                       }
-                       if (pool->stream_enc[i]->afmt != NULL) {
-                               kfree(DCN30_AFMT_FROM_AFMT(pool->stream_enc[i]->afmt));
-                               pool->stream_enc[i]->afmt = NULL;
-                       }
-                       kfree(DCN10STRENC_FROM_STRENC(pool->stream_enc[i]));
-                       pool->stream_enc[i] = NULL;
-               }
-       }
-
-       for (i = 0; i < pool->res_cap->num_dsc; i++) {
-               if (pool->dscs[i] != NULL)
-                       dcn20_dsc_destroy(&pool->dscs[i]);
-       }
-
-       if (pool->mpc != NULL) {
-               kfree(TO_DCN20_MPC(pool->mpc));
-               pool->mpc = NULL;
-       }
-
-       if (pool->hubbub != NULL) {
-               kfree(pool->hubbub);
-               pool->hubbub = NULL;
-       }
-
-       for (i = 0; i < pool->pipe_count; i++) {
-               if (pool->dpps[i] != NULL) {
-                       kfree(TO_DCN20_DPP(pool->dpps[i]));
-                       pool->dpps[i] = NULL;
-               }
-
-               if (pool->hubps[i] != NULL) {
-                       kfree(TO_DCN20_HUBP(pool->hubps[i]));
-                       pool->hubps[i] = NULL;
-               }
-
-               if (pool->irqs != NULL)
-                       dal_irq_service_destroy(&pool->irqs);
-       }
-
-       for (i = 0; i < pool->res_cap->num_ddc; i++) {
-               if (pool->engines[i] != NULL)
-                       dce110_engine_destroy(&pool->engines[i]);
-               if (pool->hw_i2cs[i] != NULL) {
-                       kfree(pool->hw_i2cs[i]);
-                       pool->hw_i2cs[i] = NULL;
-               }
-               if (pool->sw_i2cs[i] != NULL) {
-                       kfree(pool->sw_i2cs[i]);
-                       pool->sw_i2cs[i] = NULL;
-               }
-       }
-
-       for (i = 0; i < pool->res_cap->num_opp; i++) {
-               if (pool->opps[i] != NULL)
-                       pool->opps[i]->funcs->opp_destroy(&pool->opps[i]);
-       }
-
-       for (i = 0; i < pool->res_cap->num_timing_generator; i++) {
-               if (pool->timing_generators[i] != NULL) {
-                       kfree(DCN10TG_FROM_TG(pool->timing_generators[i]));
-                       pool->timing_generators[i] = NULL;
-               }
-       }
-
-       for (i = 0; i < pool->res_cap->num_dwb; i++) {
-               if (pool->dwbc[i] != NULL) {
-                       kfree(TO_DCN30_DWBC(pool->dwbc[i]));
-                       pool->dwbc[i] = NULL;
-               }
-               if (pool->mcif_wb[i] != NULL) {
-                       kfree(TO_DCN30_MMHUBBUB(pool->mcif_wb[i]));
-                       pool->mcif_wb[i] = NULL;
-               }
-       }
-
-       for (i = 0; i < pool->audio_count; i++) {
-               if (pool->audios[i])
-                       dce_aud_destroy(&pool->audios[i]);
-       }
-
-       for (i = 0; i < pool->clk_src_count; i++) {
-               if (pool->clock_sources[i] != NULL)
-                       dcn20_clock_source_destroy(&pool->clock_sources[i]);
-       }
-
-       if (pool->dp_clock_source != NULL)
-               dcn20_clock_source_destroy(&pool->dp_clock_source);
-
-       for (i = 0; i < pool->res_cap->num_mpc_3dlut; i++) {
-               if (pool->mpc_lut[i] != NULL) {
-                       dc_3dlut_func_release(pool->mpc_lut[i]);
-                       pool->mpc_lut[i] = NULL;
-               }
-               if (pool->mpc_shaper[i] != NULL) {
-                       dc_transfer_func_release(pool->mpc_shaper[i]);
-                       pool->mpc_shaper[i] = NULL;
-               }
-       }
-
-       for (i = 0; i < pool->pipe_count; i++) {
-               if (pool->multiple_abms[i] != NULL)
-                       dce_abm_destroy(&pool->multiple_abms[i]);
-       }
-
-       if (pool->psr != NULL)
-               dmub_psr_destroy(&pool->psr);
-
-       if (pool->dccg != NULL)
-               dcn_dccg_destroy(&pool->dccg);
-
-       if (pool->oem_device != NULL) {
-               struct dc *dc = pool->oem_device->ctx->dc;
-
-               dc->link_srv->destroy_ddc_service(&pool->oem_device);
-       }
-}
-
-static void dcn303_destroy_resource_pool(struct resource_pool **pool)
-{
-       dcn303_resource_destruct(*pool);
-       kfree(*pool);
-       *pool = NULL;
-}
-
-static void dcn303_get_panel_config_defaults(struct dc_panel_config *panel_config)
-{
-       *panel_config = panel_config_defaults;
-}
-
-void dcn303_update_bw_bounding_box(struct dc *dc, struct clk_bw_params *bw_params)
-{
-       DC_FP_START();
-       dcn303_fpu_update_bw_bounding_box(dc, bw_params);
-       DC_FP_END();
-}
-
-static struct resource_funcs dcn303_res_pool_funcs = {
-               .destroy = dcn303_destroy_resource_pool,
-               .link_enc_create = dcn303_link_encoder_create,
-               .panel_cntl_create = dcn303_panel_cntl_create,
-               .validate_bandwidth = dcn30_validate_bandwidth,
-               .calculate_wm_and_dlg = dcn30_calculate_wm_and_dlg,
-               .update_soc_for_wm_a = dcn30_update_soc_for_wm_a,
-               .populate_dml_pipes = dcn30_populate_dml_pipes_from_context,
-               .acquire_free_pipe_as_secondary_dpp_pipe = dcn20_acquire_free_pipe_for_layer,
-               .release_pipe = dcn20_release_pipe,
-               .add_stream_to_ctx = dcn30_add_stream_to_ctx,
-               .add_dsc_to_stream_resource = dcn20_add_dsc_to_stream_resource,
-               .remove_stream_from_ctx = dcn20_remove_stream_from_ctx,
-               .populate_dml_writeback_from_context = dcn30_populate_dml_writeback_from_context,
-               .set_mcif_arb_params = dcn30_set_mcif_arb_params,
-               .find_first_free_match_stream_enc_for_link = dcn10_find_first_free_match_stream_enc_for_link,
-               .acquire_post_bldn_3dlut = dcn30_acquire_post_bldn_3dlut,
-               .release_post_bldn_3dlut = dcn30_release_post_bldn_3dlut,
-               .update_bw_bounding_box = dcn303_update_bw_bounding_box,
-               .patch_unknown_plane_state = dcn20_patch_unknown_plane_state,
-               .get_panel_config_defaults = dcn303_get_panel_config_defaults,
-};
-
-static struct dc_cap_funcs cap_funcs = {
-               .get_dcc_compression_cap = dcn20_get_dcc_compression_cap
-};
-
-static const struct bios_registers bios_regs = {
-               NBIO_SR(BIOS_SCRATCH_3),
-               NBIO_SR(BIOS_SCRATCH_6)
-};
-
-static const struct dccg_registers dccg_regs = {
-               DCCG_REG_LIST_DCN3_03()
-};
-
-static const struct dccg_shift dccg_shift = {
-               DCCG_MASK_SH_LIST_DCN3_03(__SHIFT)
-};
-
-static const struct dccg_mask dccg_mask = {
-               DCCG_MASK_SH_LIST_DCN3_03(_MASK)
-};
-
-#define abm_regs(id)\
-               [id] = { ABM_DCN302_REG_LIST(id) }
-
-static const struct dce_abm_registers abm_regs[] = {
-               abm_regs(0),
-               abm_regs(1)
-};
-
-static const struct dce_abm_shift abm_shift = {
-               ABM_MASK_SH_LIST_DCN30(__SHIFT)
-};
-
-static const struct dce_abm_mask abm_mask = {
-               ABM_MASK_SH_LIST_DCN30(_MASK)
-};
-
-static bool dcn303_resource_construct(
-               uint8_t num_virtual_links,
-               struct dc *dc,
-               struct resource_pool *pool)
-{
-       int i;
-       struct dc_context *ctx = dc->ctx;
-       struct irq_service_init_data init_data;
-       struct ddc_service_init_data ddc_init_data;
-
-       ctx->dc_bios->regs = &bios_regs;
-
-       pool->res_cap = &res_cap_dcn303;
-
-       pool->funcs = &dcn303_res_pool_funcs;
-
-       /*************************************************
-        *  Resource + asic cap harcoding                *
-        *************************************************/
-       pool->underlay_pipe_index = NO_UNDERLAY_PIPE;
-       pool->pipe_count = pool->res_cap->num_timing_generator;
-       pool->mpcc_count = pool->res_cap->num_timing_generator;
-       dc->caps.max_downscale_ratio = 600;
-       dc->caps.i2c_speed_in_khz = 100;
-       dc->caps.i2c_speed_in_khz_hdcp = 5; /*1.4 w/a applied by derfault*/
-       dc->caps.max_cursor_size = 256;
-       dc->caps.min_horizontal_blanking_period = 80;
-       dc->caps.dmdata_alloc_size = 2048;
-       dc->caps.mall_size_per_mem_channel = 4;
-       /* total size = mall per channel * num channels * 1024 * 1024 */
-       dc->caps.mall_size_total = dc->caps.mall_size_per_mem_channel *
-                                  dc->ctx->dc_bios->vram_info.num_chans *
-                                  1024 * 1024;
-       dc->caps.cursor_cache_size =
-               dc->caps.max_cursor_size * dc->caps.max_cursor_size * 8;
-       dc->caps.max_slave_planes = 1;
-       dc->caps.post_blend_color_processing = true;
-       dc->caps.force_dp_tps4_for_cp2520 = true;
-       dc->caps.extended_aux_timeout_support = true;
-       dc->caps.dmcub_support = true;
-       dc->caps.max_v_total = (1 << 15) - 1;
-
-       /* Color pipeline capabilities */
-       dc->caps.color.dpp.dcn_arch = 1;
-       dc->caps.color.dpp.input_lut_shared = 0;
-       dc->caps.color.dpp.icsc = 1;
-       dc->caps.color.dpp.dgam_ram = 0; // must use gamma_corr
-       dc->caps.color.dpp.dgam_rom_caps.srgb = 1;
-       dc->caps.color.dpp.dgam_rom_caps.bt2020 = 1;
-       dc->caps.color.dpp.dgam_rom_caps.gamma2_2 = 1;
-       dc->caps.color.dpp.dgam_rom_caps.pq = 1;
-       dc->caps.color.dpp.dgam_rom_caps.hlg = 1;
-       dc->caps.color.dpp.post_csc = 1;
-       dc->caps.color.dpp.gamma_corr = 1;
-       dc->caps.color.dpp.dgam_rom_for_yuv = 0;
-
-       dc->caps.color.dpp.hw_3d_lut = 1;
-       dc->caps.color.dpp.ogam_ram = 1;
-       // no OGAM ROM on DCN3
-       dc->caps.color.dpp.ogam_rom_caps.srgb = 0;
-       dc->caps.color.dpp.ogam_rom_caps.bt2020 = 0;
-       dc->caps.color.dpp.ogam_rom_caps.gamma2_2 = 0;
-       dc->caps.color.dpp.ogam_rom_caps.pq = 0;
-       dc->caps.color.dpp.ogam_rom_caps.hlg = 0;
-       dc->caps.color.dpp.ocsc = 0;
-
-       dc->caps.color.mpc.gamut_remap = 1;
-       dc->caps.color.mpc.num_3dluts = pool->res_cap->num_mpc_3dlut; //3
-       dc->caps.color.mpc.ogam_ram = 1;
-       dc->caps.color.mpc.ogam_rom_caps.srgb = 0;
-       dc->caps.color.mpc.ogam_rom_caps.bt2020 = 0;
-       dc->caps.color.mpc.ogam_rom_caps.gamma2_2 = 0;
-       dc->caps.color.mpc.ogam_rom_caps.pq = 0;
-       dc->caps.color.mpc.ogam_rom_caps.hlg = 0;
-       dc->caps.color.mpc.ocsc = 1;
-
-       dc->caps.dp_hdmi21_pcon_support = true;
-
-       dc->config.dc_mode_clk_limit_support = true;
-       /* read VBIOS LTTPR caps */
-       if (ctx->dc_bios->funcs->get_lttpr_caps) {
-               enum bp_result bp_query_result;
-               uint8_t is_vbios_lttpr_enable = 0;
-
-               bp_query_result = ctx->dc_bios->funcs->get_lttpr_caps(ctx->dc_bios, &is_vbios_lttpr_enable);
-               dc->caps.vbios_lttpr_enable = (bp_query_result == BP_RESULT_OK) && !!is_vbios_lttpr_enable;
-       }
-
-       if (ctx->dc_bios->funcs->get_lttpr_interop) {
-               enum bp_result bp_query_result;
-               uint8_t is_vbios_interop_enabled = 0;
-
-               bp_query_result = ctx->dc_bios->funcs->get_lttpr_interop(ctx->dc_bios, &is_vbios_interop_enabled);
-               dc->caps.vbios_lttpr_aware = (bp_query_result == BP_RESULT_OK) && !!is_vbios_interop_enabled;
-       }
-
-       if (dc->ctx->dce_environment == DCE_ENV_PRODUCTION_DRV)
-               dc->debug = debug_defaults_drv;
-
-       // Init the vm_helper
-       if (dc->vm_helper)
-               vm_helper_init(dc->vm_helper, 16);
-
-       /*************************************************
-        *  Create resources                             *
-        *************************************************/
-
-       /* Clock Sources for Pixel Clock*/
-       pool->clock_sources[DCN303_CLK_SRC_PLL0] =
-                       dcn303_clock_source_create(ctx, ctx->dc_bios,
-                                       CLOCK_SOURCE_COMBO_PHY_PLL0,
-                                       &clk_src_regs[0], false);
-       pool->clock_sources[DCN303_CLK_SRC_PLL1] =
-                       dcn303_clock_source_create(ctx, ctx->dc_bios,
-                                       CLOCK_SOURCE_COMBO_PHY_PLL1,
-                                       &clk_src_regs[1], false);
-
-       pool->clk_src_count = DCN303_CLK_SRC_TOTAL;
-
-       /* todo: not reuse phy_pll registers */
-       pool->dp_clock_source =
-                       dcn303_clock_source_create(ctx, ctx->dc_bios,
-                                       CLOCK_SOURCE_ID_DP_DTO,
-                                       &clk_src_regs[0], true);
-
-       for (i = 0; i < pool->clk_src_count; i++) {
-               if (pool->clock_sources[i] == NULL) {
-                       dm_error("DC: failed to create clock sources!\n");
-                       BREAK_TO_DEBUGGER();
-                       goto create_fail;
-               }
-       }
-
-       /* DCCG */
-       pool->dccg = dccg30_create(ctx, &dccg_regs, &dccg_shift, &dccg_mask);
-       if (pool->dccg == NULL) {
-               dm_error("DC: failed to create dccg!\n");
-               BREAK_TO_DEBUGGER();
-               goto create_fail;
-       }
-
-       /* PP Lib and SMU interfaces */
-       init_soc_bounding_box(dc, pool);
-
-       /* DML */
-       dml_init_instance(&dc->dml, &dcn3_03_soc, &dcn3_03_ip, DML_PROJECT_DCN30);
-
-       /* IRQ */
-       init_data.ctx = dc->ctx;
-       pool->irqs = dal_irq_service_dcn303_create(&init_data);
-       if (!pool->irqs)
-               goto create_fail;
-
-       /* HUBBUB */
-       pool->hubbub = dcn303_hubbub_create(ctx);
-       if (pool->hubbub == NULL) {
-               BREAK_TO_DEBUGGER();
-               dm_error("DC: failed to create hubbub!\n");
-               goto create_fail;
-       }
-
-       /* HUBPs, DPPs, OPPs and TGs */
-       for (i = 0; i < pool->pipe_count; i++) {
-               pool->hubps[i] = dcn303_hubp_create(ctx, i);
-               if (pool->hubps[i] == NULL) {
-                       BREAK_TO_DEBUGGER();
-                       dm_error("DC: failed to create hubps!\n");
-                       goto create_fail;
-               }
-
-               pool->dpps[i] = dcn303_dpp_create(ctx, i);
-               if (pool->dpps[i] == NULL) {
-                       BREAK_TO_DEBUGGER();
-                       dm_error("DC: failed to create dpps!\n");
-                       goto create_fail;
-               }
-       }
-
-       for (i = 0; i < pool->res_cap->num_opp; i++) {
-               pool->opps[i] = dcn303_opp_create(ctx, i);
-               if (pool->opps[i] == NULL) {
-                       BREAK_TO_DEBUGGER();
-                       dm_error("DC: failed to create output pixel processor!\n");
-                       goto create_fail;
-               }
-       }
-
-       for (i = 0; i < pool->res_cap->num_timing_generator; i++) {
-               pool->timing_generators[i] = dcn303_timing_generator_create(ctx, i);
-               if (pool->timing_generators[i] == NULL) {
-                       BREAK_TO_DEBUGGER();
-                       dm_error("DC: failed to create tg!\n");
-                       goto create_fail;
-               }
-       }
-       pool->timing_generator_count = i;
-
-       /* PSR */
-       pool->psr = dmub_psr_create(ctx);
-       if (pool->psr == NULL) {
-               dm_error("DC: failed to create psr!\n");
-               BREAK_TO_DEBUGGER();
-               goto create_fail;
-       }
-
-       /* ABM */
-       for (i = 0; i < pool->res_cap->num_timing_generator; i++) {
-               pool->multiple_abms[i] = dmub_abm_create(ctx, &abm_regs[i], &abm_shift, &abm_mask);
-               if (pool->multiple_abms[i] == NULL) {
-                       dm_error("DC: failed to create abm for pipe %d!\n", i);
-                       BREAK_TO_DEBUGGER();
-                       goto create_fail;
-               }
-       }
-
-       /* MPC and DSC */
-       pool->mpc = dcn303_mpc_create(ctx, pool->mpcc_count, pool->res_cap->num_mpc_3dlut);
-       if (pool->mpc == NULL) {
-               BREAK_TO_DEBUGGER();
-               dm_error("DC: failed to create mpc!\n");
-               goto create_fail;
-       }
-
-       for (i = 0; i < pool->res_cap->num_dsc; i++) {
-               pool->dscs[i] = dcn303_dsc_create(ctx, i);
-               if (pool->dscs[i] == NULL) {
-                       BREAK_TO_DEBUGGER();
-                       dm_error("DC: failed to create display stream compressor %d!\n", i);
-                       goto create_fail;
-               }
-       }
-
-       /* DWB and MMHUBBUB */
-       if (!dcn303_dwbc_create(ctx, pool)) {
-               BREAK_TO_DEBUGGER();
-               dm_error("DC: failed to create dwbc!\n");
-               goto create_fail;
-       }
-
-       if (!dcn303_mmhubbub_create(ctx, pool)) {
-               BREAK_TO_DEBUGGER();
-               dm_error("DC: failed to create mcif_wb!\n");
-               goto create_fail;
-       }
-
-       /* AUX and I2C */
-       for (i = 0; i < pool->res_cap->num_ddc; i++) {
-               pool->engines[i] = dcn303_aux_engine_create(ctx, i);
-               if (pool->engines[i] == NULL) {
-                       BREAK_TO_DEBUGGER();
-                       dm_error("DC:failed to create aux engine!!\n");
-                       goto create_fail;
-               }
-               pool->hw_i2cs[i] = dcn303_i2c_hw_create(ctx, i);
-               if (pool->hw_i2cs[i] == NULL) {
-                       BREAK_TO_DEBUGGER();
-                       dm_error("DC:failed to create hw i2c!!\n");
-                       goto create_fail;
-               }
-               pool->sw_i2cs[i] = NULL;
-       }
-
-       /* Audio, Stream Encoders including HPO and virtual, MPC 3D LUTs */
-       if (!resource_construct(num_virtual_links, dc, pool,
-                       &res_create_funcs))
-               goto create_fail;
-
-       /* HW Sequencer and Plane caps */
-       dcn303_hw_sequencer_construct(dc);
-
-       dc->caps.max_planes =  pool->pipe_count;
-
-       for (i = 0; i < dc->caps.max_planes; ++i)
-               dc->caps.planes[i] = plane_cap;
-
-       dc->cap_funcs = cap_funcs;
-
-       if (dc->ctx->dc_bios->fw_info.oem_i2c_present) {
-               ddc_init_data.ctx = dc->ctx;
-               ddc_init_data.link = NULL;
-               ddc_init_data.id.id = dc->ctx->dc_bios->fw_info.oem_i2c_obj_id;
-               ddc_init_data.id.enum_id = 0;
-               ddc_init_data.id.type = OBJECT_TYPE_GENERIC;
-               pool->oem_device = dc->link_srv->create_ddc_service(&ddc_init_data);
-       } else {
-               pool->oem_device = NULL;
-       }
-
-       return true;
-
-create_fail:
-
-       dcn303_resource_destruct(pool);
-
-       return false;
-}
-
-struct resource_pool *dcn303_create_resource_pool(const struct dc_init_data *init_data, struct dc *dc)
-{
-       struct resource_pool *pool = kzalloc(sizeof(struct resource_pool), GFP_KERNEL);
-
-       if (!pool)
-               return NULL;
-
-       if (dcn303_resource_construct(init_data->num_virtual_links, dc, pool))
-               return pool;
-
-       BREAK_TO_DEBUGGER();
-       kfree(pool);
-       return NULL;
-}
diff --git a/drivers/gpu/drm/amd/display/dc/dcn303/dcn303_resource.h b/drivers/gpu/drm/amd/display/dc/dcn303/dcn303_resource.h
deleted file mode 100644 (file)
index 37cf152..0000000
+++ /dev/null
@@ -1,38 +0,0 @@
-// SPDX-License-Identifier: MIT
-/*
- * Copyright (C) 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 _DCN303_RESOURCE_H_
-#define _DCN303_RESOURCE_H_
-
-#include "core_types.h"
-
-extern struct _vcs_dpi_ip_params_st dcn3_03_ip;
-extern struct _vcs_dpi_soc_bounding_box_st dcn3_03_soc;
-
-struct resource_pool *dcn303_create_resource_pool(const struct dc_init_data *init_data, struct dc *dc);
-
-void dcn303_update_bw_bounding_box(struct dc *dc, struct clk_bw_params *bw_params);
-
-#endif /* _DCN303_RESOURCE_H_ */
index 96e45c9efb461c27df82e2358dd2f373631d2488..212287008c0a65e20ea4607e841210ee48ad3a18 100644 (file)
@@ -10,7 +10,7 @@
 #
 # Makefile for dcn31.
 
-DCN31 = dcn31_resource.o dcn31_hubbub.o dcn31_init.o dcn31_hubp.o \
+DCN31 = dcn31_hubbub.o dcn31_init.o dcn31_hubp.o \
        dcn31_dccg.o dcn31_optc.o dcn31_dio_link_encoder.o dcn31_panel_cntl.o \
        dcn31_apg.o dcn31_hpo_dp_stream_encoder.o dcn31_hpo_dp_link_encoder.o \
        dcn31_afmt.o dcn31_vpg.o
diff --git a/drivers/gpu/drm/amd/display/dc/dcn31/dcn31_resource.c b/drivers/gpu/drm/amd/display/dc/dcn31/dcn31_resource.c
deleted file mode 100644 (file)
index 79416cf..0000000
+++ /dev/null
@@ -1,2218 +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 "dm_services.h"
-#include "dc.h"
-
-#include "dcn31/dcn31_init.h"
-
-#include "resource.h"
-#include "include/irq_service_interface.h"
-#include "dcn31_resource.h"
-
-#include "dcn20/dcn20_resource.h"
-#include "dcn30/dcn30_resource.h"
-
-#include "dml/dcn30/dcn30_fpu.h"
-
-#include "dcn10/dcn10_ipp.h"
-#include "dcn30/dcn30_hubbub.h"
-#include "dcn31/dcn31_hubbub.h"
-#include "dcn30/dcn30_mpc.h"
-#include "dcn31/dcn31_hubp.h"
-#include "irq/dcn31/irq_service_dcn31.h"
-#include "dcn30/dcn30_dpp.h"
-#include "dcn31/dcn31_optc.h"
-#include "dcn20/dcn20_hwseq.h"
-#include "dcn30/dcn30_hwseq.h"
-#include "dce110/dce110_hwseq.h"
-#include "dcn30/dcn30_opp.h"
-#include "dcn20/dcn20_dsc.h"
-#include "dcn30/dcn30_vpg.h"
-#include "dcn30/dcn30_afmt.h"
-#include "dcn30/dcn30_dio_stream_encoder.h"
-#include "dcn31/dcn31_hpo_dp_stream_encoder.h"
-#include "dcn31/dcn31_hpo_dp_link_encoder.h"
-#include "dcn31/dcn31_apg.h"
-#include "dcn31/dcn31_dio_link_encoder.h"
-#include "dcn31/dcn31_vpg.h"
-#include "dcn31/dcn31_afmt.h"
-#include "dce/dce_clock_source.h"
-#include "dce/dce_audio.h"
-#include "dce/dce_hwseq.h"
-#include "clk_mgr.h"
-#include "virtual/virtual_stream_encoder.h"
-#include "dce110/dce110_resource.h"
-#include "dml/display_mode_vba.h"
-#include "dml/dcn31/dcn31_fpu.h"
-#include "dcn31/dcn31_dccg.h"
-#include "dcn10/dcn10_resource.h"
-#include "dcn31_panel_cntl.h"
-
-#include "dcn30/dcn30_dwb.h"
-#include "dcn30/dcn30_mmhubbub.h"
-
-// TODO: change include headers /amd/include/asic_reg after upstream
-#include "yellow_carp_offset.h"
-#include "dcn/dcn_3_1_2_offset.h"
-#include "dcn/dcn_3_1_2_sh_mask.h"
-#include "nbio/nbio_7_2_0_offset.h"
-#include "dpcs/dpcs_4_2_0_offset.h"
-#include "dpcs/dpcs_4_2_0_sh_mask.h"
-#include "mmhub/mmhub_2_3_0_offset.h"
-#include "mmhub/mmhub_2_3_0_sh_mask.h"
-
-
-#define regDCHUBBUB_DEBUG_CTRL_0                                              0x04d6
-#define regDCHUBBUB_DEBUG_CTRL_0_BASE_IDX                                     2
-#define DCHUBBUB_DEBUG_CTRL_0__DET_DEPTH__SHIFT                               0x10
-#define DCHUBBUB_DEBUG_CTRL_0__DET_DEPTH_MASK                                 0x01FF0000L
-
-#include "reg_helper.h"
-#include "dce/dmub_abm.h"
-#include "dce/dmub_psr.h"
-#include "dce/dce_aux.h"
-#include "dce/dce_i2c.h"
-#include "dce/dmub_replay.h"
-
-#include "dml/dcn30/display_mode_vba_30.h"
-#include "vm_helper.h"
-#include "dcn20/dcn20_vmid.h"
-
-#include "link_enc_cfg.h"
-
-#define DC_LOGGER \
-       dc->ctx->logger
-#define DC_LOGGER_INIT(logger)
-
-enum dcn31_clk_src_array_id {
-       DCN31_CLK_SRC_PLL0,
-       DCN31_CLK_SRC_PLL1,
-       DCN31_CLK_SRC_PLL2,
-       DCN31_CLK_SRC_PLL3,
-       DCN31_CLK_SRC_PLL4,
-       DCN30_CLK_SRC_TOTAL
-};
-
-/* begin *********************
- * macros to expend register list macro defined in HW object header file
- */
-
-/* DCN */
-#define BASE_INNER(seg) DCN_BASE__INST0_SEG ## seg
-
-#define BASE(seg) BASE_INNER(seg)
-
-#define SR(reg_name)\
-               .reg_name = BASE(reg ## reg_name ## _BASE_IDX) +  \
-                                       reg ## reg_name
-
-#define SRI(reg_name, block, id)\
-       .reg_name = BASE(reg ## block ## id ## _ ## reg_name ## _BASE_IDX) + \
-                                       reg ## block ## id ## _ ## reg_name
-
-#define SRI2(reg_name, block, id)\
-       .reg_name = BASE(reg ## reg_name ## _BASE_IDX) + \
-                                       reg ## reg_name
-
-#define SRIR(var_name, reg_name, block, id)\
-       .var_name = BASE(reg ## block ## id ## _ ## reg_name ## _BASE_IDX) + \
-                                       reg ## block ## id ## _ ## reg_name
-
-#define SRII(reg_name, block, id)\
-       .reg_name[id] = BASE(reg ## block ## id ## _ ## reg_name ## _BASE_IDX) + \
-                                       reg ## block ## id ## _ ## reg_name
-
-#define SRII_MPC_RMU(reg_name, block, id)\
-       .RMU##_##reg_name[id] = BASE(reg ## block ## id ## _ ## reg_name ## _BASE_IDX) + \
-                                       reg ## block ## id ## _ ## reg_name
-
-#define SRII_DWB(reg_name, temp_name, block, id)\
-       .reg_name[id] = BASE(reg ## block ## id ## _ ## temp_name ## _BASE_IDX) + \
-                                       reg ## block ## id ## _ ## temp_name
-
-#define SF_DWB2(reg_name, block, id, field_name, post_fix)     \
-       .field_name = reg_name ## __ ## field_name ## post_fix
-
-#define DCCG_SRII(reg_name, block, id)\
-       .block ## _ ## reg_name[id] = BASE(reg ## block ## id ## _ ## reg_name ## _BASE_IDX) + \
-                                       reg ## block ## id ## _ ## reg_name
-
-#define VUPDATE_SRII(reg_name, block, id)\
-       .reg_name[id] = BASE(reg ## reg_name ## _ ## block ## id ## _BASE_IDX) + \
-                                       reg ## reg_name ## _ ## block ## id
-
-/* NBIO */
-#define NBIO_BASE_INNER(seg) \
-       NBIO_BASE__INST0_SEG ## seg
-
-#define NBIO_BASE(seg) \
-       NBIO_BASE_INNER(seg)
-
-#define NBIO_SR(reg_name)\
-               .reg_name = NBIO_BASE(regBIF_BX1_ ## reg_name ## _BASE_IDX) + \
-                                       regBIF_BX1_ ## reg_name
-
-/* MMHUB */
-#define MMHUB_BASE_INNER(seg) \
-       MMHUB_BASE__INST0_SEG ## seg
-
-#define MMHUB_BASE(seg) \
-       MMHUB_BASE_INNER(seg)
-
-#define MMHUB_SR(reg_name)\
-               .reg_name = MMHUB_BASE(mm ## reg_name ## _BASE_IDX) + \
-                                       mm ## reg_name
-
-/* CLOCK */
-#define CLK_BASE_INNER(seg) \
-       CLK_BASE__INST0_SEG ## seg
-
-#define CLK_BASE(seg) \
-       CLK_BASE_INNER(seg)
-
-#define CLK_SRI(reg_name, block, inst)\
-       .reg_name = CLK_BASE(reg ## block ## _ ## inst ## _ ## reg_name ## _BASE_IDX) + \
-                                       reg ## block ## _ ## inst ## _ ## reg_name
-
-
-static const struct bios_registers bios_regs = {
-               NBIO_SR(BIOS_SCRATCH_3),
-               NBIO_SR(BIOS_SCRATCH_6)
-};
-
-#define clk_src_regs(index, pllid)\
-[index] = {\
-       CS_COMMON_REG_LIST_DCN3_0(index, pllid),\
-}
-
-static const struct dce110_clk_src_regs clk_src_regs[] = {
-       clk_src_regs(0, A),
-       clk_src_regs(1, B),
-       clk_src_regs(2, C),
-       clk_src_regs(3, D),
-       clk_src_regs(4, E)
-};
-/*pll_id being rempped in dmub, in driver it is logical instance*/
-static const struct dce110_clk_src_regs clk_src_regs_b0[] = {
-       clk_src_regs(0, A),
-       clk_src_regs(1, B),
-       clk_src_regs(2, F),
-       clk_src_regs(3, G),
-       clk_src_regs(4, E)
-};
-
-static const struct dce110_clk_src_shift cs_shift = {
-               CS_COMMON_MASK_SH_LIST_DCN2_0(__SHIFT)
-};
-
-static const struct dce110_clk_src_mask cs_mask = {
-               CS_COMMON_MASK_SH_LIST_DCN2_0(_MASK)
-};
-
-#define abm_regs(id)\
-[id] = {\
-               ABM_DCN302_REG_LIST(id)\
-}
-
-static const struct dce_abm_registers abm_regs[] = {
-               abm_regs(0),
-               abm_regs(1),
-               abm_regs(2),
-               abm_regs(3),
-};
-
-static const struct dce_abm_shift abm_shift = {
-               ABM_MASK_SH_LIST_DCN30(__SHIFT)
-};
-
-static const struct dce_abm_mask abm_mask = {
-               ABM_MASK_SH_LIST_DCN30(_MASK)
-};
-
-#define audio_regs(id)\
-[id] = {\
-               AUD_COMMON_REG_LIST(id)\
-}
-
-static const struct dce_audio_registers audio_regs[] = {
-       audio_regs(0),
-       audio_regs(1),
-       audio_regs(2),
-       audio_regs(3),
-       audio_regs(4),
-       audio_regs(5),
-       audio_regs(6)
-};
-
-#define DCE120_AUD_COMMON_MASK_SH_LIST(mask_sh)\
-               SF(AZF0ENDPOINT0_AZALIA_F0_CODEC_ENDPOINT_INDEX, AZALIA_ENDPOINT_REG_INDEX, mask_sh),\
-               SF(AZF0ENDPOINT0_AZALIA_F0_CODEC_ENDPOINT_DATA, AZALIA_ENDPOINT_REG_DATA, mask_sh),\
-               AUD_COMMON_MASK_SH_LIST_BASE(mask_sh)
-
-static const struct dce_audio_shift audio_shift = {
-               DCE120_AUD_COMMON_MASK_SH_LIST(__SHIFT)
-};
-
-static const struct dce_audio_mask audio_mask = {
-               DCE120_AUD_COMMON_MASK_SH_LIST(_MASK)
-};
-
-#define vpg_regs(id)\
-[id] = {\
-       VPG_DCN31_REG_LIST(id)\
-}
-
-static const struct dcn31_vpg_registers vpg_regs[] = {
-       vpg_regs(0),
-       vpg_regs(1),
-       vpg_regs(2),
-       vpg_regs(3),
-       vpg_regs(4),
-       vpg_regs(5),
-       vpg_regs(6),
-       vpg_regs(7),
-       vpg_regs(8),
-       vpg_regs(9),
-};
-
-static const struct dcn31_vpg_shift vpg_shift = {
-       DCN31_VPG_MASK_SH_LIST(__SHIFT)
-};
-
-static const struct dcn31_vpg_mask vpg_mask = {
-       DCN31_VPG_MASK_SH_LIST(_MASK)
-};
-
-#define afmt_regs(id)\
-[id] = {\
-       AFMT_DCN31_REG_LIST(id)\
-}
-
-static const struct dcn31_afmt_registers afmt_regs[] = {
-       afmt_regs(0),
-       afmt_regs(1),
-       afmt_regs(2),
-       afmt_regs(3),
-       afmt_regs(4),
-       afmt_regs(5)
-};
-
-static const struct dcn31_afmt_shift afmt_shift = {
-       DCN31_AFMT_MASK_SH_LIST(__SHIFT)
-};
-
-static const struct dcn31_afmt_mask afmt_mask = {
-       DCN31_AFMT_MASK_SH_LIST(_MASK)
-};
-
-#define apg_regs(id)\
-[id] = {\
-       APG_DCN31_REG_LIST(id)\
-}
-
-static const struct dcn31_apg_registers apg_regs[] = {
-       apg_regs(0),
-       apg_regs(1),
-       apg_regs(2),
-       apg_regs(3)
-};
-
-static const struct dcn31_apg_shift apg_shift = {
-       DCN31_APG_MASK_SH_LIST(__SHIFT)
-};
-
-static const struct dcn31_apg_mask apg_mask = {
-               DCN31_APG_MASK_SH_LIST(_MASK)
-};
-
-#define stream_enc_regs(id)\
-[id] = {\
-       SE_DCN3_REG_LIST(id)\
-}
-
-/* Some encoders won't be initialized here - but they're logical, not physical. */
-static const struct dcn10_stream_enc_registers stream_enc_regs[ENGINE_ID_COUNT] = {
-       stream_enc_regs(0),
-       stream_enc_regs(1),
-       stream_enc_regs(2),
-       stream_enc_regs(3),
-       stream_enc_regs(4)
-};
-
-static const struct dcn10_stream_encoder_shift se_shift = {
-               SE_COMMON_MASK_SH_LIST_DCN30(__SHIFT)
-};
-
-static const struct dcn10_stream_encoder_mask se_mask = {
-               SE_COMMON_MASK_SH_LIST_DCN30(_MASK)
-};
-
-
-#define aux_regs(id)\
-[id] = {\
-       DCN2_AUX_REG_LIST(id)\
-}
-
-static const struct dcn10_link_enc_aux_registers link_enc_aux_regs[] = {
-               aux_regs(0),
-               aux_regs(1),
-               aux_regs(2),
-               aux_regs(3),
-               aux_regs(4)
-};
-
-#define hpd_regs(id)\
-[id] = {\
-       HPD_REG_LIST(id)\
-}
-
-static const struct dcn10_link_enc_hpd_registers link_enc_hpd_regs[] = {
-               hpd_regs(0),
-               hpd_regs(1),
-               hpd_regs(2),
-               hpd_regs(3),
-               hpd_regs(4)
-};
-
-#define link_regs(id, phyid)\
-[id] = {\
-       LE_DCN31_REG_LIST(id), \
-       UNIPHY_DCN2_REG_LIST(phyid), \
-       DPCS_DCN31_REG_LIST(id), \
-}
-
-static const struct dce110_aux_registers_shift aux_shift = {
-       DCN_AUX_MASK_SH_LIST(__SHIFT)
-};
-
-static const struct dce110_aux_registers_mask aux_mask = {
-       DCN_AUX_MASK_SH_LIST(_MASK)
-};
-
-static const struct dcn10_link_enc_registers link_enc_regs[] = {
-       link_regs(0, A),
-       link_regs(1, B),
-       link_regs(2, C),
-       link_regs(3, D),
-       link_regs(4, E)
-};
-
-static const struct dcn10_link_enc_shift le_shift = {
-       LINK_ENCODER_MASK_SH_LIST_DCN31(__SHIFT), \
-       DPCS_DCN31_MASK_SH_LIST(__SHIFT)
-};
-
-static const struct dcn10_link_enc_mask le_mask = {
-       LINK_ENCODER_MASK_SH_LIST_DCN31(_MASK), \
-       DPCS_DCN31_MASK_SH_LIST(_MASK)
-};
-
-#define hpo_dp_stream_encoder_reg_list(id)\
-[id] = {\
-       DCN3_1_HPO_DP_STREAM_ENC_REG_LIST(id)\
-}
-
-static const struct dcn31_hpo_dp_stream_encoder_registers hpo_dp_stream_enc_regs[] = {
-       hpo_dp_stream_encoder_reg_list(0),
-       hpo_dp_stream_encoder_reg_list(1),
-       hpo_dp_stream_encoder_reg_list(2),
-       hpo_dp_stream_encoder_reg_list(3),
-};
-
-static const struct dcn31_hpo_dp_stream_encoder_shift hpo_dp_se_shift = {
-       DCN3_1_HPO_DP_STREAM_ENC_MASK_SH_LIST(__SHIFT)
-};
-
-static const struct dcn31_hpo_dp_stream_encoder_mask hpo_dp_se_mask = {
-       DCN3_1_HPO_DP_STREAM_ENC_MASK_SH_LIST(_MASK)
-};
-
-#define hpo_dp_link_encoder_reg_list(id)\
-[id] = {\
-       DCN3_1_HPO_DP_LINK_ENC_REG_LIST(id),\
-       DCN3_1_RDPCSTX_REG_LIST(0),\
-       DCN3_1_RDPCSTX_REG_LIST(1),\
-       DCN3_1_RDPCSTX_REG_LIST(2),\
-       DCN3_1_RDPCSTX_REG_LIST(3),\
-       DCN3_1_RDPCSTX_REG_LIST(4)\
-}
-
-static const struct dcn31_hpo_dp_link_encoder_registers hpo_dp_link_enc_regs[] = {
-       hpo_dp_link_encoder_reg_list(0),
-       hpo_dp_link_encoder_reg_list(1),
-};
-
-static const struct dcn31_hpo_dp_link_encoder_shift hpo_dp_le_shift = {
-       DCN3_1_HPO_DP_LINK_ENC_MASK_SH_LIST(__SHIFT)
-};
-
-static const struct dcn31_hpo_dp_link_encoder_mask hpo_dp_le_mask = {
-       DCN3_1_HPO_DP_LINK_ENC_MASK_SH_LIST(_MASK)
-};
-
-#define dpp_regs(id)\
-[id] = {\
-       DPP_REG_LIST_DCN30(id),\
-}
-
-static const struct dcn3_dpp_registers dpp_regs[] = {
-       dpp_regs(0),
-       dpp_regs(1),
-       dpp_regs(2),
-       dpp_regs(3)
-};
-
-static const struct dcn3_dpp_shift tf_shift = {
-               DPP_REG_LIST_SH_MASK_DCN30(__SHIFT)
-};
-
-static const struct dcn3_dpp_mask tf_mask = {
-               DPP_REG_LIST_SH_MASK_DCN30(_MASK)
-};
-
-#define opp_regs(id)\
-[id] = {\
-       OPP_REG_LIST_DCN30(id),\
-}
-
-static const struct dcn20_opp_registers opp_regs[] = {
-       opp_regs(0),
-       opp_regs(1),
-       opp_regs(2),
-       opp_regs(3)
-};
-
-static const struct dcn20_opp_shift opp_shift = {
-       OPP_MASK_SH_LIST_DCN20(__SHIFT)
-};
-
-static const struct dcn20_opp_mask opp_mask = {
-       OPP_MASK_SH_LIST_DCN20(_MASK)
-};
-
-#define aux_engine_regs(id)\
-[id] = {\
-       AUX_COMMON_REG_LIST0(id), \
-       .AUXN_IMPCAL = 0, \
-       .AUXP_IMPCAL = 0, \
-       .AUX_RESET_MASK = DP_AUX0_AUX_CONTROL__AUX_RESET_MASK, \
-}
-
-static const struct dce110_aux_registers aux_engine_regs[] = {
-               aux_engine_regs(0),
-               aux_engine_regs(1),
-               aux_engine_regs(2),
-               aux_engine_regs(3),
-               aux_engine_regs(4)
-};
-
-#define dwbc_regs_dcn3(id)\
-[id] = {\
-       DWBC_COMMON_REG_LIST_DCN30(id),\
-}
-
-static const struct dcn30_dwbc_registers dwbc30_regs[] = {
-       dwbc_regs_dcn3(0),
-};
-
-static const struct dcn30_dwbc_shift dwbc30_shift = {
-       DWBC_COMMON_MASK_SH_LIST_DCN30(__SHIFT)
-};
-
-static const struct dcn30_dwbc_mask dwbc30_mask = {
-       DWBC_COMMON_MASK_SH_LIST_DCN30(_MASK)
-};
-
-#define mcif_wb_regs_dcn3(id)\
-[id] = {\
-       MCIF_WB_COMMON_REG_LIST_DCN30(id),\
-}
-
-static const struct dcn30_mmhubbub_registers mcif_wb30_regs[] = {
-       mcif_wb_regs_dcn3(0)
-};
-
-static const struct dcn30_mmhubbub_shift mcif_wb30_shift = {
-       MCIF_WB_COMMON_MASK_SH_LIST_DCN30(__SHIFT)
-};
-
-static const struct dcn30_mmhubbub_mask mcif_wb30_mask = {
-       MCIF_WB_COMMON_MASK_SH_LIST_DCN30(_MASK)
-};
-
-#define dsc_regsDCN20(id)\
-[id] = {\
-       DSC_REG_LIST_DCN20(id)\
-}
-
-static const struct dcn20_dsc_registers dsc_regs[] = {
-       dsc_regsDCN20(0),
-       dsc_regsDCN20(1),
-       dsc_regsDCN20(2)
-};
-
-static const struct dcn20_dsc_shift dsc_shift = {
-       DSC_REG_LIST_SH_MASK_DCN20(__SHIFT)
-};
-
-static const struct dcn20_dsc_mask dsc_mask = {
-       DSC_REG_LIST_SH_MASK_DCN20(_MASK)
-};
-
-static const struct dcn30_mpc_registers mpc_regs = {
-               MPC_REG_LIST_DCN3_0(0),
-               MPC_REG_LIST_DCN3_0(1),
-               MPC_REG_LIST_DCN3_0(2),
-               MPC_REG_LIST_DCN3_0(3),
-               MPC_OUT_MUX_REG_LIST_DCN3_0(0),
-               MPC_OUT_MUX_REG_LIST_DCN3_0(1),
-               MPC_OUT_MUX_REG_LIST_DCN3_0(2),
-               MPC_OUT_MUX_REG_LIST_DCN3_0(3),
-               MPC_RMU_GLOBAL_REG_LIST_DCN3AG,
-               MPC_RMU_REG_LIST_DCN3AG(0),
-               MPC_RMU_REG_LIST_DCN3AG(1),
-               //MPC_RMU_REG_LIST_DCN3AG(2),
-               MPC_DWB_MUX_REG_LIST_DCN3_0(0),
-};
-
-static const struct dcn30_mpc_shift mpc_shift = {
-       MPC_COMMON_MASK_SH_LIST_DCN30(__SHIFT)
-};
-
-static const struct dcn30_mpc_mask mpc_mask = {
-       MPC_COMMON_MASK_SH_LIST_DCN30(_MASK)
-};
-
-#define optc_regs(id)\
-[id] = {OPTC_COMMON_REG_LIST_DCN3_1(id)}
-
-static const struct dcn_optc_registers optc_regs[] = {
-       optc_regs(0),
-       optc_regs(1),
-       optc_regs(2),
-       optc_regs(3)
-};
-
-static const struct dcn_optc_shift optc_shift = {
-       OPTC_COMMON_MASK_SH_LIST_DCN3_1(__SHIFT)
-};
-
-static const struct dcn_optc_mask optc_mask = {
-       OPTC_COMMON_MASK_SH_LIST_DCN3_1(_MASK)
-};
-
-#define hubp_regs(id)\
-[id] = {\
-       HUBP_REG_LIST_DCN30(id)\
-}
-
-static const struct dcn_hubp2_registers hubp_regs[] = {
-               hubp_regs(0),
-               hubp_regs(1),
-               hubp_regs(2),
-               hubp_regs(3)
-};
-
-
-static const struct dcn_hubp2_shift hubp_shift = {
-               HUBP_MASK_SH_LIST_DCN31(__SHIFT)
-};
-
-static const struct dcn_hubp2_mask hubp_mask = {
-               HUBP_MASK_SH_LIST_DCN31(_MASK)
-};
-static const struct dcn_hubbub_registers hubbub_reg = {
-               HUBBUB_REG_LIST_DCN31(0)
-};
-
-static const struct dcn_hubbub_shift hubbub_shift = {
-               HUBBUB_MASK_SH_LIST_DCN31(__SHIFT)
-};
-
-static const struct dcn_hubbub_mask hubbub_mask = {
-               HUBBUB_MASK_SH_LIST_DCN31(_MASK)
-};
-
-static const struct dccg_registers dccg_regs = {
-               DCCG_REG_LIST_DCN31()
-};
-
-static const struct dccg_shift dccg_shift = {
-               DCCG_MASK_SH_LIST_DCN31(__SHIFT)
-};
-
-static const struct dccg_mask dccg_mask = {
-               DCCG_MASK_SH_LIST_DCN31(_MASK)
-};
-
-
-#define SRII2(reg_name_pre, reg_name_post, id)\
-       .reg_name_pre ## _ ##  reg_name_post[id] = BASE(reg ## reg_name_pre \
-                       ## id ## _ ## reg_name_post ## _BASE_IDX) + \
-                       reg ## reg_name_pre ## id ## _ ## reg_name_post
-
-
-#define HWSEQ_DCN31_REG_LIST()\
-       SR(DCHUBBUB_GLOBAL_TIMER_CNTL), \
-       SR(DCHUBBUB_ARB_HOSTVM_CNTL), \
-       SR(DIO_MEM_PWR_CTRL), \
-       SR(ODM_MEM_PWR_CTRL3), \
-       SR(DMU_MEM_PWR_CNTL), \
-       SR(MMHUBBUB_MEM_PWR_CNTL), \
-       SR(DCCG_GATE_DISABLE_CNTL), \
-       SR(DCCG_GATE_DISABLE_CNTL2), \
-       SR(DCFCLK_CNTL),\
-       SR(DC_MEM_GLOBAL_PWR_REQ_CNTL), \
-       SRII(PIXEL_RATE_CNTL, OTG, 0), \
-       SRII(PIXEL_RATE_CNTL, OTG, 1),\
-       SRII(PIXEL_RATE_CNTL, OTG, 2),\
-       SRII(PIXEL_RATE_CNTL, OTG, 3),\
-       SRII(PHYPLL_PIXEL_RATE_CNTL, OTG, 0),\
-       SRII(PHYPLL_PIXEL_RATE_CNTL, OTG, 1),\
-       SRII(PHYPLL_PIXEL_RATE_CNTL, OTG, 2),\
-       SRII(PHYPLL_PIXEL_RATE_CNTL, OTG, 3),\
-       SR(MICROSECOND_TIME_BASE_DIV), \
-       SR(MILLISECOND_TIME_BASE_DIV), \
-       SR(DISPCLK_FREQ_CHANGE_CNTL), \
-       SR(RBBMIF_TIMEOUT_DIS), \
-       SR(RBBMIF_TIMEOUT_DIS_2), \
-       SR(DCHUBBUB_CRC_CTRL), \
-       SR(DPP_TOP0_DPP_CRC_CTRL), \
-       SR(DPP_TOP0_DPP_CRC_VAL_B_A), \
-       SR(DPP_TOP0_DPP_CRC_VAL_R_G), \
-       SR(MPC_CRC_CTRL), \
-       SR(MPC_CRC_RESULT_GB), \
-       SR(MPC_CRC_RESULT_C), \
-       SR(MPC_CRC_RESULT_AR), \
-       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(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(D1VGA_CONTROL), \
-       SR(D2VGA_CONTROL), \
-       SR(D3VGA_CONTROL), \
-       SR(D4VGA_CONTROL), \
-       SR(D5VGA_CONTROL), \
-       SR(D6VGA_CONTROL), \
-       SR(DC_IP_REQUEST_CNTL), \
-       SR(AZALIA_AUDIO_DTO), \
-       SR(AZALIA_CONTROLLER_CLOCK_GATING), \
-       SR(HPO_TOP_HW_CONTROL)
-
-static const struct dce_hwseq_registers hwseq_reg = {
-               HWSEQ_DCN31_REG_LIST()
-};
-
-#define HWSEQ_DCN31_MASK_SH_LIST(mask_sh)\
-       HWSEQ_DCN_MASK_SH_LIST(mask_sh), \
-       HWS_SF(, DCHUBBUB_GLOBAL_TIMER_CNTL, DCHUBBUB_GLOBAL_TIMER_REFDIV, mask_sh), \
-       HWS_SF(, DCHUBBUB_ARB_HOSTVM_CNTL, DISABLE_HOSTVM_FORCE_ALLOW_PSTATE, mask_sh), \
-       HWS_SF(, DOMAIN0_PG_CONFIG, DOMAIN_POWER_FORCEON, mask_sh), \
-       HWS_SF(, DOMAIN0_PG_CONFIG, DOMAIN_POWER_GATE, mask_sh), \
-       HWS_SF(, DOMAIN1_PG_CONFIG, DOMAIN_POWER_FORCEON, mask_sh), \
-       HWS_SF(, DOMAIN1_PG_CONFIG, DOMAIN_POWER_GATE, mask_sh), \
-       HWS_SF(, DOMAIN2_PG_CONFIG, DOMAIN_POWER_FORCEON, mask_sh), \
-       HWS_SF(, DOMAIN2_PG_CONFIG, DOMAIN_POWER_GATE, mask_sh), \
-       HWS_SF(, DOMAIN3_PG_CONFIG, DOMAIN_POWER_FORCEON, mask_sh), \
-       HWS_SF(, DOMAIN3_PG_CONFIG, DOMAIN_POWER_GATE, mask_sh), \
-       HWS_SF(, DOMAIN16_PG_CONFIG, DOMAIN_POWER_FORCEON, mask_sh), \
-       HWS_SF(, DOMAIN16_PG_CONFIG, DOMAIN_POWER_GATE, mask_sh), \
-       HWS_SF(, DOMAIN17_PG_CONFIG, DOMAIN_POWER_FORCEON, mask_sh), \
-       HWS_SF(, DOMAIN17_PG_CONFIG, DOMAIN_POWER_GATE, mask_sh), \
-       HWS_SF(, DOMAIN18_PG_CONFIG, DOMAIN_POWER_FORCEON, mask_sh), \
-       HWS_SF(, DOMAIN18_PG_CONFIG, DOMAIN_POWER_GATE, mask_sh), \
-       HWS_SF(, DOMAIN0_PG_STATUS, DOMAIN_PGFSM_PWR_STATUS, mask_sh), \
-       HWS_SF(, DOMAIN1_PG_STATUS, DOMAIN_PGFSM_PWR_STATUS, mask_sh), \
-       HWS_SF(, DOMAIN2_PG_STATUS, DOMAIN_PGFSM_PWR_STATUS, mask_sh), \
-       HWS_SF(, DOMAIN3_PG_STATUS, DOMAIN_PGFSM_PWR_STATUS, mask_sh), \
-       HWS_SF(, DOMAIN16_PG_STATUS, DOMAIN_PGFSM_PWR_STATUS, mask_sh), \
-       HWS_SF(, DOMAIN17_PG_STATUS, DOMAIN_PGFSM_PWR_STATUS, mask_sh), \
-       HWS_SF(, DOMAIN18_PG_STATUS, DOMAIN_PGFSM_PWR_STATUS, mask_sh), \
-       HWS_SF(, DC_IP_REQUEST_CNTL, IP_REQUEST_EN, mask_sh), \
-       HWS_SF(, AZALIA_AUDIO_DTO, AZALIA_AUDIO_DTO_MODULE, mask_sh), \
-       HWS_SF(, HPO_TOP_CLOCK_CONTROL, HPO_HDMISTREAMCLK_G_GATE_DIS, mask_sh), \
-       HWS_SF(, DMU_MEM_PWR_CNTL, DMCU_ERAM_MEM_PWR_FORCE, mask_sh), \
-       HWS_SF(, ODM_MEM_PWR_CTRL3, ODM_MEM_UNASSIGNED_PWR_MODE, mask_sh), \
-       HWS_SF(, ODM_MEM_PWR_CTRL3, ODM_MEM_VBLANK_PWR_MODE, mask_sh), \
-       HWS_SF(, MMHUBBUB_MEM_PWR_CNTL, VGA_MEM_PWR_FORCE, mask_sh), \
-       HWS_SF(, DIO_MEM_PWR_CTRL, I2C_LIGHT_SLEEP_FORCE, mask_sh), \
-       HWS_SF(, HPO_TOP_HW_CONTROL, HPO_IO_EN, mask_sh)
-
-static const struct dce_hwseq_shift hwseq_shift = {
-               HWSEQ_DCN31_MASK_SH_LIST(__SHIFT)
-};
-
-static const struct dce_hwseq_mask hwseq_mask = {
-               HWSEQ_DCN31_MASK_SH_LIST(_MASK)
-};
-#define vmid_regs(id)\
-[id] = {\
-               DCN20_VMID_REG_LIST(id)\
-}
-
-static const struct dcn_vmid_registers vmid_regs[] = {
-       vmid_regs(0),
-       vmid_regs(1),
-       vmid_regs(2),
-       vmid_regs(3),
-       vmid_regs(4),
-       vmid_regs(5),
-       vmid_regs(6),
-       vmid_regs(7),
-       vmid_regs(8),
-       vmid_regs(9),
-       vmid_regs(10),
-       vmid_regs(11),
-       vmid_regs(12),
-       vmid_regs(13),
-       vmid_regs(14),
-       vmid_regs(15)
-};
-
-static const struct dcn20_vmid_shift vmid_shifts = {
-               DCN20_VMID_MASK_SH_LIST(__SHIFT)
-};
-
-static const struct dcn20_vmid_mask vmid_masks = {
-               DCN20_VMID_MASK_SH_LIST(_MASK)
-};
-
-static const struct resource_caps res_cap_dcn31 = {
-       .num_timing_generator = 4,
-       .num_opp = 4,
-       .num_video_plane = 4,
-       .num_audio = 5,
-       .num_stream_encoder = 5,
-       .num_dig_link_enc = 5,
-       .num_hpo_dp_stream_encoder = 4,
-       .num_hpo_dp_link_encoder = 2,
-       .num_pll = 5,
-       .num_dwb = 1,
-       .num_ddc = 5,
-       .num_vmid = 16,
-       .num_mpc_3dlut = 2,
-       .num_dsc = 3,
-};
-
-static const struct dc_plane_cap plane_cap = {
-       .type = DC_PLANE_TYPE_DCN_UNIVERSAL,
-       .per_pixel_alpha = true,
-
-       .pixel_format_support = {
-                       .argb8888 = true,
-                       .nv12 = true,
-                       .fp16 = true,
-                       .p010 = true,
-                       .ayuv = false,
-       },
-
-       .max_upscale_factor = {
-                       .argb8888 = 16000,
-                       .nv12 = 16000,
-                       .fp16 = 16000
-       },
-
-       // 6:1 downscaling ratio: 1000/6 = 166.666
-       .max_downscale_factor = {
-                       .argb8888 = 167,
-                       .nv12 = 167,
-                       .fp16 = 167
-       },
-       64,
-       64
-};
-
-static const struct dc_debug_options debug_defaults_drv = {
-       .disable_dmcu = true,
-       .force_abm_enable = false,
-       .timing_trace = false,
-       .clock_trace = true,
-       .disable_pplib_clock_request = false,
-       .pipe_split_policy = MPC_SPLIT_DYNAMIC,
-       .force_single_disp_pipe_split = false,
-       .disable_dcc = DCC_ENABLE,
-       .vsr_support = true,
-       .performance_trace = false,
-       .max_downscale_src_width = 4096,/*upto true 4K*/
-       .disable_pplib_wm_range = false,
-       .scl_reset_length10 = true,
-       .sanity_checks = true,
-       .underflow_assert_delay_us = 0xFFFFFFFF,
-       .dwb_fi_phase = -1, // -1 = disable,
-       .dmub_command_table = true,
-       .pstate_enabled = true,
-       .use_max_lb = true,
-       .enable_mem_low_power = {
-               .bits = {
-                       .vga = true,
-                       .i2c = true,
-                       .dmcu = false, // This is previously known to cause hang on S3 cycles if enabled
-                       .dscl = true,
-                       .cm = true,
-                       .mpc = true,
-                       .optc = true,
-                       .vpg = true,
-                       .afmt = true,
-               }
-       },
-       .disable_z10 = true,
-       .enable_legacy_fast_update = true,
-       .enable_z9_disable_interface = true, /* Allow support for the PMFW interface for disable Z9*/
-       .dml_hostvm_override = DML_HOSTVM_OVERRIDE_FALSE,
-       .using_dml2 = false,
-};
-
-static const struct dc_panel_config panel_config_defaults = {
-       .psr = {
-               .disable_psr = false,
-               .disallow_psrsu = false,
-               .disallow_replay = false,
-       },
-       .ilr = {
-               .optimize_edp_link_rate = true,
-       },
-};
-
-static void dcn31_dpp_destroy(struct dpp **dpp)
-{
-       kfree(TO_DCN20_DPP(*dpp));
-       *dpp = NULL;
-}
-
-static struct dpp *dcn31_dpp_create(
-       struct dc_context *ctx,
-       uint32_t inst)
-{
-       struct dcn3_dpp *dpp =
-               kzalloc(sizeof(struct dcn3_dpp), GFP_KERNEL);
-
-       if (!dpp)
-               return NULL;
-
-       if (dpp3_construct(dpp, ctx, inst,
-                       &dpp_regs[inst], &tf_shift, &tf_mask))
-               return &dpp->base;
-
-       BREAK_TO_DEBUGGER();
-       kfree(dpp);
-       return NULL;
-}
-
-static struct output_pixel_processor *dcn31_opp_create(
-       struct dc_context *ctx, uint32_t inst)
-{
-       struct dcn20_opp *opp =
-               kzalloc(sizeof(struct dcn20_opp), GFP_KERNEL);
-
-       if (!opp) {
-               BREAK_TO_DEBUGGER();
-               return NULL;
-       }
-
-       dcn20_opp_construct(opp, ctx, inst,
-                       &opp_regs[inst], &opp_shift, &opp_mask);
-       return &opp->base;
-}
-
-static struct dce_aux *dcn31_aux_engine_create(
-       struct dc_context *ctx,
-       uint32_t inst)
-{
-       struct aux_engine_dce110 *aux_engine =
-               kzalloc(sizeof(struct aux_engine_dce110), GFP_KERNEL);
-
-       if (!aux_engine)
-               return NULL;
-
-       dce110_aux_engine_construct(aux_engine, ctx, inst,
-                                   SW_AUX_TIMEOUT_PERIOD_MULTIPLIER * AUX_TIMEOUT_PERIOD,
-                                   &aux_engine_regs[inst],
-                                       &aux_mask,
-                                       &aux_shift,
-                                       ctx->dc->caps.extended_aux_timeout_support);
-
-       return &aux_engine->base;
-}
-#define i2c_inst_regs(id) { I2C_HW_ENGINE_COMMON_REG_LIST_DCN30(id) }
-
-static const struct dce_i2c_registers i2c_hw_regs[] = {
-               i2c_inst_regs(1),
-               i2c_inst_regs(2),
-               i2c_inst_regs(3),
-               i2c_inst_regs(4),
-               i2c_inst_regs(5),
-};
-
-static const struct dce_i2c_shift i2c_shifts = {
-               I2C_COMMON_MASK_SH_LIST_DCN30(__SHIFT)
-};
-
-static const struct dce_i2c_mask i2c_masks = {
-               I2C_COMMON_MASK_SH_LIST_DCN30(_MASK)
-};
-
-static struct dce_i2c_hw *dcn31_i2c_hw_create(
-       struct dc_context *ctx,
-       uint32_t inst)
-{
-       struct dce_i2c_hw *dce_i2c_hw =
-               kzalloc(sizeof(struct dce_i2c_hw), GFP_KERNEL);
-
-       if (!dce_i2c_hw)
-               return NULL;
-
-       dcn2_i2c_hw_construct(dce_i2c_hw, ctx, inst,
-                                   &i2c_hw_regs[inst], &i2c_shifts, &i2c_masks);
-
-       return dce_i2c_hw;
-}
-static struct mpc *dcn31_mpc_create(
-               struct dc_context *ctx,
-               int num_mpcc,
-               int num_rmu)
-{
-       struct dcn30_mpc *mpc30 = kzalloc(sizeof(struct dcn30_mpc),
-                                         GFP_KERNEL);
-
-       if (!mpc30)
-               return NULL;
-
-       dcn30_mpc_construct(mpc30, ctx,
-                       &mpc_regs,
-                       &mpc_shift,
-                       &mpc_mask,
-                       num_mpcc,
-                       num_rmu);
-
-       return &mpc30->base;
-}
-
-static struct hubbub *dcn31_hubbub_create(struct dc_context *ctx)
-{
-       int i;
-
-       struct dcn20_hubbub *hubbub3 = kzalloc(sizeof(struct dcn20_hubbub),
-                                         GFP_KERNEL);
-
-       if (!hubbub3)
-               return NULL;
-
-       hubbub31_construct(hubbub3, ctx,
-                       &hubbub_reg,
-                       &hubbub_shift,
-                       &hubbub_mask,
-                       dcn3_1_ip.det_buffer_size_kbytes,
-                       dcn3_1_ip.pixel_chunk_size_kbytes,
-                       dcn3_1_ip.config_return_buffer_size_in_kbytes);
-
-
-       for (i = 0; i < res_cap_dcn31.num_vmid; i++) {
-               struct dcn20_vmid *vmid = &hubbub3->vmid[i];
-
-               vmid->ctx = ctx;
-
-               vmid->regs = &vmid_regs[i];
-               vmid->shifts = &vmid_shifts;
-               vmid->masks = &vmid_masks;
-       }
-
-       return &hubbub3->base;
-}
-
-static struct timing_generator *dcn31_timing_generator_create(
-               struct dc_context *ctx,
-               uint32_t instance)
-{
-       struct optc *tgn10 =
-               kzalloc(sizeof(struct optc), GFP_KERNEL);
-
-       if (!tgn10)
-               return NULL;
-
-       tgn10->base.inst = instance;
-       tgn10->base.ctx = ctx;
-
-       tgn10->tg_regs = &optc_regs[instance];
-       tgn10->tg_shift = &optc_shift;
-       tgn10->tg_mask = &optc_mask;
-
-       dcn31_timing_generator_init(tgn10);
-
-       return &tgn10->base;
-}
-
-static const struct encoder_feature_support link_enc_feature = {
-               .max_hdmi_deep_color = COLOR_DEPTH_121212,
-               .max_hdmi_pixel_clock = 600000,
-               .hdmi_ycbcr420_supported = true,
-               .dp_ycbcr420_supported = true,
-               .fec_supported = true,
-               .flags.bits.IS_HBR2_CAPABLE = true,
-               .flags.bits.IS_HBR3_CAPABLE = true,
-               .flags.bits.IS_TPS3_CAPABLE = true,
-               .flags.bits.IS_TPS4_CAPABLE = true
-};
-
-static struct link_encoder *dcn31_link_encoder_create(
-       struct dc_context *ctx,
-       const struct encoder_init_data *enc_init_data)
-{
-       struct dcn20_link_encoder *enc20 =
-               kzalloc(sizeof(struct dcn20_link_encoder), GFP_KERNEL);
-
-       if (!enc20)
-               return NULL;
-
-       dcn31_link_encoder_construct(enc20,
-                       enc_init_data,
-                       &link_enc_feature,
-                       &link_enc_regs[enc_init_data->transmitter],
-                       &link_enc_aux_regs[enc_init_data->channel - 1],
-                       &link_enc_hpd_regs[enc_init_data->hpd_source],
-                       &le_shift,
-                       &le_mask);
-
-       return &enc20->enc10.base;
-}
-
-/* Create a minimal link encoder object not associated with a particular
- * physical connector.
- * resource_funcs.link_enc_create_minimal
- */
-static struct link_encoder *dcn31_link_enc_create_minimal(
-               struct dc_context *ctx, enum engine_id eng_id)
-{
-       struct dcn20_link_encoder *enc20;
-
-       if ((eng_id - ENGINE_ID_DIGA) > ctx->dc->res_pool->res_cap->num_dig_link_enc)
-               return NULL;
-
-       enc20 = kzalloc(sizeof(struct dcn20_link_encoder), GFP_KERNEL);
-       if (!enc20)
-               return NULL;
-
-       dcn31_link_encoder_construct_minimal(
-                       enc20,
-                       ctx,
-                       &link_enc_feature,
-                       &link_enc_regs[eng_id - ENGINE_ID_DIGA],
-                       eng_id);
-
-       return &enc20->enc10.base;
-}
-
-static struct panel_cntl *dcn31_panel_cntl_create(const struct panel_cntl_init_data *init_data)
-{
-       struct dcn31_panel_cntl *panel_cntl =
-               kzalloc(sizeof(struct dcn31_panel_cntl), GFP_KERNEL);
-
-       if (!panel_cntl)
-               return NULL;
-
-       dcn31_panel_cntl_construct(panel_cntl, init_data);
-
-       return &panel_cntl->base;
-}
-
-static void read_dce_straps(
-       struct dc_context *ctx,
-       struct resource_straps *straps)
-{
-       generic_reg_get(ctx, regDC_PINSTRAPS + BASE(regDC_PINSTRAPS_BASE_IDX),
-               FN(DC_PINSTRAPS, DC_PINSTRAPS_AUDIO), &straps->dc_pinstraps_audio);
-
-}
-
-static struct audio *dcn31_create_audio(
-               struct dc_context *ctx, unsigned int inst)
-{
-       return dce_audio_create(ctx, inst,
-                       &audio_regs[inst], &audio_shift, &audio_mask);
-}
-
-static struct vpg *dcn31_vpg_create(
-       struct dc_context *ctx,
-       uint32_t inst)
-{
-       struct dcn31_vpg *vpg31 = kzalloc(sizeof(struct dcn31_vpg), GFP_KERNEL);
-
-       if (!vpg31)
-               return NULL;
-
-       vpg31_construct(vpg31, ctx, inst,
-                       &vpg_regs[inst],
-                       &vpg_shift,
-                       &vpg_mask);
-
-       return &vpg31->base;
-}
-
-static struct afmt *dcn31_afmt_create(
-       struct dc_context *ctx,
-       uint32_t inst)
-{
-       struct dcn31_afmt *afmt31 = kzalloc(sizeof(struct dcn31_afmt), GFP_KERNEL);
-
-       if (!afmt31)
-               return NULL;
-
-       afmt31_construct(afmt31, ctx, inst,
-                       &afmt_regs[inst],
-                       &afmt_shift,
-                       &afmt_mask);
-
-       // Light sleep by default, no need to power down here
-
-       return &afmt31->base;
-}
-
-static struct apg *dcn31_apg_create(
-       struct dc_context *ctx,
-       uint32_t inst)
-{
-       struct dcn31_apg *apg31 = kzalloc(sizeof(struct dcn31_apg), GFP_KERNEL);
-
-       if (!apg31)
-               return NULL;
-
-       apg31_construct(apg31, ctx, inst,
-                       &apg_regs[inst],
-                       &apg_shift,
-                       &apg_mask);
-
-       return &apg31->base;
-}
-
-static struct stream_encoder *dcn31_stream_encoder_create(
-       enum engine_id eng_id,
-       struct dc_context *ctx)
-{
-       struct dcn10_stream_encoder *enc1;
-       struct vpg *vpg;
-       struct afmt *afmt;
-       int vpg_inst;
-       int afmt_inst;
-
-       /* Mapping of VPG, AFMT, DME register blocks to DIO block instance */
-       if (eng_id <= ENGINE_ID_DIGF) {
-               vpg_inst = eng_id;
-               afmt_inst = eng_id;
-       } else
-               return NULL;
-
-       enc1 = kzalloc(sizeof(struct dcn10_stream_encoder), GFP_KERNEL);
-       vpg = dcn31_vpg_create(ctx, vpg_inst);
-       afmt = dcn31_afmt_create(ctx, afmt_inst);
-
-       if (!enc1 || !vpg || !afmt) {
-               kfree(enc1);
-               kfree(vpg);
-               kfree(afmt);
-               return NULL;
-       }
-
-       dcn30_dio_stream_encoder_construct(enc1, ctx, ctx->dc_bios,
-                                       eng_id, vpg, afmt,
-                                       &stream_enc_regs[eng_id],
-                                       &se_shift, &se_mask);
-
-       return &enc1->base;
-}
-
-static struct hpo_dp_stream_encoder *dcn31_hpo_dp_stream_encoder_create(
-       enum engine_id eng_id,
-       struct dc_context *ctx)
-{
-       struct dcn31_hpo_dp_stream_encoder *hpo_dp_enc31;
-       struct vpg *vpg;
-       struct apg *apg;
-       uint32_t hpo_dp_inst;
-       uint32_t vpg_inst;
-       uint32_t apg_inst;
-
-       ASSERT((eng_id >= ENGINE_ID_HPO_DP_0) && (eng_id <= ENGINE_ID_HPO_DP_3));
-       hpo_dp_inst = eng_id - ENGINE_ID_HPO_DP_0;
-
-       /* Mapping of VPG register blocks to HPO DP block instance:
-        * VPG[6] -> HPO_DP[0]
-        * VPG[7] -> HPO_DP[1]
-        * VPG[8] -> HPO_DP[2]
-        * VPG[9] -> HPO_DP[3]
-        */
-       vpg_inst = hpo_dp_inst + 6;
-
-       /* Mapping of APG register blocks to HPO DP block instance:
-        * APG[0] -> HPO_DP[0]
-        * APG[1] -> HPO_DP[1]
-        * APG[2] -> HPO_DP[2]
-        * APG[3] -> HPO_DP[3]
-        */
-       apg_inst = hpo_dp_inst;
-
-       /* allocate HPO stream encoder and create VPG sub-block */
-       hpo_dp_enc31 = kzalloc(sizeof(struct dcn31_hpo_dp_stream_encoder), GFP_KERNEL);
-       vpg = dcn31_vpg_create(ctx, vpg_inst);
-       apg = dcn31_apg_create(ctx, apg_inst);
-
-       if (!hpo_dp_enc31 || !vpg || !apg) {
-               kfree(hpo_dp_enc31);
-               kfree(vpg);
-               kfree(apg);
-               return NULL;
-       }
-
-       dcn31_hpo_dp_stream_encoder_construct(hpo_dp_enc31, ctx, ctx->dc_bios,
-                                       hpo_dp_inst, eng_id, vpg, apg,
-                                       &hpo_dp_stream_enc_regs[hpo_dp_inst],
-                                       &hpo_dp_se_shift, &hpo_dp_se_mask);
-
-       return &hpo_dp_enc31->base;
-}
-
-static struct hpo_dp_link_encoder *dcn31_hpo_dp_link_encoder_create(
-       uint8_t inst,
-       struct dc_context *ctx)
-{
-       struct dcn31_hpo_dp_link_encoder *hpo_dp_enc31;
-
-       /* allocate HPO link encoder */
-       hpo_dp_enc31 = kzalloc(sizeof(struct dcn31_hpo_dp_link_encoder), GFP_KERNEL);
-
-       hpo_dp_link_encoder31_construct(hpo_dp_enc31, ctx, inst,
-                                       &hpo_dp_link_enc_regs[inst],
-                                       &hpo_dp_le_shift, &hpo_dp_le_mask);
-
-       return &hpo_dp_enc31->base;
-}
-
-static struct dce_hwseq *dcn31_hwseq_create(
-       struct dc_context *ctx)
-{
-       struct dce_hwseq *hws = kzalloc(sizeof(struct dce_hwseq), GFP_KERNEL);
-
-       if (hws) {
-               hws->ctx = ctx;
-               hws->regs = &hwseq_reg;
-               hws->shifts = &hwseq_shift;
-               hws->masks = &hwseq_mask;
-       }
-       return hws;
-}
-static const struct resource_create_funcs res_create_funcs = {
-       .read_dce_straps = read_dce_straps,
-       .create_audio = dcn31_create_audio,
-       .create_stream_encoder = dcn31_stream_encoder_create,
-       .create_hpo_dp_stream_encoder = dcn31_hpo_dp_stream_encoder_create,
-       .create_hpo_dp_link_encoder = dcn31_hpo_dp_link_encoder_create,
-       .create_hwseq = dcn31_hwseq_create,
-};
-
-static void dcn31_resource_destruct(struct dcn31_resource_pool *pool)
-{
-       unsigned int i;
-
-       for (i = 0; i < pool->base.stream_enc_count; i++) {
-               if (pool->base.stream_enc[i] != NULL) {
-                       if (pool->base.stream_enc[i]->vpg != NULL) {
-                               kfree(DCN30_VPG_FROM_VPG(pool->base.stream_enc[i]->vpg));
-                               pool->base.stream_enc[i]->vpg = NULL;
-                       }
-                       if (pool->base.stream_enc[i]->afmt != NULL) {
-                               kfree(DCN30_AFMT_FROM_AFMT(pool->base.stream_enc[i]->afmt));
-                               pool->base.stream_enc[i]->afmt = NULL;
-                       }
-                       kfree(DCN10STRENC_FROM_STRENC(pool->base.stream_enc[i]));
-                       pool->base.stream_enc[i] = NULL;
-               }
-       }
-
-       for (i = 0; i < pool->base.hpo_dp_stream_enc_count; i++) {
-               if (pool->base.hpo_dp_stream_enc[i] != NULL) {
-                       if (pool->base.hpo_dp_stream_enc[i]->vpg != NULL) {
-                               kfree(DCN30_VPG_FROM_VPG(pool->base.hpo_dp_stream_enc[i]->vpg));
-                               pool->base.hpo_dp_stream_enc[i]->vpg = NULL;
-                       }
-                       if (pool->base.hpo_dp_stream_enc[i]->apg != NULL) {
-                               kfree(DCN31_APG_FROM_APG(pool->base.hpo_dp_stream_enc[i]->apg));
-                               pool->base.hpo_dp_stream_enc[i]->apg = NULL;
-                       }
-                       kfree(DCN3_1_HPO_DP_STREAM_ENC_FROM_HPO_STREAM_ENC(pool->base.hpo_dp_stream_enc[i]));
-                       pool->base.hpo_dp_stream_enc[i] = NULL;
-               }
-       }
-
-       for (i = 0; i < pool->base.hpo_dp_link_enc_count; i++) {
-               if (pool->base.hpo_dp_link_enc[i] != NULL) {
-                       kfree(DCN3_1_HPO_DP_LINK_ENC_FROM_HPO_LINK_ENC(pool->base.hpo_dp_link_enc[i]));
-                       pool->base.hpo_dp_link_enc[i] = NULL;
-               }
-       }
-
-       for (i = 0; i < pool->base.res_cap->num_dsc; i++) {
-               if (pool->base.dscs[i] != NULL)
-                       dcn20_dsc_destroy(&pool->base.dscs[i]);
-       }
-
-       if (pool->base.mpc != NULL) {
-               kfree(TO_DCN20_MPC(pool->base.mpc));
-               pool->base.mpc = NULL;
-       }
-       if (pool->base.hubbub != NULL) {
-               kfree(pool->base.hubbub);
-               pool->base.hubbub = NULL;
-       }
-       for (i = 0; i < pool->base.pipe_count; i++) {
-               if (pool->base.dpps[i] != NULL)
-                       dcn31_dpp_destroy(&pool->base.dpps[i]);
-
-               if (pool->base.ipps[i] != NULL)
-                       pool->base.ipps[i]->funcs->ipp_destroy(&pool->base.ipps[i]);
-
-               if (pool->base.hubps[i] != NULL) {
-                       kfree(TO_DCN20_HUBP(pool->base.hubps[i]));
-                       pool->base.hubps[i] = NULL;
-               }
-
-               if (pool->base.irqs != NULL) {
-                       dal_irq_service_destroy(&pool->base.irqs);
-               }
-       }
-
-       for (i = 0; i < pool->base.res_cap->num_ddc; i++) {
-               if (pool->base.engines[i] != NULL)
-                       dce110_engine_destroy(&pool->base.engines[i]);
-               if (pool->base.hw_i2cs[i] != NULL) {
-                       kfree(pool->base.hw_i2cs[i]);
-                       pool->base.hw_i2cs[i] = NULL;
-               }
-               if (pool->base.sw_i2cs[i] != NULL) {
-                       kfree(pool->base.sw_i2cs[i]);
-                       pool->base.sw_i2cs[i] = NULL;
-               }
-       }
-
-       for (i = 0; i < pool->base.res_cap->num_opp; i++) {
-               if (pool->base.opps[i] != NULL)
-                       pool->base.opps[i]->funcs->opp_destroy(&pool->base.opps[i]);
-       }
-
-       for (i = 0; i < pool->base.res_cap->num_timing_generator; i++) {
-               if (pool->base.timing_generators[i] != NULL)    {
-                       kfree(DCN10TG_FROM_TG(pool->base.timing_generators[i]));
-                       pool->base.timing_generators[i] = NULL;
-               }
-       }
-
-       for (i = 0; i < pool->base.res_cap->num_dwb; i++) {
-               if (pool->base.dwbc[i] != NULL) {
-                       kfree(TO_DCN30_DWBC(pool->base.dwbc[i]));
-                       pool->base.dwbc[i] = NULL;
-               }
-               if (pool->base.mcif_wb[i] != NULL) {
-                       kfree(TO_DCN30_MMHUBBUB(pool->base.mcif_wb[i]));
-                       pool->base.mcif_wb[i] = NULL;
-               }
-       }
-
-       for (i = 0; i < pool->base.audio_count; i++) {
-               if (pool->base.audios[i])
-                       dce_aud_destroy(&pool->base.audios[i]);
-       }
-
-       for (i = 0; i < pool->base.clk_src_count; i++) {
-               if (pool->base.clock_sources[i] != NULL) {
-                       dcn20_clock_source_destroy(&pool->base.clock_sources[i]);
-                       pool->base.clock_sources[i] = NULL;
-               }
-       }
-
-       for (i = 0; i < pool->base.res_cap->num_mpc_3dlut; i++) {
-               if (pool->base.mpc_lut[i] != NULL) {
-                       dc_3dlut_func_release(pool->base.mpc_lut[i]);
-                       pool->base.mpc_lut[i] = NULL;
-               }
-               if (pool->base.mpc_shaper[i] != NULL) {
-                       dc_transfer_func_release(pool->base.mpc_shaper[i]);
-                       pool->base.mpc_shaper[i] = NULL;
-               }
-       }
-
-       if (pool->base.dp_clock_source != NULL) {
-               dcn20_clock_source_destroy(&pool->base.dp_clock_source);
-               pool->base.dp_clock_source = NULL;
-       }
-
-       for (i = 0; i < pool->base.res_cap->num_timing_generator; i++) {
-               if (pool->base.multiple_abms[i] != NULL)
-                       dce_abm_destroy(&pool->base.multiple_abms[i]);
-       }
-
-       if (pool->base.psr != NULL)
-               dmub_psr_destroy(&pool->base.psr);
-
-       if (pool->base.replay != NULL)
-               dmub_replay_destroy(&pool->base.replay);
-
-       if (pool->base.dccg != NULL)
-               dcn_dccg_destroy(&pool->base.dccg);
-}
-
-static struct hubp *dcn31_hubp_create(
-       struct dc_context *ctx,
-       uint32_t inst)
-{
-       struct dcn20_hubp *hubp2 =
-               kzalloc(sizeof(struct dcn20_hubp), GFP_KERNEL);
-
-       if (!hubp2)
-               return NULL;
-
-       if (hubp31_construct(hubp2, ctx, inst,
-                       &hubp_regs[inst], &hubp_shift, &hubp_mask))
-               return &hubp2->base;
-
-       BREAK_TO_DEBUGGER();
-       kfree(hubp2);
-       return NULL;
-}
-
-static bool dcn31_dwbc_create(struct dc_context *ctx, struct resource_pool *pool)
-{
-       int i;
-       uint32_t pipe_count = pool->res_cap->num_dwb;
-
-       for (i = 0; i < pipe_count; i++) {
-               struct dcn30_dwbc *dwbc30 = kzalloc(sizeof(struct dcn30_dwbc),
-                                                   GFP_KERNEL);
-
-               if (!dwbc30) {
-                       dm_error("DC: failed to create dwbc30!\n");
-                       return false;
-               }
-
-               dcn30_dwbc_construct(dwbc30, ctx,
-                               &dwbc30_regs[i],
-                               &dwbc30_shift,
-                               &dwbc30_mask,
-                               i);
-
-               pool->dwbc[i] = &dwbc30->base;
-       }
-       return true;
-}
-
-static bool dcn31_mmhubbub_create(struct dc_context *ctx, struct resource_pool *pool)
-{
-       int i;
-       uint32_t pipe_count = pool->res_cap->num_dwb;
-
-       for (i = 0; i < pipe_count; i++) {
-               struct dcn30_mmhubbub *mcif_wb30 = kzalloc(sizeof(struct dcn30_mmhubbub),
-                                                   GFP_KERNEL);
-
-               if (!mcif_wb30) {
-                       dm_error("DC: failed to create mcif_wb30!\n");
-                       return false;
-               }
-
-               dcn30_mmhubbub_construct(mcif_wb30, ctx,
-                               &mcif_wb30_regs[i],
-                               &mcif_wb30_shift,
-                               &mcif_wb30_mask,
-                               i);
-
-               pool->mcif_wb[i] = &mcif_wb30->base;
-       }
-       return true;
-}
-
-static struct display_stream_compressor *dcn31_dsc_create(
-       struct dc_context *ctx, uint32_t inst)
-{
-       struct dcn20_dsc *dsc =
-               kzalloc(sizeof(struct dcn20_dsc), GFP_KERNEL);
-
-       if (!dsc) {
-               BREAK_TO_DEBUGGER();
-               return NULL;
-       }
-
-       dsc2_construct(dsc, ctx, inst, &dsc_regs[inst], &dsc_shift, &dsc_mask);
-       return &dsc->base;
-}
-
-static void dcn31_destroy_resource_pool(struct resource_pool **pool)
-{
-       struct dcn31_resource_pool *dcn31_pool = TO_DCN31_RES_POOL(*pool);
-
-       dcn31_resource_destruct(dcn31_pool);
-       kfree(dcn31_pool);
-       *pool = NULL;
-}
-
-static struct clock_source *dcn31_clock_source_create(
-               struct dc_context *ctx,
-               struct dc_bios *bios,
-               enum clock_source_id id,
-               const struct dce110_clk_src_regs *regs,
-               bool dp_clk_src)
-{
-       struct dce110_clk_src *clk_src =
-               kzalloc(sizeof(struct dce110_clk_src), GFP_KERNEL);
-
-       if (!clk_src)
-               return NULL;
-
-       if (dcn3_clk_src_construct(clk_src, ctx, bios, id,
-                       regs, &cs_shift, &cs_mask)) {
-               clk_src->base.dp_clk_src = dp_clk_src;
-               return &clk_src->base;
-       }
-
-       kfree(clk_src);
-       BREAK_TO_DEBUGGER();
-       return NULL;
-}
-
-static bool is_dual_plane(enum surface_pixel_format format)
-{
-       return format >= SURFACE_PIXEL_FORMAT_VIDEO_BEGIN || format == SURFACE_PIXEL_FORMAT_GRPH_RGBE_ALPHA;
-}
-
-int dcn31x_populate_dml_pipes_from_context(struct dc *dc,
-                                         struct dc_state *context,
-                                         display_e2e_pipe_params_st *pipes,
-                                         bool fast_validate)
-{
-       uint32_t pipe_cnt;
-       int i;
-
-       dc_assert_fp_enabled();
-
-       pipe_cnt = dcn20_populate_dml_pipes_from_context(dc, context, pipes, fast_validate);
-
-       for (i = 0; i < pipe_cnt; i++) {
-               pipes[i].pipe.src.gpuvm = 1;
-               if (dc->debug.dml_hostvm_override == DML_HOSTVM_NO_OVERRIDE) {
-                       //pipes[pipe_cnt].pipe.src.hostvm = dc->res_pool->hubbub->riommu_active;
-                       pipes[i].pipe.src.hostvm = dc->vm_pa_config.is_hvm_enabled;
-               } else if (dc->debug.dml_hostvm_override == DML_HOSTVM_OVERRIDE_FALSE)
-                       pipes[i].pipe.src.hostvm = false;
-               else if (dc->debug.dml_hostvm_override == DML_HOSTVM_OVERRIDE_TRUE)
-                       pipes[i].pipe.src.hostvm = true;
-       }
-       return pipe_cnt;
-}
-
-int dcn31_populate_dml_pipes_from_context(
-       struct dc *dc, struct dc_state *context,
-       display_e2e_pipe_params_st *pipes,
-       bool fast_validate)
-{
-       int i, pipe_cnt;
-       struct resource_context *res_ctx = &context->res_ctx;
-       struct pipe_ctx *pipe;
-       bool upscaled = false;
-
-       DC_FP_START();
-       dcn31x_populate_dml_pipes_from_context(dc, context, pipes, fast_validate);
-       DC_FP_END();
-
-       for (i = 0, pipe_cnt = 0; i < dc->res_pool->pipe_count; i++) {
-               struct dc_crtc_timing *timing;
-
-               if (!res_ctx->pipe_ctx[i].stream)
-                       continue;
-               pipe = &res_ctx->pipe_ctx[i];
-               timing = &pipe->stream->timing;
-               if (pipe->plane_state &&
-                               (pipe->plane_state->src_rect.height < pipe->plane_state->dst_rect.height ||
-                               pipe->plane_state->src_rect.width < pipe->plane_state->dst_rect.width))
-                       upscaled = true;
-
-               /*
-                * Immediate flip can be set dynamically after enabling the plane.
-                * We need to require support for immediate flip or underflow can be
-                * intermittently experienced depending on peak b/w requirements.
-                */
-               pipes[pipe_cnt].pipe.src.immediate_flip = true;
-               pipes[pipe_cnt].pipe.src.unbounded_req_mode = false;
-               pipes[pipe_cnt].pipe.src.gpuvm = true;
-               pipes[pipe_cnt].pipe.dest.vfront_porch = timing->v_front_porch;
-               pipes[pipe_cnt].pipe.src.dcc_rate = 3;
-               pipes[pipe_cnt].dout.dsc_input_bpc = 0;
-               DC_FP_START();
-               dcn31_zero_pipe_dcc_fraction(pipes, pipe_cnt);
-               DC_FP_END();
-
-
-               if (pipes[pipe_cnt].dout.dsc_enable) {
-                       switch (timing->display_color_depth) {
-                       case COLOR_DEPTH_888:
-                               pipes[pipe_cnt].dout.dsc_input_bpc = 8;
-                               break;
-                       case COLOR_DEPTH_101010:
-                               pipes[pipe_cnt].dout.dsc_input_bpc = 10;
-                               break;
-                       case COLOR_DEPTH_121212:
-                               pipes[pipe_cnt].dout.dsc_input_bpc = 12;
-                               break;
-                       default:
-                               ASSERT(0);
-                               break;
-                       }
-               }
-
-               pipe_cnt++;
-       }
-       context->bw_ctx.dml.ip.det_buffer_size_kbytes = DCN3_1_DEFAULT_DET_SIZE;
-       dc->config.enable_4to1MPC = false;
-       if (pipe_cnt == 1 && pipe->plane_state && !dc->debug.disable_z9_mpc) {
-               if (is_dual_plane(pipe->plane_state->format)
-                               && pipe->plane_state->src_rect.width <= 1920 && pipe->plane_state->src_rect.height <= 1080) {
-                       dc->config.enable_4to1MPC = true;
-               } else if (!is_dual_plane(pipe->plane_state->format) && pipe->plane_state->src_rect.width <= 5120) {
-                       /* Limit to 5k max to avoid forced pipe split when there is not enough detile for swath */
-                       context->bw_ctx.dml.ip.det_buffer_size_kbytes = 192;
-                       pipes[0].pipe.src.unbounded_req_mode = true;
-               }
-       } else if (context->stream_count >= dc->debug.crb_alloc_policy_min_disp_count
-                       && dc->debug.crb_alloc_policy > DET_SIZE_DEFAULT) {
-               context->bw_ctx.dml.ip.det_buffer_size_kbytes = dc->debug.crb_alloc_policy * 64;
-       } else if (context->stream_count >= 3 && upscaled) {
-               context->bw_ctx.dml.ip.det_buffer_size_kbytes = 192;
-       }
-
-       return pipe_cnt;
-}
-
-void dcn31_calculate_wm_and_dlg(
-               struct dc *dc, struct dc_state *context,
-               display_e2e_pipe_params_st *pipes,
-               int pipe_cnt,
-               int vlevel)
-{
-       DC_FP_START();
-       dcn31_calculate_wm_and_dlg_fp(dc, context, pipes, pipe_cnt, vlevel);
-       DC_FP_END();
-}
-
-void
-dcn31_populate_dml_writeback_from_context(struct dc *dc,
-                                         struct resource_context *res_ctx,
-                                         display_e2e_pipe_params_st *pipes)
-{
-       DC_FP_START();
-       dcn30_populate_dml_writeback_from_context(dc, res_ctx, pipes);
-       DC_FP_END();
-}
-
-void
-dcn31_set_mcif_arb_params(struct dc *dc,
-                         struct dc_state *context,
-                         display_e2e_pipe_params_st *pipes,
-                         int pipe_cnt)
-{
-       DC_FP_START();
-       dcn30_set_mcif_arb_params(dc, context, pipes, pipe_cnt);
-       DC_FP_END();
-}
-
-bool dcn31_validate_bandwidth(struct dc *dc,
-               struct dc_state *context,
-               bool fast_validate)
-{
-       bool out = false;
-
-       BW_VAL_TRACE_SETUP();
-
-       int vlevel = 0;
-       int pipe_cnt = 0;
-       display_e2e_pipe_params_st *pipes = kzalloc(dc->res_pool->pipe_count * sizeof(display_e2e_pipe_params_st), GFP_KERNEL);
-       DC_LOGGER_INIT(dc->ctx->logger);
-
-       BW_VAL_TRACE_COUNT();
-
-       DC_FP_START();
-       out = dcn30_internal_validate_bw(dc, context, pipes, &pipe_cnt, &vlevel, fast_validate, true);
-       DC_FP_END();
-
-       // Disable fast_validate to set min dcfclk in alculate_wm_and_dlg
-       if (pipe_cnt == 0)
-               fast_validate = false;
-
-       if (!out)
-               goto validate_fail;
-
-       BW_VAL_TRACE_END_VOLTAGE_LEVEL();
-
-       if (fast_validate) {
-               BW_VAL_TRACE_SKIP(fast);
-               goto validate_out;
-       }
-       if (dc->res_pool->funcs->calculate_wm_and_dlg)
-               dc->res_pool->funcs->calculate_wm_and_dlg(dc, context, pipes, pipe_cnt, vlevel);
-
-       BW_VAL_TRACE_END_WATERMARKS();
-
-       goto validate_out;
-
-validate_fail:
-       DC_LOG_WARNING("Mode Validation Warning: %s failed validation.\n",
-               dml_get_status_message(context->bw_ctx.dml.vba.ValidationStatus[context->bw_ctx.dml.vba.soc.num_states]));
-
-       BW_VAL_TRACE_SKIP(fail);
-       out = false;
-
-validate_out:
-       kfree(pipes);
-
-       BW_VAL_TRACE_FINISH();
-
-       return out;
-}
-
-static void dcn31_get_panel_config_defaults(struct dc_panel_config *panel_config)
-{
-       *panel_config = panel_config_defaults;
-}
-
-static struct dc_cap_funcs cap_funcs = {
-       .get_dcc_compression_cap = dcn20_get_dcc_compression_cap
-};
-
-static struct resource_funcs dcn31_res_pool_funcs = {
-       .destroy = dcn31_destroy_resource_pool,
-       .link_enc_create = dcn31_link_encoder_create,
-       .link_enc_create_minimal = dcn31_link_enc_create_minimal,
-       .link_encs_assign = link_enc_cfg_link_encs_assign,
-       .link_enc_unassign = link_enc_cfg_link_enc_unassign,
-       .panel_cntl_create = dcn31_panel_cntl_create,
-       .validate_bandwidth = dcn31_validate_bandwidth,
-       .calculate_wm_and_dlg = dcn31_calculate_wm_and_dlg,
-       .update_soc_for_wm_a = dcn31_update_soc_for_wm_a,
-       .populate_dml_pipes = dcn31_populate_dml_pipes_from_context,
-       .acquire_free_pipe_as_secondary_dpp_pipe = dcn20_acquire_free_pipe_for_layer,
-       .release_pipe = dcn20_release_pipe,
-       .add_stream_to_ctx = dcn30_add_stream_to_ctx,
-       .add_dsc_to_stream_resource = dcn20_add_dsc_to_stream_resource,
-       .remove_stream_from_ctx = dcn20_remove_stream_from_ctx,
-       .populate_dml_writeback_from_context = dcn31_populate_dml_writeback_from_context,
-       .set_mcif_arb_params = dcn31_set_mcif_arb_params,
-       .find_first_free_match_stream_enc_for_link = dcn10_find_first_free_match_stream_enc_for_link,
-       .acquire_post_bldn_3dlut = dcn30_acquire_post_bldn_3dlut,
-       .release_post_bldn_3dlut = dcn30_release_post_bldn_3dlut,
-       .update_bw_bounding_box = dcn31_update_bw_bounding_box,
-       .patch_unknown_plane_state = dcn20_patch_unknown_plane_state,
-       .get_panel_config_defaults = dcn31_get_panel_config_defaults,
-};
-
-static struct clock_source *dcn30_clock_source_create(
-               struct dc_context *ctx,
-               struct dc_bios *bios,
-               enum clock_source_id id,
-               const struct dce110_clk_src_regs *regs,
-               bool dp_clk_src)
-{
-       struct dce110_clk_src *clk_src =
-               kzalloc(sizeof(struct dce110_clk_src), GFP_KERNEL);
-
-       if (!clk_src)
-               return NULL;
-
-       if (dcn31_clk_src_construct(clk_src, ctx, bios, id,
-                       regs, &cs_shift, &cs_mask)) {
-               clk_src->base.dp_clk_src = dp_clk_src;
-               return &clk_src->base;
-       }
-
-       BREAK_TO_DEBUGGER();
-       return NULL;
-}
-
-static bool dcn31_resource_construct(
-       uint8_t num_virtual_links,
-       struct dc *dc,
-       struct dcn31_resource_pool *pool)
-{
-       int i;
-       struct dc_context *ctx = dc->ctx;
-       struct irq_service_init_data init_data;
-
-       ctx->dc_bios->regs = &bios_regs;
-
-       pool->base.res_cap = &res_cap_dcn31;
-
-       pool->base.funcs = &dcn31_res_pool_funcs;
-
-       /*************************************************
-        *  Resource + asic cap harcoding                *
-        *************************************************/
-       pool->base.underlay_pipe_index = NO_UNDERLAY_PIPE;
-       pool->base.pipe_count = pool->base.res_cap->num_timing_generator;
-       pool->base.mpcc_count = pool->base.res_cap->num_timing_generator;
-       dc->caps.max_downscale_ratio = 600;
-       dc->caps.i2c_speed_in_khz = 100;
-       dc->caps.i2c_speed_in_khz_hdcp = 5; /*1.4 w/a applied by default*/
-       dc->caps.max_cursor_size = 256;
-       dc->caps.min_horizontal_blanking_period = 80;
-       dc->caps.dmdata_alloc_size = 2048;
-
-       dc->caps.max_slave_planes = 2;
-       dc->caps.max_slave_yuv_planes = 2;
-       dc->caps.max_slave_rgb_planes = 2;
-       dc->caps.post_blend_color_processing = true;
-       dc->caps.force_dp_tps4_for_cp2520 = true;
-       if (dc->config.forceHBR2CP2520)
-               dc->caps.force_dp_tps4_for_cp2520 = false;
-       dc->caps.dp_hpo = true;
-       dc->caps.dp_hdmi21_pcon_support = true;
-       dc->caps.edp_dsc_support = true;
-       dc->caps.extended_aux_timeout_support = true;
-       dc->caps.dmcub_support = true;
-       dc->caps.is_apu = true;
-       dc->caps.zstate_support = true;
-
-       /* Color pipeline capabilities */
-       dc->caps.color.dpp.dcn_arch = 1;
-       dc->caps.color.dpp.input_lut_shared = 0;
-       dc->caps.color.dpp.icsc = 1;
-       dc->caps.color.dpp.dgam_ram = 0; // must use gamma_corr
-       dc->caps.color.dpp.dgam_rom_caps.srgb = 1;
-       dc->caps.color.dpp.dgam_rom_caps.bt2020 = 1;
-       dc->caps.color.dpp.dgam_rom_caps.gamma2_2 = 1;
-       dc->caps.color.dpp.dgam_rom_caps.pq = 1;
-       dc->caps.color.dpp.dgam_rom_caps.hlg = 1;
-       dc->caps.color.dpp.post_csc = 1;
-       dc->caps.color.dpp.gamma_corr = 1;
-       dc->caps.color.dpp.dgam_rom_for_yuv = 0;
-
-       dc->caps.color.dpp.hw_3d_lut = 1;
-       dc->caps.color.dpp.ogam_ram = 1;
-       // no OGAM ROM on DCN301
-       dc->caps.color.dpp.ogam_rom_caps.srgb = 0;
-       dc->caps.color.dpp.ogam_rom_caps.bt2020 = 0;
-       dc->caps.color.dpp.ogam_rom_caps.gamma2_2 = 0;
-       dc->caps.color.dpp.ogam_rom_caps.pq = 0;
-       dc->caps.color.dpp.ogam_rom_caps.hlg = 0;
-       dc->caps.color.dpp.ocsc = 0;
-
-       dc->caps.color.mpc.gamut_remap = 1;
-       dc->caps.color.mpc.num_3dluts = pool->base.res_cap->num_mpc_3dlut; //2
-       dc->caps.color.mpc.ogam_ram = 1;
-       dc->caps.color.mpc.ogam_rom_caps.srgb = 0;
-       dc->caps.color.mpc.ogam_rom_caps.bt2020 = 0;
-       dc->caps.color.mpc.ogam_rom_caps.gamma2_2 = 0;
-       dc->caps.color.mpc.ogam_rom_caps.pq = 0;
-       dc->caps.color.mpc.ogam_rom_caps.hlg = 0;
-       dc->caps.color.mpc.ocsc = 1;
-
-       dc->config.use_old_fixed_vs_sequence = true;
-
-       /* Use pipe context based otg sync logic */
-       dc->config.use_pipe_ctx_sync_logic = true;
-
-       /* read VBIOS LTTPR caps */
-       {
-               if (ctx->dc_bios->funcs->get_lttpr_caps) {
-                       enum bp_result bp_query_result;
-                       uint8_t is_vbios_lttpr_enable = 0;
-
-                       bp_query_result = ctx->dc_bios->funcs->get_lttpr_caps(ctx->dc_bios, &is_vbios_lttpr_enable);
-                       dc->caps.vbios_lttpr_enable = (bp_query_result == BP_RESULT_OK) && !!is_vbios_lttpr_enable;
-               }
-
-               /* interop bit is implicit */
-               {
-                       dc->caps.vbios_lttpr_aware = true;
-               }
-       }
-
-       if (dc->ctx->dce_environment == DCE_ENV_PRODUCTION_DRV)
-               dc->debug = debug_defaults_drv;
-
-       // Init the vm_helper
-       if (dc->vm_helper)
-               vm_helper_init(dc->vm_helper, 16);
-
-       /*************************************************
-        *  Create resources                             *
-        *************************************************/
-
-       /* Clock Sources for Pixel Clock*/
-       pool->base.clock_sources[DCN31_CLK_SRC_PLL0] =
-                       dcn30_clock_source_create(ctx, ctx->dc_bios,
-                               CLOCK_SOURCE_COMBO_PHY_PLL0,
-                               &clk_src_regs[0], false);
-       pool->base.clock_sources[DCN31_CLK_SRC_PLL1] =
-                       dcn30_clock_source_create(ctx, ctx->dc_bios,
-                               CLOCK_SOURCE_COMBO_PHY_PLL1,
-                               &clk_src_regs[1], false);
-       /*move phypllx_pixclk_resync to dmub next*/
-       if (dc->ctx->asic_id.hw_internal_rev == YELLOW_CARP_B0) {
-               pool->base.clock_sources[DCN31_CLK_SRC_PLL2] =
-                       dcn30_clock_source_create(ctx, ctx->dc_bios,
-                               CLOCK_SOURCE_COMBO_PHY_PLL2,
-                               &clk_src_regs_b0[2], false);
-               pool->base.clock_sources[DCN31_CLK_SRC_PLL3] =
-                       dcn30_clock_source_create(ctx, ctx->dc_bios,
-                               CLOCK_SOURCE_COMBO_PHY_PLL3,
-                               &clk_src_regs_b0[3], false);
-       } else {
-               pool->base.clock_sources[DCN31_CLK_SRC_PLL2] =
-                       dcn30_clock_source_create(ctx, ctx->dc_bios,
-                               CLOCK_SOURCE_COMBO_PHY_PLL2,
-                               &clk_src_regs[2], false);
-               pool->base.clock_sources[DCN31_CLK_SRC_PLL3] =
-                       dcn30_clock_source_create(ctx, ctx->dc_bios,
-                               CLOCK_SOURCE_COMBO_PHY_PLL3,
-                               &clk_src_regs[3], false);
-       }
-
-       pool->base.clock_sources[DCN31_CLK_SRC_PLL4] =
-                       dcn30_clock_source_create(ctx, ctx->dc_bios,
-                               CLOCK_SOURCE_COMBO_PHY_PLL4,
-                               &clk_src_regs[4], false);
-
-       pool->base.clk_src_count = DCN30_CLK_SRC_TOTAL;
-
-       /* todo: not reuse phy_pll registers */
-       pool->base.dp_clock_source =
-                       dcn31_clock_source_create(ctx, ctx->dc_bios,
-                               CLOCK_SOURCE_ID_DP_DTO,
-                               &clk_src_regs[0], true);
-
-       for (i = 0; i < pool->base.clk_src_count; i++) {
-               if (pool->base.clock_sources[i] == NULL) {
-                       dm_error("DC: failed to create clock sources!\n");
-                       BREAK_TO_DEBUGGER();
-                       goto create_fail;
-               }
-       }
-
-       /* TODO: DCCG */
-       pool->base.dccg = dccg31_create(ctx, &dccg_regs, &dccg_shift, &dccg_mask);
-       if (pool->base.dccg == NULL) {
-               dm_error("DC: failed to create dccg!\n");
-               BREAK_TO_DEBUGGER();
-               goto create_fail;
-       }
-
-       /* TODO: IRQ */
-       init_data.ctx = dc->ctx;
-       pool->base.irqs = dal_irq_service_dcn31_create(&init_data);
-       if (!pool->base.irqs)
-               goto create_fail;
-
-       /* HUBBUB */
-       pool->base.hubbub = dcn31_hubbub_create(ctx);
-       if (pool->base.hubbub == NULL) {
-               BREAK_TO_DEBUGGER();
-               dm_error("DC: failed to create hubbub!\n");
-               goto create_fail;
-       }
-
-       /* HUBPs, DPPs, OPPs and TGs */
-       for (i = 0; i < pool->base.pipe_count; i++) {
-               pool->base.hubps[i] = dcn31_hubp_create(ctx, i);
-               if (pool->base.hubps[i] == NULL) {
-                       BREAK_TO_DEBUGGER();
-                       dm_error(
-                               "DC: failed to create hubps!\n");
-                       goto create_fail;
-               }
-
-               pool->base.dpps[i] = dcn31_dpp_create(ctx, i);
-               if (pool->base.dpps[i] == NULL) {
-                       BREAK_TO_DEBUGGER();
-                       dm_error(
-                               "DC: failed to create dpps!\n");
-                       goto create_fail;
-               }
-       }
-
-       for (i = 0; i < pool->base.res_cap->num_opp; i++) {
-               pool->base.opps[i] = dcn31_opp_create(ctx, i);
-               if (pool->base.opps[i] == NULL) {
-                       BREAK_TO_DEBUGGER();
-                       dm_error(
-                               "DC: failed to create output pixel processor!\n");
-                       goto create_fail;
-               }
-       }
-
-       for (i = 0; i < pool->base.res_cap->num_timing_generator; i++) {
-               pool->base.timing_generators[i] = dcn31_timing_generator_create(
-                               ctx, i);
-               if (pool->base.timing_generators[i] == NULL) {
-                       BREAK_TO_DEBUGGER();
-                       dm_error("DC: failed to create tg!\n");
-                       goto create_fail;
-               }
-       }
-       pool->base.timing_generator_count = i;
-
-       /* PSR */
-       pool->base.psr = dmub_psr_create(ctx);
-       if (pool->base.psr == NULL) {
-               dm_error("DC: failed to create psr obj!\n");
-               BREAK_TO_DEBUGGER();
-               goto create_fail;
-       }
-
-       /* Replay */
-       pool->base.replay = dmub_replay_create(ctx);
-       if (pool->base.replay == NULL) {
-               dm_error("DC: failed to create replay obj!\n");
-               BREAK_TO_DEBUGGER();
-               goto create_fail;
-       }
-
-       /* ABM */
-       for (i = 0; i < pool->base.res_cap->num_timing_generator; i++) {
-               pool->base.multiple_abms[i] = dmub_abm_create(ctx,
-                               &abm_regs[i],
-                               &abm_shift,
-                               &abm_mask);
-               if (pool->base.multiple_abms[i] == NULL) {
-                       dm_error("DC: failed to create abm for pipe %d!\n", i);
-                       BREAK_TO_DEBUGGER();
-                       goto create_fail;
-               }
-       }
-
-       /* MPC and DSC */
-       pool->base.mpc = dcn31_mpc_create(ctx, pool->base.mpcc_count, pool->base.res_cap->num_mpc_3dlut);
-       if (pool->base.mpc == NULL) {
-               BREAK_TO_DEBUGGER();
-               dm_error("DC: failed to create mpc!\n");
-               goto create_fail;
-       }
-
-       for (i = 0; i < pool->base.res_cap->num_dsc; i++) {
-               pool->base.dscs[i] = dcn31_dsc_create(ctx, i);
-               if (pool->base.dscs[i] == NULL) {
-                       BREAK_TO_DEBUGGER();
-                       dm_error("DC: failed to create display stream compressor %d!\n", i);
-                       goto create_fail;
-               }
-       }
-
-       /* DWB and MMHUBBUB */
-       if (!dcn31_dwbc_create(ctx, &pool->base)) {
-               BREAK_TO_DEBUGGER();
-               dm_error("DC: failed to create dwbc!\n");
-               goto create_fail;
-       }
-
-       if (!dcn31_mmhubbub_create(ctx, &pool->base)) {
-               BREAK_TO_DEBUGGER();
-               dm_error("DC: failed to create mcif_wb!\n");
-               goto create_fail;
-       }
-
-       /* AUX and I2C */
-       for (i = 0; i < pool->base.res_cap->num_ddc; i++) {
-               pool->base.engines[i] = dcn31_aux_engine_create(ctx, i);
-               if (pool->base.engines[i] == NULL) {
-                       BREAK_TO_DEBUGGER();
-                       dm_error(
-                               "DC:failed to create aux engine!!\n");
-                       goto create_fail;
-               }
-               pool->base.hw_i2cs[i] = dcn31_i2c_hw_create(ctx, i);
-               if (pool->base.hw_i2cs[i] == NULL) {
-                       BREAK_TO_DEBUGGER();
-                       dm_error(
-                               "DC:failed to create hw i2c!!\n");
-                       goto create_fail;
-               }
-               pool->base.sw_i2cs[i] = NULL;
-       }
-
-       if (dc->ctx->asic_id.chip_family == FAMILY_YELLOW_CARP &&
-           dc->ctx->asic_id.hw_internal_rev == YELLOW_CARP_B0 &&
-           !dc->debug.dpia_debug.bits.disable_dpia) {
-               /* YELLOW CARP B0 has 4 DPIA's */
-               pool->base.usb4_dpia_count = 4;
-       }
-
-       if (dc->ctx->asic_id.chip_family == AMDGPU_FAMILY_GC_11_0_1)
-               pool->base.usb4_dpia_count = 4;
-
-       /* Audio, Stream Encoders including HPO and virtual, MPC 3D LUTs */
-       if (!resource_construct(num_virtual_links, dc, &pool->base,
-                       &res_create_funcs))
-               goto create_fail;
-
-       /* HW Sequencer and Plane caps */
-       dcn31_hw_sequencer_construct(dc);
-
-       dc->caps.max_planes =  pool->base.pipe_count;
-
-       for (i = 0; i < dc->caps.max_planes; ++i)
-               dc->caps.planes[i] = plane_cap;
-
-       dc->cap_funcs = cap_funcs;
-
-       dc->dcn_ip->max_num_dpp = dcn3_1_ip.max_num_dpp;
-
-       return true;
-
-create_fail:
-       dcn31_resource_destruct(pool);
-
-       return false;
-}
-
-struct resource_pool *dcn31_create_resource_pool(
-               const struct dc_init_data *init_data,
-               struct dc *dc)
-{
-       struct dcn31_resource_pool *pool =
-               kzalloc(sizeof(struct dcn31_resource_pool), GFP_KERNEL);
-
-       if (!pool)
-               return NULL;
-
-       if (dcn31_resource_construct(init_data->num_virtual_links, dc, pool))
-               return &pool->base;
-
-       BREAK_TO_DEBUGGER();
-       kfree(pool);
-       return NULL;
-}
diff --git a/drivers/gpu/drm/amd/display/dc/dcn31/dcn31_resource.h b/drivers/gpu/drm/amd/display/dc/dcn31/dcn31_resource.h
deleted file mode 100644 (file)
index 9014365..0000000
+++ /dev/null
@@ -1,97 +0,0 @@
-/*
- * 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
- *
- */
-
-#ifndef _DCN31_RESOURCE_H_
-#define _DCN31_RESOURCE_H_
-
-#include "core_types.h"
-
-#define TO_DCN31_RES_POOL(pool)\
-       container_of(pool, struct dcn31_resource_pool, base)
-
-extern struct _vcs_dpi_ip_params_st dcn3_1_ip;
-
-struct dcn31_resource_pool {
-       struct resource_pool base;
-};
-
-bool dcn31_validate_bandwidth(struct dc *dc,
-               struct dc_state *context,
-               bool fast_validate);
-void dcn31_calculate_wm_and_dlg(
-               struct dc *dc, struct dc_state *context,
-               display_e2e_pipe_params_st *pipes,
-               int pipe_cnt,
-               int vlevel);
-int dcn31_populate_dml_pipes_from_context(
-       struct dc *dc, struct dc_state *context,
-       display_e2e_pipe_params_st *pipes,
-       bool fast_validate);
-void
-dcn31_populate_dml_writeback_from_context(struct dc *dc,
-                                         struct resource_context *res_ctx,
-                                         display_e2e_pipe_params_st *pipes);
-void
-dcn31_set_mcif_arb_params(struct dc *dc,
-                         struct dc_state *context,
-                         display_e2e_pipe_params_st *pipes,
-                         int pipe_cnt);
-
-struct resource_pool *dcn31_create_resource_pool(
-               const struct dc_init_data *init_data,
-               struct dc *dc);
-
-/*temp: B0 specific before switch to dcn313 headers*/
-#ifndef regPHYPLLF_PIXCLK_RESYNC_CNTL
-#define regPHYPLLF_PIXCLK_RESYNC_CNTL 0x007e
-#define regPHYPLLF_PIXCLK_RESYNC_CNTL_BASE_IDX 1
-#define regPHYPLLG_PIXCLK_RESYNC_CNTL 0x005f
-#define regPHYPLLG_PIXCLK_RESYNC_CNTL_BASE_IDX 1
-
-//PHYPLLF_PIXCLK_RESYNC_CNTL
-#define PHYPLLF_PIXCLK_RESYNC_CNTL__PHYPLLF_PIXCLK_RESYNC_ENABLE__SHIFT 0x0
-#define PHYPLLF_PIXCLK_RESYNC_CNTL__PHYPLLF_DEEP_COLOR_DTO_ENABLE_STATUS__SHIFT 0x1
-#define PHYPLLF_PIXCLK_RESYNC_CNTL__PHYPLLF_DCCG_DEEP_COLOR_CNTL__SHIFT 0x4
-#define PHYPLLF_PIXCLK_RESYNC_CNTL__PHYPLLF_PIXCLK_ENABLE__SHIFT 0x8
-#define PHYPLLF_PIXCLK_RESYNC_CNTL__PHYPLLF_PIXCLK_DOUBLE_RATE_ENABLE__SHIFT 0x9
-#define PHYPLLF_PIXCLK_RESYNC_CNTL__PHYPLLF_PIXCLK_RESYNC_ENABLE_MASK 0x00000001L
-#define PHYPLLF_PIXCLK_RESYNC_CNTL__PHYPLLF_DEEP_COLOR_DTO_ENABLE_STATUS_MASK 0x00000002L
-#define PHYPLLF_PIXCLK_RESYNC_CNTL__PHYPLLF_DCCG_DEEP_COLOR_CNTL_MASK 0x00000030L
-#define PHYPLLF_PIXCLK_RESYNC_CNTL__PHYPLLF_PIXCLK_ENABLE_MASK 0x00000100L
-#define PHYPLLF_PIXCLK_RESYNC_CNTL__PHYPLLF_PIXCLK_DOUBLE_RATE_ENABLE_MASK 0x00000200L
-
-//PHYPLLG_PIXCLK_RESYNC_CNTL
-#define PHYPLLG_PIXCLK_RESYNC_CNTL__PHYPLLG_PIXCLK_RESYNC_ENABLE__SHIFT 0x0
-#define PHYPLLG_PIXCLK_RESYNC_CNTL__PHYPLLG_DEEP_COLOR_DTO_ENABLE_STATUS__SHIFT 0x1
-#define PHYPLLG_PIXCLK_RESYNC_CNTL__PHYPLLG_DCCG_DEEP_COLOR_CNTL__SHIFT 0x4
-#define PHYPLLG_PIXCLK_RESYNC_CNTL__PHYPLLG_PIXCLK_ENABLE__SHIFT 0x8
-#define PHYPLLG_PIXCLK_RESYNC_CNTL__PHYPLLG_PIXCLK_DOUBLE_RATE_ENABLE__SHIFT 0x9
-#define PHYPLLG_PIXCLK_RESYNC_CNTL__PHYPLLG_PIXCLK_RESYNC_ENABLE_MASK 0x00000001L
-#define PHYPLLG_PIXCLK_RESYNC_CNTL__PHYPLLG_DEEP_COLOR_DTO_ENABLE_STATUS_MASK 0x00000002L
-#define PHYPLLG_PIXCLK_RESYNC_CNTL__PHYPLLG_DCCG_DEEP_COLOR_CNTL_MASK 0x00000030L
-#define PHYPLLG_PIXCLK_RESYNC_CNTL__PHYPLLG_PIXCLK_ENABLE_MASK 0x00000100L
-#define PHYPLLG_PIXCLK_RESYNC_CNTL__PHYPLLG_PIXCLK_DOUBLE_RATE_ENABLE_MASK 0x00000200L
-#endif
-#endif /* _DCN31_RESOURCE_H_ */
index 72456debb99f97ef41cf8ca79eea2925ee43b95e..6ea47e00d62d43ced6e586855958890c2dc45873 100644 (file)
@@ -10,7 +10,7 @@
 #
 # Makefile for dcn314.
 
-DCN314 = dcn314_resource.o dcn314_init.o \
+DCN314 = dcn314_init.o \
                dcn314_dio_stream_encoder.o dcn314_dccg.o dcn314_optc.o
 
 AMD_DAL_DCN314 = $(addprefix $(AMDDALPATH)/dc/dcn314/,$(DCN314))
diff --git a/drivers/gpu/drm/amd/display/dc/dcn314/dcn314_resource.c b/drivers/gpu/drm/amd/display/dc/dcn314/dcn314_resource.c
deleted file mode 100644 (file)
index 677361d..0000000
+++ /dev/null
@@ -1,2180 +0,0 @@
-// SPDX-License-Identifier: MIT
-/*
- * 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 "dm_services.h"
-#include "dc.h"
-
-#include "dcn31/dcn31_init.h"
-#include "dcn314/dcn314_init.h"
-
-#include "resource.h"
-#include "include/irq_service_interface.h"
-#include "dcn314_resource.h"
-
-#include "dcn20/dcn20_resource.h"
-#include "dcn30/dcn30_resource.h"
-#include "dcn31/dcn31_resource.h"
-
-#include "dcn10/dcn10_ipp.h"
-#include "dcn30/dcn30_hubbub.h"
-#include "dcn31/dcn31_hubbub.h"
-#include "dcn30/dcn30_mpc.h"
-#include "dcn31/dcn31_hubp.h"
-#include "irq/dcn31/irq_service_dcn31.h"
-#include "irq/dcn314/irq_service_dcn314.h"
-#include "dcn30/dcn30_dpp.h"
-#include "dcn314/dcn314_optc.h"
-#include "dcn20/dcn20_hwseq.h"
-#include "dcn30/dcn30_hwseq.h"
-#include "dce110/dce110_hwseq.h"
-#include "dcn30/dcn30_opp.h"
-#include "dcn20/dcn20_dsc.h"
-#include "dcn30/dcn30_vpg.h"
-#include "dcn30/dcn30_afmt.h"
-#include "dcn31/dcn31_dio_link_encoder.h"
-#include "dcn314/dcn314_dio_stream_encoder.h"
-#include "dcn31/dcn31_hpo_dp_stream_encoder.h"
-#include "dcn31/dcn31_hpo_dp_link_encoder.h"
-#include "dcn31/dcn31_apg.h"
-#include "dcn31/dcn31_vpg.h"
-#include "dcn31/dcn31_afmt.h"
-#include "dce/dce_clock_source.h"
-#include "dce/dce_audio.h"
-#include "dce/dce_hwseq.h"
-#include "clk_mgr.h"
-#include "virtual/virtual_stream_encoder.h"
-#include "dce110/dce110_resource.h"
-#include "dml/display_mode_vba.h"
-#include "dml/dcn31/dcn31_fpu.h"
-#include "dml/dcn314/dcn314_fpu.h"
-#include "dcn314/dcn314_dccg.h"
-#include "dcn10/dcn10_resource.h"
-#include "dcn31/dcn31_panel_cntl.h"
-#include "dcn314/dcn314_hwseq.h"
-
-#include "dcn30/dcn30_dwb.h"
-#include "dcn30/dcn30_mmhubbub.h"
-
-#include "dcn/dcn_3_1_4_offset.h"
-#include "dcn/dcn_3_1_4_sh_mask.h"
-#include "dpcs/dpcs_3_1_4_offset.h"
-#include "dpcs/dpcs_3_1_4_sh_mask.h"
-
-#define DCHUBBUB_DEBUG_CTRL_0__DET_DEPTH__SHIFT                0x10
-#define DCHUBBUB_DEBUG_CTRL_0__DET_DEPTH_MASK          0x01FF0000L
-
-#define DSCC0_DSCC_CONFIG0__ICH_RESET_AT_END_OF_LINE__SHIFT                   0x0
-#define DSCC0_DSCC_CONFIG0__ICH_RESET_AT_END_OF_LINE_MASK                     0x0000000FL
-
-#include "reg_helper.h"
-#include "dce/dmub_abm.h"
-#include "dce/dmub_psr.h"
-#include "dce/dmub_replay.h"
-#include "dce/dce_aux.h"
-#include "dce/dce_i2c.h"
-#include "dml/dcn314/display_mode_vba_314.h"
-#include "vm_helper.h"
-#include "dcn20/dcn20_vmid.h"
-
-#include "link_enc_cfg.h"
-
-#define DCN_BASE__INST0_SEG1                           0x000000C0
-#define DCN_BASE__INST0_SEG2                           0x000034C0
-#define DCN_BASE__INST0_SEG3                           0x00009000
-
-#define NBIO_BASE__INST0_SEG1                          0x00000014
-
-#define MAX_INSTANCE                                   7
-#define MAX_SEGMENT                                    8
-
-#define regBIF_BX2_BIOS_SCRATCH_2                      0x003a
-#define regBIF_BX2_BIOS_SCRATCH_2_BASE_IDX             1
-#define regBIF_BX2_BIOS_SCRATCH_3                      0x003b
-#define regBIF_BX2_BIOS_SCRATCH_3_BASE_IDX             1
-#define regBIF_BX2_BIOS_SCRATCH_6                      0x003e
-#define regBIF_BX2_BIOS_SCRATCH_6_BASE_IDX             1
-
-#define DC_LOGGER \
-       dc->ctx->logger
-#define DC_LOGGER_INIT(logger)
-
-enum dcn31_clk_src_array_id {
-       DCN31_CLK_SRC_PLL0,
-       DCN31_CLK_SRC_PLL1,
-       DCN31_CLK_SRC_PLL2,
-       DCN31_CLK_SRC_PLL3,
-       DCN31_CLK_SRC_PLL4,
-       DCN30_CLK_SRC_TOTAL
-};
-
-/* begin *********************
- * macros to expend register list macro defined in HW object header file
- */
-
-/* DCN */
-/* TODO awful hack. fixup dcn20_dwb.h */
-#undef BASE_INNER
-#define BASE_INNER(seg) DCN_BASE__INST0_SEG ## seg
-
-#define BASE(seg) BASE_INNER(seg)
-
-#define SR(reg_name)\
-               .reg_name = BASE(reg ## reg_name ## _BASE_IDX) +  \
-                                       reg ## reg_name
-
-#define SRI(reg_name, block, id)\
-       .reg_name = BASE(reg ## block ## id ## _ ## reg_name ## _BASE_IDX) + \
-                                       reg ## block ## id ## _ ## reg_name
-
-#define SRI2(reg_name, block, id)\
-       .reg_name = BASE(reg ## reg_name ## _BASE_IDX) + \
-                                       reg ## reg_name
-
-#define SRIR(var_name, reg_name, block, id)\
-       .var_name = BASE(reg ## block ## id ## _ ## reg_name ## _BASE_IDX) + \
-                                       reg ## block ## id ## _ ## reg_name
-
-#define SRII(reg_name, block, id)\
-       .reg_name[id] = BASE(reg ## block ## id ## _ ## reg_name ## _BASE_IDX) + \
-                                       reg ## block ## id ## _ ## reg_name
-
-#define SRII_MPC_RMU(reg_name, block, id)\
-       .RMU##_##reg_name[id] = BASE(reg ## block ## id ## _ ## reg_name ## _BASE_IDX) + \
-                                       reg ## block ## id ## _ ## reg_name
-
-#define SRII_DWB(reg_name, temp_name, block, id)\
-       .reg_name[id] = BASE(reg ## block ## id ## _ ## temp_name ## _BASE_IDX) + \
-                                       reg ## block ## id ## _ ## temp_name
-
-#define SF_DWB2(reg_name, block, id, field_name, post_fix)     \
-       .field_name = reg_name ## __ ## field_name ## post_fix
-
-#define DCCG_SRII(reg_name, block, id)\
-       .block ## _ ## reg_name[id] = BASE(reg ## block ## id ## _ ## reg_name ## _BASE_IDX) + \
-                                       reg ## block ## id ## _ ## reg_name
-
-#define VUPDATE_SRII(reg_name, block, id)\
-       .reg_name[id] = BASE(reg ## reg_name ## _ ## block ## id ## _BASE_IDX) + \
-                                       reg ## reg_name ## _ ## block ## id
-
-/* NBIO */
-#define NBIO_BASE_INNER(seg) \
-       NBIO_BASE__INST0_SEG ## seg
-
-#define NBIO_BASE(seg) \
-       NBIO_BASE_INNER(seg)
-
-#define NBIO_SR(reg_name)\
-               .reg_name = NBIO_BASE(regBIF_BX2_ ## reg_name ## _BASE_IDX) + \
-                                       regBIF_BX2_ ## reg_name
-
-/* MMHUB */
-#define MMHUB_BASE_INNER(seg) \
-       MMHUB_BASE__INST0_SEG ## seg
-
-#define MMHUB_BASE(seg) \
-       MMHUB_BASE_INNER(seg)
-
-#define MMHUB_SR(reg_name)\
-               .reg_name = MMHUB_BASE(reg ## reg_name ## _BASE_IDX) + \
-                                       reg ## reg_name
-
-/* CLOCK */
-#define CLK_BASE_INNER(seg) \
-       CLK_BASE__INST0_SEG ## seg
-
-#define CLK_BASE(seg) \
-       CLK_BASE_INNER(seg)
-
-#define CLK_SRI(reg_name, block, inst)\
-       .reg_name = CLK_BASE(reg ## block ## _ ## inst ## _ ## reg_name ## _BASE_IDX) + \
-                                       reg ## block ## _ ## inst ## _ ## reg_name
-
-
-static const struct bios_registers bios_regs = {
-               NBIO_SR(BIOS_SCRATCH_3),
-               NBIO_SR(BIOS_SCRATCH_6)
-};
-
-#define clk_src_regs(index, pllid)\
-[index] = {\
-       CS_COMMON_REG_LIST_DCN3_0(index, pllid),\
-}
-
-static const struct dce110_clk_src_regs clk_src_regs[] = {
-       clk_src_regs(0, A),
-       clk_src_regs(1, B),
-       clk_src_regs(2, C),
-       clk_src_regs(3, D),
-       clk_src_regs(4, E)
-};
-
-static const struct dce110_clk_src_shift cs_shift = {
-               CS_COMMON_MASK_SH_LIST_DCN3_1_4(__SHIFT)
-};
-
-static const struct dce110_clk_src_mask cs_mask = {
-               CS_COMMON_MASK_SH_LIST_DCN3_1_4(_MASK)
-};
-
-#define abm_regs(id)\
-[id] = {\
-               ABM_DCN302_REG_LIST(id)\
-}
-
-static const struct dce_abm_registers abm_regs[] = {
-               abm_regs(0),
-               abm_regs(1),
-               abm_regs(2),
-               abm_regs(3),
-};
-
-static const struct dce_abm_shift abm_shift = {
-               ABM_MASK_SH_LIST_DCN30(__SHIFT)
-};
-
-static const struct dce_abm_mask abm_mask = {
-               ABM_MASK_SH_LIST_DCN30(_MASK)
-};
-
-#define audio_regs(id)\
-[id] = {\
-               AUD_COMMON_REG_LIST(id)\
-}
-
-static const struct dce_audio_registers audio_regs[] = {
-       audio_regs(0),
-       audio_regs(1),
-       audio_regs(2),
-       audio_regs(3),
-       audio_regs(4),
-       audio_regs(5),
-       audio_regs(6)
-};
-
-#define DCE120_AUD_COMMON_MASK_SH_LIST(mask_sh)\
-               SF(AZF0ENDPOINT0_AZALIA_F0_CODEC_ENDPOINT_INDEX, AZALIA_ENDPOINT_REG_INDEX, mask_sh),\
-               SF(AZF0ENDPOINT0_AZALIA_F0_CODEC_ENDPOINT_DATA, AZALIA_ENDPOINT_REG_DATA, mask_sh),\
-               AUD_COMMON_MASK_SH_LIST_BASE(mask_sh)
-
-static const struct dce_audio_shift audio_shift = {
-               DCE120_AUD_COMMON_MASK_SH_LIST(__SHIFT)
-};
-
-static const struct dce_audio_mask audio_mask = {
-               DCE120_AUD_COMMON_MASK_SH_LIST(_MASK)
-};
-
-#define vpg_regs(id)\
-[id] = {\
-       VPG_DCN31_REG_LIST(id)\
-}
-
-static const struct dcn31_vpg_registers vpg_regs[] = {
-       vpg_regs(0),
-       vpg_regs(1),
-       vpg_regs(2),
-       vpg_regs(3),
-       vpg_regs(4),
-       vpg_regs(5),
-       vpg_regs(6),
-       vpg_regs(7),
-       vpg_regs(8),
-       vpg_regs(9),
-};
-
-static const struct dcn31_vpg_shift vpg_shift = {
-       DCN31_VPG_MASK_SH_LIST(__SHIFT)
-};
-
-static const struct dcn31_vpg_mask vpg_mask = {
-       DCN31_VPG_MASK_SH_LIST(_MASK)
-};
-
-#define afmt_regs(id)\
-[id] = {\
-       AFMT_DCN31_REG_LIST(id)\
-}
-
-static const struct dcn31_afmt_registers afmt_regs[] = {
-       afmt_regs(0),
-       afmt_regs(1),
-       afmt_regs(2),
-       afmt_regs(3),
-       afmt_regs(4),
-       afmt_regs(5)
-};
-
-static const struct dcn31_afmt_shift afmt_shift = {
-       DCN31_AFMT_MASK_SH_LIST(__SHIFT)
-};
-
-static const struct dcn31_afmt_mask afmt_mask = {
-       DCN31_AFMT_MASK_SH_LIST(_MASK)
-};
-
-#define apg_regs(id)\
-[id] = {\
-       APG_DCN31_REG_LIST(id)\
-}
-
-static const struct dcn31_apg_registers apg_regs[] = {
-       apg_regs(0),
-       apg_regs(1),
-       apg_regs(2),
-       apg_regs(3)
-};
-
-static const struct dcn31_apg_shift apg_shift = {
-       DCN31_APG_MASK_SH_LIST(__SHIFT)
-};
-
-static const struct dcn31_apg_mask apg_mask = {
-               DCN31_APG_MASK_SH_LIST(_MASK)
-};
-
-#define stream_enc_regs(id)\
-[id] = {\
-               SE_DCN314_REG_LIST(id)\
-}
-
-static const struct dcn10_stream_enc_registers stream_enc_regs[] = {
-       stream_enc_regs(0),
-       stream_enc_regs(1),
-       stream_enc_regs(2),
-       stream_enc_regs(3),
-       stream_enc_regs(4)
-};
-
-static const struct dcn10_stream_encoder_shift se_shift = {
-               SE_COMMON_MASK_SH_LIST_DCN314(__SHIFT)
-};
-
-static const struct dcn10_stream_encoder_mask se_mask = {
-               SE_COMMON_MASK_SH_LIST_DCN314(_MASK)
-};
-
-
-#define aux_regs(id)\
-[id] = {\
-       DCN2_AUX_REG_LIST(id)\
-}
-
-static const struct dcn10_link_enc_aux_registers link_enc_aux_regs[] = {
-               aux_regs(0),
-               aux_regs(1),
-               aux_regs(2),
-               aux_regs(3),
-               aux_regs(4)
-};
-
-#define hpd_regs(id)\
-[id] = {\
-       HPD_REG_LIST(id)\
-}
-
-static const struct dcn10_link_enc_hpd_registers link_enc_hpd_regs[] = {
-               hpd_regs(0),
-               hpd_regs(1),
-               hpd_regs(2),
-               hpd_regs(3),
-               hpd_regs(4)
-};
-
-#define link_regs(id, phyid)\
-[id] = {\
-       LE_DCN31_REG_LIST(id), \
-       UNIPHY_DCN2_REG_LIST(phyid), \
-}
-
-static const struct dce110_aux_registers_shift aux_shift = {
-       DCN_AUX_MASK_SH_LIST(__SHIFT)
-};
-
-static const struct dce110_aux_registers_mask aux_mask = {
-       DCN_AUX_MASK_SH_LIST(_MASK)
-};
-
-static const struct dcn10_link_enc_registers link_enc_regs[] = {
-       link_regs(0, A),
-       link_regs(1, B),
-       link_regs(2, C),
-       link_regs(3, D),
-       link_regs(4, E)
-};
-
-static const struct dcn10_link_enc_shift le_shift = {
-       LINK_ENCODER_MASK_SH_LIST_DCN31(__SHIFT),
-       DPCS_DCN31_MASK_SH_LIST(__SHIFT)
-};
-
-static const struct dcn10_link_enc_mask le_mask = {
-       LINK_ENCODER_MASK_SH_LIST_DCN31(_MASK),
-       DPCS_DCN31_MASK_SH_LIST(_MASK)
-};
-
-#define hpo_dp_stream_encoder_reg_list(id)\
-[id] = {\
-       DCN3_1_HPO_DP_STREAM_ENC_REG_LIST(id)\
-}
-
-static const struct dcn31_hpo_dp_stream_encoder_registers hpo_dp_stream_enc_regs[] = {
-       hpo_dp_stream_encoder_reg_list(0),
-       hpo_dp_stream_encoder_reg_list(1),
-       hpo_dp_stream_encoder_reg_list(2),
-       hpo_dp_stream_encoder_reg_list(3)
-};
-
-static const struct dcn31_hpo_dp_stream_encoder_shift hpo_dp_se_shift = {
-       DCN3_1_HPO_DP_STREAM_ENC_MASK_SH_LIST(__SHIFT)
-};
-
-static const struct dcn31_hpo_dp_stream_encoder_mask hpo_dp_se_mask = {
-       DCN3_1_HPO_DP_STREAM_ENC_MASK_SH_LIST(_MASK)
-};
-
-
-#define hpo_dp_link_encoder_reg_list(id)\
-[id] = {\
-       DCN3_1_HPO_DP_LINK_ENC_REG_LIST(id),\
-       DCN3_1_RDPCSTX_REG_LIST(0),\
-       DCN3_1_RDPCSTX_REG_LIST(1),\
-       DCN3_1_RDPCSTX_REG_LIST(2),\
-}
-
-static const struct dcn31_hpo_dp_link_encoder_registers hpo_dp_link_enc_regs[] = {
-       hpo_dp_link_encoder_reg_list(0),
-       hpo_dp_link_encoder_reg_list(1),
-};
-
-static const struct dcn31_hpo_dp_link_encoder_shift hpo_dp_le_shift = {
-       DCN3_1_HPO_DP_LINK_ENC_MASK_SH_LIST(__SHIFT)
-};
-
-static const struct dcn31_hpo_dp_link_encoder_mask hpo_dp_le_mask = {
-       DCN3_1_HPO_DP_LINK_ENC_MASK_SH_LIST(_MASK)
-};
-
-#define dpp_regs(id)\
-[id] = {\
-       DPP_REG_LIST_DCN30(id),\
-}
-
-static const struct dcn3_dpp_registers dpp_regs[] = {
-       dpp_regs(0),
-       dpp_regs(1),
-       dpp_regs(2),
-       dpp_regs(3)
-};
-
-static const struct dcn3_dpp_shift tf_shift = {
-               DPP_REG_LIST_SH_MASK_DCN30(__SHIFT)
-};
-
-static const struct dcn3_dpp_mask tf_mask = {
-               DPP_REG_LIST_SH_MASK_DCN30(_MASK)
-};
-
-#define opp_regs(id)\
-[id] = {\
-       OPP_REG_LIST_DCN30(id),\
-}
-
-static const struct dcn20_opp_registers opp_regs[] = {
-       opp_regs(0),
-       opp_regs(1),
-       opp_regs(2),
-       opp_regs(3)
-};
-
-static const struct dcn20_opp_shift opp_shift = {
-       OPP_MASK_SH_LIST_DCN20(__SHIFT)
-};
-
-static const struct dcn20_opp_mask opp_mask = {
-       OPP_MASK_SH_LIST_DCN20(_MASK)
-};
-
-#define aux_engine_regs(id)\
-[id] = {\
-       AUX_COMMON_REG_LIST0(id), \
-       .AUXN_IMPCAL = 0, \
-       .AUXP_IMPCAL = 0, \
-       .AUX_RESET_MASK = DP_AUX0_AUX_CONTROL__AUX_RESET_MASK, \
-}
-
-static const struct dce110_aux_registers aux_engine_regs[] = {
-               aux_engine_regs(0),
-               aux_engine_regs(1),
-               aux_engine_regs(2),
-               aux_engine_regs(3),
-               aux_engine_regs(4)
-};
-
-#define dwbc_regs_dcn3(id)\
-[id] = {\
-       DWBC_COMMON_REG_LIST_DCN30(id),\
-}
-
-static const struct dcn30_dwbc_registers dwbc30_regs[] = {
-       dwbc_regs_dcn3(0),
-};
-
-static const struct dcn30_dwbc_shift dwbc30_shift = {
-       DWBC_COMMON_MASK_SH_LIST_DCN30(__SHIFT)
-};
-
-static const struct dcn30_dwbc_mask dwbc30_mask = {
-       DWBC_COMMON_MASK_SH_LIST_DCN30(_MASK)
-};
-
-#define mcif_wb_regs_dcn3(id)\
-[id] = {\
-       MCIF_WB_COMMON_REG_LIST_DCN30(id),\
-}
-
-static const struct dcn30_mmhubbub_registers mcif_wb30_regs[] = {
-       mcif_wb_regs_dcn3(0)
-};
-
-static const struct dcn30_mmhubbub_shift mcif_wb30_shift = {
-       MCIF_WB_COMMON_MASK_SH_LIST_DCN30(__SHIFT)
-};
-
-static const struct dcn30_mmhubbub_mask mcif_wb30_mask = {
-       MCIF_WB_COMMON_MASK_SH_LIST_DCN30(_MASK)
-};
-
-#define dsc_regsDCN314(id)\
-[id] = {\
-       DSC_REG_LIST_DCN20(id)\
-}
-
-static const struct dcn20_dsc_registers dsc_regs[] = {
-       dsc_regsDCN314(0),
-       dsc_regsDCN314(1),
-       dsc_regsDCN314(2),
-       dsc_regsDCN314(3)
-};
-
-static const struct dcn20_dsc_shift dsc_shift = {
-       DSC_REG_LIST_SH_MASK_DCN20(__SHIFT)
-};
-
-static const struct dcn20_dsc_mask dsc_mask = {
-       DSC_REG_LIST_SH_MASK_DCN20(_MASK)
-};
-
-static const struct dcn30_mpc_registers mpc_regs = {
-               MPC_REG_LIST_DCN3_0(0),
-               MPC_REG_LIST_DCN3_0(1),
-               MPC_REG_LIST_DCN3_0(2),
-               MPC_REG_LIST_DCN3_0(3),
-               MPC_OUT_MUX_REG_LIST_DCN3_0(0),
-               MPC_OUT_MUX_REG_LIST_DCN3_0(1),
-               MPC_OUT_MUX_REG_LIST_DCN3_0(2),
-               MPC_OUT_MUX_REG_LIST_DCN3_0(3),
-               MPC_RMU_GLOBAL_REG_LIST_DCN3AG,
-               MPC_RMU_REG_LIST_DCN3AG(0),
-               MPC_RMU_REG_LIST_DCN3AG(1),
-               //MPC_RMU_REG_LIST_DCN3AG(2),
-               MPC_DWB_MUX_REG_LIST_DCN3_0(0),
-};
-
-static const struct dcn30_mpc_shift mpc_shift = {
-       MPC_COMMON_MASK_SH_LIST_DCN30(__SHIFT)
-};
-
-static const struct dcn30_mpc_mask mpc_mask = {
-       MPC_COMMON_MASK_SH_LIST_DCN30(_MASK)
-};
-
-#define optc_regs(id)\
-[id] = {OPTC_COMMON_REG_LIST_DCN3_14(id)}
-
-static const struct dcn_optc_registers optc_regs[] = {
-       optc_regs(0),
-       optc_regs(1),
-       optc_regs(2),
-       optc_regs(3)
-};
-
-static const struct dcn_optc_shift optc_shift = {
-       OPTC_COMMON_MASK_SH_LIST_DCN3_14(__SHIFT)
-};
-
-static const struct dcn_optc_mask optc_mask = {
-       OPTC_COMMON_MASK_SH_LIST_DCN3_14(_MASK)
-};
-
-#define hubp_regs(id)\
-[id] = {\
-       HUBP_REG_LIST_DCN30(id)\
-}
-
-static const struct dcn_hubp2_registers hubp_regs[] = {
-               hubp_regs(0),
-               hubp_regs(1),
-               hubp_regs(2),
-               hubp_regs(3)
-};
-
-
-static const struct dcn_hubp2_shift hubp_shift = {
-               HUBP_MASK_SH_LIST_DCN31(__SHIFT)
-};
-
-static const struct dcn_hubp2_mask hubp_mask = {
-               HUBP_MASK_SH_LIST_DCN31(_MASK)
-};
-static const struct dcn_hubbub_registers hubbub_reg = {
-               HUBBUB_REG_LIST_DCN31(0)
-};
-
-static const struct dcn_hubbub_shift hubbub_shift = {
-               HUBBUB_MASK_SH_LIST_DCN31(__SHIFT)
-};
-
-static const struct dcn_hubbub_mask hubbub_mask = {
-               HUBBUB_MASK_SH_LIST_DCN31(_MASK)
-};
-
-static const struct dccg_registers dccg_regs = {
-               DCCG_REG_LIST_DCN314()
-};
-
-static const struct dccg_shift dccg_shift = {
-               DCCG_MASK_SH_LIST_DCN314(__SHIFT)
-};
-
-static const struct dccg_mask dccg_mask = {
-               DCCG_MASK_SH_LIST_DCN314(_MASK)
-};
-
-
-#define SRII2(reg_name_pre, reg_name_post, id)\
-       .reg_name_pre ## _ ##  reg_name_post[id] = BASE(reg ## reg_name_pre \
-                       ## id ## _ ## reg_name_post ## _BASE_IDX) + \
-                       reg ## reg_name_pre ## id ## _ ## reg_name_post
-
-
-#define HWSEQ_DCN31_REG_LIST()\
-       SR(DCHUBBUB_GLOBAL_TIMER_CNTL), \
-       SR(DCHUBBUB_ARB_HOSTVM_CNTL), \
-       SR(DIO_MEM_PWR_CTRL), \
-       SR(ODM_MEM_PWR_CTRL3), \
-       SR(DMU_MEM_PWR_CNTL), \
-       SR(MMHUBBUB_MEM_PWR_CNTL), \
-       SR(DCCG_GATE_DISABLE_CNTL), \
-       SR(DCCG_GATE_DISABLE_CNTL2), \
-       SR(DCFCLK_CNTL),\
-       SR(DC_MEM_GLOBAL_PWR_REQ_CNTL), \
-       SRII(PIXEL_RATE_CNTL, OTG, 0), \
-       SRII(PIXEL_RATE_CNTL, OTG, 1),\
-       SRII(PIXEL_RATE_CNTL, OTG, 2),\
-       SRII(PIXEL_RATE_CNTL, OTG, 3),\
-       SRII(PHYPLL_PIXEL_RATE_CNTL, OTG, 0),\
-       SRII(PHYPLL_PIXEL_RATE_CNTL, OTG, 1),\
-       SRII(PHYPLL_PIXEL_RATE_CNTL, OTG, 2),\
-       SRII(PHYPLL_PIXEL_RATE_CNTL, OTG, 3),\
-       SR(MICROSECOND_TIME_BASE_DIV), \
-       SR(MILLISECOND_TIME_BASE_DIV), \
-       SR(DISPCLK_FREQ_CHANGE_CNTL), \
-       SR(RBBMIF_TIMEOUT_DIS), \
-       SR(RBBMIF_TIMEOUT_DIS_2), \
-       SR(DCHUBBUB_CRC_CTRL), \
-       SR(DPP_TOP0_DPP_CRC_CTRL), \
-       SR(DPP_TOP0_DPP_CRC_VAL_B_A), \
-       SR(DPP_TOP0_DPP_CRC_VAL_R_G), \
-       SR(MPC_CRC_CTRL), \
-       SR(MPC_CRC_RESULT_GB), \
-       SR(MPC_CRC_RESULT_C), \
-       SR(MPC_CRC_RESULT_AR), \
-       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(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(D1VGA_CONTROL), \
-       SR(D2VGA_CONTROL), \
-       SR(D3VGA_CONTROL), \
-       SR(D4VGA_CONTROL), \
-       SR(D5VGA_CONTROL), \
-       SR(D6VGA_CONTROL), \
-       SR(DC_IP_REQUEST_CNTL), \
-       SR(AZALIA_AUDIO_DTO), \
-       SR(AZALIA_CONTROLLER_CLOCK_GATING), \
-       SR(HPO_TOP_HW_CONTROL)
-
-static const struct dce_hwseq_registers hwseq_reg = {
-               HWSEQ_DCN31_REG_LIST()
-};
-
-#define HWSEQ_DCN31_MASK_SH_LIST(mask_sh)\
-       HWSEQ_DCN_MASK_SH_LIST(mask_sh), \
-       HWS_SF(, DCHUBBUB_GLOBAL_TIMER_CNTL, DCHUBBUB_GLOBAL_TIMER_REFDIV, mask_sh), \
-       HWS_SF(, DCHUBBUB_ARB_HOSTVM_CNTL, DISABLE_HOSTVM_FORCE_ALLOW_PSTATE, mask_sh), \
-       HWS_SF(, DOMAIN0_PG_CONFIG, DOMAIN_POWER_FORCEON, mask_sh), \
-       HWS_SF(, DOMAIN0_PG_CONFIG, DOMAIN_POWER_GATE, mask_sh), \
-       HWS_SF(, DOMAIN1_PG_CONFIG, DOMAIN_POWER_FORCEON, mask_sh), \
-       HWS_SF(, DOMAIN1_PG_CONFIG, DOMAIN_POWER_GATE, mask_sh), \
-       HWS_SF(, DOMAIN2_PG_CONFIG, DOMAIN_POWER_FORCEON, mask_sh), \
-       HWS_SF(, DOMAIN2_PG_CONFIG, DOMAIN_POWER_GATE, mask_sh), \
-       HWS_SF(, DOMAIN3_PG_CONFIG, DOMAIN_POWER_FORCEON, mask_sh), \
-       HWS_SF(, DOMAIN3_PG_CONFIG, DOMAIN_POWER_GATE, mask_sh), \
-       HWS_SF(, DOMAIN16_PG_CONFIG, DOMAIN_POWER_FORCEON, mask_sh), \
-       HWS_SF(, DOMAIN16_PG_CONFIG, DOMAIN_POWER_GATE, mask_sh), \
-       HWS_SF(, DOMAIN17_PG_CONFIG, DOMAIN_POWER_FORCEON, mask_sh), \
-       HWS_SF(, DOMAIN17_PG_CONFIG, DOMAIN_POWER_GATE, mask_sh), \
-       HWS_SF(, DOMAIN18_PG_CONFIG, DOMAIN_POWER_FORCEON, mask_sh), \
-       HWS_SF(, DOMAIN18_PG_CONFIG, DOMAIN_POWER_GATE, mask_sh), \
-       HWS_SF(, DOMAIN19_PG_CONFIG, DOMAIN_POWER_FORCEON, mask_sh), \
-       HWS_SF(, DOMAIN19_PG_CONFIG, DOMAIN_POWER_GATE, mask_sh), \
-       HWS_SF(, DOMAIN0_PG_STATUS, DOMAIN_PGFSM_PWR_STATUS, mask_sh), \
-       HWS_SF(, DOMAIN1_PG_STATUS, DOMAIN_PGFSM_PWR_STATUS, mask_sh), \
-       HWS_SF(, DOMAIN2_PG_STATUS, DOMAIN_PGFSM_PWR_STATUS, mask_sh), \
-       HWS_SF(, DOMAIN3_PG_STATUS, DOMAIN_PGFSM_PWR_STATUS, mask_sh), \
-       HWS_SF(, DOMAIN16_PG_STATUS, DOMAIN_PGFSM_PWR_STATUS, mask_sh), \
-       HWS_SF(, DOMAIN17_PG_STATUS, DOMAIN_PGFSM_PWR_STATUS, mask_sh), \
-       HWS_SF(, DOMAIN18_PG_STATUS, DOMAIN_PGFSM_PWR_STATUS, mask_sh), \
-       HWS_SF(, DOMAIN19_PG_STATUS, DOMAIN_PGFSM_PWR_STATUS, mask_sh), \
-       HWS_SF(, DC_IP_REQUEST_CNTL, IP_REQUEST_EN, mask_sh), \
-       HWS_SF(, AZALIA_AUDIO_DTO, AZALIA_AUDIO_DTO_MODULE, mask_sh), \
-       HWS_SF(, HPO_TOP_CLOCK_CONTROL, HPO_HDMISTREAMCLK_G_GATE_DIS, mask_sh), \
-       HWS_SF(, DMU_MEM_PWR_CNTL, DMCU_ERAM_MEM_PWR_FORCE, mask_sh), \
-       HWS_SF(, ODM_MEM_PWR_CTRL3, ODM_MEM_UNASSIGNED_PWR_MODE, mask_sh), \
-       HWS_SF(, ODM_MEM_PWR_CTRL3, ODM_MEM_VBLANK_PWR_MODE, mask_sh), \
-       HWS_SF(, MMHUBBUB_MEM_PWR_CNTL, VGA_MEM_PWR_FORCE, mask_sh), \
-       HWS_SF(, DIO_MEM_PWR_CTRL, I2C_LIGHT_SLEEP_FORCE, mask_sh), \
-       HWS_SF(, HPO_TOP_HW_CONTROL, HPO_IO_EN, mask_sh)
-
-static const struct dce_hwseq_shift hwseq_shift = {
-               HWSEQ_DCN31_MASK_SH_LIST(__SHIFT)
-};
-
-static const struct dce_hwseq_mask hwseq_mask = {
-               HWSEQ_DCN31_MASK_SH_LIST(_MASK)
-};
-#define vmid_regs(id)\
-[id] = {\
-               DCN20_VMID_REG_LIST(id)\
-}
-
-static const struct dcn_vmid_registers vmid_regs[] = {
-       vmid_regs(0),
-       vmid_regs(1),
-       vmid_regs(2),
-       vmid_regs(3),
-       vmid_regs(4),
-       vmid_regs(5),
-       vmid_regs(6),
-       vmid_regs(7),
-       vmid_regs(8),
-       vmid_regs(9),
-       vmid_regs(10),
-       vmid_regs(11),
-       vmid_regs(12),
-       vmid_regs(13),
-       vmid_regs(14),
-       vmid_regs(15)
-};
-
-static const struct dcn20_vmid_shift vmid_shifts = {
-               DCN20_VMID_MASK_SH_LIST(__SHIFT)
-};
-
-static const struct dcn20_vmid_mask vmid_masks = {
-               DCN20_VMID_MASK_SH_LIST(_MASK)
-};
-
-static const struct resource_caps res_cap_dcn314 = {
-       .num_timing_generator = 4,
-       .num_opp = 4,
-       .num_video_plane = 4,
-       .num_audio = 5,
-       .num_stream_encoder = 5,
-       .num_dig_link_enc = 5,
-       .num_hpo_dp_stream_encoder = 4,
-       .num_hpo_dp_link_encoder = 2,
-       .num_pll = 5,
-       .num_dwb = 1,
-       .num_ddc = 5,
-       .num_vmid = 16,
-       .num_mpc_3dlut = 2,
-       .num_dsc = 4,
-};
-
-static const struct dc_plane_cap plane_cap = {
-       .type = DC_PLANE_TYPE_DCN_UNIVERSAL,
-       .per_pixel_alpha = true,
-
-       .pixel_format_support = {
-                       .argb8888 = true,
-                       .nv12 = true,
-                       .fp16 = true,
-                       .p010 = true,
-                       .ayuv = false,
-       },
-
-       .max_upscale_factor = {
-                       .argb8888 = 16000,
-                       .nv12 = 16000,
-                       .fp16 = 16000
-       },
-
-       // 6:1 downscaling ratio: 1000/6 = 166.666
-       // 4:1 downscaling ratio for ARGB888 to prevent underflow during P010 playback: 1000/4 = 250
-       .max_downscale_factor = {
-                       .argb8888 = 250,
-                       .nv12 = 167,
-                       .fp16 = 167
-       },
-       64,
-       64
-};
-
-static const struct dc_debug_options debug_defaults_drv = {
-       .disable_z10 = false,
-       .enable_z9_disable_interface = true,
-       .minimum_z8_residency_time = 2000,
-       .psr_skip_crtc_disable = true,
-       .replay_skip_crtc_disabled = true,
-       .disable_dmcu = true,
-       .force_abm_enable = false,
-       .timing_trace = false,
-       .clock_trace = true,
-       .disable_dpp_power_gate = false,
-       .disable_hubp_power_gate = false,
-       .disable_pplib_clock_request = false,
-       .pipe_split_policy = MPC_SPLIT_DYNAMIC,
-       .force_single_disp_pipe_split = false,
-       .disable_dcc = DCC_ENABLE,
-       .vsr_support = true,
-       .performance_trace = false,
-       .max_downscale_src_width = 4096,/*upto true 4k*/
-       .disable_pplib_wm_range = false,
-       .scl_reset_length10 = true,
-       .sanity_checks = true,
-       .underflow_assert_delay_us = 0xFFFFFFFF,
-       .dwb_fi_phase = -1, // -1 = disable,
-       .dmub_command_table = true,
-       .pstate_enabled = true,
-       .use_max_lb = true,
-       .enable_mem_low_power = {
-               .bits = {
-                       .vga = true,
-                       .i2c = true,
-                       .dmcu = false, // This is previously known to cause hang on S3 cycles if enabled
-                       .dscl = true,
-                       .cm = true,
-                       .mpc = true,
-                       .optc = true,
-                       .vpg = true,
-                       .afmt = true,
-               }
-       },
-
-       .root_clock_optimization = {
-                       .bits = {
-                                       .dpp = true,
-                                       .dsc = true,
-                                       .hdmistream = true,
-                                       .hdmichar = true,
-                                       .dpstream = true,
-                                       .symclk32_se = false,
-                                       .symclk32_le = true,
-                                       .symclk_fe = true,
-                                       .physymclk = true,
-                                       .dpiasymclk = true,
-                       }
-       },
-
-       .seamless_boot_odm_combine = true,
-       .using_dml2 = false,
-};
-
-static const struct dc_debug_options debug_defaults_diags = {
-       .disable_dmcu = true,
-       .force_abm_enable = false,
-       .timing_trace = true,
-       .clock_trace = true,
-       .disable_dpp_power_gate = true,
-       .disable_hubp_power_gate = true,
-       .disable_clock_gate = true,
-       .disable_pplib_clock_request = true,
-       .disable_pplib_wm_range = true,
-       .disable_stutter = false,
-       .scl_reset_length10 = true,
-       .dwb_fi_phase = -1, // -1 = disable
-       .dmub_command_table = true,
-       .enable_tri_buf = true,
-       .use_max_lb = true
-};
-
-static const struct dc_panel_config panel_config_defaults = {
-       .psr = {
-               .disable_psr = false,
-               .disallow_psrsu = false,
-               .disallow_replay = false,
-       },
-       .ilr = {
-               .optimize_edp_link_rate = true,
-       },
-};
-
-static void dcn31_dpp_destroy(struct dpp **dpp)
-{
-       kfree(TO_DCN20_DPP(*dpp));
-       *dpp = NULL;
-}
-
-static struct dpp *dcn31_dpp_create(
-       struct dc_context *ctx,
-       uint32_t inst)
-{
-       struct dcn3_dpp *dpp =
-               kzalloc(sizeof(struct dcn3_dpp), GFP_KERNEL);
-
-       if (!dpp)
-               return NULL;
-
-       if (dpp3_construct(dpp, ctx, inst,
-                       &dpp_regs[inst], &tf_shift, &tf_mask))
-               return &dpp->base;
-
-       BREAK_TO_DEBUGGER();
-       kfree(dpp);
-       return NULL;
-}
-
-static struct output_pixel_processor *dcn31_opp_create(
-       struct dc_context *ctx, uint32_t inst)
-{
-       struct dcn20_opp *opp =
-               kzalloc(sizeof(struct dcn20_opp), GFP_KERNEL);
-
-       if (!opp) {
-               BREAK_TO_DEBUGGER();
-               return NULL;
-       }
-
-       dcn20_opp_construct(opp, ctx, inst,
-                       &opp_regs[inst], &opp_shift, &opp_mask);
-       return &opp->base;
-}
-
-static struct dce_aux *dcn31_aux_engine_create(
-       struct dc_context *ctx,
-       uint32_t inst)
-{
-       struct aux_engine_dce110 *aux_engine =
-               kzalloc(sizeof(struct aux_engine_dce110), GFP_KERNEL);
-
-       if (!aux_engine)
-               return NULL;
-
-       dce110_aux_engine_construct(aux_engine, ctx, inst,
-                                   SW_AUX_TIMEOUT_PERIOD_MULTIPLIER * AUX_TIMEOUT_PERIOD,
-                                   &aux_engine_regs[inst],
-                                       &aux_mask,
-                                       &aux_shift,
-                                       ctx->dc->caps.extended_aux_timeout_support);
-
-       return &aux_engine->base;
-}
-#define i2c_inst_regs(id) { I2C_HW_ENGINE_COMMON_REG_LIST_DCN30(id) }
-
-static const struct dce_i2c_registers i2c_hw_regs[] = {
-               i2c_inst_regs(1),
-               i2c_inst_regs(2),
-               i2c_inst_regs(3),
-               i2c_inst_regs(4),
-               i2c_inst_regs(5),
-};
-
-static const struct dce_i2c_shift i2c_shifts = {
-               I2C_COMMON_MASK_SH_LIST_DCN30(__SHIFT)
-};
-
-static const struct dce_i2c_mask i2c_masks = {
-               I2C_COMMON_MASK_SH_LIST_DCN30(_MASK)
-};
-
-/* ========================================================== */
-
-/*
- * DPIA index | Preferred Encoder     |    Host Router
- *   0        |      C                |       0
- *   1        |      First Available  |       0
- *   2        |      D                |       1
- *   3        |      First Available  |       1
- */
-/* ========================================================== */
-static const enum engine_id dpia_to_preferred_enc_id_table[] = {
-               ENGINE_ID_DIGC,
-               ENGINE_ID_DIGC,
-               ENGINE_ID_DIGD,
-               ENGINE_ID_DIGD
-};
-
-static enum engine_id dcn314_get_preferred_eng_id_dpia(unsigned int dpia_index)
-{
-       return dpia_to_preferred_enc_id_table[dpia_index];
-}
-
-static struct dce_i2c_hw *dcn31_i2c_hw_create(
-       struct dc_context *ctx,
-       uint32_t inst)
-{
-       struct dce_i2c_hw *dce_i2c_hw =
-               kzalloc(sizeof(struct dce_i2c_hw), GFP_KERNEL);
-
-       if (!dce_i2c_hw)
-               return NULL;
-
-       dcn2_i2c_hw_construct(dce_i2c_hw, ctx, inst,
-                                   &i2c_hw_regs[inst], &i2c_shifts, &i2c_masks);
-
-       return dce_i2c_hw;
-}
-static struct mpc *dcn31_mpc_create(
-               struct dc_context *ctx,
-               int num_mpcc,
-               int num_rmu)
-{
-       struct dcn30_mpc *mpc30 = kzalloc(sizeof(struct dcn30_mpc),
-                                         GFP_KERNEL);
-
-       if (!mpc30)
-               return NULL;
-
-       dcn30_mpc_construct(mpc30, ctx,
-                       &mpc_regs,
-                       &mpc_shift,
-                       &mpc_mask,
-                       num_mpcc,
-                       num_rmu);
-
-       return &mpc30->base;
-}
-
-static struct hubbub *dcn31_hubbub_create(struct dc_context *ctx)
-{
-       int i;
-
-       struct dcn20_hubbub *hubbub3 = kzalloc(sizeof(struct dcn20_hubbub),
-                                         GFP_KERNEL);
-
-       if (!hubbub3)
-               return NULL;
-
-       hubbub31_construct(hubbub3, ctx,
-                       &hubbub_reg,
-                       &hubbub_shift,
-                       &hubbub_mask,
-                       dcn3_14_ip.det_buffer_size_kbytes,
-                       dcn3_14_ip.pixel_chunk_size_kbytes,
-                       dcn3_14_ip.config_return_buffer_size_in_kbytes);
-
-
-       for (i = 0; i < res_cap_dcn314.num_vmid; i++) {
-               struct dcn20_vmid *vmid = &hubbub3->vmid[i];
-
-               vmid->ctx = ctx;
-
-               vmid->regs = &vmid_regs[i];
-               vmid->shifts = &vmid_shifts;
-               vmid->masks = &vmid_masks;
-       }
-
-       return &hubbub3->base;
-}
-
-static struct timing_generator *dcn31_timing_generator_create(
-               struct dc_context *ctx,
-               uint32_t instance)
-{
-       struct optc *tgn10 =
-               kzalloc(sizeof(struct optc), GFP_KERNEL);
-
-       if (!tgn10)
-               return NULL;
-
-       tgn10->base.inst = instance;
-       tgn10->base.ctx = ctx;
-
-       tgn10->tg_regs = &optc_regs[instance];
-       tgn10->tg_shift = &optc_shift;
-       tgn10->tg_mask = &optc_mask;
-
-       dcn314_timing_generator_init(tgn10);
-
-       return &tgn10->base;
-}
-
-static const struct encoder_feature_support link_enc_feature = {
-               .max_hdmi_deep_color = COLOR_DEPTH_121212,
-               .max_hdmi_pixel_clock = 600000,
-               .hdmi_ycbcr420_supported = true,
-               .dp_ycbcr420_supported = true,
-               .fec_supported = true,
-               .flags.bits.IS_HBR2_CAPABLE = true,
-               .flags.bits.IS_HBR3_CAPABLE = true,
-               .flags.bits.IS_TPS3_CAPABLE = true,
-               .flags.bits.IS_TPS4_CAPABLE = true
-};
-
-static struct link_encoder *dcn31_link_encoder_create(
-       struct dc_context *ctx,
-       const struct encoder_init_data *enc_init_data)
-{
-       struct dcn20_link_encoder *enc20 =
-               kzalloc(sizeof(struct dcn20_link_encoder), GFP_KERNEL);
-
-       if (!enc20)
-               return NULL;
-
-       dcn31_link_encoder_construct(enc20,
-                       enc_init_data,
-                       &link_enc_feature,
-                       &link_enc_regs[enc_init_data->transmitter],
-                       &link_enc_aux_regs[enc_init_data->channel - 1],
-                       &link_enc_hpd_regs[enc_init_data->hpd_source],
-                       &le_shift,
-                       &le_mask);
-
-       return &enc20->enc10.base;
-}
-
-/* Create a minimal link encoder object not associated with a particular
- * physical connector.
- * resource_funcs.link_enc_create_minimal
- */
-static struct link_encoder *dcn31_link_enc_create_minimal(
-               struct dc_context *ctx, enum engine_id eng_id)
-{
-       struct dcn20_link_encoder *enc20;
-
-       if ((eng_id - ENGINE_ID_DIGA) > ctx->dc->res_pool->res_cap->num_dig_link_enc)
-               return NULL;
-
-       enc20 = kzalloc(sizeof(struct dcn20_link_encoder), GFP_KERNEL);
-       if (!enc20)
-               return NULL;
-
-       dcn31_link_encoder_construct_minimal(
-                       enc20,
-                       ctx,
-                       &link_enc_feature,
-                       &link_enc_regs[eng_id - ENGINE_ID_DIGA],
-                       eng_id);
-
-       return &enc20->enc10.base;
-}
-
-static struct panel_cntl *dcn31_panel_cntl_create(const struct panel_cntl_init_data *init_data)
-{
-       struct dcn31_panel_cntl *panel_cntl =
-               kzalloc(sizeof(struct dcn31_panel_cntl), GFP_KERNEL);
-
-       if (!panel_cntl)
-               return NULL;
-
-       dcn31_panel_cntl_construct(panel_cntl, init_data);
-
-       return &panel_cntl->base;
-}
-
-static void read_dce_straps(
-       struct dc_context *ctx,
-       struct resource_straps *straps)
-{
-       generic_reg_get(ctx, regDC_PINSTRAPS + BASE(regDC_PINSTRAPS_BASE_IDX),
-               FN(DC_PINSTRAPS, DC_PINSTRAPS_AUDIO), &straps->dc_pinstraps_audio);
-
-}
-
-static struct audio *dcn31_create_audio(
-               struct dc_context *ctx, unsigned int inst)
-{
-       return dce_audio_create(ctx, inst,
-                       &audio_regs[inst], &audio_shift, &audio_mask);
-}
-
-static struct vpg *dcn31_vpg_create(
-       struct dc_context *ctx,
-       uint32_t inst)
-{
-       struct dcn31_vpg *vpg31 = kzalloc(sizeof(struct dcn31_vpg), GFP_KERNEL);
-
-       if (!vpg31)
-               return NULL;
-
-       vpg31_construct(vpg31, ctx, inst,
-                       &vpg_regs[inst],
-                       &vpg_shift,
-                       &vpg_mask);
-
-       return &vpg31->base;
-}
-
-static struct afmt *dcn31_afmt_create(
-       struct dc_context *ctx,
-       uint32_t inst)
-{
-       struct dcn31_afmt *afmt31 = kzalloc(sizeof(struct dcn31_afmt), GFP_KERNEL);
-
-       if (!afmt31)
-               return NULL;
-
-       afmt31_construct(afmt31, ctx, inst,
-                       &afmt_regs[inst],
-                       &afmt_shift,
-                       &afmt_mask);
-
-       // Light sleep by default, no need to power down here
-
-       return &afmt31->base;
-}
-
-static struct apg *dcn31_apg_create(
-       struct dc_context *ctx,
-       uint32_t inst)
-{
-       struct dcn31_apg *apg31 = kzalloc(sizeof(struct dcn31_apg), GFP_KERNEL);
-
-       if (!apg31)
-               return NULL;
-
-       apg31_construct(apg31, ctx, inst,
-                       &apg_regs[inst],
-                       &apg_shift,
-                       &apg_mask);
-
-       return &apg31->base;
-}
-
-static struct stream_encoder *dcn314_stream_encoder_create(
-       enum engine_id eng_id,
-       struct dc_context *ctx)
-{
-       struct dcn10_stream_encoder *enc1;
-       struct vpg *vpg;
-       struct afmt *afmt;
-       int vpg_inst;
-       int afmt_inst;
-
-       /* Mapping of VPG, AFMT, DME register blocks to DIO block instance */
-       if (eng_id < ENGINE_ID_DIGF) {
-               vpg_inst = eng_id;
-               afmt_inst = eng_id;
-       } else
-               return NULL;
-
-       enc1 = kzalloc(sizeof(struct dcn10_stream_encoder), GFP_KERNEL);
-       vpg = dcn31_vpg_create(ctx, vpg_inst);
-       afmt = dcn31_afmt_create(ctx, afmt_inst);
-
-       if (!enc1 || !vpg || !afmt) {
-               kfree(enc1);
-               kfree(vpg);
-               kfree(afmt);
-               return NULL;
-       }
-
-       dcn314_dio_stream_encoder_construct(enc1, ctx, ctx->dc_bios,
-                                       eng_id, vpg, afmt,
-                                       &stream_enc_regs[eng_id],
-                                       &se_shift, &se_mask);
-
-       return &enc1->base;
-}
-
-static struct hpo_dp_stream_encoder *dcn31_hpo_dp_stream_encoder_create(
-       enum engine_id eng_id,
-       struct dc_context *ctx)
-{
-       struct dcn31_hpo_dp_stream_encoder *hpo_dp_enc31;
-       struct vpg *vpg;
-       struct apg *apg;
-       uint32_t hpo_dp_inst;
-       uint32_t vpg_inst;
-       uint32_t apg_inst;
-
-       ASSERT((eng_id >= ENGINE_ID_HPO_DP_0) && (eng_id <= ENGINE_ID_HPO_DP_3));
-       hpo_dp_inst = eng_id - ENGINE_ID_HPO_DP_0;
-
-       /* Mapping of VPG register blocks to HPO DP block instance:
-        * VPG[6] -> HPO_DP[0]
-        * VPG[7] -> HPO_DP[1]
-        * VPG[8] -> HPO_DP[2]
-        * VPG[9] -> HPO_DP[3]
-        */
-       //Uses offset index 5-8, but actually maps to vpg_inst 6-9
-       vpg_inst = hpo_dp_inst + 5;
-
-       /* Mapping of APG register blocks to HPO DP block instance:
-        * APG[0] -> HPO_DP[0]
-        * APG[1] -> HPO_DP[1]
-        * APG[2] -> HPO_DP[2]
-        * APG[3] -> HPO_DP[3]
-        */
-       apg_inst = hpo_dp_inst;
-
-       /* allocate HPO stream encoder and create VPG sub-block */
-       hpo_dp_enc31 = kzalloc(sizeof(struct dcn31_hpo_dp_stream_encoder), GFP_KERNEL);
-       vpg = dcn31_vpg_create(ctx, vpg_inst);
-       apg = dcn31_apg_create(ctx, apg_inst);
-
-       if (!hpo_dp_enc31 || !vpg || !apg) {
-               kfree(hpo_dp_enc31);
-               kfree(vpg);
-               kfree(apg);
-               return NULL;
-       }
-
-       dcn31_hpo_dp_stream_encoder_construct(hpo_dp_enc31, ctx, ctx->dc_bios,
-                                       hpo_dp_inst, eng_id, vpg, apg,
-                                       &hpo_dp_stream_enc_regs[hpo_dp_inst],
-                                       &hpo_dp_se_shift, &hpo_dp_se_mask);
-
-       return &hpo_dp_enc31->base;
-}
-
-static struct hpo_dp_link_encoder *dcn31_hpo_dp_link_encoder_create(
-       uint8_t inst,
-       struct dc_context *ctx)
-{
-       struct dcn31_hpo_dp_link_encoder *hpo_dp_enc31;
-
-       /* allocate HPO link encoder */
-       hpo_dp_enc31 = kzalloc(sizeof(struct dcn31_hpo_dp_link_encoder), GFP_KERNEL);
-
-       hpo_dp_link_encoder31_construct(hpo_dp_enc31, ctx, inst,
-                                       &hpo_dp_link_enc_regs[inst],
-                                       &hpo_dp_le_shift, &hpo_dp_le_mask);
-
-       return &hpo_dp_enc31->base;
-}
-
-static struct dce_hwseq *dcn314_hwseq_create(
-       struct dc_context *ctx)
-{
-       struct dce_hwseq *hws = kzalloc(sizeof(struct dce_hwseq), GFP_KERNEL);
-
-       if (hws) {
-               hws->ctx = ctx;
-               hws->regs = &hwseq_reg;
-               hws->shifts = &hwseq_shift;
-               hws->masks = &hwseq_mask;
-       }
-       return hws;
-}
-static const struct resource_create_funcs res_create_funcs = {
-       .read_dce_straps = read_dce_straps,
-       .create_audio = dcn31_create_audio,
-       .create_stream_encoder = dcn314_stream_encoder_create,
-       .create_hpo_dp_stream_encoder = dcn31_hpo_dp_stream_encoder_create,
-       .create_hpo_dp_link_encoder = dcn31_hpo_dp_link_encoder_create,
-       .create_hwseq = dcn314_hwseq_create,
-};
-
-static void dcn314_resource_destruct(struct dcn314_resource_pool *pool)
-{
-       unsigned int i;
-
-       for (i = 0; i < pool->base.stream_enc_count; i++) {
-               if (pool->base.stream_enc[i] != NULL) {
-                       if (pool->base.stream_enc[i]->vpg != NULL) {
-                               kfree(DCN30_VPG_FROM_VPG(pool->base.stream_enc[i]->vpg));
-                               pool->base.stream_enc[i]->vpg = NULL;
-                       }
-                       if (pool->base.stream_enc[i]->afmt != NULL) {
-                               kfree(DCN30_AFMT_FROM_AFMT(pool->base.stream_enc[i]->afmt));
-                               pool->base.stream_enc[i]->afmt = NULL;
-                       }
-                       kfree(DCN10STRENC_FROM_STRENC(pool->base.stream_enc[i]));
-                       pool->base.stream_enc[i] = NULL;
-               }
-       }
-
-       for (i = 0; i < pool->base.hpo_dp_stream_enc_count; i++) {
-               if (pool->base.hpo_dp_stream_enc[i] != NULL) {
-                       if (pool->base.hpo_dp_stream_enc[i]->vpg != NULL) {
-                               kfree(DCN30_VPG_FROM_VPG(pool->base.hpo_dp_stream_enc[i]->vpg));
-                               pool->base.hpo_dp_stream_enc[i]->vpg = NULL;
-                       }
-                       if (pool->base.hpo_dp_stream_enc[i]->apg != NULL) {
-                               kfree(DCN31_APG_FROM_APG(pool->base.hpo_dp_stream_enc[i]->apg));
-                               pool->base.hpo_dp_stream_enc[i]->apg = NULL;
-                       }
-                       kfree(DCN3_1_HPO_DP_STREAM_ENC_FROM_HPO_STREAM_ENC(pool->base.hpo_dp_stream_enc[i]));
-                       pool->base.hpo_dp_stream_enc[i] = NULL;
-               }
-       }
-
-       for (i = 0; i < pool->base.hpo_dp_link_enc_count; i++) {
-               if (pool->base.hpo_dp_link_enc[i] != NULL) {
-                       kfree(DCN3_1_HPO_DP_LINK_ENC_FROM_HPO_LINK_ENC(pool->base.hpo_dp_link_enc[i]));
-                       pool->base.hpo_dp_link_enc[i] = NULL;
-               }
-       }
-
-       for (i = 0; i < pool->base.res_cap->num_dsc; i++) {
-               if (pool->base.dscs[i] != NULL)
-                       dcn20_dsc_destroy(&pool->base.dscs[i]);
-       }
-
-       if (pool->base.mpc != NULL) {
-               kfree(TO_DCN20_MPC(pool->base.mpc));
-               pool->base.mpc = NULL;
-       }
-       if (pool->base.hubbub != NULL) {
-               kfree(pool->base.hubbub);
-               pool->base.hubbub = NULL;
-       }
-       for (i = 0; i < pool->base.pipe_count; i++) {
-               if (pool->base.dpps[i] != NULL)
-                       dcn31_dpp_destroy(&pool->base.dpps[i]);
-
-               if (pool->base.ipps[i] != NULL)
-                       pool->base.ipps[i]->funcs->ipp_destroy(&pool->base.ipps[i]);
-
-               if (pool->base.hubps[i] != NULL) {
-                       kfree(TO_DCN20_HUBP(pool->base.hubps[i]));
-                       pool->base.hubps[i] = NULL;
-               }
-
-               if (pool->base.irqs != NULL)
-                       dal_irq_service_destroy(&pool->base.irqs);
-       }
-
-       for (i = 0; i < pool->base.res_cap->num_ddc; i++) {
-               if (pool->base.engines[i] != NULL)
-                       dce110_engine_destroy(&pool->base.engines[i]);
-               if (pool->base.hw_i2cs[i] != NULL) {
-                       kfree(pool->base.hw_i2cs[i]);
-                       pool->base.hw_i2cs[i] = NULL;
-               }
-               if (pool->base.sw_i2cs[i] != NULL) {
-                       kfree(pool->base.sw_i2cs[i]);
-                       pool->base.sw_i2cs[i] = NULL;
-               }
-       }
-
-       for (i = 0; i < pool->base.res_cap->num_opp; i++) {
-               if (pool->base.opps[i] != NULL)
-                       pool->base.opps[i]->funcs->opp_destroy(&pool->base.opps[i]);
-       }
-
-       for (i = 0; i < pool->base.res_cap->num_timing_generator; i++) {
-               if (pool->base.timing_generators[i] != NULL)    {
-                       kfree(DCN10TG_FROM_TG(pool->base.timing_generators[i]));
-                       pool->base.timing_generators[i] = NULL;
-               }
-       }
-
-       for (i = 0; i < pool->base.res_cap->num_dwb; i++) {
-               if (pool->base.dwbc[i] != NULL) {
-                       kfree(TO_DCN30_DWBC(pool->base.dwbc[i]));
-                       pool->base.dwbc[i] = NULL;
-               }
-               if (pool->base.mcif_wb[i] != NULL) {
-                       kfree(TO_DCN30_MMHUBBUB(pool->base.mcif_wb[i]));
-                       pool->base.mcif_wb[i] = NULL;
-               }
-       }
-
-       for (i = 0; i < pool->base.audio_count; i++) {
-               if (pool->base.audios[i])
-                       dce_aud_destroy(&pool->base.audios[i]);
-       }
-
-       for (i = 0; i < pool->base.clk_src_count; i++) {
-               if (pool->base.clock_sources[i] != NULL) {
-                       dcn20_clock_source_destroy(&pool->base.clock_sources[i]);
-                       pool->base.clock_sources[i] = NULL;
-               }
-       }
-
-       for (i = 0; i < pool->base.res_cap->num_mpc_3dlut; i++) {
-               if (pool->base.mpc_lut[i] != NULL) {
-                       dc_3dlut_func_release(pool->base.mpc_lut[i]);
-                       pool->base.mpc_lut[i] = NULL;
-               }
-               if (pool->base.mpc_shaper[i] != NULL) {
-                       dc_transfer_func_release(pool->base.mpc_shaper[i]);
-                       pool->base.mpc_shaper[i] = NULL;
-               }
-       }
-
-       if (pool->base.dp_clock_source != NULL) {
-               dcn20_clock_source_destroy(&pool->base.dp_clock_source);
-               pool->base.dp_clock_source = NULL;
-       }
-
-       for (i = 0; i < pool->base.res_cap->num_timing_generator; i++) {
-               if (pool->base.multiple_abms[i] != NULL)
-                       dce_abm_destroy(&pool->base.multiple_abms[i]);
-       }
-
-       if (pool->base.psr != NULL)
-               dmub_psr_destroy(&pool->base.psr);
-
-       if (pool->base.replay != NULL)
-               dmub_replay_destroy(&pool->base.replay);
-
-       if (pool->base.dccg != NULL)
-               dcn_dccg_destroy(&pool->base.dccg);
-}
-
-static struct hubp *dcn31_hubp_create(
-       struct dc_context *ctx,
-       uint32_t inst)
-{
-       struct dcn20_hubp *hubp2 =
-               kzalloc(sizeof(struct dcn20_hubp), GFP_KERNEL);
-
-       if (!hubp2)
-               return NULL;
-
-       if (hubp31_construct(hubp2, ctx, inst,
-                       &hubp_regs[inst], &hubp_shift, &hubp_mask))
-               return &hubp2->base;
-
-       BREAK_TO_DEBUGGER();
-       kfree(hubp2);
-       return NULL;
-}
-
-static bool dcn31_dwbc_create(struct dc_context *ctx, struct resource_pool *pool)
-{
-       int i;
-       uint32_t pipe_count = pool->res_cap->num_dwb;
-
-       for (i = 0; i < pipe_count; i++) {
-               struct dcn30_dwbc *dwbc30 = kzalloc(sizeof(struct dcn30_dwbc),
-                                                   GFP_KERNEL);
-
-               if (!dwbc30) {
-                       dm_error("DC: failed to create dwbc30!\n");
-                       return false;
-               }
-
-               dcn30_dwbc_construct(dwbc30, ctx,
-                               &dwbc30_regs[i],
-                               &dwbc30_shift,
-                               &dwbc30_mask,
-                               i);
-
-               pool->dwbc[i] = &dwbc30->base;
-       }
-       return true;
-}
-
-static bool dcn31_mmhubbub_create(struct dc_context *ctx, struct resource_pool *pool)
-{
-       int i;
-       uint32_t pipe_count = pool->res_cap->num_dwb;
-
-       for (i = 0; i < pipe_count; i++) {
-               struct dcn30_mmhubbub *mcif_wb30 = kzalloc(sizeof(struct dcn30_mmhubbub),
-                                                   GFP_KERNEL);
-
-               if (!mcif_wb30) {
-                       dm_error("DC: failed to create mcif_wb30!\n");
-                       return false;
-               }
-
-               dcn30_mmhubbub_construct(mcif_wb30, ctx,
-                               &mcif_wb30_regs[i],
-                               &mcif_wb30_shift,
-                               &mcif_wb30_mask,
-                               i);
-
-               pool->mcif_wb[i] = &mcif_wb30->base;
-       }
-       return true;
-}
-
-static struct display_stream_compressor *dcn314_dsc_create(
-       struct dc_context *ctx, uint32_t inst)
-{
-       struct dcn20_dsc *dsc =
-               kzalloc(sizeof(struct dcn20_dsc), GFP_KERNEL);
-
-       if (!dsc) {
-               BREAK_TO_DEBUGGER();
-               return NULL;
-       }
-
-       dsc2_construct(dsc, ctx, inst, &dsc_regs[inst], &dsc_shift, &dsc_mask);
-       return &dsc->base;
-}
-
-static void dcn314_destroy_resource_pool(struct resource_pool **pool)
-{
-       struct dcn314_resource_pool *dcn314_pool = TO_DCN314_RES_POOL(*pool);
-
-       dcn314_resource_destruct(dcn314_pool);
-       kfree(dcn314_pool);
-       *pool = NULL;
-}
-
-static struct clock_source *dcn31_clock_source_create(
-               struct dc_context *ctx,
-               struct dc_bios *bios,
-               enum clock_source_id id,
-               const struct dce110_clk_src_regs *regs,
-               bool dp_clk_src)
-{
-       struct dce110_clk_src *clk_src =
-               kzalloc(sizeof(struct dce110_clk_src), GFP_KERNEL);
-
-       if (!clk_src)
-               return NULL;
-
-       if (dcn31_clk_src_construct(clk_src, ctx, bios, id,
-                       regs, &cs_shift, &cs_mask)) {
-               clk_src->base.dp_clk_src = dp_clk_src;
-               return &clk_src->base;
-       }
-
-       BREAK_TO_DEBUGGER();
-       kfree(clk_src);
-       return NULL;
-}
-
-static int dcn314_populate_dml_pipes_from_context(
-       struct dc *dc, struct dc_state *context,
-       display_e2e_pipe_params_st *pipes,
-       bool fast_validate)
-{
-       int pipe_cnt;
-
-       DC_FP_START();
-       pipe_cnt = dcn314_populate_dml_pipes_from_context_fpu(dc, context, pipes, fast_validate);
-       DC_FP_END();
-
-       return pipe_cnt;
-}
-
-static struct dc_cap_funcs cap_funcs = {
-       .get_dcc_compression_cap = dcn20_get_dcc_compression_cap
-};
-
-static void dcn314_update_bw_bounding_box(struct dc *dc, struct clk_bw_params *bw_params)
-{
-       DC_FP_START();
-       dcn314_update_bw_bounding_box_fpu(dc, bw_params);
-       DC_FP_END();
-}
-
-static void dcn314_get_panel_config_defaults(struct dc_panel_config *panel_config)
-{
-       *panel_config = panel_config_defaults;
-}
-
-static bool filter_modes_for_single_channel_workaround(struct dc *dc,
-               struct dc_state *context)
-{
-       // Filter 2K@240Hz+8K@24fps above combination timing if memory only has single dimm LPDDR
-       if (dc->clk_mgr->bw_params->vram_type == 34 &&
-           dc->clk_mgr->bw_params->num_channels < 2 &&
-           context->stream_count > 1) {
-               int total_phy_pix_clk = 0;
-
-               for (int i = 0; i < context->stream_count; i++)
-                       if (context->res_ctx.pipe_ctx[i].stream)
-                               total_phy_pix_clk += context->res_ctx.pipe_ctx[i].stream->phy_pix_clk;
-
-               if (total_phy_pix_clk >= (1148928+826260)) //2K@240Hz+8K@24fps
-                       return true;
-       }
-       return false;
-}
-
-bool dcn314_validate_bandwidth(struct dc *dc,
-               struct dc_state *context,
-               bool fast_validate)
-{
-       bool out = false;
-
-       BW_VAL_TRACE_SETUP();
-
-       int vlevel = 0;
-       int pipe_cnt = 0;
-       display_e2e_pipe_params_st *pipes = kzalloc(dc->res_pool->pipe_count * sizeof(display_e2e_pipe_params_st), GFP_KERNEL);
-       DC_LOGGER_INIT(dc->ctx->logger);
-
-       BW_VAL_TRACE_COUNT();
-
-       if (filter_modes_for_single_channel_workaround(dc, context))
-               goto validate_fail;
-
-       DC_FP_START();
-       // do not support self refresh only
-       out = dcn30_internal_validate_bw(dc, context, pipes, &pipe_cnt, &vlevel, fast_validate, false);
-       DC_FP_END();
-
-       // Disable fast_validate to set min dcfclk in calculate_wm_and_dlg
-       if (pipe_cnt == 0)
-               fast_validate = false;
-
-       if (!out)
-               goto validate_fail;
-
-       BW_VAL_TRACE_END_VOLTAGE_LEVEL();
-
-       if (fast_validate) {
-               BW_VAL_TRACE_SKIP(fast);
-               goto validate_out;
-       }
-       if (dc->res_pool->funcs->calculate_wm_and_dlg)
-               dc->res_pool->funcs->calculate_wm_and_dlg(dc, context, pipes, pipe_cnt, vlevel);
-
-       BW_VAL_TRACE_END_WATERMARKS();
-
-       goto validate_out;
-
-validate_fail:
-       DC_LOG_WARNING("Mode Validation Warning: %s failed validation.\n",
-               dml_get_status_message(context->bw_ctx.dml.vba.ValidationStatus[context->bw_ctx.dml.vba.soc.num_states]));
-
-       BW_VAL_TRACE_SKIP(fail);
-       out = false;
-
-validate_out:
-       kfree(pipes);
-
-       BW_VAL_TRACE_FINISH();
-
-       return out;
-}
-
-static struct resource_funcs dcn314_res_pool_funcs = {
-       .destroy = dcn314_destroy_resource_pool,
-       .link_enc_create = dcn31_link_encoder_create,
-       .link_enc_create_minimal = dcn31_link_enc_create_minimal,
-       .link_encs_assign = link_enc_cfg_link_encs_assign,
-       .link_enc_unassign = link_enc_cfg_link_enc_unassign,
-       .panel_cntl_create = dcn31_panel_cntl_create,
-       .validate_bandwidth = dcn314_validate_bandwidth,
-       .calculate_wm_and_dlg = dcn31_calculate_wm_and_dlg,
-       .update_soc_for_wm_a = dcn31_update_soc_for_wm_a,
-       .populate_dml_pipes = dcn314_populate_dml_pipes_from_context,
-       .acquire_free_pipe_as_secondary_dpp_pipe = dcn20_acquire_free_pipe_for_layer,
-       .release_pipe = dcn20_release_pipe,
-       .add_stream_to_ctx = dcn30_add_stream_to_ctx,
-       .add_dsc_to_stream_resource = dcn20_add_dsc_to_stream_resource,
-       .remove_stream_from_ctx = dcn20_remove_stream_from_ctx,
-       .populate_dml_writeback_from_context = dcn30_populate_dml_writeback_from_context,
-       .set_mcif_arb_params = dcn30_set_mcif_arb_params,
-       .find_first_free_match_stream_enc_for_link = dcn10_find_first_free_match_stream_enc_for_link,
-       .acquire_post_bldn_3dlut = dcn30_acquire_post_bldn_3dlut,
-       .release_post_bldn_3dlut = dcn30_release_post_bldn_3dlut,
-       .update_bw_bounding_box = dcn314_update_bw_bounding_box,
-       .patch_unknown_plane_state = dcn20_patch_unknown_plane_state,
-       .get_panel_config_defaults = dcn314_get_panel_config_defaults,
-       .get_preferred_eng_id_dpia = dcn314_get_preferred_eng_id_dpia,
-};
-
-static struct clock_source *dcn30_clock_source_create(
-               struct dc_context *ctx,
-               struct dc_bios *bios,
-               enum clock_source_id id,
-               const struct dce110_clk_src_regs *regs,
-               bool dp_clk_src)
-{
-       struct dce110_clk_src *clk_src =
-               kzalloc(sizeof(struct dce110_clk_src), GFP_KERNEL);
-
-       if (!clk_src)
-               return NULL;
-
-       if (dcn31_clk_src_construct(clk_src, ctx, bios, id,
-                       regs, &cs_shift, &cs_mask)) {
-               clk_src->base.dp_clk_src = dp_clk_src;
-               return &clk_src->base;
-       }
-
-       BREAK_TO_DEBUGGER();
-       kfree(clk_src);
-       return NULL;
-}
-
-static bool dcn314_resource_construct(
-       uint8_t num_virtual_links,
-       struct dc *dc,
-       struct dcn314_resource_pool *pool)
-{
-       int i;
-       struct dc_context *ctx = dc->ctx;
-       struct irq_service_init_data init_data;
-
-       ctx->dc_bios->regs = &bios_regs;
-
-       pool->base.res_cap = &res_cap_dcn314;
-       pool->base.funcs = &dcn314_res_pool_funcs;
-
-       /*************************************************
-        *  Resource + asic cap harcoding                *
-        *************************************************/
-       pool->base.underlay_pipe_index = NO_UNDERLAY_PIPE;
-       pool->base.pipe_count = pool->base.res_cap->num_timing_generator;
-       pool->base.mpcc_count = pool->base.res_cap->num_timing_generator;
-       dc->caps.max_downscale_ratio = 400;
-       dc->caps.i2c_speed_in_khz = 100;
-       dc->caps.i2c_speed_in_khz_hdcp = 100;
-       dc->caps.max_cursor_size = 256;
-       dc->caps.min_horizontal_blanking_period = 80;
-       dc->caps.dmdata_alloc_size = 2048;
-       dc->caps.max_slave_planes = 2;
-       dc->caps.max_slave_yuv_planes = 2;
-       dc->caps.max_slave_rgb_planes = 2;
-       dc->caps.post_blend_color_processing = true;
-       dc->caps.force_dp_tps4_for_cp2520 = true;
-       if (dc->config.forceHBR2CP2520)
-               dc->caps.force_dp_tps4_for_cp2520 = false;
-       dc->caps.dp_hpo = true;
-       dc->caps.dp_hdmi21_pcon_support = true;
-       dc->caps.edp_dsc_support = true;
-       dc->caps.extended_aux_timeout_support = true;
-       dc->caps.dmcub_support = true;
-       dc->caps.is_apu = true;
-       dc->caps.seamless_odm = true;
-
-       dc->caps.zstate_support = true;
-
-       /* Color pipeline capabilities */
-       dc->caps.color.dpp.dcn_arch = 1;
-       dc->caps.color.dpp.input_lut_shared = 0;
-       dc->caps.color.dpp.icsc = 1;
-       dc->caps.color.dpp.dgam_ram = 0; // must use gamma_corr
-       dc->caps.color.dpp.dgam_rom_caps.srgb = 1;
-       dc->caps.color.dpp.dgam_rom_caps.bt2020 = 1;
-       dc->caps.color.dpp.dgam_rom_caps.gamma2_2 = 1;
-       dc->caps.color.dpp.dgam_rom_caps.pq = 1;
-       dc->caps.color.dpp.dgam_rom_caps.hlg = 1;
-       dc->caps.color.dpp.post_csc = 1;
-       dc->caps.color.dpp.gamma_corr = 1;
-       dc->caps.color.dpp.dgam_rom_for_yuv = 0;
-
-       dc->caps.color.dpp.hw_3d_lut = 1;
-       dc->caps.color.dpp.ogam_ram = 1;
-       // no OGAM ROM on DCN301
-       dc->caps.color.dpp.ogam_rom_caps.srgb = 0;
-       dc->caps.color.dpp.ogam_rom_caps.bt2020 = 0;
-       dc->caps.color.dpp.ogam_rom_caps.gamma2_2 = 0;
-       dc->caps.color.dpp.ogam_rom_caps.pq = 0;
-       dc->caps.color.dpp.ogam_rom_caps.hlg = 0;
-       dc->caps.color.dpp.ocsc = 0;
-
-       dc->caps.color.mpc.gamut_remap = 1;
-       dc->caps.color.mpc.num_3dluts = pool->base.res_cap->num_mpc_3dlut; //2
-       dc->caps.color.mpc.ogam_ram = 1;
-       dc->caps.color.mpc.ogam_rom_caps.srgb = 0;
-       dc->caps.color.mpc.ogam_rom_caps.bt2020 = 0;
-       dc->caps.color.mpc.ogam_rom_caps.gamma2_2 = 0;
-       dc->caps.color.mpc.ogam_rom_caps.pq = 0;
-       dc->caps.color.mpc.ogam_rom_caps.hlg = 0;
-       dc->caps.color.mpc.ocsc = 1;
-
-       dc->caps.max_disp_clock_khz_at_vmin = 650000;
-
-       /* Use pipe context based otg sync logic */
-       dc->config.use_pipe_ctx_sync_logic = true;
-
-       /* read VBIOS LTTPR caps */
-       {
-               if (ctx->dc_bios->funcs->get_lttpr_caps) {
-                       enum bp_result bp_query_result;
-                       uint8_t is_vbios_lttpr_enable = 0;
-
-                       bp_query_result = ctx->dc_bios->funcs->get_lttpr_caps(ctx->dc_bios, &is_vbios_lttpr_enable);
-                       dc->caps.vbios_lttpr_enable = (bp_query_result == BP_RESULT_OK) && !!is_vbios_lttpr_enable;
-               }
-
-               /* interop bit is implicit */
-               {
-                       dc->caps.vbios_lttpr_aware = true;
-               }
-       }
-
-       if (dc->ctx->dce_environment == DCE_ENV_PRODUCTION_DRV)
-               dc->debug = debug_defaults_drv;
-       else
-               dc->debug = debug_defaults_diags;
-
-       /* Disable pipe power gating */
-       dc->debug.disable_dpp_power_gate = true;
-       dc->debug.disable_hubp_power_gate = true;
-
-       /* Disable root clock optimization */
-       dc->debug.root_clock_optimization.u32All = 0;
-
-       // Init the vm_helper
-       if (dc->vm_helper)
-               vm_helper_init(dc->vm_helper, 16);
-
-       /*************************************************
-        *  Create resources                             *
-        *************************************************/
-
-       /* Clock Sources for Pixel Clock*/
-       pool->base.clock_sources[DCN31_CLK_SRC_PLL0] =
-                       dcn30_clock_source_create(ctx, ctx->dc_bios,
-                               CLOCK_SOURCE_COMBO_PHY_PLL0,
-                               &clk_src_regs[0], false);
-       pool->base.clock_sources[DCN31_CLK_SRC_PLL1] =
-                       dcn30_clock_source_create(ctx, ctx->dc_bios,
-                               CLOCK_SOURCE_COMBO_PHY_PLL1,
-                               &clk_src_regs[1], false);
-       pool->base.clock_sources[DCN31_CLK_SRC_PLL2] =
-                       dcn30_clock_source_create(ctx, ctx->dc_bios,
-                               CLOCK_SOURCE_COMBO_PHY_PLL2,
-                               &clk_src_regs[2], false);
-       pool->base.clock_sources[DCN31_CLK_SRC_PLL3] =
-                       dcn30_clock_source_create(ctx, ctx->dc_bios,
-                               CLOCK_SOURCE_COMBO_PHY_PLL3,
-                               &clk_src_regs[3], false);
-       pool->base.clock_sources[DCN31_CLK_SRC_PLL4] =
-                       dcn30_clock_source_create(ctx, ctx->dc_bios,
-                               CLOCK_SOURCE_COMBO_PHY_PLL4,
-                               &clk_src_regs[4], false);
-
-       pool->base.clk_src_count = DCN30_CLK_SRC_TOTAL;
-
-       /* todo: not reuse phy_pll registers */
-       pool->base.dp_clock_source =
-                       dcn31_clock_source_create(ctx, ctx->dc_bios,
-                               CLOCK_SOURCE_ID_DP_DTO,
-                               &clk_src_regs[0], true);
-
-       for (i = 0; i < pool->base.clk_src_count; i++) {
-               if (pool->base.clock_sources[i] == NULL) {
-                       dm_error("DC: failed to create clock sources!\n");
-                       BREAK_TO_DEBUGGER();
-                       goto create_fail;
-               }
-       }
-
-       pool->base.dccg = dccg314_create(ctx, &dccg_regs, &dccg_shift, &dccg_mask);
-       if (pool->base.dccg == NULL) {
-               dm_error("DC: failed to create dccg!\n");
-               BREAK_TO_DEBUGGER();
-               goto create_fail;
-       }
-
-       init_data.ctx = dc->ctx;
-       pool->base.irqs = dal_irq_service_dcn314_create(&init_data);
-       if (!pool->base.irqs)
-               goto create_fail;
-
-       /* HUBBUB */
-       pool->base.hubbub = dcn31_hubbub_create(ctx);
-       if (pool->base.hubbub == NULL) {
-               BREAK_TO_DEBUGGER();
-               dm_error("DC: failed to create hubbub!\n");
-               goto create_fail;
-       }
-
-       /* HUBPs, DPPs, OPPs and TGs */
-       for (i = 0; i < pool->base.pipe_count; i++) {
-               pool->base.hubps[i] = dcn31_hubp_create(ctx, i);
-               if (pool->base.hubps[i] == NULL) {
-                       BREAK_TO_DEBUGGER();
-                       dm_error(
-                               "DC: failed to create hubps!\n");
-                       goto create_fail;
-               }
-
-               pool->base.dpps[i] = dcn31_dpp_create(ctx, i);
-               if (pool->base.dpps[i] == NULL) {
-                       BREAK_TO_DEBUGGER();
-                       dm_error(
-                               "DC: failed to create dpps!\n");
-                       goto create_fail;
-               }
-       }
-
-       for (i = 0; i < pool->base.res_cap->num_opp; i++) {
-               pool->base.opps[i] = dcn31_opp_create(ctx, i);
-               if (pool->base.opps[i] == NULL) {
-                       BREAK_TO_DEBUGGER();
-                       dm_error(
-                               "DC: failed to create output pixel processor!\n");
-                       goto create_fail;
-               }
-       }
-
-       for (i = 0; i < pool->base.res_cap->num_timing_generator; i++) {
-               pool->base.timing_generators[i] = dcn31_timing_generator_create(
-                               ctx, i);
-               if (pool->base.timing_generators[i] == NULL) {
-                       BREAK_TO_DEBUGGER();
-                       dm_error("DC: failed to create tg!\n");
-                       goto create_fail;
-               }
-       }
-       pool->base.timing_generator_count = i;
-
-       /* PSR */
-       pool->base.psr = dmub_psr_create(ctx);
-       if (pool->base.psr == NULL) {
-               dm_error("DC: failed to create psr obj!\n");
-               BREAK_TO_DEBUGGER();
-               goto create_fail;
-       }
-
-       /* Replay */
-       pool->base.replay = dmub_replay_create(ctx);
-       if (pool->base.replay == NULL) {
-               dm_error("DC: failed to create replay obj!\n");
-               BREAK_TO_DEBUGGER();
-               goto create_fail;
-       }
-
-       /* ABM */
-       for (i = 0; i < pool->base.res_cap->num_timing_generator; i++) {
-               pool->base.multiple_abms[i] = dmub_abm_create(ctx,
-                               &abm_regs[i],
-                               &abm_shift,
-                               &abm_mask);
-               if (pool->base.multiple_abms[i] == NULL) {
-                       dm_error("DC: failed to create abm for pipe %d!\n", i);
-                       BREAK_TO_DEBUGGER();
-                       goto create_fail;
-               }
-       }
-
-       /* MPC and DSC */
-       pool->base.mpc = dcn31_mpc_create(ctx, pool->base.mpcc_count, pool->base.res_cap->num_mpc_3dlut);
-       if (pool->base.mpc == NULL) {
-               BREAK_TO_DEBUGGER();
-               dm_error("DC: failed to create mpc!\n");
-               goto create_fail;
-       }
-
-       for (i = 0; i < pool->base.res_cap->num_dsc; i++) {
-               pool->base.dscs[i] = dcn314_dsc_create(ctx, i);
-               if (pool->base.dscs[i] == NULL) {
-                       BREAK_TO_DEBUGGER();
-                       dm_error("DC: failed to create display stream compressor %d!\n", i);
-                       goto create_fail;
-               }
-       }
-
-       /* DWB and MMHUBBUB */
-       if (!dcn31_dwbc_create(ctx, &pool->base)) {
-               BREAK_TO_DEBUGGER();
-               dm_error("DC: failed to create dwbc!\n");
-               goto create_fail;
-       }
-
-       if (!dcn31_mmhubbub_create(ctx, &pool->base)) {
-               BREAK_TO_DEBUGGER();
-               dm_error("DC: failed to create mcif_wb!\n");
-               goto create_fail;
-       }
-
-       /* AUX and I2C */
-       for (i = 0; i < pool->base.res_cap->num_ddc; i++) {
-               pool->base.engines[i] = dcn31_aux_engine_create(ctx, i);
-               if (pool->base.engines[i] == NULL) {
-                       BREAK_TO_DEBUGGER();
-                       dm_error(
-                               "DC:failed to create aux engine!!\n");
-                       goto create_fail;
-               }
-               pool->base.hw_i2cs[i] = dcn31_i2c_hw_create(ctx, i);
-               if (pool->base.hw_i2cs[i] == NULL) {
-                       BREAK_TO_DEBUGGER();
-                       dm_error(
-                               "DC:failed to create hw i2c!!\n");
-                       goto create_fail;
-               }
-               pool->base.sw_i2cs[i] = NULL;
-       }
-
-       /* DCN314 has 4 DPIA */
-       pool->base.usb4_dpia_count = 4;
-
-       /* Audio, Stream Encoders including HPO and virtual, MPC 3D LUTs */
-       if (!resource_construct(num_virtual_links, dc, &pool->base,
-                       &res_create_funcs))
-               goto create_fail;
-
-       /* HW Sequencer and Plane caps */
-       dcn314_hw_sequencer_construct(dc);
-
-       dc->caps.max_planes =  pool->base.pipe_count;
-
-       for (i = 0; i < dc->caps.max_planes; ++i)
-               dc->caps.planes[i] = plane_cap;
-
-       dc->cap_funcs = cap_funcs;
-
-       dc->dcn_ip->max_num_dpp = dcn3_14_ip.max_num_dpp;
-
-       return true;
-
-create_fail:
-
-       dcn314_resource_destruct(pool);
-
-       return false;
-}
-
-struct resource_pool *dcn314_create_resource_pool(
-               const struct dc_init_data *init_data,
-               struct dc *dc)
-{
-       struct dcn314_resource_pool *pool =
-               kzalloc(sizeof(struct dcn314_resource_pool), GFP_KERNEL);
-
-       if (!pool)
-               return NULL;
-
-       if (dcn314_resource_construct(init_data->num_virtual_links, dc, pool))
-               return &pool->base;
-
-       BREAK_TO_DEBUGGER();
-       kfree(pool);
-       return NULL;
-}
diff --git a/drivers/gpu/drm/amd/display/dc/dcn314/dcn314_resource.h b/drivers/gpu/drm/amd/display/dc/dcn314/dcn314_resource.h
deleted file mode 100644 (file)
index 49ffe71..0000000
+++ /dev/null
@@ -1,50 +0,0 @@
-/* SPDX-License-Identifier: MIT */
-/*
- * 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 _DCN314_RESOURCE_H_
-#define _DCN314_RESOURCE_H_
-
-#include "core_types.h"
-
-extern struct _vcs_dpi_ip_params_st dcn3_14_ip;
-extern struct _vcs_dpi_soc_bounding_box_st dcn3_14_soc;
-
-#define TO_DCN314_RES_POOL(pool)\
-       container_of(pool, struct dcn314_resource_pool, base)
-
-struct dcn314_resource_pool {
-       struct resource_pool base;
-};
-
-bool dcn314_validate_bandwidth(struct dc *dc,
-               struct dc_state *context,
-               bool fast_validate);
-
-struct resource_pool *dcn314_create_resource_pool(
-               const struct dc_init_data *init_data,
-               struct dc *dc);
-
-#endif /* _DCN314_RESOURCE_H_ */
diff --git a/drivers/gpu/drm/amd/display/dc/dcn315/Makefile b/drivers/gpu/drm/amd/display/dc/dcn315/Makefile
deleted file mode 100644 (file)
index 59381d2..0000000
+++ /dev/null
@@ -1,30 +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
-#
-# Makefile for dcn315.
-
-DCN315 = dcn315_resource.o
-
-AMD_DAL_DCN315 = $(addprefix $(AMDDALPATH)/dc/dcn315/,$(DCN315))
-
-AMD_DISPLAY_FILES += $(AMD_DAL_DCN315)
diff --git a/drivers/gpu/drm/amd/display/dc/dcn315/dcn315_resource.c b/drivers/gpu/drm/amd/display/dc/dcn315/dcn315_resource.c
deleted file mode 100644 (file)
index cb8024e..0000000
+++ /dev/null
@@ -1,2151 +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 "dm_services.h"
-#include "dc.h"
-
-#include "dcn31/dcn31_init.h"
-
-#include "resource.h"
-#include "include/irq_service_interface.h"
-#include "dcn315_resource.h"
-
-#include "dcn20/dcn20_resource.h"
-#include "dcn30/dcn30_resource.h"
-#include "dcn31/dcn31_resource.h"
-
-#include "dcn10/dcn10_ipp.h"
-#include "dcn30/dcn30_hubbub.h"
-#include "dcn31/dcn31_hubbub.h"
-#include "dcn30/dcn30_mpc.h"
-#include "dcn31/dcn31_hubp.h"
-#include "irq/dcn315/irq_service_dcn315.h"
-#include "dcn30/dcn30_dpp.h"
-#include "dcn31/dcn31_optc.h"
-#include "dcn20/dcn20_hwseq.h"
-#include "dcn30/dcn30_hwseq.h"
-#include "dce110/dce110_hwseq.h"
-#include "dcn30/dcn30_opp.h"
-#include "dcn20/dcn20_dsc.h"
-#include "dcn30/dcn30_vpg.h"
-#include "dcn30/dcn30_afmt.h"
-#include "dcn30/dcn30_dio_stream_encoder.h"
-#include "dcn31/dcn31_hpo_dp_stream_encoder.h"
-#include "dcn31/dcn31_hpo_dp_link_encoder.h"
-#include "dcn31/dcn31_apg.h"
-#include "dcn31/dcn31_dio_link_encoder.h"
-#include "dcn31/dcn31_vpg.h"
-#include "dcn31/dcn31_afmt.h"
-#include "dce/dce_clock_source.h"
-#include "dce/dce_audio.h"
-#include "dce/dce_hwseq.h"
-#include "clk_mgr.h"
-#include "virtual/virtual_stream_encoder.h"
-#include "dce110/dce110_resource.h"
-#include "dml/display_mode_vba.h"
-#include "dml/dcn31/dcn31_fpu.h"
-#include "dcn31/dcn31_dccg.h"
-#include "dcn10/dcn10_resource.h"
-#include "dcn31/dcn31_panel_cntl.h"
-
-#include "dcn30/dcn30_dwb.h"
-#include "dcn30/dcn30_mmhubbub.h"
-
-#include "dcn/dcn_3_1_5_offset.h"
-#include "dcn/dcn_3_1_5_sh_mask.h"
-#include "dpcs/dpcs_4_2_2_offset.h"
-#include "dpcs/dpcs_4_2_2_sh_mask.h"
-
-#define NBIO_BASE__INST0_SEG0                      0x00000000
-#define NBIO_BASE__INST0_SEG1                      0x00000014
-#define NBIO_BASE__INST0_SEG2                      0x00000D20
-#define NBIO_BASE__INST0_SEG3                      0x00010400
-#define NBIO_BASE__INST0_SEG4                      0x0241B000
-#define NBIO_BASE__INST0_SEG5                      0x04040000
-
-#define DPCS_BASE__INST0_SEG0                      0x00000012
-#define DPCS_BASE__INST0_SEG1                      0x000000C0
-#define DPCS_BASE__INST0_SEG2                      0x000034C0
-#define DPCS_BASE__INST0_SEG3                      0x00009000
-#define DPCS_BASE__INST0_SEG4                      0x02403C00
-#define DPCS_BASE__INST0_SEG5                      0
-
-#define DCN_BASE__INST0_SEG0                       0x00000012
-#define DCN_BASE__INST0_SEG1                       0x000000C0
-#define DCN_BASE__INST0_SEG2                       0x000034C0
-#define DCN_BASE__INST0_SEG3                       0x00009000
-#define DCN_BASE__INST0_SEG4                       0x02403C00
-#define DCN_BASE__INST0_SEG5                       0
-
-#define regBIF_BX_PF2_RSMU_INDEX                                                                        0x0000
-#define regBIF_BX_PF2_RSMU_INDEX_BASE_IDX                                                               1
-#define regBIF_BX_PF2_RSMU_DATA                                                                         0x0001
-#define regBIF_BX_PF2_RSMU_DATA_BASE_IDX                                                                1
-#define regBIF_BX2_BIOS_SCRATCH_6                                                                       0x003e
-#define regBIF_BX2_BIOS_SCRATCH_6_BASE_IDX                                                              1
-#define BIF_BX2_BIOS_SCRATCH_6__BIOS_SCRATCH_6__SHIFT                                                         0x0
-#define BIF_BX2_BIOS_SCRATCH_6__BIOS_SCRATCH_6_MASK                                                           0xFFFFFFFFL
-#define regBIF_BX2_BIOS_SCRATCH_2                                                                       0x003a
-#define regBIF_BX2_BIOS_SCRATCH_2_BASE_IDX                                                              1
-#define BIF_BX2_BIOS_SCRATCH_2__BIOS_SCRATCH_2__SHIFT                                                         0x0
-#define BIF_BX2_BIOS_SCRATCH_2__BIOS_SCRATCH_2_MASK                                                           0xFFFFFFFFL
-#define regBIF_BX2_BIOS_SCRATCH_3                                                                       0x003b
-#define regBIF_BX2_BIOS_SCRATCH_3_BASE_IDX                                                              1
-#define BIF_BX2_BIOS_SCRATCH_3__BIOS_SCRATCH_3__SHIFT                                                         0x0
-#define BIF_BX2_BIOS_SCRATCH_3__BIOS_SCRATCH_3_MASK                                                           0xFFFFFFFFL
-
-#define regDCHUBBUB_DEBUG_CTRL_0                                              0x04d6
-#define regDCHUBBUB_DEBUG_CTRL_0_BASE_IDX                                     2
-#define DCHUBBUB_DEBUG_CTRL_0__DET_DEPTH__SHIFT                               0x10
-#define DCHUBBUB_DEBUG_CTRL_0__DET_DEPTH_MASK                                 0x01FF0000L
-
-#include "reg_helper.h"
-#include "dce/dmub_abm.h"
-#include "dce/dmub_psr.h"
-#include "dce/dce_aux.h"
-#include "dce/dce_i2c.h"
-
-#include "dml/dcn30/display_mode_vba_30.h"
-#include "vm_helper.h"
-#include "dcn20/dcn20_vmid.h"
-
-#include "link_enc_cfg.h"
-
-#define DCN3_15_MAX_DET_SIZE 384
-#define DCN3_15_CRB_SEGMENT_SIZE_KB 64
-#define DCN3_15_MAX_DET_SEGS (DCN3_15_MAX_DET_SIZE / DCN3_15_CRB_SEGMENT_SIZE_KB)
-/* Minimum 3 extra segments need to be in compbuf and claimable to guarantee seamless mpo transitions */
-#define MIN_RESERVED_DET_SEGS 3
-
-enum dcn31_clk_src_array_id {
-       DCN31_CLK_SRC_PLL0,
-       DCN31_CLK_SRC_PLL1,
-       DCN31_CLK_SRC_PLL2,
-       DCN31_CLK_SRC_PLL3,
-       DCN31_CLK_SRC_PLL4,
-       DCN30_CLK_SRC_TOTAL
-};
-
-/* begin *********************
- * macros to expend register list macro defined in HW object header file
- */
-
-/* DCN */
-#define BASE_INNER(seg) DCN_BASE__INST0_SEG ## seg
-
-#define BASE(seg) BASE_INNER(seg)
-
-#define SR(reg_name)\
-               .reg_name = BASE(reg ## reg_name ## _BASE_IDX) +  \
-                                       reg ## reg_name
-
-#define SRI(reg_name, block, id)\
-       .reg_name = BASE(reg ## block ## id ## _ ## reg_name ## _BASE_IDX) + \
-                                       reg ## block ## id ## _ ## reg_name
-
-#define SRI2(reg_name, block, id)\
-       .reg_name = BASE(reg ## reg_name ## _BASE_IDX) + \
-                                       reg ## reg_name
-
-#define SRIR(var_name, reg_name, block, id)\
-       .var_name = BASE(reg ## block ## id ## _ ## reg_name ## _BASE_IDX) + \
-                                       reg ## block ## id ## _ ## reg_name
-
-#define SRII(reg_name, block, id)\
-       .reg_name[id] = BASE(reg ## block ## id ## _ ## reg_name ## _BASE_IDX) + \
-                                       reg ## block ## id ## _ ## reg_name
-
-#define SRII_MPC_RMU(reg_name, block, id)\
-       .RMU##_##reg_name[id] = BASE(reg ## block ## id ## _ ## reg_name ## _BASE_IDX) + \
-                                       reg ## block ## id ## _ ## reg_name
-
-#define SRII_DWB(reg_name, temp_name, block, id)\
-       .reg_name[id] = BASE(reg ## block ## id ## _ ## temp_name ## _BASE_IDX) + \
-                                       reg ## block ## id ## _ ## temp_name
-
-#define SF_DWB2(reg_name, block, id, field_name, post_fix)     \
-       .field_name = reg_name ## __ ## field_name ## post_fix
-
-#define DCCG_SRII(reg_name, block, id)\
-       .block ## _ ## reg_name[id] = BASE(reg ## block ## id ## _ ## reg_name ## _BASE_IDX) + \
-                                       reg ## block ## id ## _ ## reg_name
-
-#define VUPDATE_SRII(reg_name, block, id)\
-       .reg_name[id] = BASE(reg ## reg_name ## _ ## block ## id ## _BASE_IDX) + \
-                                       reg ## reg_name ## _ ## block ## id
-
-/* NBIO */
-#define NBIO_BASE_INNER(seg) \
-       NBIO_BASE__INST0_SEG ## seg
-
-#define NBIO_BASE(seg) \
-       NBIO_BASE_INNER(seg)
-
-#define NBIO_SR(reg_name)\
-               .reg_name = NBIO_BASE(regBIF_BX2_ ## reg_name ## _BASE_IDX) + \
-                                       regBIF_BX2_ ## reg_name
-
-static const struct bios_registers bios_regs = {
-               NBIO_SR(BIOS_SCRATCH_3),
-               NBIO_SR(BIOS_SCRATCH_6)
-};
-
-#define clk_src_regs(index, pllid)\
-[index] = {\
-       CS_COMMON_REG_LIST_DCN3_0(index, pllid),\
-}
-
-static const struct dce110_clk_src_regs clk_src_regs[] = {
-       clk_src_regs(0, A),
-       clk_src_regs(1, B),
-       clk_src_regs(2, C),
-       clk_src_regs(3, D),
-       clk_src_regs(4, E)
-};
-
-static const struct dce110_clk_src_shift cs_shift = {
-               CS_COMMON_MASK_SH_LIST_DCN2_0(__SHIFT)
-};
-
-static const struct dce110_clk_src_mask cs_mask = {
-               CS_COMMON_MASK_SH_LIST_DCN2_0(_MASK)
-};
-
-#define abm_regs(id)\
-[id] = {\
-               ABM_DCN302_REG_LIST(id)\
-}
-
-static const struct dce_abm_registers abm_regs[] = {
-               abm_regs(0),
-               abm_regs(1),
-               abm_regs(2),
-               abm_regs(3),
-};
-
-static const struct dce_abm_shift abm_shift = {
-               ABM_MASK_SH_LIST_DCN30(__SHIFT)
-};
-
-static const struct dce_abm_mask abm_mask = {
-               ABM_MASK_SH_LIST_DCN30(_MASK)
-};
-
-#define audio_regs(id)\
-[id] = {\
-               AUD_COMMON_REG_LIST(id)\
-}
-
-static const struct dce_audio_registers audio_regs[] = {
-       audio_regs(0),
-       audio_regs(1),
-       audio_regs(2),
-       audio_regs(3),
-       audio_regs(4),
-       audio_regs(5),
-       audio_regs(6)
-};
-
-#define DCE120_AUD_COMMON_MASK_SH_LIST(mask_sh)\
-               SF(AZF0ENDPOINT0_AZALIA_F0_CODEC_ENDPOINT_INDEX, AZALIA_ENDPOINT_REG_INDEX, mask_sh),\
-               SF(AZF0ENDPOINT0_AZALIA_F0_CODEC_ENDPOINT_DATA, AZALIA_ENDPOINT_REG_DATA, mask_sh),\
-               AUD_COMMON_MASK_SH_LIST_BASE(mask_sh)
-
-static const struct dce_audio_shift audio_shift = {
-               DCE120_AUD_COMMON_MASK_SH_LIST(__SHIFT)
-};
-
-static const struct dce_audio_mask audio_mask = {
-               DCE120_AUD_COMMON_MASK_SH_LIST(_MASK)
-};
-
-#define vpg_regs(id)\
-[id] = {\
-       VPG_DCN31_REG_LIST(id)\
-}
-
-static const struct dcn31_vpg_registers vpg_regs[] = {
-       vpg_regs(0),
-       vpg_regs(1),
-       vpg_regs(2),
-       vpg_regs(3),
-       vpg_regs(4),
-       vpg_regs(5),
-       vpg_regs(6),
-       vpg_regs(7),
-       vpg_regs(8),
-       vpg_regs(9),
-};
-
-static const struct dcn31_vpg_shift vpg_shift = {
-       DCN31_VPG_MASK_SH_LIST(__SHIFT)
-};
-
-static const struct dcn31_vpg_mask vpg_mask = {
-       DCN31_VPG_MASK_SH_LIST(_MASK)
-};
-
-#define afmt_regs(id)\
-[id] = {\
-       AFMT_DCN31_REG_LIST(id)\
-}
-
-static const struct dcn31_afmt_registers afmt_regs[] = {
-       afmt_regs(0),
-       afmt_regs(1),
-       afmt_regs(2),
-       afmt_regs(3),
-       afmt_regs(4),
-       afmt_regs(5)
-};
-
-static const struct dcn31_afmt_shift afmt_shift = {
-       DCN31_AFMT_MASK_SH_LIST(__SHIFT)
-};
-
-static const struct dcn31_afmt_mask afmt_mask = {
-       DCN31_AFMT_MASK_SH_LIST(_MASK)
-};
-
-#define apg_regs(id)\
-[id] = {\
-       APG_DCN31_REG_LIST(id)\
-}
-
-static const struct dcn31_apg_registers apg_regs[] = {
-       apg_regs(0),
-       apg_regs(1),
-       apg_regs(2),
-       apg_regs(3)
-};
-
-static const struct dcn31_apg_shift apg_shift = {
-       DCN31_APG_MASK_SH_LIST(__SHIFT)
-};
-
-static const struct dcn31_apg_mask apg_mask = {
-               DCN31_APG_MASK_SH_LIST(_MASK)
-};
-
-#define stream_enc_regs(id)\
-[id] = {\
-       SE_DCN3_REG_LIST(id)\
-}
-
-static const struct dcn10_stream_enc_registers stream_enc_regs[] = {
-       stream_enc_regs(0),
-       stream_enc_regs(1),
-       stream_enc_regs(2),
-       stream_enc_regs(3),
-       stream_enc_regs(4)
-};
-
-static const struct dcn10_stream_encoder_shift se_shift = {
-               SE_COMMON_MASK_SH_LIST_DCN30(__SHIFT)
-};
-
-static const struct dcn10_stream_encoder_mask se_mask = {
-               SE_COMMON_MASK_SH_LIST_DCN30(_MASK)
-};
-
-
-#define aux_regs(id)\
-[id] = {\
-       DCN2_AUX_REG_LIST(id)\
-}
-
-static const struct dcn10_link_enc_aux_registers link_enc_aux_regs[] = {
-               aux_regs(0),
-               aux_regs(1),
-               aux_regs(2),
-               aux_regs(3),
-               aux_regs(4)
-};
-
-#define hpd_regs(id)\
-[id] = {\
-       HPD_REG_LIST(id)\
-}
-
-static const struct dcn10_link_enc_hpd_registers link_enc_hpd_regs[] = {
-               hpd_regs(0),
-               hpd_regs(1),
-               hpd_regs(2),
-               hpd_regs(3),
-               hpd_regs(4)
-};
-
-#define link_regs(id, phyid)\
-[id] = {\
-       LE_DCN31_REG_LIST(id), \
-       UNIPHY_DCN2_REG_LIST(phyid), \
-       DPCS_DCN31_REG_LIST(id), \
-}
-
-static const struct dce110_aux_registers_shift aux_shift = {
-       DCN_AUX_MASK_SH_LIST(__SHIFT)
-};
-
-static const struct dce110_aux_registers_mask aux_mask = {
-       DCN_AUX_MASK_SH_LIST(_MASK)
-};
-
-static const struct dcn10_link_enc_registers link_enc_regs[] = {
-       link_regs(0, A),
-       link_regs(1, B),
-       link_regs(2, C),
-       link_regs(3, D),
-       link_regs(4, E)
-};
-
-static const struct dcn10_link_enc_shift le_shift = {
-       LINK_ENCODER_MASK_SH_LIST_DCN31(__SHIFT), \
-       DPCS_DCN31_MASK_SH_LIST(__SHIFT)
-};
-
-static const struct dcn10_link_enc_mask le_mask = {
-       LINK_ENCODER_MASK_SH_LIST_DCN31(_MASK), \
-       DPCS_DCN31_MASK_SH_LIST(_MASK)
-};
-
-#define hpo_dp_stream_encoder_reg_list(id)\
-[id] = {\
-       DCN3_1_HPO_DP_STREAM_ENC_REG_LIST(id)\
-}
-
-static const struct dcn31_hpo_dp_stream_encoder_registers hpo_dp_stream_enc_regs[] = {
-       hpo_dp_stream_encoder_reg_list(0),
-       hpo_dp_stream_encoder_reg_list(1),
-       hpo_dp_stream_encoder_reg_list(2),
-       hpo_dp_stream_encoder_reg_list(3),
-};
-
-static const struct dcn31_hpo_dp_stream_encoder_shift hpo_dp_se_shift = {
-       DCN3_1_HPO_DP_STREAM_ENC_MASK_SH_LIST(__SHIFT)
-};
-
-static const struct dcn31_hpo_dp_stream_encoder_mask hpo_dp_se_mask = {
-       DCN3_1_HPO_DP_STREAM_ENC_MASK_SH_LIST(_MASK)
-};
-
-
-#define hpo_dp_link_encoder_reg_list(id)\
-[id] = {\
-       DCN3_1_HPO_DP_LINK_ENC_REG_LIST(id),\
-       DCN3_1_RDPCSTX_REG_LIST(0),\
-       DCN3_1_RDPCSTX_REG_LIST(1),\
-       DCN3_1_RDPCSTX_REG_LIST(2),\
-       DCN3_1_RDPCSTX_REG_LIST(3),\
-       DCN3_1_RDPCSTX_REG_LIST(4)\
-}
-
-static const struct dcn31_hpo_dp_link_encoder_registers hpo_dp_link_enc_regs[] = {
-       hpo_dp_link_encoder_reg_list(0),
-       hpo_dp_link_encoder_reg_list(1),
-};
-
-static const struct dcn31_hpo_dp_link_encoder_shift hpo_dp_le_shift = {
-       DCN3_1_HPO_DP_LINK_ENC_MASK_SH_LIST(__SHIFT)
-};
-
-static const struct dcn31_hpo_dp_link_encoder_mask hpo_dp_le_mask = {
-       DCN3_1_HPO_DP_LINK_ENC_MASK_SH_LIST(_MASK)
-};
-
-#define dpp_regs(id)\
-[id] = {\
-       DPP_REG_LIST_DCN30(id),\
-}
-
-static const struct dcn3_dpp_registers dpp_regs[] = {
-       dpp_regs(0),
-       dpp_regs(1),
-       dpp_regs(2),
-       dpp_regs(3)
-};
-
-static const struct dcn3_dpp_shift tf_shift = {
-               DPP_REG_LIST_SH_MASK_DCN30(__SHIFT)
-};
-
-static const struct dcn3_dpp_mask tf_mask = {
-               DPP_REG_LIST_SH_MASK_DCN30(_MASK)
-};
-
-#define opp_regs(id)\
-[id] = {\
-       OPP_REG_LIST_DCN30(id),\
-}
-
-static const struct dcn20_opp_registers opp_regs[] = {
-       opp_regs(0),
-       opp_regs(1),
-       opp_regs(2),
-       opp_regs(3)
-};
-
-static const struct dcn20_opp_shift opp_shift = {
-       OPP_MASK_SH_LIST_DCN20(__SHIFT)
-};
-
-static const struct dcn20_opp_mask opp_mask = {
-       OPP_MASK_SH_LIST_DCN20(_MASK)
-};
-
-#define aux_engine_regs(id)\
-[id] = {\
-       AUX_COMMON_REG_LIST0(id), \
-       .AUXN_IMPCAL = 0, \
-       .AUXP_IMPCAL = 0, \
-       .AUX_RESET_MASK = DP_AUX0_AUX_CONTROL__AUX_RESET_MASK, \
-}
-
-static const struct dce110_aux_registers aux_engine_regs[] = {
-               aux_engine_regs(0),
-               aux_engine_regs(1),
-               aux_engine_regs(2),
-               aux_engine_regs(3),
-               aux_engine_regs(4)
-};
-
-#define dwbc_regs_dcn3(id)\
-[id] = {\
-       DWBC_COMMON_REG_LIST_DCN30(id),\
-}
-
-static const struct dcn30_dwbc_registers dwbc30_regs[] = {
-       dwbc_regs_dcn3(0),
-};
-
-static const struct dcn30_dwbc_shift dwbc30_shift = {
-       DWBC_COMMON_MASK_SH_LIST_DCN30(__SHIFT)
-};
-
-static const struct dcn30_dwbc_mask dwbc30_mask = {
-       DWBC_COMMON_MASK_SH_LIST_DCN30(_MASK)
-};
-
-#define mcif_wb_regs_dcn3(id)\
-[id] = {\
-       MCIF_WB_COMMON_REG_LIST_DCN30(id),\
-}
-
-static const struct dcn30_mmhubbub_registers mcif_wb30_regs[] = {
-       mcif_wb_regs_dcn3(0)
-};
-
-static const struct dcn30_mmhubbub_shift mcif_wb30_shift = {
-       MCIF_WB_COMMON_MASK_SH_LIST_DCN30(__SHIFT)
-};
-
-static const struct dcn30_mmhubbub_mask mcif_wb30_mask = {
-       MCIF_WB_COMMON_MASK_SH_LIST_DCN30(_MASK)
-};
-
-#define dsc_regsDCN20(id)\
-[id] = {\
-       DSC_REG_LIST_DCN20(id)\
-}
-
-static const struct dcn20_dsc_registers dsc_regs[] = {
-       dsc_regsDCN20(0),
-       dsc_regsDCN20(1),
-       dsc_regsDCN20(2)
-};
-
-static const struct dcn20_dsc_shift dsc_shift = {
-       DSC_REG_LIST_SH_MASK_DCN20(__SHIFT)
-};
-
-static const struct dcn20_dsc_mask dsc_mask = {
-       DSC_REG_LIST_SH_MASK_DCN20(_MASK)
-};
-
-static const struct dcn30_mpc_registers mpc_regs = {
-               MPC_REG_LIST_DCN3_0(0),
-               MPC_REG_LIST_DCN3_0(1),
-               MPC_REG_LIST_DCN3_0(2),
-               MPC_REG_LIST_DCN3_0(3),
-               MPC_OUT_MUX_REG_LIST_DCN3_0(0),
-               MPC_OUT_MUX_REG_LIST_DCN3_0(1),
-               MPC_OUT_MUX_REG_LIST_DCN3_0(2),
-               MPC_OUT_MUX_REG_LIST_DCN3_0(3),
-               MPC_DWB_MUX_REG_LIST_DCN3_0(0),
-};
-
-static const struct dcn30_mpc_shift mpc_shift = {
-       MPC_COMMON_MASK_SH_LIST_DCN30(__SHIFT)
-};
-
-static const struct dcn30_mpc_mask mpc_mask = {
-       MPC_COMMON_MASK_SH_LIST_DCN30(_MASK)
-};
-
-#define optc_regs(id)\
-[id] = {OPTC_COMMON_REG_LIST_DCN3_1(id)}
-
-static const struct dcn_optc_registers optc_regs[] = {
-       optc_regs(0),
-       optc_regs(1),
-       optc_regs(2),
-       optc_regs(3)
-};
-
-static const struct dcn_optc_shift optc_shift = {
-       OPTC_COMMON_MASK_SH_LIST_DCN3_1(__SHIFT)
-};
-
-static const struct dcn_optc_mask optc_mask = {
-       OPTC_COMMON_MASK_SH_LIST_DCN3_1(_MASK)
-};
-
-#define hubp_regs(id)\
-[id] = {\
-       HUBP_REG_LIST_DCN30(id)\
-}
-
-static const struct dcn_hubp2_registers hubp_regs[] = {
-               hubp_regs(0),
-               hubp_regs(1),
-               hubp_regs(2),
-               hubp_regs(3)
-};
-
-
-static const struct dcn_hubp2_shift hubp_shift = {
-               HUBP_MASK_SH_LIST_DCN31(__SHIFT)
-};
-
-static const struct dcn_hubp2_mask hubp_mask = {
-               HUBP_MASK_SH_LIST_DCN31(_MASK)
-};
-static const struct dcn_hubbub_registers hubbub_reg = {
-               HUBBUB_REG_LIST_DCN31(0)
-};
-
-static const struct dcn_hubbub_shift hubbub_shift = {
-               HUBBUB_MASK_SH_LIST_DCN31(__SHIFT)
-};
-
-static const struct dcn_hubbub_mask hubbub_mask = {
-               HUBBUB_MASK_SH_LIST_DCN31(_MASK)
-};
-
-static const struct dccg_registers dccg_regs = {
-               DCCG_REG_LIST_DCN31()
-};
-
-static const struct dccg_shift dccg_shift = {
-               DCCG_MASK_SH_LIST_DCN31(__SHIFT)
-};
-
-static const struct dccg_mask dccg_mask = {
-               DCCG_MASK_SH_LIST_DCN31(_MASK)
-};
-
-
-#define SRII2(reg_name_pre, reg_name_post, id)\
-       .reg_name_pre ## _ ##  reg_name_post[id] = BASE(reg ## reg_name_pre \
-                       ## id ## _ ## reg_name_post ## _BASE_IDX) + \
-                       reg ## reg_name_pre ## id ## _ ## reg_name_post
-
-
-#define HWSEQ_DCN31_REG_LIST()\
-       SR(DCHUBBUB_GLOBAL_TIMER_CNTL), \
-       SR(DCHUBBUB_ARB_HOSTVM_CNTL), \
-       SR(DIO_MEM_PWR_CTRL), \
-       SR(ODM_MEM_PWR_CTRL3), \
-       SR(DMU_MEM_PWR_CNTL), \
-       SR(MMHUBBUB_MEM_PWR_CNTL), \
-       SR(DCCG_GATE_DISABLE_CNTL), \
-       SR(DCCG_GATE_DISABLE_CNTL2), \
-       SR(DCFCLK_CNTL),\
-       SR(DC_MEM_GLOBAL_PWR_REQ_CNTL), \
-       SRII(PIXEL_RATE_CNTL, OTG, 0), \
-       SRII(PIXEL_RATE_CNTL, OTG, 1),\
-       SRII(PIXEL_RATE_CNTL, OTG, 2),\
-       SRII(PIXEL_RATE_CNTL, OTG, 3),\
-       SRII(PHYPLL_PIXEL_RATE_CNTL, OTG, 0),\
-       SRII(PHYPLL_PIXEL_RATE_CNTL, OTG, 1),\
-       SRII(PHYPLL_PIXEL_RATE_CNTL, OTG, 2),\
-       SRII(PHYPLL_PIXEL_RATE_CNTL, OTG, 3),\
-       SR(MICROSECOND_TIME_BASE_DIV), \
-       SR(MILLISECOND_TIME_BASE_DIV), \
-       SR(DISPCLK_FREQ_CHANGE_CNTL), \
-       SR(RBBMIF_TIMEOUT_DIS), \
-       SR(RBBMIF_TIMEOUT_DIS_2), \
-       SR(DCHUBBUB_CRC_CTRL), \
-       SR(DPP_TOP0_DPP_CRC_CTRL), \
-       SR(DPP_TOP0_DPP_CRC_VAL_B_A), \
-       SR(DPP_TOP0_DPP_CRC_VAL_R_G), \
-       SR(MPC_CRC_CTRL), \
-       SR(MPC_CRC_RESULT_GB), \
-       SR(MPC_CRC_RESULT_C), \
-       SR(MPC_CRC_RESULT_AR), \
-       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(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(D1VGA_CONTROL), \
-       SR(D2VGA_CONTROL), \
-       SR(D3VGA_CONTROL), \
-       SR(D4VGA_CONTROL), \
-       SR(D5VGA_CONTROL), \
-       SR(D6VGA_CONTROL), \
-       SR(DC_IP_REQUEST_CNTL), \
-       SR(AZALIA_AUDIO_DTO), \
-       SR(AZALIA_CONTROLLER_CLOCK_GATING), \
-       SR(HPO_TOP_HW_CONTROL)
-
-static const struct dce_hwseq_registers hwseq_reg = {
-               HWSEQ_DCN31_REG_LIST()
-};
-
-#define HWSEQ_DCN31_MASK_SH_LIST(mask_sh)\
-       HWSEQ_DCN_MASK_SH_LIST(mask_sh), \
-       HWS_SF(, DCHUBBUB_GLOBAL_TIMER_CNTL, DCHUBBUB_GLOBAL_TIMER_REFDIV, mask_sh), \
-       HWS_SF(, DCHUBBUB_ARB_HOSTVM_CNTL, DISABLE_HOSTVM_FORCE_ALLOW_PSTATE, mask_sh), \
-       HWS_SF(, DOMAIN0_PG_CONFIG, DOMAIN_POWER_FORCEON, mask_sh), \
-       HWS_SF(, DOMAIN0_PG_CONFIG, DOMAIN_POWER_GATE, mask_sh), \
-       HWS_SF(, DOMAIN1_PG_CONFIG, DOMAIN_POWER_FORCEON, mask_sh), \
-       HWS_SF(, DOMAIN1_PG_CONFIG, DOMAIN_POWER_GATE, mask_sh), \
-       HWS_SF(, DOMAIN2_PG_CONFIG, DOMAIN_POWER_FORCEON, mask_sh), \
-       HWS_SF(, DOMAIN2_PG_CONFIG, DOMAIN_POWER_GATE, mask_sh), \
-       HWS_SF(, DOMAIN3_PG_CONFIG, DOMAIN_POWER_FORCEON, mask_sh), \
-       HWS_SF(, DOMAIN3_PG_CONFIG, DOMAIN_POWER_GATE, mask_sh), \
-       HWS_SF(, DOMAIN16_PG_CONFIG, DOMAIN_POWER_FORCEON, mask_sh), \
-       HWS_SF(, DOMAIN16_PG_CONFIG, DOMAIN_POWER_GATE, mask_sh), \
-       HWS_SF(, DOMAIN17_PG_CONFIG, DOMAIN_POWER_FORCEON, mask_sh), \
-       HWS_SF(, DOMAIN17_PG_CONFIG, DOMAIN_POWER_GATE, mask_sh), \
-       HWS_SF(, DOMAIN18_PG_CONFIG, DOMAIN_POWER_FORCEON, mask_sh), \
-       HWS_SF(, DOMAIN18_PG_CONFIG, DOMAIN_POWER_GATE, mask_sh), \
-       HWS_SF(, DOMAIN0_PG_STATUS, DOMAIN_PGFSM_PWR_STATUS, mask_sh), \
-       HWS_SF(, DOMAIN1_PG_STATUS, DOMAIN_PGFSM_PWR_STATUS, mask_sh), \
-       HWS_SF(, DOMAIN2_PG_STATUS, DOMAIN_PGFSM_PWR_STATUS, mask_sh), \
-       HWS_SF(, DOMAIN3_PG_STATUS, DOMAIN_PGFSM_PWR_STATUS, mask_sh), \
-       HWS_SF(, DOMAIN16_PG_STATUS, DOMAIN_PGFSM_PWR_STATUS, mask_sh), \
-       HWS_SF(, DOMAIN17_PG_STATUS, DOMAIN_PGFSM_PWR_STATUS, mask_sh), \
-       HWS_SF(, DOMAIN18_PG_STATUS, DOMAIN_PGFSM_PWR_STATUS, mask_sh), \
-       HWS_SF(, DC_IP_REQUEST_CNTL, IP_REQUEST_EN, mask_sh), \
-       HWS_SF(, AZALIA_AUDIO_DTO, AZALIA_AUDIO_DTO_MODULE, mask_sh), \
-       HWS_SF(, HPO_TOP_CLOCK_CONTROL, HPO_HDMISTREAMCLK_G_GATE_DIS, mask_sh), \
-       HWS_SF(, DMU_MEM_PWR_CNTL, DMCU_ERAM_MEM_PWR_FORCE, mask_sh), \
-       HWS_SF(, ODM_MEM_PWR_CTRL3, ODM_MEM_UNASSIGNED_PWR_MODE, mask_sh), \
-       HWS_SF(, ODM_MEM_PWR_CTRL3, ODM_MEM_VBLANK_PWR_MODE, mask_sh), \
-       HWS_SF(, MMHUBBUB_MEM_PWR_CNTL, VGA_MEM_PWR_FORCE, mask_sh), \
-       HWS_SF(, DIO_MEM_PWR_CTRL, I2C_LIGHT_SLEEP_FORCE, mask_sh), \
-       HWS_SF(, HPO_TOP_HW_CONTROL, HPO_IO_EN, mask_sh)
-
-static const struct dce_hwseq_shift hwseq_shift = {
-               HWSEQ_DCN31_MASK_SH_LIST(__SHIFT)
-};
-
-static const struct dce_hwseq_mask hwseq_mask = {
-               HWSEQ_DCN31_MASK_SH_LIST(_MASK)
-};
-#define vmid_regs(id)\
-[id] = {\
-               DCN20_VMID_REG_LIST(id)\
-}
-
-static const struct dcn_vmid_registers vmid_regs[] = {
-       vmid_regs(0),
-       vmid_regs(1),
-       vmid_regs(2),
-       vmid_regs(3),
-       vmid_regs(4),
-       vmid_regs(5),
-       vmid_regs(6),
-       vmid_regs(7),
-       vmid_regs(8),
-       vmid_regs(9),
-       vmid_regs(10),
-       vmid_regs(11),
-       vmid_regs(12),
-       vmid_regs(13),
-       vmid_regs(14),
-       vmid_regs(15)
-};
-
-static const struct dcn20_vmid_shift vmid_shifts = {
-               DCN20_VMID_MASK_SH_LIST(__SHIFT)
-};
-
-static const struct dcn20_vmid_mask vmid_masks = {
-               DCN20_VMID_MASK_SH_LIST(_MASK)
-};
-
-static const struct resource_caps res_cap_dcn31 = {
-       .num_timing_generator = 4,
-       .num_opp = 4,
-       .num_video_plane = 4,
-       .num_audio = 5,
-       .num_stream_encoder = 5,
-       .num_dig_link_enc = 5,
-       .num_hpo_dp_stream_encoder = 4,
-       .num_hpo_dp_link_encoder = 2,
-       .num_pll = 5,
-       .num_dwb = 1,
-       .num_ddc = 5,
-       .num_vmid = 16,
-       .num_mpc_3dlut = 2,
-       .num_dsc = 3,
-};
-
-static const struct dc_plane_cap plane_cap = {
-       .type = DC_PLANE_TYPE_DCN_UNIVERSAL,
-       .per_pixel_alpha = true,
-
-       .pixel_format_support = {
-                       .argb8888 = true,
-                       .nv12 = true,
-                       .fp16 = true,
-                       .p010 = true,
-                       .ayuv = false,
-       },
-
-       .max_upscale_factor = {
-                       .argb8888 = 16000,
-                       .nv12 = 16000,
-                       .fp16 = 16000
-       },
-
-       // 6:1 downscaling ratio: 1000/6 = 166.666
-       .max_downscale_factor = {
-                       .argb8888 = 167,
-                       .nv12 = 167,
-                       .fp16 = 167
-       },
-       64,
-       64
-};
-
-static const struct dc_debug_options debug_defaults_drv = {
-       .disable_z10 = true, /*hw not support it*/
-       .disable_dmcu = true,
-       .force_abm_enable = false,
-       .timing_trace = false,
-       .clock_trace = true,
-       .disable_pplib_clock_request = false,
-       .pipe_split_policy = MPC_SPLIT_DYNAMIC,
-       .force_single_disp_pipe_split = false,
-       .disable_dcc = DCC_ENABLE,
-       .vsr_support = true,
-       .performance_trace = false,
-       .max_downscale_src_width = 4096,/*upto true 4k*/
-       .disable_pplib_wm_range = false,
-       .scl_reset_length10 = true,
-       .sanity_checks = false,
-       .underflow_assert_delay_us = 0xFFFFFFFF,
-       .dwb_fi_phase = -1, // -1 = disable,
-       .dmub_command_table = true,
-       .pstate_enabled = true,
-       .use_max_lb = true,
-       .enable_mem_low_power = {
-               .bits = {
-                       .vga = true,
-                       .i2c = true,
-                       .dmcu = false, // This is previously known to cause hang on S3 cycles if enabled
-                       .dscl = true,
-                       .cm = true,
-                       .mpc = true,
-                       .optc = true,
-                       .vpg = true,
-                       .afmt = true,
-               }
-       },
-       .enable_legacy_fast_update = true,
-       .psr_power_use_phy_fsm = 0,
-       .using_dml2 = false,
-};
-
-static const struct dc_panel_config panel_config_defaults = {
-       .psr = {
-               .disable_psr = false,
-               .disallow_psrsu = false,
-               .disallow_replay = false,
-       },
-       .ilr = {
-               .optimize_edp_link_rate = true,
-       },
-};
-
-static void dcn31_dpp_destroy(struct dpp **dpp)
-{
-       kfree(TO_DCN20_DPP(*dpp));
-       *dpp = NULL;
-}
-
-static struct dpp *dcn31_dpp_create(
-       struct dc_context *ctx,
-       uint32_t inst)
-{
-       struct dcn3_dpp *dpp =
-               kzalloc(sizeof(struct dcn3_dpp), GFP_KERNEL);
-
-       if (!dpp)
-               return NULL;
-
-       if (dpp3_construct(dpp, ctx, inst,
-                       &dpp_regs[inst], &tf_shift, &tf_mask))
-               return &dpp->base;
-
-       BREAK_TO_DEBUGGER();
-       kfree(dpp);
-       return NULL;
-}
-
-static struct output_pixel_processor *dcn31_opp_create(
-       struct dc_context *ctx, uint32_t inst)
-{
-       struct dcn20_opp *opp =
-               kzalloc(sizeof(struct dcn20_opp), GFP_KERNEL);
-
-       if (!opp) {
-               BREAK_TO_DEBUGGER();
-               return NULL;
-       }
-
-       dcn20_opp_construct(opp, ctx, inst,
-                       &opp_regs[inst], &opp_shift, &opp_mask);
-       return &opp->base;
-}
-
-static struct dce_aux *dcn31_aux_engine_create(
-       struct dc_context *ctx,
-       uint32_t inst)
-{
-       struct aux_engine_dce110 *aux_engine =
-               kzalloc(sizeof(struct aux_engine_dce110), GFP_KERNEL);
-
-       if (!aux_engine)
-               return NULL;
-
-       dce110_aux_engine_construct(aux_engine, ctx, inst,
-                                   SW_AUX_TIMEOUT_PERIOD_MULTIPLIER * AUX_TIMEOUT_PERIOD,
-                                   &aux_engine_regs[inst],
-                                       &aux_mask,
-                                       &aux_shift,
-                                       ctx->dc->caps.extended_aux_timeout_support);
-
-       return &aux_engine->base;
-}
-#define i2c_inst_regs(id) { I2C_HW_ENGINE_COMMON_REG_LIST_DCN30(id) }
-
-static const struct dce_i2c_registers i2c_hw_regs[] = {
-               i2c_inst_regs(1),
-               i2c_inst_regs(2),
-               i2c_inst_regs(3),
-               i2c_inst_regs(4),
-               i2c_inst_regs(5),
-};
-
-static const struct dce_i2c_shift i2c_shifts = {
-               I2C_COMMON_MASK_SH_LIST_DCN30(__SHIFT)
-};
-
-static const struct dce_i2c_mask i2c_masks = {
-               I2C_COMMON_MASK_SH_LIST_DCN30(_MASK)
-};
-
-static struct dce_i2c_hw *dcn31_i2c_hw_create(
-       struct dc_context *ctx,
-       uint32_t inst)
-{
-       struct dce_i2c_hw *dce_i2c_hw =
-               kzalloc(sizeof(struct dce_i2c_hw), GFP_KERNEL);
-
-       if (!dce_i2c_hw)
-               return NULL;
-
-       dcn2_i2c_hw_construct(dce_i2c_hw, ctx, inst,
-                                   &i2c_hw_regs[inst], &i2c_shifts, &i2c_masks);
-
-       return dce_i2c_hw;
-}
-static struct mpc *dcn31_mpc_create(
-               struct dc_context *ctx,
-               int num_mpcc,
-               int num_rmu)
-{
-       struct dcn30_mpc *mpc30 = kzalloc(sizeof(struct dcn30_mpc),
-                                         GFP_KERNEL);
-
-       if (!mpc30)
-               return NULL;
-
-       dcn30_mpc_construct(mpc30, ctx,
-                       &mpc_regs,
-                       &mpc_shift,
-                       &mpc_mask,
-                       num_mpcc,
-                       num_rmu);
-
-       return &mpc30->base;
-}
-
-static struct hubbub *dcn31_hubbub_create(struct dc_context *ctx)
-{
-       int i;
-
-       struct dcn20_hubbub *hubbub3 = kzalloc(sizeof(struct dcn20_hubbub),
-                                         GFP_KERNEL);
-
-       if (!hubbub3)
-               return NULL;
-
-       hubbub31_construct(hubbub3, ctx,
-                       &hubbub_reg,
-                       &hubbub_shift,
-                       &hubbub_mask,
-                       dcn3_15_ip.det_buffer_size_kbytes,
-                       dcn3_15_ip.pixel_chunk_size_kbytes,
-                       dcn3_15_ip.config_return_buffer_size_in_kbytes);
-
-
-       for (i = 0; i < res_cap_dcn31.num_vmid; i++) {
-               struct dcn20_vmid *vmid = &hubbub3->vmid[i];
-
-               vmid->ctx = ctx;
-
-               vmid->regs = &vmid_regs[i];
-               vmid->shifts = &vmid_shifts;
-               vmid->masks = &vmid_masks;
-       }
-
-       return &hubbub3->base;
-}
-
-static struct timing_generator *dcn31_timing_generator_create(
-               struct dc_context *ctx,
-               uint32_t instance)
-{
-       struct optc *tgn10 =
-               kzalloc(sizeof(struct optc), GFP_KERNEL);
-
-       if (!tgn10)
-               return NULL;
-
-       tgn10->base.inst = instance;
-       tgn10->base.ctx = ctx;
-
-       tgn10->tg_regs = &optc_regs[instance];
-       tgn10->tg_shift = &optc_shift;
-       tgn10->tg_mask = &optc_mask;
-
-       dcn31_timing_generator_init(tgn10);
-
-       return &tgn10->base;
-}
-
-static const struct encoder_feature_support link_enc_feature = {
-               .max_hdmi_deep_color = COLOR_DEPTH_121212,
-               .max_hdmi_pixel_clock = 600000,
-               .hdmi_ycbcr420_supported = true,
-               .dp_ycbcr420_supported = true,
-               .fec_supported = true,
-               .flags.bits.IS_HBR2_CAPABLE = true,
-               .flags.bits.IS_HBR3_CAPABLE = true,
-               .flags.bits.IS_TPS3_CAPABLE = true,
-               .flags.bits.IS_TPS4_CAPABLE = true
-};
-
-static struct link_encoder *dcn31_link_encoder_create(
-       struct dc_context *ctx,
-       const struct encoder_init_data *enc_init_data)
-{
-       struct dcn20_link_encoder *enc20 =
-               kzalloc(sizeof(struct dcn20_link_encoder), GFP_KERNEL);
-
-       if (!enc20)
-               return NULL;
-
-       dcn31_link_encoder_construct(enc20,
-                       enc_init_data,
-                       &link_enc_feature,
-                       &link_enc_regs[enc_init_data->transmitter],
-                       &link_enc_aux_regs[enc_init_data->channel - 1],
-                       &link_enc_hpd_regs[enc_init_data->hpd_source],
-                       &le_shift,
-                       &le_mask);
-
-       return &enc20->enc10.base;
-}
-
-/* Create a minimal link encoder object not associated with a particular
- * physical connector.
- * resource_funcs.link_enc_create_minimal
- */
-static struct link_encoder *dcn31_link_enc_create_minimal(
-               struct dc_context *ctx, enum engine_id eng_id)
-{
-       struct dcn20_link_encoder *enc20;
-
-       if ((eng_id - ENGINE_ID_DIGA) > ctx->dc->res_pool->res_cap->num_dig_link_enc)
-               return NULL;
-
-       enc20 = kzalloc(sizeof(struct dcn20_link_encoder), GFP_KERNEL);
-       if (!enc20)
-               return NULL;
-
-       dcn31_link_encoder_construct_minimal(
-                       enc20,
-                       ctx,
-                       &link_enc_feature,
-                       &link_enc_regs[eng_id - ENGINE_ID_DIGA],
-                       eng_id);
-
-       return &enc20->enc10.base;
-}
-
-static struct panel_cntl *dcn31_panel_cntl_create(const struct panel_cntl_init_data *init_data)
-{
-       struct dcn31_panel_cntl *panel_cntl =
-               kzalloc(sizeof(struct dcn31_panel_cntl), GFP_KERNEL);
-
-       if (!panel_cntl)
-               return NULL;
-
-       dcn31_panel_cntl_construct(panel_cntl, init_data);
-
-       return &panel_cntl->base;
-}
-
-static void read_dce_straps(
-       struct dc_context *ctx,
-       struct resource_straps *straps)
-{
-       generic_reg_get(ctx, regDC_PINSTRAPS + BASE(regDC_PINSTRAPS_BASE_IDX),
-               FN(DC_PINSTRAPS, DC_PINSTRAPS_AUDIO), &straps->dc_pinstraps_audio);
-
-}
-
-static struct audio *dcn31_create_audio(
-               struct dc_context *ctx, unsigned int inst)
-{
-       return dce_audio_create(ctx, inst,
-                       &audio_regs[inst], &audio_shift, &audio_mask);
-}
-
-static struct vpg *dcn31_vpg_create(
-       struct dc_context *ctx,
-       uint32_t inst)
-{
-       struct dcn31_vpg *vpg31 = kzalloc(sizeof(struct dcn31_vpg), GFP_KERNEL);
-
-       if (!vpg31)
-               return NULL;
-
-       vpg31_construct(vpg31, ctx, inst,
-                       &vpg_regs[inst],
-                       &vpg_shift,
-                       &vpg_mask);
-
-       return &vpg31->base;
-}
-
-static struct afmt *dcn31_afmt_create(
-       struct dc_context *ctx,
-       uint32_t inst)
-{
-       struct dcn31_afmt *afmt31 = kzalloc(sizeof(struct dcn31_afmt), GFP_KERNEL);
-
-       if (!afmt31)
-               return NULL;
-
-       afmt31_construct(afmt31, ctx, inst,
-                       &afmt_regs[inst],
-                       &afmt_shift,
-                       &afmt_mask);
-
-       // Light sleep by default, no need to power down here
-
-       return &afmt31->base;
-}
-
-static struct apg *dcn31_apg_create(
-       struct dc_context *ctx,
-       uint32_t inst)
-{
-       struct dcn31_apg *apg31 = kzalloc(sizeof(struct dcn31_apg), GFP_KERNEL);
-
-       if (!apg31)
-               return NULL;
-
-       apg31_construct(apg31, ctx, inst,
-                       &apg_regs[inst],
-                       &apg_shift,
-                       &apg_mask);
-
-       return &apg31->base;
-}
-
-static struct stream_encoder *dcn315_stream_encoder_create(
-       enum engine_id eng_id,
-       struct dc_context *ctx)
-{
-       struct dcn10_stream_encoder *enc1;
-       struct vpg *vpg;
-       struct afmt *afmt;
-       int vpg_inst;
-       int afmt_inst;
-
-       /*PHYB is wired off in HW, allow front end to remapping, otherwise needs more changes*/
-
-       /* Mapping of VPG, AFMT, DME register blocks to DIO block instance */
-       if (eng_id <= ENGINE_ID_DIGF) {
-               vpg_inst = eng_id;
-               afmt_inst = eng_id;
-       } else
-               return NULL;
-
-       enc1 = kzalloc(sizeof(struct dcn10_stream_encoder), GFP_KERNEL);
-       vpg = dcn31_vpg_create(ctx, vpg_inst);
-       afmt = dcn31_afmt_create(ctx, afmt_inst);
-
-       if (!enc1 || !vpg || !afmt) {
-               kfree(enc1);
-               kfree(vpg);
-               kfree(afmt);
-               return NULL;
-       }
-
-       dcn30_dio_stream_encoder_construct(enc1, ctx, ctx->dc_bios,
-                                       eng_id, vpg, afmt,
-                                       &stream_enc_regs[eng_id],
-                                       &se_shift, &se_mask);
-
-       return &enc1->base;
-}
-
-static struct hpo_dp_stream_encoder *dcn31_hpo_dp_stream_encoder_create(
-       enum engine_id eng_id,
-       struct dc_context *ctx)
-{
-       struct dcn31_hpo_dp_stream_encoder *hpo_dp_enc31;
-       struct vpg *vpg;
-       struct apg *apg;
-       uint32_t hpo_dp_inst;
-       uint32_t vpg_inst;
-       uint32_t apg_inst;
-
-       ASSERT((eng_id >= ENGINE_ID_HPO_DP_0) && (eng_id <= ENGINE_ID_HPO_DP_3));
-       hpo_dp_inst = eng_id - ENGINE_ID_HPO_DP_0;
-
-       /* Mapping of VPG register blocks to HPO DP block instance:
-        * VPG[6] -> HPO_DP[0]
-        * VPG[7] -> HPO_DP[1]
-        * VPG[8] -> HPO_DP[2]
-        * VPG[9] -> HPO_DP[3]
-        */
-       vpg_inst = hpo_dp_inst + 6;
-
-       /* Mapping of APG register blocks to HPO DP block instance:
-        * APG[0] -> HPO_DP[0]
-        * APG[1] -> HPO_DP[1]
-        * APG[2] -> HPO_DP[2]
-        * APG[3] -> HPO_DP[3]
-        */
-       apg_inst = hpo_dp_inst;
-
-       /* allocate HPO stream encoder and create VPG sub-block */
-       hpo_dp_enc31 = kzalloc(sizeof(struct dcn31_hpo_dp_stream_encoder), GFP_KERNEL);
-       vpg = dcn31_vpg_create(ctx, vpg_inst);
-       apg = dcn31_apg_create(ctx, apg_inst);
-
-       if (!hpo_dp_enc31 || !vpg || !apg) {
-               kfree(hpo_dp_enc31);
-               kfree(vpg);
-               kfree(apg);
-               return NULL;
-       }
-
-       dcn31_hpo_dp_stream_encoder_construct(hpo_dp_enc31, ctx, ctx->dc_bios,
-                                       hpo_dp_inst, eng_id, vpg, apg,
-                                       &hpo_dp_stream_enc_regs[hpo_dp_inst],
-                                       &hpo_dp_se_shift, &hpo_dp_se_mask);
-
-       return &hpo_dp_enc31->base;
-}
-
-static struct hpo_dp_link_encoder *dcn31_hpo_dp_link_encoder_create(
-       uint8_t inst,
-       struct dc_context *ctx)
-{
-       struct dcn31_hpo_dp_link_encoder *hpo_dp_enc31;
-
-       /* allocate HPO link encoder */
-       hpo_dp_enc31 = kzalloc(sizeof(struct dcn31_hpo_dp_link_encoder), GFP_KERNEL);
-
-       hpo_dp_link_encoder31_construct(hpo_dp_enc31, ctx, inst,
-                                       &hpo_dp_link_enc_regs[inst],
-                                       &hpo_dp_le_shift, &hpo_dp_le_mask);
-
-       return &hpo_dp_enc31->base;
-}
-
-static struct dce_hwseq *dcn31_hwseq_create(
-       struct dc_context *ctx)
-{
-       struct dce_hwseq *hws = kzalloc(sizeof(struct dce_hwseq), GFP_KERNEL);
-
-       if (hws) {
-               hws->ctx = ctx;
-               hws->regs = &hwseq_reg;
-               hws->shifts = &hwseq_shift;
-               hws->masks = &hwseq_mask;
-       }
-       return hws;
-}
-static const struct resource_create_funcs res_create_funcs = {
-       .read_dce_straps = read_dce_straps,
-       .create_audio = dcn31_create_audio,
-       .create_stream_encoder = dcn315_stream_encoder_create,
-       .create_hpo_dp_stream_encoder = dcn31_hpo_dp_stream_encoder_create,
-       .create_hpo_dp_link_encoder = dcn31_hpo_dp_link_encoder_create,
-       .create_hwseq = dcn31_hwseq_create,
-};
-
-static void dcn315_resource_destruct(struct dcn315_resource_pool *pool)
-{
-       unsigned int i;
-
-       for (i = 0; i < pool->base.stream_enc_count; i++) {
-               if (pool->base.stream_enc[i] != NULL) {
-                       if (pool->base.stream_enc[i]->vpg != NULL) {
-                               kfree(DCN30_VPG_FROM_VPG(pool->base.stream_enc[i]->vpg));
-                               pool->base.stream_enc[i]->vpg = NULL;
-                       }
-                       if (pool->base.stream_enc[i]->afmt != NULL) {
-                               kfree(DCN30_AFMT_FROM_AFMT(pool->base.stream_enc[i]->afmt));
-                               pool->base.stream_enc[i]->afmt = NULL;
-                       }
-                       kfree(DCN10STRENC_FROM_STRENC(pool->base.stream_enc[i]));
-                       pool->base.stream_enc[i] = NULL;
-               }
-       }
-
-       for (i = 0; i < pool->base.hpo_dp_stream_enc_count; i++) {
-               if (pool->base.hpo_dp_stream_enc[i] != NULL) {
-                       if (pool->base.hpo_dp_stream_enc[i]->vpg != NULL) {
-                               kfree(DCN30_VPG_FROM_VPG(pool->base.hpo_dp_stream_enc[i]->vpg));
-                               pool->base.hpo_dp_stream_enc[i]->vpg = NULL;
-                       }
-                       if (pool->base.hpo_dp_stream_enc[i]->apg != NULL) {
-                               kfree(DCN31_APG_FROM_APG(pool->base.hpo_dp_stream_enc[i]->apg));
-                               pool->base.hpo_dp_stream_enc[i]->apg = NULL;
-                       }
-                       kfree(DCN3_1_HPO_DP_STREAM_ENC_FROM_HPO_STREAM_ENC(pool->base.hpo_dp_stream_enc[i]));
-                       pool->base.hpo_dp_stream_enc[i] = NULL;
-               }
-       }
-
-       for (i = 0; i < pool->base.hpo_dp_link_enc_count; i++) {
-               if (pool->base.hpo_dp_link_enc[i] != NULL) {
-                       kfree(DCN3_1_HPO_DP_LINK_ENC_FROM_HPO_LINK_ENC(pool->base.hpo_dp_link_enc[i]));
-                       pool->base.hpo_dp_link_enc[i] = NULL;
-               }
-       }
-
-       for (i = 0; i < pool->base.res_cap->num_dsc; i++) {
-               if (pool->base.dscs[i] != NULL)
-                       dcn20_dsc_destroy(&pool->base.dscs[i]);
-       }
-
-       if (pool->base.mpc != NULL) {
-               kfree(TO_DCN20_MPC(pool->base.mpc));
-               pool->base.mpc = NULL;
-       }
-       if (pool->base.hubbub != NULL) {
-               kfree(pool->base.hubbub);
-               pool->base.hubbub = NULL;
-       }
-       for (i = 0; i < pool->base.pipe_count; i++) {
-               if (pool->base.dpps[i] != NULL)
-                       dcn31_dpp_destroy(&pool->base.dpps[i]);
-
-               if (pool->base.ipps[i] != NULL)
-                       pool->base.ipps[i]->funcs->ipp_destroy(&pool->base.ipps[i]);
-
-               if (pool->base.hubps[i] != NULL) {
-                       kfree(TO_DCN20_HUBP(pool->base.hubps[i]));
-                       pool->base.hubps[i] = NULL;
-               }
-
-               if (pool->base.irqs != NULL) {
-                       dal_irq_service_destroy(&pool->base.irqs);
-               }
-       }
-
-       for (i = 0; i < pool->base.res_cap->num_ddc; i++) {
-               if (pool->base.engines[i] != NULL)
-                       dce110_engine_destroy(&pool->base.engines[i]);
-               if (pool->base.hw_i2cs[i] != NULL) {
-                       kfree(pool->base.hw_i2cs[i]);
-                       pool->base.hw_i2cs[i] = NULL;
-               }
-               if (pool->base.sw_i2cs[i] != NULL) {
-                       kfree(pool->base.sw_i2cs[i]);
-                       pool->base.sw_i2cs[i] = NULL;
-               }
-       }
-
-       for (i = 0; i < pool->base.res_cap->num_opp; i++) {
-               if (pool->base.opps[i] != NULL)
-                       pool->base.opps[i]->funcs->opp_destroy(&pool->base.opps[i]);
-       }
-
-       for (i = 0; i < pool->base.res_cap->num_timing_generator; i++) {
-               if (pool->base.timing_generators[i] != NULL)    {
-                       kfree(DCN10TG_FROM_TG(pool->base.timing_generators[i]));
-                       pool->base.timing_generators[i] = NULL;
-               }
-       }
-
-       for (i = 0; i < pool->base.res_cap->num_dwb; i++) {
-               if (pool->base.dwbc[i] != NULL) {
-                       kfree(TO_DCN30_DWBC(pool->base.dwbc[i]));
-                       pool->base.dwbc[i] = NULL;
-               }
-               if (pool->base.mcif_wb[i] != NULL) {
-                       kfree(TO_DCN30_MMHUBBUB(pool->base.mcif_wb[i]));
-                       pool->base.mcif_wb[i] = NULL;
-               }
-       }
-
-       for (i = 0; i < pool->base.audio_count; i++) {
-               if (pool->base.audios[i])
-                       dce_aud_destroy(&pool->base.audios[i]);
-       }
-
-       for (i = 0; i < pool->base.clk_src_count; i++) {
-               if (pool->base.clock_sources[i] != NULL) {
-                       dcn20_clock_source_destroy(&pool->base.clock_sources[i]);
-                       pool->base.clock_sources[i] = NULL;
-               }
-       }
-
-       for (i = 0; i < pool->base.res_cap->num_mpc_3dlut; i++) {
-               if (pool->base.mpc_lut[i] != NULL) {
-                       dc_3dlut_func_release(pool->base.mpc_lut[i]);
-                       pool->base.mpc_lut[i] = NULL;
-               }
-               if (pool->base.mpc_shaper[i] != NULL) {
-                       dc_transfer_func_release(pool->base.mpc_shaper[i]);
-                       pool->base.mpc_shaper[i] = NULL;
-               }
-       }
-
-       if (pool->base.dp_clock_source != NULL) {
-               dcn20_clock_source_destroy(&pool->base.dp_clock_source);
-               pool->base.dp_clock_source = NULL;
-       }
-
-       for (i = 0; i < pool->base.res_cap->num_timing_generator; i++) {
-               if (pool->base.multiple_abms[i] != NULL)
-                       dce_abm_destroy(&pool->base.multiple_abms[i]);
-       }
-
-       if (pool->base.psr != NULL)
-               dmub_psr_destroy(&pool->base.psr);
-
-       if (pool->base.dccg != NULL)
-               dcn_dccg_destroy(&pool->base.dccg);
-}
-
-static struct hubp *dcn31_hubp_create(
-       struct dc_context *ctx,
-       uint32_t inst)
-{
-       struct dcn20_hubp *hubp2 =
-               kzalloc(sizeof(struct dcn20_hubp), GFP_KERNEL);
-
-       if (!hubp2)
-               return NULL;
-
-       if (hubp31_construct(hubp2, ctx, inst,
-                       &hubp_regs[inst], &hubp_shift, &hubp_mask))
-               return &hubp2->base;
-
-       BREAK_TO_DEBUGGER();
-       kfree(hubp2);
-       return NULL;
-}
-
-static bool dcn31_dwbc_create(struct dc_context *ctx, struct resource_pool *pool)
-{
-       int i;
-       uint32_t pipe_count = pool->res_cap->num_dwb;
-
-       for (i = 0; i < pipe_count; i++) {
-               struct dcn30_dwbc *dwbc30 = kzalloc(sizeof(struct dcn30_dwbc),
-                                                   GFP_KERNEL);
-
-               if (!dwbc30) {
-                       dm_error("DC: failed to create dwbc30!\n");
-                       return false;
-               }
-
-               dcn30_dwbc_construct(dwbc30, ctx,
-                               &dwbc30_regs[i],
-                               &dwbc30_shift,
-                               &dwbc30_mask,
-                               i);
-
-               pool->dwbc[i] = &dwbc30->base;
-       }
-       return true;
-}
-
-static bool dcn31_mmhubbub_create(struct dc_context *ctx, struct resource_pool *pool)
-{
-       int i;
-       uint32_t pipe_count = pool->res_cap->num_dwb;
-
-       for (i = 0; i < pipe_count; i++) {
-               struct dcn30_mmhubbub *mcif_wb30 = kzalloc(sizeof(struct dcn30_mmhubbub),
-                                                   GFP_KERNEL);
-
-               if (!mcif_wb30) {
-                       dm_error("DC: failed to create mcif_wb30!\n");
-                       return false;
-               }
-
-               dcn30_mmhubbub_construct(mcif_wb30, ctx,
-                               &mcif_wb30_regs[i],
-                               &mcif_wb30_shift,
-                               &mcif_wb30_mask,
-                               i);
-
-               pool->mcif_wb[i] = &mcif_wb30->base;
-       }
-       return true;
-}
-
-static struct display_stream_compressor *dcn31_dsc_create(
-       struct dc_context *ctx, uint32_t inst)
-{
-       struct dcn20_dsc *dsc =
-               kzalloc(sizeof(struct dcn20_dsc), GFP_KERNEL);
-
-       if (!dsc) {
-               BREAK_TO_DEBUGGER();
-               return NULL;
-       }
-
-       dsc2_construct(dsc, ctx, inst, &dsc_regs[inst], &dsc_shift, &dsc_mask);
-       return &dsc->base;
-}
-
-static void dcn315_destroy_resource_pool(struct resource_pool **pool)
-{
-       struct dcn315_resource_pool *dcn31_pool = TO_DCN315_RES_POOL(*pool);
-
-       dcn315_resource_destruct(dcn31_pool);
-       kfree(dcn31_pool);
-       *pool = NULL;
-}
-
-static struct clock_source *dcn31_clock_source_create(
-               struct dc_context *ctx,
-               struct dc_bios *bios,
-               enum clock_source_id id,
-               const struct dce110_clk_src_regs *regs,
-               bool dp_clk_src)
-{
-       struct dce110_clk_src *clk_src =
-               kzalloc(sizeof(struct dce110_clk_src), GFP_KERNEL);
-
-       if (!clk_src)
-               return NULL;
-
-       if (dcn31_clk_src_construct(clk_src, ctx, bios, id,
-                       regs, &cs_shift, &cs_mask)) {
-               clk_src->base.dp_clk_src = dp_clk_src;
-               return &clk_src->base;
-       }
-
-       kfree(clk_src);
-       BREAK_TO_DEBUGGER();
-       return NULL;
-}
-
-static bool is_dual_plane(enum surface_pixel_format format)
-{
-       return format >= SURFACE_PIXEL_FORMAT_VIDEO_BEGIN || format == SURFACE_PIXEL_FORMAT_GRPH_RGBE_ALPHA;
-}
-
-static int source_format_to_bpp (enum source_format_class SourcePixelFormat)
-{
-       if (SourcePixelFormat == dm_444_64)
-               return 8;
-       else if (SourcePixelFormat == dm_444_16)
-               return 2;
-       else if (SourcePixelFormat == dm_444_8)
-               return 1;
-       else if (SourcePixelFormat == dm_rgbe_alpha)
-               return 5;
-       else if (SourcePixelFormat == dm_420_8)
-               return 3;
-       else if (SourcePixelFormat == dm_420_12)
-               return 6;
-       else
-               return 4;
-}
-
-static bool allow_pixel_rate_crb(struct dc *dc, struct dc_state *context)
-{
-       int i;
-       struct resource_context *res_ctx = &context->res_ctx;
-
-       /*Don't apply for single stream*/
-       if (context->stream_count < 2)
-               return false;
-
-       for (i = 0; i < dc->res_pool->pipe_count; i++) {
-               if (!res_ctx->pipe_ctx[i].stream)
-                       continue;
-
-               /*Don't apply if scaling*/
-               if (res_ctx->pipe_ctx[i].stream->src.width != res_ctx->pipe_ctx[i].stream->dst.width ||
-                               res_ctx->pipe_ctx[i].stream->src.height != res_ctx->pipe_ctx[i].stream->dst.height ||
-                               (res_ctx->pipe_ctx[i].plane_state && (res_ctx->pipe_ctx[i].plane_state->src_rect.width
-                                                                                                               != res_ctx->pipe_ctx[i].plane_state->dst_rect.width ||
-                                       res_ctx->pipe_ctx[i].plane_state->src_rect.height
-                                                                                                               != res_ctx->pipe_ctx[i].plane_state->dst_rect.height)))
-                       return false;
-               /*Don't apply if MPO to avoid transition issues*/
-               if (res_ctx->pipe_ctx[i].top_pipe && res_ctx->pipe_ctx[i].top_pipe->plane_state != res_ctx->pipe_ctx[i].plane_state)
-                       return false;
-       }
-       return true;
-}
-
-static int dcn315_populate_dml_pipes_from_context(
-       struct dc *dc, struct dc_state *context,
-       display_e2e_pipe_params_st *pipes,
-       bool fast_validate)
-{
-       int i, pipe_cnt, crb_idx, crb_pipes;
-       struct resource_context *res_ctx = &context->res_ctx;
-       struct pipe_ctx *pipe = NULL;
-       const int max_usable_det = context->bw_ctx.dml.ip.config_return_buffer_size_in_kbytes - DCN3_15_MIN_COMPBUF_SIZE_KB;
-       int remaining_det_segs = max_usable_det / DCN3_15_CRB_SEGMENT_SIZE_KB;
-       bool pixel_rate_crb = allow_pixel_rate_crb(dc, context);
-
-       DC_FP_START();
-       dcn31x_populate_dml_pipes_from_context(dc, context, pipes, fast_validate);
-       DC_FP_END();
-
-       for (i = 0, pipe_cnt = 0, crb_pipes = 0; i < dc->res_pool->pipe_count; i++) {
-               struct dc_crtc_timing *timing;
-
-               if (!res_ctx->pipe_ctx[i].stream)
-                       continue;
-               pipe = &res_ctx->pipe_ctx[i];
-               timing = &pipe->stream->timing;
-
-               /*
-                * Immediate flip can be set dynamically after enabling the plane.
-                * We need to require support for immediate flip or underflow can be
-                * intermittently experienced depending on peak b/w requirements.
-                */
-               pipes[pipe_cnt].pipe.src.immediate_flip = true;
-
-               pipes[pipe_cnt].pipe.src.unbounded_req_mode = false;
-               pipes[pipe_cnt].pipe.dest.vfront_porch = timing->v_front_porch;
-               pipes[pipe_cnt].pipe.src.dcc_rate = 3;
-               pipes[pipe_cnt].dout.dsc_input_bpc = 0;
-               DC_FP_START();
-               dcn31_zero_pipe_dcc_fraction(pipes, pipe_cnt);
-               if (pixel_rate_crb && !pipe->top_pipe && !pipe->prev_odm_pipe) {
-                       int bpp = source_format_to_bpp(pipes[pipe_cnt].pipe.src.source_format);
-                       /* Ceil to crb segment size */
-                       int approx_det_segs_required_for_pstate = dcn_get_approx_det_segs_required_for_pstate(
-                                       &context->bw_ctx.dml.soc, timing->pix_clk_100hz, bpp, DCN3_15_CRB_SEGMENT_SIZE_KB);
-
-                       if (approx_det_segs_required_for_pstate <= 2 * DCN3_15_MAX_DET_SEGS) {
-                               bool split_required = approx_det_segs_required_for_pstate > DCN3_15_MAX_DET_SEGS;
-                               split_required = split_required || timing->pix_clk_100hz >= dcn_get_max_non_odm_pix_rate_100hz(&dc->dml.soc);
-                               split_required = split_required || (pipe->plane_state && pipe->plane_state->src_rect.width > 5120);
-
-                               /* Minimum 2 segments to allow mpc/odm combine if its used later */
-                               if (approx_det_segs_required_for_pstate < 2)
-                                       approx_det_segs_required_for_pstate = 2;
-                               if (split_required)
-                                       approx_det_segs_required_for_pstate += approx_det_segs_required_for_pstate % 2;
-                               pipes[pipe_cnt].pipe.src.det_size_override = approx_det_segs_required_for_pstate;
-                               remaining_det_segs -= approx_det_segs_required_for_pstate;
-                       } else
-                               remaining_det_segs = -1;
-                       crb_pipes++;
-               }
-               DC_FP_END();
-
-               if (pipes[pipe_cnt].dout.dsc_enable) {
-                       switch (timing->display_color_depth) {
-                       case COLOR_DEPTH_888:
-                               pipes[pipe_cnt].dout.dsc_input_bpc = 8;
-                               break;
-                       case COLOR_DEPTH_101010:
-                               pipes[pipe_cnt].dout.dsc_input_bpc = 10;
-                               break;
-                       case COLOR_DEPTH_121212:
-                               pipes[pipe_cnt].dout.dsc_input_bpc = 12;
-                               break;
-                       default:
-                               ASSERT(0);
-                               break;
-                       }
-               }
-               pipe_cnt++;
-       }
-
-       /* Spread remaining unreserved crb evenly among all pipes*/
-       if (pixel_rate_crb) {
-               for (i = 0, pipe_cnt = 0, crb_idx = 0; i < dc->res_pool->pipe_count; i++) {
-                       pipe = &res_ctx->pipe_ctx[i];
-                       if (!pipe->stream)
-                               continue;
-
-                       /* Do not use asymetric crb if not enough for pstate support */
-                       if (remaining_det_segs < 0) {
-                               pipes[pipe_cnt].pipe.src.det_size_override = 0;
-                               pipe_cnt++;
-                               continue;
-                       }
-
-                       if (!pipe->top_pipe && !pipe->prev_odm_pipe) {
-                               bool split_required = pipe->stream->timing.pix_clk_100hz >= dcn_get_max_non_odm_pix_rate_100hz(&dc->dml.soc)
-                                               || (pipe->plane_state && pipe->plane_state->src_rect.width > 5120);
-
-                               if (remaining_det_segs > MIN_RESERVED_DET_SEGS)
-                                       pipes[pipe_cnt].pipe.src.det_size_override += (remaining_det_segs - MIN_RESERVED_DET_SEGS) / crb_pipes +
-                                                       (crb_idx < (remaining_det_segs - MIN_RESERVED_DET_SEGS) % crb_pipes ? 1 : 0);
-                               if (pipes[pipe_cnt].pipe.src.det_size_override > 2 * DCN3_15_MAX_DET_SEGS) {
-                                       /* Clamp to 2 pipe split max det segments */
-                                       remaining_det_segs += pipes[pipe_cnt].pipe.src.det_size_override - 2 * (DCN3_15_MAX_DET_SEGS);
-                                       pipes[pipe_cnt].pipe.src.det_size_override = 2 * DCN3_15_MAX_DET_SEGS;
-                               }
-                               if (pipes[pipe_cnt].pipe.src.det_size_override > DCN3_15_MAX_DET_SEGS || split_required) {
-                                       /* If we are splitting we must have an even number of segments */
-                                       remaining_det_segs += pipes[pipe_cnt].pipe.src.det_size_override % 2;
-                                       pipes[pipe_cnt].pipe.src.det_size_override -= pipes[pipe_cnt].pipe.src.det_size_override % 2;
-                               }
-                               /* Convert segments into size for DML use */
-                               pipes[pipe_cnt].pipe.src.det_size_override *= DCN3_15_CRB_SEGMENT_SIZE_KB;
-
-                               crb_idx++;
-                       }
-                       pipe_cnt++;
-               }
-       }
-
-       if (pipe_cnt)
-               context->bw_ctx.dml.ip.det_buffer_size_kbytes =
-                               (max_usable_det / DCN3_15_CRB_SEGMENT_SIZE_KB / pipe_cnt) * DCN3_15_CRB_SEGMENT_SIZE_KB;
-       if (context->bw_ctx.dml.ip.det_buffer_size_kbytes > DCN3_15_MAX_DET_SIZE)
-               context->bw_ctx.dml.ip.det_buffer_size_kbytes = DCN3_15_MAX_DET_SIZE;
-
-       dc->config.enable_4to1MPC = false;
-       if (pipe_cnt == 1 && pipe->plane_state && !dc->debug.disable_z9_mpc) {
-               if (is_dual_plane(pipe->plane_state->format)
-                               && pipe->plane_state->src_rect.width <= 1920 && pipe->plane_state->src_rect.height <= 1080) {
-                       dc->config.enable_4to1MPC = true;
-                       context->bw_ctx.dml.ip.det_buffer_size_kbytes =
-                                       (max_usable_det / DCN3_15_CRB_SEGMENT_SIZE_KB / 4) * DCN3_15_CRB_SEGMENT_SIZE_KB;
-               } else if (!is_dual_plane(pipe->plane_state->format)
-                               && pipe->plane_state->src_rect.width <= 5120
-                               && pipe->stream->timing.pix_clk_100hz < dcn_get_max_non_odm_pix_rate_100hz(&dc->dml.soc)) {
-                       /* Limit to 5k max to avoid forced pipe split when there is not enough detile for swath */
-                       context->bw_ctx.dml.ip.det_buffer_size_kbytes = 192;
-                       pipes[0].pipe.src.unbounded_req_mode = true;
-               }
-       }
-
-       return pipe_cnt;
-}
-
-static void dcn315_get_panel_config_defaults(struct dc_panel_config *panel_config)
-{
-       *panel_config = panel_config_defaults;
-}
-
-static struct dc_cap_funcs cap_funcs = {
-       .get_dcc_compression_cap = dcn20_get_dcc_compression_cap
-};
-
-static struct resource_funcs dcn315_res_pool_funcs = {
-       .destroy = dcn315_destroy_resource_pool,
-       .link_enc_create = dcn31_link_encoder_create,
-       .link_enc_create_minimal = dcn31_link_enc_create_minimal,
-       .link_encs_assign = link_enc_cfg_link_encs_assign,
-       .link_enc_unassign = link_enc_cfg_link_enc_unassign,
-       .panel_cntl_create = dcn31_panel_cntl_create,
-       .validate_bandwidth = dcn31_validate_bandwidth,
-       .calculate_wm_and_dlg = dcn31_calculate_wm_and_dlg,
-       .update_soc_for_wm_a = dcn315_update_soc_for_wm_a,
-       .populate_dml_pipes = dcn315_populate_dml_pipes_from_context,
-       .acquire_free_pipe_as_secondary_dpp_pipe = dcn20_acquire_free_pipe_for_layer,
-       .release_pipe = dcn20_release_pipe,
-       .add_stream_to_ctx = dcn30_add_stream_to_ctx,
-       .add_dsc_to_stream_resource = dcn20_add_dsc_to_stream_resource,
-       .remove_stream_from_ctx = dcn20_remove_stream_from_ctx,
-       .populate_dml_writeback_from_context = dcn31_populate_dml_writeback_from_context,
-       .set_mcif_arb_params = dcn31_set_mcif_arb_params,
-       .find_first_free_match_stream_enc_for_link = dcn10_find_first_free_match_stream_enc_for_link,
-       .acquire_post_bldn_3dlut = dcn30_acquire_post_bldn_3dlut,
-       .release_post_bldn_3dlut = dcn30_release_post_bldn_3dlut,
-       .update_bw_bounding_box = dcn315_update_bw_bounding_box,
-       .patch_unknown_plane_state = dcn20_patch_unknown_plane_state,
-       .get_panel_config_defaults = dcn315_get_panel_config_defaults,
-};
-
-static bool dcn315_resource_construct(
-       uint8_t num_virtual_links,
-       struct dc *dc,
-       struct dcn315_resource_pool *pool)
-{
-       int i;
-       struct dc_context *ctx = dc->ctx;
-       struct irq_service_init_data init_data;
-
-       ctx->dc_bios->regs = &bios_regs;
-
-       pool->base.res_cap = &res_cap_dcn31;
-
-       pool->base.funcs = &dcn315_res_pool_funcs;
-
-       /*************************************************
-        *  Resource + asic cap harcoding                *
-        *************************************************/
-       pool->base.underlay_pipe_index = NO_UNDERLAY_PIPE;
-       pool->base.pipe_count = pool->base.res_cap->num_timing_generator;
-       pool->base.mpcc_count = pool->base.res_cap->num_timing_generator;
-       dc->caps.max_downscale_ratio = 600;
-       dc->caps.i2c_speed_in_khz = 100;
-       dc->caps.i2c_speed_in_khz_hdcp = 100;
-       dc->caps.max_cursor_size = 256;
-       dc->caps.min_horizontal_blanking_period = 80;
-       dc->caps.dmdata_alloc_size = 2048;
-       dc->caps.max_slave_planes = 2;
-       dc->caps.max_slave_yuv_planes = 2;
-       dc->caps.max_slave_rgb_planes = 2;
-       dc->caps.post_blend_color_processing = true;
-       dc->caps.force_dp_tps4_for_cp2520 = true;
-       if (dc->config.forceHBR2CP2520)
-               dc->caps.force_dp_tps4_for_cp2520 = false;
-       dc->caps.dp_hpo = true;
-       dc->caps.dp_hdmi21_pcon_support = true;
-       dc->caps.edp_dsc_support = true;
-       dc->caps.extended_aux_timeout_support = true;
-       dc->caps.dmcub_support = true;
-       dc->caps.is_apu = true;
-
-       /* Color pipeline capabilities */
-       dc->caps.color.dpp.dcn_arch = 1;
-       dc->caps.color.dpp.input_lut_shared = 0;
-       dc->caps.color.dpp.icsc = 1;
-       dc->caps.color.dpp.dgam_ram = 0; // must use gamma_corr
-       dc->caps.color.dpp.dgam_rom_caps.srgb = 1;
-       dc->caps.color.dpp.dgam_rom_caps.bt2020 = 1;
-       dc->caps.color.dpp.dgam_rom_caps.gamma2_2 = 1;
-       dc->caps.color.dpp.dgam_rom_caps.pq = 1;
-       dc->caps.color.dpp.dgam_rom_caps.hlg = 1;
-       dc->caps.color.dpp.post_csc = 1;
-       dc->caps.color.dpp.gamma_corr = 1;
-       dc->caps.color.dpp.dgam_rom_for_yuv = 0;
-
-       dc->caps.color.dpp.hw_3d_lut = 1;
-       dc->caps.color.dpp.ogam_ram = 1;
-       // no OGAM ROM on DCN301
-       dc->caps.color.dpp.ogam_rom_caps.srgb = 0;
-       dc->caps.color.dpp.ogam_rom_caps.bt2020 = 0;
-       dc->caps.color.dpp.ogam_rom_caps.gamma2_2 = 0;
-       dc->caps.color.dpp.ogam_rom_caps.pq = 0;
-       dc->caps.color.dpp.ogam_rom_caps.hlg = 0;
-       dc->caps.color.dpp.ocsc = 0;
-
-       dc->caps.color.mpc.gamut_remap = 1;
-       dc->caps.color.mpc.num_3dluts = pool->base.res_cap->num_mpc_3dlut; //2
-       dc->caps.color.mpc.ogam_ram = 1;
-       dc->caps.color.mpc.ogam_rom_caps.srgb = 0;
-       dc->caps.color.mpc.ogam_rom_caps.bt2020 = 0;
-       dc->caps.color.mpc.ogam_rom_caps.gamma2_2 = 0;
-       dc->caps.color.mpc.ogam_rom_caps.pq = 0;
-       dc->caps.color.mpc.ogam_rom_caps.hlg = 0;
-       dc->caps.color.mpc.ocsc = 1;
-
-       /* read VBIOS LTTPR caps */
-       {
-               if (ctx->dc_bios->funcs->get_lttpr_caps) {
-                       enum bp_result bp_query_result;
-                       uint8_t is_vbios_lttpr_enable = 0;
-
-                       bp_query_result = ctx->dc_bios->funcs->get_lttpr_caps(ctx->dc_bios, &is_vbios_lttpr_enable);
-                       dc->caps.vbios_lttpr_enable = (bp_query_result == BP_RESULT_OK) && !!is_vbios_lttpr_enable;
-               }
-
-               /* interop bit is implicit */
-               {
-                       dc->caps.vbios_lttpr_aware = true;
-               }
-       }
-
-       if (dc->ctx->dce_environment == DCE_ENV_PRODUCTION_DRV)
-               dc->debug = debug_defaults_drv;
-
-       // Init the vm_helper
-       if (dc->vm_helper)
-               vm_helper_init(dc->vm_helper, 16);
-
-       /*************************************************
-        *  Create resources                             *
-        *************************************************/
-
-       /* Clock Sources for Pixel Clock*/
-       pool->base.clock_sources[DCN31_CLK_SRC_PLL0] =
-                       dcn31_clock_source_create(ctx, ctx->dc_bios,
-                               CLOCK_SOURCE_COMBO_PHY_PLL0,
-                               &clk_src_regs[0], false);
-       pool->base.clock_sources[DCN31_CLK_SRC_PLL1] =
-                       dcn31_clock_source_create(ctx, ctx->dc_bios,
-                               CLOCK_SOURCE_COMBO_PHY_PLL1,
-                               &clk_src_regs[1], false);
-       pool->base.clock_sources[DCN31_CLK_SRC_PLL2] =
-                       dcn31_clock_source_create(ctx, ctx->dc_bios,
-                               CLOCK_SOURCE_COMBO_PHY_PLL2,
-                               &clk_src_regs[2], false);
-       pool->base.clock_sources[DCN31_CLK_SRC_PLL3] =
-                       dcn31_clock_source_create(ctx, ctx->dc_bios,
-                               CLOCK_SOURCE_COMBO_PHY_PLL3,
-                               &clk_src_regs[3], false);
-       pool->base.clock_sources[DCN31_CLK_SRC_PLL4] =
-                       dcn31_clock_source_create(ctx, ctx->dc_bios,
-                               CLOCK_SOURCE_COMBO_PHY_PLL4,
-                               &clk_src_regs[4], false);
-
-       pool->base.clk_src_count = DCN30_CLK_SRC_TOTAL;
-
-       /* todo: not reuse phy_pll registers */
-       pool->base.dp_clock_source =
-                       dcn31_clock_source_create(ctx, ctx->dc_bios,
-                               CLOCK_SOURCE_ID_DP_DTO,
-                               &clk_src_regs[0], true);
-
-       for (i = 0; i < pool->base.clk_src_count; i++) {
-               if (pool->base.clock_sources[i] == NULL) {
-                       dm_error("DC: failed to create clock sources!\n");
-                       BREAK_TO_DEBUGGER();
-                       goto create_fail;
-               }
-       }
-
-       /* TODO: DCCG */
-       pool->base.dccg = dccg31_create(ctx, &dccg_regs, &dccg_shift, &dccg_mask);
-       if (pool->base.dccg == NULL) {
-               dm_error("DC: failed to create dccg!\n");
-               BREAK_TO_DEBUGGER();
-               goto create_fail;
-       }
-
-       /* TODO: IRQ */
-       init_data.ctx = dc->ctx;
-       pool->base.irqs = dal_irq_service_dcn315_create(&init_data);
-       if (!pool->base.irqs)
-               goto create_fail;
-
-       /* HUBBUB */
-       pool->base.hubbub = dcn31_hubbub_create(ctx);
-       if (pool->base.hubbub == NULL) {
-               BREAK_TO_DEBUGGER();
-               dm_error("DC: failed to create hubbub!\n");
-               goto create_fail;
-       }
-
-       /* HUBPs, DPPs, OPPs and TGs */
-       for (i = 0; i < pool->base.pipe_count; i++) {
-               pool->base.hubps[i] = dcn31_hubp_create(ctx, i);
-               if (pool->base.hubps[i] == NULL) {
-                       BREAK_TO_DEBUGGER();
-                       dm_error(
-                               "DC: failed to create hubps!\n");
-                       goto create_fail;
-               }
-
-               pool->base.dpps[i] = dcn31_dpp_create(ctx, i);
-               if (pool->base.dpps[i] == NULL) {
-                       BREAK_TO_DEBUGGER();
-                       dm_error(
-                               "DC: failed to create dpps!\n");
-                       goto create_fail;
-               }
-       }
-
-       for (i = 0; i < pool->base.res_cap->num_opp; i++) {
-               pool->base.opps[i] = dcn31_opp_create(ctx, i);
-               if (pool->base.opps[i] == NULL) {
-                       BREAK_TO_DEBUGGER();
-                       dm_error(
-                               "DC: failed to create output pixel processor!\n");
-                       goto create_fail;
-               }
-       }
-
-       for (i = 0; i < pool->base.res_cap->num_timing_generator; i++) {
-               pool->base.timing_generators[i] = dcn31_timing_generator_create(
-                               ctx, i);
-               if (pool->base.timing_generators[i] == NULL) {
-                       BREAK_TO_DEBUGGER();
-                       dm_error("DC: failed to create tg!\n");
-                       goto create_fail;
-               }
-       }
-       pool->base.timing_generator_count = i;
-
-       /* PSR */
-       pool->base.psr = dmub_psr_create(ctx);
-       if (pool->base.psr == NULL) {
-               dm_error("DC: failed to create psr obj!\n");
-               BREAK_TO_DEBUGGER();
-               goto create_fail;
-       }
-
-       /* ABM */
-       for (i = 0; i < pool->base.res_cap->num_timing_generator; i++) {
-               pool->base.multiple_abms[i] = dmub_abm_create(ctx,
-                               &abm_regs[i],
-                               &abm_shift,
-                               &abm_mask);
-               if (pool->base.multiple_abms[i] == NULL) {
-                       dm_error("DC: failed to create abm for pipe %d!\n", i);
-                       BREAK_TO_DEBUGGER();
-                       goto create_fail;
-               }
-       }
-
-       /* MPC and DSC */
-       pool->base.mpc = dcn31_mpc_create(ctx, pool->base.mpcc_count, pool->base.res_cap->num_mpc_3dlut);
-       if (pool->base.mpc == NULL) {
-               BREAK_TO_DEBUGGER();
-               dm_error("DC: failed to create mpc!\n");
-               goto create_fail;
-       }
-
-       for (i = 0; i < pool->base.res_cap->num_dsc; i++) {
-               pool->base.dscs[i] = dcn31_dsc_create(ctx, i);
-               if (pool->base.dscs[i] == NULL) {
-                       BREAK_TO_DEBUGGER();
-                       dm_error("DC: failed to create display stream compressor %d!\n", i);
-                       goto create_fail;
-               }
-       }
-
-       /* DWB and MMHUBBUB */
-       if (!dcn31_dwbc_create(ctx, &pool->base)) {
-               BREAK_TO_DEBUGGER();
-               dm_error("DC: failed to create dwbc!\n");
-               goto create_fail;
-       }
-
-       if (!dcn31_mmhubbub_create(ctx, &pool->base)) {
-               BREAK_TO_DEBUGGER();
-               dm_error("DC: failed to create mcif_wb!\n");
-               goto create_fail;
-       }
-
-       /* AUX and I2C */
-       for (i = 0; i < pool->base.res_cap->num_ddc; i++) {
-               pool->base.engines[i] = dcn31_aux_engine_create(ctx, i);
-               if (pool->base.engines[i] == NULL) {
-                       BREAK_TO_DEBUGGER();
-                       dm_error(
-                               "DC:failed to create aux engine!!\n");
-                       goto create_fail;
-               }
-               pool->base.hw_i2cs[i] = dcn31_i2c_hw_create(ctx, i);
-               if (pool->base.hw_i2cs[i] == NULL) {
-                       BREAK_TO_DEBUGGER();
-                       dm_error(
-                               "DC:failed to create hw i2c!!\n");
-                       goto create_fail;
-               }
-               pool->base.sw_i2cs[i] = NULL;
-       }
-
-       /* Audio, Stream Encoders including HPO and virtual, MPC 3D LUTs */
-       if (!resource_construct(num_virtual_links, dc, &pool->base,
-                       &res_create_funcs))
-               goto create_fail;
-
-       /* HW Sequencer and Plane caps */
-       dcn31_hw_sequencer_construct(dc);
-
-       dc->caps.max_planes =  pool->base.pipe_count;
-
-       for (i = 0; i < dc->caps.max_planes; ++i)
-               dc->caps.planes[i] = plane_cap;
-
-       dc->cap_funcs = cap_funcs;
-
-       dc->dcn_ip->max_num_dpp = dcn3_15_ip.max_num_dpp;
-
-       return true;
-
-create_fail:
-
-       dcn315_resource_destruct(pool);
-
-       return false;
-}
-
-struct resource_pool *dcn315_create_resource_pool(
-               const struct dc_init_data *init_data,
-               struct dc *dc)
-{
-       struct dcn315_resource_pool *pool =
-               kzalloc(sizeof(struct dcn315_resource_pool), GFP_KERNEL);
-
-       if (!pool)
-               return NULL;
-
-       if (dcn315_resource_construct(init_data->num_virtual_links, dc, pool))
-               return &pool->base;
-
-       BREAK_TO_DEBUGGER();
-       kfree(pool);
-       return NULL;
-}
diff --git a/drivers/gpu/drm/amd/display/dc/dcn315/dcn315_resource.h b/drivers/gpu/drm/amd/display/dc/dcn315/dcn315_resource.h
deleted file mode 100644 (file)
index 22849ea..0000000
+++ /dev/null
@@ -1,44 +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 _DCN315_RESOURCE_H_
-#define _DCN315_RESOURCE_H_
-
-#include "core_types.h"
-
-#define TO_DCN315_RES_POOL(pool)\
-       container_of(pool, struct dcn315_resource_pool, base)
-
-extern struct _vcs_dpi_ip_params_st dcn3_15_ip;
-
-struct dcn315_resource_pool {
-       struct resource_pool base;
-};
-
-struct resource_pool *dcn315_create_resource_pool(
-               const struct dc_init_data *init_data,
-               struct dc *dc);
-
-#endif /* _DCN315_RESOURCE_H_ */
diff --git a/drivers/gpu/drm/amd/display/dc/dcn316/Makefile b/drivers/gpu/drm/amd/display/dc/dcn316/Makefile
deleted file mode 100644 (file)
index 819d44a..0000000
+++ /dev/null
@@ -1,30 +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
-#
-# Makefile for dcn316.
-
-DCN316 = dcn316_resource.o
-
-AMD_DAL_DCN316 = $(addprefix $(AMDDALPATH)/dc/dcn316/,$(DCN316))
-
-AMD_DISPLAY_FILES += $(AMD_DAL_DCN316)
diff --git a/drivers/gpu/drm/amd/display/dc/dcn316/dcn316_resource.c b/drivers/gpu/drm/amd/display/dc/dcn316/dcn316_resource.c
deleted file mode 100644 (file)
index b9753d4..0000000
+++ /dev/null
@@ -1,2038 +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 "dm_services.h"
-#include "dc.h"
-
-#include "dcn31/dcn31_init.h"
-
-#include "resource.h"
-#include "include/irq_service_interface.h"
-#include "dcn316_resource.h"
-
-#include "dcn20/dcn20_resource.h"
-#include "dcn30/dcn30_resource.h"
-#include "dcn31/dcn31_resource.h"
-
-#include "dcn10/dcn10_ipp.h"
-#include "dcn30/dcn30_hubbub.h"
-#include "dcn31/dcn31_hubbub.h"
-#include "dcn30/dcn30_mpc.h"
-#include "dcn31/dcn31_hubp.h"
-#include "irq/dcn31/irq_service_dcn31.h"
-#include "dcn30/dcn30_dpp.h"
-#include "dcn31/dcn31_optc.h"
-#include "dcn20/dcn20_hwseq.h"
-#include "dcn30/dcn30_hwseq.h"
-#include "dce110/dce110_hwseq.h"
-#include "dcn30/dcn30_opp.h"
-#include "dcn20/dcn20_dsc.h"
-#include "dcn30/dcn30_vpg.h"
-#include "dcn30/dcn30_afmt.h"
-#include "dcn30/dcn30_dio_stream_encoder.h"
-#include "dcn31/dcn31_hpo_dp_stream_encoder.h"
-#include "dcn31/dcn31_hpo_dp_link_encoder.h"
-#include "dcn31/dcn31_apg.h"
-#include "dcn31/dcn31_dio_link_encoder.h"
-#include "dcn31/dcn31_vpg.h"
-#include "dcn31/dcn31_afmt.h"
-#include "dce/dce_clock_source.h"
-#include "dce/dce_audio.h"
-#include "dce/dce_hwseq.h"
-#include "clk_mgr.h"
-#include "virtual/virtual_stream_encoder.h"
-#include "dce110/dce110_resource.h"
-#include "dml/display_mode_vba.h"
-#include "dml/dcn31/dcn31_fpu.h"
-#include "dcn31/dcn31_dccg.h"
-#include "dcn10/dcn10_resource.h"
-#include "dcn31/dcn31_panel_cntl.h"
-
-#include "dcn30/dcn30_dwb.h"
-#include "dcn30/dcn30_mmhubbub.h"
-
-#include "dcn/dcn_3_1_6_offset.h"
-#include "dcn/dcn_3_1_6_sh_mask.h"
-#include "dpcs/dpcs_4_2_3_offset.h"
-#include "dpcs/dpcs_4_2_3_sh_mask.h"
-
-#define regBIF_BX1_BIOS_SCRATCH_2                                                                       0x003a
-#define regBIF_BX1_BIOS_SCRATCH_2_BASE_IDX                                                              1
-#define regBIF_BX1_BIOS_SCRATCH_3                                                                       0x003b
-#define regBIF_BX1_BIOS_SCRATCH_3_BASE_IDX                                                              1
-#define regBIF_BX1_BIOS_SCRATCH_6                                                                       0x003e
-#define regBIF_BX1_BIOS_SCRATCH_6_BASE_IDX                                                              1
-
-#define regDCHUBBUB_DEBUG_CTRL_0                                              0x04d6
-#define regDCHUBBUB_DEBUG_CTRL_0_BASE_IDX                                     2
-#define DCHUBBUB_DEBUG_CTRL_0__DET_DEPTH__SHIFT                               0x10
-#define DCHUBBUB_DEBUG_CTRL_0__DET_DEPTH_MASK                                 0x01FF0000L
-
-#define DCN_BASE__INST0_SEG0                       0x00000012
-#define DCN_BASE__INST0_SEG1                       0x000000C0
-#define DCN_BASE__INST0_SEG2                       0x000034C0
-#define DCN_BASE__INST0_SEG3                       0x00009000
-#define DCN_BASE__INST0_SEG4                       0x02403C00
-#define DCN_BASE__INST0_SEG5                       0
-
-#define DPCS_BASE__INST0_SEG0                      0x00000012
-#define DPCS_BASE__INST0_SEG1                      0x000000C0
-#define DPCS_BASE__INST0_SEG2                      0x000034C0
-#define DPCS_BASE__INST0_SEG3                      0x00009000
-#define DPCS_BASE__INST0_SEG4                      0x02403C00
-#define DPCS_BASE__INST0_SEG5                      0
-
-#define NBIO_BASE__INST0_SEG0                      0x00000000
-#define NBIO_BASE__INST0_SEG1                      0x00000014
-#define NBIO_BASE__INST0_SEG2                      0x00000D20
-#define NBIO_BASE__INST0_SEG3                      0x00010400
-#define NBIO_BASE__INST0_SEG4                      0x0241B000
-#define NBIO_BASE__INST0_SEG5                      0x04040000
-
-#include "reg_helper.h"
-#include "dce/dmub_abm.h"
-#include "dce/dmub_psr.h"
-#include "dce/dce_aux.h"
-#include "dce/dce_i2c.h"
-
-#include "dml/dcn30/display_mode_vba_30.h"
-#include "vm_helper.h"
-#include "dcn20/dcn20_vmid.h"
-
-#include "link_enc_cfg.h"
-
-#define DCN3_16_MAX_DET_SIZE 384
-#define DCN3_16_MIN_COMPBUF_SIZE_KB 128
-#define DCN3_16_CRB_SEGMENT_SIZE_KB 64
-
-enum dcn31_clk_src_array_id {
-       DCN31_CLK_SRC_PLL0,
-       DCN31_CLK_SRC_PLL1,
-       DCN31_CLK_SRC_PLL2,
-       DCN31_CLK_SRC_PLL3,
-       DCN31_CLK_SRC_PLL4,
-       DCN30_CLK_SRC_TOTAL
-};
-
-/* begin *********************
- * macros to expend register list macro defined in HW object header file
- */
-
-/* DCN */
-#define BASE_INNER(seg) DCN_BASE__INST0_SEG ## seg
-
-#define BASE(seg) BASE_INNER(seg)
-
-#define SR(reg_name)\
-               .reg_name = BASE(reg ## reg_name ## _BASE_IDX) +  \
-                                       reg ## reg_name
-
-#define SRI(reg_name, block, id)\
-       .reg_name = BASE(reg ## block ## id ## _ ## reg_name ## _BASE_IDX) + \
-                                       reg ## block ## id ## _ ## reg_name
-
-#define SRI2(reg_name, block, id)\
-       .reg_name = BASE(reg ## reg_name ## _BASE_IDX) + \
-                                       reg ## reg_name
-
-#define SRIR(var_name, reg_name, block, id)\
-       .var_name = BASE(reg ## block ## id ## _ ## reg_name ## _BASE_IDX) + \
-                                       reg ## block ## id ## _ ## reg_name
-
-#define SRII(reg_name, block, id)\
-       .reg_name[id] = BASE(reg ## block ## id ## _ ## reg_name ## _BASE_IDX) + \
-                                       reg ## block ## id ## _ ## reg_name
-
-#define SRII_MPC_RMU(reg_name, block, id)\
-       .RMU##_##reg_name[id] = BASE(reg ## block ## id ## _ ## reg_name ## _BASE_IDX) + \
-                                       reg ## block ## id ## _ ## reg_name
-
-#define SRII_DWB(reg_name, temp_name, block, id)\
-       .reg_name[id] = BASE(reg ## block ## id ## _ ## temp_name ## _BASE_IDX) + \
-                                       reg ## block ## id ## _ ## temp_name
-
-#define SF_DWB2(reg_name, block, id, field_name, post_fix)     \
-       .field_name = reg_name ## __ ## field_name ## post_fix
-
-#define DCCG_SRII(reg_name, block, id)\
-       .block ## _ ## reg_name[id] = BASE(reg ## block ## id ## _ ## reg_name ## _BASE_IDX) + \
-                                       reg ## block ## id ## _ ## reg_name
-
-#define VUPDATE_SRII(reg_name, block, id)\
-       .reg_name[id] = BASE(reg ## reg_name ## _ ## block ## id ## _BASE_IDX) + \
-                                       reg ## reg_name ## _ ## block ## id
-
-/* NBIO */
-#define NBIO_BASE_INNER(seg) \
-       NBIO_BASE__INST0_SEG ## seg
-
-#define NBIO_BASE(seg) \
-       NBIO_BASE_INNER(seg)
-
-#define NBIO_SR(reg_name)\
-               .reg_name = NBIO_BASE(regBIF_BX1_ ## reg_name ## _BASE_IDX) + \
-                                       regBIF_BX1_ ## reg_name
-
-static const struct bios_registers bios_regs = {
-               NBIO_SR(BIOS_SCRATCH_3),
-               NBIO_SR(BIOS_SCRATCH_6)
-};
-
-#define clk_src_regs(index, pllid)\
-[index] = {\
-       CS_COMMON_REG_LIST_DCN3_0(index, pllid),\
-}
-
-static const struct dce110_clk_src_regs clk_src_regs[] = {
-       clk_src_regs(0, A),
-       clk_src_regs(1, B),
-       clk_src_regs(2, C),
-       clk_src_regs(3, D),
-       clk_src_regs(4, E)
-};
-
-static const struct dce110_clk_src_shift cs_shift = {
-               CS_COMMON_MASK_SH_LIST_DCN2_0(__SHIFT)
-};
-
-static const struct dce110_clk_src_mask cs_mask = {
-               CS_COMMON_MASK_SH_LIST_DCN2_0(_MASK)
-};
-
-#define abm_regs(id)\
-[id] = {\
-               ABM_DCN302_REG_LIST(id)\
-}
-
-static const struct dce_abm_registers abm_regs[] = {
-               abm_regs(0),
-               abm_regs(1),
-               abm_regs(2),
-               abm_regs(3),
-};
-
-static const struct dce_abm_shift abm_shift = {
-               ABM_MASK_SH_LIST_DCN30(__SHIFT)
-};
-
-static const struct dce_abm_mask abm_mask = {
-               ABM_MASK_SH_LIST_DCN30(_MASK)
-};
-
-#define audio_regs(id)\
-[id] = {\
-               AUD_COMMON_REG_LIST(id)\
-}
-
-static const struct dce_audio_registers audio_regs[] = {
-       audio_regs(0),
-       audio_regs(1),
-       audio_regs(2),
-       audio_regs(3),
-       audio_regs(4),
-       audio_regs(5),
-       audio_regs(6)
-};
-
-#define DCE120_AUD_COMMON_MASK_SH_LIST(mask_sh)\
-               SF(AZF0ENDPOINT0_AZALIA_F0_CODEC_ENDPOINT_INDEX, AZALIA_ENDPOINT_REG_INDEX, mask_sh),\
-               SF(AZF0ENDPOINT0_AZALIA_F0_CODEC_ENDPOINT_DATA, AZALIA_ENDPOINT_REG_DATA, mask_sh),\
-               AUD_COMMON_MASK_SH_LIST_BASE(mask_sh)
-
-static const struct dce_audio_shift audio_shift = {
-               DCE120_AUD_COMMON_MASK_SH_LIST(__SHIFT)
-};
-
-static const struct dce_audio_mask audio_mask = {
-               DCE120_AUD_COMMON_MASK_SH_LIST(_MASK)
-};
-
-#define vpg_regs(id)\
-[id] = {\
-       VPG_DCN31_REG_LIST(id)\
-}
-
-static const struct dcn31_vpg_registers vpg_regs[] = {
-       vpg_regs(0),
-       vpg_regs(1),
-       vpg_regs(2),
-       vpg_regs(3),
-       vpg_regs(4),
-       vpg_regs(5),
-       vpg_regs(6),
-       vpg_regs(7),
-       vpg_regs(8),
-       vpg_regs(9),
-};
-
-static const struct dcn31_vpg_shift vpg_shift = {
-       DCN31_VPG_MASK_SH_LIST(__SHIFT)
-};
-
-static const struct dcn31_vpg_mask vpg_mask = {
-       DCN31_VPG_MASK_SH_LIST(_MASK)
-};
-
-#define afmt_regs(id)\
-[id] = {\
-       AFMT_DCN31_REG_LIST(id)\
-}
-
-static const struct dcn31_afmt_registers afmt_regs[] = {
-       afmt_regs(0),
-       afmt_regs(1),
-       afmt_regs(2),
-       afmt_regs(3),
-       afmt_regs(4),
-       afmt_regs(5)
-};
-
-static const struct dcn31_afmt_shift afmt_shift = {
-       DCN31_AFMT_MASK_SH_LIST(__SHIFT)
-};
-
-static const struct dcn31_afmt_mask afmt_mask = {
-       DCN31_AFMT_MASK_SH_LIST(_MASK)
-};
-
-
-#define apg_regs(id)\
-[id] = {\
-       APG_DCN31_REG_LIST(id)\
-}
-
-static const struct dcn31_apg_registers apg_regs[] = {
-       apg_regs(0),
-       apg_regs(1),
-       apg_regs(2),
-       apg_regs(3)
-};
-
-static const struct dcn31_apg_shift apg_shift = {
-       DCN31_APG_MASK_SH_LIST(__SHIFT)
-};
-
-static const struct dcn31_apg_mask apg_mask = {
-               DCN31_APG_MASK_SH_LIST(_MASK)
-};
-
-
-#define stream_enc_regs(id)\
-[id] = {\
-       SE_DCN3_REG_LIST(id)\
-}
-
-static const struct dcn10_stream_enc_registers stream_enc_regs[] = {
-       stream_enc_regs(0),
-       stream_enc_regs(1),
-       stream_enc_regs(2),
-       stream_enc_regs(3),
-       stream_enc_regs(4)
-};
-
-static const struct dcn10_stream_encoder_shift se_shift = {
-               SE_COMMON_MASK_SH_LIST_DCN30(__SHIFT)
-};
-
-static const struct dcn10_stream_encoder_mask se_mask = {
-               SE_COMMON_MASK_SH_LIST_DCN30(_MASK)
-};
-
-
-#define aux_regs(id)\
-[id] = {\
-       DCN2_AUX_REG_LIST(id)\
-}
-
-static const struct dcn10_link_enc_aux_registers link_enc_aux_regs[] = {
-               aux_regs(0),
-               aux_regs(1),
-               aux_regs(2),
-               aux_regs(3),
-               aux_regs(4)
-};
-
-#define hpd_regs(id)\
-[id] = {\
-       HPD_REG_LIST(id)\
-}
-
-static const struct dcn10_link_enc_hpd_registers link_enc_hpd_regs[] = {
-               hpd_regs(0),
-               hpd_regs(1),
-               hpd_regs(2),
-               hpd_regs(3),
-               hpd_regs(4)
-};
-
-#define link_regs(id, phyid)\
-[id] = {\
-       LE_DCN31_REG_LIST(id), \
-       UNIPHY_DCN2_REG_LIST(phyid), \
-       DPCS_DCN31_REG_LIST(id), \
-}
-
-static const struct dce110_aux_registers_shift aux_shift = {
-       DCN_AUX_MASK_SH_LIST(__SHIFT)
-};
-
-static const struct dce110_aux_registers_mask aux_mask = {
-       DCN_AUX_MASK_SH_LIST(_MASK)
-};
-
-static const struct dcn10_link_enc_registers link_enc_regs[] = {
-       link_regs(0, A),
-       link_regs(1, B),
-       link_regs(2, C),
-       link_regs(3, D),
-       link_regs(4, E)
-};
-
-static const struct dcn10_link_enc_shift le_shift = {
-       LINK_ENCODER_MASK_SH_LIST_DCN31(__SHIFT), \
-       DPCS_DCN31_MASK_SH_LIST(__SHIFT)
-};
-
-static const struct dcn10_link_enc_mask le_mask = {
-       LINK_ENCODER_MASK_SH_LIST_DCN31(_MASK), \
-       DPCS_DCN31_MASK_SH_LIST(_MASK)
-};
-
-
-
-#define hpo_dp_stream_encoder_reg_list(id)\
-[id] = {\
-       DCN3_1_HPO_DP_STREAM_ENC_REG_LIST(id)\
-}
-
-static const struct dcn31_hpo_dp_stream_encoder_registers hpo_dp_stream_enc_regs[] = {
-       hpo_dp_stream_encoder_reg_list(0),
-       hpo_dp_stream_encoder_reg_list(1),
-       hpo_dp_stream_encoder_reg_list(2),
-       hpo_dp_stream_encoder_reg_list(3),
-};
-
-static const struct dcn31_hpo_dp_stream_encoder_shift hpo_dp_se_shift = {
-       DCN3_1_HPO_DP_STREAM_ENC_MASK_SH_LIST(__SHIFT)
-};
-
-static const struct dcn31_hpo_dp_stream_encoder_mask hpo_dp_se_mask = {
-       DCN3_1_HPO_DP_STREAM_ENC_MASK_SH_LIST(_MASK)
-};
-
-
-#define hpo_dp_link_encoder_reg_list(id)\
-[id] = {\
-       DCN3_1_HPO_DP_LINK_ENC_REG_LIST(id),\
-       DCN3_1_RDPCSTX_REG_LIST(0),\
-       DCN3_1_RDPCSTX_REG_LIST(1),\
-       DCN3_1_RDPCSTX_REG_LIST(2),\
-       DCN3_1_RDPCSTX_REG_LIST(3),\
-       DCN3_1_RDPCSTX_REG_LIST(4)\
-}
-
-static const struct dcn31_hpo_dp_link_encoder_registers hpo_dp_link_enc_regs[] = {
-       hpo_dp_link_encoder_reg_list(0),
-       hpo_dp_link_encoder_reg_list(1),
-};
-
-static const struct dcn31_hpo_dp_link_encoder_shift hpo_dp_le_shift = {
-       DCN3_1_HPO_DP_LINK_ENC_MASK_SH_LIST(__SHIFT)
-};
-
-static const struct dcn31_hpo_dp_link_encoder_mask hpo_dp_le_mask = {
-       DCN3_1_HPO_DP_LINK_ENC_MASK_SH_LIST(_MASK)
-};
-
-
-#define dpp_regs(id)\
-[id] = {\
-       DPP_REG_LIST_DCN30(id),\
-}
-
-static const struct dcn3_dpp_registers dpp_regs[] = {
-       dpp_regs(0),
-       dpp_regs(1),
-       dpp_regs(2),
-       dpp_regs(3)
-};
-
-static const struct dcn3_dpp_shift tf_shift = {
-               DPP_REG_LIST_SH_MASK_DCN30(__SHIFT)
-};
-
-static const struct dcn3_dpp_mask tf_mask = {
-               DPP_REG_LIST_SH_MASK_DCN30(_MASK)
-};
-
-#define opp_regs(id)\
-[id] = {\
-       OPP_REG_LIST_DCN30(id),\
-}
-
-static const struct dcn20_opp_registers opp_regs[] = {
-       opp_regs(0),
-       opp_regs(1),
-       opp_regs(2),
-       opp_regs(3)
-};
-
-static const struct dcn20_opp_shift opp_shift = {
-       OPP_MASK_SH_LIST_DCN20(__SHIFT)
-};
-
-static const struct dcn20_opp_mask opp_mask = {
-       OPP_MASK_SH_LIST_DCN20(_MASK)
-};
-
-#define aux_engine_regs(id)\
-[id] = {\
-       AUX_COMMON_REG_LIST0(id), \
-       .AUXN_IMPCAL = 0, \
-       .AUXP_IMPCAL = 0, \
-       .AUX_RESET_MASK = DP_AUX0_AUX_CONTROL__AUX_RESET_MASK, \
-}
-
-static const struct dce110_aux_registers aux_engine_regs[] = {
-               aux_engine_regs(0),
-               aux_engine_regs(1),
-               aux_engine_regs(2),
-               aux_engine_regs(3),
-               aux_engine_regs(4)
-};
-
-#define dwbc_regs_dcn3(id)\
-[id] = {\
-       DWBC_COMMON_REG_LIST_DCN30(id),\
-}
-
-static const struct dcn30_dwbc_registers dwbc30_regs[] = {
-       dwbc_regs_dcn3(0),
-};
-
-static const struct dcn30_dwbc_shift dwbc30_shift = {
-       DWBC_COMMON_MASK_SH_LIST_DCN30(__SHIFT)
-};
-
-static const struct dcn30_dwbc_mask dwbc30_mask = {
-       DWBC_COMMON_MASK_SH_LIST_DCN30(_MASK)
-};
-
-#define mcif_wb_regs_dcn3(id)\
-[id] = {\
-       MCIF_WB_COMMON_REG_LIST_DCN30(id),\
-}
-
-static const struct dcn30_mmhubbub_registers mcif_wb30_regs[] = {
-       mcif_wb_regs_dcn3(0)
-};
-
-static const struct dcn30_mmhubbub_shift mcif_wb30_shift = {
-       MCIF_WB_COMMON_MASK_SH_LIST_DCN30(__SHIFT)
-};
-
-static const struct dcn30_mmhubbub_mask mcif_wb30_mask = {
-       MCIF_WB_COMMON_MASK_SH_LIST_DCN30(_MASK)
-};
-
-#define dsc_regsDCN20(id)\
-[id] = {\
-       DSC_REG_LIST_DCN20(id)\
-}
-
-static const struct dcn20_dsc_registers dsc_regs[] = {
-       dsc_regsDCN20(0),
-       dsc_regsDCN20(1),
-       dsc_regsDCN20(2)
-};
-
-static const struct dcn20_dsc_shift dsc_shift = {
-       DSC_REG_LIST_SH_MASK_DCN20(__SHIFT)
-};
-
-static const struct dcn20_dsc_mask dsc_mask = {
-       DSC_REG_LIST_SH_MASK_DCN20(_MASK)
-};
-
-static const struct dcn30_mpc_registers mpc_regs = {
-               MPC_REG_LIST_DCN3_0(0),
-               MPC_REG_LIST_DCN3_0(1),
-               MPC_REG_LIST_DCN3_0(2),
-               MPC_REG_LIST_DCN3_0(3),
-               MPC_OUT_MUX_REG_LIST_DCN3_0(0),
-               MPC_OUT_MUX_REG_LIST_DCN3_0(1),
-               MPC_OUT_MUX_REG_LIST_DCN3_0(2),
-               MPC_OUT_MUX_REG_LIST_DCN3_0(3),
-               MPC_RMU_GLOBAL_REG_LIST_DCN3AG,
-               MPC_RMU_REG_LIST_DCN3AG(0),
-               MPC_RMU_REG_LIST_DCN3AG(1),
-               //MPC_RMU_REG_LIST_DCN3AG(2),
-               MPC_DWB_MUX_REG_LIST_DCN3_0(0),
-};
-
-static const struct dcn30_mpc_shift mpc_shift = {
-       MPC_COMMON_MASK_SH_LIST_DCN30(__SHIFT)
-};
-
-static const struct dcn30_mpc_mask mpc_mask = {
-       MPC_COMMON_MASK_SH_LIST_DCN30(_MASK)
-};
-
-#define optc_regs(id)\
-[id] = {OPTC_COMMON_REG_LIST_DCN3_1(id)}
-
-static const struct dcn_optc_registers optc_regs[] = {
-       optc_regs(0),
-       optc_regs(1),
-       optc_regs(2),
-       optc_regs(3)
-};
-
-static const struct dcn_optc_shift optc_shift = {
-       OPTC_COMMON_MASK_SH_LIST_DCN3_1(__SHIFT)
-};
-
-static const struct dcn_optc_mask optc_mask = {
-       OPTC_COMMON_MASK_SH_LIST_DCN3_1(_MASK)
-};
-
-#define hubp_regs(id)\
-[id] = {\
-       HUBP_REG_LIST_DCN30(id)\
-}
-
-static const struct dcn_hubp2_registers hubp_regs[] = {
-               hubp_regs(0),
-               hubp_regs(1),
-               hubp_regs(2),
-               hubp_regs(3)
-};
-
-
-static const struct dcn_hubp2_shift hubp_shift = {
-               HUBP_MASK_SH_LIST_DCN31(__SHIFT)
-};
-
-static const struct dcn_hubp2_mask hubp_mask = {
-               HUBP_MASK_SH_LIST_DCN31(_MASK)
-};
-static const struct dcn_hubbub_registers hubbub_reg = {
-               HUBBUB_REG_LIST_DCN31(0)
-};
-
-static const struct dcn_hubbub_shift hubbub_shift = {
-               HUBBUB_MASK_SH_LIST_DCN31(__SHIFT)
-};
-
-static const struct dcn_hubbub_mask hubbub_mask = {
-               HUBBUB_MASK_SH_LIST_DCN31(_MASK)
-};
-
-static const struct dccg_registers dccg_regs = {
-               DCCG_REG_LIST_DCN31()
-};
-
-static const struct dccg_shift dccg_shift = {
-               DCCG_MASK_SH_LIST_DCN31(__SHIFT)
-};
-
-static const struct dccg_mask dccg_mask = {
-               DCCG_MASK_SH_LIST_DCN31(_MASK)
-};
-
-
-#define SRII2(reg_name_pre, reg_name_post, id)\
-       .reg_name_pre ## _ ##  reg_name_post[id] = BASE(reg ## reg_name_pre \
-                       ## id ## _ ## reg_name_post ## _BASE_IDX) + \
-                       reg ## reg_name_pre ## id ## _ ## reg_name_post
-
-
-#define HWSEQ_DCN31_REG_LIST()\
-       SR(DCHUBBUB_GLOBAL_TIMER_CNTL), \
-       SR(DCHUBBUB_ARB_HOSTVM_CNTL), \
-       SR(DIO_MEM_PWR_CTRL), \
-       SR(ODM_MEM_PWR_CTRL3), \
-       SR(DMU_MEM_PWR_CNTL), \
-       SR(MMHUBBUB_MEM_PWR_CNTL), \
-       SR(DCCG_GATE_DISABLE_CNTL), \
-       SR(DCCG_GATE_DISABLE_CNTL2), \
-       SR(DCFCLK_CNTL),\
-       SR(DC_MEM_GLOBAL_PWR_REQ_CNTL), \
-       SRII(PIXEL_RATE_CNTL, OTG, 0), \
-       SRII(PIXEL_RATE_CNTL, OTG, 1),\
-       SRII(PIXEL_RATE_CNTL, OTG, 2),\
-       SRII(PIXEL_RATE_CNTL, OTG, 3),\
-       SRII(PHYPLL_PIXEL_RATE_CNTL, OTG, 0),\
-       SRII(PHYPLL_PIXEL_RATE_CNTL, OTG, 1),\
-       SRII(PHYPLL_PIXEL_RATE_CNTL, OTG, 2),\
-       SRII(PHYPLL_PIXEL_RATE_CNTL, OTG, 3),\
-       SR(MICROSECOND_TIME_BASE_DIV), \
-       SR(MILLISECOND_TIME_BASE_DIV), \
-       SR(DISPCLK_FREQ_CHANGE_CNTL), \
-       SR(RBBMIF_TIMEOUT_DIS), \
-       SR(RBBMIF_TIMEOUT_DIS_2), \
-       SR(DCHUBBUB_CRC_CTRL), \
-       SR(DPP_TOP0_DPP_CRC_CTRL), \
-       SR(DPP_TOP0_DPP_CRC_VAL_B_A), \
-       SR(DPP_TOP0_DPP_CRC_VAL_R_G), \
-       SR(MPC_CRC_CTRL), \
-       SR(MPC_CRC_RESULT_GB), \
-       SR(MPC_CRC_RESULT_C), \
-       SR(MPC_CRC_RESULT_AR), \
-       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(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(D1VGA_CONTROL), \
-       SR(D2VGA_CONTROL), \
-       SR(D3VGA_CONTROL), \
-       SR(D4VGA_CONTROL), \
-       SR(D5VGA_CONTROL), \
-       SR(D6VGA_CONTROL), \
-       SR(DC_IP_REQUEST_CNTL), \
-       SR(AZALIA_AUDIO_DTO), \
-       SR(AZALIA_CONTROLLER_CLOCK_GATING), \
-       SR(HPO_TOP_HW_CONTROL)
-
-static const struct dce_hwseq_registers hwseq_reg = {
-               HWSEQ_DCN31_REG_LIST()
-};
-
-#define HWSEQ_DCN31_MASK_SH_LIST(mask_sh)\
-       HWSEQ_DCN_MASK_SH_LIST(mask_sh), \
-       HWS_SF(, DCHUBBUB_GLOBAL_TIMER_CNTL, DCHUBBUB_GLOBAL_TIMER_REFDIV, mask_sh), \
-       HWS_SF(, DCHUBBUB_ARB_HOSTVM_CNTL, DISABLE_HOSTVM_FORCE_ALLOW_PSTATE, mask_sh), \
-       HWS_SF(, DOMAIN0_PG_CONFIG, DOMAIN_POWER_FORCEON, mask_sh), \
-       HWS_SF(, DOMAIN0_PG_CONFIG, DOMAIN_POWER_GATE, mask_sh), \
-       HWS_SF(, DOMAIN1_PG_CONFIG, DOMAIN_POWER_FORCEON, mask_sh), \
-       HWS_SF(, DOMAIN1_PG_CONFIG, DOMAIN_POWER_GATE, mask_sh), \
-       HWS_SF(, DOMAIN2_PG_CONFIG, DOMAIN_POWER_FORCEON, mask_sh), \
-       HWS_SF(, DOMAIN2_PG_CONFIG, DOMAIN_POWER_GATE, mask_sh), \
-       HWS_SF(, DOMAIN3_PG_CONFIG, DOMAIN_POWER_FORCEON, mask_sh), \
-       HWS_SF(, DOMAIN3_PG_CONFIG, DOMAIN_POWER_GATE, mask_sh), \
-       HWS_SF(, DOMAIN16_PG_CONFIG, DOMAIN_POWER_FORCEON, mask_sh), \
-       HWS_SF(, DOMAIN16_PG_CONFIG, DOMAIN_POWER_GATE, mask_sh), \
-       HWS_SF(, DOMAIN17_PG_CONFIG, DOMAIN_POWER_FORCEON, mask_sh), \
-       HWS_SF(, DOMAIN17_PG_CONFIG, DOMAIN_POWER_GATE, mask_sh), \
-       HWS_SF(, DOMAIN18_PG_CONFIG, DOMAIN_POWER_FORCEON, mask_sh), \
-       HWS_SF(, DOMAIN18_PG_CONFIG, DOMAIN_POWER_GATE, mask_sh), \
-       HWS_SF(, DOMAIN0_PG_STATUS, DOMAIN_PGFSM_PWR_STATUS, mask_sh), \
-       HWS_SF(, DOMAIN1_PG_STATUS, DOMAIN_PGFSM_PWR_STATUS, mask_sh), \
-       HWS_SF(, DOMAIN2_PG_STATUS, DOMAIN_PGFSM_PWR_STATUS, mask_sh), \
-       HWS_SF(, DOMAIN3_PG_STATUS, DOMAIN_PGFSM_PWR_STATUS, mask_sh), \
-       HWS_SF(, DOMAIN16_PG_STATUS, DOMAIN_PGFSM_PWR_STATUS, mask_sh), \
-       HWS_SF(, DOMAIN17_PG_STATUS, DOMAIN_PGFSM_PWR_STATUS, mask_sh), \
-       HWS_SF(, DOMAIN18_PG_STATUS, DOMAIN_PGFSM_PWR_STATUS, mask_sh), \
-       HWS_SF(, DC_IP_REQUEST_CNTL, IP_REQUEST_EN, mask_sh), \
-       HWS_SF(, AZALIA_AUDIO_DTO, AZALIA_AUDIO_DTO_MODULE, mask_sh), \
-       HWS_SF(, HPO_TOP_CLOCK_CONTROL, HPO_HDMISTREAMCLK_G_GATE_DIS, mask_sh), \
-       HWS_SF(, DMU_MEM_PWR_CNTL, DMCU_ERAM_MEM_PWR_FORCE, mask_sh), \
-       HWS_SF(, ODM_MEM_PWR_CTRL3, ODM_MEM_UNASSIGNED_PWR_MODE, mask_sh), \
-       HWS_SF(, ODM_MEM_PWR_CTRL3, ODM_MEM_VBLANK_PWR_MODE, mask_sh), \
-       HWS_SF(, MMHUBBUB_MEM_PWR_CNTL, VGA_MEM_PWR_FORCE, mask_sh), \
-       HWS_SF(, DIO_MEM_PWR_CTRL, I2C_LIGHT_SLEEP_FORCE, mask_sh), \
-       HWS_SF(, HPO_TOP_HW_CONTROL, HPO_IO_EN, mask_sh)
-
-static const struct dce_hwseq_shift hwseq_shift = {
-               HWSEQ_DCN31_MASK_SH_LIST(__SHIFT)
-};
-
-static const struct dce_hwseq_mask hwseq_mask = {
-               HWSEQ_DCN31_MASK_SH_LIST(_MASK)
-};
-#define vmid_regs(id)\
-[id] = {\
-               DCN20_VMID_REG_LIST(id)\
-}
-
-static const struct dcn_vmid_registers vmid_regs[] = {
-       vmid_regs(0),
-       vmid_regs(1),
-       vmid_regs(2),
-       vmid_regs(3),
-       vmid_regs(4),
-       vmid_regs(5),
-       vmid_regs(6),
-       vmid_regs(7),
-       vmid_regs(8),
-       vmid_regs(9),
-       vmid_regs(10),
-       vmid_regs(11),
-       vmid_regs(12),
-       vmid_regs(13),
-       vmid_regs(14),
-       vmid_regs(15)
-};
-
-static const struct dcn20_vmid_shift vmid_shifts = {
-               DCN20_VMID_MASK_SH_LIST(__SHIFT)
-};
-
-static const struct dcn20_vmid_mask vmid_masks = {
-               DCN20_VMID_MASK_SH_LIST(_MASK)
-};
-
-static const struct resource_caps res_cap_dcn31 = {
-       .num_timing_generator = 4,
-       .num_opp = 4,
-       .num_video_plane = 4,
-       .num_audio = 5,
-       .num_stream_encoder = 5,
-       .num_dig_link_enc = 5,
-       .num_hpo_dp_stream_encoder = 4,
-       .num_hpo_dp_link_encoder = 2,
-       .num_pll = 5,
-       .num_dwb = 1,
-       .num_ddc = 5,
-       .num_vmid = 16,
-       .num_mpc_3dlut = 2,
-       .num_dsc = 3,
-};
-
-static const struct dc_plane_cap plane_cap = {
-       .type = DC_PLANE_TYPE_DCN_UNIVERSAL,
-       .per_pixel_alpha = true,
-
-       .pixel_format_support = {
-                       .argb8888 = true,
-                       .nv12 = true,
-                       .fp16 = true,
-                       .p010 = true,
-                       .ayuv = false,
-       },
-
-       .max_upscale_factor = {
-                       .argb8888 = 16000,
-                       .nv12 = 16000,
-                       .fp16 = 16000
-       },
-
-       // 6:1 downscaling ratio: 1000/6 = 166.666
-       .max_downscale_factor = {
-                       .argb8888 = 167,
-                       .nv12 = 167,
-                       .fp16 = 167
-       },
-       64,
-       64
-};
-
-static const struct dc_debug_options debug_defaults_drv = {
-       .disable_z10 = true, /*hw not support it*/
-       .disable_dmcu = true,
-       .force_abm_enable = false,
-       .timing_trace = false,
-       .clock_trace = true,
-       .disable_pplib_clock_request = false,
-       .pipe_split_policy = MPC_SPLIT_DYNAMIC,
-       .force_single_disp_pipe_split = false,
-       .disable_dcc = DCC_ENABLE,
-       .vsr_support = true,
-       .performance_trace = false,
-       .max_downscale_src_width = 4096,/*upto true 4k*/
-       .disable_pplib_wm_range = false,
-       .scl_reset_length10 = true,
-       .sanity_checks = false,
-       .underflow_assert_delay_us = 0xFFFFFFFF,
-       .dwb_fi_phase = -1, // -1 = disable,
-       .dmub_command_table = true,
-       .pstate_enabled = true,
-       .use_max_lb = true,
-       .enable_mem_low_power = {
-               .bits = {
-                       .vga = true,
-                       .i2c = true,
-                       .dmcu = false, // This is previously known to cause hang on S3 cycles if enabled
-                       .dscl = true,
-                       .cm = true,
-                       .mpc = true,
-                       .optc = true,
-                       .vpg = true,
-                       .afmt = true,
-               }
-       },
-       .enable_legacy_fast_update = true,
-       .using_dml2 = false,
-};
-
-static const struct dc_panel_config panel_config_defaults = {
-       .psr = {
-               .disable_psr = false,
-               .disallow_psrsu = false,
-               .disallow_replay = false,
-       },
-       .ilr = {
-               .optimize_edp_link_rate = true,
-       },
-};
-
-static void dcn31_dpp_destroy(struct dpp **dpp)
-{
-       kfree(TO_DCN20_DPP(*dpp));
-       *dpp = NULL;
-}
-
-static struct dpp *dcn31_dpp_create(
-       struct dc_context *ctx,
-       uint32_t inst)
-{
-       struct dcn3_dpp *dpp =
-               kzalloc(sizeof(struct dcn3_dpp), GFP_KERNEL);
-
-       if (!dpp)
-               return NULL;
-
-       if (dpp3_construct(dpp, ctx, inst,
-                       &dpp_regs[inst], &tf_shift, &tf_mask))
-               return &dpp->base;
-
-       BREAK_TO_DEBUGGER();
-       kfree(dpp);
-       return NULL;
-}
-
-static struct output_pixel_processor *dcn31_opp_create(
-       struct dc_context *ctx, uint32_t inst)
-{
-       struct dcn20_opp *opp =
-               kzalloc(sizeof(struct dcn20_opp), GFP_KERNEL);
-
-       if (!opp) {
-               BREAK_TO_DEBUGGER();
-               return NULL;
-       }
-
-       dcn20_opp_construct(opp, ctx, inst,
-                       &opp_regs[inst], &opp_shift, &opp_mask);
-       return &opp->base;
-}
-
-static struct dce_aux *dcn31_aux_engine_create(
-       struct dc_context *ctx,
-       uint32_t inst)
-{
-       struct aux_engine_dce110 *aux_engine =
-               kzalloc(sizeof(struct aux_engine_dce110), GFP_KERNEL);
-
-       if (!aux_engine)
-               return NULL;
-
-       dce110_aux_engine_construct(aux_engine, ctx, inst,
-                                   SW_AUX_TIMEOUT_PERIOD_MULTIPLIER * AUX_TIMEOUT_PERIOD,
-                                   &aux_engine_regs[inst],
-                                       &aux_mask,
-                                       &aux_shift,
-                                       ctx->dc->caps.extended_aux_timeout_support);
-
-       return &aux_engine->base;
-}
-#define i2c_inst_regs(id) { I2C_HW_ENGINE_COMMON_REG_LIST_DCN30(id) }
-
-static const struct dce_i2c_registers i2c_hw_regs[] = {
-               i2c_inst_regs(1),
-               i2c_inst_regs(2),
-               i2c_inst_regs(3),
-               i2c_inst_regs(4),
-               i2c_inst_regs(5),
-};
-
-static const struct dce_i2c_shift i2c_shifts = {
-               I2C_COMMON_MASK_SH_LIST_DCN30(__SHIFT)
-};
-
-static const struct dce_i2c_mask i2c_masks = {
-               I2C_COMMON_MASK_SH_LIST_DCN30(_MASK)
-};
-
-static struct dce_i2c_hw *dcn31_i2c_hw_create(
-       struct dc_context *ctx,
-       uint32_t inst)
-{
-       struct dce_i2c_hw *dce_i2c_hw =
-               kzalloc(sizeof(struct dce_i2c_hw), GFP_KERNEL);
-
-       if (!dce_i2c_hw)
-               return NULL;
-
-       dcn2_i2c_hw_construct(dce_i2c_hw, ctx, inst,
-                                   &i2c_hw_regs[inst], &i2c_shifts, &i2c_masks);
-
-       return dce_i2c_hw;
-}
-static struct mpc *dcn31_mpc_create(
-               struct dc_context *ctx,
-               int num_mpcc,
-               int num_rmu)
-{
-       struct dcn30_mpc *mpc30 = kzalloc(sizeof(struct dcn30_mpc),
-                                         GFP_KERNEL);
-
-       if (!mpc30)
-               return NULL;
-
-       dcn30_mpc_construct(mpc30, ctx,
-                       &mpc_regs,
-                       &mpc_shift,
-                       &mpc_mask,
-                       num_mpcc,
-                       num_rmu);
-
-       return &mpc30->base;
-}
-
-static struct hubbub *dcn31_hubbub_create(struct dc_context *ctx)
-{
-       int i;
-
-       struct dcn20_hubbub *hubbub3 = kzalloc(sizeof(struct dcn20_hubbub),
-                                         GFP_KERNEL);
-
-       if (!hubbub3)
-               return NULL;
-
-       hubbub31_construct(hubbub3, ctx,
-                       &hubbub_reg,
-                       &hubbub_shift,
-                       &hubbub_mask,
-                       dcn3_16_ip.det_buffer_size_kbytes,
-                       dcn3_16_ip.pixel_chunk_size_kbytes,
-                       dcn3_16_ip.config_return_buffer_size_in_kbytes);
-
-
-       for (i = 0; i < res_cap_dcn31.num_vmid; i++) {
-               struct dcn20_vmid *vmid = &hubbub3->vmid[i];
-
-               vmid->ctx = ctx;
-
-               vmid->regs = &vmid_regs[i];
-               vmid->shifts = &vmid_shifts;
-               vmid->masks = &vmid_masks;
-       }
-
-       return &hubbub3->base;
-}
-
-static struct timing_generator *dcn31_timing_generator_create(
-               struct dc_context *ctx,
-               uint32_t instance)
-{
-       struct optc *tgn10 =
-               kzalloc(sizeof(struct optc), GFP_KERNEL);
-
-       if (!tgn10)
-               return NULL;
-
-       tgn10->base.inst = instance;
-       tgn10->base.ctx = ctx;
-
-       tgn10->tg_regs = &optc_regs[instance];
-       tgn10->tg_shift = &optc_shift;
-       tgn10->tg_mask = &optc_mask;
-
-       dcn31_timing_generator_init(tgn10);
-
-       return &tgn10->base;
-}
-
-static const struct encoder_feature_support link_enc_feature = {
-               .max_hdmi_deep_color = COLOR_DEPTH_121212,
-               .max_hdmi_pixel_clock = 600000,
-               .hdmi_ycbcr420_supported = true,
-               .dp_ycbcr420_supported = true,
-               .fec_supported = true,
-               .flags.bits.IS_HBR2_CAPABLE = true,
-               .flags.bits.IS_HBR3_CAPABLE = true,
-               .flags.bits.IS_TPS3_CAPABLE = true,
-               .flags.bits.IS_TPS4_CAPABLE = true
-};
-
-static struct link_encoder *dcn31_link_encoder_create(
-       struct dc_context *ctx,
-       const struct encoder_init_data *enc_init_data)
-{
-       struct dcn20_link_encoder *enc20 =
-               kzalloc(sizeof(struct dcn20_link_encoder), GFP_KERNEL);
-
-       if (!enc20)
-               return NULL;
-
-       dcn31_link_encoder_construct(enc20,
-                       enc_init_data,
-                       &link_enc_feature,
-                       &link_enc_regs[enc_init_data->transmitter],
-                       &link_enc_aux_regs[enc_init_data->channel - 1],
-                       &link_enc_hpd_regs[enc_init_data->hpd_source],
-                       &le_shift,
-                       &le_mask);
-
-       return &enc20->enc10.base;
-}
-
-/* Create a minimal link encoder object not associated with a particular
- * physical connector.
- * resource_funcs.link_enc_create_minimal
- */
-static struct link_encoder *dcn31_link_enc_create_minimal(
-               struct dc_context *ctx, enum engine_id eng_id)
-{
-       struct dcn20_link_encoder *enc20;
-
-       if ((eng_id - ENGINE_ID_DIGA) > ctx->dc->res_pool->res_cap->num_dig_link_enc)
-               return NULL;
-
-       enc20 = kzalloc(sizeof(struct dcn20_link_encoder), GFP_KERNEL);
-       if (!enc20)
-               return NULL;
-
-       dcn31_link_encoder_construct_minimal(
-                       enc20,
-                       ctx,
-                       &link_enc_feature,
-                       &link_enc_regs[eng_id - ENGINE_ID_DIGA],
-                       eng_id);
-
-       return &enc20->enc10.base;
-}
-
-static struct panel_cntl *dcn31_panel_cntl_create(const struct panel_cntl_init_data *init_data)
-{
-       struct dcn31_panel_cntl *panel_cntl =
-               kzalloc(sizeof(struct dcn31_panel_cntl), GFP_KERNEL);
-
-       if (!panel_cntl)
-               return NULL;
-
-       dcn31_panel_cntl_construct(panel_cntl, init_data);
-
-       return &panel_cntl->base;
-}
-
-static void read_dce_straps(
-       struct dc_context *ctx,
-       struct resource_straps *straps)
-{
-       generic_reg_get(ctx, regDC_PINSTRAPS + BASE(regDC_PINSTRAPS_BASE_IDX),
-               FN(DC_PINSTRAPS, DC_PINSTRAPS_AUDIO), &straps->dc_pinstraps_audio);
-
-}
-
-static struct audio *dcn31_create_audio(
-               struct dc_context *ctx, unsigned int inst)
-{
-       return dce_audio_create(ctx, inst,
-                       &audio_regs[inst], &audio_shift, &audio_mask);
-}
-
-static struct vpg *dcn31_vpg_create(
-       struct dc_context *ctx,
-       uint32_t inst)
-{
-       struct dcn31_vpg *vpg31 = kzalloc(sizeof(struct dcn31_vpg), GFP_KERNEL);
-
-       if (!vpg31)
-               return NULL;
-
-       vpg31_construct(vpg31, ctx, inst,
-                       &vpg_regs[inst],
-                       &vpg_shift,
-                       &vpg_mask);
-
-       return &vpg31->base;
-}
-
-static struct afmt *dcn31_afmt_create(
-       struct dc_context *ctx,
-       uint32_t inst)
-{
-       struct dcn31_afmt *afmt31 = kzalloc(sizeof(struct dcn31_afmt), GFP_KERNEL);
-
-       if (!afmt31)
-               return NULL;
-
-       afmt31_construct(afmt31, ctx, inst,
-                       &afmt_regs[inst],
-                       &afmt_shift,
-                       &afmt_mask);
-
-       // Light sleep by default, no need to power down here
-
-       return &afmt31->base;
-}
-
-
-static struct apg *dcn31_apg_create(
-       struct dc_context *ctx,
-       uint32_t inst)
-{
-       struct dcn31_apg *apg31 = kzalloc(sizeof(struct dcn31_apg), GFP_KERNEL);
-
-       if (!apg31)
-               return NULL;
-
-       apg31_construct(apg31, ctx, inst,
-                       &apg_regs[inst],
-                       &apg_shift,
-                       &apg_mask);
-
-       return &apg31->base;
-}
-
-
-static struct stream_encoder *dcn316_stream_encoder_create(
-       enum engine_id eng_id,
-       struct dc_context *ctx)
-{
-       struct dcn10_stream_encoder *enc1;
-       struct vpg *vpg;
-       struct afmt *afmt;
-       int vpg_inst;
-       int afmt_inst;
-
-       /* Mapping of VPG, AFMT, DME register blocks to DIO block instance */
-       if (eng_id <= ENGINE_ID_DIGF) {
-               vpg_inst = eng_id;
-               afmt_inst = eng_id;
-       } else
-               return NULL;
-
-       enc1 = kzalloc(sizeof(struct dcn10_stream_encoder), GFP_KERNEL);
-       vpg = dcn31_vpg_create(ctx, vpg_inst);
-       afmt = dcn31_afmt_create(ctx, afmt_inst);
-
-       if (!enc1 || !vpg || !afmt) {
-               kfree(enc1);
-               kfree(vpg);
-               kfree(afmt);
-               return NULL;
-       }
-
-       dcn30_dio_stream_encoder_construct(enc1, ctx, ctx->dc_bios,
-                                       eng_id, vpg, afmt,
-                                       &stream_enc_regs[eng_id],
-                                       &se_shift, &se_mask);
-
-       return &enc1->base;
-}
-
-
-static struct hpo_dp_stream_encoder *dcn31_hpo_dp_stream_encoder_create(
-       enum engine_id eng_id,
-       struct dc_context *ctx)
-{
-       struct dcn31_hpo_dp_stream_encoder *hpo_dp_enc31;
-       struct vpg *vpg;
-       struct apg *apg;
-       uint32_t hpo_dp_inst;
-       uint32_t vpg_inst;
-       uint32_t apg_inst;
-
-       ASSERT((eng_id >= ENGINE_ID_HPO_DP_0) && (eng_id <= ENGINE_ID_HPO_DP_3));
-       hpo_dp_inst = eng_id - ENGINE_ID_HPO_DP_0;
-
-       /* Mapping of VPG register blocks to HPO DP block instance:
-        * VPG[6] -> HPO_DP[0]
-        * VPG[7] -> HPO_DP[1]
-        * VPG[8] -> HPO_DP[2]
-        * VPG[9] -> HPO_DP[3]
-        */
-       vpg_inst = hpo_dp_inst + 6;
-
-       /* Mapping of APG register blocks to HPO DP block instance:
-        * APG[0] -> HPO_DP[0]
-        * APG[1] -> HPO_DP[1]
-        * APG[2] -> HPO_DP[2]
-        * APG[3] -> HPO_DP[3]
-        */
-       apg_inst = hpo_dp_inst;
-
-       /* allocate HPO stream encoder and create VPG sub-block */
-       hpo_dp_enc31 = kzalloc(sizeof(struct dcn31_hpo_dp_stream_encoder), GFP_KERNEL);
-       vpg = dcn31_vpg_create(ctx, vpg_inst);
-       apg = dcn31_apg_create(ctx, apg_inst);
-
-       if (!hpo_dp_enc31 || !vpg || !apg) {
-               kfree(hpo_dp_enc31);
-               kfree(vpg);
-               kfree(apg);
-               return NULL;
-       }
-
-       dcn31_hpo_dp_stream_encoder_construct(hpo_dp_enc31, ctx, ctx->dc_bios,
-                                       hpo_dp_inst, eng_id, vpg, apg,
-                                       &hpo_dp_stream_enc_regs[hpo_dp_inst],
-                                       &hpo_dp_se_shift, &hpo_dp_se_mask);
-
-       return &hpo_dp_enc31->base;
-}
-
-static struct hpo_dp_link_encoder *dcn31_hpo_dp_link_encoder_create(
-       uint8_t inst,
-       struct dc_context *ctx)
-{
-       struct dcn31_hpo_dp_link_encoder *hpo_dp_enc31;
-
-       /* allocate HPO link encoder */
-       hpo_dp_enc31 = kzalloc(sizeof(struct dcn31_hpo_dp_link_encoder), GFP_KERNEL);
-
-       hpo_dp_link_encoder31_construct(hpo_dp_enc31, ctx, inst,
-                                       &hpo_dp_link_enc_regs[inst],
-                                       &hpo_dp_le_shift, &hpo_dp_le_mask);
-
-       return &hpo_dp_enc31->base;
-}
-
-
-static struct dce_hwseq *dcn31_hwseq_create(
-       struct dc_context *ctx)
-{
-       struct dce_hwseq *hws = kzalloc(sizeof(struct dce_hwseq), GFP_KERNEL);
-
-       if (hws) {
-               hws->ctx = ctx;
-               hws->regs = &hwseq_reg;
-               hws->shifts = &hwseq_shift;
-               hws->masks = &hwseq_mask;
-       }
-       return hws;
-}
-static const struct resource_create_funcs res_create_funcs = {
-       .read_dce_straps = read_dce_straps,
-       .create_audio = dcn31_create_audio,
-       .create_stream_encoder = dcn316_stream_encoder_create,
-       .create_hpo_dp_stream_encoder = dcn31_hpo_dp_stream_encoder_create,
-       .create_hpo_dp_link_encoder = dcn31_hpo_dp_link_encoder_create,
-       .create_hwseq = dcn31_hwseq_create,
-};
-
-static void dcn316_resource_destruct(struct dcn316_resource_pool *pool)
-{
-       unsigned int i;
-
-       for (i = 0; i < pool->base.stream_enc_count; i++) {
-               if (pool->base.stream_enc[i] != NULL) {
-                       if (pool->base.stream_enc[i]->vpg != NULL) {
-                               kfree(DCN30_VPG_FROM_VPG(pool->base.stream_enc[i]->vpg));
-                               pool->base.stream_enc[i]->vpg = NULL;
-                       }
-                       if (pool->base.stream_enc[i]->afmt != NULL) {
-                               kfree(DCN30_AFMT_FROM_AFMT(pool->base.stream_enc[i]->afmt));
-                               pool->base.stream_enc[i]->afmt = NULL;
-                       }
-                       kfree(DCN10STRENC_FROM_STRENC(pool->base.stream_enc[i]));
-                       pool->base.stream_enc[i] = NULL;
-               }
-       }
-
-       for (i = 0; i < pool->base.hpo_dp_stream_enc_count; i++) {
-               if (pool->base.hpo_dp_stream_enc[i] != NULL) {
-                       if (pool->base.hpo_dp_stream_enc[i]->vpg != NULL) {
-                               kfree(DCN30_VPG_FROM_VPG(pool->base.hpo_dp_stream_enc[i]->vpg));
-                               pool->base.hpo_dp_stream_enc[i]->vpg = NULL;
-                       }
-                       if (pool->base.hpo_dp_stream_enc[i]->apg != NULL) {
-                               kfree(DCN31_APG_FROM_APG(pool->base.hpo_dp_stream_enc[i]->apg));
-                               pool->base.hpo_dp_stream_enc[i]->apg = NULL;
-                       }
-                       kfree(DCN3_1_HPO_DP_STREAM_ENC_FROM_HPO_STREAM_ENC(pool->base.hpo_dp_stream_enc[i]));
-                       pool->base.hpo_dp_stream_enc[i] = NULL;
-               }
-       }
-
-       for (i = 0; i < pool->base.hpo_dp_link_enc_count; i++) {
-               if (pool->base.hpo_dp_link_enc[i] != NULL) {
-                       kfree(DCN3_1_HPO_DP_LINK_ENC_FROM_HPO_LINK_ENC(pool->base.hpo_dp_link_enc[i]));
-                       pool->base.hpo_dp_link_enc[i] = NULL;
-               }
-       }
-
-       for (i = 0; i < pool->base.res_cap->num_dsc; i++) {
-               if (pool->base.dscs[i] != NULL)
-                       dcn20_dsc_destroy(&pool->base.dscs[i]);
-       }
-
-       if (pool->base.mpc != NULL) {
-               kfree(TO_DCN20_MPC(pool->base.mpc));
-               pool->base.mpc = NULL;
-       }
-       if (pool->base.hubbub != NULL) {
-               kfree(pool->base.hubbub);
-               pool->base.hubbub = NULL;
-       }
-       for (i = 0; i < pool->base.pipe_count; i++) {
-               if (pool->base.dpps[i] != NULL)
-                       dcn31_dpp_destroy(&pool->base.dpps[i]);
-
-               if (pool->base.ipps[i] != NULL)
-                       pool->base.ipps[i]->funcs->ipp_destroy(&pool->base.ipps[i]);
-
-               if (pool->base.hubps[i] != NULL) {
-                       kfree(TO_DCN20_HUBP(pool->base.hubps[i]));
-                       pool->base.hubps[i] = NULL;
-               }
-
-               if (pool->base.irqs != NULL) {
-                       dal_irq_service_destroy(&pool->base.irqs);
-               }
-       }
-
-       for (i = 0; i < pool->base.res_cap->num_ddc; i++) {
-               if (pool->base.engines[i] != NULL)
-                       dce110_engine_destroy(&pool->base.engines[i]);
-               if (pool->base.hw_i2cs[i] != NULL) {
-                       kfree(pool->base.hw_i2cs[i]);
-                       pool->base.hw_i2cs[i] = NULL;
-               }
-               if (pool->base.sw_i2cs[i] != NULL) {
-                       kfree(pool->base.sw_i2cs[i]);
-                       pool->base.sw_i2cs[i] = NULL;
-               }
-       }
-
-       for (i = 0; i < pool->base.res_cap->num_opp; i++) {
-               if (pool->base.opps[i] != NULL)
-                       pool->base.opps[i]->funcs->opp_destroy(&pool->base.opps[i]);
-       }
-
-       for (i = 0; i < pool->base.res_cap->num_timing_generator; i++) {
-               if (pool->base.timing_generators[i] != NULL)    {
-                       kfree(DCN10TG_FROM_TG(pool->base.timing_generators[i]));
-                       pool->base.timing_generators[i] = NULL;
-               }
-       }
-
-       for (i = 0; i < pool->base.res_cap->num_dwb; i++) {
-               if (pool->base.dwbc[i] != NULL) {
-                       kfree(TO_DCN30_DWBC(pool->base.dwbc[i]));
-                       pool->base.dwbc[i] = NULL;
-               }
-               if (pool->base.mcif_wb[i] != NULL) {
-                       kfree(TO_DCN30_MMHUBBUB(pool->base.mcif_wb[i]));
-                       pool->base.mcif_wb[i] = NULL;
-               }
-       }
-
-       for (i = 0; i < pool->base.audio_count; i++) {
-               if (pool->base.audios[i])
-                       dce_aud_destroy(&pool->base.audios[i]);
-       }
-
-       for (i = 0; i < pool->base.clk_src_count; i++) {
-               if (pool->base.clock_sources[i] != NULL) {
-                       dcn20_clock_source_destroy(&pool->base.clock_sources[i]);
-                       pool->base.clock_sources[i] = NULL;
-               }
-       }
-
-       for (i = 0; i < pool->base.res_cap->num_mpc_3dlut; i++) {
-               if (pool->base.mpc_lut[i] != NULL) {
-                       dc_3dlut_func_release(pool->base.mpc_lut[i]);
-                       pool->base.mpc_lut[i] = NULL;
-               }
-               if (pool->base.mpc_shaper[i] != NULL) {
-                       dc_transfer_func_release(pool->base.mpc_shaper[i]);
-                       pool->base.mpc_shaper[i] = NULL;
-               }
-       }
-
-       if (pool->base.dp_clock_source != NULL) {
-               dcn20_clock_source_destroy(&pool->base.dp_clock_source);
-               pool->base.dp_clock_source = NULL;
-       }
-
-       for (i = 0; i < pool->base.res_cap->num_timing_generator; i++) {
-               if (pool->base.multiple_abms[i] != NULL)
-                       dce_abm_destroy(&pool->base.multiple_abms[i]);
-       }
-
-       if (pool->base.psr != NULL)
-               dmub_psr_destroy(&pool->base.psr);
-
-       if (pool->base.dccg != NULL)
-               dcn_dccg_destroy(&pool->base.dccg);
-}
-
-static struct hubp *dcn31_hubp_create(
-       struct dc_context *ctx,
-       uint32_t inst)
-{
-       struct dcn20_hubp *hubp2 =
-               kzalloc(sizeof(struct dcn20_hubp), GFP_KERNEL);
-
-       if (!hubp2)
-               return NULL;
-
-       if (hubp31_construct(hubp2, ctx, inst,
-                       &hubp_regs[inst], &hubp_shift, &hubp_mask))
-               return &hubp2->base;
-
-       BREAK_TO_DEBUGGER();
-       kfree(hubp2);
-       return NULL;
-}
-
-static bool dcn31_dwbc_create(struct dc_context *ctx, struct resource_pool *pool)
-{
-       int i;
-       uint32_t pipe_count = pool->res_cap->num_dwb;
-
-       for (i = 0; i < pipe_count; i++) {
-               struct dcn30_dwbc *dwbc30 = kzalloc(sizeof(struct dcn30_dwbc),
-                                                   GFP_KERNEL);
-
-               if (!dwbc30) {
-                       dm_error("DC: failed to create dwbc30!\n");
-                       return false;
-               }
-
-               dcn30_dwbc_construct(dwbc30, ctx,
-                               &dwbc30_regs[i],
-                               &dwbc30_shift,
-                               &dwbc30_mask,
-                               i);
-
-               pool->dwbc[i] = &dwbc30->base;
-       }
-       return true;
-}
-
-static bool dcn31_mmhubbub_create(struct dc_context *ctx, struct resource_pool *pool)
-{
-       int i;
-       uint32_t pipe_count = pool->res_cap->num_dwb;
-
-       for (i = 0; i < pipe_count; i++) {
-               struct dcn30_mmhubbub *mcif_wb30 = kzalloc(sizeof(struct dcn30_mmhubbub),
-                                                   GFP_KERNEL);
-
-               if (!mcif_wb30) {
-                       dm_error("DC: failed to create mcif_wb30!\n");
-                       return false;
-               }
-
-               dcn30_mmhubbub_construct(mcif_wb30, ctx,
-                               &mcif_wb30_regs[i],
-                               &mcif_wb30_shift,
-                               &mcif_wb30_mask,
-                               i);
-
-               pool->mcif_wb[i] = &mcif_wb30->base;
-       }
-       return true;
-}
-
-static struct display_stream_compressor *dcn31_dsc_create(
-       struct dc_context *ctx, uint32_t inst)
-{
-       struct dcn20_dsc *dsc =
-               kzalloc(sizeof(struct dcn20_dsc), GFP_KERNEL);
-
-       if (!dsc) {
-               BREAK_TO_DEBUGGER();
-               return NULL;
-       }
-
-       dsc2_construct(dsc, ctx, inst, &dsc_regs[inst], &dsc_shift, &dsc_mask);
-       return &dsc->base;
-}
-
-static void dcn316_destroy_resource_pool(struct resource_pool **pool)
-{
-       struct dcn316_resource_pool *dcn31_pool = TO_DCN316_RES_POOL(*pool);
-
-       dcn316_resource_destruct(dcn31_pool);
-       kfree(dcn31_pool);
-       *pool = NULL;
-}
-
-static struct clock_source *dcn31_clock_source_create(
-               struct dc_context *ctx,
-               struct dc_bios *bios,
-               enum clock_source_id id,
-               const struct dce110_clk_src_regs *regs,
-               bool dp_clk_src)
-{
-       struct dce110_clk_src *clk_src =
-               kzalloc(sizeof(struct dce110_clk_src), GFP_KERNEL);
-
-       if (!clk_src)
-               return NULL;
-
-       if (dcn31_clk_src_construct(clk_src, ctx, bios, id,
-                       regs, &cs_shift, &cs_mask)) {
-               clk_src->base.dp_clk_src = dp_clk_src;
-               return &clk_src->base;
-       }
-
-       kfree(clk_src);
-
-       BREAK_TO_DEBUGGER();
-       return NULL;
-}
-
-static bool is_dual_plane(enum surface_pixel_format format)
-{
-       return format >= SURFACE_PIXEL_FORMAT_VIDEO_BEGIN || format == SURFACE_PIXEL_FORMAT_GRPH_RGBE_ALPHA;
-}
-
-static int dcn316_populate_dml_pipes_from_context(
-       struct dc *dc, struct dc_state *context,
-       display_e2e_pipe_params_st *pipes,
-       bool fast_validate)
-{
-       int i, pipe_cnt;
-       struct resource_context *res_ctx = &context->res_ctx;
-       struct pipe_ctx *pipe;
-       const int max_usable_det = context->bw_ctx.dml.ip.config_return_buffer_size_in_kbytes - DCN3_16_MIN_COMPBUF_SIZE_KB;
-
-       DC_FP_START();
-       dcn31x_populate_dml_pipes_from_context(dc, context, pipes, fast_validate);
-       DC_FP_END();
-
-       for (i = 0, pipe_cnt = 0; i < dc->res_pool->pipe_count; i++) {
-               struct dc_crtc_timing *timing;
-
-               if (!res_ctx->pipe_ctx[i].stream)
-                       continue;
-               pipe = &res_ctx->pipe_ctx[i];
-               timing = &pipe->stream->timing;
-
-               /*
-                * Immediate flip can be set dynamically after enabling the plane.
-                * We need to require support for immediate flip or underflow can be
-                * intermittently experienced depending on peak b/w requirements.
-                */
-               pipes[pipe_cnt].pipe.src.immediate_flip = true;
-
-               pipes[pipe_cnt].pipe.src.unbounded_req_mode = false;
-               pipes[pipe_cnt].pipe.dest.vfront_porch = timing->v_front_porch;
-               pipes[pipe_cnt].pipe.src.dcc_rate = 3;
-               pipes[pipe_cnt].dout.dsc_input_bpc = 0;
-               DC_FP_START();
-               dcn31_zero_pipe_dcc_fraction(pipes, pipe_cnt);
-               DC_FP_END();
-
-               if (pipes[pipe_cnt].dout.dsc_enable) {
-                       switch (timing->display_color_depth) {
-                       case COLOR_DEPTH_888:
-                               pipes[pipe_cnt].dout.dsc_input_bpc = 8;
-                               break;
-                       case COLOR_DEPTH_101010:
-                               pipes[pipe_cnt].dout.dsc_input_bpc = 10;
-                               break;
-                       case COLOR_DEPTH_121212:
-                               pipes[pipe_cnt].dout.dsc_input_bpc = 12;
-                               break;
-                       default:
-                               ASSERT(0);
-                               break;
-                       }
-               }
-
-               pipe_cnt++;
-       }
-
-       if (pipe_cnt)
-               context->bw_ctx.dml.ip.det_buffer_size_kbytes =
-                               (max_usable_det / DCN3_16_CRB_SEGMENT_SIZE_KB / pipe_cnt) * DCN3_16_CRB_SEGMENT_SIZE_KB;
-       if (context->bw_ctx.dml.ip.det_buffer_size_kbytes > DCN3_16_MAX_DET_SIZE)
-               context->bw_ctx.dml.ip.det_buffer_size_kbytes = DCN3_16_MAX_DET_SIZE;
-       ASSERT(context->bw_ctx.dml.ip.det_buffer_size_kbytes >= DCN3_16_DEFAULT_DET_SIZE);
-       dc->config.enable_4to1MPC = false;
-       if (pipe_cnt == 1 && pipe->plane_state && !dc->debug.disable_z9_mpc) {
-               if (is_dual_plane(pipe->plane_state->format)
-                               && pipe->plane_state->src_rect.width <= 1920 && pipe->plane_state->src_rect.height <= 1080) {
-                       dc->config.enable_4to1MPC = true;
-                       context->bw_ctx.dml.ip.det_buffer_size_kbytes =
-                                       (max_usable_det / DCN3_16_CRB_SEGMENT_SIZE_KB / 4) * DCN3_16_CRB_SEGMENT_SIZE_KB;
-               } else if (!is_dual_plane(pipe->plane_state->format)) {
-                       context->bw_ctx.dml.ip.det_buffer_size_kbytes = 192;
-                       pipes[0].pipe.src.unbounded_req_mode = true;
-               }
-       }
-
-       return pipe_cnt;
-}
-
-static void dcn316_get_panel_config_defaults(struct dc_panel_config *panel_config)
-{
-       *panel_config = panel_config_defaults;
-}
-
-static struct dc_cap_funcs cap_funcs = {
-       .get_dcc_compression_cap = dcn20_get_dcc_compression_cap
-};
-
-static struct resource_funcs dcn316_res_pool_funcs = {
-       .destroy = dcn316_destroy_resource_pool,
-       .link_enc_create = dcn31_link_encoder_create,
-       .link_enc_create_minimal = dcn31_link_enc_create_minimal,
-       .link_encs_assign = link_enc_cfg_link_encs_assign,
-       .link_enc_unassign = link_enc_cfg_link_enc_unassign,
-       .panel_cntl_create = dcn31_panel_cntl_create,
-       .validate_bandwidth = dcn31_validate_bandwidth,
-       .calculate_wm_and_dlg = dcn31_calculate_wm_and_dlg,
-       .update_soc_for_wm_a = dcn31_update_soc_for_wm_a,
-       .populate_dml_pipes = dcn316_populate_dml_pipes_from_context,
-       .acquire_free_pipe_as_secondary_dpp_pipe = dcn20_acquire_free_pipe_for_layer,
-       .release_pipe = dcn20_release_pipe,
-       .add_stream_to_ctx = dcn30_add_stream_to_ctx,
-       .add_dsc_to_stream_resource = dcn20_add_dsc_to_stream_resource,
-       .remove_stream_from_ctx = dcn20_remove_stream_from_ctx,
-       .populate_dml_writeback_from_context = dcn31_populate_dml_writeback_from_context,
-       .set_mcif_arb_params = dcn31_set_mcif_arb_params,
-       .find_first_free_match_stream_enc_for_link = dcn10_find_first_free_match_stream_enc_for_link,
-       .acquire_post_bldn_3dlut = dcn30_acquire_post_bldn_3dlut,
-       .release_post_bldn_3dlut = dcn30_release_post_bldn_3dlut,
-       .update_bw_bounding_box = dcn316_update_bw_bounding_box,
-       .patch_unknown_plane_state = dcn20_patch_unknown_plane_state,
-       .get_panel_config_defaults = dcn316_get_panel_config_defaults,
-};
-
-static bool dcn316_resource_construct(
-       uint8_t num_virtual_links,
-       struct dc *dc,
-       struct dcn316_resource_pool *pool)
-{
-       int i;
-       struct dc_context *ctx = dc->ctx;
-       struct irq_service_init_data init_data;
-
-       ctx->dc_bios->regs = &bios_regs;
-
-       pool->base.res_cap = &res_cap_dcn31;
-
-       pool->base.funcs = &dcn316_res_pool_funcs;
-
-       /*************************************************
-        *  Resource + asic cap harcoding                *
-        *************************************************/
-       pool->base.underlay_pipe_index = NO_UNDERLAY_PIPE;
-       pool->base.pipe_count = pool->base.res_cap->num_timing_generator;
-       pool->base.mpcc_count = pool->base.res_cap->num_timing_generator;
-       dc->caps.max_downscale_ratio = 600;
-       dc->caps.i2c_speed_in_khz = 100;
-       dc->caps.i2c_speed_in_khz_hdcp = 5; /*1.5 w/a applied by default*/
-       dc->caps.max_cursor_size = 256;
-       dc->caps.min_horizontal_blanking_period = 80;
-       dc->caps.dmdata_alloc_size = 2048;
-       dc->caps.max_slave_planes = 2;
-       dc->caps.max_slave_yuv_planes = 2;
-       dc->caps.max_slave_rgb_planes = 2;
-       dc->caps.post_blend_color_processing = true;
-       dc->caps.force_dp_tps4_for_cp2520 = true;
-       if (dc->config.forceHBR2CP2520)
-               dc->caps.force_dp_tps4_for_cp2520 = false;
-       dc->caps.dp_hpo = true;
-       dc->caps.dp_hdmi21_pcon_support = true;
-       dc->caps.edp_dsc_support = true;
-       dc->caps.extended_aux_timeout_support = true;
-       dc->caps.dmcub_support = true;
-       dc->caps.is_apu = true;
-
-       /* Color pipeline capabilities */
-       dc->caps.color.dpp.dcn_arch = 1;
-       dc->caps.color.dpp.input_lut_shared = 0;
-       dc->caps.color.dpp.icsc = 1;
-       dc->caps.color.dpp.dgam_ram = 0; // must use gamma_corr
-       dc->caps.color.dpp.dgam_rom_caps.srgb = 1;
-       dc->caps.color.dpp.dgam_rom_caps.bt2020 = 1;
-       dc->caps.color.dpp.dgam_rom_caps.gamma2_2 = 1;
-       dc->caps.color.dpp.dgam_rom_caps.pq = 1;
-       dc->caps.color.dpp.dgam_rom_caps.hlg = 1;
-       dc->caps.color.dpp.post_csc = 1;
-       dc->caps.color.dpp.gamma_corr = 1;
-       dc->caps.color.dpp.dgam_rom_for_yuv = 0;
-
-       dc->caps.color.dpp.hw_3d_lut = 1;
-       dc->caps.color.dpp.ogam_ram = 1;
-       // no OGAM ROM on DCN301
-       dc->caps.color.dpp.ogam_rom_caps.srgb = 0;
-       dc->caps.color.dpp.ogam_rom_caps.bt2020 = 0;
-       dc->caps.color.dpp.ogam_rom_caps.gamma2_2 = 0;
-       dc->caps.color.dpp.ogam_rom_caps.pq = 0;
-       dc->caps.color.dpp.ogam_rom_caps.hlg = 0;
-       dc->caps.color.dpp.ocsc = 0;
-
-       dc->caps.color.mpc.gamut_remap = 1;
-       dc->caps.color.mpc.num_3dluts = pool->base.res_cap->num_mpc_3dlut; //2
-       dc->caps.color.mpc.ogam_ram = 1;
-       dc->caps.color.mpc.ogam_rom_caps.srgb = 0;
-       dc->caps.color.mpc.ogam_rom_caps.bt2020 = 0;
-       dc->caps.color.mpc.ogam_rom_caps.gamma2_2 = 0;
-       dc->caps.color.mpc.ogam_rom_caps.pq = 0;
-       dc->caps.color.mpc.ogam_rom_caps.hlg = 0;
-       dc->caps.color.mpc.ocsc = 1;
-
-       /* read VBIOS LTTPR caps */
-       {
-               if (ctx->dc_bios->funcs->get_lttpr_caps) {
-                       enum bp_result bp_query_result;
-                       uint8_t is_vbios_lttpr_enable = 0;
-
-                       bp_query_result = ctx->dc_bios->funcs->get_lttpr_caps(ctx->dc_bios, &is_vbios_lttpr_enable);
-                       dc->caps.vbios_lttpr_enable = (bp_query_result == BP_RESULT_OK) && !!is_vbios_lttpr_enable;
-               }
-
-               /* interop bit is implicit */
-               {
-                       dc->caps.vbios_lttpr_aware = true;
-               }
-       }
-
-       if (dc->ctx->dce_environment == DCE_ENV_PRODUCTION_DRV)
-               dc->debug = debug_defaults_drv;
-
-       // Init the vm_helper
-       if (dc->vm_helper)
-               vm_helper_init(dc->vm_helper, 16);
-
-       /*************************************************
-        *  Create resources                             *
-        *************************************************/
-
-       /* Clock Sources for Pixel Clock*/
-       pool->base.clock_sources[DCN31_CLK_SRC_PLL0] =
-                       dcn31_clock_source_create(ctx, ctx->dc_bios,
-                               CLOCK_SOURCE_COMBO_PHY_PLL0,
-                               &clk_src_regs[0], false);
-       pool->base.clock_sources[DCN31_CLK_SRC_PLL1] =
-                       dcn31_clock_source_create(ctx, ctx->dc_bios,
-                               CLOCK_SOURCE_COMBO_PHY_PLL1,
-                               &clk_src_regs[1], false);
-       pool->base.clock_sources[DCN31_CLK_SRC_PLL2] =
-                       dcn31_clock_source_create(ctx, ctx->dc_bios,
-                               CLOCK_SOURCE_COMBO_PHY_PLL2,
-                               &clk_src_regs[2], false);
-       pool->base.clock_sources[DCN31_CLK_SRC_PLL3] =
-                       dcn31_clock_source_create(ctx, ctx->dc_bios,
-                               CLOCK_SOURCE_COMBO_PHY_PLL3,
-                               &clk_src_regs[3], false);
-       pool->base.clock_sources[DCN31_CLK_SRC_PLL4] =
-                       dcn31_clock_source_create(ctx, ctx->dc_bios,
-                               CLOCK_SOURCE_COMBO_PHY_PLL4,
-                               &clk_src_regs[4], false);
-
-       pool->base.clk_src_count = DCN30_CLK_SRC_TOTAL;
-
-       /* todo: not reuse phy_pll registers */
-       pool->base.dp_clock_source =
-                       dcn31_clock_source_create(ctx, ctx->dc_bios,
-                               CLOCK_SOURCE_ID_DP_DTO,
-                               &clk_src_regs[0], true);
-
-       for (i = 0; i < pool->base.clk_src_count; i++) {
-               if (pool->base.clock_sources[i] == NULL) {
-                       dm_error("DC: failed to create clock sources!\n");
-                       BREAK_TO_DEBUGGER();
-                       goto create_fail;
-               }
-       }
-
-       /* TODO: DCCG */
-       pool->base.dccg = dccg31_create(ctx, &dccg_regs, &dccg_shift, &dccg_mask);
-       if (pool->base.dccg == NULL) {
-               dm_error("DC: failed to create dccg!\n");
-               BREAK_TO_DEBUGGER();
-               goto create_fail;
-       }
-
-       /* TODO: IRQ */
-       init_data.ctx = dc->ctx;
-       pool->base.irqs = dal_irq_service_dcn31_create(&init_data);
-       if (!pool->base.irqs)
-               goto create_fail;
-
-       /* HUBBUB */
-       pool->base.hubbub = dcn31_hubbub_create(ctx);
-       if (pool->base.hubbub == NULL) {
-               BREAK_TO_DEBUGGER();
-               dm_error("DC: failed to create hubbub!\n");
-               goto create_fail;
-       }
-
-       /* HUBPs, DPPs, OPPs and TGs */
-       for (i = 0; i < pool->base.pipe_count; i++) {
-               pool->base.hubps[i] = dcn31_hubp_create(ctx, i);
-               if (pool->base.hubps[i] == NULL) {
-                       BREAK_TO_DEBUGGER();
-                       dm_error(
-                               "DC: failed to create hubps!\n");
-                       goto create_fail;
-               }
-
-               pool->base.dpps[i] = dcn31_dpp_create(ctx, i);
-               if (pool->base.dpps[i] == NULL) {
-                       BREAK_TO_DEBUGGER();
-                       dm_error(
-                               "DC: failed to create dpps!\n");
-                       goto create_fail;
-               }
-       }
-
-       for (i = 0; i < pool->base.res_cap->num_opp; i++) {
-               pool->base.opps[i] = dcn31_opp_create(ctx, i);
-               if (pool->base.opps[i] == NULL) {
-                       BREAK_TO_DEBUGGER();
-                       dm_error(
-                               "DC: failed to create output pixel processor!\n");
-                       goto create_fail;
-               }
-       }
-
-       for (i = 0; i < pool->base.res_cap->num_timing_generator; i++) {
-               pool->base.timing_generators[i] = dcn31_timing_generator_create(
-                               ctx, i);
-               if (pool->base.timing_generators[i] == NULL) {
-                       BREAK_TO_DEBUGGER();
-                       dm_error("DC: failed to create tg!\n");
-                       goto create_fail;
-               }
-       }
-       pool->base.timing_generator_count = i;
-
-       /* PSR */
-       pool->base.psr = dmub_psr_create(ctx);
-       if (pool->base.psr == NULL) {
-               dm_error("DC: failed to create psr obj!\n");
-               BREAK_TO_DEBUGGER();
-               goto create_fail;
-       }
-
-       /* ABM */
-       for (i = 0; i < pool->base.res_cap->num_timing_generator; i++) {
-               pool->base.multiple_abms[i] = dmub_abm_create(ctx,
-                               &abm_regs[i],
-                               &abm_shift,
-                               &abm_mask);
-               if (pool->base.multiple_abms[i] == NULL) {
-                       dm_error("DC: failed to create abm for pipe %d!\n", i);
-                       BREAK_TO_DEBUGGER();
-                       goto create_fail;
-               }
-       }
-
-       /* MPC and DSC */
-       pool->base.mpc = dcn31_mpc_create(ctx, pool->base.mpcc_count, pool->base.res_cap->num_mpc_3dlut);
-       if (pool->base.mpc == NULL) {
-               BREAK_TO_DEBUGGER();
-               dm_error("DC: failed to create mpc!\n");
-               goto create_fail;
-       }
-
-       for (i = 0; i < pool->base.res_cap->num_dsc; i++) {
-               pool->base.dscs[i] = dcn31_dsc_create(ctx, i);
-               if (pool->base.dscs[i] == NULL) {
-                       BREAK_TO_DEBUGGER();
-                       dm_error("DC: failed to create display stream compressor %d!\n", i);
-                       goto create_fail;
-               }
-       }
-
-       /* DWB and MMHUBBUB */
-       if (!dcn31_dwbc_create(ctx, &pool->base)) {
-               BREAK_TO_DEBUGGER();
-               dm_error("DC: failed to create dwbc!\n");
-               goto create_fail;
-       }
-
-       if (!dcn31_mmhubbub_create(ctx, &pool->base)) {
-               BREAK_TO_DEBUGGER();
-               dm_error("DC: failed to create mcif_wb!\n");
-               goto create_fail;
-       }
-
-       /* AUX and I2C */
-       for (i = 0; i < pool->base.res_cap->num_ddc; i++) {
-               pool->base.engines[i] = dcn31_aux_engine_create(ctx, i);
-               if (pool->base.engines[i] == NULL) {
-                       BREAK_TO_DEBUGGER();
-                       dm_error(
-                               "DC:failed to create aux engine!!\n");
-                       goto create_fail;
-               }
-               pool->base.hw_i2cs[i] = dcn31_i2c_hw_create(ctx, i);
-               if (pool->base.hw_i2cs[i] == NULL) {
-                       BREAK_TO_DEBUGGER();
-                       dm_error(
-                               "DC:failed to create hw i2c!!\n");
-                       goto create_fail;
-               }
-               pool->base.sw_i2cs[i] = NULL;
-       }
-
-       /* Audio, Stream Encoders including HPO and virtual, MPC 3D LUTs */
-       if (!resource_construct(num_virtual_links, dc, &pool->base,
-                       &res_create_funcs))
-               goto create_fail;
-
-       /* HW Sequencer and Plane caps */
-       dcn31_hw_sequencer_construct(dc);
-
-       dc->caps.max_planes =  pool->base.pipe_count;
-
-       for (i = 0; i < dc->caps.max_planes; ++i)
-               dc->caps.planes[i] = plane_cap;
-
-       dc->cap_funcs = cap_funcs;
-
-       dc->dcn_ip->max_num_dpp = dcn3_16_ip.max_num_dpp;
-
-       return true;
-
-create_fail:
-
-       dcn316_resource_destruct(pool);
-
-       return false;
-}
-
-struct resource_pool *dcn316_create_resource_pool(
-               const struct dc_init_data *init_data,
-               struct dc *dc)
-{
-       struct dcn316_resource_pool *pool =
-               kzalloc(sizeof(struct dcn316_resource_pool), GFP_KERNEL);
-
-       if (!pool)
-               return NULL;
-
-       if (dcn316_resource_construct(init_data->num_virtual_links, dc, pool))
-               return &pool->base;
-
-       BREAK_TO_DEBUGGER();
-       kfree(pool);
-       return NULL;
-}
diff --git a/drivers/gpu/drm/amd/display/dc/dcn316/dcn316_resource.h b/drivers/gpu/drm/amd/display/dc/dcn316/dcn316_resource.h
deleted file mode 100644 (file)
index aba6d63..0000000
+++ /dev/null
@@ -1,44 +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 _DCN316_RESOURCE_H_
-#define _DCN316_RESOURCE_H_
-
-#include "core_types.h"
-
-#define TO_DCN316_RES_POOL(pool)\
-       container_of(pool, struct dcn316_resource_pool, base)
-
-extern struct _vcs_dpi_ip_params_st dcn3_16_ip;
-
-struct dcn316_resource_pool {
-       struct resource_pool base;
-};
-
-struct resource_pool *dcn316_create_resource_pool(
-               const struct dc_init_data *init_data,
-               struct dc *dc);
-
-#endif /* _DCN316_RESOURCE_H_ */
index 8bb251307247e1ed7732ad12c91941f6aec5b089..3bb17dd01e4ce3d6cb8d4e5bb8d2dd9d6ec4ab27 100644 (file)
@@ -10,7 +10,7 @@
 #
 # Makefile for dcn32.
 
-DCN32 = dcn32_resource.o dcn32_hubbub.o dcn32_init.o dcn32_dccg.o \
+DCN32 = dcn32_hubbub.o dcn32_init.o dcn32_dccg.o \
                dcn32_dccg.o dcn32_optc.o dcn32_mmhubbub.o dcn32_hubp.o dcn32_dpp.o \
                dcn32_dio_stream_encoder.o dcn32_dio_link_encoder.o dcn32_hpo_dp_link_encoder.o \
                dcn32_resource_helpers.o dcn32_mpc.o
diff --git a/drivers/gpu/drm/amd/display/dc/dcn32/dcn32_resource.c b/drivers/gpu/drm/amd/display/dc/dcn32/dcn32_resource.c
deleted file mode 100644 (file)
index 89b0724..0000000
+++ /dev/null
@@ -1,2862 +0,0 @@
-// SPDX-License-Identifier: MIT
-/*
- * 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 "dm_services.h"
-#include "dc.h"
-
-#include "dcn32_init.h"
-
-#include "resource.h"
-#include "include/irq_service_interface.h"
-#include "dcn32_resource.h"
-
-#include "dcn20/dcn20_resource.h"
-#include "dcn30/dcn30_resource.h"
-
-#include "dcn10/dcn10_ipp.h"
-#include "dcn30/dcn30_hubbub.h"
-#include "dcn31/dcn31_hubbub.h"
-#include "dcn32/dcn32_hubbub.h"
-#include "dcn32/dcn32_mpc.h"
-#include "dcn32_hubp.h"
-#include "irq/dcn32/irq_service_dcn32.h"
-#include "dcn32/dcn32_dpp.h"
-#include "dcn32/dcn32_optc.h"
-#include "dcn20/dcn20_hwseq.h"
-#include "dcn30/dcn30_hwseq.h"
-#include "dce110/dce110_hwseq.h"
-#include "dcn30/dcn30_opp.h"
-#include "dcn20/dcn20_dsc.h"
-#include "dcn30/dcn30_vpg.h"
-#include "dcn30/dcn30_afmt.h"
-#include "dcn30/dcn30_dio_stream_encoder.h"
-#include "dcn32/dcn32_dio_stream_encoder.h"
-#include "dcn31/dcn31_hpo_dp_stream_encoder.h"
-#include "dcn31/dcn31_hpo_dp_link_encoder.h"
-#include "dcn32/dcn32_hpo_dp_link_encoder.h"
-#include "dcn31/dcn31_apg.h"
-#include "dcn31/dcn31_dio_link_encoder.h"
-#include "dcn32/dcn32_dio_link_encoder.h"
-#include "dce/dce_clock_source.h"
-#include "dce/dce_audio.h"
-#include "dce/dce_hwseq.h"
-#include "clk_mgr.h"
-#include "virtual/virtual_stream_encoder.h"
-#include "dml/display_mode_vba.h"
-#include "dcn32/dcn32_dccg.h"
-#include "dcn10/dcn10_resource.h"
-#include "link.h"
-#include "dcn31/dcn31_panel_cntl.h"
-
-#include "dcn30/dcn30_dwb.h"
-#include "dcn32/dcn32_mmhubbub.h"
-
-#include "dcn/dcn_3_2_0_offset.h"
-#include "dcn/dcn_3_2_0_sh_mask.h"
-#include "nbio/nbio_4_3_0_offset.h"
-
-#include "reg_helper.h"
-#include "dce/dmub_abm.h"
-#include "dce/dmub_psr.h"
-#include "dce/dce_aux.h"
-#include "dce/dce_i2c.h"
-
-#include "dml/dcn30/display_mode_vba_30.h"
-#include "vm_helper.h"
-#include "dcn20/dcn20_vmid.h"
-#include "dml/dcn32/dcn32_fpu.h"
-
-#include "dml2/dml2_wrapper.h"
-
-#define DC_LOGGER_INIT(logger)
-
-enum dcn32_clk_src_array_id {
-       DCN32_CLK_SRC_PLL0,
-       DCN32_CLK_SRC_PLL1,
-       DCN32_CLK_SRC_PLL2,
-       DCN32_CLK_SRC_PLL3,
-       DCN32_CLK_SRC_PLL4,
-       DCN32_CLK_SRC_TOTAL
-};
-
-/* begin *********************
- * macros to expend register list macro defined in HW object header file
- */
-
-/* DCN */
-#define BASE_INNER(seg) ctx->dcn_reg_offsets[seg]
-
-#define BASE(seg) BASE_INNER(seg)
-
-#define SR(reg_name)\
-               REG_STRUCT.reg_name = BASE(reg ## reg_name ## _BASE_IDX) +  \
-                                       reg ## reg_name
-#define SR_ARR(reg_name, id) \
-       REG_STRUCT[id].reg_name = BASE(reg##reg_name##_BASE_IDX) + reg##reg_name
-
-#define SR_ARR_INIT(reg_name, id, value) \
-       REG_STRUCT[id].reg_name = value
-
-#define SRI(reg_name, block, id)\
-       REG_STRUCT.reg_name = BASE(reg ## block ## id ## _ ## reg_name ## _BASE_IDX) + \
-               reg ## block ## id ## _ ## reg_name
-
-#define SRI_ARR(reg_name, block, id)\
-       REG_STRUCT[id].reg_name = BASE(reg ## block ## id ## _ ## reg_name ## _BASE_IDX) + \
-               reg ## block ## id ## _ ## reg_name
-
-#define SR_ARR_I2C(reg_name, id) \
-       REG_STRUCT[id-1].reg_name = BASE(reg##reg_name##_BASE_IDX) + reg##reg_name
-
-#define SRI_ARR_I2C(reg_name, block, id)\
-       REG_STRUCT[id-1].reg_name = BASE(reg ## block ## id ## _ ## reg_name ## _BASE_IDX) + \
-               reg ## block ## id ## _ ## reg_name
-
-#define SRI_ARR_ALPHABET(reg_name, block, index, id)\
-       REG_STRUCT[index].reg_name = BASE(reg ## block ## id ## _ ## reg_name ## _BASE_IDX) + \
-               reg ## block ## id ## _ ## reg_name
-
-#define SRI2(reg_name, block, id)\
-       .reg_name = BASE(reg ## reg_name ## _BASE_IDX) +        \
-               reg ## reg_name
-#define SRI2_ARR(reg_name, block, id)\
-       REG_STRUCT[id].reg_name = BASE(reg ## reg_name ## _BASE_IDX) +  \
-               reg ## reg_name
-
-#define SRIR(var_name, reg_name, block, id)\
-       .var_name = BASE(reg ## block ## id ## _ ## reg_name ## _BASE_IDX) + \
-               reg ## block ## id ## _ ## reg_name
-
-#define SRII(reg_name, block, id)\
-       REG_STRUCT.reg_name[id] = BASE(reg ## block ## id ## _ ## reg_name ## _BASE_IDX) + \
-                                       reg ## block ## id ## _ ## reg_name
-
-#define SRII_ARR_2(reg_name, block, id, inst)\
-       REG_STRUCT[inst].reg_name[id] = BASE(reg ## block ## id ## _ ## reg_name ## _BASE_IDX) + \
-               reg ## block ## id ## _ ## reg_name
-
-#define SRII_MPC_RMU(reg_name, block, id)\
-       .RMU##_##reg_name[id] = BASE(reg ## block ## id ## _ ## reg_name ## _BASE_IDX) + \
-               reg ## block ## id ## _ ## reg_name
-
-#define SRII_DWB(reg_name, temp_name, block, id)\
-       REG_STRUCT.reg_name[id] = BASE(reg ## block ## id ## _ ## temp_name ## _BASE_IDX) + \
-               reg ## block ## id ## _ ## temp_name
-
-#define SF_DWB2(reg_name, block, id, field_name, post_fix)     \
-       .field_name = reg_name ## __ ## field_name ## post_fix
-
-#define DCCG_SRII(reg_name, block, id)\
-       REG_STRUCT.block ## _ ## reg_name[id] = BASE(reg ## block ## id ## _ ## reg_name ## _BASE_IDX) + \
-               reg ## block ## id ## _ ## reg_name
-
-#define VUPDATE_SRII(reg_name, block, id)\
-       REG_STRUCT.reg_name[id] = BASE(reg ## reg_name ## _ ## block ## id ## _BASE_IDX) + \
-               reg ## reg_name ## _ ## block ## id
-
-/* NBIO */
-#define NBIO_BASE_INNER(seg) ctx->nbio_reg_offsets[seg]
-
-#define NBIO_BASE(seg) \
-       NBIO_BASE_INNER(seg)
-
-#define NBIO_SR(reg_name)\
-       REG_STRUCT.reg_name = NBIO_BASE(regBIF_BX0_ ## reg_name ## _BASE_IDX) + \
-                       regBIF_BX0_ ## reg_name
-#define NBIO_SR_ARR(reg_name, id)\
-       REG_STRUCT[id].reg_name = NBIO_BASE(regBIF_BX0_ ## reg_name ## _BASE_IDX) + \
-               regBIF_BX0_ ## reg_name
-
-#undef CTX
-#define CTX ctx
-#define REG(reg_name) \
-       (ctx->dcn_reg_offsets[reg ## reg_name ## _BASE_IDX] + reg ## reg_name)
-
-static struct bios_registers bios_regs;
-
-#define bios_regs_init() \
-               ( \
-               NBIO_SR(BIOS_SCRATCH_3),\
-               NBIO_SR(BIOS_SCRATCH_6)\
-               )
-
-#define clk_src_regs_init(index, pllid)\
-       CS_COMMON_REG_LIST_DCN3_0_RI(index, pllid)
-
-static struct dce110_clk_src_regs clk_src_regs[5];
-
-static const struct dce110_clk_src_shift cs_shift = {
-               CS_COMMON_MASK_SH_LIST_DCN3_2(__SHIFT)
-};
-
-static const struct dce110_clk_src_mask cs_mask = {
-               CS_COMMON_MASK_SH_LIST_DCN3_2(_MASK)
-};
-
-#define abm_regs_init(id)\
-               ABM_DCN32_REG_LIST_RI(id)
-
-static struct dce_abm_registers abm_regs[4];
-
-static const struct dce_abm_shift abm_shift = {
-               ABM_MASK_SH_LIST_DCN32(__SHIFT)
-};
-
-static const struct dce_abm_mask abm_mask = {
-               ABM_MASK_SH_LIST_DCN32(_MASK)
-};
-
-#define audio_regs_init(id)\
-               AUD_COMMON_REG_LIST_RI(id)
-
-static struct dce_audio_registers audio_regs[5];
-
-#define DCE120_AUD_COMMON_MASK_SH_LIST(mask_sh)\
-               SF(AZF0ENDPOINT0_AZALIA_F0_CODEC_ENDPOINT_INDEX, AZALIA_ENDPOINT_REG_INDEX, mask_sh),\
-               SF(AZF0ENDPOINT0_AZALIA_F0_CODEC_ENDPOINT_DATA, AZALIA_ENDPOINT_REG_DATA, mask_sh),\
-               AUD_COMMON_MASK_SH_LIST_BASE(mask_sh)
-
-static const struct dce_audio_shift audio_shift = {
-               DCE120_AUD_COMMON_MASK_SH_LIST(__SHIFT)
-};
-
-static const struct dce_audio_mask audio_mask = {
-               DCE120_AUD_COMMON_MASK_SH_LIST(_MASK)
-};
-
-#define vpg_regs_init(id)\
-       VPG_DCN3_REG_LIST_RI(id)
-
-static struct dcn30_vpg_registers vpg_regs[10];
-
-static const struct dcn30_vpg_shift vpg_shift = {
-       DCN3_VPG_MASK_SH_LIST(__SHIFT)
-};
-
-static const struct dcn30_vpg_mask vpg_mask = {
-       DCN3_VPG_MASK_SH_LIST(_MASK)
-};
-
-#define afmt_regs_init(id)\
-       AFMT_DCN3_REG_LIST_RI(id)
-
-static struct dcn30_afmt_registers afmt_regs[6];
-
-static const struct dcn30_afmt_shift afmt_shift = {
-       DCN3_AFMT_MASK_SH_LIST(__SHIFT)
-};
-
-static const struct dcn30_afmt_mask afmt_mask = {
-       DCN3_AFMT_MASK_SH_LIST(_MASK)
-};
-
-#define apg_regs_init(id)\
-       APG_DCN31_REG_LIST_RI(id)
-
-static struct dcn31_apg_registers apg_regs[4];
-
-static const struct dcn31_apg_shift apg_shift = {
-       DCN31_APG_MASK_SH_LIST(__SHIFT)
-};
-
-static const struct dcn31_apg_mask apg_mask = {
-               DCN31_APG_MASK_SH_LIST(_MASK)
-};
-
-#define stream_enc_regs_init(id)\
-       SE_DCN32_REG_LIST_RI(id)
-
-static struct dcn10_stream_enc_registers stream_enc_regs[5];
-
-static const struct dcn10_stream_encoder_shift se_shift = {
-               SE_COMMON_MASK_SH_LIST_DCN32(__SHIFT)
-};
-
-static const struct dcn10_stream_encoder_mask se_mask = {
-               SE_COMMON_MASK_SH_LIST_DCN32(_MASK)
-};
-
-
-#define aux_regs_init(id)\
-       DCN2_AUX_REG_LIST_RI(id)
-
-static struct dcn10_link_enc_aux_registers link_enc_aux_regs[5];
-
-#define hpd_regs_init(id)\
-       HPD_REG_LIST_RI(id)
-
-static struct dcn10_link_enc_hpd_registers link_enc_hpd_regs[5];
-
-#define link_regs_init(id, phyid)\
-       ( \
-       LE_DCN31_REG_LIST_RI(id), \
-       UNIPHY_DCN2_REG_LIST_RI(id, phyid)\
-       )
-       /*DPCS_DCN31_REG_LIST(id),*/ \
-
-static struct dcn10_link_enc_registers link_enc_regs[5];
-
-static const struct dcn10_link_enc_shift le_shift = {
-       LINK_ENCODER_MASK_SH_LIST_DCN31(__SHIFT), \
-       //DPCS_DCN31_MASK_SH_LIST(__SHIFT)
-};
-
-static const struct dcn10_link_enc_mask le_mask = {
-       LINK_ENCODER_MASK_SH_LIST_DCN31(_MASK), \
-       //DPCS_DCN31_MASK_SH_LIST(_MASK)
-};
-
-#define hpo_dp_stream_encoder_reg_init(id)\
-       DCN3_1_HPO_DP_STREAM_ENC_REG_LIST_RI(id)
-
-static struct dcn31_hpo_dp_stream_encoder_registers hpo_dp_stream_enc_regs[4];
-
-static const struct dcn31_hpo_dp_stream_encoder_shift hpo_dp_se_shift = {
-       DCN3_1_HPO_DP_STREAM_ENC_MASK_SH_LIST(__SHIFT)
-};
-
-static const struct dcn31_hpo_dp_stream_encoder_mask hpo_dp_se_mask = {
-       DCN3_1_HPO_DP_STREAM_ENC_MASK_SH_LIST(_MASK)
-};
-
-
-#define hpo_dp_link_encoder_reg_init(id)\
-       DCN3_1_HPO_DP_LINK_ENC_REG_LIST_RI(id)
-       /*DCN3_1_RDPCSTX_REG_LIST(0),*/
-       /*DCN3_1_RDPCSTX_REG_LIST(1),*/
-       /*DCN3_1_RDPCSTX_REG_LIST(2),*/
-       /*DCN3_1_RDPCSTX_REG_LIST(3),*/
-
-static struct dcn31_hpo_dp_link_encoder_registers hpo_dp_link_enc_regs[2];
-
-static const struct dcn31_hpo_dp_link_encoder_shift hpo_dp_le_shift = {
-       DCN3_2_HPO_DP_LINK_ENC_MASK_SH_LIST(__SHIFT)
-};
-
-static const struct dcn31_hpo_dp_link_encoder_mask hpo_dp_le_mask = {
-       DCN3_2_HPO_DP_LINK_ENC_MASK_SH_LIST(_MASK)
-};
-
-#define dpp_regs_init(id)\
-       DPP_REG_LIST_DCN30_COMMON_RI(id)
-
-static struct dcn3_dpp_registers dpp_regs[4];
-
-static const struct dcn3_dpp_shift tf_shift = {
-               DPP_REG_LIST_SH_MASK_DCN30_COMMON(__SHIFT)
-};
-
-static const struct dcn3_dpp_mask tf_mask = {
-               DPP_REG_LIST_SH_MASK_DCN30_COMMON(_MASK)
-};
-
-
-#define opp_regs_init(id)\
-       OPP_REG_LIST_DCN30_RI(id)
-
-static struct dcn20_opp_registers opp_regs[4];
-
-static const struct dcn20_opp_shift opp_shift = {
-       OPP_MASK_SH_LIST_DCN20(__SHIFT)
-};
-
-static const struct dcn20_opp_mask opp_mask = {
-       OPP_MASK_SH_LIST_DCN20(_MASK)
-};
-
-#define aux_engine_regs_init(id)\
-       ( \
-       AUX_COMMON_REG_LIST0_RI(id), \
-       SR_ARR_INIT(AUXN_IMPCAL, id, 0), \
-       SR_ARR_INIT(AUXP_IMPCAL, id, 0), \
-       SR_ARR_INIT(AUX_RESET_MASK, id, DP_AUX0_AUX_CONTROL__AUX_RESET_MASK), \
-       SR_ARR_INIT(AUX_RESET_MASK, id, DP_AUX0_AUX_CONTROL__AUX_RESET_MASK)\
-       )
-
-static struct dce110_aux_registers aux_engine_regs[5];
-
-static const struct dce110_aux_registers_shift aux_shift = {
-       DCN_AUX_MASK_SH_LIST(__SHIFT)
-};
-
-static const struct dce110_aux_registers_mask aux_mask = {
-       DCN_AUX_MASK_SH_LIST(_MASK)
-};
-
-#define dwbc_regs_dcn3_init(id)\
-       DWBC_COMMON_REG_LIST_DCN30_RI(id)
-
-static struct dcn30_dwbc_registers dwbc30_regs[1];
-
-static const struct dcn30_dwbc_shift dwbc30_shift = {
-       DWBC_COMMON_MASK_SH_LIST_DCN30(__SHIFT)
-};
-
-static const struct dcn30_dwbc_mask dwbc30_mask = {
-       DWBC_COMMON_MASK_SH_LIST_DCN30(_MASK)
-};
-
-#define mcif_wb_regs_dcn3_init(id)\
-       MCIF_WB_COMMON_REG_LIST_DCN32_RI(id)
-
-static struct dcn30_mmhubbub_registers mcif_wb30_regs[1];
-
-static const struct dcn30_mmhubbub_shift mcif_wb30_shift = {
-       MCIF_WB_COMMON_MASK_SH_LIST_DCN32(__SHIFT)
-};
-
-static const struct dcn30_mmhubbub_mask mcif_wb30_mask = {
-       MCIF_WB_COMMON_MASK_SH_LIST_DCN32(_MASK)
-};
-
-#define dsc_regsDCN20_init(id)\
-       DSC_REG_LIST_DCN20_RI(id)
-
-static struct dcn20_dsc_registers dsc_regs[4];
-
-static const struct dcn20_dsc_shift dsc_shift = {
-       DSC_REG_LIST_SH_MASK_DCN20(__SHIFT)
-};
-
-static const struct dcn20_dsc_mask dsc_mask = {
-       DSC_REG_LIST_SH_MASK_DCN20(_MASK)
-};
-
-static struct dcn30_mpc_registers mpc_regs;
-
-#define dcn_mpc_regs_init() \
-       MPC_REG_LIST_DCN3_2_RI(0),\
-       MPC_REG_LIST_DCN3_2_RI(1),\
-       MPC_REG_LIST_DCN3_2_RI(2),\
-       MPC_REG_LIST_DCN3_2_RI(3),\
-       MPC_OUT_MUX_REG_LIST_DCN3_0_RI(0),\
-       MPC_OUT_MUX_REG_LIST_DCN3_0_RI(1),\
-       MPC_OUT_MUX_REG_LIST_DCN3_0_RI(2),\
-       MPC_OUT_MUX_REG_LIST_DCN3_0_RI(3),\
-       MPC_DWB_MUX_REG_LIST_DCN3_0_RI(0)
-
-static const struct dcn30_mpc_shift mpc_shift = {
-       MPC_COMMON_MASK_SH_LIST_DCN32(__SHIFT)
-};
-
-static const struct dcn30_mpc_mask mpc_mask = {
-       MPC_COMMON_MASK_SH_LIST_DCN32(_MASK)
-};
-
-#define optc_regs_init(id)\
-       OPTC_COMMON_REG_LIST_DCN3_2_RI(id)
-
-static struct dcn_optc_registers optc_regs[4];
-
-static const struct dcn_optc_shift optc_shift = {
-       OPTC_COMMON_MASK_SH_LIST_DCN3_2(__SHIFT)
-};
-
-static const struct dcn_optc_mask optc_mask = {
-       OPTC_COMMON_MASK_SH_LIST_DCN3_2(_MASK)
-};
-
-#define hubp_regs_init(id)\
-       HUBP_REG_LIST_DCN32_RI(id)
-
-static struct dcn_hubp2_registers hubp_regs[4];
-
-
-static const struct dcn_hubp2_shift hubp_shift = {
-               HUBP_MASK_SH_LIST_DCN32(__SHIFT)
-};
-
-static const struct dcn_hubp2_mask hubp_mask = {
-               HUBP_MASK_SH_LIST_DCN32(_MASK)
-};
-
-static struct dcn_hubbub_registers hubbub_reg;
-#define hubbub_reg_init()\
-               HUBBUB_REG_LIST_DCN32_RI(0)
-
-static const struct dcn_hubbub_shift hubbub_shift = {
-               HUBBUB_MASK_SH_LIST_DCN32(__SHIFT)
-};
-
-static const struct dcn_hubbub_mask hubbub_mask = {
-               HUBBUB_MASK_SH_LIST_DCN32(_MASK)
-};
-
-static struct dccg_registers dccg_regs;
-
-#define dccg_regs_init()\
-       DCCG_REG_LIST_DCN32_RI()
-
-static const struct dccg_shift dccg_shift = {
-               DCCG_MASK_SH_LIST_DCN32(__SHIFT)
-};
-
-static const struct dccg_mask dccg_mask = {
-               DCCG_MASK_SH_LIST_DCN32(_MASK)
-};
-
-
-#define SRII2(reg_name_pre, reg_name_post, id)\
-       .reg_name_pre ## _ ##  reg_name_post[id] = BASE(reg ## reg_name_pre \
-                       ## id ## _ ## reg_name_post ## _BASE_IDX) + \
-                       reg ## reg_name_pre ## id ## _ ## reg_name_post
-
-
-#define HWSEQ_DCN32_REG_LIST()\
-       SR(DCHUBBUB_GLOBAL_TIMER_CNTL), \
-       SR(DIO_MEM_PWR_CTRL), \
-       SR(ODM_MEM_PWR_CTRL3), \
-       SR(MMHUBBUB_MEM_PWR_CNTL), \
-       SR(DCCG_GATE_DISABLE_CNTL), \
-       SR(DCCG_GATE_DISABLE_CNTL2), \
-       SR(DCFCLK_CNTL),\
-       SR(DC_MEM_GLOBAL_PWR_REQ_CNTL), \
-       SRII(PIXEL_RATE_CNTL, OTG, 0), \
-       SRII(PIXEL_RATE_CNTL, OTG, 1),\
-       SRII(PIXEL_RATE_CNTL, OTG, 2),\
-       SRII(PIXEL_RATE_CNTL, OTG, 3),\
-       SRII(PHYPLL_PIXEL_RATE_CNTL, OTG, 0),\
-       SRII(PHYPLL_PIXEL_RATE_CNTL, OTG, 1),\
-       SRII(PHYPLL_PIXEL_RATE_CNTL, OTG, 2),\
-       SRII(PHYPLL_PIXEL_RATE_CNTL, OTG, 3),\
-       SR(MICROSECOND_TIME_BASE_DIV), \
-       SR(MILLISECOND_TIME_BASE_DIV), \
-       SR(DISPCLK_FREQ_CHANGE_CNTL), \
-       SR(RBBMIF_TIMEOUT_DIS), \
-       SR(RBBMIF_TIMEOUT_DIS_2), \
-       SR(DCHUBBUB_CRC_CTRL), \
-       SR(DPP_TOP0_DPP_CRC_CTRL), \
-       SR(DPP_TOP0_DPP_CRC_VAL_B_A), \
-       SR(DPP_TOP0_DPP_CRC_VAL_R_G), \
-       SR(MPC_CRC_CTRL), \
-       SR(MPC_CRC_RESULT_GB), \
-       SR(MPC_CRC_RESULT_C), \
-       SR(MPC_CRC_RESULT_AR), \
-       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(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(D1VGA_CONTROL), \
-       SR(D2VGA_CONTROL), \
-       SR(D3VGA_CONTROL), \
-       SR(D4VGA_CONTROL), \
-       SR(D5VGA_CONTROL), \
-       SR(D6VGA_CONTROL), \
-       SR(DC_IP_REQUEST_CNTL), \
-       SR(AZALIA_AUDIO_DTO), \
-       SR(AZALIA_CONTROLLER_CLOCK_GATING)
-
-static struct dce_hwseq_registers hwseq_reg;
-
-#define hwseq_reg_init()\
-       HWSEQ_DCN32_REG_LIST()
-
-#define HWSEQ_DCN32_MASK_SH_LIST(mask_sh)\
-       HWSEQ_DCN_MASK_SH_LIST(mask_sh), \
-       HWS_SF(, DCHUBBUB_GLOBAL_TIMER_CNTL, DCHUBBUB_GLOBAL_TIMER_REFDIV, mask_sh), \
-       HWS_SF(, DOMAIN0_PG_CONFIG, DOMAIN_POWER_FORCEON, mask_sh), \
-       HWS_SF(, DOMAIN0_PG_CONFIG, DOMAIN_POWER_GATE, mask_sh), \
-       HWS_SF(, DOMAIN1_PG_CONFIG, DOMAIN_POWER_FORCEON, mask_sh), \
-       HWS_SF(, DOMAIN1_PG_CONFIG, DOMAIN_POWER_GATE, mask_sh), \
-       HWS_SF(, DOMAIN2_PG_CONFIG, DOMAIN_POWER_FORCEON, mask_sh), \
-       HWS_SF(, DOMAIN2_PG_CONFIG, DOMAIN_POWER_GATE, mask_sh), \
-       HWS_SF(, DOMAIN3_PG_CONFIG, DOMAIN_POWER_FORCEON, mask_sh), \
-       HWS_SF(, DOMAIN3_PG_CONFIG, DOMAIN_POWER_GATE, mask_sh), \
-       HWS_SF(, DOMAIN16_PG_CONFIG, DOMAIN_POWER_FORCEON, mask_sh), \
-       HWS_SF(, DOMAIN16_PG_CONFIG, DOMAIN_POWER_GATE, mask_sh), \
-       HWS_SF(, DOMAIN17_PG_CONFIG, DOMAIN_POWER_FORCEON, mask_sh), \
-       HWS_SF(, DOMAIN17_PG_CONFIG, DOMAIN_POWER_GATE, mask_sh), \
-       HWS_SF(, DOMAIN18_PG_CONFIG, DOMAIN_POWER_FORCEON, mask_sh), \
-       HWS_SF(, DOMAIN18_PG_CONFIG, DOMAIN_POWER_GATE, mask_sh), \
-       HWS_SF(, DOMAIN19_PG_CONFIG, DOMAIN_POWER_FORCEON, mask_sh), \
-       HWS_SF(, DOMAIN19_PG_CONFIG, DOMAIN_POWER_GATE, mask_sh), \
-       HWS_SF(, DOMAIN0_PG_STATUS, DOMAIN_PGFSM_PWR_STATUS, mask_sh), \
-       HWS_SF(, DOMAIN1_PG_STATUS, DOMAIN_PGFSM_PWR_STATUS, mask_sh), \
-       HWS_SF(, DOMAIN2_PG_STATUS, DOMAIN_PGFSM_PWR_STATUS, mask_sh), \
-       HWS_SF(, DOMAIN3_PG_STATUS, DOMAIN_PGFSM_PWR_STATUS, mask_sh), \
-       HWS_SF(, DOMAIN16_PG_STATUS, DOMAIN_PGFSM_PWR_STATUS, mask_sh), \
-       HWS_SF(, DOMAIN17_PG_STATUS, DOMAIN_PGFSM_PWR_STATUS, mask_sh), \
-       HWS_SF(, DOMAIN18_PG_STATUS, DOMAIN_PGFSM_PWR_STATUS, mask_sh), \
-       HWS_SF(, DOMAIN19_PG_STATUS, DOMAIN_PGFSM_PWR_STATUS, mask_sh), \
-       HWS_SF(, DC_IP_REQUEST_CNTL, IP_REQUEST_EN, mask_sh), \
-       HWS_SF(, AZALIA_AUDIO_DTO, AZALIA_AUDIO_DTO_MODULE, mask_sh), \
-       HWS_SF(, HPO_TOP_CLOCK_CONTROL, HPO_HDMISTREAMCLK_G_GATE_DIS, mask_sh), \
-       HWS_SF(, ODM_MEM_PWR_CTRL3, ODM_MEM_UNASSIGNED_PWR_MODE, mask_sh), \
-       HWS_SF(, ODM_MEM_PWR_CTRL3, ODM_MEM_VBLANK_PWR_MODE, mask_sh), \
-       HWS_SF(, MMHUBBUB_MEM_PWR_CNTL, VGA_MEM_PWR_FORCE, mask_sh)
-
-static const struct dce_hwseq_shift hwseq_shift = {
-               HWSEQ_DCN32_MASK_SH_LIST(__SHIFT)
-};
-
-static const struct dce_hwseq_mask hwseq_mask = {
-               HWSEQ_DCN32_MASK_SH_LIST(_MASK)
-};
-#define vmid_regs_init(id)\
-               DCN20_VMID_REG_LIST_RI(id)
-
-static struct dcn_vmid_registers vmid_regs[16];
-
-static const struct dcn20_vmid_shift vmid_shifts = {
-               DCN20_VMID_MASK_SH_LIST(__SHIFT)
-};
-
-static const struct dcn20_vmid_mask vmid_masks = {
-               DCN20_VMID_MASK_SH_LIST(_MASK)
-};
-
-static const struct resource_caps res_cap_dcn32 = {
-       .num_timing_generator = 4,
-       .num_opp = 4,
-       .num_video_plane = 4,
-       .num_audio = 5,
-       .num_stream_encoder = 5,
-       .num_hpo_dp_stream_encoder = 4,
-       .num_hpo_dp_link_encoder = 2,
-       .num_pll = 5,
-       .num_dwb = 1,
-       .num_ddc = 5,
-       .num_vmid = 16,
-       .num_mpc_3dlut = 4,
-       .num_dsc = 4,
-};
-
-static const struct dc_plane_cap plane_cap = {
-       .type = DC_PLANE_TYPE_DCN_UNIVERSAL,
-       .per_pixel_alpha = true,
-
-       .pixel_format_support = {
-                       .argb8888 = true,
-                       .nv12 = true,
-                       .fp16 = true,
-                       .p010 = true,
-                       .ayuv = false,
-       },
-
-       .max_upscale_factor = {
-                       .argb8888 = 16000,
-                       .nv12 = 16000,
-                       .fp16 = 16000
-       },
-
-       // 6:1 downscaling ratio: 1000/6 = 166.666
-       .max_downscale_factor = {
-                       .argb8888 = 167,
-                       .nv12 = 167,
-                       .fp16 = 167
-       },
-       64,
-       64
-};
-
-static const struct dc_debug_options debug_defaults_drv = {
-       .disable_dmcu = true,
-       .force_abm_enable = false,
-       .timing_trace = false,
-       .clock_trace = true,
-       .disable_pplib_clock_request = false,
-       .pipe_split_policy = MPC_SPLIT_AVOID, // Due to CRB, no need to MPC split anymore
-       .force_single_disp_pipe_split = false,
-       .disable_dcc = DCC_ENABLE,
-       .vsr_support = true,
-       .performance_trace = false,
-       .max_downscale_src_width = 7680,/*upto 8K*/
-       .disable_pplib_wm_range = false,
-       .scl_reset_length10 = true,
-       .sanity_checks = false,
-       .underflow_assert_delay_us = 0xFFFFFFFF,
-       .dwb_fi_phase = -1, // -1 = disable,
-       .dmub_command_table = true,
-       .enable_mem_low_power = {
-               .bits = {
-                       .vga = false,
-                       .i2c = false,
-                       .dmcu = false, // This is previously known to cause hang on S3 cycles if enabled
-                       .dscl = false,
-                       .cm = false,
-                       .mpc = false,
-                       .optc = true,
-               }
-       },
-       .use_max_lb = true,
-       .force_disable_subvp = false,
-       .exit_idle_opt_for_cursor_updates = true,
-       .using_dml2 = false,
-       .enable_single_display_2to1_odm_policy = true,
-
-       /* Must match enable_single_display_2to1_odm_policy to support dynamic ODM transitions*/
-       .enable_double_buffered_dsc_pg_support = true,
-       .enable_dp_dig_pixel_rate_div_policy = 1,
-       .allow_sw_cursor_fallback = false, // Linux can't do SW cursor "fallback"
-       .alloc_extra_way_for_cursor = true,
-       .min_prefetch_in_strobe_ns = 60000, // 60us
-       .disable_unbounded_requesting = false,
-       .override_dispclk_programming = true,
-       .disable_fpo_optimizations = false,
-       .fpo_vactive_margin_us = 2000, // 2000us
-       .disable_fpo_vactive = false,
-       .disable_boot_optimizations = false,
-       .disable_subvp_high_refresh = false,
-       .disable_dp_plus_plus_wa = true,
-       .fpo_vactive_min_active_margin_us = 200,
-       .fpo_vactive_max_blank_us = 1000,
-       .enable_legacy_fast_update = false,
-};
-
-static struct dce_aux *dcn32_aux_engine_create(
-       struct dc_context *ctx,
-       uint32_t inst)
-{
-       struct aux_engine_dce110 *aux_engine =
-               kzalloc(sizeof(struct aux_engine_dce110), GFP_KERNEL);
-
-       if (!aux_engine)
-               return NULL;
-
-#undef REG_STRUCT
-#define REG_STRUCT aux_engine_regs
-       aux_engine_regs_init(0),
-       aux_engine_regs_init(1),
-       aux_engine_regs_init(2),
-       aux_engine_regs_init(3),
-       aux_engine_regs_init(4);
-
-       dce110_aux_engine_construct(aux_engine, ctx, inst,
-                                   SW_AUX_TIMEOUT_PERIOD_MULTIPLIER * AUX_TIMEOUT_PERIOD,
-                                   &aux_engine_regs[inst],
-                                       &aux_mask,
-                                       &aux_shift,
-                                       ctx->dc->caps.extended_aux_timeout_support);
-
-       return &aux_engine->base;
-}
-#define i2c_inst_regs_init(id)\
-       I2C_HW_ENGINE_COMMON_REG_LIST_DCN30_RI(id)
-
-static struct dce_i2c_registers i2c_hw_regs[5];
-
-static const struct dce_i2c_shift i2c_shifts = {
-               I2C_COMMON_MASK_SH_LIST_DCN30(__SHIFT)
-};
-
-static const struct dce_i2c_mask i2c_masks = {
-               I2C_COMMON_MASK_SH_LIST_DCN30(_MASK)
-};
-
-static struct dce_i2c_hw *dcn32_i2c_hw_create(
-       struct dc_context *ctx,
-       uint32_t inst)
-{
-       struct dce_i2c_hw *dce_i2c_hw =
-               kzalloc(sizeof(struct dce_i2c_hw), GFP_KERNEL);
-
-       if (!dce_i2c_hw)
-               return NULL;
-
-#undef REG_STRUCT
-#define REG_STRUCT i2c_hw_regs
-       i2c_inst_regs_init(1),
-       i2c_inst_regs_init(2),
-       i2c_inst_regs_init(3),
-       i2c_inst_regs_init(4),
-       i2c_inst_regs_init(5);
-
-       dcn2_i2c_hw_construct(dce_i2c_hw, ctx, inst,
-                                   &i2c_hw_regs[inst], &i2c_shifts, &i2c_masks);
-
-       return dce_i2c_hw;
-}
-
-static struct clock_source *dcn32_clock_source_create(
-               struct dc_context *ctx,
-               struct dc_bios *bios,
-               enum clock_source_id id,
-               const struct dce110_clk_src_regs *regs,
-               bool dp_clk_src)
-{
-       struct dce110_clk_src *clk_src =
-               kzalloc(sizeof(struct dce110_clk_src), GFP_KERNEL);
-
-       if (!clk_src)
-               return NULL;
-
-       if (dcn31_clk_src_construct(clk_src, ctx, bios, id,
-                       regs, &cs_shift, &cs_mask)) {
-               clk_src->base.dp_clk_src = dp_clk_src;
-               return &clk_src->base;
-       }
-
-       kfree(clk_src);
-       BREAK_TO_DEBUGGER();
-       return NULL;
-}
-
-static struct hubbub *dcn32_hubbub_create(struct dc_context *ctx)
-{
-       int i;
-
-       struct dcn20_hubbub *hubbub2 = kzalloc(sizeof(struct dcn20_hubbub),
-                                         GFP_KERNEL);
-
-       if (!hubbub2)
-               return NULL;
-
-#undef REG_STRUCT
-#define REG_STRUCT hubbub_reg
-       hubbub_reg_init();
-
-#undef REG_STRUCT
-#define REG_STRUCT vmid_regs
-       vmid_regs_init(0),
-       vmid_regs_init(1),
-       vmid_regs_init(2),
-       vmid_regs_init(3),
-       vmid_regs_init(4),
-       vmid_regs_init(5),
-       vmid_regs_init(6),
-       vmid_regs_init(7),
-       vmid_regs_init(8),
-       vmid_regs_init(9),
-       vmid_regs_init(10),
-       vmid_regs_init(11),
-       vmid_regs_init(12),
-       vmid_regs_init(13),
-       vmid_regs_init(14),
-       vmid_regs_init(15);
-
-       hubbub32_construct(hubbub2, ctx,
-                       &hubbub_reg,
-                       &hubbub_shift,
-                       &hubbub_mask,
-                       ctx->dc->dml.ip.det_buffer_size_kbytes,
-                       ctx->dc->dml.ip.pixel_chunk_size_kbytes,
-                       ctx->dc->dml.ip.config_return_buffer_size_in_kbytes);
-
-
-       for (i = 0; i < res_cap_dcn32.num_vmid; i++) {
-               struct dcn20_vmid *vmid = &hubbub2->vmid[i];
-
-               vmid->ctx = ctx;
-
-               vmid->regs = &vmid_regs[i];
-               vmid->shifts = &vmid_shifts;
-               vmid->masks = &vmid_masks;
-       }
-
-       return &hubbub2->base;
-}
-
-static struct hubp *dcn32_hubp_create(
-       struct dc_context *ctx,
-       uint32_t inst)
-{
-       struct dcn20_hubp *hubp2 =
-               kzalloc(sizeof(struct dcn20_hubp), GFP_KERNEL);
-
-       if (!hubp2)
-               return NULL;
-
-#undef REG_STRUCT
-#define REG_STRUCT hubp_regs
-       hubp_regs_init(0),
-       hubp_regs_init(1),
-       hubp_regs_init(2),
-       hubp_regs_init(3);
-
-       if (hubp32_construct(hubp2, ctx, inst,
-                       &hubp_regs[inst], &hubp_shift, &hubp_mask))
-               return &hubp2->base;
-
-       BREAK_TO_DEBUGGER();
-       kfree(hubp2);
-       return NULL;
-}
-
-static void dcn32_dpp_destroy(struct dpp **dpp)
-{
-       kfree(TO_DCN30_DPP(*dpp));
-       *dpp = NULL;
-}
-
-static struct dpp *dcn32_dpp_create(
-       struct dc_context *ctx,
-       uint32_t inst)
-{
-       struct dcn3_dpp *dpp3 =
-               kzalloc(sizeof(struct dcn3_dpp), GFP_KERNEL);
-
-       if (!dpp3)
-               return NULL;
-
-#undef REG_STRUCT
-#define REG_STRUCT dpp_regs
-       dpp_regs_init(0),
-       dpp_regs_init(1),
-       dpp_regs_init(2),
-       dpp_regs_init(3);
-
-       if (dpp32_construct(dpp3, ctx, inst,
-                       &dpp_regs[inst], &tf_shift, &tf_mask))
-               return &dpp3->base;
-
-       BREAK_TO_DEBUGGER();
-       kfree(dpp3);
-       return NULL;
-}
-
-static struct mpc *dcn32_mpc_create(
-               struct dc_context *ctx,
-               int num_mpcc,
-               int num_rmu)
-{
-       struct dcn30_mpc *mpc30 = kzalloc(sizeof(struct dcn30_mpc),
-                                         GFP_KERNEL);
-
-       if (!mpc30)
-               return NULL;
-
-#undef REG_STRUCT
-#define REG_STRUCT mpc_regs
-       dcn_mpc_regs_init();
-
-       dcn32_mpc_construct(mpc30, ctx,
-                       &mpc_regs,
-                       &mpc_shift,
-                       &mpc_mask,
-                       num_mpcc,
-                       num_rmu);
-
-       return &mpc30->base;
-}
-
-static struct output_pixel_processor *dcn32_opp_create(
-       struct dc_context *ctx, uint32_t inst)
-{
-       struct dcn20_opp *opp2 =
-               kzalloc(sizeof(struct dcn20_opp), GFP_KERNEL);
-
-       if (!opp2) {
-               BREAK_TO_DEBUGGER();
-               return NULL;
-       }
-
-#undef REG_STRUCT
-#define REG_STRUCT opp_regs
-       opp_regs_init(0),
-       opp_regs_init(1),
-       opp_regs_init(2),
-       opp_regs_init(3);
-
-       dcn20_opp_construct(opp2, ctx, inst,
-                       &opp_regs[inst], &opp_shift, &opp_mask);
-       return &opp2->base;
-}
-
-
-static struct timing_generator *dcn32_timing_generator_create(
-               struct dc_context *ctx,
-               uint32_t instance)
-{
-       struct optc *tgn10 =
-               kzalloc(sizeof(struct optc), GFP_KERNEL);
-
-       if (!tgn10)
-               return NULL;
-
-#undef REG_STRUCT
-#define REG_STRUCT optc_regs
-       optc_regs_init(0),
-       optc_regs_init(1),
-       optc_regs_init(2),
-       optc_regs_init(3);
-
-       tgn10->base.inst = instance;
-       tgn10->base.ctx = ctx;
-
-       tgn10->tg_regs = &optc_regs[instance];
-       tgn10->tg_shift = &optc_shift;
-       tgn10->tg_mask = &optc_mask;
-
-       dcn32_timing_generator_init(tgn10);
-
-       return &tgn10->base;
-}
-
-static const struct encoder_feature_support link_enc_feature = {
-               .max_hdmi_deep_color = COLOR_DEPTH_121212,
-               .max_hdmi_pixel_clock = 600000,
-               .hdmi_ycbcr420_supported = true,
-               .dp_ycbcr420_supported = true,
-               .fec_supported = true,
-               .flags.bits.IS_HBR2_CAPABLE = true,
-               .flags.bits.IS_HBR3_CAPABLE = true,
-               .flags.bits.IS_TPS3_CAPABLE = true,
-               .flags.bits.IS_TPS4_CAPABLE = true
-};
-
-static struct link_encoder *dcn32_link_encoder_create(
-       struct dc_context *ctx,
-       const struct encoder_init_data *enc_init_data)
-{
-       struct dcn20_link_encoder *enc20 =
-               kzalloc(sizeof(struct dcn20_link_encoder), GFP_KERNEL);
-
-       if (!enc20)
-               return NULL;
-
-#undef REG_STRUCT
-#define REG_STRUCT link_enc_aux_regs
-       aux_regs_init(0),
-       aux_regs_init(1),
-       aux_regs_init(2),
-       aux_regs_init(3),
-       aux_regs_init(4);
-
-#undef REG_STRUCT
-#define REG_STRUCT link_enc_hpd_regs
-       hpd_regs_init(0),
-       hpd_regs_init(1),
-       hpd_regs_init(2),
-       hpd_regs_init(3),
-       hpd_regs_init(4);
-
-#undef REG_STRUCT
-#define REG_STRUCT link_enc_regs
-       link_regs_init(0, A),
-       link_regs_init(1, B),
-       link_regs_init(2, C),
-       link_regs_init(3, D),
-       link_regs_init(4, E);
-
-       dcn32_link_encoder_construct(enc20,
-                       enc_init_data,
-                       &link_enc_feature,
-                       &link_enc_regs[enc_init_data->transmitter],
-                       &link_enc_aux_regs[enc_init_data->channel - 1],
-                       &link_enc_hpd_regs[enc_init_data->hpd_source],
-                       &le_shift,
-                       &le_mask);
-
-       return &enc20->enc10.base;
-}
-
-struct panel_cntl *dcn32_panel_cntl_create(const struct panel_cntl_init_data *init_data)
-{
-       struct dcn31_panel_cntl *panel_cntl =
-               kzalloc(sizeof(struct dcn31_panel_cntl), GFP_KERNEL);
-
-       if (!panel_cntl)
-               return NULL;
-
-       dcn31_panel_cntl_construct(panel_cntl, init_data);
-
-       return &panel_cntl->base;
-}
-
-static void read_dce_straps(
-       struct dc_context *ctx,
-       struct resource_straps *straps)
-{
-       generic_reg_get(ctx, ctx->dcn_reg_offsets[regDC_PINSTRAPS_BASE_IDX] + regDC_PINSTRAPS,
-               FN(DC_PINSTRAPS, DC_PINSTRAPS_AUDIO), &straps->dc_pinstraps_audio);
-
-}
-
-static struct audio *dcn32_create_audio(
-               struct dc_context *ctx, unsigned int inst)
-{
-
-#undef REG_STRUCT
-#define REG_STRUCT audio_regs
-       audio_regs_init(0),
-       audio_regs_init(1),
-       audio_regs_init(2),
-       audio_regs_init(3),
-       audio_regs_init(4);
-
-       return dce_audio_create(ctx, inst,
-                       &audio_regs[inst], &audio_shift, &audio_mask);
-}
-
-static struct vpg *dcn32_vpg_create(
-       struct dc_context *ctx,
-       uint32_t inst)
-{
-       struct dcn30_vpg *vpg3 = kzalloc(sizeof(struct dcn30_vpg), GFP_KERNEL);
-
-       if (!vpg3)
-               return NULL;
-
-#undef REG_STRUCT
-#define REG_STRUCT vpg_regs
-       vpg_regs_init(0),
-       vpg_regs_init(1),
-       vpg_regs_init(2),
-       vpg_regs_init(3),
-       vpg_regs_init(4),
-       vpg_regs_init(5),
-       vpg_regs_init(6),
-       vpg_regs_init(7),
-       vpg_regs_init(8),
-       vpg_regs_init(9);
-
-       vpg3_construct(vpg3, ctx, inst,
-                       &vpg_regs[inst],
-                       &vpg_shift,
-                       &vpg_mask);
-
-       return &vpg3->base;
-}
-
-static struct afmt *dcn32_afmt_create(
-       struct dc_context *ctx,
-       uint32_t inst)
-{
-       struct dcn30_afmt *afmt3 = kzalloc(sizeof(struct dcn30_afmt), GFP_KERNEL);
-
-       if (!afmt3)
-               return NULL;
-
-#undef REG_STRUCT
-#define REG_STRUCT afmt_regs
-       afmt_regs_init(0),
-       afmt_regs_init(1),
-       afmt_regs_init(2),
-       afmt_regs_init(3),
-       afmt_regs_init(4),
-       afmt_regs_init(5);
-
-       afmt3_construct(afmt3, ctx, inst,
-                       &afmt_regs[inst],
-                       &afmt_shift,
-                       &afmt_mask);
-
-       return &afmt3->base;
-}
-
-static struct apg *dcn31_apg_create(
-       struct dc_context *ctx,
-       uint32_t inst)
-{
-       struct dcn31_apg *apg31 = kzalloc(sizeof(struct dcn31_apg), GFP_KERNEL);
-
-       if (!apg31)
-               return NULL;
-
-#undef REG_STRUCT
-#define REG_STRUCT apg_regs
-       apg_regs_init(0),
-       apg_regs_init(1),
-       apg_regs_init(2),
-       apg_regs_init(3);
-
-       apg31_construct(apg31, ctx, inst,
-                       &apg_regs[inst],
-                       &apg_shift,
-                       &apg_mask);
-
-       return &apg31->base;
-}
-
-static struct stream_encoder *dcn32_stream_encoder_create(
-       enum engine_id eng_id,
-       struct dc_context *ctx)
-{
-       struct dcn10_stream_encoder *enc1;
-       struct vpg *vpg;
-       struct afmt *afmt;
-       int vpg_inst;
-       int afmt_inst;
-
-       /* Mapping of VPG, AFMT, DME register blocks to DIO block instance */
-       if (eng_id <= ENGINE_ID_DIGF) {
-               vpg_inst = eng_id;
-               afmt_inst = eng_id;
-       } else
-               return NULL;
-
-       enc1 = kzalloc(sizeof(struct dcn10_stream_encoder), GFP_KERNEL);
-       vpg = dcn32_vpg_create(ctx, vpg_inst);
-       afmt = dcn32_afmt_create(ctx, afmt_inst);
-
-       if (!enc1 || !vpg || !afmt) {
-               kfree(enc1);
-               kfree(vpg);
-               kfree(afmt);
-               return NULL;
-       }
-
-#undef REG_STRUCT
-#define REG_STRUCT stream_enc_regs
-       stream_enc_regs_init(0),
-       stream_enc_regs_init(1),
-       stream_enc_regs_init(2),
-       stream_enc_regs_init(3),
-       stream_enc_regs_init(4);
-
-       dcn32_dio_stream_encoder_construct(enc1, ctx, ctx->dc_bios,
-                                       eng_id, vpg, afmt,
-                                       &stream_enc_regs[eng_id],
-                                       &se_shift, &se_mask);
-
-       return &enc1->base;
-}
-
-static struct hpo_dp_stream_encoder *dcn32_hpo_dp_stream_encoder_create(
-       enum engine_id eng_id,
-       struct dc_context *ctx)
-{
-       struct dcn31_hpo_dp_stream_encoder *hpo_dp_enc31;
-       struct vpg *vpg;
-       struct apg *apg;
-       uint32_t hpo_dp_inst;
-       uint32_t vpg_inst;
-       uint32_t apg_inst;
-
-       ASSERT((eng_id >= ENGINE_ID_HPO_DP_0) && (eng_id <= ENGINE_ID_HPO_DP_3));
-       hpo_dp_inst = eng_id - ENGINE_ID_HPO_DP_0;
-
-       /* Mapping of VPG register blocks to HPO DP block instance:
-        * VPG[6] -> HPO_DP[0]
-        * VPG[7] -> HPO_DP[1]
-        * VPG[8] -> HPO_DP[2]
-        * VPG[9] -> HPO_DP[3]
-        */
-       vpg_inst = hpo_dp_inst + 6;
-
-       /* Mapping of APG register blocks to HPO DP block instance:
-        * APG[0] -> HPO_DP[0]
-        * APG[1] -> HPO_DP[1]
-        * APG[2] -> HPO_DP[2]
-        * APG[3] -> HPO_DP[3]
-        */
-       apg_inst = hpo_dp_inst;
-
-       /* allocate HPO stream encoder and create VPG sub-block */
-       hpo_dp_enc31 = kzalloc(sizeof(struct dcn31_hpo_dp_stream_encoder), GFP_KERNEL);
-       vpg = dcn32_vpg_create(ctx, vpg_inst);
-       apg = dcn31_apg_create(ctx, apg_inst);
-
-       if (!hpo_dp_enc31 || !vpg || !apg) {
-               kfree(hpo_dp_enc31);
-               kfree(vpg);
-               kfree(apg);
-               return NULL;
-       }
-
-#undef REG_STRUCT
-#define REG_STRUCT hpo_dp_stream_enc_regs
-       hpo_dp_stream_encoder_reg_init(0),
-       hpo_dp_stream_encoder_reg_init(1),
-       hpo_dp_stream_encoder_reg_init(2),
-       hpo_dp_stream_encoder_reg_init(3);
-
-       dcn31_hpo_dp_stream_encoder_construct(hpo_dp_enc31, ctx, ctx->dc_bios,
-                                       hpo_dp_inst, eng_id, vpg, apg,
-                                       &hpo_dp_stream_enc_regs[hpo_dp_inst],
-                                       &hpo_dp_se_shift, &hpo_dp_se_mask);
-
-       return &hpo_dp_enc31->base;
-}
-
-static struct hpo_dp_link_encoder *dcn32_hpo_dp_link_encoder_create(
-       uint8_t inst,
-       struct dc_context *ctx)
-{
-       struct dcn31_hpo_dp_link_encoder *hpo_dp_enc31;
-
-       /* allocate HPO link encoder */
-       hpo_dp_enc31 = kzalloc(sizeof(struct dcn31_hpo_dp_link_encoder), GFP_KERNEL);
-
-#undef REG_STRUCT
-#define REG_STRUCT hpo_dp_link_enc_regs
-       hpo_dp_link_encoder_reg_init(0),
-       hpo_dp_link_encoder_reg_init(1);
-
-       hpo_dp_link_encoder32_construct(hpo_dp_enc31, ctx, inst,
-                                       &hpo_dp_link_enc_regs[inst],
-                                       &hpo_dp_le_shift, &hpo_dp_le_mask);
-
-       return &hpo_dp_enc31->base;
-}
-
-static struct dce_hwseq *dcn32_hwseq_create(
-       struct dc_context *ctx)
-{
-       struct dce_hwseq *hws = kzalloc(sizeof(struct dce_hwseq), GFP_KERNEL);
-
-#undef REG_STRUCT
-#define REG_STRUCT hwseq_reg
-       hwseq_reg_init();
-
-       if (hws) {
-               hws->ctx = ctx;
-               hws->regs = &hwseq_reg;
-               hws->shifts = &hwseq_shift;
-               hws->masks = &hwseq_mask;
-       }
-       return hws;
-}
-static const struct resource_create_funcs res_create_funcs = {
-       .read_dce_straps = read_dce_straps,
-       .create_audio = dcn32_create_audio,
-       .create_stream_encoder = dcn32_stream_encoder_create,
-       .create_hpo_dp_stream_encoder = dcn32_hpo_dp_stream_encoder_create,
-       .create_hpo_dp_link_encoder = dcn32_hpo_dp_link_encoder_create,
-       .create_hwseq = dcn32_hwseq_create,
-};
-
-static void dcn32_resource_destruct(struct dcn32_resource_pool *pool)
-{
-       unsigned int i;
-
-       for (i = 0; i < pool->base.stream_enc_count; i++) {
-               if (pool->base.stream_enc[i] != NULL) {
-                       if (pool->base.stream_enc[i]->vpg != NULL) {
-                               kfree(DCN30_VPG_FROM_VPG(pool->base.stream_enc[i]->vpg));
-                               pool->base.stream_enc[i]->vpg = NULL;
-                       }
-                       if (pool->base.stream_enc[i]->afmt != NULL) {
-                               kfree(DCN30_AFMT_FROM_AFMT(pool->base.stream_enc[i]->afmt));
-                               pool->base.stream_enc[i]->afmt = NULL;
-                       }
-                       kfree(DCN10STRENC_FROM_STRENC(pool->base.stream_enc[i]));
-                       pool->base.stream_enc[i] = NULL;
-               }
-       }
-
-       for (i = 0; i < pool->base.hpo_dp_stream_enc_count; i++) {
-               if (pool->base.hpo_dp_stream_enc[i] != NULL) {
-                       if (pool->base.hpo_dp_stream_enc[i]->vpg != NULL) {
-                               kfree(DCN30_VPG_FROM_VPG(pool->base.hpo_dp_stream_enc[i]->vpg));
-                               pool->base.hpo_dp_stream_enc[i]->vpg = NULL;
-                       }
-                       if (pool->base.hpo_dp_stream_enc[i]->apg != NULL) {
-                               kfree(DCN31_APG_FROM_APG(pool->base.hpo_dp_stream_enc[i]->apg));
-                               pool->base.hpo_dp_stream_enc[i]->apg = NULL;
-                       }
-                       kfree(DCN3_1_HPO_DP_STREAM_ENC_FROM_HPO_STREAM_ENC(pool->base.hpo_dp_stream_enc[i]));
-                       pool->base.hpo_dp_stream_enc[i] = NULL;
-               }
-       }
-
-       for (i = 0; i < pool->base.hpo_dp_link_enc_count; i++) {
-               if (pool->base.hpo_dp_link_enc[i] != NULL) {
-                       kfree(DCN3_1_HPO_DP_LINK_ENC_FROM_HPO_LINK_ENC(pool->base.hpo_dp_link_enc[i]));
-                       pool->base.hpo_dp_link_enc[i] = NULL;
-               }
-       }
-
-       for (i = 0; i < pool->base.res_cap->num_dsc; i++) {
-               if (pool->base.dscs[i] != NULL)
-                       dcn20_dsc_destroy(&pool->base.dscs[i]);
-       }
-
-       if (pool->base.mpc != NULL) {
-               kfree(TO_DCN20_MPC(pool->base.mpc));
-               pool->base.mpc = NULL;
-       }
-       if (pool->base.hubbub != NULL) {
-               kfree(TO_DCN20_HUBBUB(pool->base.hubbub));
-               pool->base.hubbub = NULL;
-       }
-       for (i = 0; i < pool->base.pipe_count; i++) {
-               if (pool->base.dpps[i] != NULL)
-                       dcn32_dpp_destroy(&pool->base.dpps[i]);
-
-               if (pool->base.ipps[i] != NULL)
-                       pool->base.ipps[i]->funcs->ipp_destroy(&pool->base.ipps[i]);
-
-               if (pool->base.hubps[i] != NULL) {
-                       kfree(TO_DCN20_HUBP(pool->base.hubps[i]));
-                       pool->base.hubps[i] = NULL;
-               }
-
-               if (pool->base.irqs != NULL) {
-                       dal_irq_service_destroy(&pool->base.irqs);
-               }
-       }
-
-       for (i = 0; i < pool->base.res_cap->num_ddc; i++) {
-               if (pool->base.engines[i] != NULL)
-                       dce110_engine_destroy(&pool->base.engines[i]);
-               if (pool->base.hw_i2cs[i] != NULL) {
-                       kfree(pool->base.hw_i2cs[i]);
-                       pool->base.hw_i2cs[i] = NULL;
-               }
-               if (pool->base.sw_i2cs[i] != NULL) {
-                       kfree(pool->base.sw_i2cs[i]);
-                       pool->base.sw_i2cs[i] = NULL;
-               }
-       }
-
-       for (i = 0; i < pool->base.res_cap->num_opp; i++) {
-               if (pool->base.opps[i] != NULL)
-                       pool->base.opps[i]->funcs->opp_destroy(&pool->base.opps[i]);
-       }
-
-       for (i = 0; i < pool->base.res_cap->num_timing_generator; i++) {
-               if (pool->base.timing_generators[i] != NULL)    {
-                       kfree(DCN10TG_FROM_TG(pool->base.timing_generators[i]));
-                       pool->base.timing_generators[i] = NULL;
-               }
-       }
-
-       for (i = 0; i < pool->base.res_cap->num_dwb; i++) {
-               if (pool->base.dwbc[i] != NULL) {
-                       kfree(TO_DCN30_DWBC(pool->base.dwbc[i]));
-                       pool->base.dwbc[i] = NULL;
-               }
-               if (pool->base.mcif_wb[i] != NULL) {
-                       kfree(TO_DCN30_MMHUBBUB(pool->base.mcif_wb[i]));
-                       pool->base.mcif_wb[i] = NULL;
-               }
-       }
-
-       for (i = 0; i < pool->base.audio_count; i++) {
-               if (pool->base.audios[i])
-                       dce_aud_destroy(&pool->base.audios[i]);
-       }
-
-       for (i = 0; i < pool->base.clk_src_count; i++) {
-               if (pool->base.clock_sources[i] != NULL) {
-                       dcn20_clock_source_destroy(&pool->base.clock_sources[i]);
-                       pool->base.clock_sources[i] = NULL;
-               }
-       }
-
-       for (i = 0; i < pool->base.res_cap->num_mpc_3dlut; i++) {
-               if (pool->base.mpc_lut[i] != NULL) {
-                       dc_3dlut_func_release(pool->base.mpc_lut[i]);
-                       pool->base.mpc_lut[i] = NULL;
-               }
-               if (pool->base.mpc_shaper[i] != NULL) {
-                       dc_transfer_func_release(pool->base.mpc_shaper[i]);
-                       pool->base.mpc_shaper[i] = NULL;
-               }
-       }
-
-       if (pool->base.dp_clock_source != NULL) {
-               dcn20_clock_source_destroy(&pool->base.dp_clock_source);
-               pool->base.dp_clock_source = NULL;
-       }
-
-       for (i = 0; i < pool->base.res_cap->num_timing_generator; i++) {
-               if (pool->base.multiple_abms[i] != NULL)
-                       dce_abm_destroy(&pool->base.multiple_abms[i]);
-       }
-
-       if (pool->base.psr != NULL)
-               dmub_psr_destroy(&pool->base.psr);
-
-       if (pool->base.dccg != NULL)
-               dcn_dccg_destroy(&pool->base.dccg);
-
-       if (pool->base.oem_device != NULL) {
-               struct dc *dc = pool->base.oem_device->ctx->dc;
-
-               dc->link_srv->destroy_ddc_service(&pool->base.oem_device);
-       }
-}
-
-
-static bool dcn32_dwbc_create(struct dc_context *ctx, struct resource_pool *pool)
-{
-       int i;
-       uint32_t dwb_count = pool->res_cap->num_dwb;
-
-       for (i = 0; i < dwb_count; i++) {
-               struct dcn30_dwbc *dwbc30 = kzalloc(sizeof(struct dcn30_dwbc),
-                                                   GFP_KERNEL);
-
-               if (!dwbc30) {
-                       dm_error("DC: failed to create dwbc30!\n");
-                       return false;
-               }
-
-#undef REG_STRUCT
-#define REG_STRUCT dwbc30_regs
-               dwbc_regs_dcn3_init(0);
-
-               dcn30_dwbc_construct(dwbc30, ctx,
-                               &dwbc30_regs[i],
-                               &dwbc30_shift,
-                               &dwbc30_mask,
-                               i);
-
-               pool->dwbc[i] = &dwbc30->base;
-       }
-       return true;
-}
-
-static bool dcn32_mmhubbub_create(struct dc_context *ctx, struct resource_pool *pool)
-{
-       int i;
-       uint32_t dwb_count = pool->res_cap->num_dwb;
-
-       for (i = 0; i < dwb_count; i++) {
-               struct dcn30_mmhubbub *mcif_wb30 = kzalloc(sizeof(struct dcn30_mmhubbub),
-                                                   GFP_KERNEL);
-
-               if (!mcif_wb30) {
-                       dm_error("DC: failed to create mcif_wb30!\n");
-                       return false;
-               }
-
-#undef REG_STRUCT
-#define REG_STRUCT mcif_wb30_regs
-               mcif_wb_regs_dcn3_init(0);
-
-               dcn32_mmhubbub_construct(mcif_wb30, ctx,
-                               &mcif_wb30_regs[i],
-                               &mcif_wb30_shift,
-                               &mcif_wb30_mask,
-                               i);
-
-               pool->mcif_wb[i] = &mcif_wb30->base;
-       }
-       return true;
-}
-
-static struct display_stream_compressor *dcn32_dsc_create(
-       struct dc_context *ctx, uint32_t inst)
-{
-       struct dcn20_dsc *dsc =
-               kzalloc(sizeof(struct dcn20_dsc), GFP_KERNEL);
-
-       if (!dsc) {
-               BREAK_TO_DEBUGGER();
-               return NULL;
-       }
-
-#undef REG_STRUCT
-#define REG_STRUCT dsc_regs
-       dsc_regsDCN20_init(0),
-       dsc_regsDCN20_init(1),
-       dsc_regsDCN20_init(2),
-       dsc_regsDCN20_init(3);
-
-       dsc2_construct(dsc, ctx, inst, &dsc_regs[inst], &dsc_shift, &dsc_mask);
-
-       dsc->max_image_width = 6016;
-
-       return &dsc->base;
-}
-
-static void dcn32_destroy_resource_pool(struct resource_pool **pool)
-{
-       struct dcn32_resource_pool *dcn32_pool = TO_DCN32_RES_POOL(*pool);
-
-       dcn32_resource_destruct(dcn32_pool);
-       kfree(dcn32_pool);
-       *pool = NULL;
-}
-
-bool dcn32_acquire_post_bldn_3dlut(
-               struct resource_context *res_ctx,
-               const struct resource_pool *pool,
-               int mpcc_id,
-               struct dc_3dlut **lut,
-               struct dc_transfer_func **shaper)
-{
-       bool ret = false;
-
-       ASSERT(*lut == NULL && *shaper == NULL);
-       *lut = NULL;
-       *shaper = NULL;
-
-       if (!res_ctx->is_mpc_3dlut_acquired[mpcc_id]) {
-               *lut = pool->mpc_lut[mpcc_id];
-               *shaper = pool->mpc_shaper[mpcc_id];
-               res_ctx->is_mpc_3dlut_acquired[mpcc_id] = true;
-               ret = true;
-       }
-       return ret;
-}
-
-bool dcn32_release_post_bldn_3dlut(
-               struct resource_context *res_ctx,
-               const struct resource_pool *pool,
-               struct dc_3dlut **lut,
-               struct dc_transfer_func **shaper)
-{
-       int i;
-       bool ret = false;
-
-       for (i = 0; i < pool->res_cap->num_mpc_3dlut; i++) {
-               if (pool->mpc_lut[i] == *lut && pool->mpc_shaper[i] == *shaper) {
-                       res_ctx->is_mpc_3dlut_acquired[i] = false;
-                       pool->mpc_lut[i]->state.raw = 0;
-                       *lut = NULL;
-                       *shaper = NULL;
-                       ret = true;
-                       break;
-               }
-       }
-       return ret;
-}
-
-static void dcn32_enable_phantom_plane(struct dc *dc,
-               struct dc_state *context,
-               struct dc_stream_state *phantom_stream,
-               unsigned int dc_pipe_idx)
-{
-       struct dc_plane_state *phantom_plane = NULL;
-       struct dc_plane_state *prev_phantom_plane = NULL;
-       struct pipe_ctx *curr_pipe = &context->res_ctx.pipe_ctx[dc_pipe_idx];
-
-       while (curr_pipe) {
-               if (curr_pipe->top_pipe && curr_pipe->top_pipe->plane_state == curr_pipe->plane_state)
-                       phantom_plane = prev_phantom_plane;
-               else
-                       phantom_plane = dc_create_plane_state(dc);
-
-               memcpy(&phantom_plane->address, &curr_pipe->plane_state->address, sizeof(phantom_plane->address));
-               memcpy(&phantom_plane->scaling_quality, &curr_pipe->plane_state->scaling_quality,
-                               sizeof(phantom_plane->scaling_quality));
-               memcpy(&phantom_plane->src_rect, &curr_pipe->plane_state->src_rect, sizeof(phantom_plane->src_rect));
-               memcpy(&phantom_plane->dst_rect, &curr_pipe->plane_state->dst_rect, sizeof(phantom_plane->dst_rect));
-               memcpy(&phantom_plane->clip_rect, &curr_pipe->plane_state->clip_rect, sizeof(phantom_plane->clip_rect));
-               memcpy(&phantom_plane->plane_size, &curr_pipe->plane_state->plane_size,
-                               sizeof(phantom_plane->plane_size));
-               memcpy(&phantom_plane->tiling_info, &curr_pipe->plane_state->tiling_info,
-                               sizeof(phantom_plane->tiling_info));
-               memcpy(&phantom_plane->dcc, &curr_pipe->plane_state->dcc, sizeof(phantom_plane->dcc));
-               phantom_plane->format = curr_pipe->plane_state->format;
-               phantom_plane->rotation = curr_pipe->plane_state->rotation;
-               phantom_plane->visible = curr_pipe->plane_state->visible;
-
-               /* Shadow pipe has small viewport. */
-               phantom_plane->clip_rect.y = 0;
-               phantom_plane->clip_rect.height = phantom_stream->src.height;
-
-               phantom_plane->is_phantom = true;
-
-               dc_add_plane_to_context(dc, phantom_stream, phantom_plane, context);
-
-               curr_pipe = curr_pipe->bottom_pipe;
-               prev_phantom_plane = phantom_plane;
-       }
-}
-
-static struct dc_stream_state *dcn32_enable_phantom_stream(struct dc *dc,
-               struct dc_state *context,
-               display_e2e_pipe_params_st *pipes,
-               unsigned int pipe_cnt,
-               unsigned int dc_pipe_idx)
-{
-       struct dc_stream_state *phantom_stream = NULL;
-       struct pipe_ctx *ref_pipe = &context->res_ctx.pipe_ctx[dc_pipe_idx];
-
-       phantom_stream = dc_create_stream_for_sink(ref_pipe->stream->sink);
-       phantom_stream->signal = SIGNAL_TYPE_VIRTUAL;
-       phantom_stream->dpms_off = true;
-       phantom_stream->mall_stream_config.type = SUBVP_PHANTOM;
-       phantom_stream->mall_stream_config.paired_stream = ref_pipe->stream;
-       ref_pipe->stream->mall_stream_config.type = SUBVP_MAIN;
-       ref_pipe->stream->mall_stream_config.paired_stream = phantom_stream;
-
-       /* stream has limited viewport and small timing */
-       memcpy(&phantom_stream->timing, &ref_pipe->stream->timing, sizeof(phantom_stream->timing));
-       memcpy(&phantom_stream->src, &ref_pipe->stream->src, sizeof(phantom_stream->src));
-       memcpy(&phantom_stream->dst, &ref_pipe->stream->dst, sizeof(phantom_stream->dst));
-       DC_FP_START();
-       dcn32_set_phantom_stream_timing(dc, context, ref_pipe, phantom_stream, pipes, pipe_cnt, dc_pipe_idx);
-       DC_FP_END();
-
-       dc_add_stream_to_ctx(dc, context, phantom_stream);
-       return phantom_stream;
-}
-
-void dcn32_retain_phantom_pipes(struct dc *dc, struct dc_state *context)
-{
-       int i;
-       struct dc_plane_state *phantom_plane = NULL;
-       struct dc_stream_state *phantom_stream = NULL;
-
-       for (i = 0; i < dc->res_pool->pipe_count; i++) {
-               struct pipe_ctx *pipe = &context->res_ctx.pipe_ctx[i];
-
-               if (resource_is_pipe_type(pipe, OTG_MASTER) &&
-                               resource_is_pipe_type(pipe, DPP_PIPE) &&
-                               pipe->stream->mall_stream_config.type == SUBVP_PHANTOM) {
-                       phantom_plane = pipe->plane_state;
-                       phantom_stream = pipe->stream;
-
-                       dc_plane_state_retain(phantom_plane);
-                       dc_stream_retain(phantom_stream);
-               }
-       }
-}
-
-// return true if removed piped from ctx, false otherwise
-bool dcn32_remove_phantom_pipes(struct dc *dc, struct dc_state *context, bool fast_update)
-{
-       int i;
-       bool removed_pipe = false;
-       struct dc_plane_state *phantom_plane = NULL;
-       struct dc_stream_state *phantom_stream = NULL;
-
-       for (i = 0; i < dc->res_pool->pipe_count; i++) {
-               struct pipe_ctx *pipe = &context->res_ctx.pipe_ctx[i];
-               // build scaling params for phantom pipes
-               if (pipe->plane_state && pipe->stream && pipe->stream->mall_stream_config.type == SUBVP_PHANTOM) {
-                       phantom_plane = pipe->plane_state;
-                       phantom_stream = pipe->stream;
-
-                       dc_rem_all_planes_for_stream(dc, pipe->stream, context);
-                       dc_remove_stream_from_ctx(dc, context, pipe->stream);
-
-                       /* Ref count is incremented on allocation and also when added to the context.
-                        * Therefore we must call release for the the phantom plane and stream once
-                        * they are removed from the ctx to finally decrement the refcount to 0 to free.
-                        */
-                       dc_plane_state_release(phantom_plane);
-                       dc_stream_release(phantom_stream);
-
-                       removed_pipe = true;
-               }
-
-               /* For non-full updates, a shallow copy of the current state
-                * is created. In this case we don't want to erase the current
-                * state (there can be 2 HIRQL threads, one in flip, and one in
-                * checkMPO) that can cause a race condition.
-                *
-                * This is just a workaround, needs a proper fix.
-                */
-               if (!fast_update) {
-                       // Clear all phantom stream info
-                       if (pipe->stream) {
-                               pipe->stream->mall_stream_config.type = SUBVP_NONE;
-                               pipe->stream->mall_stream_config.paired_stream = NULL;
-                       }
-
-                       if (pipe->plane_state) {
-                               pipe->plane_state->is_phantom = false;
-                       }
-               }
-       }
-       return removed_pipe;
-}
-
-/* TODO: Input to this function should indicate which pipe indexes (or streams)
- * require a phantom pipe / stream
- */
-void dcn32_add_phantom_pipes(struct dc *dc, struct dc_state *context,
-               display_e2e_pipe_params_st *pipes,
-               unsigned int pipe_cnt,
-               unsigned int index)
-{
-       struct dc_stream_state *phantom_stream = NULL;
-       unsigned int i;
-
-       // The index of the DC pipe passed into this function is guarenteed to
-       // be a valid candidate for SubVP (i.e. has a plane, stream, doesn't
-       // already have phantom pipe assigned, etc.) by previous checks.
-       phantom_stream = dcn32_enable_phantom_stream(dc, context, pipes, pipe_cnt, index);
-       dcn32_enable_phantom_plane(dc, context, phantom_stream, index);
-
-       for (i = 0; i < dc->res_pool->pipe_count; i++) {
-               struct pipe_ctx *pipe = &context->res_ctx.pipe_ctx[i];
-
-               // Build scaling params for phantom pipes which were newly added.
-               // We determine which phantom pipes were added by comparing with
-               // the phantom stream.
-               if (pipe->plane_state && pipe->stream && pipe->stream == phantom_stream &&
-                               pipe->stream->mall_stream_config.type == SUBVP_PHANTOM) {
-                       pipe->stream->use_dynamic_meta = false;
-                       pipe->plane_state->flip_immediate = false;
-                       if (!resource_build_scaling_params(pipe)) {
-                               // Log / remove phantom pipes since failed to build scaling params
-                       }
-               }
-       }
-}
-
-static bool dml1_validate(struct dc *dc, struct dc_state *context, bool fast_validate)
-{
-       bool out = false;
-
-       BW_VAL_TRACE_SETUP();
-
-       int vlevel = 0;
-       int pipe_cnt = 0;
-       display_e2e_pipe_params_st *pipes = kzalloc(dc->res_pool->pipe_count * sizeof(display_e2e_pipe_params_st), GFP_KERNEL);
-       struct mall_temp_config mall_temp_config;
-
-       /* To handle Freesync properly, setting FreeSync DML parameters
-        * to its default state for the first stage of validation
-        */
-       context->bw_ctx.bw.dcn.clk.fw_based_mclk_switching = false;
-       context->bw_ctx.dml.soc.dram_clock_change_requirement_final = true;
-
-       DC_LOGGER_INIT(dc->ctx->logger);
-
-       /* For fast validation, there are situations where a shallow copy of
-        * of the dc->current_state is created for the validation. In this case
-        * we want to save and restore the mall config because we always
-        * teardown subvp at the beginning of validation (and don't attempt
-        * to add it back if it's fast validation). If we don't restore the
-        * subvp config in cases of fast validation + shallow copy of the
-        * dc->current_state, the dc->current_state will have a partially
-        * removed subvp state when we did not intend to remove it.
-        */
-       if (fast_validate) {
-               memset(&mall_temp_config, 0, sizeof(mall_temp_config));
-               dcn32_save_mall_state(dc, context, &mall_temp_config);
-       }
-
-       BW_VAL_TRACE_COUNT();
-
-       DC_FP_START();
-       out = dcn32_internal_validate_bw(dc, context, pipes, &pipe_cnt, &vlevel, fast_validate);
-       DC_FP_END();
-
-       if (fast_validate)
-               dcn32_restore_mall_state(dc, context, &mall_temp_config);
-
-       if (pipe_cnt == 0)
-               goto validate_out;
-
-       if (!out)
-               goto validate_fail;
-
-       BW_VAL_TRACE_END_VOLTAGE_LEVEL();
-
-       if (fast_validate) {
-               BW_VAL_TRACE_SKIP(fast);
-               goto validate_out;
-       }
-
-       dc->res_pool->funcs->calculate_wm_and_dlg(dc, context, pipes, pipe_cnt, vlevel);
-
-       dcn32_override_min_req_memclk(dc, context);
-
-       BW_VAL_TRACE_END_WATERMARKS();
-
-       goto validate_out;
-
-validate_fail:
-       DC_LOG_WARNING("Mode Validation Warning: %s failed validation.\n",
-               dml_get_status_message(context->bw_ctx.dml.vba.ValidationStatus[context->bw_ctx.dml.vba.soc.num_states]));
-
-       BW_VAL_TRACE_SKIP(fail);
-       out = false;
-
-validate_out:
-       kfree(pipes);
-
-       BW_VAL_TRACE_FINISH();
-
-       return out;
-}
-
-bool dcn32_validate_bandwidth(struct dc *dc,
-               struct dc_state *context,
-               bool fast_validate)
-{
-       bool out = false;
-
-       if (dc->debug.using_dml2)
-               out = dml2_validate(dc, context, fast_validate);
-       else
-               out = dml1_validate(dc, context, fast_validate);
-       return out;
-}
-
-int dcn32_populate_dml_pipes_from_context(
-       struct dc *dc, struct dc_state *context,
-       display_e2e_pipe_params_st *pipes,
-       bool fast_validate)
-{
-       int i, pipe_cnt;
-       struct resource_context *res_ctx = &context->res_ctx;
-       struct pipe_ctx *pipe = NULL;
-       bool subvp_in_use = false;
-       struct dc_crtc_timing *timing;
-
-       dcn20_populate_dml_pipes_from_context(dc, context, pipes, fast_validate);
-
-       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];
-               timing = &pipe->stream->timing;
-
-               pipes[pipe_cnt].pipe.src.gpuvm = true;
-               DC_FP_START();
-               dcn32_zero_pipe_dcc_fraction(pipes, pipe_cnt);
-               DC_FP_END();
-               pipes[pipe_cnt].pipe.dest.vfront_porch = timing->v_front_porch;
-               pipes[pipe_cnt].pipe.dest.odm_combine_policy = dm_odm_combine_policy_dal;
-               pipes[pipe_cnt].pipe.src.gpuvm_min_page_size_kbytes = 256; // according to spreadsheet
-               pipes[pipe_cnt].pipe.src.unbounded_req_mode = false;
-               pipes[pipe_cnt].pipe.scale_ratio_depth.lb_depth = dm_lb_19;
-
-               /* Only populate DML input with subvp info for full updates.
-                * This is just a workaround -- needs a proper fix.
-                */
-               if (!fast_validate) {
-                       switch (pipe->stream->mall_stream_config.type) {
-                       case SUBVP_MAIN:
-                               pipes[pipe_cnt].pipe.src.use_mall_for_pstate_change = dm_use_mall_pstate_change_sub_viewport;
-                               subvp_in_use = true;
-                               break;
-                       case SUBVP_PHANTOM:
-                               pipes[pipe_cnt].pipe.src.use_mall_for_pstate_change = dm_use_mall_pstate_change_phantom_pipe;
-                               pipes[pipe_cnt].pipe.src.use_mall_for_static_screen = dm_use_mall_static_screen_disable;
-                               // Disallow unbounded req for SubVP according to DCHUB programming guide
-                               pipes[pipe_cnt].pipe.src.unbounded_req_mode = false;
-                               break;
-                       case SUBVP_NONE:
-                               pipes[pipe_cnt].pipe.src.use_mall_for_pstate_change = dm_use_mall_pstate_change_disable;
-                               pipes[pipe_cnt].pipe.src.use_mall_for_static_screen = dm_use_mall_static_screen_disable;
-                               break;
-                       default:
-                               break;
-                       }
-               }
-
-               pipes[pipe_cnt].dout.dsc_input_bpc = 0;
-               if (pipes[pipe_cnt].dout.dsc_enable) {
-                       switch (timing->display_color_depth) {
-                       case COLOR_DEPTH_888:
-                               pipes[pipe_cnt].dout.dsc_input_bpc = 8;
-                               break;
-                       case COLOR_DEPTH_101010:
-                               pipes[pipe_cnt].dout.dsc_input_bpc = 10;
-                               break;
-                       case COLOR_DEPTH_121212:
-                               pipes[pipe_cnt].dout.dsc_input_bpc = 12;
-                               break;
-                       default:
-                               ASSERT(0);
-                               break;
-                       }
-               }
-
-
-               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.
-        */
-       dcn32_set_det_allocations(dc, context, pipes);
-
-       // In general cases we want to keep the dram clock change requirement
-       // (prefer configs that support MCLK switch). Only override to false
-       // for SubVP
-       if (context->bw_ctx.bw.dcn.clk.fw_based_mclk_switching || subvp_in_use)
-               context->bw_ctx.dml.soc.dram_clock_change_requirement_final = false;
-       else
-               context->bw_ctx.dml.soc.dram_clock_change_requirement_final = true;
-
-       return pipe_cnt;
-}
-
-static struct dc_cap_funcs cap_funcs = {
-       .get_dcc_compression_cap = dcn20_get_dcc_compression_cap,
-       .get_subvp_en = dcn32_subvp_in_use,
-};
-
-void dcn32_calculate_wm_and_dlg(struct dc *dc, struct dc_state *context,
-                               display_e2e_pipe_params_st *pipes,
-                               int pipe_cnt,
-                               int vlevel)
-{
-    DC_FP_START();
-    dcn32_calculate_wm_and_dlg_fpu(dc, context, pipes, pipe_cnt, vlevel);
-    DC_FP_END();
-}
-
-static void dcn32_update_bw_bounding_box(struct dc *dc, struct clk_bw_params *bw_params)
-{
-       DC_FP_START();
-       dcn32_update_bw_bounding_box_fpu(dc, bw_params);
-       DC_FP_END();
-}
-
-static struct resource_funcs dcn32_res_pool_funcs = {
-       .destroy = dcn32_destroy_resource_pool,
-       .link_enc_create = dcn32_link_encoder_create,
-       .link_enc_create_minimal = NULL,
-       .panel_cntl_create = dcn32_panel_cntl_create,
-       .validate_bandwidth = dcn32_validate_bandwidth,
-       .calculate_wm_and_dlg = dcn32_calculate_wm_and_dlg,
-       .populate_dml_pipes = dcn32_populate_dml_pipes_from_context,
-       .acquire_free_pipe_as_secondary_dpp_pipe = dcn32_acquire_free_pipe_as_secondary_dpp_pipe,
-       .acquire_free_pipe_as_secondary_opp_head = dcn32_acquire_free_pipe_as_secondary_opp_head,
-       .release_pipe = dcn20_release_pipe,
-       .add_stream_to_ctx = dcn30_add_stream_to_ctx,
-       .add_dsc_to_stream_resource = dcn20_add_dsc_to_stream_resource,
-       .remove_stream_from_ctx = dcn20_remove_stream_from_ctx,
-       .populate_dml_writeback_from_context = dcn30_populate_dml_writeback_from_context,
-       .set_mcif_arb_params = dcn30_set_mcif_arb_params,
-       .find_first_free_match_stream_enc_for_link = dcn10_find_first_free_match_stream_enc_for_link,
-       .acquire_post_bldn_3dlut = dcn32_acquire_post_bldn_3dlut,
-       .release_post_bldn_3dlut = dcn32_release_post_bldn_3dlut,
-       .update_bw_bounding_box = dcn32_update_bw_bounding_box,
-       .patch_unknown_plane_state = dcn20_patch_unknown_plane_state,
-       .update_soc_for_wm_a = dcn30_update_soc_for_wm_a,
-       .add_phantom_pipes = dcn32_add_phantom_pipes,
-       .remove_phantom_pipes = dcn32_remove_phantom_pipes,
-       .retain_phantom_pipes = dcn32_retain_phantom_pipes,
-       .save_mall_state = dcn32_save_mall_state,
-       .restore_mall_state = dcn32_restore_mall_state,
-};
-
-static uint32_t read_pipe_fuses(struct dc_context *ctx)
-{
-       uint32_t value = REG_READ(CC_DC_PIPE_DIS);
-       /* DCN32 support max 4 pipes */
-       value = value & 0xf;
-       return value;
-}
-
-
-static bool dcn32_resource_construct(
-       uint8_t num_virtual_links,
-       struct dc *dc,
-       struct dcn32_resource_pool *pool)
-{
-       int i, j;
-       struct dc_context *ctx = dc->ctx;
-       struct irq_service_init_data init_data;
-       struct ddc_service_init_data ddc_init_data = {0};
-       uint32_t pipe_fuses = 0;
-       uint32_t num_pipes  = 4;
-
-#undef REG_STRUCT
-#define REG_STRUCT bios_regs
-       bios_regs_init();
-
-#undef REG_STRUCT
-#define REG_STRUCT clk_src_regs
-       clk_src_regs_init(0, A),
-       clk_src_regs_init(1, B),
-       clk_src_regs_init(2, C),
-       clk_src_regs_init(3, D),
-       clk_src_regs_init(4, E);
-
-#undef REG_STRUCT
-#define REG_STRUCT abm_regs
-       abm_regs_init(0),
-       abm_regs_init(1),
-       abm_regs_init(2),
-       abm_regs_init(3);
-
-#undef REG_STRUCT
-#define REG_STRUCT dccg_regs
-       dccg_regs_init();
-
-       DC_FP_START();
-
-       ctx->dc_bios->regs = &bios_regs;
-
-       pool->base.res_cap = &res_cap_dcn32;
-       /* max number of pipes for ASIC before checking for pipe fuses */
-       num_pipes  = pool->base.res_cap->num_timing_generator;
-       pipe_fuses = read_pipe_fuses(ctx);
-
-       for (i = 0; i < pool->base.res_cap->num_timing_generator; i++)
-               if (pipe_fuses & 1 << i)
-                       num_pipes--;
-
-       if (pipe_fuses & 1)
-               ASSERT(0); //Unexpected - Pipe 0 should always be fully functional!
-
-       if (pipe_fuses & CC_DC_PIPE_DIS__DC_FULL_DIS_MASK)
-               ASSERT(0); //Entire DCN is harvested!
-
-       /* within dml lib, initial value is hard coded, if ASIC pipe is fused, the
-        * value will be changed, update max_num_dpp and max_num_otg for dml.
-        */
-       dcn3_2_ip.max_num_dpp = num_pipes;
-       dcn3_2_ip.max_num_otg = num_pipes;
-
-       pool->base.funcs = &dcn32_res_pool_funcs;
-
-       /*************************************************
-        *  Resource + asic cap harcoding                *
-        *************************************************/
-       pool->base.underlay_pipe_index = NO_UNDERLAY_PIPE;
-       pool->base.timing_generator_count = num_pipes;
-       pool->base.pipe_count = num_pipes;
-       pool->base.mpcc_count = num_pipes;
-       dc->caps.max_downscale_ratio = 600;
-       dc->caps.i2c_speed_in_khz = 100;
-       dc->caps.i2c_speed_in_khz_hdcp = 100; /*1.4 w/a applied by default*/
-       /* TODO: Bring max_cursor_size back to 256 after subvp cursor corruption is fixed*/
-       dc->caps.max_cursor_size = 64;
-       dc->caps.min_horizontal_blanking_period = 80;
-       dc->caps.dmdata_alloc_size = 2048;
-       dc->caps.mall_size_per_mem_channel = 4;
-       dc->caps.mall_size_total = 0;
-       dc->caps.cursor_cache_size = dc->caps.max_cursor_size * dc->caps.max_cursor_size * 8;
-
-       dc->caps.cache_line_size = 64;
-       dc->caps.cache_num_ways = 16;
-
-       /* Calculate the available MALL space */
-       dc->caps.max_cab_allocation_bytes = dcn32_calc_num_avail_chans_for_mall(
-               dc, dc->ctx->dc_bios->vram_info.num_chans) *
-               dc->caps.mall_size_per_mem_channel * 1024 * 1024;
-       dc->caps.mall_size_total = dc->caps.max_cab_allocation_bytes;
-
-       dc->caps.subvp_fw_processing_delay_us = 15;
-       dc->caps.subvp_drr_max_vblank_margin_us = 40;
-       dc->caps.subvp_prefetch_end_to_mall_start_us = 15;
-       dc->caps.subvp_swath_height_margin_lines = 16;
-       dc->caps.subvp_pstate_allow_width_us = 20;
-       dc->caps.subvp_vertical_int_margin_us = 30;
-       dc->caps.subvp_drr_vblank_start_margin_us = 100; // 100us margin
-
-       dc->caps.max_slave_planes = 2;
-       dc->caps.max_slave_yuv_planes = 2;
-       dc->caps.max_slave_rgb_planes = 2;
-       dc->caps.post_blend_color_processing = true;
-       dc->caps.force_dp_tps4_for_cp2520 = true;
-       if (dc->config.forceHBR2CP2520)
-               dc->caps.force_dp_tps4_for_cp2520 = false;
-       dc->caps.dp_hpo = true;
-       dc->caps.dp_hdmi21_pcon_support = true;
-       dc->caps.edp_dsc_support = true;
-       dc->caps.extended_aux_timeout_support = true;
-       dc->caps.dmcub_support = true;
-       dc->caps.seamless_odm = true;
-       dc->caps.max_v_total = (1 << 15) - 1;
-
-       /* Color pipeline capabilities */
-       dc->caps.color.dpp.dcn_arch = 1;
-       dc->caps.color.dpp.input_lut_shared = 0;
-       dc->caps.color.dpp.icsc = 1;
-       dc->caps.color.dpp.dgam_ram = 0; // must use gamma_corr
-       dc->caps.color.dpp.dgam_rom_caps.srgb = 1;
-       dc->caps.color.dpp.dgam_rom_caps.bt2020 = 1;
-       dc->caps.color.dpp.dgam_rom_caps.gamma2_2 = 1;
-       dc->caps.color.dpp.dgam_rom_caps.pq = 1;
-       dc->caps.color.dpp.dgam_rom_caps.hlg = 1;
-       dc->caps.color.dpp.post_csc = 1;
-       dc->caps.color.dpp.gamma_corr = 1;
-       dc->caps.color.dpp.dgam_rom_for_yuv = 0;
-
-       dc->caps.color.dpp.hw_3d_lut = 1;
-       dc->caps.color.dpp.ogam_ram = 0;  // no OGAM in DPP since DCN1
-       // no OGAM ROM on DCN2 and later ASICs
-       dc->caps.color.dpp.ogam_rom_caps.srgb = 0;
-       dc->caps.color.dpp.ogam_rom_caps.bt2020 = 0;
-       dc->caps.color.dpp.ogam_rom_caps.gamma2_2 = 0;
-       dc->caps.color.dpp.ogam_rom_caps.pq = 0;
-       dc->caps.color.dpp.ogam_rom_caps.hlg = 0;
-       dc->caps.color.dpp.ocsc = 0;
-
-       dc->caps.color.mpc.gamut_remap = 1;
-       dc->caps.color.mpc.num_3dluts = pool->base.res_cap->num_mpc_3dlut; //4, configurable to be before or after BLND in MPCC
-       dc->caps.color.mpc.ogam_ram = 1;
-       dc->caps.color.mpc.ogam_rom_caps.srgb = 0;
-       dc->caps.color.mpc.ogam_rom_caps.bt2020 = 0;
-       dc->caps.color.mpc.ogam_rom_caps.gamma2_2 = 0;
-       dc->caps.color.mpc.ogam_rom_caps.pq = 0;
-       dc->caps.color.mpc.ogam_rom_caps.hlg = 0;
-       dc->caps.color.mpc.ocsc = 1;
-
-       /* Use pipe context based otg sync logic */
-       dc->config.use_pipe_ctx_sync_logic = true;
-
-       dc->config.dc_mode_clk_limit_support = true;
-       /* read VBIOS LTTPR caps */
-       {
-               if (ctx->dc_bios->funcs->get_lttpr_caps) {
-                       enum bp_result bp_query_result;
-                       uint8_t is_vbios_lttpr_enable = 0;
-
-                       bp_query_result = ctx->dc_bios->funcs->get_lttpr_caps(ctx->dc_bios, &is_vbios_lttpr_enable);
-                       dc->caps.vbios_lttpr_enable = (bp_query_result == BP_RESULT_OK) && !!is_vbios_lttpr_enable;
-               }
-
-               /* interop bit is implicit */
-               {
-                       dc->caps.vbios_lttpr_aware = true;
-               }
-       }
-
-       if (dc->ctx->dce_environment == DCE_ENV_PRODUCTION_DRV)
-               dc->debug = debug_defaults_drv;
-
-       // Init the vm_helper
-       if (dc->vm_helper)
-               vm_helper_init(dc->vm_helper, 16);
-
-       /*************************************************
-        *  Create resources                             *
-        *************************************************/
-
-       /* Clock Sources for Pixel Clock*/
-       pool->base.clock_sources[DCN32_CLK_SRC_PLL0] =
-                       dcn32_clock_source_create(ctx, ctx->dc_bios,
-                               CLOCK_SOURCE_COMBO_PHY_PLL0,
-                               &clk_src_regs[0], false);
-       pool->base.clock_sources[DCN32_CLK_SRC_PLL1] =
-                       dcn32_clock_source_create(ctx, ctx->dc_bios,
-                               CLOCK_SOURCE_COMBO_PHY_PLL1,
-                               &clk_src_regs[1], false);
-       pool->base.clock_sources[DCN32_CLK_SRC_PLL2] =
-                       dcn32_clock_source_create(ctx, ctx->dc_bios,
-                               CLOCK_SOURCE_COMBO_PHY_PLL2,
-                               &clk_src_regs[2], false);
-       pool->base.clock_sources[DCN32_CLK_SRC_PLL3] =
-                       dcn32_clock_source_create(ctx, ctx->dc_bios,
-                               CLOCK_SOURCE_COMBO_PHY_PLL3,
-                               &clk_src_regs[3], false);
-       pool->base.clock_sources[DCN32_CLK_SRC_PLL4] =
-                       dcn32_clock_source_create(ctx, ctx->dc_bios,
-                               CLOCK_SOURCE_COMBO_PHY_PLL4,
-                               &clk_src_regs[4], false);
-
-       pool->base.clk_src_count = DCN32_CLK_SRC_TOTAL;
-
-       /* todo: not reuse phy_pll registers */
-       pool->base.dp_clock_source =
-                       dcn32_clock_source_create(ctx, ctx->dc_bios,
-                               CLOCK_SOURCE_ID_DP_DTO,
-                               &clk_src_regs[0], true);
-
-       for (i = 0; i < pool->base.clk_src_count; i++) {
-               if (pool->base.clock_sources[i] == NULL) {
-                       dm_error("DC: failed to create clock sources!\n");
-                       BREAK_TO_DEBUGGER();
-                       goto create_fail;
-               }
-       }
-
-       /* DCCG */
-       pool->base.dccg = dccg32_create(ctx, &dccg_regs, &dccg_shift, &dccg_mask);
-       if (pool->base.dccg == NULL) {
-               dm_error("DC: failed to create dccg!\n");
-               BREAK_TO_DEBUGGER();
-               goto create_fail;
-       }
-
-       /* DML */
-       dml_init_instance(&dc->dml, &dcn3_2_soc, &dcn3_2_ip, DML_PROJECT_DCN32);
-
-       /* IRQ Service */
-       init_data.ctx = dc->ctx;
-       pool->base.irqs = dal_irq_service_dcn32_create(&init_data);
-       if (!pool->base.irqs)
-               goto create_fail;
-
-       /* HUBBUB */
-       pool->base.hubbub = dcn32_hubbub_create(ctx);
-       if (pool->base.hubbub == NULL) {
-               BREAK_TO_DEBUGGER();
-               dm_error("DC: failed to create hubbub!\n");
-               goto create_fail;
-       }
-
-       /* HUBPs, DPPs, OPPs, TGs, ABMs */
-       for (i = 0, j = 0; i < pool->base.res_cap->num_timing_generator; i++) {
-
-               /* if pipe is disabled, skip instance of HW pipe,
-                * i.e, skip ASIC register instance
-                */
-               if (pipe_fuses & 1 << i)
-                       continue;
-
-               /* HUBPs */
-               pool->base.hubps[j] = dcn32_hubp_create(ctx, i);
-               if (pool->base.hubps[j] == NULL) {
-                       BREAK_TO_DEBUGGER();
-                       dm_error(
-                               "DC: failed to create hubps!\n");
-                       goto create_fail;
-               }
-
-               /* DPPs */
-               pool->base.dpps[j] = dcn32_dpp_create(ctx, i);
-               if (pool->base.dpps[j] == NULL) {
-                       BREAK_TO_DEBUGGER();
-                       dm_error(
-                               "DC: failed to create dpps!\n");
-                       goto create_fail;
-               }
-
-               /* OPPs */
-               pool->base.opps[j] = dcn32_opp_create(ctx, i);
-               if (pool->base.opps[j] == NULL) {
-                       BREAK_TO_DEBUGGER();
-                       dm_error(
-                               "DC: failed to create output pixel processor!\n");
-                       goto create_fail;
-               }
-
-               /* TGs */
-               pool->base.timing_generators[j] = dcn32_timing_generator_create(
-                               ctx, i);
-               if (pool->base.timing_generators[j] == NULL) {
-                       BREAK_TO_DEBUGGER();
-                       dm_error("DC: failed to create tg!\n");
-                       goto create_fail;
-               }
-
-               /* ABMs */
-               pool->base.multiple_abms[j] = dmub_abm_create(ctx,
-                               &abm_regs[i],
-                               &abm_shift,
-                               &abm_mask);
-               if (pool->base.multiple_abms[j] == NULL) {
-                       dm_error("DC: failed to create abm for pipe %d!\n", i);
-                       BREAK_TO_DEBUGGER();
-                       goto create_fail;
-               }
-
-               /* index for resource pool arrays for next valid pipe */
-               j++;
-       }
-
-       /* PSR */
-       pool->base.psr = dmub_psr_create(ctx);
-       if (pool->base.psr == NULL) {
-               dm_error("DC: failed to create psr obj!\n");
-               BREAK_TO_DEBUGGER();
-               goto create_fail;
-       }
-
-       /* MPCCs */
-       pool->base.mpc = dcn32_mpc_create(ctx, pool->base.res_cap->num_timing_generator, pool->base.res_cap->num_mpc_3dlut);
-       if (pool->base.mpc == NULL) {
-               BREAK_TO_DEBUGGER();
-               dm_error("DC: failed to create mpc!\n");
-               goto create_fail;
-       }
-
-       /* DSCs */
-       for (i = 0; i < pool->base.res_cap->num_dsc; i++) {
-               pool->base.dscs[i] = dcn32_dsc_create(ctx, i);
-               if (pool->base.dscs[i] == NULL) {
-                       BREAK_TO_DEBUGGER();
-                       dm_error("DC: failed to create display stream compressor %d!\n", i);
-                       goto create_fail;
-               }
-       }
-
-       /* DWB */
-       if (!dcn32_dwbc_create(ctx, &pool->base)) {
-               BREAK_TO_DEBUGGER();
-               dm_error("DC: failed to create dwbc!\n");
-               goto create_fail;
-       }
-
-       /* MMHUBBUB */
-       if (!dcn32_mmhubbub_create(ctx, &pool->base)) {
-               BREAK_TO_DEBUGGER();
-               dm_error("DC: failed to create mcif_wb!\n");
-               goto create_fail;
-       }
-
-       /* AUX and I2C */
-       for (i = 0; i < pool->base.res_cap->num_ddc; i++) {
-               pool->base.engines[i] = dcn32_aux_engine_create(ctx, i);
-               if (pool->base.engines[i] == NULL) {
-                       BREAK_TO_DEBUGGER();
-                       dm_error(
-                               "DC:failed to create aux engine!!\n");
-                       goto create_fail;
-               }
-               pool->base.hw_i2cs[i] = dcn32_i2c_hw_create(ctx, i);
-               if (pool->base.hw_i2cs[i] == NULL) {
-                       BREAK_TO_DEBUGGER();
-                       dm_error(
-                               "DC:failed to create hw i2c!!\n");
-                       goto create_fail;
-               }
-               pool->base.sw_i2cs[i] = NULL;
-       }
-
-       /* Audio, HWSeq, Stream Encoders including HPO and virtual, MPC 3D LUTs */
-       if (!resource_construct(num_virtual_links, dc, &pool->base,
-                       &res_create_funcs))
-               goto create_fail;
-
-       /* HW Sequencer init functions and Plane caps */
-       dcn32_hw_sequencer_init_functions(dc);
-
-       dc->caps.max_planes =  pool->base.pipe_count;
-
-       for (i = 0; i < dc->caps.max_planes; ++i)
-               dc->caps.planes[i] = plane_cap;
-
-       dc->cap_funcs = cap_funcs;
-
-       if (dc->ctx->dc_bios->fw_info.oem_i2c_present) {
-               ddc_init_data.ctx = dc->ctx;
-               ddc_init_data.link = NULL;
-               ddc_init_data.id.id = dc->ctx->dc_bios->fw_info.oem_i2c_obj_id;
-               ddc_init_data.id.enum_id = 0;
-               ddc_init_data.id.type = OBJECT_TYPE_GENERIC;
-               pool->base.oem_device = dc->link_srv->create_ddc_service(&ddc_init_data);
-       } else {
-               pool->base.oem_device = NULL;
-       }
-
-       dc->dml2_options.dcn_pipe_count = pool->base.pipe_count;
-       dc->dml2_options.use_native_pstate_optimization = false;
-       dc->dml2_options.use_native_soc_bb_construction = true;
-       dc->dml2_options.minimize_dispclk_using_odm = true;
-
-       dc->dml2_options.callbacks.dc = dc;
-       dc->dml2_options.callbacks.build_scaling_params = &resource_build_scaling_params;
-       dc->dml2_options.callbacks.can_support_mclk_switch_using_fw_based_vblank_stretch = &dcn30_can_support_mclk_switch_using_fw_based_vblank_stretch;
-       dc->dml2_options.callbacks.acquire_secondary_pipe_for_mpc_odm = &dc_resource_acquire_secondary_pipe_for_mpc_odm_legacy;
-       dc->dml2_options.callbacks.update_pipes_for_stream_with_slice_count = &resource_update_pipes_for_stream_with_slice_count;
-       dc->dml2_options.callbacks.update_pipes_for_plane_with_slice_count = &resource_update_pipes_for_plane_with_slice_count;
-       dc->dml2_options.callbacks.get_mpc_slice_index = &resource_get_mpc_slice_index;
-       dc->dml2_options.callbacks.get_odm_slice_index = &resource_get_odm_slice_index;
-       dc->dml2_options.callbacks.get_opp_head = &resource_get_opp_head;
-
-       dc->dml2_options.svp_pstate.callbacks.dc = dc;
-       dc->dml2_options.svp_pstate.callbacks.add_plane_to_context = &dc_add_plane_to_context;
-       dc->dml2_options.svp_pstate.callbacks.add_stream_to_ctx = &dc_add_stream_to_ctx;
-       dc->dml2_options.svp_pstate.callbacks.build_scaling_params = &resource_build_scaling_params;
-       dc->dml2_options.svp_pstate.callbacks.create_plane = &dc_create_plane_state;
-       dc->dml2_options.svp_pstate.callbacks.remove_plane_from_context = &dc_remove_plane_from_context;
-       dc->dml2_options.svp_pstate.callbacks.remove_stream_from_ctx = &dc_remove_stream_from_ctx;
-       dc->dml2_options.svp_pstate.callbacks.create_stream_for_sink = &dc_create_stream_for_sink;
-       dc->dml2_options.svp_pstate.callbacks.plane_state_release = &dc_plane_state_release;
-       dc->dml2_options.svp_pstate.callbacks.stream_release = &dc_stream_release;
-       dc->dml2_options.svp_pstate.callbacks.release_dsc = &dcn20_release_dsc;
-
-       dc->dml2_options.svp_pstate.subvp_fw_processing_delay_us = dc->caps.subvp_fw_processing_delay_us;
-       dc->dml2_options.svp_pstate.subvp_prefetch_end_to_mall_start_us = dc->caps.subvp_prefetch_end_to_mall_start_us;
-       dc->dml2_options.svp_pstate.subvp_pstate_allow_width_us = dc->caps.subvp_pstate_allow_width_us;
-       dc->dml2_options.svp_pstate.subvp_swath_height_margin_lines = dc->caps.subvp_swath_height_margin_lines;
-
-       dc->dml2_options.svp_pstate.force_disable_subvp = dc->debug.force_disable_subvp;
-       dc->dml2_options.svp_pstate.force_enable_subvp = dc->debug.force_subvp_mclk_switch;
-
-       dc->dml2_options.mall_cfg.cache_line_size_bytes = dc->caps.cache_line_size;
-       dc->dml2_options.mall_cfg.cache_num_ways = dc->caps.cache_num_ways;
-       dc->dml2_options.mall_cfg.max_cab_allocation_bytes = dc->caps.max_cab_allocation_bytes;
-       dc->dml2_options.mall_cfg.mblk_height_4bpe_pixels = DCN3_2_MBLK_HEIGHT_4BPE;
-       dc->dml2_options.mall_cfg.mblk_height_8bpe_pixels = DCN3_2_MBLK_HEIGHT_8BPE;
-       dc->dml2_options.mall_cfg.mblk_size_bytes = DCN3_2_MALL_MBLK_SIZE_BYTES;
-       dc->dml2_options.mall_cfg.mblk_width_pixels = DCN3_2_MBLK_WIDTH;
-
-       dc->dml2_options.max_segments_per_hubp = 18;
-       dc->dml2_options.det_segment_size = DCN3_2_DET_SEG_SIZE;
-       dc->dml2_options.map_dc_pipes_with_callbacks = true;
-
-       if (ASICREV_IS_GC_11_0_3(dc->ctx->asic_id.hw_internal_rev) && (dc->config.sdpif_request_limit_words_per_umc == 0))
-               dc->config.sdpif_request_limit_words_per_umc = 16;
-
-       DC_FP_END();
-
-       return true;
-
-create_fail:
-
-       DC_FP_END();
-
-       dcn32_resource_destruct(pool);
-
-       return false;
-}
-
-struct resource_pool *dcn32_create_resource_pool(
-               const struct dc_init_data *init_data,
-               struct dc *dc)
-{
-       struct dcn32_resource_pool *pool =
-               kzalloc(sizeof(struct dcn32_resource_pool), GFP_KERNEL);
-
-       if (!pool)
-               return NULL;
-
-       if (dcn32_resource_construct(init_data->num_virtual_links, dc, pool))
-               return &pool->base;
-
-       BREAK_TO_DEBUGGER();
-       kfree(pool);
-       return NULL;
-}
-
-/*
- * Find the most optimal free pipe from res_ctx, which could be used as a
- * secondary dpp pipe for input opp head pipe.
- *
- * a free pipe - a pipe in input res_ctx not yet used for any streams or
- * planes.
- * secondary dpp pipe - a pipe gets inserted to a head OPP pipe's MPC blending
- * tree. This is typical used for rendering MPO planes or additional offset
- * areas in MPCC combine.
- *
- * Hardware Transition Minimization Algorithm for Finding a Secondary DPP Pipe
- * -------------------------------------------------------------------------
- *
- * PROBLEM:
- *
- * 1. There is a hardware limitation that a secondary DPP pipe cannot be
- * transferred from one MPC blending tree to the other in a single frame.
- * Otherwise it could cause glitches on the screen.
- *
- * For instance, we cannot transition from state 1 to state 2 in one frame. This
- * is because PIPE1 is transferred from PIPE0's MPC blending tree over to
- * PIPE2's MPC blending tree, which is not supported by hardware.
- * To support this transition we need to first remove PIPE1 from PIPE0's MPC
- * blending tree in one frame and then insert PIPE1 to PIPE2's MPC blending tree
- * in the next frame. This is not optimal as it will delay the flip for two
- * frames.
- *
- *     State 1:
- *     PIPE0 -- secondary DPP pipe --> (PIPE1)
- *     PIPE2 -- secondary DPP pipe --> NONE
- *
- *     State 2:
- *     PIPE0 -- secondary DPP pipe --> NONE
- *     PIPE2 -- secondary DPP pipe --> (PIPE1)
- *
- * 2. We want to in general minimize the unnecessary changes in pipe topology.
- * If a pipe is already added in current blending tree and there are no changes
- * to plane topology, we don't want to swap it with another free pipe
- * unnecessarily in every update. Powering up and down a pipe would require a
- * full update which delays the flip for 1 frame. If we use the original pipe
- * we don't have to toggle its power. So we can flip faster.
- */
-static int find_optimal_free_pipe_as_secondary_dpp_pipe(
-               const struct resource_context *cur_res_ctx,
-               struct resource_context *new_res_ctx,
-               const struct resource_pool *pool,
-               const struct pipe_ctx *new_opp_head)
-{
-       const struct pipe_ctx *cur_opp_head;
-       int free_pipe_idx;
-
-       cur_opp_head = &cur_res_ctx->pipe_ctx[new_opp_head->pipe_idx];
-       free_pipe_idx = resource_find_free_pipe_used_in_cur_mpc_blending_tree(
-                       cur_res_ctx, new_res_ctx, cur_opp_head);
-
-       /* Up until here if we have not found a free secondary pipe, we will
-        * need to wait for at least one frame to complete the transition
-        * sequence.
-        */
-       if (free_pipe_idx == FREE_PIPE_INDEX_NOT_FOUND)
-               free_pipe_idx = recource_find_free_pipe_not_used_in_cur_res_ctx(
-                               cur_res_ctx, new_res_ctx, pool);
-
-       /* Up until here if we have not found a free secondary pipe, we will
-        * need to wait for at least two frames to complete the transition
-        * sequence. It really doesn't matter which pipe we decide take from
-        * current enabled pipes. It won't save our frame time when we swap only
-        * one pipe or more pipes.
-        */
-       if (free_pipe_idx == FREE_PIPE_INDEX_NOT_FOUND)
-               free_pipe_idx = resource_find_free_pipe_used_as_cur_sec_dpp_in_mpcc_combine(
-                               cur_res_ctx, new_res_ctx, pool);
-
-       if (free_pipe_idx == FREE_PIPE_INDEX_NOT_FOUND)
-               free_pipe_idx = resource_find_any_free_pipe(new_res_ctx, pool);
-
-       return free_pipe_idx;
-}
-
-static struct pipe_ctx *find_idle_secondary_pipe_check_mpo(
-               struct resource_context *res_ctx,
-               const struct resource_pool *pool,
-               const struct pipe_ctx *primary_pipe)
-{
-       int i;
-       struct pipe_ctx *secondary_pipe = NULL;
-       struct pipe_ctx *next_odm_mpo_pipe = NULL;
-       int primary_index, preferred_pipe_idx;
-       struct pipe_ctx *old_primary_pipe = NULL;
-
-       /*
-        * Modified from find_idle_secondary_pipe
-        * With windowed MPO and ODM, we want to avoid the case where we want a
-        *  free pipe for the left side but the free pipe is being used on the
-        *  right side.
-        * Add check on current_state if the primary_pipe is the left side,
-        *  to check the right side ( primary_pipe->next_odm_pipe ) to see if
-        *  it is using a pipe for MPO ( primary_pipe->next_odm_pipe->bottom_pipe )
-        * - If so, then don't use this pipe
-        * EXCEPTION - 3 plane ( 2 MPO plane ) case
-        * - in this case, the primary pipe has already gotten a free pipe for the
-        *  MPO window in the left
-        * - when it tries to get a free pipe for the MPO window on the right,
-        *  it will see that it is already assigned to the right side
-        *  ( primary_pipe->next_odm_pipe ).  But in this case, we want this
-        *  free pipe, since it will be for the right side.  So add an
-        *  additional condition, that skipping the free pipe on the right only
-        *  applies if the primary pipe has no bottom pipe currently assigned
-        */
-       if (primary_pipe) {
-               primary_index = primary_pipe->pipe_idx;
-               old_primary_pipe = &primary_pipe->stream->ctx->dc->current_state->res_ctx.pipe_ctx[primary_index];
-               if ((old_primary_pipe->next_odm_pipe) && (old_primary_pipe->next_odm_pipe->bottom_pipe)
-                       && (!primary_pipe->bottom_pipe))
-                       next_odm_mpo_pipe = old_primary_pipe->next_odm_pipe->bottom_pipe;
-
-               preferred_pipe_idx = (pool->pipe_count - 1) - primary_pipe->pipe_idx;
-               if ((res_ctx->pipe_ctx[preferred_pipe_idx].stream == NULL) &&
-                       !(next_odm_mpo_pipe && next_odm_mpo_pipe->pipe_idx == preferred_pipe_idx)) {
-                       secondary_pipe = &res_ctx->pipe_ctx[preferred_pipe_idx];
-                       secondary_pipe->pipe_idx = preferred_pipe_idx;
-               }
-       }
-
-       /*
-        * search backwards for the second pipe to keep pipe
-        * assignment more consistent
-        */
-       if (!secondary_pipe)
-               for (i = pool->pipe_count - 1; i >= 0; i--) {
-                       if ((res_ctx->pipe_ctx[i].stream == NULL) &&
-                               !(next_odm_mpo_pipe && next_odm_mpo_pipe->pipe_idx == i)) {
-                               secondary_pipe = &res_ctx->pipe_ctx[i];
-                               secondary_pipe->pipe_idx = i;
-                               break;
-                       }
-               }
-
-       return secondary_pipe;
-}
-
-static struct pipe_ctx *dcn32_acquire_idle_pipe_for_head_pipe_in_layer(
-               struct dc_state *state,
-               const struct resource_pool *pool,
-               struct dc_stream_state *stream,
-               const struct pipe_ctx *head_pipe)
-{
-       struct resource_context *res_ctx = &state->res_ctx;
-       struct pipe_ctx *idle_pipe, *pipe;
-       struct resource_context *old_ctx = &stream->ctx->dc->current_state->res_ctx;
-       int head_index;
-
-       if (!head_pipe)
-               ASSERT(0);
-
-       /*
-        * Modified from dcn20_acquire_idle_pipe_for_layer
-        * Check if head_pipe in old_context already has bottom_pipe allocated.
-        * - If so, check if that pipe is available in the current context.
-        * --  If so, reuse pipe from old_context
-        */
-       head_index = head_pipe->pipe_idx;
-       pipe = &old_ctx->pipe_ctx[head_index];
-       if (pipe->bottom_pipe && res_ctx->pipe_ctx[pipe->bottom_pipe->pipe_idx].stream == NULL) {
-               idle_pipe = &res_ctx->pipe_ctx[pipe->bottom_pipe->pipe_idx];
-               idle_pipe->pipe_idx = pipe->bottom_pipe->pipe_idx;
-       } else {
-               idle_pipe = find_idle_secondary_pipe_check_mpo(res_ctx, pool, head_pipe);
-               if (!idle_pipe)
-                       return NULL;
-       }
-
-       idle_pipe->stream = head_pipe->stream;
-       idle_pipe->stream_res.tg = head_pipe->stream_res.tg;
-       idle_pipe->stream_res.opp = head_pipe->stream_res.opp;
-
-       idle_pipe->plane_res.hubp = pool->hubps[idle_pipe->pipe_idx];
-       idle_pipe->plane_res.ipp = pool->ipps[idle_pipe->pipe_idx];
-       idle_pipe->plane_res.dpp = pool->dpps[idle_pipe->pipe_idx];
-       idle_pipe->plane_res.mpcc_inst = pool->dpps[idle_pipe->pipe_idx]->inst;
-
-       return idle_pipe;
-}
-
-static int find_optimal_free_pipe_as_secondary_opp_head(
-               const struct resource_context *cur_res_ctx,
-               struct resource_context *new_res_ctx,
-               const struct resource_pool *pool,
-               const struct pipe_ctx *new_otg_master)
-{
-       const struct pipe_ctx *cur_otg_master;
-       int free_pipe_idx;
-
-       cur_otg_master =  &cur_res_ctx->pipe_ctx[new_otg_master->pipe_idx];
-       free_pipe_idx = resource_find_free_pipe_used_as_sec_opp_head_by_cur_otg_master(
-                       cur_res_ctx, new_res_ctx, cur_otg_master);
-
-       /* Up until here if we have not found a free secondary pipe, we will
-        * need to wait for at least one frame to complete the transition
-        * sequence.
-        */
-       if (free_pipe_idx == FREE_PIPE_INDEX_NOT_FOUND)
-               free_pipe_idx = recource_find_free_pipe_not_used_in_cur_res_ctx(
-                               cur_res_ctx, new_res_ctx, pool);
-
-       if (free_pipe_idx == FREE_PIPE_INDEX_NOT_FOUND)
-               free_pipe_idx = resource_find_any_free_pipe(new_res_ctx, pool);
-
-       return free_pipe_idx;
-}
-
-struct pipe_ctx *dcn32_acquire_free_pipe_as_secondary_dpp_pipe(
-               const struct dc_state *cur_ctx,
-               struct dc_state *new_ctx,
-               const struct resource_pool *pool,
-               const struct pipe_ctx *opp_head_pipe)
-{
-
-       int free_pipe_idx;
-       struct pipe_ctx *free_pipe;
-
-       if (!opp_head_pipe->stream->ctx->dc->config.enable_windowed_mpo_odm)
-               return dcn32_acquire_idle_pipe_for_head_pipe_in_layer(
-                               new_ctx, pool, opp_head_pipe->stream, opp_head_pipe);
-
-       free_pipe_idx = find_optimal_free_pipe_as_secondary_dpp_pipe(
-                                       &cur_ctx->res_ctx, &new_ctx->res_ctx,
-                                       pool, opp_head_pipe);
-       if (free_pipe_idx >= 0) {
-               free_pipe = &new_ctx->res_ctx.pipe_ctx[free_pipe_idx];
-               free_pipe->pipe_idx = free_pipe_idx;
-               free_pipe->stream = opp_head_pipe->stream;
-               free_pipe->stream_res.tg = opp_head_pipe->stream_res.tg;
-               free_pipe->stream_res.opp = opp_head_pipe->stream_res.opp;
-
-               free_pipe->plane_res.hubp = pool->hubps[free_pipe->pipe_idx];
-               free_pipe->plane_res.ipp = pool->ipps[free_pipe->pipe_idx];
-               free_pipe->plane_res.dpp = pool->dpps[free_pipe->pipe_idx];
-               free_pipe->plane_res.mpcc_inst =
-                               pool->dpps[free_pipe->pipe_idx]->inst;
-       } else {
-               ASSERT(opp_head_pipe);
-               free_pipe = NULL;
-       }
-
-       return free_pipe;
-}
-
-struct pipe_ctx *dcn32_acquire_free_pipe_as_secondary_opp_head(
-               const struct dc_state *cur_ctx,
-               struct dc_state *new_ctx,
-               const struct resource_pool *pool,
-               const struct pipe_ctx *otg_master)
-{
-       int free_pipe_idx = find_optimal_free_pipe_as_secondary_opp_head(
-                       &cur_ctx->res_ctx, &new_ctx->res_ctx,
-                       pool, otg_master);
-       struct pipe_ctx *free_pipe;
-
-       if (free_pipe_idx >= 0) {
-               free_pipe = &new_ctx->res_ctx.pipe_ctx[free_pipe_idx];
-               free_pipe->pipe_idx = free_pipe_idx;
-               free_pipe->stream = otg_master->stream;
-               free_pipe->stream_res.tg = otg_master->stream_res.tg;
-               free_pipe->stream_res.dsc = NULL;
-               free_pipe->stream_res.opp = pool->opps[free_pipe_idx];
-               free_pipe->plane_res.mi = pool->mis[free_pipe_idx];
-               free_pipe->plane_res.hubp = pool->hubps[free_pipe_idx];
-               free_pipe->plane_res.ipp = pool->ipps[free_pipe_idx];
-               free_pipe->plane_res.xfm = pool->transforms[free_pipe_idx];
-               free_pipe->plane_res.dpp = pool->dpps[free_pipe_idx];
-               free_pipe->plane_res.mpcc_inst = pool->dpps[free_pipe_idx]->inst;
-               if (free_pipe->stream->timing.flags.DSC == 1) {
-                       dcn20_acquire_dsc(free_pipe->stream->ctx->dc,
-                                       &new_ctx->res_ctx,
-                                       &free_pipe->stream_res.dsc,
-                                       free_pipe_idx);
-                       ASSERT(free_pipe->stream_res.dsc);
-                       if (free_pipe->stream_res.dsc == NULL) {
-                               memset(free_pipe, 0, sizeof(*free_pipe));
-                               free_pipe = NULL;
-                       }
-               }
-       } else {
-               ASSERT(otg_master);
-               free_pipe = NULL;
-       }
-
-       return free_pipe;
-}
-
-unsigned int dcn32_calc_num_avail_chans_for_mall(struct dc *dc, int num_chans)
-{
-       /*
-        * DCN32 and DCN321 SKUs may have different sizes for MALL
-        *  but we may not be able to access all the MALL space.
-        *  If the num_chans is power of 2, then we can access all
-        *  of the available MALL space.  Otherwise, we can only
-        *  access:
-        *
-        *  max_cab_size_in_bytes = total_cache_size_in_bytes *
-        *    ((2^floor(log2(num_chans)))/num_chans)
-        *
-        * Calculating the MALL sizes for all available SKUs, we
-        *  have come up with the follow simplified check.
-        * - we have max_chans which provides the max MALL size.
-        *  Each chans supports 4MB of MALL so:
-        *
-        *  total_cache_size_in_bytes = max_chans * 4 MB
-        *
-        * - we have avail_chans which shows the number of channels
-        *  we can use if we can't access the entire MALL space.
-        *  It is generally half of max_chans
-        * - so we use the following checks:
-        *
-        *   if (num_chans == max_chans), return max_chans
-        *   if (num_chans < max_chans), return avail_chans
-        *
-        * - exception is GC_11_0_0 where we can't access max_chans,
-        *  so we define max_avail_chans as the maximum available
-        *  MALL space
-        *
-        */
-       int gc_11_0_0_max_chans = 48;
-       int gc_11_0_0_max_avail_chans = 32;
-       int gc_11_0_0_avail_chans = 16;
-       int gc_11_0_3_max_chans = 16;
-       int gc_11_0_3_avail_chans = 8;
-       int gc_11_0_2_max_chans = 8;
-       int gc_11_0_2_avail_chans = 4;
-
-       if (ASICREV_IS_GC_11_0_0(dc->ctx->asic_id.hw_internal_rev)) {
-               return (num_chans == gc_11_0_0_max_chans) ?
-                       gc_11_0_0_max_avail_chans : gc_11_0_0_avail_chans;
-       } else if (ASICREV_IS_GC_11_0_2(dc->ctx->asic_id.hw_internal_rev)) {
-               return (num_chans == gc_11_0_2_max_chans) ?
-                       gc_11_0_2_max_chans : gc_11_0_2_avail_chans;
-       } else { // if (ASICREV_IS_GC_11_0_3(dc->ctx->asic_id.hw_internal_rev)) {
-               return (num_chans == gc_11_0_3_max_chans) ?
-                       gc_11_0_3_max_chans : gc_11_0_3_avail_chans;
-       }
-}
diff --git a/drivers/gpu/drm/amd/display/dc/dcn32/dcn32_resource.h b/drivers/gpu/drm/amd/display/dc/dcn32/dcn32_resource.h
deleted file mode 100644 (file)
index b931008..0000000
+++ /dev/null
@@ -1,1263 +0,0 @@
-/*
- * 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
- *
- */
-
-#ifndef _DCN32_RESOURCE_H_
-#define _DCN32_RESOURCE_H_
-
-#include "core_types.h"
-
-#define DCN3_2_DEFAULT_DET_SIZE 256
-#define DCN3_2_MAX_DET_SIZE 1152
-#define DCN3_2_MIN_DET_SIZE 128
-#define DCN3_2_MIN_COMPBUF_SIZE_KB 128
-#define DCN3_2_DET_SEG_SIZE 64
-#define DCN3_2_MALL_MBLK_SIZE_BYTES 65536 // 64 * 1024
-#define DCN3_2_MBLK_WIDTH 128
-#define DCN3_2_MBLK_HEIGHT_4BPE 128
-#define DCN3_2_MBLK_HEIGHT_8BPE 64
-#define DCN3_2_DCFCLK_DS_INIT_KHZ 10000 // Choose 10Mhz for init DCFCLK DS freq
-#define SUBVP_HIGH_REFRESH_LIST_LEN 4
-#define DCN3_2_MAX_SUBVP_PIXEL_RATE_MHZ 1800
-#define DCN3_2_VMIN_DISPCLK_HZ 717000000
-
-#define TO_DCN32_RES_POOL(pool)\
-       container_of(pool, struct dcn32_resource_pool, base)
-
-extern struct _vcs_dpi_ip_params_st dcn3_2_ip;
-extern struct _vcs_dpi_soc_bounding_box_st dcn3_2_soc;
-
-struct subvp_high_refresh_list {
-       int min_refresh;
-       int max_refresh;
-       struct resolution {
-               int width;
-               int height;
-       } res[SUBVP_HIGH_REFRESH_LIST_LEN];
-};
-
-struct dcn32_resource_pool {
-       struct resource_pool base;
-};
-
-struct resource_pool *dcn32_create_resource_pool(
-               const struct dc_init_data *init_data,
-               struct dc *dc);
-
-struct panel_cntl *dcn32_panel_cntl_create(
-               const struct panel_cntl_init_data *init_data);
-
-bool dcn32_acquire_post_bldn_3dlut(
-               struct resource_context *res_ctx,
-               const struct resource_pool *pool,
-               int mpcc_id,
-               struct dc_3dlut **lut,
-               struct dc_transfer_func **shaper);
-
-bool dcn32_release_post_bldn_3dlut(
-               struct resource_context *res_ctx,
-               const struct resource_pool *pool,
-               struct dc_3dlut **lut,
-               struct dc_transfer_func **shaper);
-
-bool dcn32_remove_phantom_pipes(struct dc *dc,
-               struct dc_state *context, bool fast_update);
-
-void dcn32_retain_phantom_pipes(struct dc *dc,
-               struct dc_state *context);
-
-void dcn32_add_phantom_pipes(struct dc *dc,
-               struct dc_state *context,
-               display_e2e_pipe_params_st *pipes,
-               unsigned int pipe_cnt,
-               unsigned int index);
-
-bool dcn32_validate_bandwidth(struct dc *dc,
-               struct dc_state *context,
-               bool fast_validate);
-
-int dcn32_populate_dml_pipes_from_context(
-       struct dc *dc, struct dc_state *context,
-       display_e2e_pipe_params_st *pipes,
-       bool fast_validate);
-
-void dcn32_calculate_wm_and_dlg(
-               struct dc *dc, struct dc_state *context,
-               display_e2e_pipe_params_st *pipes,
-               int pipe_cnt,
-               int vlevel);
-
-uint32_t dcn32_helper_mall_bytes_to_ways(
-               struct dc *dc,
-               uint32_t total_size_in_mall_bytes);
-
-uint32_t dcn32_helper_calculate_mall_bytes_for_cursor(
-               struct dc *dc,
-               struct pipe_ctx *pipe_ctx,
-               bool ignore_cursor_buf);
-
-uint32_t dcn32_helper_calculate_num_ways_for_subvp(
-               struct dc *dc,
-               struct dc_state *context);
-
-void dcn32_merge_pipes_for_subvp(struct dc *dc,
-               struct dc_state *context);
-
-bool dcn32_all_pipes_have_stream_and_plane(struct dc *dc,
-               struct dc_state *context);
-
-bool dcn32_subvp_in_use(struct dc *dc,
-               struct dc_state *context);
-
-bool dcn32_mpo_in_use(struct dc_state *context);
-
-bool dcn32_any_surfaces_rotated(struct dc *dc, struct dc_state *context);
-bool dcn32_is_center_timing(struct pipe_ctx *pipe);
-bool dcn32_is_psr_capable(struct pipe_ctx *pipe);
-
-struct pipe_ctx *dcn32_acquire_free_pipe_as_secondary_dpp_pipe(
-               const struct dc_state *cur_ctx,
-               struct dc_state *new_ctx,
-               const struct resource_pool *pool,
-               const struct pipe_ctx *opp_head_pipe);
-
-struct pipe_ctx *dcn32_acquire_free_pipe_as_secondary_opp_head(
-               const struct dc_state *cur_ctx,
-               struct dc_state *new_ctx,
-               const struct resource_pool *pool,
-               const struct pipe_ctx *otg_master);
-
-void dcn32_release_pipe(struct dc_state *context,
-                       struct pipe_ctx *pipe,
-                       const struct resource_pool *pool);
-
-void dcn32_determine_det_override(struct dc *dc,
-               struct dc_state *context,
-               display_e2e_pipe_params_st *pipes);
-
-void dcn32_set_det_allocations(struct dc *dc, struct dc_state *context,
-       display_e2e_pipe_params_st *pipes);
-
-void dcn32_save_mall_state(struct dc *dc,
-               struct dc_state *context,
-               struct mall_temp_config *temp_config);
-
-void dcn32_restore_mall_state(struct dc *dc,
-               struct dc_state *context,
-               struct mall_temp_config *temp_config);
-
-struct dc_stream_state *dcn32_can_support_mclk_switch_using_fw_based_vblank_stretch(struct dc *dc, const struct dc_state *context);
-
-bool dcn32_allow_subvp_with_active_margin(struct pipe_ctx *pipe);
-
-bool dcn32_allow_subvp_high_refresh_rate(struct dc *dc, struct dc_state *context, struct pipe_ctx *pipe);
-
-unsigned int dcn32_calc_num_avail_chans_for_mall(struct dc *dc, int num_chans);
-
-double dcn32_determine_max_vratio_prefetch(struct dc *dc, struct dc_state *context);
-
-bool dcn32_check_native_scaling_for_res(struct pipe_ctx *pipe, unsigned int width, unsigned int height);
-
-bool dcn32_subvp_drr_admissable(struct dc *dc, struct dc_state *context);
-
-bool dcn32_subvp_vblank_admissable(struct dc *dc, struct dc_state *context, int vlevel);
-
-/* definitions for run time init of reg offsets */
-
-/* CLK SRC */
-#define CS_COMMON_REG_LIST_DCN3_0_RI(index, pllid)                             \
-  SRI_ARR_ALPHABET(PIXCLK_RESYNC_CNTL, PHYPLL, index, pllid),                  \
-      SRII_ARR_2(PHASE, DP_DTO, 0, index),                                     \
-      SRII_ARR_2(PHASE, DP_DTO, 1, index),                                     \
-      SRII_ARR_2(PHASE, DP_DTO, 2, index),                                     \
-      SRII_ARR_2(PHASE, DP_DTO, 3, index),                                     \
-      SRII_ARR_2(MODULO, DP_DTO, 0, index),                                    \
-      SRII_ARR_2(MODULO, DP_DTO, 1, index),                                    \
-      SRII_ARR_2(MODULO, DP_DTO, 2, index),                                    \
-      SRII_ARR_2(MODULO, DP_DTO, 3, index),                                    \
-      SRII_ARR_2(PIXEL_RATE_CNTL, OTG, 0, index),                              \
-      SRII_ARR_2(PIXEL_RATE_CNTL, OTG, 1, index),                              \
-      SRII_ARR_2(PIXEL_RATE_CNTL, OTG, 2, index),                              \
-      SRII_ARR_2(PIXEL_RATE_CNTL, OTG, 3, index)
-
-/* ABM */
-#define ABM_DCN32_REG_LIST_RI(id)                                              \
-  SRI_ARR(DC_ABM1_HG_SAMPLE_RATE, ABM, id),                                    \
-      SRI_ARR(DC_ABM1_LS_SAMPLE_RATE, ABM, id),                                \
-      SRI_ARR(BL1_PWM_BL_UPDATE_SAMPLE_RATE, ABM, id),                         \
-      SRI_ARR(DC_ABM1_HG_MISC_CTRL, ABM, id),                                  \
-      SRI_ARR(DC_ABM1_IPCSC_COEFF_SEL, ABM, id),                               \
-      SRI_ARR(BL1_PWM_CURRENT_ABM_LEVEL, ABM, id),                             \
-      SRI_ARR(BL1_PWM_TARGET_ABM_LEVEL, ABM, id),                              \
-      SRI_ARR(BL1_PWM_USER_LEVEL, ABM, id),                                    \
-      SRI_ARR(DC_ABM1_LS_MIN_MAX_PIXEL_VALUE_THRES, ABM, id),                  \
-      SRI_ARR(DC_ABM1_HGLS_REG_READ_PROGRESS, ABM, id),                        \
-      SRI_ARR(DC_ABM1_ACE_OFFSET_SLOPE_0, ABM, id),                            \
-      SRI_ARR(DC_ABM1_ACE_THRES_12, ABM, id), NBIO_SR_ARR(BIOS_SCRATCH_2, id)
-
-/* Audio */
-#define AUD_COMMON_REG_LIST_RI(id)                                             \
-  SRI_ARR(AZALIA_F0_CODEC_ENDPOINT_INDEX, AZF0ENDPOINT, id),                   \
-      SRI_ARR(AZALIA_F0_CODEC_ENDPOINT_DATA, AZF0ENDPOINT, id),                \
-      SR_ARR(AZALIA_F0_CODEC_FUNCTION_PARAMETER_STREAM_FORMATS, id),           \
-      SR_ARR(AZALIA_F0_CODEC_FUNCTION_PARAMETER_SUPPORTED_SIZE_RATES, id),     \
-      SR_ARR(AZALIA_F0_CODEC_FUNCTION_PARAMETER_POWER_STATES, id),             \
-      SR_ARR(DCCG_AUDIO_DTO_SOURCE, id), SR_ARR(DCCG_AUDIO_DTO0_MODULE, id),   \
-      SR_ARR(DCCG_AUDIO_DTO0_PHASE, id), SR_ARR(DCCG_AUDIO_DTO1_MODULE, id),   \
-      SR_ARR(DCCG_AUDIO_DTO1_PHASE, id)                                        \
-
-/* VPG */
-
-#define VPG_DCN3_REG_LIST_RI(id)                                               \
-  SRI_ARR(VPG_GENERIC_STATUS, VPG, id),                                        \
-      SRI_ARR(VPG_GENERIC_PACKET_ACCESS_CTRL, VPG, id),                        \
-      SRI_ARR(VPG_GENERIC_PACKET_DATA, VPG, id),                               \
-      SRI_ARR(VPG_GSP_FRAME_UPDATE_CTRL, VPG, id),                             \
-      SRI_ARR(VPG_GSP_IMMEDIATE_UPDATE_CTRL, VPG, id)
-
-/* AFMT */
-#define AFMT_DCN3_REG_LIST_RI(id)                                              \
-  SRI_ARR(AFMT_INFOFRAME_CONTROL0, AFMT, id),                                  \
-      SRI_ARR(AFMT_VBI_PACKET_CONTROL, AFMT, id),                              \
-      SRI_ARR(AFMT_AUDIO_PACKET_CONTROL, AFMT, id),                            \
-      SRI_ARR(AFMT_AUDIO_PACKET_CONTROL2, AFMT, id),                           \
-      SRI_ARR(AFMT_AUDIO_SRC_CONTROL, AFMT, id),                               \
-      SRI_ARR(AFMT_60958_0, AFMT, id), SRI_ARR(AFMT_60958_1, AFMT, id),        \
-      SRI_ARR(AFMT_60958_2, AFMT, id), SRI_ARR(AFMT_MEM_PWR, AFMT, id)
-
-/* APG */
-#define APG_DCN31_REG_LIST_RI(id)                                              \
-  SRI_ARR(APG_CONTROL, APG, id), SRI_ARR(APG_CONTROL2, APG, id),               \
-      SRI_ARR(APG_MEM_PWR, APG, id), SRI_ARR(APG_DBG_GEN_CONTROL, APG, id)
-
-/* Stream encoder */
-#define SE_DCN32_REG_LIST_RI(id)                                               \
-  SRI_ARR(AFMT_CNTL, DIG, id), SRI_ARR(DIG_FE_CNTL, DIG, id),                  \
-      SRI_ARR(HDMI_CONTROL, DIG, id), SRI_ARR(HDMI_DB_CONTROL, DIG, id),       \
-      SRI_ARR(HDMI_GC, DIG, id),                                               \
-      SRI_ARR(HDMI_GENERIC_PACKET_CONTROL0, DIG, id),                          \
-      SRI_ARR(HDMI_GENERIC_PACKET_CONTROL1, DIG, id),                          \
-      SRI_ARR(HDMI_GENERIC_PACKET_CONTROL2, DIG, id),                          \
-      SRI_ARR(HDMI_GENERIC_PACKET_CONTROL3, DIG, id),                          \
-      SRI_ARR(HDMI_GENERIC_PACKET_CONTROL4, DIG, id),                          \
-      SRI_ARR(HDMI_GENERIC_PACKET_CONTROL5, DIG, id),                          \
-      SRI_ARR(HDMI_GENERIC_PACKET_CONTROL6, DIG, id),                          \
-      SRI_ARR(HDMI_GENERIC_PACKET_CONTROL7, DIG, id),                          \
-      SRI_ARR(HDMI_GENERIC_PACKET_CONTROL8, DIG, id),                          \
-      SRI_ARR(HDMI_GENERIC_PACKET_CONTROL9, DIG, id),                          \
-      SRI_ARR(HDMI_GENERIC_PACKET_CONTROL10, DIG, id),                         \
-      SRI_ARR(HDMI_INFOFRAME_CONTROL0, DIG, id),                               \
-      SRI_ARR(HDMI_INFOFRAME_CONTROL1, DIG, id),                               \
-      SRI_ARR(HDMI_VBI_PACKET_CONTROL, DIG, id),                               \
-      SRI_ARR(HDMI_AUDIO_PACKET_CONTROL, DIG, id),                             \
-      SRI_ARR(HDMI_ACR_PACKET_CONTROL, DIG, id),                               \
-      SRI_ARR(HDMI_ACR_32_0, DIG, id), SRI_ARR(HDMI_ACR_32_1, DIG, id),        \
-      SRI_ARR(HDMI_ACR_44_0, DIG, id), SRI_ARR(HDMI_ACR_44_1, DIG, id),        \
-      SRI_ARR(HDMI_ACR_48_0, DIG, id), SRI_ARR(HDMI_ACR_48_1, DIG, id),        \
-      SRI_ARR(DP_DB_CNTL, DP, id), SRI_ARR(DP_MSA_MISC, DP, id),               \
-      SRI_ARR(DP_MSA_VBID_MISC, DP, id), SRI_ARR(DP_MSA_COLORIMETRY, DP, id),  \
-      SRI_ARR(DP_MSA_TIMING_PARAM1, DP, id),                                   \
-      SRI_ARR(DP_MSA_TIMING_PARAM2, DP, id),                                   \
-      SRI_ARR(DP_MSA_TIMING_PARAM3, DP, id),                                   \
-      SRI_ARR(DP_MSA_TIMING_PARAM4, DP, id),                                   \
-      SRI_ARR(DP_MSE_RATE_CNTL, DP, id), SRI_ARR(DP_MSE_RATE_UPDATE, DP, id),  \
-      SRI_ARR(DP_PIXEL_FORMAT, DP, id), SRI_ARR(DP_SEC_CNTL, DP, id),          \
-      SRI_ARR(DP_SEC_CNTL1, DP, id), SRI_ARR(DP_SEC_CNTL2, DP, id),            \
-      SRI_ARR(DP_SEC_CNTL5, DP, id), SRI_ARR(DP_SEC_CNTL6, DP, id),            \
-      SRI_ARR(DP_STEER_FIFO, DP, id), SRI_ARR(DP_VID_M, DP, id),               \
-      SRI_ARR(DP_VID_N, DP, id), SRI_ARR(DP_VID_STREAM_CNTL, DP, id),          \
-      SRI_ARR(DP_VID_TIMING, DP, id), SRI_ARR(DP_SEC_AUD_N, DP, id),           \
-      SRI_ARR(DP_SEC_TIMESTAMP, DP, id), SRI_ARR(DP_DSC_CNTL, DP, id),         \
-      SRI_ARR(DP_SEC_METADATA_TRANSMISSION, DP, id),                           \
-      SRI_ARR(HDMI_METADATA_PACKET_CONTROL, DIG, id),                          \
-      SRI_ARR(DP_SEC_FRAMING4, DP, id), SRI_ARR(DP_GSP11_CNTL, DP, id),        \
-      SRI_ARR(DME_CONTROL, DME, id),                                           \
-      SRI_ARR(DP_SEC_METADATA_TRANSMISSION, DP, id),                           \
-      SRI_ARR(HDMI_METADATA_PACKET_CONTROL, DIG, id),                          \
-      SRI_ARR(DIG_FE_CNTL, DIG, id), SRI_ARR(DIG_CLOCK_PATTERN, DIG, id),      \
-      SRI_ARR(DIG_FIFO_CTRL0, DIG, id)
-
-/* Aux regs */
-
-#define AUX_REG_LIST_RI(id)                                                    \
-  SRI_ARR(AUX_CONTROL, DP_AUX, id), SRI_ARR(AUX_DPHY_RX_CONTROL0, DP_AUX, id), \
-      SRI_ARR(AUX_DPHY_RX_CONTROL1, DP_AUX, id)
-
-#define DCN2_AUX_REG_LIST_RI(id)                                               \
-  AUX_REG_LIST_RI(id), SRI_ARR(AUX_DPHY_TX_CONTROL, DP_AUX, id)
-
-/* HDP */
-#define HPD_REG_LIST_RI(id) SRI_ARR(DC_HPD_CONTROL, HPD, id)
-
-/* Link encoder */
-#define LE_DCN3_REG_LIST_RI(id)                                                \
-  SRI_ARR(DIG_BE_CNTL, DIG, id), SRI_ARR(DIG_BE_EN_CNTL, DIG, id),             \
-      SRI_ARR(TMDS_CTL_BITS, DIG, id),                                         \
-      SRI_ARR(TMDS_DCBALANCER_CONTROL, DIG, id), SRI_ARR(DP_CONFIG, DP, id),   \
-      SRI_ARR(DP_DPHY_CNTL, DP, id), SRI_ARR(DP_DPHY_PRBS_CNTL, DP, id),       \
-      SRI_ARR(DP_DPHY_SCRAM_CNTL, DP, id), SRI_ARR(DP_DPHY_SYM0, DP, id),      \
-      SRI_ARR(DP_DPHY_SYM1, DP, id), SRI_ARR(DP_DPHY_SYM2, DP, id),            \
-      SRI_ARR(DP_DPHY_TRAINING_PATTERN_SEL, DP, id),                           \
-      SRI_ARR(DP_LINK_CNTL, DP, id), SRI_ARR(DP_LINK_FRAMING_CNTL, DP, id),    \
-      SRI_ARR(DP_MSE_SAT0, DP, id), SRI_ARR(DP_MSE_SAT1, DP, id),              \
-      SRI_ARR(DP_MSE_SAT2, DP, id), SRI_ARR(DP_MSE_SAT_UPDATE, DP, id),        \
-      SRI_ARR(DP_SEC_CNTL, DP, id), SRI_ARR(DP_VID_STREAM_CNTL, DP, id),       \
-      SRI_ARR(DP_DPHY_FAST_TRAINING, DP, id), SRI_ARR(DP_SEC_CNTL1, DP, id),   \
-      SRI_ARR(DP_DPHY_BS_SR_SWAP_CNTL, DP, id),                                \
-      SRI_ARR(DP_DPHY_HBR2_PATTERN_CONTROL, DP, id)
-
-#define LE_DCN31_REG_LIST_RI(id)                                               \
-  LE_DCN3_REG_LIST_RI(id), SRI_ARR(DP_DPHY_INTERNAL_CTRL, DP, id),             \
-      SR_ARR(DIO_LINKA_CNTL, id), SR_ARR(DIO_LINKB_CNTL, id),                  \
-      SR_ARR(DIO_LINKC_CNTL, id), SR_ARR(DIO_LINKD_CNTL, id),                  \
-      SR_ARR(DIO_LINKE_CNTL, id), SR_ARR(DIO_LINKF_CNTL, id)
-
-#define UNIPHY_DCN2_REG_LIST_RI(id, phyid)                                     \
-  SRI_ARR_ALPHABET(CLOCK_ENABLE, SYMCLK, id, phyid),                           \
-      SRI_ARR_ALPHABET(CHANNEL_XBAR_CNTL, UNIPHY, id, phyid)
-
-/* HPO DP stream encoder */
-#define DCN3_1_HPO_DP_STREAM_ENC_REG_LIST_RI(id)                               \
-  SR_ARR(DP_STREAM_MAPPER_CONTROL0, id),                                       \
-      SR_ARR(DP_STREAM_MAPPER_CONTROL1, id),                                   \
-      SR_ARR(DP_STREAM_MAPPER_CONTROL2, id),                                   \
-      SR_ARR(DP_STREAM_MAPPER_CONTROL3, id),                                   \
-      SRI_ARR(DP_STREAM_ENC_CLOCK_CONTROL, DP_STREAM_ENC, id),                 \
-      SRI_ARR(DP_STREAM_ENC_INPUT_MUX_CONTROL, DP_STREAM_ENC, id),             \
-      SRI_ARR(DP_STREAM_ENC_AUDIO_CONTROL, DP_STREAM_ENC, id),                 \
-      SRI_ARR(DP_STREAM_ENC_CLOCK_RAMP_ADJUSTER_FIFO_STATUS_CONTROL0, DP_STREAM_ENC, id), \
-      SRI_ARR(DP_SYM32_ENC_CONTROL, DP_SYM32_ENC, id),                         \
-      SRI_ARR(DP_SYM32_ENC_VID_PIXEL_FORMAT, DP_SYM32_ENC, id),                \
-      SRI_ARR(DP_SYM32_ENC_VID_PIXEL_FORMAT_DOUBLE_BUFFER_CONTROL, DP_SYM32_ENC, id), \
-      SRI_ARR(DP_SYM32_ENC_VID_MSA0, DP_SYM32_ENC, id),                        \
-      SRI_ARR(DP_SYM32_ENC_VID_MSA1, DP_SYM32_ENC, id),                        \
-      SRI_ARR(DP_SYM32_ENC_VID_MSA2, DP_SYM32_ENC, id),                        \
-      SRI_ARR(DP_SYM32_ENC_VID_MSA3, DP_SYM32_ENC, id),                        \
-      SRI_ARR(DP_SYM32_ENC_VID_MSA4, DP_SYM32_ENC, id),                        \
-      SRI_ARR(DP_SYM32_ENC_VID_MSA5, DP_SYM32_ENC, id),                        \
-      SRI_ARR(DP_SYM32_ENC_VID_MSA6, DP_SYM32_ENC, id),                        \
-      SRI_ARR(DP_SYM32_ENC_VID_MSA7, DP_SYM32_ENC, id),                        \
-      SRI_ARR(DP_SYM32_ENC_VID_MSA8, DP_SYM32_ENC, id),                        \
-      SRI_ARR(DP_SYM32_ENC_VID_MSA_CONTROL, DP_SYM32_ENC, id),                 \
-      SRI_ARR(DP_SYM32_ENC_VID_MSA_DOUBLE_BUFFER_CONTROL, DP_SYM32_ENC, id),   \
-      SRI_ARR(DP_SYM32_ENC_VID_FIFO_CONTROL, DP_SYM32_ENC, id),                \
-      SRI_ARR(DP_SYM32_ENC_VID_STREAM_CONTROL, DP_SYM32_ENC, id),              \
-      SRI_ARR(DP_SYM32_ENC_VID_VBID_CONTROL, DP_SYM32_ENC, id),                \
-      SRI_ARR(DP_SYM32_ENC_SDP_CONTROL, DP_SYM32_ENC, id),                     \
-      SRI_ARR(DP_SYM32_ENC_SDP_GSP_CONTROL0, DP_SYM32_ENC, id),                \
-      SRI_ARR(DP_SYM32_ENC_SDP_GSP_CONTROL2, DP_SYM32_ENC, id),                \
-      SRI_ARR(DP_SYM32_ENC_SDP_GSP_CONTROL3, DP_SYM32_ENC, id),                \
-      SRI_ARR(DP_SYM32_ENC_SDP_GSP_CONTROL5, DP_SYM32_ENC, id),                \
-      SRI_ARR(DP_SYM32_ENC_SDP_GSP_CONTROL11, DP_SYM32_ENC, id),               \
-      SRI_ARR(DP_SYM32_ENC_SDP_METADATA_PACKET_CONTROL, DP_SYM32_ENC, id),     \
-      SRI_ARR(DP_SYM32_ENC_SDP_AUDIO_CONTROL0, DP_SYM32_ENC, id),              \
-      SRI_ARR(DP_SYM32_ENC_VID_CRC_CONTROL, DP_SYM32_ENC, id),                 \
-      SRI_ARR(DP_SYM32_ENC_HBLANK_CONTROL, DP_SYM32_ENC, id)
-
-/* HPO DP link encoder regs */
-#define DCN3_1_HPO_DP_LINK_ENC_REG_LIST_RI(id)                                 \
-  SRI_ARR(DP_LINK_ENC_CLOCK_CONTROL, DP_LINK_ENC, id),                         \
-      SRI_ARR(DP_DPHY_SYM32_CONTROL, DP_DPHY_SYM32, id),                       \
-      SRI_ARR(DP_DPHY_SYM32_STATUS, DP_DPHY_SYM32, id),                        \
-      SRI_ARR(DP_DPHY_SYM32_TP_CONFIG, DP_DPHY_SYM32, id),                     \
-      SRI_ARR(DP_DPHY_SYM32_TP_PRBS_SEED0, DP_DPHY_SYM32, id),                 \
-      SRI_ARR(DP_DPHY_SYM32_TP_PRBS_SEED1, DP_DPHY_SYM32, id),                 \
-      SRI_ARR(DP_DPHY_SYM32_TP_PRBS_SEED2, DP_DPHY_SYM32, id),                 \
-      SRI_ARR(DP_DPHY_SYM32_TP_PRBS_SEED3, DP_DPHY_SYM32, id),                 \
-      SRI_ARR(DP_DPHY_SYM32_TP_SQ_PULSE, DP_DPHY_SYM32, id),                   \
-      SRI_ARR(DP_DPHY_SYM32_TP_CUSTOM0, DP_DPHY_SYM32, id),                    \
-      SRI_ARR(DP_DPHY_SYM32_TP_CUSTOM1, DP_DPHY_SYM32, id),                    \
-      SRI_ARR(DP_DPHY_SYM32_TP_CUSTOM2, DP_DPHY_SYM32, id),                    \
-      SRI_ARR(DP_DPHY_SYM32_TP_CUSTOM3, DP_DPHY_SYM32, id),                    \
-      SRI_ARR(DP_DPHY_SYM32_TP_CUSTOM4, DP_DPHY_SYM32, id),                    \
-      SRI_ARR(DP_DPHY_SYM32_TP_CUSTOM5, DP_DPHY_SYM32, id),                    \
-      SRI_ARR(DP_DPHY_SYM32_TP_CUSTOM6, DP_DPHY_SYM32, id),                    \
-      SRI_ARR(DP_DPHY_SYM32_TP_CUSTOM7, DP_DPHY_SYM32, id),                    \
-      SRI_ARR(DP_DPHY_SYM32_TP_CUSTOM8, DP_DPHY_SYM32, id),                    \
-      SRI_ARR(DP_DPHY_SYM32_TP_CUSTOM9, DP_DPHY_SYM32, id),                    \
-      SRI_ARR(DP_DPHY_SYM32_TP_CUSTOM10, DP_DPHY_SYM32, id),                   \
-      SRI_ARR(DP_DPHY_SYM32_SAT_VC0, DP_DPHY_SYM32, id),                       \
-      SRI_ARR(DP_DPHY_SYM32_SAT_VC1, DP_DPHY_SYM32, id),                       \
-      SRI_ARR(DP_DPHY_SYM32_SAT_VC2, DP_DPHY_SYM32, id),                       \
-      SRI_ARR(DP_DPHY_SYM32_SAT_VC3, DP_DPHY_SYM32, id),                       \
-      SRI_ARR(DP_DPHY_SYM32_VC_RATE_CNTL0, DP_DPHY_SYM32, id),                 \
-      SRI_ARR(DP_DPHY_SYM32_VC_RATE_CNTL1, DP_DPHY_SYM32, id),                 \
-      SRI_ARR(DP_DPHY_SYM32_VC_RATE_CNTL2, DP_DPHY_SYM32, id),                 \
-      SRI_ARR(DP_DPHY_SYM32_VC_RATE_CNTL3, DP_DPHY_SYM32, id),                 \
-      SRI_ARR(DP_DPHY_SYM32_SAT_UPDATE, DP_DPHY_SYM32, id)
-
-/* DPP */
-#define DPP_REG_LIST_DCN30_COMMON_RI(id)                                       \
-  SRI_ARR(CM_DEALPHA, CM, id), SRI_ARR(CM_MEM_PWR_STATUS, CM, id),             \
-      SRI_ARR(CM_BIAS_CR_R, CM, id), SRI_ARR(CM_BIAS_Y_G_CB_B, CM, id),        \
-      SRI_ARR(PRE_DEGAM, CNVC_CFG, id), SRI_ARR(CM_GAMCOR_CONTROL, CM, id),    \
-      SRI_ARR(CM_GAMCOR_LUT_CONTROL, CM, id),                                  \
-      SRI_ARR(CM_GAMCOR_LUT_INDEX, CM, id),                                    \
-      SRI_ARR(CM_GAMCOR_LUT_INDEX, CM, id),                                    \
-      SRI_ARR(CM_GAMCOR_LUT_DATA, CM, id),                                     \
-      SRI_ARR(CM_GAMCOR_RAMB_START_CNTL_B, CM, id),                            \
-      SRI_ARR(CM_GAMCOR_RAMB_START_CNTL_G, CM, id),                            \
-      SRI_ARR(CM_GAMCOR_RAMB_START_CNTL_R, CM, id),                            \
-      SRI_ARR(CM_GAMCOR_RAMB_START_SLOPE_CNTL_B, CM, id),                      \
-      SRI_ARR(CM_GAMCOR_RAMB_START_SLOPE_CNTL_G, CM, id),                      \
-      SRI_ARR(CM_GAMCOR_RAMB_START_SLOPE_CNTL_R, CM, id),                      \
-      SRI_ARR(CM_GAMCOR_RAMB_END_CNTL1_B, CM, id),                             \
-      SRI_ARR(CM_GAMCOR_RAMB_END_CNTL2_B, CM, id),                             \
-      SRI_ARR(CM_GAMCOR_RAMB_END_CNTL1_G, CM, id),                             \
-      SRI_ARR(CM_GAMCOR_RAMB_END_CNTL2_G, CM, id),                             \
-      SRI_ARR(CM_GAMCOR_RAMB_END_CNTL1_R, CM, id),                             \
-      SRI_ARR(CM_GAMCOR_RAMB_END_CNTL2_R, CM, id),                             \
-      SRI_ARR(CM_GAMCOR_RAMB_REGION_0_1, CM, id),                              \
-      SRI_ARR(CM_GAMCOR_RAMB_REGION_32_33, CM, id),                            \
-      SRI_ARR(CM_GAMCOR_RAMB_OFFSET_B, CM, id),                                \
-      SRI_ARR(CM_GAMCOR_RAMB_OFFSET_G, CM, id),                                \
-      SRI_ARR(CM_GAMCOR_RAMB_OFFSET_R, CM, id),                                \
-      SRI_ARR(CM_GAMCOR_RAMB_START_BASE_CNTL_B, CM, id),                       \
-      SRI_ARR(CM_GAMCOR_RAMB_START_BASE_CNTL_G, CM, id),                       \
-      SRI_ARR(CM_GAMCOR_RAMB_START_BASE_CNTL_R, CM, id),                       \
-      SRI_ARR(CM_GAMCOR_RAMA_START_CNTL_B, CM, id),                            \
-      SRI_ARR(CM_GAMCOR_RAMA_START_CNTL_G, CM, id),                            \
-      SRI_ARR(CM_GAMCOR_RAMA_START_CNTL_R, CM, id),                            \
-      SRI_ARR(CM_GAMCOR_RAMA_START_SLOPE_CNTL_B, CM, id),                      \
-      SRI_ARR(CM_GAMCOR_RAMA_START_SLOPE_CNTL_G, CM, id),                      \
-      SRI_ARR(CM_GAMCOR_RAMA_START_SLOPE_CNTL_R, CM, id),                      \
-      SRI_ARR(CM_GAMCOR_RAMA_END_CNTL1_B, CM, id),                             \
-      SRI_ARR(CM_GAMCOR_RAMA_END_CNTL2_B, CM, id),                             \
-      SRI_ARR(CM_GAMCOR_RAMA_END_CNTL1_G, CM, id),                             \
-      SRI_ARR(CM_GAMCOR_RAMA_END_CNTL2_G, CM, id),                             \
-      SRI_ARR(CM_GAMCOR_RAMA_END_CNTL1_R, CM, id),                             \
-      SRI_ARR(CM_GAMCOR_RAMA_END_CNTL2_R, CM, id),                             \
-      SRI_ARR(CM_GAMCOR_RAMA_REGION_0_1, CM, id),                              \
-      SRI_ARR(CM_GAMCOR_RAMA_REGION_32_33, CM, id),                            \
-      SRI_ARR(CM_GAMCOR_RAMA_OFFSET_B, CM, id),                                \
-      SRI_ARR(CM_GAMCOR_RAMA_OFFSET_G, CM, id),                                \
-      SRI_ARR(CM_GAMCOR_RAMA_OFFSET_R, CM, id),                                \
-      SRI_ARR(CM_GAMCOR_RAMA_START_BASE_CNTL_B, CM, id),                       \
-      SRI_ARR(CM_GAMCOR_RAMA_START_BASE_CNTL_G, CM, id),                       \
-      SRI_ARR(CM_GAMCOR_RAMA_START_BASE_CNTL_R, CM, id),                       \
-      SRI_ARR(CM_GAMUT_REMAP_CONTROL, CM, id),                                 \
-      SRI_ARR(CM_GAMUT_REMAP_C11_C12, CM, id),                                 \
-      SRI_ARR(CM_GAMUT_REMAP_C13_C14, CM, id),                                 \
-      SRI_ARR(CM_GAMUT_REMAP_C21_C22, CM, id),                                 \
-      SRI_ARR(CM_GAMUT_REMAP_C23_C24, CM, id),                                 \
-      SRI_ARR(CM_GAMUT_REMAP_C31_C32, CM, id),                                 \
-      SRI_ARR(CM_GAMUT_REMAP_C33_C34, CM, id),                                 \
-      SRI_ARR(CM_GAMUT_REMAP_B_C11_C12, CM, id),                               \
-      SRI_ARR(CM_GAMUT_REMAP_B_C13_C14, CM, id),                               \
-      SRI_ARR(CM_GAMUT_REMAP_B_C21_C22, CM, id),                               \
-      SRI_ARR(CM_GAMUT_REMAP_B_C23_C24, CM, id),                               \
-      SRI_ARR(CM_GAMUT_REMAP_B_C31_C32, CM, id),                               \
-      SRI_ARR(CM_GAMUT_REMAP_B_C33_C34, CM, id),                               \
-      SRI_ARR(DSCL_EXT_OVERSCAN_LEFT_RIGHT, DSCL, id),                         \
-      SRI_ARR(DSCL_EXT_OVERSCAN_TOP_BOTTOM, DSCL, id),                         \
-      SRI_ARR(OTG_H_BLANK, DSCL, id), SRI_ARR(OTG_V_BLANK, DSCL, id),          \
-      SRI_ARR(SCL_MODE, DSCL, id), SRI_ARR(LB_DATA_FORMAT, DSCL, id),          \
-      SRI_ARR(LB_MEMORY_CTRL, DSCL, id), SRI_ARR(DSCL_AUTOCAL, DSCL, id),      \
-      SRI_ARR(DSCL_CONTROL, DSCL, id),                                         \
-      SRI_ARR(SCL_TAP_CONTROL, DSCL, id),                                      \
-      SRI_ARR(SCL_COEF_RAM_TAP_SELECT, DSCL, id),                              \
-      SRI_ARR(SCL_COEF_RAM_TAP_DATA, DSCL, id),                                \
-      SRI_ARR(DSCL_2TAP_CONTROL, DSCL, id), SRI_ARR(MPC_SIZE, DSCL, id),       \
-      SRI_ARR(SCL_HORZ_FILTER_SCALE_RATIO, DSCL, id),                          \
-      SRI_ARR(SCL_VERT_FILTER_SCALE_RATIO, DSCL, id),                          \
-      SRI_ARR(SCL_HORZ_FILTER_SCALE_RATIO_C, DSCL, id),                        \
-      SRI_ARR(SCL_VERT_FILTER_SCALE_RATIO_C, DSCL, id),                        \
-      SRI_ARR(SCL_HORZ_FILTER_INIT, DSCL, id),                                 \
-      SRI_ARR(SCL_HORZ_FILTER_INIT_C, DSCL, id),                               \
-      SRI_ARR(SCL_VERT_FILTER_INIT, DSCL, id),                                 \
-      SRI_ARR(SCL_VERT_FILTER_INIT_C, DSCL, id),                               \
-      SRI_ARR(RECOUT_START, DSCL, id), SRI_ARR(RECOUT_SIZE, DSCL, id),         \
-      SRI_ARR(PRE_DEALPHA, CNVC_CFG, id), SRI_ARR(PRE_REALPHA, CNVC_CFG, id),  \
-      SRI_ARR(PRE_CSC_MODE, CNVC_CFG, id),                                     \
-      SRI_ARR(PRE_CSC_C11_C12, CNVC_CFG, id),                                  \
-      SRI_ARR(PRE_CSC_C33_C34, CNVC_CFG, id),                                  \
-      SRI_ARR(PRE_CSC_B_C11_C12, CNVC_CFG, id),                                \
-      SRI_ARR(PRE_CSC_B_C33_C34, CNVC_CFG, id),                                \
-      SRI_ARR(CM_POST_CSC_CONTROL, CM, id),                                    \
-      SRI_ARR(CM_POST_CSC_C11_C12, CM, id),                                    \
-      SRI_ARR(CM_POST_CSC_C33_C34, CM, id),                                    \
-      SRI_ARR(CM_POST_CSC_B_C11_C12, CM, id),                                  \
-      SRI_ARR(CM_POST_CSC_B_C33_C34, CM, id),                                  \
-      SRI_ARR(CM_MEM_PWR_CTRL, CM, id), SRI_ARR(CM_CONTROL, CM, id),           \
-      SRI_ARR(FORMAT_CONTROL, CNVC_CFG, id),                                   \
-      SRI_ARR(CNVC_SURFACE_PIXEL_FORMAT, CNVC_CFG, id),                        \
-      SRI_ARR(CURSOR0_CONTROL, CNVC_CUR, id),                                  \
-      SRI_ARR(CURSOR0_COLOR0, CNVC_CUR, id),                                   \
-      SRI_ARR(CURSOR0_COLOR1, CNVC_CUR, id),                                   \
-      SRI_ARR(CURSOR0_FP_SCALE_BIAS, CNVC_CUR, id),                            \
-      SRI_ARR(DPP_CONTROL, DPP_TOP, id), SRI_ARR(CM_HDR_MULT_COEF, CM, id),    \
-      SRI_ARR(CURSOR_CONTROL, CURSOR0_, id),                                   \
-      SRI_ARR(ALPHA_2BIT_LUT, CNVC_CFG, id),                                   \
-      SRI_ARR(FCNV_FP_BIAS_R, CNVC_CFG, id),                                   \
-      SRI_ARR(FCNV_FP_BIAS_G, CNVC_CFG, id),                                   \
-      SRI_ARR(FCNV_FP_BIAS_B, CNVC_CFG, id),                                   \
-      SRI_ARR(FCNV_FP_SCALE_R, CNVC_CFG, id),                                  \
-      SRI_ARR(FCNV_FP_SCALE_G, CNVC_CFG, id),                                  \
-      SRI_ARR(FCNV_FP_SCALE_B, CNVC_CFG, id),                                  \
-      SRI_ARR(COLOR_KEYER_CONTROL, CNVC_CFG, id),                              \
-      SRI_ARR(COLOR_KEYER_ALPHA, CNVC_CFG, id),                                \
-      SRI_ARR(COLOR_KEYER_RED, CNVC_CFG, id),                                  \
-      SRI_ARR(COLOR_KEYER_GREEN, CNVC_CFG, id),                                \
-      SRI_ARR(COLOR_KEYER_BLUE, CNVC_CFG, id),                                 \
-      SRI_ARR(CURSOR_CONTROL, CURSOR0_, id),                                   \
-      SRI_ARR(OBUF_MEM_PWR_CTRL, DSCL, id),                                    \
-      SRI_ARR(DSCL_MEM_PWR_STATUS, DSCL, id),                                  \
-      SRI_ARR(DSCL_MEM_PWR_CTRL, DSCL, id)
-
-/* OPP */
-#define OPP_REG_LIST_DCN_RI(id)                                                \
-  SRI_ARR(FMT_BIT_DEPTH_CONTROL, FMT, id), SRI_ARR(FMT_CONTROL, FMT, id),      \
-      SRI_ARR(FMT_DITHER_RAND_R_SEED, FMT, id),                                \
-      SRI_ARR(FMT_DITHER_RAND_G_SEED, FMT, id),                                \
-      SRI_ARR(FMT_DITHER_RAND_B_SEED, FMT, id),                                \
-      SRI_ARR(FMT_CLAMP_CNTL, FMT, id),                                        \
-      SRI_ARR(FMT_DYNAMIC_EXP_CNTL, FMT, id),                                  \
-      SRI_ARR(FMT_MAP420_MEMORY_CONTROL, FMT, id),                             \
-      SRI_ARR(OPPBUF_CONTROL, OPPBUF, id),                                     \
-      SRI_ARR(OPPBUF_3D_PARAMETERS_0, OPPBUF, id),                             \
-      SRI_ARR(OPPBUF_3D_PARAMETERS_1, OPPBUF, id),                             \
-      SRI_ARR(OPP_PIPE_CONTROL, OPP_PIPE, id)                                  \
-
-#define OPP_REG_LIST_DCN10_RI(id) OPP_REG_LIST_DCN_RI(id)
-
-#define OPP_DPG_REG_LIST_RI(id)                                                \
-  SRI_ARR(DPG_CONTROL, DPG, id), SRI_ARR(DPG_DIMENSIONS, DPG, id),             \
-      SRI_ARR(DPG_OFFSET_SEGMENT, DPG, id), SRI_ARR(DPG_COLOUR_B_CB, DPG, id), \
-      SRI_ARR(DPG_COLOUR_G_Y, DPG, id), SRI_ARR(DPG_COLOUR_R_CR, DPG, id),     \
-      SRI_ARR(DPG_RAMP_CONTROL, DPG, id), SRI_ARR(DPG_STATUS, DPG, id)
-
-#define OPP_REG_LIST_DCN30_RI(id)                                              \
-  OPP_REG_LIST_DCN10_RI(id), OPP_DPG_REG_LIST_RI(id),                          \
-      SRI_ARR(FMT_422_CONTROL, FMT, id)
-
-/* Aux engine regs */
-#define AUX_COMMON_REG_LIST0_RI(id)                                            \
-  SRI_ARR(AUX_CONTROL, DP_AUX, id), SRI_ARR(AUX_ARB_CONTROL, DP_AUX, id),      \
-      SRI_ARR(AUX_SW_DATA, DP_AUX, id), SRI_ARR(AUX_SW_CONTROL, DP_AUX, id),   \
-      SRI_ARR(AUX_INTERRUPT_CONTROL, DP_AUX, id),                              \
-      SRI_ARR(AUX_DPHY_RX_CONTROL1, DP_AUX, id),                               \
-      SRI_ARR(AUX_SW_STATUS, DP_AUX, id)
-
-/* DWBC */
-#define DWBC_COMMON_REG_LIST_DCN30_RI(id)                                      \
-  SR_ARR(DWB_ENABLE_CLK_CTRL, id), SR_ARR(DWB_MEM_PWR_CTRL, id),               \
-      SR_ARR(FC_MODE_CTRL, id), SR_ARR(FC_FLOW_CTRL, id),                      \
-      SR_ARR(FC_WINDOW_START, id), SR_ARR(FC_WINDOW_SIZE, id),                 \
-      SR_ARR(FC_SOURCE_SIZE, id), SR_ARR(DWB_UPDATE_CTRL, id),                 \
-      SR_ARR(DWB_CRC_CTRL, id), SR_ARR(DWB_CRC_MASK_R_G, id),                  \
-      SR_ARR(DWB_CRC_MASK_B_A, id), SR_ARR(DWB_CRC_VAL_R_G, id),               \
-      SR_ARR(DWB_CRC_VAL_B_A, id), SR_ARR(DWB_OUT_CTRL, id),                   \
-      SR_ARR(DWB_MMHUBBUB_BACKPRESSURE_CNT_EN, id),                            \
-      SR_ARR(DWB_MMHUBBUB_BACKPRESSURE_CNT, id),                               \
-      SR_ARR(DWB_HOST_READ_CONTROL, id), SR_ARR(DWB_SOFT_RESET, id),           \
-      SR_ARR(DWB_HDR_MULT_COEF, id), SR_ARR(DWB_GAMUT_REMAP_MODE, id),         \
-      SR_ARR(DWB_GAMUT_REMAP_COEF_FORMAT, id),                                 \
-      SR_ARR(DWB_GAMUT_REMAPA_C11_C12, id),                                    \
-      SR_ARR(DWB_GAMUT_REMAPA_C13_C14, id),                                    \
-      SR_ARR(DWB_GAMUT_REMAPA_C21_C22, id),                                    \
-      SR_ARR(DWB_GAMUT_REMAPA_C23_C24, id),                                    \
-      SR_ARR(DWB_GAMUT_REMAPA_C31_C32, id),                                    \
-      SR_ARR(DWB_GAMUT_REMAPA_C33_C34, id),                                    \
-      SR_ARR(DWB_GAMUT_REMAPB_C11_C12, id),                                    \
-      SR_ARR(DWB_GAMUT_REMAPB_C13_C14, id),                                    \
-      SR_ARR(DWB_GAMUT_REMAPB_C21_C22, id),                                    \
-      SR_ARR(DWB_GAMUT_REMAPB_C23_C24, id),                                    \
-      SR_ARR(DWB_GAMUT_REMAPB_C31_C32, id),                                    \
-      SR_ARR(DWB_GAMUT_REMAPB_C33_C34, id), SR_ARR(DWB_OGAM_CONTROL, id),      \
-      SR_ARR(DWB_OGAM_LUT_INDEX, id), SR_ARR(DWB_OGAM_LUT_DATA, id),           \
-      SR_ARR(DWB_OGAM_LUT_CONTROL, id),                                        \
-      SR_ARR(DWB_OGAM_RAMA_START_CNTL_B, id),                                  \
-      SR_ARR(DWB_OGAM_RAMA_START_CNTL_G, id),                                  \
-      SR_ARR(DWB_OGAM_RAMA_START_CNTL_R, id),                                  \
-      SR_ARR(DWB_OGAM_RAMA_START_BASE_CNTL_B, id),                             \
-      SR_ARR(DWB_OGAM_RAMA_START_SLOPE_CNTL_B, id),                            \
-      SR_ARR(DWB_OGAM_RAMA_START_BASE_CNTL_G, id),                             \
-      SR_ARR(DWB_OGAM_RAMA_START_SLOPE_CNTL_G, id),                            \
-      SR_ARR(DWB_OGAM_RAMA_START_BASE_CNTL_R, id),                             \
-      SR_ARR(DWB_OGAM_RAMA_START_SLOPE_CNTL_R, id),                            \
-      SR_ARR(DWB_OGAM_RAMA_END_CNTL1_B, id),                                   \
-      SR_ARR(DWB_OGAM_RAMA_END_CNTL2_B, id),                                   \
-      SR_ARR(DWB_OGAM_RAMA_END_CNTL1_G, id),                                   \
-      SR_ARR(DWB_OGAM_RAMA_END_CNTL2_G, id),                                   \
-      SR_ARR(DWB_OGAM_RAMA_END_CNTL1_R, id),                                   \
-      SR_ARR(DWB_OGAM_RAMA_END_CNTL2_R, id),                                   \
-      SR_ARR(DWB_OGAM_RAMA_OFFSET_B, id), SR_ARR(DWB_OGAM_RAMA_OFFSET_G, id),  \
-      SR_ARR(DWB_OGAM_RAMA_OFFSET_R, id),                                      \
-      SR_ARR(DWB_OGAM_RAMA_REGION_0_1, id),                                    \
-      SR_ARR(DWB_OGAM_RAMA_REGION_2_3, id),                                    \
-      SR_ARR(DWB_OGAM_RAMA_REGION_4_5, id),                                    \
-      SR_ARR(DWB_OGAM_RAMA_REGION_6_7, id),                                    \
-      SR_ARR(DWB_OGAM_RAMA_REGION_8_9, id),                                    \
-      SR_ARR(DWB_OGAM_RAMA_REGION_10_11, id),                                  \
-      SR_ARR(DWB_OGAM_RAMA_REGION_12_13, id),                                  \
-      SR_ARR(DWB_OGAM_RAMA_REGION_14_15, id),                                  \
-      SR_ARR(DWB_OGAM_RAMA_REGION_16_17, id),                                  \
-      SR_ARR(DWB_OGAM_RAMA_REGION_18_19, id),                                  \
-      SR_ARR(DWB_OGAM_RAMA_REGION_20_21, id),                                  \
-      SR_ARR(DWB_OGAM_RAMA_REGION_22_23, id),                                  \
-      SR_ARR(DWB_OGAM_RAMA_REGION_24_25, id),                                  \
-      SR_ARR(DWB_OGAM_RAMA_REGION_26_27, id),                                  \
-      SR_ARR(DWB_OGAM_RAMA_REGION_28_29, id),                                  \
-      SR_ARR(DWB_OGAM_RAMA_REGION_30_31, id),                                  \
-      SR_ARR(DWB_OGAM_RAMA_REGION_32_33, id),                                  \
-      SR_ARR(DWB_OGAM_RAMB_START_CNTL_B, id),                                  \
-      SR_ARR(DWB_OGAM_RAMB_START_CNTL_G, id),                                  \
-      SR_ARR(DWB_OGAM_RAMB_START_CNTL_R, id),                                  \
-      SR_ARR(DWB_OGAM_RAMB_START_BASE_CNTL_B, id),                             \
-      SR_ARR(DWB_OGAM_RAMB_START_SLOPE_CNTL_B, id),                            \
-      SR_ARR(DWB_OGAM_RAMB_START_BASE_CNTL_G, id),                             \
-      SR_ARR(DWB_OGAM_RAMB_START_SLOPE_CNTL_G, id),                            \
-      SR_ARR(DWB_OGAM_RAMB_START_BASE_CNTL_R, id),                             \
-      SR_ARR(DWB_OGAM_RAMB_START_SLOPE_CNTL_R, id),                            \
-      SR_ARR(DWB_OGAM_RAMB_END_CNTL1_B, id),                                   \
-      SR_ARR(DWB_OGAM_RAMB_END_CNTL2_B, id),                                   \
-      SR_ARR(DWB_OGAM_RAMB_END_CNTL1_G, id),                                   \
-      SR_ARR(DWB_OGAM_RAMB_END_CNTL2_G, id),                                   \
-      SR_ARR(DWB_OGAM_RAMB_END_CNTL1_R, id),                                   \
-      SR_ARR(DWB_OGAM_RAMB_END_CNTL2_R, id),                                   \
-      SR_ARR(DWB_OGAM_RAMB_OFFSET_B, id), SR_ARR(DWB_OGAM_RAMB_OFFSET_G, id),  \
-      SR_ARR(DWB_OGAM_RAMB_OFFSET_R, id),                                      \
-      SR_ARR(DWB_OGAM_RAMB_REGION_0_1, id),                                    \
-      SR_ARR(DWB_OGAM_RAMB_REGION_2_3, id),                                    \
-      SR_ARR(DWB_OGAM_RAMB_REGION_4_5, id),                                    \
-      SR_ARR(DWB_OGAM_RAMB_REGION_6_7, id),                                    \
-      SR_ARR(DWB_OGAM_RAMB_REGION_8_9, id),                                    \
-      SR_ARR(DWB_OGAM_RAMB_REGION_10_11, id),                                  \
-      SR_ARR(DWB_OGAM_RAMB_REGION_12_13, id),                                  \
-      SR_ARR(DWB_OGAM_RAMB_REGION_14_15, id),                                  \
-      SR_ARR(DWB_OGAM_RAMB_REGION_16_17, id),                                  \
-      SR_ARR(DWB_OGAM_RAMB_REGION_18_19, id),                                  \
-      SR_ARR(DWB_OGAM_RAMB_REGION_20_21, id),                                  \
-      SR_ARR(DWB_OGAM_RAMB_REGION_22_23, id),                                  \
-      SR_ARR(DWB_OGAM_RAMB_REGION_24_25, id),                                  \
-      SR_ARR(DWB_OGAM_RAMB_REGION_26_27, id),                                  \
-      SR_ARR(DWB_OGAM_RAMB_REGION_28_29, id),                                  \
-      SR_ARR(DWB_OGAM_RAMB_REGION_30_31, id),                                  \
-      SR_ARR(DWB_OGAM_RAMB_REGION_32_33, id)
-
-/* MCIF */
-
-#define MCIF_WB_COMMON_REG_LIST_DCN32_RI(inst)                                 \
-  SRI2_ARR(MCIF_WB_BUFMGR_SW_CONTROL, MCIF_WB, inst),                          \
-      SRI2_ARR(MCIF_WB_BUFMGR_STATUS, MCIF_WB, inst),                          \
-      SRI2_ARR(MCIF_WB_BUF_PITCH, MCIF_WB, inst),                              \
-      SRI2_ARR(MCIF_WB_BUF_1_STATUS, MCIF_WB, inst),                           \
-      SRI2_ARR(MCIF_WB_BUF_1_STATUS2, MCIF_WB, inst),                          \
-      SRI2_ARR(MCIF_WB_BUF_2_STATUS, MCIF_WB, inst),                           \
-      SRI2_ARR(MCIF_WB_BUF_2_STATUS2, MCIF_WB, inst),                          \
-      SRI2_ARR(MCIF_WB_BUF_3_STATUS, MCIF_WB, inst),                           \
-      SRI2_ARR(MCIF_WB_BUF_3_STATUS2, MCIF_WB, inst),                          \
-      SRI2_ARR(MCIF_WB_BUF_4_STATUS, MCIF_WB, inst),                           \
-      SRI2_ARR(MCIF_WB_BUF_4_STATUS2, MCIF_WB, inst),                          \
-      SRI2_ARR(MCIF_WB_ARBITRATION_CONTROL, MCIF_WB, inst),                    \
-      SRI2_ARR(MCIF_WB_SCLK_CHANGE, MCIF_WB, inst),                            \
-      SRI2_ARR(MCIF_WB_BUF_1_ADDR_Y, MCIF_WB, inst),                           \
-      SRI2_ARR(MCIF_WB_BUF_1_ADDR_C, MCIF_WB, inst),                           \
-      SRI2_ARR(MCIF_WB_BUF_2_ADDR_Y, MCIF_WB, inst),                           \
-      SRI2_ARR(MCIF_WB_BUF_2_ADDR_C, MCIF_WB, inst),                           \
-      SRI2_ARR(MCIF_WB_BUF_3_ADDR_Y, MCIF_WB, inst),                           \
-      SRI2_ARR(MCIF_WB_BUF_3_ADDR_C, MCIF_WB, inst),                           \
-      SRI2_ARR(MCIF_WB_BUF_4_ADDR_Y, MCIF_WB, inst),                           \
-      SRI2_ARR(MCIF_WB_BUF_4_ADDR_C, MCIF_WB, inst),                           \
-      SRI2_ARR(MCIF_WB_BUFMGR_VCE_CONTROL, MCIF_WB, inst),                     \
-      SRI2_ARR(MCIF_WB_NB_PSTATE_LATENCY_WATERMARK, MMHUBBUB, inst),           \
-      SRI2_ARR(MCIF_WB_NB_PSTATE_CONTROL, MCIF_WB, inst),                      \
-      SRI2_ARR(MCIF_WB_WATERMARK, MMHUBBUB, inst),                             \
-      SRI2_ARR(MCIF_WB_CLOCK_GATER_CONTROL, MCIF_WB, inst),                    \
-      SRI2_ARR(MCIF_WB_SELF_REFRESH_CONTROL, MCIF_WB, inst),                   \
-      SRI2_ARR(MULTI_LEVEL_QOS_CTRL, MCIF_WB, inst),                           \
-      SRI2_ARR(MCIF_WB_SECURITY_LEVEL, MCIF_WB, inst),                         \
-      SRI2_ARR(MCIF_WB_BUF_LUMA_SIZE, MCIF_WB, inst),                          \
-      SRI2_ARR(MCIF_WB_BUF_CHROMA_SIZE, MCIF_WB, inst),                        \
-      SRI2_ARR(MCIF_WB_BUF_1_ADDR_Y_HIGH, MCIF_WB, inst),                      \
-      SRI2_ARR(MCIF_WB_BUF_1_ADDR_C_HIGH, MCIF_WB, inst),                      \
-      SRI2_ARR(MCIF_WB_BUF_2_ADDR_Y_HIGH, MCIF_WB, inst),                      \
-      SRI2_ARR(MCIF_WB_BUF_2_ADDR_C_HIGH, MCIF_WB, inst),                      \
-      SRI2_ARR(MCIF_WB_BUF_3_ADDR_Y_HIGH, MCIF_WB, inst),                      \
-      SRI2_ARR(MCIF_WB_BUF_3_ADDR_C_HIGH, MCIF_WB, inst),                      \
-      SRI2_ARR(MCIF_WB_BUF_4_ADDR_Y_HIGH, MCIF_WB, inst),                      \
-      SRI2_ARR(MCIF_WB_BUF_4_ADDR_C_HIGH, MCIF_WB, inst),                      \
-      SRI2_ARR(MCIF_WB_BUF_1_RESOLUTION, MCIF_WB, inst),                       \
-      SRI2_ARR(MCIF_WB_BUF_2_RESOLUTION, MCIF_WB, inst),                       \
-      SRI2_ARR(MCIF_WB_BUF_3_RESOLUTION, MCIF_WB, inst),                       \
-      SRI2_ARR(MCIF_WB_BUF_4_RESOLUTION, MCIF_WB, inst),                       \
-      SRI2_ARR(MMHUBBUB_MEM_PWR_CNTL, MMHUBBUB, inst),                         \
-      SRI2_ARR(MMHUBBUB_WARMUP_ADDR_REGION, MMHUBBUB, inst),                   \
-      SRI2_ARR(MMHUBBUB_WARMUP_BASE_ADDR_HIGH, MMHUBBUB, inst),                \
-      SRI2_ARR(MMHUBBUB_WARMUP_BASE_ADDR_LOW, MMHUBBUB, inst),                 \
-      SRI2_ARR(MMHUBBUB_WARMUP_CONTROL_STATUS, MMHUBBUB, inst)
-
-/* DSC */
-
-#define DSC_REG_LIST_DCN20_RI(id)                                              \
-  SRI_ARR(DSC_TOP_CONTROL, DSC_TOP, id),                                       \
-      SRI_ARR(DSC_DEBUG_CONTROL, DSC_TOP, id),                                 \
-      SRI_ARR(DSCC_CONFIG0, DSCC, id), SRI_ARR(DSCC_CONFIG1, DSCC, id),        \
-      SRI_ARR(DSCC_STATUS, DSCC, id),                                          \
-      SRI_ARR(DSCC_INTERRUPT_CONTROL_STATUS, DSCC, id),                        \
-      SRI_ARR(DSCC_PPS_CONFIG0, DSCC, id),                                     \
-      SRI_ARR(DSCC_PPS_CONFIG1, DSCC, id),                                     \
-      SRI_ARR(DSCC_PPS_CONFIG2, DSCC, id),                                     \
-      SRI_ARR(DSCC_PPS_CONFIG3, DSCC, id),                                     \
-      SRI_ARR(DSCC_PPS_CONFIG4, DSCC, id),                                     \
-      SRI_ARR(DSCC_PPS_CONFIG5, DSCC, id),                                     \
-      SRI_ARR(DSCC_PPS_CONFIG6, DSCC, id),                                     \
-      SRI_ARR(DSCC_PPS_CONFIG7, DSCC, id),                                     \
-      SRI_ARR(DSCC_PPS_CONFIG8, DSCC, id),                                     \
-      SRI_ARR(DSCC_PPS_CONFIG9, DSCC, id),                                     \
-      SRI_ARR(DSCC_PPS_CONFIG10, DSCC, id),                                    \
-      SRI_ARR(DSCC_PPS_CONFIG11, DSCC, id),                                    \
-      SRI_ARR(DSCC_PPS_CONFIG12, DSCC, id),                                    \
-      SRI_ARR(DSCC_PPS_CONFIG13, DSCC, id),                                    \
-      SRI_ARR(DSCC_PPS_CONFIG14, DSCC, id),                                    \
-      SRI_ARR(DSCC_PPS_CONFIG15, DSCC, id),                                    \
-      SRI_ARR(DSCC_PPS_CONFIG16, DSCC, id),                                    \
-      SRI_ARR(DSCC_PPS_CONFIG17, DSCC, id),                                    \
-      SRI_ARR(DSCC_PPS_CONFIG18, DSCC, id),                                    \
-      SRI_ARR(DSCC_PPS_CONFIG19, DSCC, id),                                    \
-      SRI_ARR(DSCC_PPS_CONFIG20, DSCC, id),                                    \
-      SRI_ARR(DSCC_PPS_CONFIG21, DSCC, id),                                    \
-      SRI_ARR(DSCC_PPS_CONFIG22, DSCC, id),                                    \
-      SRI_ARR(DSCC_MEM_POWER_CONTROL, DSCC, id),                               \
-      SRI_ARR(DSCC_R_Y_SQUARED_ERROR_LOWER, DSCC, id),                         \
-      SRI_ARR(DSCC_R_Y_SQUARED_ERROR_UPPER, DSCC, id),                         \
-      SRI_ARR(DSCC_G_CB_SQUARED_ERROR_LOWER, DSCC, id),                        \
-      SRI_ARR(DSCC_G_CB_SQUARED_ERROR_UPPER, DSCC, id),                        \
-      SRI_ARR(DSCC_B_CR_SQUARED_ERROR_LOWER, DSCC, id),                        \
-      SRI_ARR(DSCC_B_CR_SQUARED_ERROR_UPPER, DSCC, id),                        \
-      SRI_ARR(DSCC_MAX_ABS_ERROR0, DSCC, id),                                  \
-      SRI_ARR(DSCC_MAX_ABS_ERROR1, DSCC, id),                                  \
-      SRI_ARR(DSCC_RATE_BUFFER0_MAX_FULLNESS_LEVEL, DSCC, id),                 \
-      SRI_ARR(DSCC_RATE_BUFFER1_MAX_FULLNESS_LEVEL, DSCC, id),                 \
-      SRI_ARR(DSCC_RATE_BUFFER2_MAX_FULLNESS_LEVEL, DSCC, id),                 \
-      SRI_ARR(DSCC_RATE_BUFFER3_MAX_FULLNESS_LEVEL, DSCC, id),                 \
-      SRI_ARR(DSCC_RATE_CONTROL_BUFFER0_MAX_FULLNESS_LEVEL, DSCC, id),         \
-      SRI_ARR(DSCC_RATE_CONTROL_BUFFER1_MAX_FULLNESS_LEVEL, DSCC, id),         \
-      SRI_ARR(DSCC_RATE_CONTROL_BUFFER2_MAX_FULLNESS_LEVEL, DSCC, id),         \
-      SRI_ARR(DSCC_RATE_CONTROL_BUFFER3_MAX_FULLNESS_LEVEL, DSCC, id),         \
-      SRI_ARR(DSCCIF_CONFIG0, DSCCIF, id),                                     \
-      SRI_ARR(DSCCIF_CONFIG1, DSCCIF, id),                                     \
-      SRI_ARR(DSCRM_DSC_FORWARD_CONFIG, DSCRM, id)
-
-/* MPC */
-
-#define MPC_DWB_MUX_REG_LIST_DCN3_0_RI(inst)                                   \
-  SRII_DWB(DWB_MUX, MUX, MPC_DWB, inst)
-
-#define MPC_OUT_MUX_COMMON_REG_LIST_DCN1_0_RI(inst)                            \
-  SRII(MUX, MPC_OUT, inst), VUPDATE_SRII(CUR, VUPDATE_LOCK_SET, inst)
-
-#define MPC_OUT_MUX_REG_LIST_DCN3_0_RI(inst)                                   \
-  MPC_OUT_MUX_COMMON_REG_LIST_DCN1_0_RI(inst), SRII(CSC_MODE, MPC_OUT, inst),  \
-      SRII(CSC_C11_C12_A, MPC_OUT, inst), SRII(CSC_C33_C34_A, MPC_OUT, inst),  \
-      SRII(CSC_C11_C12_B, MPC_OUT, inst), SRII(CSC_C33_C34_B, MPC_OUT, inst),  \
-      SRII(DENORM_CONTROL, MPC_OUT, inst),                                     \
-      SRII(DENORM_CLAMP_G_Y, MPC_OUT, inst),                                   \
-      SRII(DENORM_CLAMP_B_CB, MPC_OUT, inst), SR(MPC_OUT_CSC_COEF_FORMAT)
-
-#define MPC_COMMON_REG_LIST_DCN1_0_RI(inst)                                    \
-  SRII(MPCC_TOP_SEL, MPCC, inst), SRII(MPCC_BOT_SEL, MPCC, inst),              \
-      SRII(MPCC_CONTROL, MPCC, inst), SRII(MPCC_STATUS, MPCC, inst),           \
-      SRII(MPCC_OPP_ID, MPCC, inst), SRII(MPCC_BG_G_Y, MPCC, inst),            \
-      SRII(MPCC_BG_R_CR, MPCC, inst), SRII(MPCC_BG_B_CB, MPCC, inst),          \
-      SRII(MPCC_SM_CONTROL, MPCC, inst),                                       \
-      SRII(MPCC_UPDATE_LOCK_SEL, MPCC, inst)
-
-#define MPC_REG_LIST_DCN3_0_RI(inst)                                           \
-  MPC_COMMON_REG_LIST_DCN1_0_RI(inst), SRII(MPCC_TOP_GAIN, MPCC, inst),        \
-      SRII(MPCC_BOT_GAIN_INSIDE, MPCC, inst),                                  \
-      SRII(MPCC_BOT_GAIN_OUTSIDE, MPCC, inst),                                 \
-      SRII(MPCC_MEM_PWR_CTRL, MPCC, inst),                                     \
-      SRII(MPCC_OGAM_LUT_INDEX, MPCC_OGAM, inst),                              \
-      SRII(MPCC_OGAM_LUT_DATA, MPCC_OGAM, inst),                               \
-      SRII(MPCC_GAMUT_REMAP_COEF_FORMAT, MPCC_OGAM, inst),                     \
-      SRII(MPCC_GAMUT_REMAP_MODE, MPCC_OGAM, inst),                            \
-      SRII(MPC_GAMUT_REMAP_C11_C12_A, MPCC_OGAM, inst),                        \
-      SRII(MPC_GAMUT_REMAP_C33_C34_A, MPCC_OGAM, inst),                        \
-      SRII(MPC_GAMUT_REMAP_C11_C12_B, MPCC_OGAM, inst),                        \
-      SRII(MPC_GAMUT_REMAP_C33_C34_B, MPCC_OGAM, inst),                        \
-      SRII(MPCC_OGAM_RAMA_START_CNTL_B, MPCC_OGAM, inst),                      \
-      SRII(MPCC_OGAM_RAMA_START_CNTL_G, MPCC_OGAM, inst),                      \
-      SRII(MPCC_OGAM_RAMA_START_CNTL_R, MPCC_OGAM, inst),                      \
-      SRII(MPCC_OGAM_RAMA_START_SLOPE_CNTL_B, MPCC_OGAM, inst),                \
-      SRII(MPCC_OGAM_RAMA_START_SLOPE_CNTL_G, MPCC_OGAM, inst),                \
-      SRII(MPCC_OGAM_RAMA_START_SLOPE_CNTL_R, MPCC_OGAM, inst),                \
-      SRII(MPCC_OGAM_RAMA_END_CNTL1_B, MPCC_OGAM, inst),                       \
-      SRII(MPCC_OGAM_RAMA_END_CNTL2_B, MPCC_OGAM, inst),                       \
-      SRII(MPCC_OGAM_RAMA_END_CNTL1_G, MPCC_OGAM, inst),                       \
-      SRII(MPCC_OGAM_RAMA_END_CNTL2_G, MPCC_OGAM, inst),                       \
-      SRII(MPCC_OGAM_RAMA_END_CNTL1_R, MPCC_OGAM, inst),                       \
-      SRII(MPCC_OGAM_RAMA_END_CNTL2_R, MPCC_OGAM, inst),                       \
-      SRII(MPCC_OGAM_RAMA_REGION_0_1, MPCC_OGAM, inst),                        \
-      SRII(MPCC_OGAM_RAMA_REGION_32_33, MPCC_OGAM, inst),                      \
-      SRII(MPCC_OGAM_RAMA_OFFSET_B, MPCC_OGAM, inst),                          \
-      SRII(MPCC_OGAM_RAMA_OFFSET_G, MPCC_OGAM, inst),                          \
-      SRII(MPCC_OGAM_RAMA_OFFSET_R, MPCC_OGAM, inst),                          \
-      SRII(MPCC_OGAM_RAMA_START_BASE_CNTL_B, MPCC_OGAM, inst),                 \
-      SRII(MPCC_OGAM_RAMA_START_BASE_CNTL_G, MPCC_OGAM, inst),                 \
-      SRII(MPCC_OGAM_RAMA_START_BASE_CNTL_R, MPCC_OGAM, inst),                 \
-      SRII(MPCC_OGAM_RAMB_START_CNTL_B, MPCC_OGAM, inst),                      \
-      SRII(MPCC_OGAM_RAMB_START_CNTL_G, MPCC_OGAM, inst),                      \
-      SRII(MPCC_OGAM_RAMB_START_CNTL_R, MPCC_OGAM, inst),                      \
-      SRII(MPCC_OGAM_RAMB_START_SLOPE_CNTL_B, MPCC_OGAM, inst),                \
-      SRII(MPCC_OGAM_RAMB_START_SLOPE_CNTL_G, MPCC_OGAM, inst),                \
-      SRII(MPCC_OGAM_RAMB_START_SLOPE_CNTL_R, MPCC_OGAM, inst),                \
-      SRII(MPCC_OGAM_RAMB_END_CNTL1_B, MPCC_OGAM, inst),                       \
-      SRII(MPCC_OGAM_RAMB_END_CNTL2_B, MPCC_OGAM, inst),                       \
-      SRII(MPCC_OGAM_RAMB_END_CNTL1_G, MPCC_OGAM, inst),                       \
-      SRII(MPCC_OGAM_RAMB_END_CNTL2_G, MPCC_OGAM, inst),                       \
-      SRII(MPCC_OGAM_RAMB_END_CNTL1_R, MPCC_OGAM, inst),                       \
-      SRII(MPCC_OGAM_RAMB_END_CNTL2_R, MPCC_OGAM, inst),                       \
-      SRII(MPCC_OGAM_RAMB_REGION_0_1, MPCC_OGAM, inst),                        \
-      SRII(MPCC_OGAM_RAMB_REGION_32_33, MPCC_OGAM, inst),                      \
-      SRII(MPCC_OGAM_RAMB_OFFSET_B, MPCC_OGAM, inst),                          \
-      SRII(MPCC_OGAM_RAMB_OFFSET_G, MPCC_OGAM, inst),                          \
-      SRII(MPCC_OGAM_RAMB_OFFSET_R, MPCC_OGAM, inst),                          \
-      SRII(MPCC_OGAM_RAMB_START_BASE_CNTL_B, MPCC_OGAM, inst),                 \
-      SRII(MPCC_OGAM_RAMB_START_BASE_CNTL_G, MPCC_OGAM, inst),                 \
-      SRII(MPCC_OGAM_RAMB_START_BASE_CNTL_R, MPCC_OGAM, inst),                 \
-      SRII(MPCC_OGAM_CONTROL, MPCC_OGAM, inst),                                \
-      SRII(MPCC_OGAM_LUT_CONTROL, MPCC_OGAM, inst)
-
-#define MPC_REG_LIST_DCN3_2_RI(inst) \
-       MPC_REG_LIST_DCN3_0_RI(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)
-/* OPTC */
-
-#define OPTC_COMMON_REG_LIST_DCN3_2_RI(inst)                                   \
-  SRI_ARR(OTG_VSTARTUP_PARAM, OTG, inst),                                      \
-      SRI_ARR(OTG_VUPDATE_PARAM, OTG, inst),                                   \
-      SRI_ARR(OTG_VREADY_PARAM, OTG, inst),                                    \
-      SRI_ARR(OTG_MASTER_UPDATE_LOCK, OTG, inst),                              \
-      SRI_ARR(OTG_GLOBAL_CONTROL0, OTG, inst),                                 \
-      SRI_ARR(OTG_GLOBAL_CONTROL1, OTG, inst),                                 \
-      SRI_ARR(OTG_GLOBAL_CONTROL2, OTG, inst),                                 \
-      SRI_ARR(OTG_GLOBAL_CONTROL4, OTG, inst),                                 \
-      SRI_ARR(OTG_DOUBLE_BUFFER_CONTROL, OTG, inst),                           \
-      SRI_ARR(OTG_H_TOTAL, OTG, inst),                                         \
-      SRI_ARR(OTG_H_BLANK_START_END, OTG, inst),                               \
-      SRI_ARR(OTG_H_SYNC_A, OTG, inst), SRI_ARR(OTG_H_SYNC_A_CNTL, OTG, inst), \
-      SRI_ARR(OTG_H_TIMING_CNTL, OTG, inst), SRI_ARR(OTG_V_TOTAL, OTG, inst),  \
-      SRI_ARR(OTG_V_BLANK_START_END, OTG, inst),                               \
-      SRI_ARR(OTG_V_SYNC_A, OTG, inst), SRI_ARR(OTG_V_SYNC_A_CNTL, OTG, inst), \
-      SRI_ARR(OTG_CONTROL, OTG, inst), SRI_ARR(OTG_STEREO_CONTROL, OTG, inst), \
-      SRI_ARR(OTG_3D_STRUCTURE_CONTROL, OTG, inst),                            \
-      SRI_ARR(OTG_STEREO_STATUS, OTG, inst),                                   \
-      SRI_ARR(OTG_V_TOTAL_MAX, OTG, inst),                                     \
-      SRI_ARR(OTG_V_TOTAL_MIN, OTG, inst),                                     \
-      SRI_ARR(OTG_V_TOTAL_CONTROL, OTG, inst),                                 \
-      SRI_ARR(OTG_TRIGA_CNTL, OTG, inst),                                      \
-      SRI_ARR(OTG_FORCE_COUNT_NOW_CNTL, OTG, inst),                            \
-      SRI_ARR(OTG_STATIC_SCREEN_CONTROL, OTG, inst),                           \
-      SRI_ARR(OTG_STATUS_FRAME_COUNT, OTG, inst),                              \
-      SRI_ARR(OTG_STATUS, OTG, inst), SRI_ARR(OTG_STATUS_POSITION, OTG, inst), \
-      SRI_ARR(OTG_NOM_VERT_POSITION, OTG, inst),                               \
-      SRI_ARR(OTG_M_CONST_DTO0, OTG, inst),                                    \
-      SRI_ARR(OTG_M_CONST_DTO1, OTG, inst),                                    \
-      SRI_ARR(OTG_CLOCK_CONTROL, OTG, inst),                                   \
-      SRI_ARR(OTG_VERTICAL_INTERRUPT0_CONTROL, OTG, inst),                     \
-      SRI_ARR(OTG_VERTICAL_INTERRUPT0_POSITION, OTG, inst),                    \
-      SRI_ARR(OTG_VERTICAL_INTERRUPT1_CONTROL, OTG, inst),                     \
-      SRI_ARR(OTG_VERTICAL_INTERRUPT1_POSITION, OTG, inst),                    \
-      SRI_ARR(OTG_VERTICAL_INTERRUPT2_CONTROL, OTG, inst),                     \
-      SRI_ARR(OTG_VERTICAL_INTERRUPT2_POSITION, OTG, inst),                    \
-      SRI_ARR(OPTC_INPUT_CLOCK_CONTROL, ODM, inst),                            \
-      SRI_ARR(OPTC_DATA_SOURCE_SELECT, ODM, inst),                             \
-      SRI_ARR(OPTC_INPUT_GLOBAL_CONTROL, ODM, inst),                           \
-      SRI_ARR(CONTROL, VTG, inst), SRI_ARR(OTG_VERT_SYNC_CONTROL, OTG, inst),  \
-      SRI_ARR(OTG_GSL_CONTROL, OTG, inst), SRI_ARR(OTG_CRC_CNTL, OTG, inst),   \
-      SRI_ARR(OTG_CRC0_DATA_RG, OTG, inst),                                    \
-      SRI_ARR(OTG_CRC0_DATA_B, OTG, inst),                                     \
-      SRI_ARR(OTG_CRC0_WINDOWA_X_CONTROL, OTG, inst),                          \
-      SRI_ARR(OTG_CRC0_WINDOWA_Y_CONTROL, OTG, inst),                          \
-      SRI_ARR(OTG_CRC0_WINDOWB_X_CONTROL, OTG, inst),                          \
-      SRI_ARR(OTG_CRC0_WINDOWB_Y_CONTROL, OTG, inst),                          \
-      SR_ARR(GSL_SOURCE_SELECT, inst),                                         \
-      SRI_ARR(OTG_TRIGA_MANUAL_TRIG, OTG, inst),                               \
-      SRI_ARR(OTG_GLOBAL_CONTROL1, OTG, inst),                                 \
-      SRI_ARR(OTG_GLOBAL_CONTROL2, OTG, inst),                                 \
-      SRI_ARR(OTG_GSL_WINDOW_X, OTG, inst),                                    \
-      SRI_ARR(OTG_GSL_WINDOW_Y, OTG, inst),                                    \
-      SRI_ARR(OTG_VUPDATE_KEEPOUT, OTG, inst),                                 \
-      SRI_ARR(OTG_DSC_START_POSITION, OTG, inst),                              \
-      SRI_ARR(OTG_DRR_TRIGGER_WINDOW, OTG, inst),                              \
-      SRI_ARR(OTG_DRR_V_TOTAL_CHANGE, OTG, inst),                              \
-      SRI_ARR(OPTC_DATA_FORMAT_CONTROL, ODM, inst),                            \
-      SRI_ARR(OPTC_BYTES_PER_PIXEL, ODM, inst),                                \
-      SRI_ARR(OPTC_WIDTH_CONTROL, ODM, inst),                                  \
-      SRI_ARR(OPTC_MEMORY_CONFIG, ODM, inst),                                  \
-      SRI_ARR(OTG_DRR_CONTROL, OTG, inst)
-
-/* HUBP */
-
-#define HUBP_REG_LIST_DCN_VM_RI(id)                                            \
-  SRI_ARR(NOM_PARAMETERS_0, HUBPREQ, id),                                      \
-      SRI_ARR(NOM_PARAMETERS_1, HUBPREQ, id),                                  \
-      SRI_ARR(NOM_PARAMETERS_2, HUBPREQ, id),                                  \
-      SRI_ARR(NOM_PARAMETERS_3, HUBPREQ, id),                                  \
-      SRI_ARR(DCN_VM_MX_L1_TLB_CNTL, HUBPREQ, id)
-#define HUBP_REG_LIST_DCN_RI(id)                                               \
-  SRI_ARR(DCHUBP_CNTL, HUBP, id), SRI_ARR(HUBPREQ_DEBUG_DB, HUBP, id),         \
-      SRI_ARR(HUBPREQ_DEBUG, HUBP, id), SRI_ARR(DCSURF_ADDR_CONFIG, HUBP, id), \
-      SRI_ARR(DCSURF_TILING_CONFIG, HUBP, id),                                 \
-      SRI_ARR(DCSURF_SURFACE_PITCH, HUBPREQ, id),                              \
-      SRI_ARR(DCSURF_SURFACE_PITCH_C, HUBPREQ, id),                            \
-      SRI_ARR(DCSURF_SURFACE_CONFIG, HUBP, id),                                \
-      SRI_ARR(DCSURF_FLIP_CONTROL, HUBPREQ, id),                               \
-      SRI_ARR(DCSURF_PRI_VIEWPORT_DIMENSION, HUBP, id),                        \
-      SRI_ARR(DCSURF_PRI_VIEWPORT_START, HUBP, id),                            \
-      SRI_ARR(DCSURF_SEC_VIEWPORT_DIMENSION, HUBP, id),                        \
-      SRI_ARR(DCSURF_SEC_VIEWPORT_START, HUBP, id),                            \
-      SRI_ARR(DCSURF_PRI_VIEWPORT_DIMENSION_C, HUBP, id),                      \
-      SRI_ARR(DCSURF_PRI_VIEWPORT_START_C, HUBP, id),                          \
-      SRI_ARR(DCSURF_SEC_VIEWPORT_DIMENSION_C, HUBP, id),                      \
-      SRI_ARR(DCSURF_SEC_VIEWPORT_START_C, HUBP, id),                          \
-      SRI_ARR(DCSURF_PRIMARY_SURFACE_ADDRESS_HIGH, HUBPREQ, id),               \
-      SRI_ARR(DCSURF_PRIMARY_SURFACE_ADDRESS, HUBPREQ, id),                    \
-      SRI_ARR(DCSURF_SECONDARY_SURFACE_ADDRESS_HIGH, HUBPREQ, id),             \
-      SRI_ARR(DCSURF_SECONDARY_SURFACE_ADDRESS, HUBPREQ, id),                  \
-      SRI_ARR(DCSURF_PRIMARY_META_SURFACE_ADDRESS_HIGH, HUBPREQ, id),          \
-      SRI_ARR(DCSURF_PRIMARY_META_SURFACE_ADDRESS, HUBPREQ, id),               \
-      SRI_ARR(DCSURF_SECONDARY_META_SURFACE_ADDRESS_HIGH, HUBPREQ, id),        \
-      SRI_ARR(DCSURF_SECONDARY_META_SURFACE_ADDRESS, HUBPREQ, id),             \
-      SRI_ARR(DCSURF_PRIMARY_SURFACE_ADDRESS_HIGH_C, HUBPREQ, id),             \
-      SRI_ARR(DCSURF_PRIMARY_SURFACE_ADDRESS_C, HUBPREQ, id),                  \
-      SRI_ARR(DCSURF_SECONDARY_SURFACE_ADDRESS_HIGH_C, HUBPREQ, id),           \
-      SRI_ARR(DCSURF_SECONDARY_SURFACE_ADDRESS_C, HUBPREQ, id),                \
-      SRI_ARR(DCSURF_PRIMARY_META_SURFACE_ADDRESS_HIGH_C, HUBPREQ, id),        \
-      SRI_ARR(DCSURF_PRIMARY_META_SURFACE_ADDRESS_C, HUBPREQ, id),             \
-      SRI_ARR(DCSURF_SECONDARY_META_SURFACE_ADDRESS_HIGH_C, HUBPREQ, id),      \
-      SRI_ARR(DCSURF_SECONDARY_META_SURFACE_ADDRESS_C, HUBPREQ, id),           \
-      SRI_ARR(DCSURF_SURFACE_INUSE, HUBPREQ, id),                              \
-      SRI_ARR(DCSURF_SURFACE_INUSE_HIGH, HUBPREQ, id),                         \
-      SRI_ARR(DCSURF_SURFACE_INUSE_C, HUBPREQ, id),                            \
-      SRI_ARR(DCSURF_SURFACE_INUSE_HIGH_C, HUBPREQ, id),                       \
-      SRI_ARR(DCSURF_SURFACE_EARLIEST_INUSE, HUBPREQ, id),                     \
-      SRI_ARR(DCSURF_SURFACE_EARLIEST_INUSE_HIGH, HUBPREQ, id),                \
-      SRI_ARR(DCSURF_SURFACE_EARLIEST_INUSE_C, HUBPREQ, id),                   \
-      SRI_ARR(DCSURF_SURFACE_EARLIEST_INUSE_HIGH_C, HUBPREQ, id),              \
-      SRI_ARR(DCSURF_SURFACE_CONTROL, HUBPREQ, id),                            \
-      SRI_ARR(DCSURF_SURFACE_FLIP_INTERRUPT, HUBPREQ, id),                     \
-      SRI_ARR(HUBPRET_CONTROL, HUBPRET, id),                                   \
-      SRI_ARR(HUBPRET_READ_LINE_STATUS, HUBPRET, id),                          \
-      SRI_ARR(DCN_EXPANSION_MODE, HUBPREQ, id),                                \
-      SRI_ARR(DCHUBP_REQ_SIZE_CONFIG, HUBP, id),                               \
-      SRI_ARR(DCHUBP_REQ_SIZE_CONFIG_C, HUBP, id),                             \
-      SRI_ARR(BLANK_OFFSET_0, HUBPREQ, id),                                    \
-      SRI_ARR(BLANK_OFFSET_1, HUBPREQ, id),                                    \
-      SRI_ARR(DST_DIMENSIONS, HUBPREQ, id),                                    \
-      SRI_ARR(DST_AFTER_SCALER, HUBPREQ, id),                                  \
-      SRI_ARR(VBLANK_PARAMETERS_0, HUBPREQ, id),                               \
-      SRI_ARR(REF_FREQ_TO_PIX_FREQ, HUBPREQ, id),                              \
-      SRI_ARR(VBLANK_PARAMETERS_1, HUBPREQ, id),                               \
-      SRI_ARR(VBLANK_PARAMETERS_3, HUBPREQ, id),                               \
-      SRI_ARR(NOM_PARAMETERS_4, HUBPREQ, id),                                  \
-      SRI_ARR(NOM_PARAMETERS_5, HUBPREQ, id),                                  \
-      SRI_ARR(PER_LINE_DELIVERY_PRE, HUBPREQ, id),                             \
-      SRI_ARR(PER_LINE_DELIVERY, HUBPREQ, id),                                 \
-      SRI_ARR(VBLANK_PARAMETERS_2, HUBPREQ, id),                               \
-      SRI_ARR(VBLANK_PARAMETERS_4, HUBPREQ, id),                               \
-      SRI_ARR(NOM_PARAMETERS_6, HUBPREQ, id),                                  \
-      SRI_ARR(NOM_PARAMETERS_7, HUBPREQ, id),                                  \
-      SRI_ARR(DCN_TTU_QOS_WM, HUBPREQ, id),                                    \
-      SRI_ARR(DCN_GLOBAL_TTU_CNTL, HUBPREQ, id),                               \
-      SRI_ARR(DCN_SURF0_TTU_CNTL0, HUBPREQ, id),                               \
-      SRI_ARR(DCN_SURF0_TTU_CNTL1, HUBPREQ, id),                               \
-      SRI_ARR(DCN_SURF1_TTU_CNTL0, HUBPREQ, id),                               \
-      SRI_ARR(DCN_SURF1_TTU_CNTL1, HUBPREQ, id),                               \
-      SRI_ARR(DCN_CUR0_TTU_CNTL0, HUBPREQ, id),                                \
-      SRI_ARR(DCN_CUR0_TTU_CNTL1, HUBPREQ, id),                                \
-      SRI_ARR(HUBP_CLK_CNTL, HUBP, id)
-#define HUBP_REG_LIST_DCN2_COMMON_RI(id)                                       \
-  HUBP_REG_LIST_DCN_RI(id), HUBP_REG_LIST_DCN_VM_RI(id),                       \
-      SRI_ARR(PREFETCH_SETTINGS, HUBPREQ, id),                                 \
-      SRI_ARR(PREFETCH_SETTINGS_C, HUBPREQ, id),                               \
-      SRI_ARR(DCN_VM_SYSTEM_APERTURE_LOW_ADDR, HUBPREQ, id),                   \
-      SRI_ARR(DCN_VM_SYSTEM_APERTURE_HIGH_ADDR, HUBPREQ, id),                  \
-      SRI_ARR(CURSOR_SETTINGS, HUBPREQ, id),                                   \
-      SRI_ARR(CURSOR_SURFACE_ADDRESS_HIGH, CURSOR0_, id),                      \
-      SRI_ARR(CURSOR_SURFACE_ADDRESS, CURSOR0_, id),                           \
-      SRI_ARR(CURSOR_SIZE, CURSOR0_, id),                                      \
-      SRI_ARR(CURSOR_CONTROL, CURSOR0_, id),                                   \
-      SRI_ARR(CURSOR_POSITION, CURSOR0_, id),                                  \
-      SRI_ARR(CURSOR_HOT_SPOT, CURSOR0_, id),                                  \
-      SRI_ARR(CURSOR_DST_OFFSET, CURSOR0_, id),                                \
-      SRI_ARR(DMDATA_ADDRESS_HIGH, CURSOR0_, id),                              \
-      SRI_ARR(DMDATA_ADDRESS_LOW, CURSOR0_, id),                               \
-      SRI_ARR(DMDATA_CNTL, CURSOR0_, id),                                      \
-      SRI_ARR(DMDATA_SW_CNTL, CURSOR0_, id),                                   \
-      SRI_ARR(DMDATA_QOS_CNTL, CURSOR0_, id),                                  \
-      SRI_ARR(DMDATA_SW_DATA, CURSOR0_, id),                                   \
-      SRI_ARR(DMDATA_STATUS, CURSOR0_, id),                                    \
-      SRI_ARR(FLIP_PARAMETERS_0, HUBPREQ, id),                                 \
-      SRI_ARR(FLIP_PARAMETERS_1, HUBPREQ, id),                                 \
-      SRI_ARR(FLIP_PARAMETERS_2, HUBPREQ, id),                                 \
-      SRI_ARR(DCN_CUR1_TTU_CNTL0, HUBPREQ, id),                                \
-      SRI_ARR(DCN_CUR1_TTU_CNTL1, HUBPREQ, id),                                \
-      SRI_ARR(DCSURF_FLIP_CONTROL2, HUBPREQ, id),                              \
-      SRI_ARR(VMID_SETTINGS_0, HUBPREQ, id)
-#define HUBP_REG_LIST_DCN21_RI(id)                                             \
-  HUBP_REG_LIST_DCN2_COMMON_RI(id), SRI_ARR(FLIP_PARAMETERS_3, HUBPREQ, id),   \
-      SRI_ARR(FLIP_PARAMETERS_4, HUBPREQ, id),                                 \
-      SRI_ARR(FLIP_PARAMETERS_5, HUBPREQ, id),                                 \
-      SRI_ARR(FLIP_PARAMETERS_6, HUBPREQ, id),                                 \
-      SRI_ARR(VBLANK_PARAMETERS_5, HUBPREQ, id),                               \
-      SRI_ARR(VBLANK_PARAMETERS_6, HUBPREQ, id)
-#define HUBP_REG_LIST_DCN30_RI(id)                                             \
-  HUBP_REG_LIST_DCN21_RI(id), SRI_ARR(DCN_DMDATA_VM_CNTL, HUBPREQ, id)
-#define HUBP_REG_LIST_DCN32_RI(id)                                             \
-  HUBP_REG_LIST_DCN30_RI(id), SRI_ARR(DCHUBP_MALL_CONFIG, HUBP, id),           \
-      SRI_ARR(DCHUBP_VMPG_CONFIG, HUBP, id),                                   \
-      SRI_ARR(UCLK_PSTATE_FORCE, HUBPREQ, id)
-
-/* HUBBUB */
-
-#define HUBBUB_REG_LIST_DCN32_RI(id)                                           \
-  SR(DCHUBBUB_ARB_DATA_URGENCY_WATERMARK_A),                                   \
-      SR(DCHUBBUB_ARB_DATA_URGENCY_WATERMARK_B),                               \
-      SR(DCHUBBUB_ARB_DATA_URGENCY_WATERMARK_C),                               \
-      SR(DCHUBBUB_ARB_DATA_URGENCY_WATERMARK_D),                               \
-      SR(DCHUBBUB_ARB_WATERMARK_CHANGE_CNTL),                                  \
-      SR(DCHUBBUB_ARB_DRAM_STATE_CNTL), SR(DCHUBBUB_ARB_SAT_LEVEL),            \
-      SR(DCHUBBUB_ARB_DF_REQ_OUTSTAND), SR(DCHUBBUB_GLOBAL_TIMER_CNTL),        \
-      SR(DCHUBBUB_SOFT_RESET), SR(DCHUBBUB_CRC_CTRL),                          \
-      SR(DCN_VM_FB_LOCATION_BASE), SR(DCN_VM_FB_LOCATION_TOP),                 \
-      SR(DCN_VM_FB_OFFSET), SR(DCN_VM_AGP_BOT), SR(DCN_VM_AGP_TOP),            \
-      SR(DCN_VM_AGP_BASE), HUBBUB_SR_WATERMARK_REG_LIST(),                     \
-      SR(DCHUBBUB_ARB_FRAC_URG_BW_NOM_A), SR(DCHUBBUB_ARB_FRAC_URG_BW_NOM_B),  \
-      SR(DCHUBBUB_ARB_FRAC_URG_BW_NOM_C), SR(DCHUBBUB_ARB_FRAC_URG_BW_NOM_D),  \
-      SR(DCHUBBUB_ARB_FRAC_URG_BW_FLIP_A),                                     \
-      SR(DCHUBBUB_ARB_FRAC_URG_BW_FLIP_B),                                     \
-      SR(DCHUBBUB_ARB_FRAC_URG_BW_FLIP_C),                                     \
-      SR(DCHUBBUB_ARB_FRAC_URG_BW_FLIP_D),                                     \
-      SR(DCHUBBUB_ARB_REFCYC_PER_TRIP_TO_MEMORY_A),                            \
-      SR(DCHUBBUB_ARB_REFCYC_PER_TRIP_TO_MEMORY_B),                            \
-      SR(DCHUBBUB_ARB_REFCYC_PER_TRIP_TO_MEMORY_C),                            \
-      SR(DCHUBBUB_ARB_REFCYC_PER_TRIP_TO_MEMORY_D), SR(DCHUBBUB_DET0_CTRL),    \
-      SR(DCHUBBUB_DET1_CTRL), SR(DCHUBBUB_DET2_CTRL), SR(DCHUBBUB_DET3_CTRL),  \
-      SR(DCHUBBUB_COMPBUF_CTRL), SR(COMPBUF_RESERVED_SPACE),                   \
-      SR(DCHUBBUB_DEBUG_CTRL_0),                                               \
-      SR(DCHUBBUB_ARB_USR_RETRAINING_CNTL),                                    \
-      SR(DCHUBBUB_ARB_USR_RETRAINING_WATERMARK_A),                             \
-      SR(DCHUBBUB_ARB_USR_RETRAINING_WATERMARK_B),                             \
-      SR(DCHUBBUB_ARB_USR_RETRAINING_WATERMARK_C),                             \
-      SR(DCHUBBUB_ARB_USR_RETRAINING_WATERMARK_D),                             \
-      SR(DCHUBBUB_ARB_UCLK_PSTATE_CHANGE_WATERMARK_A),                         \
-      SR(DCHUBBUB_ARB_UCLK_PSTATE_CHANGE_WATERMARK_B),                         \
-      SR(DCHUBBUB_ARB_UCLK_PSTATE_CHANGE_WATERMARK_C),                         \
-      SR(DCHUBBUB_ARB_UCLK_PSTATE_CHANGE_WATERMARK_D),                         \
-      SR(DCHUBBUB_ARB_FCLK_PSTATE_CHANGE_WATERMARK_A),                         \
-      SR(DCHUBBUB_ARB_FCLK_PSTATE_CHANGE_WATERMARK_B),                         \
-      SR(DCHUBBUB_ARB_FCLK_PSTATE_CHANGE_WATERMARK_C),                         \
-      SR(DCHUBBUB_ARB_FCLK_PSTATE_CHANGE_WATERMARK_D),                         \
-      SR(DCHUBBUB_ARB_MALL_CNTL),                                              \
-      SR(DCN_VM_FAULT_ADDR_MSB), SR(DCN_VM_FAULT_ADDR_LSB),                    \
-      SR(DCN_VM_FAULT_CNTL), SR(DCN_VM_FAULT_STATUS),                          \
-      SR(SDPIF_REQUEST_RATE_LIMIT)
-
-/* DCCG */
-
-#define DCCG_REG_LIST_DCN32_RI()                                               \
-  SR(DPPCLK_DTO_CTRL), DCCG_SRII(DTO_PARAM, DPPCLK, 0),                        \
-      DCCG_SRII(DTO_PARAM, DPPCLK, 1), DCCG_SRII(DTO_PARAM, DPPCLK, 2),        \
-      DCCG_SRII(DTO_PARAM, DPPCLK, 3), DCCG_SRII(CLOCK_CNTL, HDMICHARCLK, 0),  \
-      SR(PHYASYMCLK_CLOCK_CNTL), SR(PHYBSYMCLK_CLOCK_CNTL),                    \
-      SR(PHYCSYMCLK_CLOCK_CNTL), SR(PHYDSYMCLK_CLOCK_CNTL),                    \
-      SR(PHYESYMCLK_CLOCK_CNTL), SR(DPSTREAMCLK_CNTL), SR(HDMISTREAMCLK_CNTL), \
-      SR(SYMCLK32_SE_CNTL), SR(SYMCLK32_LE_CNTL),                              \
-      DCCG_SRII(PIXEL_RATE_CNTL, OTG, 0), DCCG_SRII(PIXEL_RATE_CNTL, OTG, 1),  \
-      DCCG_SRII(PIXEL_RATE_CNTL, OTG, 2), DCCG_SRII(PIXEL_RATE_CNTL, OTG, 3),  \
-      DCCG_SRII(MODULO, DTBCLK_DTO, 0), DCCG_SRII(MODULO, DTBCLK_DTO, 1),      \
-      DCCG_SRII(MODULO, DTBCLK_DTO, 2), DCCG_SRII(MODULO, DTBCLK_DTO, 3),      \
-      DCCG_SRII(PHASE, DTBCLK_DTO, 0), DCCG_SRII(PHASE, DTBCLK_DTO, 1),        \
-      DCCG_SRII(PHASE, DTBCLK_DTO, 2), DCCG_SRII(PHASE, DTBCLK_DTO, 3),        \
-      SR(DCCG_AUDIO_DTBCLK_DTO_MODULO), SR(DCCG_AUDIO_DTBCLK_DTO_PHASE),       \
-      SR(OTG_PIXEL_RATE_DIV), SR(DTBCLK_P_CNTL),                               \
-      SR(DCCG_AUDIO_DTO_SOURCE), SR(DENTIST_DISPCLK_CNTL)
-
-/* VMID */
-#define DCN20_VMID_REG_LIST_RI(id)                                             \
-  SRI_ARR(CNTL, DCN_VM_CONTEXT, id),                                           \
-      SRI_ARR(PAGE_TABLE_BASE_ADDR_HI32, DCN_VM_CONTEXT, id),                  \
-      SRI_ARR(PAGE_TABLE_BASE_ADDR_LO32, DCN_VM_CONTEXT, id),                  \
-      SRI_ARR(PAGE_TABLE_START_ADDR_HI32, DCN_VM_CONTEXT, id),                 \
-      SRI_ARR(PAGE_TABLE_START_ADDR_LO32, DCN_VM_CONTEXT, id),                 \
-      SRI_ARR(PAGE_TABLE_END_ADDR_HI32, DCN_VM_CONTEXT, id),                   \
-      SRI_ARR(PAGE_TABLE_END_ADDR_LO32, DCN_VM_CONTEXT, id)
-
-/* I2C HW */
-
-#define I2C_HW_ENGINE_COMMON_REG_LIST_RI(id)                                   \
-      SRI_ARR_I2C(SETUP, DC_I2C_DDC, id), SRI_ARR_I2C(SPEED, DC_I2C_DDC, id),  \
-      SRI_ARR_I2C(HW_STATUS, DC_I2C_DDC, id),                                  \
-      SR_ARR_I2C(DC_I2C_ARBITRATION, id),                                      \
-      SR_ARR_I2C(DC_I2C_CONTROL, id), SR_ARR_I2C(DC_I2C_SW_STATUS, id),        \
-      SR_ARR_I2C(DC_I2C_TRANSACTION0, id), SR_ARR_I2C(DC_I2C_TRANSACTION1, id),\
-      SR_ARR_I2C(DC_I2C_TRANSACTION2, id), SR_ARR_I2C(DC_I2C_TRANSACTION3, id),\
-      SR_ARR_I2C(DC_I2C_DATA, id), SR_ARR_I2C(MICROSECOND_TIME_BASE_DIV, id)
-
-#define I2C_HW_ENGINE_COMMON_REG_LIST_DCN30_RI(id)                             \
-      I2C_HW_ENGINE_COMMON_REG_LIST_RI(id), SR_ARR_I2C(DIO_MEM_PWR_CTRL, id),  \
-      SR_ARR_I2C(DIO_MEM_PWR_STATUS, id)
-
-#endif /* _DCN32_RESOURCE_H_ */
index bc5f0db23d0c369ea9bbf6eb94d6b43b821b6df5..ef0a2b01734d73297d8153fcd2fd1879a1762bd4 100644 (file)
@@ -24,7 +24,7 @@
  */
 
 // header file of functions being implemented
-#include "dcn32_resource.h"
+#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"
index 0a199c83bb5b333946cae062b39b1e20284f2b2c..c195c47f58b4603c5ab2652923750fd5f041e68e 100644 (file)
@@ -10,7 +10,7 @@
 #
 # Makefile for dcn321.
 
-DCN321 = dcn321_resource.o dcn321_dio_link_encoder.o
+DCN321 = dcn321_dio_link_encoder.o
 
 AMD_DAL_DCN321 = $(addprefix $(AMDDALPATH)/dc/dcn321/,$(DCN321))
 
diff --git a/drivers/gpu/drm/amd/display/dc/dcn321/dcn321_resource.c b/drivers/gpu/drm/amd/display/dc/dcn321/dcn321_resource.c
deleted file mode 100644 (file)
index f7de3ec..0000000
+++ /dev/null
@@ -1,2065 +0,0 @@
-// SPDX-License-Identifier: MIT
-/*
- * 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 "dm_services.h"
-#include "dc.h"
-
-#include "dcn32/dcn32_init.h"
-
-#include "resource.h"
-#include "include/irq_service_interface.h"
-#include "dcn32/dcn32_resource.h"
-#include "dcn321_resource.h"
-
-#include "dcn20/dcn20_resource.h"
-#include "dcn30/dcn30_resource.h"
-
-#include "dml/dcn321/dcn321_fpu.h"
-
-#include "dcn10/dcn10_ipp.h"
-#include "dcn30/dcn30_hubbub.h"
-#include "dcn31/dcn31_hubbub.h"
-#include "dcn32/dcn32_hubbub.h"
-#include "dcn32/dcn32_mpc.h"
-#include "dcn32/dcn32_hubp.h"
-#include "irq/dcn32/irq_service_dcn32.h"
-#include "dcn32/dcn32_dpp.h"
-#include "dcn32/dcn32_optc.h"
-#include "dcn20/dcn20_hwseq.h"
-#include "dcn30/dcn30_hwseq.h"
-#include "dce110/dce110_hwseq.h"
-#include "dcn30/dcn30_opp.h"
-#include "dcn20/dcn20_dsc.h"
-#include "dcn30/dcn30_vpg.h"
-#include "dcn30/dcn30_afmt.h"
-#include "dcn30/dcn30_dio_stream_encoder.h"
-#include "dcn32/dcn32_dio_stream_encoder.h"
-#include "dcn31/dcn31_hpo_dp_stream_encoder.h"
-#include "dcn31/dcn31_hpo_dp_link_encoder.h"
-#include "dcn32/dcn32_hpo_dp_link_encoder.h"
-#include "dcn31/dcn31_apg.h"
-#include "dcn31/dcn31_dio_link_encoder.h"
-#include "dcn32/dcn32_dio_link_encoder.h"
-#include "dcn321_dio_link_encoder.h"
-#include "dce/dce_clock_source.h"
-#include "dce/dce_audio.h"
-#include "dce/dce_hwseq.h"
-#include "clk_mgr.h"
-#include "virtual/virtual_stream_encoder.h"
-#include "dml/display_mode_vba.h"
-#include "dcn32/dcn32_dccg.h"
-#include "dcn10/dcn10_resource.h"
-#include "link.h"
-#include "dcn31/dcn31_panel_cntl.h"
-
-#include "dcn30/dcn30_dwb.h"
-#include "dcn32/dcn32_mmhubbub.h"
-
-#include "dcn/dcn_3_2_1_offset.h"
-#include "dcn/dcn_3_2_1_sh_mask.h"
-#include "nbio/nbio_4_3_0_offset.h"
-
-#include "reg_helper.h"
-#include "dce/dmub_abm.h"
-#include "dce/dmub_psr.h"
-#include "dce/dce_aux.h"
-#include "dce/dce_i2c.h"
-
-#include "dml/dcn30/display_mode_vba_30.h"
-#include "vm_helper.h"
-#include "dcn20/dcn20_vmid.h"
-
-#define DC_LOGGER_INIT(logger)
-
-enum dcn321_clk_src_array_id {
-       DCN321_CLK_SRC_PLL0,
-       DCN321_CLK_SRC_PLL1,
-       DCN321_CLK_SRC_PLL2,
-       DCN321_CLK_SRC_PLL3,
-       DCN321_CLK_SRC_PLL4,
-       DCN321_CLK_SRC_TOTAL
-};
-
-/* begin *********************
- * macros to expend register list macro defined in HW object header file
- */
-
-/* DCN */
-#define BASE_INNER(seg) ctx->dcn_reg_offsets[seg]
-
-#define BASE(seg) BASE_INNER(seg)
-
-#define SR(reg_name)\
-       REG_STRUCT.reg_name = BASE(reg ## reg_name ## _BASE_IDX) +  \
-               reg ## reg_name
-#define SR_ARR(reg_name, id)\
-       REG_STRUCT[id].reg_name = BASE(reg ## reg_name ## _BASE_IDX) +  \
-               reg ## reg_name
-#define SR_ARR_INIT(reg_name, id, value)\
-       REG_STRUCT[id].reg_name =  value
-
-#define SRI(reg_name, block, id)\
-       REG_STRUCT.reg_name = BASE(reg ## block ## id ## _ ## reg_name ## _BASE_IDX) + \
-               reg ## block ## id ## _ ## reg_name
-
-#define SRI_ARR(reg_name, block, id)\
-       REG_STRUCT[id].reg_name = BASE(reg ## block ## id ## _ ## reg_name ## _BASE_IDX) + \
-               reg ## block ## id ## _ ## reg_name
-
-#define SR_ARR_I2C(reg_name, id) \
-       REG_STRUCT[id-1].reg_name = BASE(reg##reg_name##_BASE_IDX) + reg##reg_name
-
-#define SRI_ARR_I2C(reg_name, block, id)\
-       REG_STRUCT[id-1].reg_name = BASE(reg ## block ## id ## _ ## reg_name ## _BASE_IDX) + \
-               reg ## block ## id ## _ ## reg_name
-
-#define SRI_ARR_ALPHABET(reg_name, block, index, id)\
-       REG_STRUCT[index].reg_name = BASE(reg ## block ## id ## _ ## reg_name ## _BASE_IDX) + \
-               reg ## block ## id ## _ ## reg_name
-
-#define SRI2(reg_name, block, id)\
-       .reg_name = BASE(reg ## reg_name ## _BASE_IDX) + \
-               reg ## reg_name
-#define SRI2_ARR(reg_name, block, id)\
-       REG_STRUCT[id].reg_name = BASE(reg ## reg_name ## _BASE_IDX) + \
-               reg ## reg_name
-
-#define SRIR(var_name, reg_name, block, id)\
-       .var_name = BASE(reg ## block ## id ## _ ## reg_name ## _BASE_IDX) + \
-               reg ## block ## id ## _ ## reg_name
-
-#define SRII(reg_name, block, id)\
-       REG_STRUCT.reg_name[id] = BASE(reg ## block ## id ## _ ## reg_name ## _BASE_IDX) + \
-               reg ## block ## id ## _ ## reg_name
-
-#define SRII_ARR_2(reg_name, block, id, inst)\
-       REG_STRUCT[inst].reg_name[id] = BASE(reg ## block ## id ## _ ## reg_name ## _BASE_IDX) + \
-               reg ## block ## id ## _ ## reg_name
-
-#define SRII_MPC_RMU(reg_name, block, id)\
-       .RMU##_##reg_name[id] = BASE(reg ## block ## id ## _ ## reg_name ## _BASE_IDX) + \
-               reg ## block ## id ## _ ## reg_name
-
-#define SRII_DWB(reg_name, temp_name, block, id)\
-       REG_STRUCT.reg_name[id] = BASE(reg ## block ## id ## _ ## temp_name ## _BASE_IDX) + \
-               reg ## block ## id ## _ ## temp_name
-
-#define DCCG_SRII(reg_name, block, id)\
-       REG_STRUCT.block ## _ ## reg_name[id] = BASE(reg ## block ## id ## _ ## reg_name ## _BASE_IDX) + \
-               reg ## block ## id ## _ ## reg_name
-
-#define SF_DWB2(reg_name, block, id, field_name, post_fix) \
-       .field_name = reg_name ## __ ## field_name ## post_fix
-
-#define VUPDATE_SRII(reg_name, block, id)\
-       REG_STRUCT.reg_name[id] = BASE(reg ## reg_name ## _ ## block ## id ## _BASE_IDX) + \
-               reg ## reg_name ## _ ## block ## id
-
-/* NBIO */
-#define NBIO_BASE_INNER(seg) ctx->nbio_reg_offsets[seg]
-
-#define NBIO_BASE(seg) \
-       NBIO_BASE_INNER(seg)
-
-#define NBIO_SR(reg_name)\
-       REG_STRUCT.reg_name = NBIO_BASE(regBIF_BX0_ ## reg_name ## _BASE_IDX) + \
-               regBIF_BX0_ ## reg_name
-#define NBIO_SR_ARR(reg_name, id)\
-       REG_STRUCT[id].reg_name = NBIO_BASE(regBIF_BX0_ ## reg_name ## _BASE_IDX) + \
-               regBIF_BX0_ ## reg_name
-
-#define CTX ctx
-#define REG(reg_name) \
-       (ctx->dcn_reg_offsets[reg ## reg_name ## _BASE_IDX] + reg ## reg_name)
-
-static struct bios_registers bios_regs;
-
-#define bios_regs_init() \
-               ( \
-               NBIO_SR(BIOS_SCRATCH_3),\
-               NBIO_SR(BIOS_SCRATCH_6)\
-               )
-
-#define clk_src_regs_init(index, pllid)\
-       CS_COMMON_REG_LIST_DCN3_0_RI(index, pllid)
-
-static struct dce110_clk_src_regs clk_src_regs[5];
-
-static const struct dce110_clk_src_shift cs_shift = {
-               CS_COMMON_MASK_SH_LIST_DCN3_2(__SHIFT)
-};
-
-static const struct dce110_clk_src_mask cs_mask = {
-               CS_COMMON_MASK_SH_LIST_DCN3_2(_MASK)
-};
-
-#define abm_regs_init(id)\
-               ABM_DCN32_REG_LIST_RI(id)
-
-static struct dce_abm_registers abm_regs[4];
-
-static const struct dce_abm_shift abm_shift = {
-               ABM_MASK_SH_LIST_DCN32(__SHIFT)
-};
-
-static const struct dce_abm_mask abm_mask = {
-               ABM_MASK_SH_LIST_DCN32(_MASK)
-};
-
-#define audio_regs_init(id)\
-               AUD_COMMON_REG_LIST_RI(id)
-
-static struct dce_audio_registers audio_regs[5];
-
-#define DCE120_AUD_COMMON_MASK_SH_LIST(mask_sh)\
-               SF(AZF0ENDPOINT0_AZALIA_F0_CODEC_ENDPOINT_INDEX, AZALIA_ENDPOINT_REG_INDEX, mask_sh),\
-               SF(AZF0ENDPOINT0_AZALIA_F0_CODEC_ENDPOINT_DATA, AZALIA_ENDPOINT_REG_DATA, mask_sh),\
-               AUD_COMMON_MASK_SH_LIST_BASE(mask_sh)
-
-static const struct dce_audio_shift audio_shift = {
-               DCE120_AUD_COMMON_MASK_SH_LIST(__SHIFT)
-};
-
-static const struct dce_audio_mask audio_mask = {
-               DCE120_AUD_COMMON_MASK_SH_LIST(_MASK)
-};
-
-#define vpg_regs_init(id)\
-       VPG_DCN3_REG_LIST_RI(id)
-
-static struct dcn30_vpg_registers vpg_regs[10];
-
-static const struct dcn30_vpg_shift vpg_shift = {
-       DCN3_VPG_MASK_SH_LIST(__SHIFT)
-};
-
-static const struct dcn30_vpg_mask vpg_mask = {
-       DCN3_VPG_MASK_SH_LIST(_MASK)
-};
-
-#define afmt_regs_init(id)\
-       AFMT_DCN3_REG_LIST_RI(id)
-
-static struct dcn30_afmt_registers afmt_regs[6];
-
-static const struct dcn30_afmt_shift afmt_shift = {
-       DCN3_AFMT_MASK_SH_LIST(__SHIFT)
-};
-
-static const struct dcn30_afmt_mask afmt_mask = {
-       DCN3_AFMT_MASK_SH_LIST(_MASK)
-};
-
-#define apg_regs_init(id)\
-       APG_DCN31_REG_LIST_RI(id)
-
-static struct dcn31_apg_registers apg_regs[4];
-
-static const struct dcn31_apg_shift apg_shift = {
-       DCN31_APG_MASK_SH_LIST(__SHIFT)
-};
-
-static const struct dcn31_apg_mask apg_mask = {
-               DCN31_APG_MASK_SH_LIST(_MASK)
-};
-
-#define stream_enc_regs_init(id)\
-       SE_DCN32_REG_LIST_RI(id)
-
-static struct dcn10_stream_enc_registers stream_enc_regs[5];
-
-static const struct dcn10_stream_encoder_shift se_shift = {
-               SE_COMMON_MASK_SH_LIST_DCN32(__SHIFT)
-};
-
-static const struct dcn10_stream_encoder_mask se_mask = {
-               SE_COMMON_MASK_SH_LIST_DCN32(_MASK)
-};
-
-
-#define aux_regs_init(id)\
-       DCN2_AUX_REG_LIST_RI(id)
-
-static struct dcn10_link_enc_aux_registers link_enc_aux_regs[5];
-
-#define hpd_regs_init(id)\
-       HPD_REG_LIST_RI(id)
-
-static struct dcn10_link_enc_hpd_registers link_enc_hpd_regs[5];
-
-#define link_regs_init(id, phyid)\
-       ( \
-       LE_DCN31_REG_LIST_RI(id), \
-       UNIPHY_DCN2_REG_LIST_RI(id, phyid)\
-       )
-       /*DPCS_DCN31_REG_LIST(id),*/ \
-
-static struct dcn10_link_enc_registers link_enc_regs[5];
-
-static const struct dcn10_link_enc_shift le_shift = {
-       LINK_ENCODER_MASK_SH_LIST_DCN31(__SHIFT), \
-//     DPCS_DCN31_MASK_SH_LIST(__SHIFT)
-};
-
-static const struct dcn10_link_enc_mask le_mask = {
-       LINK_ENCODER_MASK_SH_LIST_DCN31(_MASK), \
-//     DPCS_DCN31_MASK_SH_LIST(_MASK)
-};
-
-#define hpo_dp_stream_encoder_reg_init(id)\
-       DCN3_1_HPO_DP_STREAM_ENC_REG_LIST_RI(id)
-
-static struct dcn31_hpo_dp_stream_encoder_registers hpo_dp_stream_enc_regs[4];
-
-static const struct dcn31_hpo_dp_stream_encoder_shift hpo_dp_se_shift = {
-       DCN3_1_HPO_DP_STREAM_ENC_MASK_SH_LIST(__SHIFT)
-};
-
-static const struct dcn31_hpo_dp_stream_encoder_mask hpo_dp_se_mask = {
-       DCN3_1_HPO_DP_STREAM_ENC_MASK_SH_LIST(_MASK)
-};
-
-
-#define hpo_dp_link_encoder_reg_init(id)\
-       DCN3_1_HPO_DP_LINK_ENC_REG_LIST_RI(id)
-       /*DCN3_1_RDPCSTX_REG_LIST(0),*/
-       /*DCN3_1_RDPCSTX_REG_LIST(1),*/
-       /*DCN3_1_RDPCSTX_REG_LIST(2),*/
-       /*DCN3_1_RDPCSTX_REG_LIST(3),*/
-
-static struct dcn31_hpo_dp_link_encoder_registers hpo_dp_link_enc_regs[2];
-
-static const struct dcn31_hpo_dp_link_encoder_shift hpo_dp_le_shift = {
-       DCN3_2_HPO_DP_LINK_ENC_MASK_SH_LIST(__SHIFT)
-};
-
-static const struct dcn31_hpo_dp_link_encoder_mask hpo_dp_le_mask = {
-       DCN3_2_HPO_DP_LINK_ENC_MASK_SH_LIST(_MASK)
-};
-
-#define dpp_regs_init(id)\
-       DPP_REG_LIST_DCN30_COMMON_RI(id)
-
-static struct dcn3_dpp_registers dpp_regs[4];
-
-static const struct dcn3_dpp_shift tf_shift = {
-               DPP_REG_LIST_SH_MASK_DCN30_COMMON(__SHIFT)
-};
-
-static const struct dcn3_dpp_mask tf_mask = {
-               DPP_REG_LIST_SH_MASK_DCN30_COMMON(_MASK)
-};
-
-
-#define opp_regs_init(id)\
-       OPP_REG_LIST_DCN30_RI(id)
-
-static struct dcn20_opp_registers opp_regs[4];
-
-static const struct dcn20_opp_shift opp_shift = {
-       OPP_MASK_SH_LIST_DCN20(__SHIFT)
-};
-
-static const struct dcn20_opp_mask opp_mask = {
-       OPP_MASK_SH_LIST_DCN20(_MASK)
-};
-
-#define aux_engine_regs_init(id) \
-       ( \
-       AUX_COMMON_REG_LIST0_RI(id), SR_ARR_INIT(AUXN_IMPCAL, id, 0), \
-       SR_ARR_INIT(AUXP_IMPCAL, id, 0), \
-       SR_ARR_INIT(AUX_RESET_MASK, id, DP_AUX0_AUX_CONTROL__AUX_RESET_MASK), \
-       SR_ARR_INIT(AUX_RESET_MASK, id, DP_AUX0_AUX_CONTROL__AUX_RESET_MASK)\
-       )
-
-static struct dce110_aux_registers aux_engine_regs[5];
-
-static const struct dce110_aux_registers_shift aux_shift = {
-       DCN_AUX_MASK_SH_LIST(__SHIFT)
-};
-
-static const struct dce110_aux_registers_mask aux_mask = {
-       DCN_AUX_MASK_SH_LIST(_MASK)
-};
-
-#define dwbc_regs_dcn3_init(id)\
-       DWBC_COMMON_REG_LIST_DCN30_RI(id)
-
-static struct dcn30_dwbc_registers dwbc30_regs[1];
-
-static const struct dcn30_dwbc_shift dwbc30_shift = {
-       DWBC_COMMON_MASK_SH_LIST_DCN30(__SHIFT)
-};
-
-static const struct dcn30_dwbc_mask dwbc30_mask = {
-       DWBC_COMMON_MASK_SH_LIST_DCN30(_MASK)
-};
-
-#define mcif_wb_regs_dcn3_init(id)\
-       MCIF_WB_COMMON_REG_LIST_DCN32_RI(id)
-
-static struct dcn30_mmhubbub_registers mcif_wb30_regs[1];
-
-static const struct dcn30_mmhubbub_shift mcif_wb30_shift = {
-       MCIF_WB_COMMON_MASK_SH_LIST_DCN32(__SHIFT)
-};
-
-static const struct dcn30_mmhubbub_mask mcif_wb30_mask = {
-       MCIF_WB_COMMON_MASK_SH_LIST_DCN32(_MASK)
-};
-
-#define dsc_regsDCN20_init(id)\
-       DSC_REG_LIST_DCN20_RI(id)
-
-static struct dcn20_dsc_registers dsc_regs[4];
-
-static const struct dcn20_dsc_shift dsc_shift = {
-       DSC_REG_LIST_SH_MASK_DCN20(__SHIFT)
-};
-
-static const struct dcn20_dsc_mask dsc_mask = {
-       DSC_REG_LIST_SH_MASK_DCN20(_MASK)
-};
-
-static struct dcn30_mpc_registers mpc_regs;
-#define dcn_mpc_regs_init()\
-       MPC_REG_LIST_DCN3_2_RI(0),\
-       MPC_REG_LIST_DCN3_2_RI(1),\
-       MPC_REG_LIST_DCN3_2_RI(2),\
-       MPC_REG_LIST_DCN3_2_RI(3),\
-       MPC_OUT_MUX_REG_LIST_DCN3_0_RI(0),\
-       MPC_OUT_MUX_REG_LIST_DCN3_0_RI(1),\
-       MPC_OUT_MUX_REG_LIST_DCN3_0_RI(2),\
-       MPC_OUT_MUX_REG_LIST_DCN3_0_RI(3),\
-       MPC_DWB_MUX_REG_LIST_DCN3_0_RI(0)
-
-static const struct dcn30_mpc_shift mpc_shift = {
-       MPC_COMMON_MASK_SH_LIST_DCN32(__SHIFT)
-};
-
-static const struct dcn30_mpc_mask mpc_mask = {
-       MPC_COMMON_MASK_SH_LIST_DCN32(_MASK)
-};
-
-#define optc_regs_init(id)\
-       OPTC_COMMON_REG_LIST_DCN3_2_RI(id)
-
-static struct dcn_optc_registers optc_regs[4];
-
-static const struct dcn_optc_shift optc_shift = {
-       OPTC_COMMON_MASK_SH_LIST_DCN3_2(__SHIFT)
-};
-
-static const struct dcn_optc_mask optc_mask = {
-       OPTC_COMMON_MASK_SH_LIST_DCN3_2(_MASK)
-};
-
-#define hubp_regs_init(id) \
-       HUBP_REG_LIST_DCN32_RI(id)
-
-static struct dcn_hubp2_registers hubp_regs[4];
-
-static const struct dcn_hubp2_shift hubp_shift = {
-               HUBP_MASK_SH_LIST_DCN32(__SHIFT)
-};
-
-static const struct dcn_hubp2_mask hubp_mask = {
-               HUBP_MASK_SH_LIST_DCN32(_MASK)
-};
-
-static struct dcn_hubbub_registers hubbub_reg;
-#define hubbub_reg_init()\
-               HUBBUB_REG_LIST_DCN32_RI(0)
-
-static const struct dcn_hubbub_shift hubbub_shift = {
-               HUBBUB_MASK_SH_LIST_DCN32(__SHIFT)
-};
-
-static const struct dcn_hubbub_mask hubbub_mask = {
-               HUBBUB_MASK_SH_LIST_DCN32(_MASK)
-};
-
-static struct dccg_registers dccg_regs;
-
-#define dccg_regs_init()\
-       DCCG_REG_LIST_DCN32_RI()
-
-static const struct dccg_shift dccg_shift = {
-               DCCG_MASK_SH_LIST_DCN32(__SHIFT)
-};
-
-static const struct dccg_mask dccg_mask = {
-               DCCG_MASK_SH_LIST_DCN32(_MASK)
-};
-
-
-#define SRII2(reg_name_pre, reg_name_post, id)\
-       .reg_name_pre ## _ ##  reg_name_post[id] = BASE(reg ## reg_name_pre \
-                       ## id ## _ ## reg_name_post ## _BASE_IDX) + \
-                       reg ## reg_name_pre ## id ## _ ## reg_name_post
-
-
-#define HWSEQ_DCN32_REG_LIST()\
-       SR(DCHUBBUB_GLOBAL_TIMER_CNTL), \
-       SR(DIO_MEM_PWR_CTRL), \
-       SR(ODM_MEM_PWR_CTRL3), \
-       SR(MMHUBBUB_MEM_PWR_CNTL), \
-       SR(DCCG_GATE_DISABLE_CNTL), \
-       SR(DCCG_GATE_DISABLE_CNTL2), \
-       SR(DCFCLK_CNTL),\
-       SR(DC_MEM_GLOBAL_PWR_REQ_CNTL), \
-       SRII(PIXEL_RATE_CNTL, OTG, 0), \
-       SRII(PIXEL_RATE_CNTL, OTG, 1),\
-       SRII(PIXEL_RATE_CNTL, OTG, 2),\
-       SRII(PIXEL_RATE_CNTL, OTG, 3),\
-       SRII(PHYPLL_PIXEL_RATE_CNTL, OTG, 0),\
-       SRII(PHYPLL_PIXEL_RATE_CNTL, OTG, 1),\
-       SRII(PHYPLL_PIXEL_RATE_CNTL, OTG, 2),\
-       SRII(PHYPLL_PIXEL_RATE_CNTL, OTG, 3),\
-       SR(MICROSECOND_TIME_BASE_DIV), \
-       SR(MILLISECOND_TIME_BASE_DIV), \
-       SR(DISPCLK_FREQ_CHANGE_CNTL), \
-       SR(RBBMIF_TIMEOUT_DIS), \
-       SR(RBBMIF_TIMEOUT_DIS_2), \
-       SR(DCHUBBUB_CRC_CTRL), \
-       SR(DPP_TOP0_DPP_CRC_CTRL), \
-       SR(DPP_TOP0_DPP_CRC_VAL_B_A), \
-       SR(DPP_TOP0_DPP_CRC_VAL_R_G), \
-       SR(MPC_CRC_CTRL), \
-       SR(MPC_CRC_RESULT_GB), \
-       SR(MPC_CRC_RESULT_C), \
-       SR(MPC_CRC_RESULT_AR), \
-       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(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(D1VGA_CONTROL), \
-       SR(D2VGA_CONTROL), \
-       SR(D3VGA_CONTROL), \
-       SR(D4VGA_CONTROL), \
-       SR(D5VGA_CONTROL), \
-       SR(D6VGA_CONTROL), \
-       SR(DC_IP_REQUEST_CNTL), \
-       SR(AZALIA_AUDIO_DTO), \
-       SR(AZALIA_CONTROLLER_CLOCK_GATING)
-
-static struct dce_hwseq_registers hwseq_reg;
-
-#define hwseq_reg_init()\
-       HWSEQ_DCN32_REG_LIST()
-
-#define HWSEQ_DCN32_MASK_SH_LIST(mask_sh)\
-       HWSEQ_DCN_MASK_SH_LIST(mask_sh), \
-       HWS_SF(, DCHUBBUB_GLOBAL_TIMER_CNTL, DCHUBBUB_GLOBAL_TIMER_REFDIV, mask_sh), \
-       HWS_SF(, DOMAIN0_PG_CONFIG, DOMAIN_POWER_FORCEON, mask_sh), \
-       HWS_SF(, DOMAIN0_PG_CONFIG, DOMAIN_POWER_GATE, mask_sh), \
-       HWS_SF(, DOMAIN1_PG_CONFIG, DOMAIN_POWER_FORCEON, mask_sh), \
-       HWS_SF(, DOMAIN1_PG_CONFIG, DOMAIN_POWER_GATE, mask_sh), \
-       HWS_SF(, DOMAIN2_PG_CONFIG, DOMAIN_POWER_FORCEON, mask_sh), \
-       HWS_SF(, DOMAIN2_PG_CONFIG, DOMAIN_POWER_GATE, mask_sh), \
-       HWS_SF(, DOMAIN3_PG_CONFIG, DOMAIN_POWER_FORCEON, mask_sh), \
-       HWS_SF(, DOMAIN3_PG_CONFIG, DOMAIN_POWER_GATE, mask_sh), \
-       HWS_SF(, DOMAIN16_PG_CONFIG, DOMAIN_POWER_FORCEON, mask_sh), \
-       HWS_SF(, DOMAIN16_PG_CONFIG, DOMAIN_POWER_GATE, mask_sh), \
-       HWS_SF(, DOMAIN17_PG_CONFIG, DOMAIN_POWER_FORCEON, mask_sh), \
-       HWS_SF(, DOMAIN17_PG_CONFIG, DOMAIN_POWER_GATE, mask_sh), \
-       HWS_SF(, DOMAIN18_PG_CONFIG, DOMAIN_POWER_FORCEON, mask_sh), \
-       HWS_SF(, DOMAIN18_PG_CONFIG, DOMAIN_POWER_GATE, mask_sh), \
-       HWS_SF(, DOMAIN19_PG_CONFIG, DOMAIN_POWER_FORCEON, mask_sh), \
-       HWS_SF(, DOMAIN19_PG_CONFIG, DOMAIN_POWER_GATE, mask_sh), \
-       HWS_SF(, DOMAIN0_PG_STATUS, DOMAIN_PGFSM_PWR_STATUS, mask_sh), \
-       HWS_SF(, DOMAIN1_PG_STATUS, DOMAIN_PGFSM_PWR_STATUS, mask_sh), \
-       HWS_SF(, DOMAIN2_PG_STATUS, DOMAIN_PGFSM_PWR_STATUS, mask_sh), \
-       HWS_SF(, DOMAIN3_PG_STATUS, DOMAIN_PGFSM_PWR_STATUS, mask_sh), \
-       HWS_SF(, DOMAIN16_PG_STATUS, DOMAIN_PGFSM_PWR_STATUS, mask_sh), \
-       HWS_SF(, DOMAIN17_PG_STATUS, DOMAIN_PGFSM_PWR_STATUS, mask_sh), \
-       HWS_SF(, DOMAIN18_PG_STATUS, DOMAIN_PGFSM_PWR_STATUS, mask_sh), \
-       HWS_SF(, DOMAIN19_PG_STATUS, DOMAIN_PGFSM_PWR_STATUS, mask_sh), \
-       HWS_SF(, DC_IP_REQUEST_CNTL, IP_REQUEST_EN, mask_sh), \
-       HWS_SF(, AZALIA_AUDIO_DTO, AZALIA_AUDIO_DTO_MODULE, mask_sh), \
-       HWS_SF(, HPO_TOP_CLOCK_CONTROL, HPO_HDMISTREAMCLK_G_GATE_DIS, mask_sh), \
-       HWS_SF(, ODM_MEM_PWR_CTRL3, ODM_MEM_UNASSIGNED_PWR_MODE, mask_sh), \
-       HWS_SF(, ODM_MEM_PWR_CTRL3, ODM_MEM_VBLANK_PWR_MODE, mask_sh), \
-       HWS_SF(, MMHUBBUB_MEM_PWR_CNTL, VGA_MEM_PWR_FORCE, mask_sh)
-
-static const struct dce_hwseq_shift hwseq_shift = {
-               HWSEQ_DCN32_MASK_SH_LIST(__SHIFT)
-};
-
-static const struct dce_hwseq_mask hwseq_mask = {
-               HWSEQ_DCN32_MASK_SH_LIST(_MASK)
-};
-#define vmid_regs_init(id)\
-               DCN20_VMID_REG_LIST_RI(id)
-
-static struct dcn_vmid_registers vmid_regs[16];
-
-static const struct dcn20_vmid_shift vmid_shifts = {
-               DCN20_VMID_MASK_SH_LIST(__SHIFT)
-};
-
-static const struct dcn20_vmid_mask vmid_masks = {
-               DCN20_VMID_MASK_SH_LIST(_MASK)
-};
-
-static const struct resource_caps res_cap_dcn321 = {
-       .num_timing_generator = 4,
-       .num_opp = 4,
-       .num_video_plane = 4,
-       .num_audio = 5,
-       .num_stream_encoder = 5,
-       .num_hpo_dp_stream_encoder = 4,
-       .num_hpo_dp_link_encoder = 2,
-       .num_pll = 5,
-       .num_dwb = 1,
-       .num_ddc = 5,
-       .num_vmid = 16,
-       .num_mpc_3dlut = 4,
-       .num_dsc = 4,
-};
-
-static const struct dc_plane_cap plane_cap = {
-       .type = DC_PLANE_TYPE_DCN_UNIVERSAL,
-       .per_pixel_alpha = true,
-
-       .pixel_format_support = {
-                       .argb8888 = true,
-                       .nv12 = true,
-                       .fp16 = true,
-                       .p010 = true,
-                       .ayuv = false,
-       },
-
-       .max_upscale_factor = {
-                       .argb8888 = 16000,
-                       .nv12 = 16000,
-                       .fp16 = 16000
-       },
-
-       // 6:1 downscaling ratio: 1000/6 = 166.666
-       .max_downscale_factor = {
-                       .argb8888 = 167,
-                       .nv12 = 167,
-                       .fp16 = 167
-       },
-       64,
-       64
-};
-
-static const struct dc_debug_options debug_defaults_drv = {
-       .disable_dmcu = true,
-       .force_abm_enable = false,
-       .timing_trace = false,
-       .clock_trace = true,
-       .disable_pplib_clock_request = false,
-       .pipe_split_policy = MPC_SPLIT_AVOID,
-       .force_single_disp_pipe_split = false,
-       .disable_dcc = DCC_ENABLE,
-       .vsr_support = true,
-       .performance_trace = false,
-       .max_downscale_src_width = 7680,/*upto 8K*/
-       .disable_pplib_wm_range = false,
-       .scl_reset_length10 = true,
-       .sanity_checks = false,
-       .underflow_assert_delay_us = 0xFFFFFFFF,
-       .dwb_fi_phase = -1, // -1 = disable,
-       .dmub_command_table = true,
-       .enable_mem_low_power = {
-               .bits = {
-                       .vga = false,
-                       .i2c = false,
-                       .dmcu = false, // This is previously known to cause hang on S3 cycles if enabled
-                       .dscl = false,
-                       .cm = false,
-                       .mpc = false,
-                       .optc = true,
-               }
-       },
-       .use_max_lb = true,
-       .force_disable_subvp = false,
-       .exit_idle_opt_for_cursor_updates = true,
-       .enable_single_display_2to1_odm_policy = true,
-
-       /*must match enable_single_display_2to1_odm_policy to support dynamic ODM transitions*/
-       .enable_double_buffered_dsc_pg_support = true,
-       .enable_dp_dig_pixel_rate_div_policy = 1,
-       .allow_sw_cursor_fallback = false, // Linux can't do SW cursor "fallback"
-       .alloc_extra_way_for_cursor = true,
-       .min_prefetch_in_strobe_ns = 60000, // 60us
-       .disable_unbounded_requesting = false,
-       .override_dispclk_programming = true,
-       .disable_fpo_optimizations = false,
-       .fpo_vactive_margin_us = 2000, // 2000us
-       .disable_fpo_vactive = false,
-       .disable_boot_optimizations = false,
-       .disable_subvp_high_refresh = false,
-       .fpo_vactive_min_active_margin_us = 200,
-       .fpo_vactive_max_blank_us = 1000,
-       .enable_legacy_fast_update = false,
-       .disable_dc_mode_overwrite = true,
-       .using_dml2 = false,
-};
-
-static struct dce_aux *dcn321_aux_engine_create(
-       struct dc_context *ctx,
-       uint32_t inst)
-{
-       struct aux_engine_dce110 *aux_engine =
-               kzalloc(sizeof(struct aux_engine_dce110), GFP_KERNEL);
-
-       if (!aux_engine)
-               return NULL;
-
-#undef REG_STRUCT
-#define REG_STRUCT aux_engine_regs
-       aux_engine_regs_init(0),
-       aux_engine_regs_init(1),
-       aux_engine_regs_init(2),
-       aux_engine_regs_init(3),
-       aux_engine_regs_init(4);
-
-       dce110_aux_engine_construct(aux_engine, ctx, inst,
-                                   SW_AUX_TIMEOUT_PERIOD_MULTIPLIER * AUX_TIMEOUT_PERIOD,
-                                   &aux_engine_regs[inst],
-                                       &aux_mask,
-                                       &aux_shift,
-                                       ctx->dc->caps.extended_aux_timeout_support);
-
-       return &aux_engine->base;
-}
-#define i2c_inst_regs_init(id)\
-       I2C_HW_ENGINE_COMMON_REG_LIST_DCN30_RI(id)
-
-static struct dce_i2c_registers i2c_hw_regs[5];
-
-static const struct dce_i2c_shift i2c_shifts = {
-               I2C_COMMON_MASK_SH_LIST_DCN30(__SHIFT)
-};
-
-static const struct dce_i2c_mask i2c_masks = {
-               I2C_COMMON_MASK_SH_LIST_DCN30(_MASK)
-};
-
-static struct dce_i2c_hw *dcn321_i2c_hw_create(
-       struct dc_context *ctx,
-       uint32_t inst)
-{
-       struct dce_i2c_hw *dce_i2c_hw =
-               kzalloc(sizeof(struct dce_i2c_hw), GFP_KERNEL);
-
-       if (!dce_i2c_hw)
-               return NULL;
-
-#undef REG_STRUCT
-#define REG_STRUCT i2c_hw_regs
-       i2c_inst_regs_init(1),
-       i2c_inst_regs_init(2),
-       i2c_inst_regs_init(3),
-       i2c_inst_regs_init(4),
-       i2c_inst_regs_init(5);
-
-       dcn2_i2c_hw_construct(dce_i2c_hw, ctx, inst,
-                                   &i2c_hw_regs[inst], &i2c_shifts, &i2c_masks);
-
-       return dce_i2c_hw;
-}
-
-static struct clock_source *dcn321_clock_source_create(
-               struct dc_context *ctx,
-               struct dc_bios *bios,
-               enum clock_source_id id,
-               const struct dce110_clk_src_regs *regs,
-               bool dp_clk_src)
-{
-       struct dce110_clk_src *clk_src =
-               kzalloc(sizeof(struct dce110_clk_src), GFP_KERNEL);
-
-       if (!clk_src)
-               return NULL;
-
-       if (dcn31_clk_src_construct(clk_src, ctx, bios, id,
-                       regs, &cs_shift, &cs_mask)) {
-               clk_src->base.dp_clk_src = dp_clk_src;
-               return &clk_src->base;
-       }
-
-       kfree(clk_src);
-       BREAK_TO_DEBUGGER();
-       return NULL;
-}
-
-static struct hubbub *dcn321_hubbub_create(struct dc_context *ctx)
-{
-       int i;
-
-       struct dcn20_hubbub *hubbub2 = kzalloc(sizeof(struct dcn20_hubbub),
-                                         GFP_KERNEL);
-
-       if (!hubbub2)
-               return NULL;
-
-#undef REG_STRUCT
-#define REG_STRUCT hubbub_reg
-       hubbub_reg_init();
-
-#undef REG_STRUCT
-#define REG_STRUCT vmid_regs
-       vmid_regs_init(0),
-       vmid_regs_init(1),
-       vmid_regs_init(2),
-       vmid_regs_init(3),
-       vmid_regs_init(4),
-       vmid_regs_init(5),
-       vmid_regs_init(6),
-       vmid_regs_init(7),
-       vmid_regs_init(8),
-       vmid_regs_init(9),
-       vmid_regs_init(10),
-       vmid_regs_init(11),
-       vmid_regs_init(12),
-       vmid_regs_init(13),
-       vmid_regs_init(14),
-       vmid_regs_init(15);
-
-       hubbub32_construct(hubbub2, ctx,
-                       &hubbub_reg,
-                       &hubbub_shift,
-                       &hubbub_mask,
-                       ctx->dc->dml.ip.det_buffer_size_kbytes,
-                       ctx->dc->dml.ip.pixel_chunk_size_kbytes,
-                       ctx->dc->dml.ip.config_return_buffer_size_in_kbytes);
-
-
-       for (i = 0; i < res_cap_dcn321.num_vmid; i++) {
-               struct dcn20_vmid *vmid = &hubbub2->vmid[i];
-
-               vmid->ctx = ctx;
-
-               vmid->regs = &vmid_regs[i];
-               vmid->shifts = &vmid_shifts;
-               vmid->masks = &vmid_masks;
-       }
-
-       return &hubbub2->base;
-}
-
-static struct hubp *dcn321_hubp_create(
-       struct dc_context *ctx,
-       uint32_t inst)
-{
-       struct dcn20_hubp *hubp2 =
-               kzalloc(sizeof(struct dcn20_hubp), GFP_KERNEL);
-
-       if (!hubp2)
-               return NULL;
-
-#undef REG_STRUCT
-#define REG_STRUCT hubp_regs
-       hubp_regs_init(0),
-       hubp_regs_init(1),
-       hubp_regs_init(2),
-       hubp_regs_init(3);
-
-       if (hubp32_construct(hubp2, ctx, inst,
-                       &hubp_regs[inst], &hubp_shift, &hubp_mask))
-               return &hubp2->base;
-
-       BREAK_TO_DEBUGGER();
-       kfree(hubp2);
-       return NULL;
-}
-
-static void dcn321_dpp_destroy(struct dpp **dpp)
-{
-       kfree(TO_DCN30_DPP(*dpp));
-       *dpp = NULL;
-}
-
-static struct dpp *dcn321_dpp_create(
-       struct dc_context *ctx,
-       uint32_t inst)
-{
-       struct dcn3_dpp *dpp3 =
-               kzalloc(sizeof(struct dcn3_dpp), GFP_KERNEL);
-
-       if (!dpp3)
-               return NULL;
-
-#undef REG_STRUCT
-#define REG_STRUCT dpp_regs
-       dpp_regs_init(0),
-       dpp_regs_init(1),
-       dpp_regs_init(2),
-       dpp_regs_init(3);
-
-       if (dpp32_construct(dpp3, ctx, inst,
-                       &dpp_regs[inst], &tf_shift, &tf_mask))
-               return &dpp3->base;
-
-       BREAK_TO_DEBUGGER();
-       kfree(dpp3);
-       return NULL;
-}
-
-static struct mpc *dcn321_mpc_create(
-               struct dc_context *ctx,
-               int num_mpcc,
-               int num_rmu)
-{
-       struct dcn30_mpc *mpc30 = kzalloc(sizeof(struct dcn30_mpc),
-                                         GFP_KERNEL);
-
-       if (!mpc30)
-               return NULL;
-
-#undef REG_STRUCT
-#define REG_STRUCT mpc_regs
-       dcn_mpc_regs_init();
-
-       dcn32_mpc_construct(mpc30, ctx,
-                       &mpc_regs,
-                       &mpc_shift,
-                       &mpc_mask,
-                       num_mpcc,
-                       num_rmu);
-
-       return &mpc30->base;
-}
-
-static struct output_pixel_processor *dcn321_opp_create(
-       struct dc_context *ctx, uint32_t inst)
-{
-       struct dcn20_opp *opp2 =
-               kzalloc(sizeof(struct dcn20_opp), GFP_KERNEL);
-
-       if (!opp2) {
-               BREAK_TO_DEBUGGER();
-               return NULL;
-       }
-
-#undef REG_STRUCT
-#define REG_STRUCT opp_regs
-       opp_regs_init(0),
-       opp_regs_init(1),
-       opp_regs_init(2),
-       opp_regs_init(3);
-
-       dcn20_opp_construct(opp2, ctx, inst,
-                       &opp_regs[inst], &opp_shift, &opp_mask);
-       return &opp2->base;
-}
-
-
-static struct timing_generator *dcn321_timing_generator_create(
-               struct dc_context *ctx,
-               uint32_t instance)
-{
-       struct optc *tgn10 =
-               kzalloc(sizeof(struct optc), GFP_KERNEL);
-
-       if (!tgn10)
-               return NULL;
-
-#undef REG_STRUCT
-#define REG_STRUCT optc_regs
-       optc_regs_init(0),
-       optc_regs_init(1),
-       optc_regs_init(2),
-       optc_regs_init(3);
-
-       tgn10->base.inst = instance;
-       tgn10->base.ctx = ctx;
-
-       tgn10->tg_regs = &optc_regs[instance];
-       tgn10->tg_shift = &optc_shift;
-       tgn10->tg_mask = &optc_mask;
-
-       dcn32_timing_generator_init(tgn10);
-
-       return &tgn10->base;
-}
-
-static const struct encoder_feature_support link_enc_feature = {
-               .max_hdmi_deep_color = COLOR_DEPTH_121212,
-               .max_hdmi_pixel_clock = 600000,
-               .hdmi_ycbcr420_supported = true,
-               .dp_ycbcr420_supported = true,
-               .fec_supported = true,
-               .flags.bits.IS_HBR2_CAPABLE = true,
-               .flags.bits.IS_HBR3_CAPABLE = true,
-               .flags.bits.IS_TPS3_CAPABLE = true,
-               .flags.bits.IS_TPS4_CAPABLE = true
-};
-
-static struct link_encoder *dcn321_link_encoder_create(
-       struct dc_context *ctx,
-       const struct encoder_init_data *enc_init_data)
-{
-       struct dcn20_link_encoder *enc20 =
-               kzalloc(sizeof(struct dcn20_link_encoder), GFP_KERNEL);
-
-       if (!enc20)
-               return NULL;
-
-#undef REG_STRUCT
-#define REG_STRUCT link_enc_aux_regs
-       aux_regs_init(0),
-       aux_regs_init(1),
-       aux_regs_init(2),
-       aux_regs_init(3),
-       aux_regs_init(4);
-
-#undef REG_STRUCT
-#define REG_STRUCT link_enc_hpd_regs
-       hpd_regs_init(0),
-       hpd_regs_init(1),
-       hpd_regs_init(2),
-       hpd_regs_init(3),
-       hpd_regs_init(4);
-
-#undef REG_STRUCT
-#define REG_STRUCT link_enc_regs
-       link_regs_init(0, A),
-       link_regs_init(1, B),
-       link_regs_init(2, C),
-       link_regs_init(3, D),
-       link_regs_init(4, E);
-
-       dcn321_link_encoder_construct(enc20,
-                       enc_init_data,
-                       &link_enc_feature,
-                       &link_enc_regs[enc_init_data->transmitter],
-                       &link_enc_aux_regs[enc_init_data->channel - 1],
-                       &link_enc_hpd_regs[enc_init_data->hpd_source],
-                       &le_shift,
-                       &le_mask);
-
-       return &enc20->enc10.base;
-}
-
-static void read_dce_straps(
-       struct dc_context *ctx,
-       struct resource_straps *straps)
-{
-       generic_reg_get(ctx, ctx->dcn_reg_offsets[regDC_PINSTRAPS_BASE_IDX] + regDC_PINSTRAPS,
-               FN(DC_PINSTRAPS, DC_PINSTRAPS_AUDIO), &straps->dc_pinstraps_audio);
-
-}
-
-static struct audio *dcn321_create_audio(
-               struct dc_context *ctx, unsigned int inst)
-{
-
-#undef REG_STRUCT
-#define REG_STRUCT audio_regs
-       audio_regs_init(0),
-       audio_regs_init(1),
-       audio_regs_init(2),
-       audio_regs_init(3),
-       audio_regs_init(4);
-
-       return dce_audio_create(ctx, inst,
-                       &audio_regs[inst], &audio_shift, &audio_mask);
-}
-
-static struct vpg *dcn321_vpg_create(
-       struct dc_context *ctx,
-       uint32_t inst)
-{
-       struct dcn30_vpg *vpg3 = kzalloc(sizeof(struct dcn30_vpg), GFP_KERNEL);
-
-       if (!vpg3)
-               return NULL;
-
-#undef REG_STRUCT
-#define REG_STRUCT vpg_regs
-       vpg_regs_init(0),
-       vpg_regs_init(1),
-       vpg_regs_init(2),
-       vpg_regs_init(3),
-       vpg_regs_init(4),
-       vpg_regs_init(5),
-       vpg_regs_init(6),
-       vpg_regs_init(7),
-       vpg_regs_init(8),
-       vpg_regs_init(9);
-
-       vpg3_construct(vpg3, ctx, inst,
-                       &vpg_regs[inst],
-                       &vpg_shift,
-                       &vpg_mask);
-
-       return &vpg3->base;
-}
-
-static struct afmt *dcn321_afmt_create(
-       struct dc_context *ctx,
-       uint32_t inst)
-{
-       struct dcn30_afmt *afmt3 = kzalloc(sizeof(struct dcn30_afmt), GFP_KERNEL);
-
-       if (!afmt3)
-               return NULL;
-
-#undef REG_STRUCT
-#define REG_STRUCT afmt_regs
-       afmt_regs_init(0),
-       afmt_regs_init(1),
-       afmt_regs_init(2),
-       afmt_regs_init(3),
-       afmt_regs_init(4),
-       afmt_regs_init(5);
-
-       afmt3_construct(afmt3, ctx, inst,
-                       &afmt_regs[inst],
-                       &afmt_shift,
-                       &afmt_mask);
-
-       return &afmt3->base;
-}
-
-static struct apg *dcn321_apg_create(
-       struct dc_context *ctx,
-       uint32_t inst)
-{
-       struct dcn31_apg *apg31 = kzalloc(sizeof(struct dcn31_apg), GFP_KERNEL);
-
-       if (!apg31)
-               return NULL;
-
-#undef REG_STRUCT
-#define REG_STRUCT apg_regs
-       apg_regs_init(0),
-       apg_regs_init(1),
-       apg_regs_init(2),
-       apg_regs_init(3);
-
-       apg31_construct(apg31, ctx, inst,
-                       &apg_regs[inst],
-                       &apg_shift,
-                       &apg_mask);
-
-       return &apg31->base;
-}
-
-static struct stream_encoder *dcn321_stream_encoder_create(
-       enum engine_id eng_id,
-       struct dc_context *ctx)
-{
-       struct dcn10_stream_encoder *enc1;
-       struct vpg *vpg;
-       struct afmt *afmt;
-       int vpg_inst;
-       int afmt_inst;
-
-       /* Mapping of VPG, AFMT, DME register blocks to DIO block instance */
-       if (eng_id <= ENGINE_ID_DIGF) {
-               vpg_inst = eng_id;
-               afmt_inst = eng_id;
-       } else
-               return NULL;
-
-       enc1 = kzalloc(sizeof(struct dcn10_stream_encoder), GFP_KERNEL);
-       vpg = dcn321_vpg_create(ctx, vpg_inst);
-       afmt = dcn321_afmt_create(ctx, afmt_inst);
-
-       if (!enc1 || !vpg || !afmt) {
-               kfree(enc1);
-               kfree(vpg);
-               kfree(afmt);
-               return NULL;
-       }
-
-#undef REG_STRUCT
-#define REG_STRUCT stream_enc_regs
-       stream_enc_regs_init(0),
-       stream_enc_regs_init(1),
-       stream_enc_regs_init(2),
-       stream_enc_regs_init(3),
-       stream_enc_regs_init(4);
-
-       dcn32_dio_stream_encoder_construct(enc1, ctx, ctx->dc_bios,
-                                       eng_id, vpg, afmt,
-                                       &stream_enc_regs[eng_id],
-                                       &se_shift, &se_mask);
-
-       return &enc1->base;
-}
-
-static struct hpo_dp_stream_encoder *dcn321_hpo_dp_stream_encoder_create(
-       enum engine_id eng_id,
-       struct dc_context *ctx)
-{
-       struct dcn31_hpo_dp_stream_encoder *hpo_dp_enc31;
-       struct vpg *vpg;
-       struct apg *apg;
-       uint32_t hpo_dp_inst;
-       uint32_t vpg_inst;
-       uint32_t apg_inst;
-
-       ASSERT((eng_id >= ENGINE_ID_HPO_DP_0) && (eng_id <= ENGINE_ID_HPO_DP_3));
-       hpo_dp_inst = eng_id - ENGINE_ID_HPO_DP_0;
-
-       /* Mapping of VPG register blocks to HPO DP block instance:
-        * VPG[6] -> HPO_DP[0]
-        * VPG[7] -> HPO_DP[1]
-        * VPG[8] -> HPO_DP[2]
-        * VPG[9] -> HPO_DP[3]
-        */
-       vpg_inst = hpo_dp_inst + 6;
-
-       /* Mapping of APG register blocks to HPO DP block instance:
-        * APG[0] -> HPO_DP[0]
-        * APG[1] -> HPO_DP[1]
-        * APG[2] -> HPO_DP[2]
-        * APG[3] -> HPO_DP[3]
-        */
-       apg_inst = hpo_dp_inst;
-
-       /* allocate HPO stream encoder and create VPG sub-block */
-       hpo_dp_enc31 = kzalloc(sizeof(struct dcn31_hpo_dp_stream_encoder), GFP_KERNEL);
-       vpg = dcn321_vpg_create(ctx, vpg_inst);
-       apg = dcn321_apg_create(ctx, apg_inst);
-
-       if (!hpo_dp_enc31 || !vpg || !apg) {
-               kfree(hpo_dp_enc31);
-               kfree(vpg);
-               kfree(apg);
-               return NULL;
-       }
-
-#undef REG_STRUCT
-#define REG_STRUCT hpo_dp_stream_enc_regs
-       hpo_dp_stream_encoder_reg_init(0),
-       hpo_dp_stream_encoder_reg_init(1),
-       hpo_dp_stream_encoder_reg_init(2),
-       hpo_dp_stream_encoder_reg_init(3);
-
-       dcn31_hpo_dp_stream_encoder_construct(hpo_dp_enc31, ctx, ctx->dc_bios,
-                                       hpo_dp_inst, eng_id, vpg, apg,
-                                       &hpo_dp_stream_enc_regs[hpo_dp_inst],
-                                       &hpo_dp_se_shift, &hpo_dp_se_mask);
-
-       return &hpo_dp_enc31->base;
-}
-
-static struct hpo_dp_link_encoder *dcn321_hpo_dp_link_encoder_create(
-       uint8_t inst,
-       struct dc_context *ctx)
-{
-       struct dcn31_hpo_dp_link_encoder *hpo_dp_enc31;
-
-       /* allocate HPO link encoder */
-       hpo_dp_enc31 = kzalloc(sizeof(struct dcn31_hpo_dp_link_encoder), GFP_KERNEL);
-
-#undef REG_STRUCT
-#define REG_STRUCT hpo_dp_link_enc_regs
-       hpo_dp_link_encoder_reg_init(0),
-       hpo_dp_link_encoder_reg_init(1);
-
-       hpo_dp_link_encoder32_construct(hpo_dp_enc31, ctx, inst,
-                                       &hpo_dp_link_enc_regs[inst],
-                                       &hpo_dp_le_shift, &hpo_dp_le_mask);
-
-       return &hpo_dp_enc31->base;
-}
-
-static struct dce_hwseq *dcn321_hwseq_create(
-       struct dc_context *ctx)
-{
-       struct dce_hwseq *hws = kzalloc(sizeof(struct dce_hwseq), GFP_KERNEL);
-
-#undef REG_STRUCT
-#define REG_STRUCT hwseq_reg
-       hwseq_reg_init();
-
-       if (hws) {
-               hws->ctx = ctx;
-               hws->regs = &hwseq_reg;
-               hws->shifts = &hwseq_shift;
-               hws->masks = &hwseq_mask;
-       }
-       return hws;
-}
-static const struct resource_create_funcs res_create_funcs = {
-       .read_dce_straps = read_dce_straps,
-       .create_audio = dcn321_create_audio,
-       .create_stream_encoder = dcn321_stream_encoder_create,
-       .create_hpo_dp_stream_encoder = dcn321_hpo_dp_stream_encoder_create,
-       .create_hpo_dp_link_encoder = dcn321_hpo_dp_link_encoder_create,
-       .create_hwseq = dcn321_hwseq_create,
-};
-
-static void dcn321_resource_destruct(struct dcn321_resource_pool *pool)
-{
-       unsigned int i;
-
-       for (i = 0; i < pool->base.stream_enc_count; i++) {
-               if (pool->base.stream_enc[i] != NULL) {
-                       if (pool->base.stream_enc[i]->vpg != NULL) {
-                               kfree(DCN30_VPG_FROM_VPG(pool->base.stream_enc[i]->vpg));
-                               pool->base.stream_enc[i]->vpg = NULL;
-                       }
-                       if (pool->base.stream_enc[i]->afmt != NULL) {
-                               kfree(DCN30_AFMT_FROM_AFMT(pool->base.stream_enc[i]->afmt));
-                               pool->base.stream_enc[i]->afmt = NULL;
-                       }
-                       kfree(DCN10STRENC_FROM_STRENC(pool->base.stream_enc[i]));
-                       pool->base.stream_enc[i] = NULL;
-               }
-       }
-
-       for (i = 0; i < pool->base.hpo_dp_stream_enc_count; i++) {
-               if (pool->base.hpo_dp_stream_enc[i] != NULL) {
-                       if (pool->base.hpo_dp_stream_enc[i]->vpg != NULL) {
-                               kfree(DCN30_VPG_FROM_VPG(pool->base.hpo_dp_stream_enc[i]->vpg));
-                               pool->base.hpo_dp_stream_enc[i]->vpg = NULL;
-                       }
-                       if (pool->base.hpo_dp_stream_enc[i]->apg != NULL) {
-                               kfree(DCN31_APG_FROM_APG(pool->base.hpo_dp_stream_enc[i]->apg));
-                               pool->base.hpo_dp_stream_enc[i]->apg = NULL;
-                       }
-                       kfree(DCN3_1_HPO_DP_STREAM_ENC_FROM_HPO_STREAM_ENC(pool->base.hpo_dp_stream_enc[i]));
-                       pool->base.hpo_dp_stream_enc[i] = NULL;
-               }
-       }
-
-       for (i = 0; i < pool->base.hpo_dp_link_enc_count; i++) {
-               if (pool->base.hpo_dp_link_enc[i] != NULL) {
-                       kfree(DCN3_1_HPO_DP_LINK_ENC_FROM_HPO_LINK_ENC(pool->base.hpo_dp_link_enc[i]));
-                       pool->base.hpo_dp_link_enc[i] = NULL;
-               }
-       }
-
-       for (i = 0; i < pool->base.res_cap->num_dsc; i++) {
-               if (pool->base.dscs[i] != NULL)
-                       dcn20_dsc_destroy(&pool->base.dscs[i]);
-       }
-
-       if (pool->base.mpc != NULL) {
-               kfree(TO_DCN20_MPC(pool->base.mpc));
-               pool->base.mpc = NULL;
-       }
-       if (pool->base.hubbub != NULL) {
-               kfree(TO_DCN20_HUBBUB(pool->base.hubbub));
-               pool->base.hubbub = NULL;
-       }
-       for (i = 0; i < pool->base.pipe_count; i++) {
-               if (pool->base.dpps[i] != NULL)
-                       dcn321_dpp_destroy(&pool->base.dpps[i]);
-
-               if (pool->base.ipps[i] != NULL)
-                       pool->base.ipps[i]->funcs->ipp_destroy(&pool->base.ipps[i]);
-
-               if (pool->base.hubps[i] != NULL) {
-                       kfree(TO_DCN20_HUBP(pool->base.hubps[i]));
-                       pool->base.hubps[i] = NULL;
-               }
-
-               if (pool->base.irqs != NULL)
-                       dal_irq_service_destroy(&pool->base.irqs);
-       }
-
-       for (i = 0; i < pool->base.res_cap->num_ddc; i++) {
-               if (pool->base.engines[i] != NULL)
-                       dce110_engine_destroy(&pool->base.engines[i]);
-               if (pool->base.hw_i2cs[i] != NULL) {
-                       kfree(pool->base.hw_i2cs[i]);
-                       pool->base.hw_i2cs[i] = NULL;
-               }
-               if (pool->base.sw_i2cs[i] != NULL) {
-                       kfree(pool->base.sw_i2cs[i]);
-                       pool->base.sw_i2cs[i] = NULL;
-               }
-       }
-
-       for (i = 0; i < pool->base.res_cap->num_opp; i++) {
-               if (pool->base.opps[i] != NULL)
-                       pool->base.opps[i]->funcs->opp_destroy(&pool->base.opps[i]);
-       }
-
-       for (i = 0; i < pool->base.res_cap->num_timing_generator; i++) {
-               if (pool->base.timing_generators[i] != NULL)    {
-                       kfree(DCN10TG_FROM_TG(pool->base.timing_generators[i]));
-                       pool->base.timing_generators[i] = NULL;
-               }
-       }
-
-       for (i = 0; i < pool->base.res_cap->num_dwb; i++) {
-               if (pool->base.dwbc[i] != NULL) {
-                       kfree(TO_DCN30_DWBC(pool->base.dwbc[i]));
-                       pool->base.dwbc[i] = NULL;
-               }
-               if (pool->base.mcif_wb[i] != NULL) {
-                       kfree(TO_DCN30_MMHUBBUB(pool->base.mcif_wb[i]));
-                       pool->base.mcif_wb[i] = NULL;
-               }
-       }
-
-       for (i = 0; i < pool->base.audio_count; i++) {
-               if (pool->base.audios[i])
-                       dce_aud_destroy(&pool->base.audios[i]);
-       }
-
-       for (i = 0; i < pool->base.clk_src_count; i++) {
-               if (pool->base.clock_sources[i] != NULL) {
-                       dcn20_clock_source_destroy(&pool->base.clock_sources[i]);
-                       pool->base.clock_sources[i] = NULL;
-               }
-       }
-
-       for (i = 0; i < pool->base.res_cap->num_mpc_3dlut; i++) {
-               if (pool->base.mpc_lut[i] != NULL) {
-                       dc_3dlut_func_release(pool->base.mpc_lut[i]);
-                       pool->base.mpc_lut[i] = NULL;
-               }
-               if (pool->base.mpc_shaper[i] != NULL) {
-                       dc_transfer_func_release(pool->base.mpc_shaper[i]);
-                       pool->base.mpc_shaper[i] = NULL;
-               }
-       }
-
-       if (pool->base.dp_clock_source != NULL) {
-               dcn20_clock_source_destroy(&pool->base.dp_clock_source);
-               pool->base.dp_clock_source = NULL;
-       }
-
-       for (i = 0; i < pool->base.res_cap->num_timing_generator; i++) {
-               if (pool->base.multiple_abms[i] != NULL)
-                       dce_abm_destroy(&pool->base.multiple_abms[i]);
-       }
-
-       if (pool->base.psr != NULL)
-               dmub_psr_destroy(&pool->base.psr);
-
-       if (pool->base.dccg != NULL)
-               dcn_dccg_destroy(&pool->base.dccg);
-
-       if (pool->base.oem_device != NULL) {
-               struct dc *dc = pool->base.oem_device->ctx->dc;
-
-               dc->link_srv->destroy_ddc_service(&pool->base.oem_device);
-       }
-}
-
-
-static bool dcn321_dwbc_create(struct dc_context *ctx, struct resource_pool *pool)
-{
-       int i;
-       uint32_t dwb_count = pool->res_cap->num_dwb;
-
-       for (i = 0; i < dwb_count; i++) {
-               struct dcn30_dwbc *dwbc30 = kzalloc(sizeof(struct dcn30_dwbc),
-                                                   GFP_KERNEL);
-
-               if (!dwbc30) {
-                       dm_error("DC: failed to create dwbc30!\n");
-                       return false;
-               }
-
-#undef REG_STRUCT
-#define REG_STRUCT dwbc30_regs
-               dwbc_regs_dcn3_init(0);
-
-               dcn30_dwbc_construct(dwbc30, ctx,
-                               &dwbc30_regs[i],
-                               &dwbc30_shift,
-                               &dwbc30_mask,
-                               i);
-
-               pool->dwbc[i] = &dwbc30->base;
-       }
-       return true;
-}
-
-static bool dcn321_mmhubbub_create(struct dc_context *ctx, struct resource_pool *pool)
-{
-       int i;
-       uint32_t dwb_count = pool->res_cap->num_dwb;
-
-       for (i = 0; i < dwb_count; i++) {
-               struct dcn30_mmhubbub *mcif_wb30 = kzalloc(sizeof(struct dcn30_mmhubbub),
-                                                   GFP_KERNEL);
-
-               if (!mcif_wb30) {
-                       dm_error("DC: failed to create mcif_wb30!\n");
-                       return false;
-               }
-
-#undef REG_STRUCT
-#define REG_STRUCT mcif_wb30_regs
-               mcif_wb_regs_dcn3_init(0);
-
-               dcn32_mmhubbub_construct(mcif_wb30, ctx,
-                               &mcif_wb30_regs[i],
-                               &mcif_wb30_shift,
-                               &mcif_wb30_mask,
-                               i);
-
-               pool->mcif_wb[i] = &mcif_wb30->base;
-       }
-       return true;
-}
-
-static struct display_stream_compressor *dcn321_dsc_create(
-       struct dc_context *ctx, uint32_t inst)
-{
-       struct dcn20_dsc *dsc =
-               kzalloc(sizeof(struct dcn20_dsc), GFP_KERNEL);
-
-       if (!dsc) {
-               BREAK_TO_DEBUGGER();
-               return NULL;
-       }
-
-#undef REG_STRUCT
-#define REG_STRUCT dsc_regs
-       dsc_regsDCN20_init(0),
-       dsc_regsDCN20_init(1),
-       dsc_regsDCN20_init(2),
-       dsc_regsDCN20_init(3);
-
-       dsc2_construct(dsc, ctx, inst, &dsc_regs[inst], &dsc_shift, &dsc_mask);
-
-       dsc->max_image_width = 6016;
-
-       return &dsc->base;
-}
-
-static void dcn321_destroy_resource_pool(struct resource_pool **pool)
-{
-       struct dcn321_resource_pool *dcn321_pool = TO_DCN321_RES_POOL(*pool);
-
-       dcn321_resource_destruct(dcn321_pool);
-       kfree(dcn321_pool);
-       *pool = NULL;
-}
-
-static struct dc_cap_funcs cap_funcs = {
-       .get_dcc_compression_cap = dcn20_get_dcc_compression_cap,
-       .get_subvp_en = dcn32_subvp_in_use,
-};
-
-static void dcn321_update_bw_bounding_box(struct dc *dc, struct clk_bw_params *bw_params)
-{
-       DC_FP_START();
-       dcn321_update_bw_bounding_box_fpu(dc, bw_params);
-       DC_FP_END();
-}
-
-static struct resource_funcs dcn321_res_pool_funcs = {
-       .destroy = dcn321_destroy_resource_pool,
-       .link_enc_create = dcn321_link_encoder_create,
-       .link_enc_create_minimal = NULL,
-       .panel_cntl_create = dcn32_panel_cntl_create,
-       .validate_bandwidth = dcn32_validate_bandwidth,
-       .calculate_wm_and_dlg = dcn32_calculate_wm_and_dlg,
-       .populate_dml_pipes = dcn32_populate_dml_pipes_from_context,
-       .acquire_free_pipe_as_secondary_dpp_pipe = dcn32_acquire_free_pipe_as_secondary_dpp_pipe,
-       .acquire_free_pipe_as_secondary_opp_head = dcn32_acquire_free_pipe_as_secondary_opp_head,
-       .release_pipe = dcn20_release_pipe,
-       .add_stream_to_ctx = dcn30_add_stream_to_ctx,
-       .add_dsc_to_stream_resource = dcn20_add_dsc_to_stream_resource,
-       .remove_stream_from_ctx = dcn20_remove_stream_from_ctx,
-       .populate_dml_writeback_from_context = dcn30_populate_dml_writeback_from_context,
-       .set_mcif_arb_params = dcn30_set_mcif_arb_params,
-       .find_first_free_match_stream_enc_for_link = dcn10_find_first_free_match_stream_enc_for_link,
-       .acquire_post_bldn_3dlut = dcn32_acquire_post_bldn_3dlut,
-       .release_post_bldn_3dlut = dcn32_release_post_bldn_3dlut,
-       .update_bw_bounding_box = dcn321_update_bw_bounding_box,
-       .patch_unknown_plane_state = dcn20_patch_unknown_plane_state,
-       .update_soc_for_wm_a = dcn30_update_soc_for_wm_a,
-       .add_phantom_pipes = dcn32_add_phantom_pipes,
-       .remove_phantom_pipes = dcn32_remove_phantom_pipes,
-       .retain_phantom_pipes = dcn32_retain_phantom_pipes,
-       .save_mall_state = dcn32_save_mall_state,
-       .restore_mall_state = dcn32_restore_mall_state,
-};
-
-static uint32_t read_pipe_fuses(struct dc_context *ctx)
-{
-       uint32_t value = REG_READ(CC_DC_PIPE_DIS);
-       /* DCN321 support max 4 pipes */
-       value = value & 0xf;
-       return value;
-}
-
-
-static bool dcn321_resource_construct(
-       uint8_t num_virtual_links,
-       struct dc *dc,
-       struct dcn321_resource_pool *pool)
-{
-       int i, j;
-       struct dc_context *ctx = dc->ctx;
-       struct irq_service_init_data init_data;
-       struct ddc_service_init_data ddc_init_data = {0};
-       uint32_t pipe_fuses = 0;
-       uint32_t num_pipes  = 4;
-
-#undef REG_STRUCT
-#define REG_STRUCT bios_regs
-       bios_regs_init();
-
-#undef REG_STRUCT
-#define REG_STRUCT clk_src_regs
-       clk_src_regs_init(0, A),
-       clk_src_regs_init(1, B),
-       clk_src_regs_init(2, C),
-       clk_src_regs_init(3, D),
-       clk_src_regs_init(4, E);
-
-#undef REG_STRUCT
-#define REG_STRUCT abm_regs
-       abm_regs_init(0),
-       abm_regs_init(1),
-       abm_regs_init(2),
-       abm_regs_init(3);
-
-#undef REG_STRUCT
-#define REG_STRUCT dccg_regs
-       dccg_regs_init();
-
-
-       ctx->dc_bios->regs = &bios_regs;
-
-       pool->base.res_cap = &res_cap_dcn321;
-       /* max number of pipes for ASIC before checking for pipe fuses */
-       num_pipes  = pool->base.res_cap->num_timing_generator;
-       pipe_fuses = read_pipe_fuses(ctx);
-
-       for (i = 0; i < pool->base.res_cap->num_timing_generator; i++)
-               if (pipe_fuses & 1 << i)
-                       num_pipes--;
-
-       if (pipe_fuses & 1)
-               ASSERT(0); //Unexpected - Pipe 0 should always be fully functional!
-
-       if (pipe_fuses & CC_DC_PIPE_DIS__DC_FULL_DIS_MASK)
-               ASSERT(0); //Entire DCN is harvested!
-
-       /* within dml lib, initial value is hard coded, if ASIC pipe is fused, the
-        * value will be changed, update max_num_dpp and max_num_otg for dml.
-        */
-       dcn3_21_ip.max_num_dpp = num_pipes;
-       dcn3_21_ip.max_num_otg = num_pipes;
-
-       pool->base.funcs = &dcn321_res_pool_funcs;
-
-       /*************************************************
-        *  Resource + asic cap harcoding                *
-        *************************************************/
-       pool->base.underlay_pipe_index = NO_UNDERLAY_PIPE;
-       pool->base.timing_generator_count = num_pipes;
-       pool->base.pipe_count = num_pipes;
-       pool->base.mpcc_count = num_pipes;
-       dc->caps.max_downscale_ratio = 600;
-       dc->caps.i2c_speed_in_khz = 100;
-       dc->caps.i2c_speed_in_khz_hdcp = 100; /*1.4 w/a applied by default*/
-       /* TODO: Bring max cursor size back to 256 after subvp cursor corruption is fixed*/
-       dc->caps.max_cursor_size = 64;
-       dc->caps.min_horizontal_blanking_period = 80;
-       dc->caps.dmdata_alloc_size = 2048;
-       dc->caps.mall_size_per_mem_channel = 4;
-       dc->caps.mall_size_total = 0;
-       dc->caps.cursor_cache_size = dc->caps.max_cursor_size * dc->caps.max_cursor_size * 8;
-       dc->caps.cache_line_size = 64;
-       dc->caps.cache_num_ways = 16;
-
-       /* Calculate the available MALL space */
-       dc->caps.max_cab_allocation_bytes = dcn32_calc_num_avail_chans_for_mall(
-               dc, dc->ctx->dc_bios->vram_info.num_chans) *
-               dc->caps.mall_size_per_mem_channel * 1024 * 1024;
-       dc->caps.mall_size_total = dc->caps.max_cab_allocation_bytes;
-
-       dc->caps.subvp_fw_processing_delay_us = 15;
-       dc->caps.subvp_drr_max_vblank_margin_us = 40;
-       dc->caps.subvp_prefetch_end_to_mall_start_us = 15;
-       dc->caps.subvp_swath_height_margin_lines = 16;
-       dc->caps.subvp_pstate_allow_width_us = 20;
-       dc->caps.subvp_vertical_int_margin_us = 30;
-       dc->caps.subvp_drr_vblank_start_margin_us = 100; // 100us margin
-       dc->caps.max_slave_planes = 2;
-       dc->caps.max_slave_yuv_planes = 2;
-       dc->caps.max_slave_rgb_planes = 2;
-       dc->caps.post_blend_color_processing = true;
-       dc->caps.force_dp_tps4_for_cp2520 = true;
-       dc->caps.dp_hpo = true;
-       dc->caps.dp_hdmi21_pcon_support = true;
-       dc->caps.edp_dsc_support = true;
-       dc->caps.extended_aux_timeout_support = true;
-       dc->caps.dmcub_support = true;
-       dc->caps.max_v_total = (1 << 15) - 1;
-
-       /* Color pipeline capabilities */
-       dc->caps.color.dpp.dcn_arch = 1;
-       dc->caps.color.dpp.input_lut_shared = 0;
-       dc->caps.color.dpp.icsc = 1;
-       dc->caps.color.dpp.dgam_ram = 0; // must use gamma_corr
-       dc->caps.color.dpp.dgam_rom_caps.srgb = 1;
-       dc->caps.color.dpp.dgam_rom_caps.bt2020 = 1;
-       dc->caps.color.dpp.dgam_rom_caps.gamma2_2 = 1;
-       dc->caps.color.dpp.dgam_rom_caps.pq = 1;
-       dc->caps.color.dpp.dgam_rom_caps.hlg = 1;
-       dc->caps.color.dpp.post_csc = 1;
-       dc->caps.color.dpp.gamma_corr = 1;
-       dc->caps.color.dpp.dgam_rom_for_yuv = 0;
-
-       dc->caps.color.dpp.hw_3d_lut = 1;
-       dc->caps.color.dpp.ogam_ram = 1;
-       // no OGAM ROM on DCN2 and later ASICs
-       dc->caps.color.dpp.ogam_rom_caps.srgb = 0;
-       dc->caps.color.dpp.ogam_rom_caps.bt2020 = 0;
-       dc->caps.color.dpp.ogam_rom_caps.gamma2_2 = 0;
-       dc->caps.color.dpp.ogam_rom_caps.pq = 0;
-       dc->caps.color.dpp.ogam_rom_caps.hlg = 0;
-       dc->caps.color.dpp.ocsc = 0;
-
-       dc->caps.color.mpc.gamut_remap = 1;
-       dc->caps.color.mpc.num_3dluts = pool->base.res_cap->num_mpc_3dlut; //4, configurable to be before or after BLND in MPCC
-       dc->caps.color.mpc.ogam_ram = 1;
-       dc->caps.color.mpc.ogam_rom_caps.srgb = 0;
-       dc->caps.color.mpc.ogam_rom_caps.bt2020 = 0;
-       dc->caps.color.mpc.ogam_rom_caps.gamma2_2 = 0;
-       dc->caps.color.mpc.ogam_rom_caps.pq = 0;
-       dc->caps.color.mpc.ogam_rom_caps.hlg = 0;
-       dc->caps.color.mpc.ocsc = 1;
-
-       dc->config.dc_mode_clk_limit_support = true;
-       /* read VBIOS LTTPR caps */
-       {
-               if (ctx->dc_bios->funcs->get_lttpr_caps) {
-                       enum bp_result bp_query_result;
-                       uint8_t is_vbios_lttpr_enable = 0;
-
-                       bp_query_result = ctx->dc_bios->funcs->get_lttpr_caps(ctx->dc_bios, &is_vbios_lttpr_enable);
-                       dc->caps.vbios_lttpr_enable = (bp_query_result == BP_RESULT_OK) && !!is_vbios_lttpr_enable;
-               }
-
-               /* interop bit is implicit */
-               {
-                       dc->caps.vbios_lttpr_aware = true;
-               }
-       }
-
-       if (dc->ctx->dce_environment == DCE_ENV_PRODUCTION_DRV)
-               dc->debug = debug_defaults_drv;
-
-       // Init the vm_helper
-       if (dc->vm_helper)
-               vm_helper_init(dc->vm_helper, 16);
-
-       /*************************************************
-        *  Create resources                             *
-        *************************************************/
-
-       /* Clock Sources for Pixel Clock*/
-       pool->base.clock_sources[DCN321_CLK_SRC_PLL0] =
-                       dcn321_clock_source_create(ctx, ctx->dc_bios,
-                               CLOCK_SOURCE_COMBO_PHY_PLL0,
-                               &clk_src_regs[0], false);
-       pool->base.clock_sources[DCN321_CLK_SRC_PLL1] =
-                       dcn321_clock_source_create(ctx, ctx->dc_bios,
-                               CLOCK_SOURCE_COMBO_PHY_PLL1,
-                               &clk_src_regs[1], false);
-       pool->base.clock_sources[DCN321_CLK_SRC_PLL2] =
-                       dcn321_clock_source_create(ctx, ctx->dc_bios,
-                               CLOCK_SOURCE_COMBO_PHY_PLL2,
-                               &clk_src_regs[2], false);
-       pool->base.clock_sources[DCN321_CLK_SRC_PLL3] =
-                       dcn321_clock_source_create(ctx, ctx->dc_bios,
-                               CLOCK_SOURCE_COMBO_PHY_PLL3,
-                               &clk_src_regs[3], false);
-       pool->base.clock_sources[DCN321_CLK_SRC_PLL4] =
-                       dcn321_clock_source_create(ctx, ctx->dc_bios,
-                               CLOCK_SOURCE_COMBO_PHY_PLL4,
-                               &clk_src_regs[4], false);
-
-       pool->base.clk_src_count = DCN321_CLK_SRC_TOTAL;
-
-       /* todo: not reuse phy_pll registers */
-       pool->base.dp_clock_source =
-                       dcn321_clock_source_create(ctx, ctx->dc_bios,
-                               CLOCK_SOURCE_ID_DP_DTO,
-                               &clk_src_regs[0], true);
-
-       for (i = 0; i < pool->base.clk_src_count; i++) {
-               if (pool->base.clock_sources[i] == NULL) {
-                       dm_error("DC: failed to create clock sources!\n");
-                       BREAK_TO_DEBUGGER();
-                       goto create_fail;
-               }
-       }
-
-       /* DCCG */
-       pool->base.dccg = dccg32_create(ctx, &dccg_regs, &dccg_shift, &dccg_mask);
-       if (pool->base.dccg == NULL) {
-               dm_error("DC: failed to create dccg!\n");
-               BREAK_TO_DEBUGGER();
-               goto create_fail;
-       }
-
-       /* DML */
-       dml_init_instance(&dc->dml, &dcn3_21_soc, &dcn3_21_ip, DML_PROJECT_DCN32);
-
-       /* IRQ Service */
-       init_data.ctx = dc->ctx;
-       pool->base.irqs = dal_irq_service_dcn32_create(&init_data);
-       if (!pool->base.irqs)
-               goto create_fail;
-
-       /* HUBBUB */
-       pool->base.hubbub = dcn321_hubbub_create(ctx);
-       if (pool->base.hubbub == NULL) {
-               BREAK_TO_DEBUGGER();
-               dm_error("DC: failed to create hubbub!\n");
-               goto create_fail;
-       }
-
-       /* HUBPs, DPPs, OPPs, TGs, ABMs */
-       for (i = 0, j = 0; i < pool->base.res_cap->num_timing_generator; i++) {
-
-               /* if pipe is disabled, skip instance of HW pipe,
-                * i.e, skip ASIC register instance
-                */
-               if (pipe_fuses & 1 << i)
-                       continue;
-
-               pool->base.hubps[j] = dcn321_hubp_create(ctx, i);
-               if (pool->base.hubps[j] == NULL) {
-                       BREAK_TO_DEBUGGER();
-                       dm_error(
-                               "DC: failed to create hubps!\n");
-                       goto create_fail;
-               }
-
-               pool->base.dpps[j] = dcn321_dpp_create(ctx, i);
-               if (pool->base.dpps[j] == NULL) {
-                       BREAK_TO_DEBUGGER();
-                       dm_error(
-                               "DC: failed to create dpps!\n");
-                       goto create_fail;
-               }
-
-               pool->base.opps[j] = dcn321_opp_create(ctx, i);
-               if (pool->base.opps[j] == NULL) {
-                       BREAK_TO_DEBUGGER();
-                       dm_error(
-                               "DC: failed to create output pixel processor!\n");
-                       goto create_fail;
-               }
-
-               pool->base.timing_generators[j] = dcn321_timing_generator_create(
-                               ctx, i);
-               if (pool->base.timing_generators[j] == NULL) {
-                       BREAK_TO_DEBUGGER();
-                       dm_error("DC: failed to create tg!\n");
-                       goto create_fail;
-               }
-
-               pool->base.multiple_abms[j] = dmub_abm_create(ctx,
-                               &abm_regs[i],
-                               &abm_shift,
-                               &abm_mask);
-               if (pool->base.multiple_abms[j] == NULL) {
-                       dm_error("DC: failed to create abm for pipe %d!\n", i);
-                       BREAK_TO_DEBUGGER();
-                       goto create_fail;
-               }
-
-               /* index for resource pool arrays for next valid pipe */
-               j++;
-       }
-
-       /* PSR */
-       pool->base.psr = dmub_psr_create(ctx);
-       if (pool->base.psr == NULL) {
-               dm_error("DC: failed to create psr obj!\n");
-               BREAK_TO_DEBUGGER();
-               goto create_fail;
-       }
-
-       /* MPCCs */
-       pool->base.mpc = dcn321_mpc_create(ctx,  pool->base.res_cap->num_timing_generator, pool->base.res_cap->num_mpc_3dlut);
-       if (pool->base.mpc == NULL) {
-               BREAK_TO_DEBUGGER();
-               dm_error("DC: failed to create mpc!\n");
-               goto create_fail;
-       }
-
-       /* DSCs */
-       for (i = 0; i < pool->base.res_cap->num_dsc; i++) {
-               pool->base.dscs[i] = dcn321_dsc_create(ctx, i);
-               if (pool->base.dscs[i] == NULL) {
-                       BREAK_TO_DEBUGGER();
-                       dm_error("DC: failed to create display stream compressor %d!\n", i);
-                       goto create_fail;
-               }
-       }
-
-       /* DWB */
-       if (!dcn321_dwbc_create(ctx, &pool->base)) {
-               BREAK_TO_DEBUGGER();
-               dm_error("DC: failed to create dwbc!\n");
-               goto create_fail;
-       }
-
-       /* MMHUBBUB */
-       if (!dcn321_mmhubbub_create(ctx, &pool->base)) {
-               BREAK_TO_DEBUGGER();
-               dm_error("DC: failed to create mcif_wb!\n");
-               goto create_fail;
-       }
-
-       /* AUX and I2C */
-       for (i = 0; i < pool->base.res_cap->num_ddc; i++) {
-               pool->base.engines[i] = dcn321_aux_engine_create(ctx, i);
-               if (pool->base.engines[i] == NULL) {
-                       BREAK_TO_DEBUGGER();
-                       dm_error(
-                               "DC:failed to create aux engine!!\n");
-                       goto create_fail;
-               }
-               pool->base.hw_i2cs[i] = dcn321_i2c_hw_create(ctx, i);
-               if (pool->base.hw_i2cs[i] == NULL) {
-                       BREAK_TO_DEBUGGER();
-                       dm_error(
-                               "DC:failed to create hw i2c!!\n");
-                       goto create_fail;
-               }
-               pool->base.sw_i2cs[i] = NULL;
-       }
-
-       /* Audio, HWSeq, Stream Encoders including HPO and virtual, MPC 3D LUTs */
-       if (!resource_construct(num_virtual_links, dc, &pool->base,
-                       &res_create_funcs))
-               goto create_fail;
-
-       /* HW Sequencer init functions and Plane caps */
-       dcn32_hw_sequencer_init_functions(dc);
-
-       dc->caps.max_planes =  pool->base.pipe_count;
-
-       for (i = 0; i < dc->caps.max_planes; ++i)
-               dc->caps.planes[i] = plane_cap;
-
-       dc->cap_funcs = cap_funcs;
-
-       if (dc->ctx->dc_bios->fw_info.oem_i2c_present) {
-               ddc_init_data.ctx = dc->ctx;
-               ddc_init_data.link = NULL;
-               ddc_init_data.id.id = dc->ctx->dc_bios->fw_info.oem_i2c_obj_id;
-               ddc_init_data.id.enum_id = 0;
-               ddc_init_data.id.type = OBJECT_TYPE_GENERIC;
-               pool->base.oem_device = dc->link_srv->create_ddc_service(&ddc_init_data);
-       } else {
-               pool->base.oem_device = NULL;
-       }
-
-       dc->dml2_options.dcn_pipe_count = pool->base.pipe_count;
-       dc->dml2_options.use_native_pstate_optimization = false;
-       dc->dml2_options.use_native_soc_bb_construction = true;
-       dc->dml2_options.minimize_dispclk_using_odm = true;
-
-       dc->dml2_options.callbacks.dc = dc;
-       dc->dml2_options.callbacks.build_scaling_params = &resource_build_scaling_params;
-       dc->dml2_options.callbacks.can_support_mclk_switch_using_fw_based_vblank_stretch = &dcn30_can_support_mclk_switch_using_fw_based_vblank_stretch;
-       dc->dml2_options.callbacks.acquire_secondary_pipe_for_mpc_odm = &dc_resource_acquire_secondary_pipe_for_mpc_odm_legacy;
-       dc->dml2_options.callbacks.update_pipes_for_stream_with_slice_count = &resource_update_pipes_for_stream_with_slice_count;
-       dc->dml2_options.callbacks.update_pipes_for_plane_with_slice_count = &resource_update_pipes_for_plane_with_slice_count;
-       dc->dml2_options.callbacks.get_mpc_slice_index = &resource_get_mpc_slice_index;
-       dc->dml2_options.callbacks.get_odm_slice_index = &resource_get_odm_slice_index;
-       dc->dml2_options.callbacks.get_opp_head = &resource_get_opp_head;
-
-       dc->dml2_options.svp_pstate.callbacks.dc = dc;
-       dc->dml2_options.svp_pstate.callbacks.add_plane_to_context = &dc_add_plane_to_context;
-       dc->dml2_options.svp_pstate.callbacks.add_stream_to_ctx = &dc_add_stream_to_ctx;
-       dc->dml2_options.svp_pstate.callbacks.build_scaling_params = &resource_build_scaling_params;
-       dc->dml2_options.svp_pstate.callbacks.create_plane = &dc_create_plane_state;
-       dc->dml2_options.svp_pstate.callbacks.remove_plane_from_context = &dc_remove_plane_from_context;
-       dc->dml2_options.svp_pstate.callbacks.remove_stream_from_ctx = &dc_remove_stream_from_ctx;
-       dc->dml2_options.svp_pstate.callbacks.create_stream_for_sink = &dc_create_stream_for_sink;
-       dc->dml2_options.svp_pstate.callbacks.plane_state_release = &dc_plane_state_release;
-       dc->dml2_options.svp_pstate.callbacks.stream_release = &dc_stream_release;
-       dc->dml2_options.svp_pstate.callbacks.release_dsc = &dcn20_release_dsc;
-
-       dc->dml2_options.svp_pstate.subvp_fw_processing_delay_us = dc->caps.subvp_fw_processing_delay_us;
-       dc->dml2_options.svp_pstate.subvp_prefetch_end_to_mall_start_us = dc->caps.subvp_prefetch_end_to_mall_start_us;
-       dc->dml2_options.svp_pstate.subvp_pstate_allow_width_us = dc->caps.subvp_pstate_allow_width_us;
-       dc->dml2_options.svp_pstate.subvp_swath_height_margin_lines = dc->caps.subvp_swath_height_margin_lines;
-
-       dc->dml2_options.svp_pstate.force_disable_subvp = dc->debug.force_disable_subvp;
-       dc->dml2_options.svp_pstate.force_enable_subvp = dc->debug.force_subvp_mclk_switch;
-
-       dc->dml2_options.mall_cfg.cache_line_size_bytes = dc->caps.cache_line_size;
-       dc->dml2_options.mall_cfg.cache_num_ways = dc->caps.cache_num_ways;
-       dc->dml2_options.mall_cfg.max_cab_allocation_bytes = dc->caps.max_cab_allocation_bytes;
-       dc->dml2_options.mall_cfg.mblk_height_4bpe_pixels = DCN3_2_MBLK_HEIGHT_4BPE;
-       dc->dml2_options.mall_cfg.mblk_height_8bpe_pixels = DCN3_2_MBLK_HEIGHT_8BPE;
-       dc->dml2_options.mall_cfg.mblk_size_bytes = DCN3_2_MALL_MBLK_SIZE_BYTES;
-       dc->dml2_options.mall_cfg.mblk_width_pixels = DCN3_2_MBLK_WIDTH;
-
-       dc->dml2_options.max_segments_per_hubp = 18;
-       dc->dml2_options.det_segment_size = DCN3_2_DET_SEG_SIZE;
-
-       return true;
-
-create_fail:
-
-       dcn321_resource_destruct(pool);
-
-       return false;
-}
-
-struct resource_pool *dcn321_create_resource_pool(
-               const struct dc_init_data *init_data,
-               struct dc *dc)
-{
-       struct dcn321_resource_pool *pool =
-               kzalloc(sizeof(struct dcn321_resource_pool), GFP_KERNEL);
-
-       if (!pool)
-               return NULL;
-
-       if (dcn321_resource_construct(init_data->num_virtual_links, dc, pool))
-               return &pool->base;
-
-       BREAK_TO_DEBUGGER();
-       kfree(pool);
-       return NULL;
-}
diff --git a/drivers/gpu/drm/amd/display/dc/dcn321/dcn321_resource.h b/drivers/gpu/drm/amd/display/dc/dcn321/dcn321_resource.h
deleted file mode 100644 (file)
index 82cbf00..0000000
+++ /dev/null
@@ -1,45 +0,0 @@
-/*
- * 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
- *
- */
-
-#ifndef _DCN321_RESOURCE_H_
-#define _DCN321_RESOURCE_H_
-
-#include "core_types.h"
-
-#define TO_DCN321_RES_POOL(pool)\
-       container_of(pool, struct dcn321_resource_pool, base)
-
-extern struct _vcs_dpi_ip_params_st dcn3_21_ip;
-extern struct _vcs_dpi_soc_bounding_box_st dcn3_21_soc;
-
-struct dcn321_resource_pool {
-       struct resource_pool base;
-};
-
-struct resource_pool *dcn321_create_resource_pool(
-               const struct dc_init_data *init_data,
-               struct dc *dc);
-
-#endif /* _DCN321_RESOURCE_H_ */
index 20d0eef1a13bfd9293034502fda1e63af81107e7..719afb5a3b127a19061e029a75a73bc9c0e699bf 100644 (file)
@@ -10,7 +10,7 @@
 #
 # Makefile for DCN35.
 
-DCN35 = dcn35_resource.o dcn35_init.o dcn35_dio_stream_encoder.o \
+DCN35 = dcn35_init.o dcn35_dio_stream_encoder.o \
        dcn35_dio_link_encoder.o dcn35_dccg.o dcn35_optc.o \
        dcn35_dsc.o dcn35_hubp.o dcn35_hubbub.o \
        dcn35_mmhubbub.o dcn35_opp.o dcn35_dpp.o dcn35_pg_cntl.o dcn35_dwb.o
diff --git a/drivers/gpu/drm/amd/display/dc/dcn35/dcn35_resource.c b/drivers/gpu/drm/amd/display/dc/dcn35/dcn35_resource.c
deleted file mode 100644 (file)
index 7a3faf2..0000000
+++ /dev/null
@@ -1,2141 +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 "dm_services.h"
-#include "dc.h"
-
-#include "dcn31/dcn31_init.h"
-#include "dcn35/dcn35_init.h"
-
-#include "resource.h"
-#include "include/irq_service_interface.h"
-#include "dcn35_resource.h"
-#include "dml2/dml2_wrapper.h"
-
-#include "dcn20/dcn20_resource.h"
-#include "dcn30/dcn30_resource.h"
-#include "dcn31/dcn31_resource.h"
-#include "dcn32/dcn32_resource.h"
-
-#include "dcn10/dcn10_ipp.h"
-#include "dcn30/dcn30_hubbub.h"
-#include "dcn31/dcn31_hubbub.h"
-#include "dcn35/dcn35_hubbub.h"
-#include "dcn32/dcn32_mpc.h"
-#include "dcn35/dcn35_hubp.h"
-#include "irq/dcn35/irq_service_dcn35.h"
-#include "dcn35/dcn35_dpp.h"
-#include "dcn35/dcn35_optc.h"
-#include "dcn20/dcn20_hwseq.h"
-#include "dcn30/dcn30_hwseq.h"
-#include "dce110/dce110_hwseq.h"
-#include "dcn35/dcn35_opp.h"
-#include "dcn35/dcn35_dsc.h"
-#include "dcn30/dcn30_vpg.h"
-#include "dcn30/dcn30_afmt.h"
-#include "dcn31/dcn31_dio_link_encoder.h"
-#include "dcn35/dcn35_dio_stream_encoder.h"
-#include "dcn31/dcn31_hpo_dp_stream_encoder.h"
-#include "dcn31/dcn31_hpo_dp_link_encoder.h"
-#include "dcn32/dcn32_hpo_dp_link_encoder.h"
-#include "link.h"
-#include "dcn31/dcn31_apg.h"
-#include "dcn32/dcn32_dio_link_encoder.h"
-#include "dcn31/dcn31_vpg.h"
-#include "dcn31/dcn31_afmt.h"
-#include "dce/dce_clock_source.h"
-#include "dce/dce_audio.h"
-#include "dce/dce_hwseq.h"
-#include "clk_mgr.h"
-#include "virtual/virtual_stream_encoder.h"
-#include "dce110/dce110_resource.h"
-#include "dml/display_mode_vba.h"
-#include "dcn35/dcn35_dccg.h"
-#include "dcn35/dcn35_pg_cntl.h"
-#include "dcn10/dcn10_resource.h"
-#include "dcn31/dcn31_panel_cntl.h"
-#include "dcn35/dcn35_hwseq.h"
-#include "dcn35_dio_link_encoder.h"
-#include "dml/dcn31/dcn31_fpu.h" /*todo*/
-#include "dml/dcn35/dcn35_fpu.h"
-#include "dcn35/dcn35_dwb.h"
-#include "dcn35/dcn35_mmhubbub.h"
-
-#include "dcn/dcn_3_5_0_offset.h"
-#include "dcn/dcn_3_5_0_sh_mask.h"
-#include "nbio/nbio_7_11_0_offset.h"
-#include "mmhub/mmhub_3_3_0_offset.h"
-#include "mmhub/mmhub_3_3_0_sh_mask.h"
-
-#define DSCC0_DSCC_CONFIG0__ICH_RESET_AT_END_OF_LINE__SHIFT                   0x0
-#define DSCC0_DSCC_CONFIG0__ICH_RESET_AT_END_OF_LINE_MASK                     0x0000000FL
-
-#include "reg_helper.h"
-#include "dce/dmub_abm.h"
-#include "dce/dmub_psr.h"
-#include "dce/dce_aux.h"
-#include "dce/dce_i2c.h"
-#include "dml/dcn31/display_mode_vba_31.h" /*temp*/
-#include "vm_helper.h"
-#include "dcn20/dcn20_vmid.h"
-
-#include "link_enc_cfg.h"
-#define DC_LOGGER_INIT(logger)
-
-enum dcn35_clk_src_array_id {
-       DCN35_CLK_SRC_PLL0,
-       DCN35_CLK_SRC_PLL1,
-       DCN35_CLK_SRC_PLL2,
-       DCN35_CLK_SRC_PLL3,
-       DCN35_CLK_SRC_PLL4,
-       DCN35_CLK_SRC_TOTAL
-};
-
-/* begin *********************
- * macros to expend register list macro defined in HW object header file
- */
-
-/* DCN */
-/* TODO awful hack. fixup dcn20_dwb.h */
-#undef BASE_INNER
-#define BASE_INNER(seg) ctx->dcn_reg_offsets[seg]
-
-#define BASE(seg) BASE_INNER(seg)
-
-#define SR(reg_name)\
-               REG_STRUCT.reg_name = BASE(reg ## reg_name ## _BASE_IDX) +  \
-                                       reg ## reg_name
-
-#define SR_ARR(reg_name, id) \
-       REG_STRUCT[id].reg_name = BASE(reg##reg_name##_BASE_IDX) + reg##reg_name
-
-#define SR_ARR_INIT(reg_name, id, value) \
-       REG_STRUCT[id].reg_name = value
-
-#define SRI(reg_name, block, id)\
-       REG_STRUCT.reg_name = BASE(reg ## block ## id ## _ ## reg_name ## _BASE_IDX) + \
-                                       reg ## block ## id ## _ ## reg_name
-
-#define SRI_ARR(reg_name, block, id)\
-       REG_STRUCT[id].reg_name = BASE(reg ## block ## id ## _ ## reg_name ## _BASE_IDX) + \
-               reg ## block ## id ## _ ## reg_name
-
-#define SR_ARR_I2C(reg_name, id) \
-       REG_STRUCT[id-1].reg_name = BASE(reg##reg_name##_BASE_IDX) + reg##reg_name
-
-#define SRI_ARR_I2C(reg_name, block, id)\
-       REG_STRUCT[id-1].reg_name = BASE(reg ## block ## id ## _ ## reg_name ## _BASE_IDX) + \
-               reg ## block ## id ## _ ## reg_name
-
-#define SRI_ARR_ALPHABET(reg_name, block, index, id)\
-       REG_STRUCT[index].reg_name = BASE(reg ## block ## id ## _ ## reg_name ## _BASE_IDX) + \
-               reg ## block ## id ## _ ## reg_name
-
-#define SRI2(reg_name, block, id)\
-       .reg_name = BASE(reg ## reg_name ## _BASE_IDX) + \
-                                       reg ## reg_name
-
-#define SRI2_ARR(reg_name, block, id)\
-       REG_STRUCT[id].reg_name = BASE(reg ## reg_name ## _BASE_IDX) +  \
-               reg ## reg_name
-
-#define SRIR(var_name, reg_name, block, id)\
-       .var_name = BASE(reg ## block ## id ## _ ## reg_name ## _BASE_IDX) + \
-                                       reg ## block ## id ## _ ## reg_name
-
-#define SRII(reg_name, block, id)\
-       REG_STRUCT.reg_name[id] = BASE(reg ## block ## id ## _ ## reg_name ## _BASE_IDX) + \
-                                       reg ## block ## id ## _ ## reg_name
-
-#define SRII_ARR_2(reg_name, block, id, inst)\
-       REG_STRUCT[inst].reg_name[id] = BASE(reg ## block ## id ## _ ## reg_name ## _BASE_IDX) + \
-               reg ## block ## id ## _ ## reg_name
-
-#define SRII_MPC_RMU(reg_name, block, id)\
-       .RMU##_##reg_name[id] = BASE(reg ## block ## id ## _ ## reg_name ## _BASE_IDX) + \
-                                       reg ## block ## id ## _ ## reg_name
-
-#define SRII_DWB(reg_name, temp_name, block, id)\
-       REG_STRUCT.reg_name[id] = BASE(reg ## block ## id ## _ ## temp_name ## _BASE_IDX) + \
-               reg ## block ## id ## _ ## temp_name
-
-#define SF_DWB2(reg_name, block, id, field_name, post_fix) \
-       .field_name = reg_name ## __ ## field_name ## post_fix
-
-#define DCCG_SRII(reg_name, block, id)\
-       REG_STRUCT.block ## _ ## reg_name[id] = BASE(reg ## block ## id ## _ ## reg_name ## _BASE_IDX) + \
-               reg ## block ## id ## _ ## reg_name
-
-#define VUPDATE_SRII(reg_name, block, id)\
-       REG_STRUCT.reg_name[id] = BASE(reg ## reg_name ## _ ## block ## id ## _BASE_IDX) + \
-               reg ## reg_name ## _ ## block ## id
-
-/* NBIO */
-#define NBIO_BASE_INNER(seg) ctx->nbio_reg_offsets[seg]
-
-#define NBIO_BASE(seg) \
-       NBIO_BASE_INNER(seg)
-
-#define NBIO_SR(reg_name)\
-       REG_STRUCT.reg_name = NBIO_BASE(regBIF_BX2_ ## reg_name ## _BASE_IDX) + \
-                               regBIF_BX2_ ## reg_name
-
-#define NBIO_SR_ARR(reg_name, id)\
-       REG_STRUCT[id].reg_name = NBIO_BASE(regBIF_BX2_ ## reg_name ## _BASE_IDX) + \
-               regBIF_BX2_ ## reg_name
-
-#define bios_regs_init() \
-               ( \
-               NBIO_SR(BIOS_SCRATCH_3),\
-               NBIO_SR(BIOS_SCRATCH_6)\
-               )
-
-static struct bios_registers bios_regs;
-
-#define clk_src_regs_init(index, pllid)\
-       CS_COMMON_REG_LIST_DCN3_0_RI(index, pllid)
-
-static struct dce110_clk_src_regs clk_src_regs[5];
-
-static const struct dce110_clk_src_shift cs_shift = {
-               CS_COMMON_MASK_SH_LIST_DCN3_1_4(__SHIFT)
-};
-
-static const struct dce110_clk_src_mask cs_mask = {
-               CS_COMMON_MASK_SH_LIST_DCN3_1_4(_MASK)
-};
-
-#define abm_regs_init(id)\
-               ABM_DCN32_REG_LIST_RI(id)
-
-static struct dce_abm_registers abm_regs[4];
-
-static const struct dce_abm_shift abm_shift = {
-               ABM_MASK_SH_LIST_DCN35(__SHIFT)
-};
-
-static const struct dce_abm_mask abm_mask = {
-               ABM_MASK_SH_LIST_DCN35(_MASK)
-};
-
-#define audio_regs_init(id)\
-               AUD_COMMON_REG_LIST_RI(id)
-
-static struct dce_audio_registers audio_regs[7];
-
-
-#define DCE120_AUD_COMMON_MASK_SH_LIST(mask_sh)\
-               SF(AZF0ENDPOINT0_AZALIA_F0_CODEC_ENDPOINT_INDEX, AZALIA_ENDPOINT_REG_INDEX, mask_sh),\
-               SF(AZF0ENDPOINT0_AZALIA_F0_CODEC_ENDPOINT_DATA, AZALIA_ENDPOINT_REG_DATA, mask_sh),\
-               AUD_COMMON_MASK_SH_LIST_BASE(mask_sh)
-
-static const struct dce_audio_shift audio_shift = {
-               DCE120_AUD_COMMON_MASK_SH_LIST(__SHIFT)
-};
-
-static const struct dce_audio_mask audio_mask = {
-               DCE120_AUD_COMMON_MASK_SH_LIST(_MASK)
-};
-
-#define vpg_regs_init(id)\
-       VPG_DCN31_REG_LIST_RI(id)
-
-static struct dcn31_vpg_registers vpg_regs[10];
-
-static const struct dcn31_vpg_shift vpg_shift = {
-       DCN31_VPG_MASK_SH_LIST(__SHIFT)
-};
-
-static const struct dcn31_vpg_mask vpg_mask = {
-       DCN31_VPG_MASK_SH_LIST(_MASK)
-};
-
-#define afmt_regs_init(id)\
-       AFMT_DCN31_REG_LIST_RI(id)
-
-static struct dcn31_afmt_registers afmt_regs[6];
-
-static const struct dcn31_afmt_shift afmt_shift = {
-       DCN31_AFMT_MASK_SH_LIST(__SHIFT)
-};
-
-static const struct dcn31_afmt_mask afmt_mask = {
-       DCN31_AFMT_MASK_SH_LIST(_MASK)
-};
-
-#define apg_regs_init(id)\
-       APG_DCN31_REG_LIST_RI(id)
-
-static struct dcn31_apg_registers apg_regs[4];
-
-static const struct dcn31_apg_shift apg_shift = {
-       DCN31_APG_MASK_SH_LIST(__SHIFT)
-};
-
-static const struct dcn31_apg_mask apg_mask = {
-       DCN31_APG_MASK_SH_LIST(_MASK)
-};
-
-#define stream_enc_regs_init(id)\
-       SE_DCN35_REG_LIST_RI(id)
-
-static struct dcn10_stream_enc_registers stream_enc_regs[5];
-
-static const struct dcn10_stream_encoder_shift se_shift = {
-               SE_COMMON_MASK_SH_LIST_DCN35(__SHIFT)
-};
-
-static const struct dcn10_stream_encoder_mask se_mask = {
-               SE_COMMON_MASK_SH_LIST_DCN35(_MASK)
-};
-
-#define aux_regs_init(id)\
-       DCN2_AUX_REG_LIST_RI(id)
-
-static struct dcn10_link_enc_aux_registers link_enc_aux_regs[5];
-
-#define hpd_regs_init(id)\
-       HPD_REG_LIST_RI(id)
-
-static struct dcn10_link_enc_hpd_registers link_enc_hpd_regs[5];
-
-
-static const struct dce110_aux_registers_shift aux_shift = {
-       DCN_AUX_MASK_SH_LIST(__SHIFT)
-};
-
-static const struct dce110_aux_registers_mask aux_mask = {
-       DCN_AUX_MASK_SH_LIST(_MASK)
-};
-
-#define link_regs_init(id, phyid)\
-       ( \
-       LE_DCN35_REG_LIST_RI(id), \
-       UNIPHY_DCN2_REG_LIST_RI(id, phyid)\
-       )
-
-static struct dcn10_link_enc_registers link_enc_regs[5];
-
-static const struct dcn10_link_enc_shift le_shift = {
-       LINK_ENCODER_MASK_SH_LIST_DCN35(__SHIFT), \
-       //DPCS_DCN31_MASK_SH_LIST(__SHIFT)
-};
-
-static const struct dcn10_link_enc_mask le_mask = {
-       LINK_ENCODER_MASK_SH_LIST_DCN35(_MASK), \
-       //DPCS_DCN31_MASK_SH_LIST(_MASK)
-};
-
-#define hpo_dp_stream_encoder_reg_init(id)\
-       DCN3_1_HPO_DP_STREAM_ENC_REG_LIST_RI(id)
-
-static struct dcn31_hpo_dp_stream_encoder_registers hpo_dp_stream_enc_regs[4];
-
-static const struct dcn31_hpo_dp_stream_encoder_shift hpo_dp_se_shift = {
-       DCN3_1_HPO_DP_STREAM_ENC_MASK_SH_LIST(__SHIFT)
-};
-
-static const struct dcn31_hpo_dp_stream_encoder_mask hpo_dp_se_mask = {
-       DCN3_1_HPO_DP_STREAM_ENC_MASK_SH_LIST(_MASK)
-};
-
-#define hpo_dp_link_encoder_reg_init(id)\
-       DCN3_1_HPO_DP_LINK_ENC_REG_LIST_RI(id)
-       /*DCN3_1_RDPCSTX_REG_LIST(0),*/
-       /*DCN3_1_RDPCSTX_REG_LIST(1),*/
-       /*DCN3_1_RDPCSTX_REG_LIST(2),*/
-       /*DCN3_1_RDPCSTX_REG_LIST(3),*/
-
-static struct dcn31_hpo_dp_link_encoder_registers hpo_dp_link_enc_regs[2];
-
-static const struct dcn31_hpo_dp_link_encoder_shift hpo_dp_le_shift = {
-       DCN3_1_HPO_DP_LINK_ENC_COMMON_MASK_SH_LIST(__SHIFT)
-};
-
-static const struct dcn31_hpo_dp_link_encoder_mask hpo_dp_le_mask = {
-       DCN3_1_HPO_DP_LINK_ENC_COMMON_MASK_SH_LIST(_MASK)
-};
-
-#define dpp_regs_init(id)\
-       DPP_REG_LIST_DCN35_RI(id)
-
-static struct dcn3_dpp_registers dpp_regs[4];
-
-static const struct dcn35_dpp_shift tf_shift = {
-               DPP_REG_LIST_SH_MASK_DCN35(__SHIFT)
-};
-
-static const struct dcn35_dpp_mask tf_mask = {
-               DPP_REG_LIST_SH_MASK_DCN35(_MASK)
-};
-
-#define opp_regs_init(id)\
-       OPP_REG_LIST_DCN35_RI(id)
-
-static struct dcn35_opp_registers opp_regs[4];
-
-static const struct dcn35_opp_shift opp_shift = {
-       OPP_MASK_SH_LIST_DCN35(__SHIFT)
-};
-
-static const struct dcn35_opp_mask opp_mask = {
-       OPP_MASK_SH_LIST_DCN35(_MASK)
-};
-
-#define aux_engine_regs_init(id)\
-       ( \
-       AUX_COMMON_REG_LIST0_RI(id), \
-       SR_ARR_INIT(AUXN_IMPCAL, id, 0), \
-       SR_ARR_INIT(AUXP_IMPCAL, id, 0), \
-       SR_ARR_INIT(AUX_RESET_MASK, id, DP_AUX0_AUX_CONTROL__AUX_RESET_MASK) \
-       )
-
-static struct dce110_aux_registers aux_engine_regs[5];
-
-#define dwbc_regs_dcn3_init(id)\
-       DWBC_COMMON_REG_LIST_DCN30_RI(id)
-
-static struct dcn30_dwbc_registers dwbc35_regs[1];
-
-static const struct dcn35_dwbc_shift dwbc35_shift = {
-       DWBC_COMMON_MASK_SH_LIST_DCN35(__SHIFT)
-};
-
-static const struct dcn35_dwbc_mask dwbc35_mask = {
-       DWBC_COMMON_MASK_SH_LIST_DCN35(_MASK)
-};
-
-#define mcif_wb_regs_dcn3_init(id)\
-       MCIF_WB_COMMON_REG_LIST_DCN3_5_RI(id)
-
-static struct dcn35_mmhubbub_registers mcif_wb35_regs[1];
-
-static const struct dcn35_mmhubbub_shift mcif_wb35_shift = {
-       MCIF_WB_COMMON_MASK_SH_LIST_DCN3_5(__SHIFT)
-};
-
-static const struct dcn35_mmhubbub_mask mcif_wb35_mask = {
-       MCIF_WB_COMMON_MASK_SH_LIST_DCN3_5(_MASK)
-};
-
-#define dsc_regsDCN35_init(id)\
-       DSC_REG_LIST_DCN20_RI(id)
-
-static struct dcn20_dsc_registers dsc_regs[4];
-
-static const struct dcn35_dsc_shift dsc_shift = {
-       DSC_REG_LIST_SH_MASK_DCN35(__SHIFT)
-};
-
-static const struct dcn35_dsc_mask dsc_mask = {
-       DSC_REG_LIST_SH_MASK_DCN35(_MASK)
-};
-
-static struct dcn30_mpc_registers mpc_regs;
-
-#define dcn_mpc_regs_init() \
-       MPC_REG_LIST_DCN3_2_RI(0),\
-       MPC_REG_LIST_DCN3_2_RI(1),\
-       MPC_REG_LIST_DCN3_2_RI(2),\
-       MPC_REG_LIST_DCN3_2_RI(3),\
-       MPC_OUT_MUX_REG_LIST_DCN3_0_RI(0),\
-       MPC_OUT_MUX_REG_LIST_DCN3_0_RI(1),\
-       MPC_OUT_MUX_REG_LIST_DCN3_0_RI(2),\
-       MPC_OUT_MUX_REG_LIST_DCN3_0_RI(3),\
-       MPC_DWB_MUX_REG_LIST_DCN3_0_RI(0)
-
-static const struct dcn30_mpc_shift mpc_shift = {
-       MPC_COMMON_MASK_SH_LIST_DCN32(__SHIFT)
-};
-
-static const struct dcn30_mpc_mask mpc_mask = {
-       MPC_COMMON_MASK_SH_LIST_DCN32(_MASK)
-};
-
-#define optc_regs_init(id)\
-       OPTC_COMMON_REG_LIST_DCN3_5_RI(id)
-
-static struct dcn_optc_registers optc_regs[4];
-
-static const struct dcn_optc_shift optc_shift = {
-       OPTC_COMMON_MASK_SH_LIST_DCN3_5(__SHIFT)
-};
-
-static const struct dcn_optc_mask optc_mask = {
-       OPTC_COMMON_MASK_SH_LIST_DCN3_5(_MASK)
-};
-
-#define hubp_regs_init(id)\
-       HUBP_REG_LIST_DCN30_RI(id)
-
-static struct dcn_hubp2_registers hubp_regs[4];
-
-
-static const struct dcn35_hubp2_shift hubp_shift = {
-               HUBP_MASK_SH_LIST_DCN35(__SHIFT)
-};
-
-static const struct dcn35_hubp2_mask hubp_mask = {
-               HUBP_MASK_SH_LIST_DCN35(_MASK)
-};
-
-static struct dcn_hubbub_registers hubbub_reg;
-
-#define hubbub_reg_init()\
-               HUBBUB_REG_LIST_DCN35(0)
-
-static const struct dcn_hubbub_shift hubbub_shift = {
-               HUBBUB_MASK_SH_LIST_DCN35(__SHIFT)
-};
-
-static const struct dcn_hubbub_mask hubbub_mask = {
-               HUBBUB_MASK_SH_LIST_DCN35(_MASK)
-};
-
-static struct dccg_registers dccg_regs;
-
-#define dccg_regs_init()\
-       DCCG_REG_LIST_DCN35()
-
-static const struct dccg_shift dccg_shift = {
-               DCCG_MASK_SH_LIST_DCN35(__SHIFT)
-};
-
-static const struct dccg_mask dccg_mask = {
-               DCCG_MASK_SH_LIST_DCN35(_MASK)
-};
-
-static struct pg_cntl_registers pg_cntl_regs;
-
-#define pg_cntl_dcn35_regs_init() \
-       PG_CNTL_REG_LIST_DCN35()
-
-static const struct pg_cntl_shift pg_cntl_shift = {
-               PG_CNTL_MASK_SH_LIST_DCN35(__SHIFT)
-};
-
-static const struct pg_cntl_mask pg_cntl_mask = {
-               PG_CNTL_MASK_SH_LIST_DCN35(_MASK)
-};
-
-#define SRII2(reg_name_pre, reg_name_post, id)\
-       .reg_name_pre ## _ ##  reg_name_post[id] = BASE(reg ## reg_name_pre \
-                       ## id ## _ ## reg_name_post ## _BASE_IDX) + \
-                       reg ## reg_name_pre ## id ## _ ## reg_name_post
-
-static struct dce_hwseq_registers hwseq_reg;
-
-#define hwseq_reg_init()\
-       HWSEQ_DCN35_REG_LIST()
-
-#define HWSEQ_DCN35_MASK_SH_LIST(mask_sh)\
-       HWSEQ_DCN_MASK_SH_LIST(mask_sh), \
-       HWS_SF(, DCHUBBUB_GLOBAL_TIMER_CNTL, DCHUBBUB_GLOBAL_TIMER_REFDIV, mask_sh), \
-       HWS_SF(, DCHUBBUB_ARB_HOSTVM_CNTL, DISABLE_HOSTVM_FORCE_ALLOW_PSTATE, mask_sh), \
-       HWS_SF(, DOMAIN0_PG_CONFIG, DOMAIN_POWER_FORCEON, mask_sh), \
-       HWS_SF(, DOMAIN0_PG_CONFIG, DOMAIN_POWER_GATE, mask_sh), \
-       HWS_SF(, DOMAIN1_PG_CONFIG, DOMAIN_POWER_FORCEON, mask_sh), \
-       HWS_SF(, DOMAIN1_PG_CONFIG, DOMAIN_POWER_GATE, mask_sh), \
-       HWS_SF(, DOMAIN2_PG_CONFIG, DOMAIN_POWER_FORCEON, mask_sh), \
-       HWS_SF(, DOMAIN2_PG_CONFIG, DOMAIN_POWER_GATE, mask_sh), \
-       HWS_SF(, DOMAIN3_PG_CONFIG, DOMAIN_POWER_FORCEON, mask_sh), \
-       HWS_SF(, DOMAIN3_PG_CONFIG, DOMAIN_POWER_GATE, mask_sh), \
-       HWS_SF(, DOMAIN16_PG_CONFIG, DOMAIN_POWER_FORCEON, mask_sh), \
-       HWS_SF(, DOMAIN16_PG_CONFIG, DOMAIN_POWER_GATE, mask_sh), \
-       HWS_SF(, DOMAIN17_PG_CONFIG, DOMAIN_POWER_FORCEON, mask_sh), \
-       HWS_SF(, DOMAIN17_PG_CONFIG, DOMAIN_POWER_GATE, mask_sh), \
-       HWS_SF(, DOMAIN18_PG_CONFIG, DOMAIN_POWER_FORCEON, mask_sh), \
-       HWS_SF(, DOMAIN18_PG_CONFIG, DOMAIN_POWER_GATE, mask_sh), \
-       HWS_SF(, DOMAIN19_PG_CONFIG, DOMAIN_POWER_FORCEON, mask_sh), \
-       HWS_SF(, DOMAIN19_PG_CONFIG, DOMAIN_POWER_GATE, mask_sh), \
-       HWS_SF(, DOMAIN22_PG_CONFIG, DOMAIN_POWER_FORCEON, mask_sh), \
-       HWS_SF(, DOMAIN22_PG_CONFIG, DOMAIN_POWER_GATE, mask_sh), \
-       HWS_SF(, DOMAIN23_PG_CONFIG, DOMAIN_POWER_FORCEON, mask_sh), \
-       HWS_SF(, DOMAIN23_PG_CONFIG, DOMAIN_POWER_GATE, mask_sh), \
-       HWS_SF(, DOMAIN24_PG_CONFIG, DOMAIN_POWER_FORCEON, mask_sh), \
-       HWS_SF(, DOMAIN24_PG_CONFIG, DOMAIN_POWER_GATE, mask_sh), \
-       HWS_SF(, DOMAIN25_PG_CONFIG, DOMAIN_POWER_FORCEON, mask_sh), \
-       HWS_SF(, DOMAIN25_PG_CONFIG, DOMAIN_POWER_GATE, mask_sh), \
-       HWS_SF(, DOMAIN0_PG_STATUS, DOMAIN_PGFSM_PWR_STATUS, mask_sh), \
-       HWS_SF(, DOMAIN1_PG_STATUS, DOMAIN_PGFSM_PWR_STATUS, mask_sh), \
-       HWS_SF(, DOMAIN2_PG_STATUS, DOMAIN_PGFSM_PWR_STATUS, mask_sh), \
-       HWS_SF(, DOMAIN3_PG_STATUS, DOMAIN_PGFSM_PWR_STATUS, mask_sh), \
-       HWS_SF(, DOMAIN16_PG_STATUS, DOMAIN_PGFSM_PWR_STATUS, mask_sh), \
-       HWS_SF(, DOMAIN17_PG_STATUS, DOMAIN_PGFSM_PWR_STATUS, mask_sh), \
-       HWS_SF(, DOMAIN18_PG_STATUS, DOMAIN_PGFSM_PWR_STATUS, mask_sh), \
-       HWS_SF(, DOMAIN19_PG_STATUS, DOMAIN_PGFSM_PWR_STATUS, mask_sh), \
-       HWS_SF(, DOMAIN22_PG_STATUS, DOMAIN_PGFSM_PWR_STATUS, mask_sh), \
-       HWS_SF(, DOMAIN23_PG_STATUS, DOMAIN_PGFSM_PWR_STATUS, mask_sh), \
-       HWS_SF(, DOMAIN24_PG_STATUS, DOMAIN_PGFSM_PWR_STATUS, mask_sh), \
-       HWS_SF(, DOMAIN25_PG_STATUS, DOMAIN_PGFSM_PWR_STATUS, mask_sh), \
-       HWS_SF(, DC_IP_REQUEST_CNTL, IP_REQUEST_EN, mask_sh), \
-       HWS_SF(, AZALIA_AUDIO_DTO, AZALIA_AUDIO_DTO_MODULE, mask_sh), \
-       HWS_SF(, HPO_TOP_CLOCK_CONTROL, HPO_HDMISTREAMCLK_G_GATE_DIS, mask_sh), \
-       HWS_SF(, ODM_MEM_PWR_CTRL3, ODM_MEM_UNASSIGNED_PWR_MODE, mask_sh), \
-       HWS_SF(, ODM_MEM_PWR_CTRL3, ODM_MEM_VBLANK_PWR_MODE, mask_sh), \
-       HWS_SF(, DIO_MEM_PWR_CTRL, I2C_LIGHT_SLEEP_FORCE, mask_sh), \
-       HWS_SF(, HPO_TOP_HW_CONTROL, HPO_IO_EN, mask_sh),\
-       HWS_SF(, DMU_CLK_CNTL, DISPCLK_R_DMU_GATE_DIS, mask_sh),\
-       HWS_SF(, DMU_CLK_CNTL, DISPCLK_G_RBBMIF_GATE_DIS, mask_sh),\
-       HWS_SF(, DMU_CLK_CNTL, RBBMIF_FGCG_REP_DIS, mask_sh),\
-       HWS_SF(, DMU_CLK_CNTL, DPREFCLK_ALLOW_DS_CLKSTOP, mask_sh),\
-       HWS_SF(, DMU_CLK_CNTL, DISPCLK_ALLOW_DS_CLKSTOP, mask_sh),\
-       HWS_SF(, DMU_CLK_CNTL, DPPCLK_ALLOW_DS_CLKSTOP, mask_sh),\
-       HWS_SF(, DMU_CLK_CNTL, DTBCLK_ALLOW_DS_CLKSTOP, mask_sh),\
-       HWS_SF(, DMU_CLK_CNTL, DCFCLK_ALLOW_DS_CLKSTOP, mask_sh),\
-       HWS_SF(, DMU_CLK_CNTL, DPIACLK_ALLOW_DS_CLKSTOP, mask_sh),\
-       HWS_SF(, DMU_CLK_CNTL, LONO_FGCG_REP_DIS, mask_sh),\
-       HWS_SF(, DMU_CLK_CNTL, LONO_DISPCLK_GATE_DISABLE, mask_sh),\
-       HWS_SF(, DMU_CLK_CNTL, LONO_SOCCLK_GATE_DISABLE, mask_sh),\
-       HWS_SF(, DMU_CLK_CNTL, LONO_DMCUBCLK_GATE_DISABLE, mask_sh),\
-       HWS_SF(, DCCG_GATE_DISABLE_CNTL2, SYMCLKA_FE_GATE_DISABLE, mask_sh), \
-       HWS_SF(, DCCG_GATE_DISABLE_CNTL2, SYMCLKB_FE_GATE_DISABLE, mask_sh), \
-       HWS_SF(, DCCG_GATE_DISABLE_CNTL2, SYMCLKC_FE_GATE_DISABLE, mask_sh), \
-       HWS_SF(, DCCG_GATE_DISABLE_CNTL2, SYMCLKD_FE_GATE_DISABLE, mask_sh), \
-       HWS_SF(, DCCG_GATE_DISABLE_CNTL2, SYMCLKE_FE_GATE_DISABLE, mask_sh), \
-       HWS_SF(, DCCG_GATE_DISABLE_CNTL2, HDMICHARCLK0_GATE_DISABLE, mask_sh), \
-       HWS_SF(, DCCG_GATE_DISABLE_CNTL2, SYMCLKA_GATE_DISABLE, mask_sh), \
-       HWS_SF(, DCCG_GATE_DISABLE_CNTL2, SYMCLKB_GATE_DISABLE, mask_sh), \
-       HWS_SF(, DCCG_GATE_DISABLE_CNTL2, SYMCLKC_GATE_DISABLE, mask_sh), \
-       HWS_SF(, DCCG_GATE_DISABLE_CNTL2, SYMCLKD_GATE_DISABLE, mask_sh), \
-       HWS_SF(, DCCG_GATE_DISABLE_CNTL2, SYMCLKE_GATE_DISABLE, mask_sh), \
-       HWS_SF(, DCCG_GATE_DISABLE_CNTL2, PHYASYMCLK_ROOT_GATE_DISABLE, mask_sh), \
-       HWS_SF(, DCCG_GATE_DISABLE_CNTL2, PHYBSYMCLK_ROOT_GATE_DISABLE, mask_sh), \
-       HWS_SF(, DCCG_GATE_DISABLE_CNTL2, PHYCSYMCLK_ROOT_GATE_DISABLE, mask_sh), \
-       HWS_SF(, DCCG_GATE_DISABLE_CNTL2, PHYDSYMCLK_ROOT_GATE_DISABLE, mask_sh), \
-       HWS_SF(, DCCG_GATE_DISABLE_CNTL2, PHYESYMCLK_ROOT_GATE_DISABLE, mask_sh)
-
-static const struct dce_hwseq_shift hwseq_shift = {
-               HWSEQ_DCN35_MASK_SH_LIST(__SHIFT)
-};
-
-static const struct dce_hwseq_mask hwseq_mask = {
-               HWSEQ_DCN35_MASK_SH_LIST(_MASK)
-};
-
-#define vmid_regs_init(id)\
-               DCN20_VMID_REG_LIST_RI(id)
-
-static struct dcn_vmid_registers vmid_regs[16];
-
-static const struct dcn20_vmid_shift vmid_shifts = {
-               DCN20_VMID_MASK_SH_LIST(__SHIFT)
-};
-
-static const struct dcn20_vmid_mask vmid_masks = {
-               DCN20_VMID_MASK_SH_LIST(_MASK)
-};
-
-static const struct resource_caps res_cap_dcn35 = {
-       .num_timing_generator = 4,
-       .num_opp = 4,
-       .num_video_plane = 4,
-       .num_audio = 5,
-       .num_stream_encoder = 5,
-       .num_dig_link_enc = 5,
-       .num_hpo_dp_stream_encoder = 4,
-       .num_hpo_dp_link_encoder = 2,
-       .num_pll = 4,/*1 c10 edp, 3xc20 combo PHY*/
-       .num_dwb = 1,
-       .num_ddc = 5,
-       .num_vmid = 16,
-       .num_mpc_3dlut = 2,
-       .num_dsc = 4,
-};
-
-static const struct dc_plane_cap plane_cap = {
-       .type = DC_PLANE_TYPE_DCN_UNIVERSAL,
-       .per_pixel_alpha = true,
-
-       .pixel_format_support = {
-                       .argb8888 = true,
-                       .nv12 = true,
-                       .fp16 = true,
-                       .p010 = true,
-                       .ayuv = false,
-       },
-
-       .max_upscale_factor = {
-                       .argb8888 = 16000,
-                       .nv12 = 16000,
-                       .fp16 = 16000
-       },
-
-       // 6:1 downscaling ratio: 1000/6 = 166.666
-       .max_downscale_factor = {
-                       .argb8888 = 167,
-                       .nv12 = 167,
-                       .fp16 = 167
-       },
-       64,
-       64
-};
-
-static const struct dc_debug_options debug_defaults_drv = {
-       .disable_dmcu = true,
-       .force_abm_enable = false,
-       .timing_trace = false,
-       .clock_trace = true,
-       .disable_pplib_clock_request = false,
-       .pipe_split_policy = MPC_SPLIT_AVOID,
-       .force_single_disp_pipe_split = false,
-       .disable_dcc = DCC_ENABLE,
-       .disable_dpp_power_gate = true,
-       .disable_hubp_power_gate = true,
-       .disable_clock_gate = true,
-       .disable_dsc_power_gate = true,
-       .vsr_support = true,
-       .performance_trace = false,
-       .max_downscale_src_width = 4096,/*upto true 4k*/
-       .disable_pplib_wm_range = false,
-       .scl_reset_length10 = true,
-       .sanity_checks = false,
-       .underflow_assert_delay_us = 0xFFFFFFFF,
-       .dwb_fi_phase = -1, // -1 = disable,
-       .dmub_command_table = true,
-       .pstate_enabled = true,
-       .use_max_lb = true,
-       .enable_mem_low_power = {
-               .bits = {
-                       .vga = false,
-                       .i2c = true,
-                       .dmcu = false, // This is previously known to cause hang on S3 cycles if enabled
-                       .dscl = true,
-                       .cm = true,
-                       .mpc = true,
-                       .optc = true,
-                       .vpg = true,
-                       .afmt = true,
-               }
-       },
-       .root_clock_optimization = {
-               .bits = {
-                       .dpp = true,
-                       .dsc = true,/*dscclk and dsc pg*/
-                       .hdmistream = true,
-                       .hdmichar = true,
-                       .dpstream = true,
-                       .symclk32_se = true,
-                       .symclk32_le = true,
-                       .symclk_fe = true,
-                       .physymclk = true,
-                       .dpiasymclk = true,
-               }
-       },
-       .seamless_boot_odm_combine = DML_FAIL_SOURCE_PIXEL_FORMAT,
-       .enable_z9_disable_interface = true, /* Allow support for the PMFW interface for disable Z9*/
-       .using_dml2 = true,
-       .support_eDP1_5 = true,
-       .enable_hpo_pg_support = false,
-       .enable_legacy_fast_update = true,
-       .enable_single_display_2to1_odm_policy = false,
-       .disable_idle_power_optimizations = true,
-       .dmcub_emulation = false,
-       .disable_boot_optimizations = false,
-       .disable_unbounded_requesting = false,
-       .disable_mem_low_power = false,
-       //must match enable_single_display_2to1_odm_policy to support dynamic ODM transitions
-       .enable_double_buffered_dsc_pg_support = true,
-       .enable_dp_dig_pixel_rate_div_policy = 1,
-       .disable_z10 = false,
-       .ignore_pg = true,
-       .psp_disabled_wa = true,
-       .ips2_eval_delay_us = 200,
-       .ips2_entry_delay_us = 400
-};
-
-static const struct dc_panel_config panel_config_defaults = {
-       .psr = {
-               .disable_psr = false,
-               .disallow_psrsu = false,
-       },
-       .ilr = {
-               .optimize_edp_link_rate = true,
-       },
-};
-
-static void dcn35_dpp_destroy(struct dpp **dpp)
-{
-       kfree(TO_DCN20_DPP(*dpp));
-       *dpp = NULL;
-}
-
-static struct dpp *dcn35_dpp_create(struct dc_context *ctx, uint32_t inst)
-{
-       struct dcn3_dpp *dpp = kzalloc(sizeof(struct dcn3_dpp), GFP_KERNEL);
-       bool success = (dpp != NULL);
-
-       if (!success)
-               return NULL;
-
-#undef REG_STRUCT
-#define REG_STRUCT dpp_regs
-       dpp_regs_init(0),
-       dpp_regs_init(1),
-       dpp_regs_init(2),
-       dpp_regs_init(3);
-
-       success = dpp35_construct(dpp, ctx, inst, &dpp_regs[inst], &tf_shift,
-                                 &tf_mask);
-       if (success) {
-               dpp35_set_fgcg(
-                       dpp,
-                       ctx->dc->debug.enable_fine_grain_clock_gating.bits.dpp);
-               return &dpp->base;
-       }
-
-       BREAK_TO_DEBUGGER();
-       kfree(dpp);
-       return NULL;
-}
-
-static struct output_pixel_processor *dcn35_opp_create(
-       struct dc_context *ctx, uint32_t inst)
-{
-       struct dcn20_opp *opp =
-               kzalloc(sizeof(struct dcn20_opp), GFP_KERNEL);
-
-       if (!opp) {
-               BREAK_TO_DEBUGGER();
-               return NULL;
-       }
-
-#undef REG_STRUCT
-#define REG_STRUCT opp_regs
-       opp_regs_init(0),
-       opp_regs_init(1),
-       opp_regs_init(2),
-       opp_regs_init(3);
-
-       dcn35_opp_construct(opp, ctx, inst,
-                       &opp_regs[inst], &opp_shift, &opp_mask);
-
-       dcn35_opp_set_fgcg(opp, ctx->dc->debug.enable_fine_grain_clock_gating.bits.opp);
-
-       return &opp->base;
-}
-
-static struct dce_aux *dcn31_aux_engine_create(
-       struct dc_context *ctx,
-       uint32_t inst)
-{
-       struct aux_engine_dce110 *aux_engine =
-               kzalloc(sizeof(struct aux_engine_dce110), GFP_KERNEL);
-
-       if (!aux_engine)
-               return NULL;
-
-#undef REG_STRUCT
-#define REG_STRUCT aux_engine_regs
-       aux_engine_regs_init(0),
-       aux_engine_regs_init(1),
-       aux_engine_regs_init(2),
-       aux_engine_regs_init(3),
-       aux_engine_regs_init(4);
-
-       dce110_aux_engine_construct(aux_engine, ctx, inst,
-                                   SW_AUX_TIMEOUT_PERIOD_MULTIPLIER * AUX_TIMEOUT_PERIOD,
-                                   &aux_engine_regs[inst],
-                                       &aux_mask,
-                                       &aux_shift,
-                                       ctx->dc->caps.extended_aux_timeout_support);
-
-       return &aux_engine->base;
-}
-
-#define i2c_inst_regs_init(id)\
-       I2C_HW_ENGINE_COMMON_REG_LIST_DCN30_RI(id)
-
-static struct dce_i2c_registers i2c_hw_regs[5];
-
-static const struct dce_i2c_shift i2c_shifts = {
-               I2C_COMMON_MASK_SH_LIST_DCN35(__SHIFT)
-};
-
-static const struct dce_i2c_mask i2c_masks = {
-               I2C_COMMON_MASK_SH_LIST_DCN35(_MASK)
-};
-
-/* ========================================================== */
-
-/*
- * DPIA index | Preferred Encoder     |    Host Router
- *   0        |      C                |       0
- *   1        |      First Available  |       0
- *   2        |      D                |       1
- *   3        |      First Available  |       1
- */
-/* ========================================================== */
-static const enum engine_id dpia_to_preferred_enc_id_table[] = {
-               ENGINE_ID_DIGC,
-               ENGINE_ID_DIGC,
-               ENGINE_ID_DIGD,
-               ENGINE_ID_DIGD
-};
-
-static enum engine_id dcn35_get_preferred_eng_id_dpia(unsigned int dpia_index)
-{
-       return dpia_to_preferred_enc_id_table[dpia_index];
-}
-
-static struct dce_i2c_hw *dcn31_i2c_hw_create(
-       struct dc_context *ctx,
-       uint32_t inst)
-{
-       struct dce_i2c_hw *dce_i2c_hw =
-               kzalloc(sizeof(struct dce_i2c_hw), GFP_KERNEL);
-
-       if (!dce_i2c_hw)
-               return NULL;
-
-#undef REG_STRUCT
-#define REG_STRUCT i2c_hw_regs
-       i2c_inst_regs_init(1),
-       i2c_inst_regs_init(2),
-       i2c_inst_regs_init(3),
-       i2c_inst_regs_init(4),
-       i2c_inst_regs_init(5);
-
-       dcn2_i2c_hw_construct(dce_i2c_hw, ctx, inst,
-                                   &i2c_hw_regs[inst], &i2c_shifts, &i2c_masks);
-
-       return dce_i2c_hw;
-}
-static struct mpc *dcn35_mpc_create(
-               struct dc_context *ctx,
-               int num_mpcc,
-               int num_rmu)
-{
-       struct dcn30_mpc *mpc30 = kzalloc(sizeof(struct dcn30_mpc), GFP_KERNEL);
-
-       if (!mpc30)
-               return NULL;
-
-#undef REG_STRUCT
-#define REG_STRUCT mpc_regs
-       dcn_mpc_regs_init();
-
-       dcn32_mpc_construct(mpc30, ctx,
-                       &mpc_regs,
-                       &mpc_shift,
-                       &mpc_mask,
-                       num_mpcc,
-                       num_rmu);
-
-       return &mpc30->base;
-}
-
-static struct hubbub *dcn35_hubbub_create(struct dc_context *ctx)
-{
-       int i;
-
-       struct dcn20_hubbub *hubbub3 = kzalloc(sizeof(struct dcn20_hubbub),
-                                         GFP_KERNEL);
-
-       if (!hubbub3)
-               return NULL;
-
-#undef REG_STRUCT
-#define REG_STRUCT hubbub_reg
-       hubbub_reg_init();
-
-#undef REG_STRUCT
-#define REG_STRUCT vmid_regs
-       vmid_regs_init(0),
-       vmid_regs_init(1),
-       vmid_regs_init(2),
-       vmid_regs_init(3),
-       vmid_regs_init(4),
-       vmid_regs_init(5),
-       vmid_regs_init(6),
-       vmid_regs_init(7),
-       vmid_regs_init(8),
-       vmid_regs_init(9),
-       vmid_regs_init(10),
-       vmid_regs_init(11),
-       vmid_regs_init(12),
-       vmid_regs_init(13),
-       vmid_regs_init(14),
-       vmid_regs_init(15);
-
-       hubbub35_construct(hubbub3, ctx,
-                       &hubbub_reg,
-                       &hubbub_shift,
-                       &hubbub_mask,
-                       384,/*ctx->dc->dml.ip.det_buffer_size_kbytes,*/
-                       8, /*ctx->dc->dml.ip.pixel_chunk_size_kbytes,*/
-                       1792 /*ctx->dc->dml.ip.config_return_buffer_size_in_kbytes*/);
-
-
-       for (i = 0; i < res_cap_dcn35.num_vmid; i++) {
-               struct dcn20_vmid *vmid = &hubbub3->vmid[i];
-
-               vmid->ctx = ctx;
-
-               vmid->regs = &vmid_regs[i];
-               vmid->shifts = &vmid_shifts;
-               vmid->masks = &vmid_masks;
-       }
-
-       return &hubbub3->base;
-}
-
-static struct timing_generator *dcn35_timing_generator_create(
-               struct dc_context *ctx,
-               uint32_t instance)
-{
-       struct optc *tgn10 =
-               kzalloc(sizeof(struct optc), GFP_KERNEL);
-
-       if (!tgn10)
-               return NULL;
-
-#undef REG_STRUCT
-#define REG_STRUCT optc_regs
-       optc_regs_init(0),
-       optc_regs_init(1),
-       optc_regs_init(2),
-       optc_regs_init(3);
-
-       tgn10->base.inst = instance;
-       tgn10->base.ctx = ctx;
-
-       tgn10->tg_regs = &optc_regs[instance];
-       tgn10->tg_shift = &optc_shift;
-       tgn10->tg_mask = &optc_mask;
-
-       dcn35_timing_generator_init(tgn10);
-
-       return &tgn10->base;
-}
-
-static const struct encoder_feature_support link_enc_feature = {
-               .max_hdmi_deep_color = COLOR_DEPTH_121212,
-               .max_hdmi_pixel_clock = 600000,
-               .hdmi_ycbcr420_supported = true,
-               .dp_ycbcr420_supported = true,
-               .fec_supported = true,
-               .flags.bits.IS_HBR2_CAPABLE = true,
-               .flags.bits.IS_HBR3_CAPABLE = true,
-               .flags.bits.IS_TPS3_CAPABLE = true,
-               .flags.bits.IS_TPS4_CAPABLE = true
-};
-
-static struct link_encoder *dcn35_link_encoder_create(
-       struct dc_context *ctx,
-       const struct encoder_init_data *enc_init_data)
-{
-       struct dcn20_link_encoder *enc20 =
-               kzalloc(sizeof(struct dcn20_link_encoder), GFP_KERNEL);
-
-       if (!enc20)
-               return NULL;
-
-#undef REG_STRUCT
-#define REG_STRUCT link_enc_aux_regs
-       aux_regs_init(0),
-       aux_regs_init(1),
-       aux_regs_init(2),
-       aux_regs_init(3),
-       aux_regs_init(4);
-
-#undef REG_STRUCT
-#define REG_STRUCT link_enc_hpd_regs
-       hpd_regs_init(0),
-       hpd_regs_init(1),
-       hpd_regs_init(2),
-       hpd_regs_init(3),
-       hpd_regs_init(4);
-
-#undef REG_STRUCT
-#define REG_STRUCT link_enc_regs
-       link_regs_init(0, A),
-       link_regs_init(1, B),
-       link_regs_init(2, C),
-       link_regs_init(3, D),
-       link_regs_init(4, E);
-
-       dcn35_link_encoder_construct(enc20,
-                       enc_init_data,
-                       &link_enc_feature,
-                       &link_enc_regs[enc_init_data->transmitter],
-                       &link_enc_aux_regs[enc_init_data->channel - 1],
-                       &link_enc_hpd_regs[enc_init_data->hpd_source],
-                       &le_shift,
-                       &le_mask);
-
-       return &enc20->enc10.base;
-}
-
-/* Create a minimal link encoder object not associated with a particular
- * physical connector.
- * resource_funcs.link_enc_create_minimal
- */
-static struct link_encoder *dcn31_link_enc_create_minimal(
-               struct dc_context *ctx, enum engine_id eng_id)
-{
-       struct dcn20_link_encoder *enc20;
-
-       if ((eng_id - ENGINE_ID_DIGA) > ctx->dc->res_pool->res_cap->num_dig_link_enc)
-               return NULL;
-
-       enc20 = kzalloc(sizeof(struct dcn20_link_encoder), GFP_KERNEL);
-       if (!enc20)
-               return NULL;
-
-       dcn31_link_encoder_construct_minimal(
-                       enc20,
-                       ctx,
-                       &link_enc_feature,
-                       &link_enc_regs[eng_id - ENGINE_ID_DIGA],
-                       eng_id);
-
-       return &enc20->enc10.base;
-}
-
-static struct panel_cntl *dcn31_panel_cntl_create(const struct panel_cntl_init_data *init_data)
-{
-       struct dcn31_panel_cntl *panel_cntl =
-               kzalloc(sizeof(struct dcn31_panel_cntl), GFP_KERNEL);
-
-       if (!panel_cntl)
-               return NULL;
-
-       dcn31_panel_cntl_construct(panel_cntl, init_data);
-
-       return &panel_cntl->base;
-}
-
-static void read_dce_straps(
-       struct dc_context *ctx,
-       struct resource_straps *straps)
-{
-       generic_reg_get(ctx, regDC_PINSTRAPS + BASE(regDC_PINSTRAPS_BASE_IDX),
-               FN(DC_PINSTRAPS, DC_PINSTRAPS_AUDIO), &straps->dc_pinstraps_audio);
-
-}
-
-static struct audio *dcn31_create_audio(
-               struct dc_context *ctx, unsigned int inst)
-{
-
-#undef REG_STRUCT
-#define REG_STRUCT audio_regs
-       audio_regs_init(0),
-       audio_regs_init(1),
-       audio_regs_init(2),
-       audio_regs_init(3),
-       audio_regs_init(4);
-       audio_regs_init(5);
-       audio_regs_init(6);
-
-       return dce_audio_create(ctx, inst,
-                       &audio_regs[inst], &audio_shift, &audio_mask);
-}
-
-static struct vpg *dcn31_vpg_create(
-       struct dc_context *ctx,
-       uint32_t inst)
-{
-       struct dcn31_vpg *vpg31 = kzalloc(sizeof(struct dcn31_vpg), GFP_KERNEL);
-
-       if (!vpg31)
-               return NULL;
-
-#undef REG_STRUCT
-#define REG_STRUCT vpg_regs
-       vpg_regs_init(0),
-       vpg_regs_init(1),
-       vpg_regs_init(2),
-       vpg_regs_init(3),
-       vpg_regs_init(4),
-       vpg_regs_init(5),
-       vpg_regs_init(6),
-       vpg_regs_init(7),
-       vpg_regs_init(8),
-       vpg_regs_init(9);
-
-       vpg31_construct(vpg31, ctx, inst,
-                       &vpg_regs[inst],
-                       &vpg_shift,
-                       &vpg_mask);
-
-       return &vpg31->base;
-}
-
-static struct afmt *dcn31_afmt_create(
-       struct dc_context *ctx,
-       uint32_t inst)
-{
-       struct dcn31_afmt *afmt31 = kzalloc(sizeof(struct dcn31_afmt), GFP_KERNEL);
-
-       if (!afmt31)
-               return NULL;
-
-#undef REG_STRUCT
-#define REG_STRUCT afmt_regs
-       afmt_regs_init(0),
-       afmt_regs_init(1),
-       afmt_regs_init(2),
-       afmt_regs_init(3),
-       afmt_regs_init(4),
-       afmt_regs_init(5);
-
-       afmt31_construct(afmt31, ctx, inst,
-                       &afmt_regs[inst],
-                       &afmt_shift,
-                       &afmt_mask);
-
-       // Light sleep by default, no need to power down here
-
-       return &afmt31->base;
-}
-
-static struct apg *dcn31_apg_create(
-       struct dc_context *ctx,
-       uint32_t inst)
-{
-       struct dcn31_apg *apg31 = kzalloc(sizeof(struct dcn31_apg), GFP_KERNEL);
-
-       if (!apg31)
-               return NULL;
-
-#undef REG_STRUCT
-#define REG_STRUCT apg_regs
-       apg_regs_init(0),
-       apg_regs_init(1),
-       apg_regs_init(2),
-       apg_regs_init(3);
-
-       apg31_construct(apg31, ctx, inst,
-                       &apg_regs[inst],
-                       &apg_shift,
-                       &apg_mask);
-
-       return &apg31->base;
-}
-
-static struct stream_encoder *dcn35_stream_encoder_create(
-       enum engine_id eng_id,
-       struct dc_context *ctx)
-{
-       struct dcn10_stream_encoder *enc1;
-       struct vpg *vpg;
-       struct afmt *afmt;
-       int vpg_inst;
-       int afmt_inst;
-
-       /* Mapping of VPG, AFMT, DME register blocks to DIO block instance */
-       if (eng_id <= ENGINE_ID_DIGF) {
-               vpg_inst = eng_id;
-               afmt_inst = eng_id;
-       } else
-               return NULL;
-
-       enc1 = kzalloc(sizeof(struct dcn10_stream_encoder), GFP_KERNEL);
-       vpg = dcn31_vpg_create(ctx, vpg_inst);
-       afmt = dcn31_afmt_create(ctx, afmt_inst);
-
-       if (!enc1 || !vpg || !afmt) {
-               kfree(enc1);
-               kfree(vpg);
-               kfree(afmt);
-               return NULL;
-       }
-
-#undef REG_STRUCT
-#define REG_STRUCT stream_enc_regs
-       stream_enc_regs_init(0),
-       stream_enc_regs_init(1),
-       stream_enc_regs_init(2),
-       stream_enc_regs_init(3),
-       stream_enc_regs_init(4);
-
-       dcn35_dio_stream_encoder_construct(enc1, ctx, ctx->dc_bios,
-                                       eng_id, vpg, afmt,
-                                       &stream_enc_regs[eng_id],
-                                       &se_shift, &se_mask);
-
-       return &enc1->base;
-}
-
-static struct hpo_dp_stream_encoder *dcn31_hpo_dp_stream_encoder_create(
-       enum engine_id eng_id,
-       struct dc_context *ctx)
-{
-       struct dcn31_hpo_dp_stream_encoder *hpo_dp_enc31;
-       struct vpg *vpg;
-       struct apg *apg;
-       uint32_t hpo_dp_inst;
-       uint32_t vpg_inst;
-       uint32_t apg_inst;
-
-       ASSERT((eng_id >= ENGINE_ID_HPO_DP_0) && (eng_id <= ENGINE_ID_HPO_DP_3));
-       hpo_dp_inst = eng_id - ENGINE_ID_HPO_DP_0;
-
-       /* Mapping of VPG register blocks to HPO DP block instance:
-        * VPG[6] -> HPO_DP[0]
-        * VPG[7] -> HPO_DP[1]
-        * VPG[8] -> HPO_DP[2]
-        * VPG[9] -> HPO_DP[3]
-        */
-       vpg_inst = hpo_dp_inst + 6;
-
-       /* Mapping of APG register blocks to HPO DP block instance:
-        * APG[0] -> HPO_DP[0]
-        * APG[1] -> HPO_DP[1]
-        * APG[2] -> HPO_DP[2]
-        * APG[3] -> HPO_DP[3]
-        */
-       apg_inst = hpo_dp_inst;
-
-       /* allocate HPO stream encoder and create VPG sub-block */
-       hpo_dp_enc31 = kzalloc(sizeof(struct dcn31_hpo_dp_stream_encoder), GFP_KERNEL);
-       vpg = dcn31_vpg_create(ctx, vpg_inst);
-       apg = dcn31_apg_create(ctx, apg_inst);
-
-       if (!hpo_dp_enc31 || !vpg || !apg) {
-               kfree(hpo_dp_enc31);
-               kfree(vpg);
-               kfree(apg);
-               return NULL;
-       }
-
-#undef REG_STRUCT
-#define REG_STRUCT hpo_dp_stream_enc_regs
-       hpo_dp_stream_encoder_reg_init(0),
-       hpo_dp_stream_encoder_reg_init(1),
-       hpo_dp_stream_encoder_reg_init(2),
-       hpo_dp_stream_encoder_reg_init(3);
-
-       dcn31_hpo_dp_stream_encoder_construct(hpo_dp_enc31, ctx, ctx->dc_bios,
-                                       hpo_dp_inst, eng_id, vpg, apg,
-                                       &hpo_dp_stream_enc_regs[hpo_dp_inst],
-                                       &hpo_dp_se_shift, &hpo_dp_se_mask);
-
-       return &hpo_dp_enc31->base;
-}
-
-static struct hpo_dp_link_encoder *dcn31_hpo_dp_link_encoder_create(
-       uint8_t inst,
-       struct dc_context *ctx)
-{
-       struct dcn31_hpo_dp_link_encoder *hpo_dp_enc31;
-
-       /* allocate HPO link encoder */
-       hpo_dp_enc31 = kzalloc(sizeof(struct dcn31_hpo_dp_link_encoder), GFP_KERNEL);
-
-#undef REG_STRUCT
-#define REG_STRUCT hpo_dp_link_enc_regs
-       hpo_dp_link_encoder_reg_init(0),
-       hpo_dp_link_encoder_reg_init(1);
-
-       hpo_dp_link_encoder31_construct(hpo_dp_enc31, ctx, inst,
-                                       &hpo_dp_link_enc_regs[inst],
-                                       &hpo_dp_le_shift, &hpo_dp_le_mask);
-
-       return &hpo_dp_enc31->base;
-}
-
-static struct dce_hwseq *dcn35_hwseq_create(
-       struct dc_context *ctx)
-{
-       struct dce_hwseq *hws = kzalloc(sizeof(struct dce_hwseq), GFP_KERNEL);
-
-#undef REG_STRUCT
-#define REG_STRUCT hwseq_reg
-       hwseq_reg_init();
-
-       if (hws) {
-               hws->ctx = ctx;
-               hws->regs = &hwseq_reg;
-               hws->shifts = &hwseq_shift;
-               hws->masks = &hwseq_mask;
-       }
-       return hws;
-}
-static const struct resource_create_funcs res_create_funcs = {
-       .read_dce_straps = read_dce_straps,
-       .create_audio = dcn31_create_audio,
-       .create_stream_encoder = dcn35_stream_encoder_create,
-       .create_hpo_dp_stream_encoder = dcn31_hpo_dp_stream_encoder_create,
-       .create_hpo_dp_link_encoder = dcn31_hpo_dp_link_encoder_create,
-       .create_hwseq = dcn35_hwseq_create,
-};
-
-static void dcn35_resource_destruct(struct dcn35_resource_pool *pool)
-{
-       unsigned int i;
-
-       for (i = 0; i < pool->base.stream_enc_count; i++) {
-               if (pool->base.stream_enc[i] != NULL) {
-                       if (pool->base.stream_enc[i]->vpg != NULL) {
-                               kfree(DCN30_VPG_FROM_VPG(pool->base.stream_enc[i]->vpg));
-                               pool->base.stream_enc[i]->vpg = NULL;
-                       }
-                       if (pool->base.stream_enc[i]->afmt != NULL) {
-                               kfree(DCN30_AFMT_FROM_AFMT(pool->base.stream_enc[i]->afmt));
-                               pool->base.stream_enc[i]->afmt = NULL;
-                       }
-                       kfree(DCN10STRENC_FROM_STRENC(pool->base.stream_enc[i]));
-                       pool->base.stream_enc[i] = NULL;
-               }
-       }
-
-       for (i = 0; i < pool->base.hpo_dp_stream_enc_count; i++) {
-               if (pool->base.hpo_dp_stream_enc[i] != NULL) {
-                       if (pool->base.hpo_dp_stream_enc[i]->vpg != NULL) {
-                               kfree(DCN30_VPG_FROM_VPG(pool->base.hpo_dp_stream_enc[i]->vpg));
-                               pool->base.hpo_dp_stream_enc[i]->vpg = NULL;
-                       }
-                       if (pool->base.hpo_dp_stream_enc[i]->apg != NULL) {
-                               kfree(DCN31_APG_FROM_APG(pool->base.hpo_dp_stream_enc[i]->apg));
-                               pool->base.hpo_dp_stream_enc[i]->apg = NULL;
-                       }
-                       kfree(DCN3_1_HPO_DP_STREAM_ENC_FROM_HPO_STREAM_ENC(pool->base.hpo_dp_stream_enc[i]));
-                       pool->base.hpo_dp_stream_enc[i] = NULL;
-               }
-       }
-
-       for (i = 0; i < pool->base.hpo_dp_link_enc_count; i++) {
-               if (pool->base.hpo_dp_link_enc[i] != NULL) {
-                       kfree(DCN3_1_HPO_DP_LINK_ENC_FROM_HPO_LINK_ENC(pool->base.hpo_dp_link_enc[i]));
-                       pool->base.hpo_dp_link_enc[i] = NULL;
-               }
-       }
-
-       for (i = 0; i < pool->base.res_cap->num_dsc; i++) {
-               if (pool->base.dscs[i] != NULL)
-                       dcn20_dsc_destroy(&pool->base.dscs[i]);
-       }
-
-       if (pool->base.mpc != NULL) {
-               kfree(TO_DCN20_MPC(pool->base.mpc));
-               pool->base.mpc = NULL;
-       }
-       if (pool->base.hubbub != NULL) {
-               kfree(pool->base.hubbub);
-               pool->base.hubbub = NULL;
-       }
-       for (i = 0; i < pool->base.pipe_count; i++) {
-               if (pool->base.dpps[i] != NULL)
-                       dcn35_dpp_destroy(&pool->base.dpps[i]);
-
-               if (pool->base.ipps[i] != NULL)
-                       pool->base.ipps[i]->funcs->ipp_destroy(&pool->base.ipps[i]);
-
-               if (pool->base.hubps[i] != NULL) {
-                       kfree(TO_DCN20_HUBP(pool->base.hubps[i]));
-                       pool->base.hubps[i] = NULL;
-               }
-
-               if (pool->base.irqs != NULL) {
-                       dal_irq_service_destroy(&pool->base.irqs);
-               }
-       }
-
-       for (i = 0; i < pool->base.res_cap->num_ddc; i++) {
-               if (pool->base.engines[i] != NULL)
-                       dce110_engine_destroy(&pool->base.engines[i]);
-               if (pool->base.hw_i2cs[i] != NULL) {
-                       kfree(pool->base.hw_i2cs[i]);
-                       pool->base.hw_i2cs[i] = NULL;
-               }
-               if (pool->base.sw_i2cs[i] != NULL) {
-                       kfree(pool->base.sw_i2cs[i]);
-                       pool->base.sw_i2cs[i] = NULL;
-               }
-       }
-
-       for (i = 0; i < pool->base.res_cap->num_opp; i++) {
-               if (pool->base.opps[i] != NULL)
-                       pool->base.opps[i]->funcs->opp_destroy(&pool->base.opps[i]);
-       }
-
-       for (i = 0; i < pool->base.res_cap->num_timing_generator; i++) {
-               if (pool->base.timing_generators[i] != NULL)    {
-                       kfree(DCN10TG_FROM_TG(pool->base.timing_generators[i]));
-                       pool->base.timing_generators[i] = NULL;
-               }
-       }
-
-       for (i = 0; i < pool->base.res_cap->num_dwb; i++) {
-               if (pool->base.dwbc[i] != NULL) {
-                       kfree(TO_DCN30_DWBC(pool->base.dwbc[i]));
-                       pool->base.dwbc[i] = NULL;
-               }
-               if (pool->base.mcif_wb[i] != NULL) {
-                       kfree(TO_DCN30_MMHUBBUB(pool->base.mcif_wb[i]));
-                       pool->base.mcif_wb[i] = NULL;
-               }
-       }
-
-       for (i = 0; i < pool->base.audio_count; i++) {
-               if (pool->base.audios[i])
-                       dce_aud_destroy(&pool->base.audios[i]);
-       }
-
-       for (i = 0; i < pool->base.clk_src_count; i++) {
-               if (pool->base.clock_sources[i] != NULL) {
-                       dcn20_clock_source_destroy(&pool->base.clock_sources[i]);
-                       pool->base.clock_sources[i] = NULL;
-               }
-       }
-
-       for (i = 0; i < pool->base.res_cap->num_mpc_3dlut; i++) {
-               if (pool->base.mpc_lut[i] != NULL) {
-                       dc_3dlut_func_release(pool->base.mpc_lut[i]);
-                       pool->base.mpc_lut[i] = NULL;
-               }
-               if (pool->base.mpc_shaper[i] != NULL) {
-                       dc_transfer_func_release(pool->base.mpc_shaper[i]);
-                       pool->base.mpc_shaper[i] = NULL;
-               }
-       }
-
-       if (pool->base.dp_clock_source != NULL) {
-               dcn20_clock_source_destroy(&pool->base.dp_clock_source);
-               pool->base.dp_clock_source = NULL;
-       }
-
-       for (i = 0; i < pool->base.res_cap->num_timing_generator; i++) {
-               if (pool->base.multiple_abms[i] != NULL)
-                       dce_abm_destroy(&pool->base.multiple_abms[i]);
-       }
-
-       if (pool->base.psr != NULL)
-               dmub_psr_destroy(&pool->base.psr);
-
-       if (pool->base.pg_cntl != NULL)
-               dcn_pg_cntl_destroy(&pool->base.pg_cntl);
-
-       if (pool->base.dccg != NULL)
-               dcn_dccg_destroy(&pool->base.dccg);
-}
-
-static struct hubp *dcn35_hubp_create(
-       struct dc_context *ctx,
-       uint32_t inst)
-{
-       struct dcn20_hubp *hubp2 =
-               kzalloc(sizeof(struct dcn20_hubp), GFP_KERNEL);
-
-       if (!hubp2)
-               return NULL;
-
-#undef REG_STRUCT
-#define REG_STRUCT hubp_regs
-       hubp_regs_init(0),
-       hubp_regs_init(1),
-       hubp_regs_init(2),
-       hubp_regs_init(3);
-
-       if (hubp35_construct(hubp2, ctx, inst,
-                       &hubp_regs[inst], &hubp_shift, &hubp_mask))
-               return &hubp2->base;
-
-       BREAK_TO_DEBUGGER();
-       kfree(hubp2);
-       return NULL;
-}
-
-static void dcn35_dwbc_init(struct dcn30_dwbc *dwbc30, struct dc_context *ctx)
-{
-       dcn35_dwbc_set_fgcg(
-               dwbc30, ctx->dc->debug.enable_fine_grain_clock_gating.bits.dwb);
-}
-
-static bool dcn35_dwbc_create(struct dc_context *ctx, struct resource_pool *pool)
-{
-       int i;
-       uint32_t pipe_count = pool->res_cap->num_dwb;
-
-       for (i = 0; i < pipe_count; i++) {
-               struct dcn30_dwbc *dwbc30 = kzalloc(sizeof(struct dcn30_dwbc),
-                                                   GFP_KERNEL);
-
-               if (!dwbc30) {
-                       dm_error("DC: failed to create dwbc30!\n");
-                       return false;
-               }
-
-#undef REG_STRUCT
-#define REG_STRUCT dwbc35_regs
-               dwbc_regs_dcn3_init(0);
-
-               dcn35_dwbc_construct(dwbc30, ctx,
-                               &dwbc35_regs[i],
-                               &dwbc35_shift,
-                               &dwbc35_mask,
-                               i);
-
-               pool->dwbc[i] = &dwbc30->base;
-
-               dcn35_dwbc_init(dwbc30, ctx);
-       }
-       return true;
-}
-
-static void dcn35_mmhubbub_init(struct dcn30_mmhubbub *mcif_wb30,
-                               struct dc_context *ctx)
-{
-       dcn35_mmhubbub_set_fgcg(
-               mcif_wb30,
-               ctx->dc->debug.enable_fine_grain_clock_gating.bits.mmhubbub);
-}
-
-static bool dcn35_mmhubbub_create(struct dc_context *ctx, struct resource_pool *pool)
-{
-       int i;
-       uint32_t pipe_count = pool->res_cap->num_dwb;
-
-       for (i = 0; i < pipe_count; i++) {
-               struct dcn30_mmhubbub *mcif_wb30 = kzalloc(sizeof(struct dcn30_mmhubbub),
-                                                   GFP_KERNEL);
-
-               if (!mcif_wb30) {
-                       dm_error("DC: failed to create mcif_wb30!\n");
-                       return false;
-               }
-
-#undef REG_STRUCT
-#define REG_STRUCT mcif_wb35_regs
-               mcif_wb_regs_dcn3_init(0);
-
-               dcn35_mmhubbub_construct(mcif_wb30, ctx,
-                               &mcif_wb35_regs[i],
-                               &mcif_wb35_shift,
-                               &mcif_wb35_mask,
-                               i);
-
-               dcn35_mmhubbub_init(mcif_wb30, ctx);
-
-               pool->mcif_wb[i] = &mcif_wb30->base;
-       }
-       return true;
-}
-
-static struct display_stream_compressor *dcn35_dsc_create(
-       struct dc_context *ctx, uint32_t inst)
-{
-       struct dcn20_dsc *dsc =
-               kzalloc(sizeof(struct dcn20_dsc), GFP_KERNEL);
-
-       if (!dsc) {
-               BREAK_TO_DEBUGGER();
-               return NULL;
-       }
-
-#undef REG_STRUCT
-#define REG_STRUCT dsc_regs
-       dsc_regsDCN35_init(0),
-       dsc_regsDCN35_init(1),
-       dsc_regsDCN35_init(2),
-       dsc_regsDCN35_init(3);
-
-       dsc35_construct(dsc, ctx, inst, &dsc_regs[inst], &dsc_shift, &dsc_mask);
-       dsc35_set_fgcg(dsc,
-                      ctx->dc->debug.enable_fine_grain_clock_gating.bits.dsc);
-       return &dsc->base;
-}
-
-static void dcn35_destroy_resource_pool(struct resource_pool **pool)
-{
-       struct dcn35_resource_pool *dcn35_pool = TO_DCN35_RES_POOL(*pool);
-
-       dcn35_resource_destruct(dcn35_pool);
-       kfree(dcn35_pool);
-       *pool = NULL;
-}
-
-static struct clock_source *dcn35_clock_source_create(
-               struct dc_context *ctx,
-               struct dc_bios *bios,
-               enum clock_source_id id,
-               const struct dce110_clk_src_regs *regs,
-               bool dp_clk_src)
-{
-       struct dce110_clk_src *clk_src =
-               kzalloc(sizeof(struct dce110_clk_src), GFP_KERNEL);
-
-       if (!clk_src)
-               return NULL;
-
-       if (dcn31_clk_src_construct(clk_src, ctx, bios, id,
-                       regs, &cs_shift, &cs_mask)) {
-               clk_src->base.dp_clk_src = dp_clk_src;
-               return &clk_src->base;
-       }
-
-       BREAK_TO_DEBUGGER();
-       return NULL;
-}
-
-static struct dc_cap_funcs cap_funcs = {
-       .get_dcc_compression_cap = dcn20_get_dcc_compression_cap
-};
-
-static void dcn35_get_panel_config_defaults(struct dc_panel_config *panel_config)
-{
-       *panel_config = panel_config_defaults;
-}
-
-
-static bool dcn35_validate_bandwidth(struct dc *dc,
-               struct dc_state *context,
-               bool fast_validate)
-{
-       bool out = false;
-
-       out = dml2_validate(dc, context, fast_validate);
-
-       return out;
-}
-
-
-static struct resource_funcs dcn35_res_pool_funcs = {
-       .destroy = dcn35_destroy_resource_pool,
-       .link_enc_create = dcn35_link_encoder_create,
-       .link_enc_create_minimal = dcn31_link_enc_create_minimal,
-       .link_encs_assign = link_enc_cfg_link_encs_assign,
-       .link_enc_unassign = link_enc_cfg_link_enc_unassign,
-       .panel_cntl_create = dcn31_panel_cntl_create,
-       .validate_bandwidth = dcn35_validate_bandwidth,
-       .calculate_wm_and_dlg = NULL,
-       .update_soc_for_wm_a = dcn31_update_soc_for_wm_a,
-       .populate_dml_pipes = dcn35_populate_dml_pipes_from_context_fpu,
-       .acquire_free_pipe_as_secondary_dpp_pipe = dcn20_acquire_free_pipe_for_layer,
-       .release_pipe = dcn20_release_pipe,
-       .add_stream_to_ctx = dcn30_add_stream_to_ctx,
-       .add_dsc_to_stream_resource = dcn20_add_dsc_to_stream_resource,
-       .remove_stream_from_ctx = dcn20_remove_stream_from_ctx,
-       .populate_dml_writeback_from_context = dcn30_populate_dml_writeback_from_context,
-       .set_mcif_arb_params = dcn30_set_mcif_arb_params,
-       .find_first_free_match_stream_enc_for_link = dcn10_find_first_free_match_stream_enc_for_link,
-       .acquire_post_bldn_3dlut = dcn30_acquire_post_bldn_3dlut,
-       .release_post_bldn_3dlut = dcn30_release_post_bldn_3dlut,
-       .update_bw_bounding_box = dcn35_update_bw_bounding_box_fpu,
-       .patch_unknown_plane_state = dcn20_patch_unknown_plane_state,
-       .get_panel_config_defaults = dcn35_get_panel_config_defaults,
-       .get_preferred_eng_id_dpia = dcn35_get_preferred_eng_id_dpia,
-};
-
-static bool dcn35_resource_construct(
-       uint8_t num_virtual_links,
-       struct dc *dc,
-       struct dcn35_resource_pool *pool)
-{
-       int i;
-       struct dc_context *ctx = dc->ctx;
-       struct irq_service_init_data init_data;
-
-#undef REG_STRUCT
-#define REG_STRUCT bios_regs
-       bios_regs_init();
-
-#undef REG_STRUCT
-#define REG_STRUCT clk_src_regs
-       clk_src_regs_init(0, A),
-       clk_src_regs_init(1, B),
-       clk_src_regs_init(2, C),
-       clk_src_regs_init(3, D),
-       clk_src_regs_init(4, E);
-
-#undef REG_STRUCT
-#define REG_STRUCT abm_regs
-       abm_regs_init(0),
-       abm_regs_init(1),
-       abm_regs_init(2),
-       abm_regs_init(3);
-
-#undef REG_STRUCT
-#define REG_STRUCT dccg_regs
-       dccg_regs_init();
-
-       ctx->dc_bios->regs = &bios_regs;
-
-       pool->base.res_cap = &res_cap_dcn35;
-
-       pool->base.funcs = &dcn35_res_pool_funcs;
-
-       /*************************************************
-        *  Resource + asic cap harcoding                *
-        *************************************************/
-       pool->base.underlay_pipe_index = NO_UNDERLAY_PIPE;
-       pool->base.pipe_count = pool->base.res_cap->num_timing_generator;
-       pool->base.mpcc_count = pool->base.res_cap->num_timing_generator;
-       dc->caps.max_downscale_ratio = 600;
-       dc->caps.i2c_speed_in_khz = 100;
-       dc->caps.i2c_speed_in_khz_hdcp = 100;
-       dc->caps.max_cursor_size = 256;
-       dc->caps.min_horizontal_blanking_period = 80;
-       dc->caps.dmdata_alloc_size = 2048;
-       dc->caps.max_slave_planes = 2;
-       dc->caps.max_slave_yuv_planes = 2;
-       dc->caps.max_slave_rgb_planes = 2;
-       dc->caps.post_blend_color_processing = true;
-       dc->caps.force_dp_tps4_for_cp2520 = true;
-       if (dc->config.forceHBR2CP2520)
-               dc->caps.force_dp_tps4_for_cp2520 = false;
-       dc->caps.dp_hpo = true;
-       dc->caps.dp_hdmi21_pcon_support = true;
-
-       dc->caps.edp_dsc_support = true;
-       dc->caps.extended_aux_timeout_support = true;
-       dc->caps.dmcub_support = true;
-       dc->caps.is_apu = true;
-       dc->caps.seamless_odm = true;
-
-       dc->caps.zstate_support = true;
-       dc->caps.ips_support = true;
-       dc->caps.max_v_total = (1 << 15) - 1;
-
-       /* Color pipeline capabilities */
-       dc->caps.color.dpp.dcn_arch = 1;
-       dc->caps.color.dpp.input_lut_shared = 0;
-       dc->caps.color.dpp.icsc = 1;
-       dc->caps.color.dpp.dgam_ram = 0; // must use gamma_corr
-       dc->caps.color.dpp.dgam_rom_caps.srgb = 1;
-       dc->caps.color.dpp.dgam_rom_caps.bt2020 = 1;
-       dc->caps.color.dpp.dgam_rom_caps.gamma2_2 = 1;
-       dc->caps.color.dpp.dgam_rom_caps.pq = 1;
-       dc->caps.color.dpp.dgam_rom_caps.hlg = 1;
-       dc->caps.color.dpp.post_csc = 1;
-       dc->caps.color.dpp.gamma_corr = 1;
-       dc->caps.color.dpp.dgam_rom_for_yuv = 0;
-
-       dc->caps.color.dpp.hw_3d_lut = 1;
-       dc->caps.color.dpp.ogam_ram = 0;  // no OGAM in DPP since DCN1
-       // no OGAM ROM on DCN301
-       dc->caps.color.dpp.ogam_rom_caps.srgb = 0;
-       dc->caps.color.dpp.ogam_rom_caps.bt2020 = 0;
-       dc->caps.color.dpp.ogam_rom_caps.gamma2_2 = 0;
-       dc->caps.color.dpp.ogam_rom_caps.pq = 0;
-       dc->caps.color.dpp.ogam_rom_caps.hlg = 0;
-       dc->caps.color.dpp.ocsc = 0;
-
-       dc->caps.color.mpc.gamut_remap = 1;
-       dc->caps.color.mpc.num_3dluts = pool->base.res_cap->num_mpc_3dlut; //2
-       dc->caps.color.mpc.ogam_ram = 1;
-       dc->caps.color.mpc.ogam_rom_caps.srgb = 0;
-       dc->caps.color.mpc.ogam_rom_caps.bt2020 = 0;
-       dc->caps.color.mpc.ogam_rom_caps.gamma2_2 = 0;
-       dc->caps.color.mpc.ogam_rom_caps.pq = 0;
-       dc->caps.color.mpc.ogam_rom_caps.hlg = 0;
-       dc->caps.color.mpc.ocsc = 1;
-
-       /* max_disp_clock_khz_at_vmin is slightly lower than the STA value in order
-        * to provide some margin.
-        * It's expected for furture ASIC to have equal or higher value, in order to
-        * have determinstic power improvement from generate to genration.
-        * (i.e., we should not expect new ASIC generation with lower vmin rate)
-        */
-       dc->caps.max_disp_clock_khz_at_vmin = 650000;
-
-       /* Use pipe context based otg sync logic */
-       dc->config.use_pipe_ctx_sync_logic = true;
-       dc->config.use_default_clock_table = false;
-       /* read VBIOS LTTPR caps */
-       {
-               if (ctx->dc_bios->funcs->get_lttpr_caps) {
-                       enum bp_result bp_query_result;
-                       uint8_t is_vbios_lttpr_enable = 0;
-
-                       bp_query_result = ctx->dc_bios->funcs->get_lttpr_caps(ctx->dc_bios, &is_vbios_lttpr_enable);
-                       dc->caps.vbios_lttpr_enable = (bp_query_result == BP_RESULT_OK) && !!is_vbios_lttpr_enable;
-               }
-
-               /* interop bit is implicit */
-               {
-                       dc->caps.vbios_lttpr_aware = true;
-               }
-       }
-
-       if (dc->ctx->dce_environment == DCE_ENV_PRODUCTION_DRV)
-               dc->debug = debug_defaults_drv;
-
-       // Init the vm_helper
-       if (dc->vm_helper)
-               vm_helper_init(dc->vm_helper, 16);
-
-       /*************************************************
-        *  Create resources                             *
-        *************************************************/
-
-       /* Clock Sources for Pixel Clock*/
-       pool->base.clock_sources[DCN35_CLK_SRC_PLL0] =
-                       dcn35_clock_source_create(ctx, ctx->dc_bios,
-                               CLOCK_SOURCE_COMBO_PHY_PLL0,
-                               &clk_src_regs[0], false);
-       pool->base.clock_sources[DCN35_CLK_SRC_PLL1] =
-                       dcn35_clock_source_create(ctx, ctx->dc_bios,
-                               CLOCK_SOURCE_COMBO_PHY_PLL1,
-                               &clk_src_regs[1], false);
-       pool->base.clock_sources[DCN35_CLK_SRC_PLL2] =
-                       dcn35_clock_source_create(ctx, ctx->dc_bios,
-                               CLOCK_SOURCE_COMBO_PHY_PLL2,
-                               &clk_src_regs[2], false);
-       pool->base.clock_sources[DCN35_CLK_SRC_PLL3] =
-                       dcn35_clock_source_create(ctx, ctx->dc_bios,
-                               CLOCK_SOURCE_COMBO_PHY_PLL3,
-                               &clk_src_regs[3], false);
-       pool->base.clock_sources[DCN35_CLK_SRC_PLL4] =
-                       dcn35_clock_source_create(ctx, ctx->dc_bios,
-                               CLOCK_SOURCE_COMBO_PHY_PLL4,
-                               &clk_src_regs[4], false);
-
-       pool->base.clk_src_count = DCN35_CLK_SRC_TOTAL;
-
-       /* todo: not reuse phy_pll registers */
-       pool->base.dp_clock_source =
-                       dcn35_clock_source_create(ctx, ctx->dc_bios,
-                               CLOCK_SOURCE_ID_DP_DTO,
-                               &clk_src_regs[0], true);
-
-       for (i = 0; i < pool->base.clk_src_count; i++) {
-               if (pool->base.clock_sources[i] == NULL) {
-                       dm_error("DC: failed to create clock sources!\n");
-                       BREAK_TO_DEBUGGER();
-                       goto create_fail;
-               }
-       }
-       /*temp till dml2 fully work without dml1*/
-       dml_init_instance(&dc->dml, &dcn3_5_soc, &dcn3_5_ip, DML_PROJECT_DCN31);
-
-       /* TODO: DCCG */
-       pool->base.dccg = dccg35_create(ctx, &dccg_regs, &dccg_shift, &dccg_mask);
-       if (pool->base.dccg == NULL) {
-               dm_error("DC: failed to create dccg!\n");
-               BREAK_TO_DEBUGGER();
-               goto create_fail;
-       }
-
-#undef REG_STRUCT
-#define REG_STRUCT pg_cntl_regs
-       pg_cntl_dcn35_regs_init();
-
-       pool->base.pg_cntl = pg_cntl35_create(ctx, &pg_cntl_regs, &pg_cntl_shift, &pg_cntl_mask);
-       if (pool->base.pg_cntl == NULL) {
-               dm_error("DC: failed to create power gate control!\n");
-               BREAK_TO_DEBUGGER();
-               goto create_fail;
-       }
-
-       /* TODO: IRQ */
-       init_data.ctx = dc->ctx;
-       pool->base.irqs = dal_irq_service_dcn35_create(&init_data);
-       if (!pool->base.irqs)
-               goto create_fail;
-
-       /* HUBBUB */
-       pool->base.hubbub = dcn35_hubbub_create(ctx);
-       if (pool->base.hubbub == NULL) {
-               BREAK_TO_DEBUGGER();
-               dm_error("DC: failed to create hubbub!\n");
-               goto create_fail;
-       }
-
-       /* HUBPs, DPPs, OPPs and TGs */
-       for (i = 0; i < pool->base.pipe_count; i++) {
-               pool->base.hubps[i] = dcn35_hubp_create(ctx, i);
-               if (pool->base.hubps[i] == NULL) {
-                       BREAK_TO_DEBUGGER();
-                       dm_error(
-                               "DC: failed to create hubps!\n");
-                       goto create_fail;
-               }
-
-               pool->base.dpps[i] = dcn35_dpp_create(ctx, i);
-               if (pool->base.dpps[i] == NULL) {
-                       BREAK_TO_DEBUGGER();
-                       dm_error(
-                               "DC: failed to create dpps!\n");
-                       goto create_fail;
-               }
-       }
-
-       for (i = 0; i < pool->base.res_cap->num_opp; i++) {
-               pool->base.opps[i] = dcn35_opp_create(ctx, i);
-               if (pool->base.opps[i] == NULL) {
-                       BREAK_TO_DEBUGGER();
-                       dm_error(
-                               "DC: failed to create output pixel processor!\n");
-                       goto create_fail;
-               }
-       }
-
-       for (i = 0; i < pool->base.res_cap->num_timing_generator; i++) {
-               pool->base.timing_generators[i] = dcn35_timing_generator_create(
-                               ctx, i);
-               if (pool->base.timing_generators[i] == NULL) {
-                       BREAK_TO_DEBUGGER();
-                       dm_error("DC: failed to create tg!\n");
-                       goto create_fail;
-               }
-       }
-       pool->base.timing_generator_count = i;
-
-       /* PSR */
-       pool->base.psr = dmub_psr_create(ctx);
-       if (pool->base.psr == NULL) {
-               dm_error("DC: failed to create psr obj!\n");
-               BREAK_TO_DEBUGGER();
-               goto create_fail;
-       }
-
-       /* ABM */
-       for (i = 0; i < pool->base.res_cap->num_timing_generator; i++) {
-               pool->base.multiple_abms[i] = dmub_abm_create(ctx,
-                               &abm_regs[i],
-                               &abm_shift,
-                               &abm_mask);
-               if (pool->base.multiple_abms[i] == NULL) {
-                       dm_error("DC: failed to create abm for pipe %d!\n", i);
-                       BREAK_TO_DEBUGGER();
-                       goto create_fail;
-               }
-       }
-
-       /* MPC and DSC */
-       pool->base.mpc = dcn35_mpc_create(ctx, pool->base.mpcc_count, pool->base.res_cap->num_mpc_3dlut);
-       if (pool->base.mpc == NULL) {
-               BREAK_TO_DEBUGGER();
-               dm_error("DC: failed to create mpc!\n");
-               goto create_fail;
-       }
-
-       for (i = 0; i < pool->base.res_cap->num_dsc; i++) {
-               pool->base.dscs[i] = dcn35_dsc_create(ctx, i);
-               if (pool->base.dscs[i] == NULL) {
-                       BREAK_TO_DEBUGGER();
-                       dm_error("DC: failed to create display stream compressor %d!\n", i);
-                       goto create_fail;
-               }
-       }
-
-       /* DWB and MMHUBBUB */
-       if (!dcn35_dwbc_create(ctx, &pool->base)) {
-               BREAK_TO_DEBUGGER();
-               dm_error("DC: failed to create dwbc!\n");
-               goto create_fail;
-       }
-
-       if (!dcn35_mmhubbub_create(ctx, &pool->base)) {
-               BREAK_TO_DEBUGGER();
-               dm_error("DC: failed to create mcif_wb!\n");
-               goto create_fail;
-       }
-
-       /* AUX and I2C */
-       for (i = 0; i < pool->base.res_cap->num_ddc; i++) {
-               pool->base.engines[i] = dcn31_aux_engine_create(ctx, i);
-               if (pool->base.engines[i] == NULL) {
-                       BREAK_TO_DEBUGGER();
-                       dm_error(
-                               "DC:failed to create aux engine!!\n");
-                       goto create_fail;
-               }
-               pool->base.hw_i2cs[i] = dcn31_i2c_hw_create(ctx, i);
-               if (pool->base.hw_i2cs[i] == NULL) {
-                       BREAK_TO_DEBUGGER();
-                       dm_error(
-                               "DC:failed to create hw i2c!!\n");
-                       goto create_fail;
-               }
-               pool->base.sw_i2cs[i] = NULL;
-       }
-
-       /* DCN3.5 has 6 DPIA */
-       pool->base.usb4_dpia_count = 4;
-       if (dc->debug.dpia_debug.bits.disable_dpia)
-               pool->base.usb4_dpia_count = 0;
-
-       /* Audio, Stream Encoders including HPO and virtual, MPC 3D LUTs */
-       if (!resource_construct(num_virtual_links, dc, &pool->base,
-                       &res_create_funcs))
-               goto create_fail;
-
-       /* HW Sequencer and Plane caps */
-       dcn35_hw_sequencer_construct(dc);
-
-       dc->caps.max_planes =  pool->base.pipe_count;
-
-       for (i = 0; i < dc->caps.max_planes; ++i)
-               dc->caps.planes[i] = plane_cap;
-
-       dc->cap_funcs = cap_funcs;
-
-       dc->dcn_ip->max_num_dpp = pool->base.pipe_count;
-
-       dc->dml2_options.dcn_pipe_count = pool->base.pipe_count;
-       dc->dml2_options.use_native_pstate_optimization = true;
-       dc->dml2_options.use_native_soc_bb_construction = true;
-       if (dc->config.EnableMinDispClkODM)
-               dc->dml2_options.minimize_dispclk_using_odm = true;
-       dc->dml2_options.enable_windowed_mpo_odm = dc->config.enable_windowed_mpo_odm;
-
-       dc->dml2_options.callbacks.dc = dc;
-       dc->dml2_options.callbacks.build_scaling_params = &resource_build_scaling_params;
-       dc->dml2_options.callbacks.can_support_mclk_switch_using_fw_based_vblank_stretch = &dcn30_can_support_mclk_switch_using_fw_based_vblank_stretch;
-       dc->dml2_options.callbacks.acquire_secondary_pipe_for_mpc_odm = &dc_resource_acquire_secondary_pipe_for_mpc_odm_legacy;
-       dc->dml2_options.callbacks.update_pipes_for_stream_with_slice_count = &resource_update_pipes_for_stream_with_slice_count;
-       dc->dml2_options.callbacks.update_pipes_for_plane_with_slice_count = &resource_update_pipes_for_plane_with_slice_count;
-       dc->dml2_options.callbacks.get_mpc_slice_index = &resource_get_mpc_slice_index;
-       dc->dml2_options.callbacks.get_odm_slice_index = &resource_get_odm_slice_index;
-       dc->dml2_options.callbacks.get_opp_head = &resource_get_opp_head;
-       dc->dml2_options.max_segments_per_hubp = 24;
-
-       dc->dml2_options.det_segment_size = DCN3_2_DET_SEG_SIZE;/*todo*/
-
-       if (dc->config.sdpif_request_limit_words_per_umc == 0)
-               dc->config.sdpif_request_limit_words_per_umc = 16;/*todo*/
-
-       return true;
-
-create_fail:
-
-       dcn35_resource_destruct(pool);
-
-       return false;
-}
-
-struct resource_pool *dcn35_create_resource_pool(
-               const struct dc_init_data *init_data,
-               struct dc *dc)
-{
-       struct dcn35_resource_pool *pool =
-               kzalloc(sizeof(struct dcn35_resource_pool), GFP_KERNEL);
-
-       if (!pool)
-               return NULL;
-
-       if (dcn35_resource_construct(init_data->num_virtual_links, dc, pool))
-               return &pool->base;
-
-       BREAK_TO_DEBUGGER();
-       kfree(pool);
-       return NULL;
-}
diff --git a/drivers/gpu/drm/amd/display/dc/dcn35/dcn35_resource.h b/drivers/gpu/drm/amd/display/dc/dcn35/dcn35_resource.h
deleted file mode 100644 (file)
index 99aea10..0000000
+++ /dev/null
@@ -1,310 +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_RESOURCE_H_
-#define _DCN35_RESOURCE_H_
-
-#include "core_types.h"
-
-#define DCN3_5_VMIN_DISPCLK_HZ 717000000
-#define TO_DCN35_RES_POOL(pool)\
-       container_of(pool, struct dcn35_resource_pool, base)
-
-extern struct _vcs_dpi_ip_params_st dcn3_5_ip;
-extern struct _vcs_dpi_soc_bounding_box_st dcn3_5_soc;
-
-struct dcn35_resource_pool {
-       struct resource_pool base;
-};
-
-struct resource_pool *dcn35_create_resource_pool(
-               const struct dc_init_data *init_data,
-               struct dc *dc);
-
-/* Defs for runtime init of registers */
-
-#define OPP_REG_LIST_DCN20_RI(id) \
-       OPP_REG_LIST_DCN10_RI(id), \
-       OPP_DPG_REG_LIST_RI(id), \
-       SRI_ARR(FMT_422_CONTROL, FMT, id), \
-       SRI_ARR(OPPBUF_CONTROL1, OPPBUF, id)
-
-#define OPP_REG_LIST_DCN35_RI(id) \
-       OPP_REG_LIST_DCN20_RI(id), \
-       SRI2_ARR(OPP_TOP_CLK_CONTROL, OPP, id)
-
-#define VPG_DCN31_REG_LIST_RI(id) \
-       SRI_ARR(VPG_GENERIC_STATUS, VPG, id), \
-       SRI_ARR(VPG_GENERIC_PACKET_ACCESS_CTRL, VPG, id), \
-       SRI_ARR(VPG_GENERIC_PACKET_DATA, VPG, id), \
-       SRI_ARR(VPG_GSP_FRAME_UPDATE_CTRL, VPG, id), \
-       SRI_ARR(VPG_GSP_IMMEDIATE_UPDATE_CTRL, VPG, id), \
-       SRI_ARR(VPG_MEM_PWR, VPG, id)
-
-#define AFMT_DCN31_REG_LIST_RI(id) \
-       SRI_ARR(AFMT_INFOFRAME_CONTROL0, AFMT, id), \
-       SRI_ARR(AFMT_VBI_PACKET_CONTROL, AFMT, id), \
-       SRI_ARR(AFMT_AUDIO_PACKET_CONTROL, AFMT, id), \
-       SRI_ARR(AFMT_AUDIO_PACKET_CONTROL2, AFMT, id), \
-       SRI_ARR(AFMT_AUDIO_SRC_CONTROL, AFMT, id), \
-       SRI_ARR(AFMT_60958_0, AFMT, id), \
-       SRI_ARR(AFMT_60958_1, AFMT, id), \
-       SRI_ARR(AFMT_60958_2, AFMT, id), \
-       SRI_ARR(AFMT_MEM_PWR, AFMT, id)
-
-/* Stream encoder */
-#define SE_DCN35_REG_LIST_RI(id) \
-       SRI_ARR(AFMT_CNTL, DIG, id), \
-       SRI_ARR(DIG_FE_CNTL, DIG, id), \
-       SRI_ARR(HDMI_CONTROL, DIG, id), \
-       SRI_ARR(HDMI_DB_CONTROL, DIG, id), \
-       SRI_ARR(HDMI_GC, DIG, id), \
-       SRI_ARR(HDMI_GENERIC_PACKET_CONTROL0, DIG, id), \
-       SRI_ARR(HDMI_GENERIC_PACKET_CONTROL1, DIG, id), \
-       SRI_ARR(HDMI_GENERIC_PACKET_CONTROL2, DIG, id), \
-       SRI_ARR(HDMI_GENERIC_PACKET_CONTROL3, DIG, id), \
-       SRI_ARR(HDMI_GENERIC_PACKET_CONTROL4, DIG, id), \
-       SRI_ARR(HDMI_GENERIC_PACKET_CONTROL5, DIG, id), \
-       SRI_ARR(HDMI_GENERIC_PACKET_CONTROL6, DIG, id), \
-       SRI_ARR(HDMI_GENERIC_PACKET_CONTROL7, DIG, id), \
-       SRI_ARR(HDMI_GENERIC_PACKET_CONTROL8, DIG, id), \
-       SRI_ARR(HDMI_GENERIC_PACKET_CONTROL9, DIG, id), \
-       SRI_ARR(HDMI_GENERIC_PACKET_CONTROL10, DIG, id), \
-       SRI_ARR(HDMI_INFOFRAME_CONTROL0, DIG, id), \
-       SRI_ARR(HDMI_INFOFRAME_CONTROL1, DIG, id), \
-       SRI_ARR(HDMI_VBI_PACKET_CONTROL, DIG, id), \
-       SRI_ARR(HDMI_AUDIO_PACKET_CONTROL, DIG, id),\
-       SRI_ARR(HDMI_ACR_PACKET_CONTROL, DIG, id),\
-       SRI_ARR(HDMI_ACR_32_0, DIG, id),\
-       SRI_ARR(HDMI_ACR_32_1, DIG, id),\
-       SRI_ARR(HDMI_ACR_44_0, DIG, id),\
-       SRI_ARR(HDMI_ACR_44_1, DIG, id),\
-       SRI_ARR(HDMI_ACR_48_0, DIG, id),\
-       SRI_ARR(HDMI_ACR_48_1, DIG, id),\
-       SRI_ARR(DP_DB_CNTL, DP, id), \
-       SRI_ARR(DP_MSA_MISC, DP, id), \
-       SRI_ARR(DP_MSA_VBID_MISC, DP, id), \
-       SRI_ARR(DP_MSA_COLORIMETRY, DP, id), \
-       SRI_ARR(DP_MSA_TIMING_PARAM1, DP, id), \
-       SRI_ARR(DP_MSA_TIMING_PARAM2, DP, id), \
-       SRI_ARR(DP_MSA_TIMING_PARAM3, DP, id), \
-       SRI_ARR(DP_MSA_TIMING_PARAM4, DP, id), \
-       SRI_ARR(DP_MSE_RATE_CNTL, DP, id), \
-       SRI_ARR(DP_MSE_RATE_UPDATE, DP, id), \
-       SRI_ARR(DP_PIXEL_FORMAT, DP, id), \
-       SRI_ARR(DP_SEC_CNTL, DP, id), \
-       SRI_ARR(DP_SEC_CNTL1, DP, id), \
-       SRI_ARR(DP_SEC_CNTL2, DP, id), \
-       SRI_ARR(DP_SEC_CNTL5, DP, id), \
-       SRI_ARR(DP_SEC_CNTL6, DP, id), \
-       SRI_ARR(DP_STEER_FIFO, DP, id), \
-       SRI_ARR(DP_VID_M, DP, id), \
-       SRI_ARR(DP_VID_N, DP, id), \
-       SRI_ARR(DP_VID_STREAM_CNTL, DP, id), \
-       SRI_ARR(DP_VID_TIMING, DP, id), \
-       SRI_ARR(DP_SEC_AUD_N, DP, id), \
-       SRI_ARR(DP_SEC_TIMESTAMP, DP, id), \
-       SRI_ARR(DP_DSC_CNTL, DP, id), \
-       SRI_ARR(DP_SEC_METADATA_TRANSMISSION, DP, id), \
-       SRI_ARR(HDMI_METADATA_PACKET_CONTROL, DIG, id), \
-       SRI_ARR(DP_SEC_FRAMING4, DP, id), \
-       SRI_ARR(DP_GSP11_CNTL, DP, id), \
-       SRI_ARR(DME_CONTROL, DME, id),\
-       SRI_ARR(DP_SEC_METADATA_TRANSMISSION, DP, id), \
-       SRI_ARR(HDMI_METADATA_PACKET_CONTROL, DIG, id), \
-       SRI_ARR(DIG_FE_CNTL, DIG, id), \
-       SRI_ARR(DIG_FE_EN_CNTL, DIG, id), \
-       SRI_ARR(DIG_FE_CLK_CNTL, DIG, id), \
-       SRI_ARR(DIG_CLOCK_PATTERN, DIG, id), \
-       SRI_ARR(DIG_FIFO_CTRL0, DIG, id), \
-       SRI_ARR(STREAM_MAPPER_CONTROL, DIG, id)
-
-#define LE_DCN35_REG_LIST_RI(id)\
-       LE_DCN3_REG_LIST_RI(id),\
-       SRI_ARR(DP_DPHY_INTERNAL_CTRL, DP, id), \
-       SR_ARR(DIO_LINKA_CNTL, id), \
-       SR_ARR(DIO_LINKB_CNTL, id), \
-       SR_ARR(DIO_LINKC_CNTL, id), \
-       SR_ARR(DIO_LINKD_CNTL, id), \
-       SR_ARR(DIO_LINKE_CNTL, id), \
-       SR_ARR(DIO_LINKF_CNTL, id),\
-       SRI_ARR(DIG_BE_CLK_CNTL, DIG, id),\
-       SR_ARR(DIO_CLK_CNTL, id)
-
-#define MCIF_WB_COMMON_REG_LIST_DCN3_5_RI(inst)  \
-       MCIF_WB_COMMON_REG_LIST_DCN32_RI(inst), \
-               SRI2_ARR(MMHUBBUB_CLOCK_CNTL, MMHUBBUB, inst)
-
-#define HWSEQ_DCN35_REG_LIST()\
-       SR(DCHUBBUB_GLOBAL_TIMER_CNTL), \
-       SR(DCHUBBUB_ARB_HOSTVM_CNTL), \
-       SR(DIO_MEM_PWR_CTRL), \
-       SR(ODM_MEM_PWR_CTRL3), \
-       SR(MMHUBBUB_MEM_PWR_CNTL), \
-       SR(DCCG_GATE_DISABLE_CNTL), \
-       SR(DCCG_GATE_DISABLE_CNTL2), \
-       SR(DCCG_GATE_DISABLE_CNTL5), \
-       SR(DCFCLK_CNTL),\
-       SR(DC_MEM_GLOBAL_PWR_REQ_CNTL), \
-       SRII(PIXEL_RATE_CNTL, OTG, 0), \
-       SRII(PIXEL_RATE_CNTL, OTG, 1),\
-       SRII(PIXEL_RATE_CNTL, OTG, 2),\
-       SRII(PIXEL_RATE_CNTL, OTG, 3),\
-       SRII(PHYPLL_PIXEL_RATE_CNTL, OTG, 0),\
-       SRII(PHYPLL_PIXEL_RATE_CNTL, OTG, 1),\
-       SRII(PHYPLL_PIXEL_RATE_CNTL, OTG, 2),\
-       SRII(PHYPLL_PIXEL_RATE_CNTL, OTG, 3),\
-       SR(MICROSECOND_TIME_BASE_DIV), \
-       SR(MILLISECOND_TIME_BASE_DIV), \
-       SR(DISPCLK_FREQ_CHANGE_CNTL), \
-       SR(RBBMIF_TIMEOUT_DIS), \
-       SR(RBBMIF_TIMEOUT_DIS_2), \
-       SR(DCHUBBUB_CRC_CTRL), \
-       SR(DPP_TOP0_DPP_CRC_CTRL), \
-       SR(DPP_TOP0_DPP_CRC_VAL_B_A), \
-       SR(DPP_TOP0_DPP_CRC_VAL_R_G), \
-       SR(MPC_CRC_CTRL), \
-       SR(MPC_CRC_RESULT_GB), \
-       SR(MPC_CRC_RESULT_C), \
-       SR(MPC_CRC_RESULT_AR), \
-       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(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(DC_IP_REQUEST_CNTL), \
-       SR(AZALIA_AUDIO_DTO), \
-       SR(AZALIA_CONTROLLER_CLOCK_GATING), \
-       SR(HPO_TOP_HW_CONTROL),\
-       SR(DMU_CLK_CNTL)
-
-/* OPTC */
-#define OPTC_COMMON_REG_LIST_DCN3_5_RI(inst)                                   \
-       SRI_ARR(OTG_VSTARTUP_PARAM, OTG, inst),\
-       SRI_ARR(OTG_VUPDATE_PARAM, OTG, inst),\
-       SRI_ARR(OTG_VREADY_PARAM, OTG, inst),\
-       SRI_ARR(OTG_MASTER_UPDATE_LOCK, OTG, inst),\
-       SRI_ARR(OTG_GLOBAL_CONTROL0, OTG, inst),\
-       SRI_ARR(OTG_GLOBAL_CONTROL1, OTG, inst),\
-       SRI_ARR(OTG_GLOBAL_CONTROL2, OTG, inst),\
-       SRI_ARR(OTG_GLOBAL_CONTROL4, OTG, inst),\
-       SRI_ARR(OTG_DOUBLE_BUFFER_CONTROL, OTG, inst),\
-       SRI_ARR(OTG_H_TOTAL, OTG, inst),\
-       SRI_ARR(OTG_H_BLANK_START_END, OTG, inst),\
-       SRI_ARR(OTG_H_SYNC_A, OTG, inst),\
-       SRI_ARR(OTG_H_SYNC_A_CNTL, OTG, inst),\
-       SRI_ARR(OTG_H_TIMING_CNTL, OTG, inst),\
-       SRI_ARR(OTG_V_TOTAL, OTG, inst),\
-       SRI_ARR(OTG_V_BLANK_START_END, OTG, inst),\
-       SRI_ARR(OTG_V_SYNC_A, OTG, inst),\
-       SRI_ARR(OTG_V_SYNC_A_CNTL, OTG, inst),\
-       SRI_ARR(OTG_CONTROL, OTG, inst),\
-       SRI_ARR(OTG_STEREO_CONTROL, OTG, inst),\
-       SRI_ARR(OTG_3D_STRUCTURE_CONTROL, OTG, inst),\
-       SRI_ARR(OTG_STEREO_STATUS, OTG, inst),\
-       SRI_ARR(OTG_V_TOTAL_MAX, OTG, inst),\
-       SRI_ARR(OTG_V_TOTAL_MIN, OTG, inst),\
-       SRI_ARR(OTG_V_TOTAL_CONTROL, OTG, inst),\
-       SRI_ARR(OTG_TRIGA_CNTL, OTG, inst),\
-       SRI_ARR(OTG_FORCE_COUNT_NOW_CNTL, OTG, inst),\
-       SRI_ARR(OTG_STATIC_SCREEN_CONTROL, OTG, inst),\
-       SRI_ARR(OTG_STATUS_FRAME_COUNT, OTG, inst),\
-       SRI_ARR(OTG_STATUS, OTG, inst),\
-       SRI_ARR(OTG_STATUS_POSITION, OTG, inst),\
-       SRI_ARR(OTG_NOM_VERT_POSITION, OTG, inst),\
-       SRI_ARR(OTG_M_CONST_DTO0, OTG, inst),\
-       SRI_ARR(OTG_M_CONST_DTO1, OTG, inst),\
-       SRI_ARR(OTG_CLOCK_CONTROL, OTG, inst),\
-       SRI_ARR(OTG_VERTICAL_INTERRUPT0_CONTROL, OTG, inst),\
-       SRI_ARR(OTG_VERTICAL_INTERRUPT0_POSITION, OTG, inst),\
-       SRI_ARR(OTG_VERTICAL_INTERRUPT1_CONTROL, OTG, inst),\
-       SRI_ARR(OTG_VERTICAL_INTERRUPT1_POSITION, OTG, inst),\
-       SRI_ARR(OTG_VERTICAL_INTERRUPT2_CONTROL, OTG, inst),\
-       SRI_ARR(OTG_VERTICAL_INTERRUPT2_POSITION, OTG, inst),\
-       SRI_ARR(OPTC_INPUT_CLOCK_CONTROL, ODM, inst),\
-       SRI_ARR(OPTC_DATA_SOURCE_SELECT, ODM, inst),\
-       SRI_ARR(OPTC_INPUT_GLOBAL_CONTROL, ODM, inst),\
-       SRI_ARR(CONTROL, VTG, inst),\
-       SRI_ARR(OTG_VERT_SYNC_CONTROL, OTG, inst),\
-       SRI_ARR(OTG_GSL_CONTROL, OTG, inst),\
-       SRI_ARR(OTG_CRC_CNTL, OTG, inst),\
-       SRI_ARR(OTG_CRC0_DATA_RG, OTG, inst),\
-       SRI_ARR(OTG_CRC0_DATA_B, OTG, inst),\
-       SRI_ARR(OTG_CRC1_DATA_RG, OTG, inst),\
-       SRI_ARR(OTG_CRC1_DATA_B, OTG, inst),\
-       SRI_ARR(OTG_CRC2_DATA_RG, OTG, inst),\
-       SRI_ARR(OTG_CRC2_DATA_B, OTG, inst),\
-       SRI_ARR(OTG_CRC3_DATA_RG, OTG, inst),\
-       SRI_ARR(OTG_CRC3_DATA_B, OTG, inst),\
-       SRI_ARR(OTG_CRC0_WINDOWA_X_CONTROL, OTG, inst),\
-       SRI_ARR(OTG_CRC0_WINDOWA_Y_CONTROL, OTG, inst),\
-       SRI_ARR(OTG_CRC0_WINDOWB_X_CONTROL, OTG, inst),\
-       SRI_ARR(OTG_CRC0_WINDOWB_Y_CONTROL, OTG, inst),\
-       SRI_ARR(OTG_CRC1_WINDOWA_X_CONTROL, OTG, inst),\
-       SRI_ARR(OTG_CRC1_WINDOWA_Y_CONTROL, OTG, inst),\
-       SRI_ARR(OTG_CRC1_WINDOWB_X_CONTROL, OTG, inst),\
-       SRI_ARR(OTG_CRC1_WINDOWB_Y_CONTROL, OTG, inst),\
-       SRI_ARR(OTG_CRC0_WINDOWA_X_CONTROL_READBACK, OTG, inst),\
-       SRI_ARR(OTG_CRC0_WINDOWA_Y_CONTROL_READBACK, OTG, inst),\
-       SRI_ARR(OTG_CRC0_WINDOWB_X_CONTROL_READBACK, OTG, inst),\
-       SRI_ARR(OTG_CRC0_WINDOWB_Y_CONTROL_READBACK, OTG, inst),\
-       SRI_ARR(OTG_CRC1_WINDOWA_X_CONTROL_READBACK, OTG, inst),\
-       SRI_ARR(OTG_CRC1_WINDOWA_Y_CONTROL_READBACK, OTG, inst),\
-       SRI_ARR(OTG_CRC1_WINDOWB_X_CONTROL_READBACK, OTG, inst),\
-       SRI_ARR(OTG_CRC1_WINDOWB_Y_CONTROL_READBACK, OTG, inst),\
-       SR_ARR(GSL_SOURCE_SELECT, inst),\
-       SRI_ARR(OTG_TRIGA_MANUAL_TRIG, OTG, inst),\
-       SRI_ARR(OTG_GLOBAL_CONTROL1, OTG, inst),\
-       SRI_ARR(OTG_GLOBAL_CONTROL2, OTG, inst),\
-       SRI_ARR(OTG_GSL_WINDOW_X, OTG, inst),\
-       SRI_ARR(OTG_GSL_WINDOW_Y, OTG, inst),\
-       SRI_ARR(OTG_VUPDATE_KEEPOUT, OTG, inst),\
-       SRI_ARR(OTG_DSC_START_POSITION, OTG, inst),\
-       SRI_ARR(OTG_DRR_TRIGGER_WINDOW, OTG, inst),\
-       SRI_ARR(OTG_DRR_V_TOTAL_CHANGE, OTG, inst),\
-       SRI_ARR(OPTC_DATA_FORMAT_CONTROL, ODM, inst),\
-       SRI_ARR(OPTC_BYTES_PER_PIXEL, ODM, inst),\
-       SRI_ARR(OPTC_WIDTH_CONTROL, ODM, inst),\
-       SRI_ARR(OPTC_MEMORY_CONFIG, ODM, inst),\
-       SRI_ARR(OTG_DRR_CONTROL, OTG, inst),\
-       SRI2_ARR(OPTC_CLOCK_CONTROL, OPTC, inst)
-
-/* DPP */
-#define DPP_REG_LIST_DCN35_RI(id)\
-       DPP_REG_LIST_DCN30_COMMON_RI(id)
-
-#endif /* _DCN35_RESOURCE_H_ */
index 50b0434354f8f5778ab825864fe46b1f25505ccd..0c4a8fe8e5ca6249417e5975dc61372f4d1fbdb6 100644 (file)
@@ -30,7 +30,7 @@
 #include "dcn_calc_auto.h"
 #include "dal_asic_id.h"
 #include "resource.h"
-#include "dcn10/dcn10_resource.h"
+#include "resource/dcn10/dcn10_resource.h"
 #include "dcn10/dcn10_hubbub.h"
 #include "dml/dml1_display_rq_dlg_calc.h"
 
diff --git a/drivers/gpu/drm/amd/display/dc/resource/Makefile b/drivers/gpu/drm/amd/display/dc/resource/Makefile
new file mode 100644 (file)
index 0000000..0a75ed8
--- /dev/null
@@ -0,0 +1,199 @@
+
+# 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.
+#
+# Makefile for the 'resource' sub-component of DAL.
+#
+
+
+###############################################################################
+#  DCE
+###############################################################################
+
+RESOURCE_DCE100 = dce100_resource.o
+
+AMD_DAL_RESOURCE_DCE100 = $(addprefix $(AMDDALPATH)/dc/resource/dce100/,$(RESOURCE_DCE100))
+
+AMD_DISPLAY_FILES += $(AMD_DAL_RESOURCE_DCE100)
+
+###############################################################################
+
+RESOURCE_DCE110 = dce110_resource.o
+
+AMD_DAL_RESOURCE_DCE110 = $(addprefix $(AMDDALPATH)/dc/resource/dce110/,$(RESOURCE_DCE110))
+
+AMD_DISPLAY_FILES += $(AMD_DAL_RESOURCE_DCE110)
+
+###############################################################################
+
+RESOURCE_DCE112 = dce112_resource.o
+
+AMD_DAL_RESOURCE_DCE112 = $(addprefix $(AMDDALPATH)/dc/resource/dce112/,$(RESOURCE_DCE112))
+
+AMD_DISPLAY_FILES += $(AMD_DAL_RESOURCE_DCE112)
+
+###############################################################################
+
+RESOURCE_DCE120 = dce120_resource.o
+
+AMD_DAL_RESOURCE_DCE120 = $(addprefix $(AMDDALPATH)/dc/resource/dce120/,$(RESOURCE_DCE120))
+
+AMD_DISPLAY_FILES += $(AMD_DAL_RESOURCE_DCE120)
+
+###############################################################################
+
+RESOURCE_DCE80 = dce80_resource.o
+
+AMD_DAL_RESOURCE_DCE80 = $(addprefix $(AMDDALPATH)/dc/resource/dce80/,$(RESOURCE_DCE80))
+
+AMD_DISPLAY_FILES += $(AMD_DAL_RESOURCE_DCE80)
+
+ifdef CONFIG_DRM_AMD_DC_FP
+###############################################################################
+# DCN
+###############################################################################
+
+RESOURCE_DCN10 = dcn10_resource.o
+
+AMD_DAL_RESOURCE_DCN10 = $(addprefix $(AMDDALPATH)/dc/resource/dcn10/,$(RESOURCE_DCN10))
+
+AMD_DISPLAY_FILES += $(AMD_DAL_RESOURCE_DCN10)
+
+###############################################################################
+
+RESOURCE_DCN20 = dcn20_resource.o
+
+AMD_DAL_RESOURCE_DCN20 = $(addprefix $(AMDDALPATH)/dc/resource/dcn20/,$(RESOURCE_DCN20))
+
+AMD_DISPLAY_FILES += $(AMD_DAL_RESOURCE_DCN20)
+
+###############################################################################
+
+RESOURCE_DCN201 = dcn201_resource.o
+
+AMD_DAL_RESOURCE_DCN201 = $(addprefix $(AMDDALPATH)/dc/resource/dcn201/,$(RESOURCE_DCN201))
+
+AMD_DISPLAY_FILES += $(AMD_DAL_RESOURCE_DCN201)
+
+###############################################################################
+
+RESOURCE_DCN21 = dcn21_resource.o
+
+AMD_DAL_RESOURCE_DCN21 = $(addprefix $(AMDDALPATH)/dc/resource/dcn21/,$(RESOURCE_DCN21))
+
+AMD_DISPLAY_FILES += $(AMD_DAL_RESOURCE_DCN21)
+
+###############################################################################
+
+###############################################################################
+
+###############################################################################
+
+RESOURCE_DCN30 = dcn30_resource.o
+
+AMD_DAL_RESOURCE_DCN30 = $(addprefix $(AMDDALPATH)/dc/resource/dcn30/,$(RESOURCE_DCN30))
+
+AMD_DISPLAY_FILES += $(AMD_DAL_RESOURCE_DCN30)
+
+###############################################################################
+
+RESOURCE_DCN301 = dcn301_resource.o
+
+AMD_DAL_RESOURCE_DCN301 = $(addprefix $(AMDDALPATH)/dc/resource/dcn301/,$(RESOURCE_DCN301))
+
+AMD_DISPLAY_FILES += $(AMD_DAL_RESOURCE_DCN301)
+
+###############################################################################
+
+RESOURCE_DCN302 = dcn302_resource.o
+
+AMD_DAL_RESOURCE_DCN302 = $(addprefix $(AMDDALPATH)/dc/resource/dcn302/,$(RESOURCE_DCN302))
+
+AMD_DISPLAY_FILES += $(AMD_DAL_RESOURCE_DCN302)
+
+###############################################################################
+
+RESOURCE_DCN303 = dcn303_resource.o
+
+AMD_DAL_RESOURCE_DCN303 = $(addprefix $(AMDDALPATH)/dc/resource/dcn303/,$(RESOURCE_DCN303))
+
+AMD_DISPLAY_FILES += $(AMD_DAL_RESOURCE_DCN303)
+
+###############################################################################
+
+RESOURCE_DCN31 = dcn31_resource.o
+
+AMD_DAL_RESOURCE_DCN31 = $(addprefix $(AMDDALPATH)/dc/resource/dcn31/,$(RESOURCE_DCN31))
+
+AMD_DISPLAY_FILES += $(AMD_DAL_RESOURCE_DCN31)
+
+###############################################################################
+
+RESOURCE_DCN314 = dcn314_resource.o
+
+AMD_DAL_RESOURCE_DCN314 = $(addprefix $(AMDDALPATH)/dc/resource/dcn314/,$(RESOURCE_DCN314))
+
+AMD_DISPLAY_FILES += $(AMD_DAL_RESOURCE_DCN314)
+
+###############################################################################
+
+RESOURCE_DCN315 = dcn315_resource.o
+
+AMD_DAL_RESOURCE_DCN315 = $(addprefix $(AMDDALPATH)/dc/resource/dcn315/,$(RESOURCE_DCN315))
+
+AMD_DISPLAY_FILES += $(AMD_DAL_RESOURCE_DCN315)
+
+###############################################################################
+
+RESOURCE_DCN316 = dcn316_resource.o
+
+AMD_DAL_RESOURCE_DCN316 = $(addprefix $(AMDDALPATH)/dc/resource/dcn316/,$(RESOURCE_DCN316))
+
+AMD_DISPLAY_FILES += $(AMD_DAL_RESOURCE_DCN316)
+
+###############################################################################
+
+RESOURCE_DCN32 = dcn32_resource.o
+
+AMD_DAL_RESOURCE_DCN32 = $(addprefix $(AMDDALPATH)/dc/resource/dcn32/,$(RESOURCE_DCN32))
+
+AMD_DISPLAY_FILES += $(AMD_DAL_RESOURCE_DCN32)
+
+###############################################################################
+
+RESOURCE_DCN321 = dcn321_resource.o
+
+AMD_DAL_RESOURCE_DCN321 = $(addprefix $(AMDDALPATH)/dc/resource/dcn321/,$(RESOURCE_DCN321))
+
+AMD_DISPLAY_FILES += $(AMD_DAL_RESOURCE_DCN321)
+
+###############################################################################
+
+RESOURCE_DCN35 = dcn35_resource.o
+
+AMD_DAL_RESOURCE_DCN35 = $(addprefix $(AMDDALPATH)/dc/resource/dcn35/,$(RESOURCE_DCN35))
+
+AMD_DISPLAY_FILES += $(AMD_DAL_RESOURCE_DCN35)
+
+###############################################################################
+
+###############################################################################
+
+endif
diff --git a/drivers/gpu/drm/amd/display/dc/resource/dce100/dce100_resource.c b/drivers/gpu/drm/amd/display/dc/resource/dce100/dce100_resource.c
new file mode 100644 (file)
index 0000000..53a5f4c
--- /dev/null
@@ -0,0 +1,1179 @@
+/*
+ * Copyright 2012-15 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 "dm_services.h"
+
+#include "link_encoder.h"
+#include "stream_encoder.h"
+
+#include "resource.h"
+#include "include/irq_service_interface.h"
+#include "virtual/virtual_stream_encoder.h"
+#include "dce110/dce110_resource.h"
+#include "dce110/dce110_timing_generator.h"
+#include "irq/dce110/irq_service_dce110.h"
+#include "dce/dce_link_encoder.h"
+#include "dce/dce_stream_encoder.h"
+#include "dce/dce_mem_input.h"
+#include "dce/dce_ipp.h"
+#include "dce/dce_transform.h"
+#include "dce/dce_opp.h"
+#include "dce/dce_clock_source.h"
+#include "dce/dce_audio.h"
+#include "dce/dce_hwseq.h"
+#include "dce100/dce100_hwseq.h"
+#include "dce/dce_panel_cntl.h"
+
+#include "reg_helper.h"
+
+#include "dce/dce_10_0_d.h"
+#include "dce/dce_10_0_sh_mask.h"
+
+#include "dce/dce_dmcu.h"
+#include "dce/dce_aux.h"
+#include "dce/dce_abm.h"
+#include "dce/dce_i2c.h"
+
+#include "dce100_resource.h"
+
+#ifndef mmMC_HUB_RDREQ_DMIF_LIMIT
+#include "gmc/gmc_8_2_d.h"
+#include "gmc/gmc_8_2_sh_mask.h"
+#endif
+
+#ifndef mmDP_DPHY_INTERNAL_CTRL
+       #define mmDP_DPHY_INTERNAL_CTRL 0x4aa7
+       #define mmDP0_DP_DPHY_INTERNAL_CTRL 0x4aa7
+       #define mmDP1_DP_DPHY_INTERNAL_CTRL 0x4ba7
+       #define mmDP2_DP_DPHY_INTERNAL_CTRL 0x4ca7
+       #define mmDP3_DP_DPHY_INTERNAL_CTRL 0x4da7
+       #define mmDP4_DP_DPHY_INTERNAL_CTRL 0x4ea7
+       #define mmDP5_DP_DPHY_INTERNAL_CTRL 0x4fa7
+       #define mmDP6_DP_DPHY_INTERNAL_CTRL 0x54a7
+       #define mmDP7_DP_DPHY_INTERNAL_CTRL 0x56a7
+       #define mmDP8_DP_DPHY_INTERNAL_CTRL 0x57a7
+#endif
+
+#ifndef mmBIOS_SCRATCH_2
+       #define mmBIOS_SCRATCH_2 0x05CB
+       #define mmBIOS_SCRATCH_3 0x05CC
+       #define mmBIOS_SCRATCH_6 0x05CF
+#endif
+
+#ifndef mmDP_DPHY_BS_SR_SWAP_CNTL
+       #define mmDP_DPHY_BS_SR_SWAP_CNTL                       0x4ADC
+       #define mmDP0_DP_DPHY_BS_SR_SWAP_CNTL                   0x4ADC
+       #define mmDP1_DP_DPHY_BS_SR_SWAP_CNTL                   0x4BDC
+       #define mmDP2_DP_DPHY_BS_SR_SWAP_CNTL                   0x4CDC
+       #define mmDP3_DP_DPHY_BS_SR_SWAP_CNTL                   0x4DDC
+       #define mmDP4_DP_DPHY_BS_SR_SWAP_CNTL                   0x4EDC
+       #define mmDP5_DP_DPHY_BS_SR_SWAP_CNTL                   0x4FDC
+       #define mmDP6_DP_DPHY_BS_SR_SWAP_CNTL                   0x54DC
+#endif
+
+#ifndef mmDP_DPHY_FAST_TRAINING
+       #define mmDP_DPHY_FAST_TRAINING                         0x4ABC
+       #define mmDP0_DP_DPHY_FAST_TRAINING                     0x4ABC
+       #define mmDP1_DP_DPHY_FAST_TRAINING                     0x4BBC
+       #define mmDP2_DP_DPHY_FAST_TRAINING                     0x4CBC
+       #define mmDP3_DP_DPHY_FAST_TRAINING                     0x4DBC
+       #define mmDP4_DP_DPHY_FAST_TRAINING                     0x4EBC
+       #define mmDP5_DP_DPHY_FAST_TRAINING                     0x4FBC
+       #define mmDP6_DP_DPHY_FAST_TRAINING                     0x54BC
+#endif
+
+static const struct dce110_timing_generator_offsets dce100_tg_offsets[] = {
+       {
+               .crtc = (mmCRTC0_CRTC_CONTROL - mmCRTC_CONTROL),
+               .dcp =  (mmDCP0_GRPH_CONTROL - mmGRPH_CONTROL),
+       },
+       {
+               .crtc = (mmCRTC1_CRTC_CONTROL - mmCRTC_CONTROL),
+               .dcp = (mmDCP1_GRPH_CONTROL - mmGRPH_CONTROL),
+       },
+       {
+               .crtc = (mmCRTC2_CRTC_CONTROL - mmCRTC_CONTROL),
+               .dcp = (mmDCP2_GRPH_CONTROL - mmGRPH_CONTROL),
+       },
+       {
+               .crtc = (mmCRTC3_CRTC_CONTROL - mmCRTC_CONTROL),
+               .dcp =  (mmDCP3_GRPH_CONTROL - mmGRPH_CONTROL),
+       },
+       {
+               .crtc = (mmCRTC4_CRTC_CONTROL - mmCRTC_CONTROL),
+               .dcp = (mmDCP4_GRPH_CONTROL - mmGRPH_CONTROL),
+       },
+       {
+               .crtc = (mmCRTC5_CRTC_CONTROL - mmCRTC_CONTROL),
+               .dcp = (mmDCP5_GRPH_CONTROL - mmGRPH_CONTROL),
+       }
+};
+
+/* set register offset */
+#define SR(reg_name)\
+       .reg_name = mm ## reg_name
+
+/* set register offset with instance */
+#define SRI(reg_name, block, id)\
+       .reg_name = mm ## block ## id ## _ ## reg_name
+
+#define ipp_regs(id)\
+[id] = {\
+               IPP_DCE100_REG_LIST_DCE_BASE(id)\
+}
+
+static const struct dce_ipp_registers ipp_regs[] = {
+               ipp_regs(0),
+               ipp_regs(1),
+               ipp_regs(2),
+               ipp_regs(3),
+               ipp_regs(4),
+               ipp_regs(5)
+};
+
+static const struct dce_ipp_shift ipp_shift = {
+               IPP_DCE100_MASK_SH_LIST_DCE_COMMON_BASE(__SHIFT)
+};
+
+static const struct dce_ipp_mask ipp_mask = {
+               IPP_DCE100_MASK_SH_LIST_DCE_COMMON_BASE(_MASK)
+};
+
+#define transform_regs(id)\
+[id] = {\
+               XFM_COMMON_REG_LIST_DCE100(id)\
+}
+
+static const struct dce_transform_registers xfm_regs[] = {
+               transform_regs(0),
+               transform_regs(1),
+               transform_regs(2),
+               transform_regs(3),
+               transform_regs(4),
+               transform_regs(5)
+};
+
+static const struct dce_transform_shift xfm_shift = {
+               XFM_COMMON_MASK_SH_LIST_DCE110(__SHIFT)
+};
+
+static const struct dce_transform_mask xfm_mask = {
+               XFM_COMMON_MASK_SH_LIST_DCE110(_MASK)
+};
+
+#define aux_regs(id)\
+[id] = {\
+       AUX_REG_LIST(id)\
+}
+
+static const struct dce110_link_enc_aux_registers link_enc_aux_regs[] = {
+               aux_regs(0),
+               aux_regs(1),
+               aux_regs(2),
+               aux_regs(3),
+               aux_regs(4),
+               aux_regs(5)
+};
+
+#define hpd_regs(id)\
+[id] = {\
+       HPD_REG_LIST(id)\
+}
+
+static const struct dce110_link_enc_hpd_registers link_enc_hpd_regs[] = {
+               hpd_regs(0),
+               hpd_regs(1),
+               hpd_regs(2),
+               hpd_regs(3),
+               hpd_regs(4),
+               hpd_regs(5)
+};
+
+#define link_regs(id)\
+[id] = {\
+       LE_DCE100_REG_LIST(id)\
+}
+
+static const struct dce110_link_enc_registers link_enc_regs[] = {
+       link_regs(0),
+       link_regs(1),
+       link_regs(2),
+       link_regs(3),
+       link_regs(4),
+       link_regs(5),
+       link_regs(6),
+};
+
+#define stream_enc_regs(id)\
+[id] = {\
+       SE_COMMON_REG_LIST_DCE_BASE(id),\
+       .AFMT_CNTL = 0,\
+}
+
+static const struct dce110_stream_enc_registers stream_enc_regs[] = {
+       stream_enc_regs(0),
+       stream_enc_regs(1),
+       stream_enc_regs(2),
+       stream_enc_regs(3),
+       stream_enc_regs(4),
+       stream_enc_regs(5),
+       stream_enc_regs(6)
+};
+
+static const struct dce_stream_encoder_shift se_shift = {
+               SE_COMMON_MASK_SH_LIST_DCE80_100(__SHIFT)
+};
+
+static const struct dce_stream_encoder_mask se_mask = {
+               SE_COMMON_MASK_SH_LIST_DCE80_100(_MASK)
+};
+
+static const struct dce_panel_cntl_registers panel_cntl_regs[] = {
+       { DCE_PANEL_CNTL_REG_LIST() }
+};
+
+static const struct dce_panel_cntl_shift panel_cntl_shift = {
+       DCE_PANEL_CNTL_MASK_SH_LIST(__SHIFT)
+};
+
+static const struct dce_panel_cntl_mask panel_cntl_mask = {
+       DCE_PANEL_CNTL_MASK_SH_LIST(_MASK)
+};
+
+#define opp_regs(id)\
+[id] = {\
+       OPP_DCE_100_REG_LIST(id),\
+}
+
+static const struct dce_opp_registers opp_regs[] = {
+       opp_regs(0),
+       opp_regs(1),
+       opp_regs(2),
+       opp_regs(3),
+       opp_regs(4),
+       opp_regs(5)
+};
+
+static const struct dce_opp_shift opp_shift = {
+       OPP_COMMON_MASK_SH_LIST_DCE_100(__SHIFT)
+};
+
+static const struct dce_opp_mask opp_mask = {
+       OPP_COMMON_MASK_SH_LIST_DCE_100(_MASK)
+};
+#define aux_engine_regs(id)\
+[id] = {\
+       AUX_COMMON_REG_LIST(id), \
+       .AUX_RESET_MASK = 0 \
+}
+
+static const struct dce110_aux_registers aux_engine_regs[] = {
+               aux_engine_regs(0),
+               aux_engine_regs(1),
+               aux_engine_regs(2),
+               aux_engine_regs(3),
+               aux_engine_regs(4),
+               aux_engine_regs(5)
+};
+
+#define audio_regs(id)\
+[id] = {\
+       AUD_COMMON_REG_LIST(id)\
+}
+
+static const struct dce_audio_registers audio_regs[] = {
+       audio_regs(0),
+       audio_regs(1),
+       audio_regs(2),
+       audio_regs(3),
+       audio_regs(4),
+       audio_regs(5),
+       audio_regs(6),
+};
+
+static const struct dce_audio_shift audio_shift = {
+               AUD_COMMON_MASK_SH_LIST(__SHIFT)
+};
+
+static const struct dce_audio_mask audio_mask = {
+               AUD_COMMON_MASK_SH_LIST(_MASK)
+};
+
+#define clk_src_regs(id)\
+[id] = {\
+       CS_COMMON_REG_LIST_DCE_100_110(id),\
+}
+
+static const struct dce110_clk_src_regs clk_src_regs[] = {
+       clk_src_regs(0),
+       clk_src_regs(1),
+       clk_src_regs(2)
+};
+
+static const struct dce110_clk_src_shift cs_shift = {
+               CS_COMMON_MASK_SH_LIST_DCE_COMMON_BASE(__SHIFT)
+};
+
+static const struct dce110_clk_src_mask cs_mask = {
+               CS_COMMON_MASK_SH_LIST_DCE_COMMON_BASE(_MASK)
+};
+
+static const struct dce_dmcu_registers dmcu_regs = {
+               DMCU_DCE110_COMMON_REG_LIST()
+};
+
+static const struct dce_dmcu_shift dmcu_shift = {
+               DMCU_MASK_SH_LIST_DCE110(__SHIFT)
+};
+
+static const struct dce_dmcu_mask dmcu_mask = {
+               DMCU_MASK_SH_LIST_DCE110(_MASK)
+};
+
+static const struct dce_abm_registers abm_regs = {
+               ABM_DCE110_COMMON_REG_LIST()
+};
+
+static const struct dce_abm_shift abm_shift = {
+               ABM_MASK_SH_LIST_DCE110(__SHIFT)
+};
+
+static const struct dce_abm_mask abm_mask = {
+               ABM_MASK_SH_LIST_DCE110(_MASK)
+};
+
+#define DCFE_MEM_PWR_CTRL_REG_BASE 0x1b03
+
+static const struct bios_registers bios_regs = {
+       .BIOS_SCRATCH_3 = mmBIOS_SCRATCH_3,
+       .BIOS_SCRATCH_6 = mmBIOS_SCRATCH_6
+};
+
+static const struct resource_caps res_cap = {
+       .num_timing_generator = 6,
+       .num_audio = 6,
+       .num_stream_encoder = 6,
+       .num_pll = 3,
+       .num_ddc = 6,
+};
+
+static const struct dc_plane_cap plane_cap = {
+       .type = DC_PLANE_TYPE_DCE_RGB,
+
+       .pixel_format_support = {
+                       .argb8888 = true,
+                       .nv12 = false,
+                       .fp16 = true
+       },
+
+       .max_upscale_factor = {
+                       .argb8888 = 16000,
+                       .nv12 = 1,
+                       .fp16 = 1
+       },
+
+       .max_downscale_factor = {
+                       .argb8888 = 250,
+                       .nv12 = 1,
+                       .fp16 = 1
+       }
+};
+
+static const struct dc_debug_options debug_defaults = {
+               .enable_legacy_fast_update = true,
+};
+
+#define CTX  ctx
+#define REG(reg) mm ## reg
+
+#ifndef mmCC_DC_HDMI_STRAPS
+#define mmCC_DC_HDMI_STRAPS 0x1918
+#define CC_DC_HDMI_STRAPS__HDMI_DISABLE_MASK 0x40
+#define CC_DC_HDMI_STRAPS__HDMI_DISABLE__SHIFT 0x6
+#define CC_DC_HDMI_STRAPS__AUDIO_STREAM_NUMBER_MASK 0x700
+#define CC_DC_HDMI_STRAPS__AUDIO_STREAM_NUMBER__SHIFT 0x8
+#endif
+
+static int map_transmitter_id_to_phy_instance(
+       enum transmitter transmitter)
+{
+       switch (transmitter) {
+       case TRANSMITTER_UNIPHY_A:
+               return 0;
+       case TRANSMITTER_UNIPHY_B:
+               return 1;
+       case TRANSMITTER_UNIPHY_C:
+               return 2;
+       case TRANSMITTER_UNIPHY_D:
+               return 3;
+       case TRANSMITTER_UNIPHY_E:
+               return 4;
+       case TRANSMITTER_UNIPHY_F:
+               return 5;
+       case TRANSMITTER_UNIPHY_G:
+               return 6;
+       default:
+               ASSERT(0);
+               return 0;
+       }
+}
+
+static void read_dce_straps(
+       struct dc_context *ctx,
+       struct resource_straps *straps)
+{
+       REG_GET_2(CC_DC_HDMI_STRAPS,
+                       HDMI_DISABLE, &straps->hdmi_disable,
+                       AUDIO_STREAM_NUMBER, &straps->audio_stream_number);
+
+       REG_GET(DC_PINSTRAPS, DC_PINSTRAPS_AUDIO, &straps->dc_pinstraps_audio);
+}
+
+static struct audio *create_audio(
+               struct dc_context *ctx, unsigned int inst)
+{
+       return dce_audio_create(ctx, inst,
+                       &audio_regs[inst], &audio_shift, &audio_mask);
+}
+
+static struct timing_generator *dce100_timing_generator_create(
+               struct dc_context *ctx,
+               uint32_t instance,
+               const struct dce110_timing_generator_offsets *offsets)
+{
+       struct dce110_timing_generator *tg110 =
+               kzalloc(sizeof(struct dce110_timing_generator), GFP_KERNEL);
+
+       if (!tg110)
+               return NULL;
+
+       dce110_timing_generator_construct(tg110, ctx, instance, offsets);
+       return &tg110->base;
+}
+
+static struct stream_encoder *dce100_stream_encoder_create(
+       enum engine_id eng_id,
+       struct dc_context *ctx)
+{
+       struct dce110_stream_encoder *enc110 =
+               kzalloc(sizeof(struct dce110_stream_encoder), GFP_KERNEL);
+
+       if (!enc110)
+               return NULL;
+
+       dce110_stream_encoder_construct(enc110, ctx, ctx->dc_bios, eng_id,
+                                       &stream_enc_regs[eng_id], &se_shift, &se_mask);
+       return &enc110->base;
+}
+
+#define SRII(reg_name, block, id)\
+       .reg_name[id] = mm ## block ## id ## _ ## reg_name
+
+static const struct dce_hwseq_registers hwseq_reg = {
+               HWSEQ_DCE10_REG_LIST()
+};
+
+static const struct dce_hwseq_shift hwseq_shift = {
+               HWSEQ_DCE10_MASK_SH_LIST(__SHIFT)
+};
+
+static const struct dce_hwseq_mask hwseq_mask = {
+               HWSEQ_DCE10_MASK_SH_LIST(_MASK)
+};
+
+static struct dce_hwseq *dce100_hwseq_create(
+       struct dc_context *ctx)
+{
+       struct dce_hwseq *hws = kzalloc(sizeof(struct dce_hwseq), GFP_KERNEL);
+
+       if (hws) {
+               hws->ctx = ctx;
+               hws->regs = &hwseq_reg;
+               hws->shifts = &hwseq_shift;
+               hws->masks = &hwseq_mask;
+       }
+       return hws;
+}
+
+static const struct resource_create_funcs res_create_funcs = {
+       .read_dce_straps = read_dce_straps,
+       .create_audio = create_audio,
+       .create_stream_encoder = dce100_stream_encoder_create,
+       .create_hwseq = dce100_hwseq_create,
+};
+
+#define mi_inst_regs(id) { \
+       MI_DCE8_REG_LIST(id), \
+       .MC_HUB_RDREQ_DMIF_LIMIT = mmMC_HUB_RDREQ_DMIF_LIMIT \
+}
+static const struct dce_mem_input_registers mi_regs[] = {
+               mi_inst_regs(0),
+               mi_inst_regs(1),
+               mi_inst_regs(2),
+               mi_inst_regs(3),
+               mi_inst_regs(4),
+               mi_inst_regs(5),
+};
+
+static const struct dce_mem_input_shift mi_shifts = {
+               MI_DCE8_MASK_SH_LIST(__SHIFT),
+               .ENABLE = MC_HUB_RDREQ_DMIF_LIMIT__ENABLE__SHIFT
+};
+
+static const struct dce_mem_input_mask mi_masks = {
+               MI_DCE8_MASK_SH_LIST(_MASK),
+               .ENABLE = MC_HUB_RDREQ_DMIF_LIMIT__ENABLE_MASK
+};
+
+static const struct dce110_aux_registers_shift aux_shift = {
+       DCE10_AUX_MASK_SH_LIST(__SHIFT)
+};
+
+static const struct dce110_aux_registers_mask aux_mask = {
+       DCE10_AUX_MASK_SH_LIST(_MASK)
+};
+
+static struct mem_input *dce100_mem_input_create(
+       struct dc_context *ctx,
+       uint32_t inst)
+{
+       struct dce_mem_input *dce_mi = kzalloc(sizeof(struct dce_mem_input),
+                                              GFP_KERNEL);
+
+       if (!dce_mi) {
+               BREAK_TO_DEBUGGER();
+               return NULL;
+       }
+
+       dce_mem_input_construct(dce_mi, ctx, inst, &mi_regs[inst], &mi_shifts, &mi_masks);
+       dce_mi->wa.single_head_rdreq_dmif_limit = 2;
+       return &dce_mi->base;
+}
+
+static void dce100_transform_destroy(struct transform **xfm)
+{
+       kfree(TO_DCE_TRANSFORM(*xfm));
+       *xfm = NULL;
+}
+
+static struct transform *dce100_transform_create(
+       struct dc_context *ctx,
+       uint32_t inst)
+{
+       struct dce_transform *transform =
+               kzalloc(sizeof(struct dce_transform), GFP_KERNEL);
+
+       if (!transform)
+               return NULL;
+
+       dce_transform_construct(transform, ctx, inst,
+                               &xfm_regs[inst], &xfm_shift, &xfm_mask);
+       return &transform->base;
+}
+
+static struct input_pixel_processor *dce100_ipp_create(
+       struct dc_context *ctx, uint32_t inst)
+{
+       struct dce_ipp *ipp = kzalloc(sizeof(struct dce_ipp), GFP_KERNEL);
+
+       if (!ipp) {
+               BREAK_TO_DEBUGGER();
+               return NULL;
+       }
+
+       dce_ipp_construct(ipp, ctx, inst,
+                       &ipp_regs[inst], &ipp_shift, &ipp_mask);
+       return &ipp->base;
+}
+
+static const struct encoder_feature_support link_enc_feature = {
+               .max_hdmi_deep_color = COLOR_DEPTH_121212,
+               .max_hdmi_pixel_clock = 300000,
+               .flags.bits.IS_HBR2_CAPABLE = true,
+               .flags.bits.IS_TPS3_CAPABLE = true
+};
+
+static struct link_encoder *dce100_link_encoder_create(
+       struct dc_context *ctx,
+       const struct encoder_init_data *enc_init_data)
+{
+       struct dce110_link_encoder *enc110 =
+               kzalloc(sizeof(struct dce110_link_encoder), GFP_KERNEL);
+       int link_regs_id;
+
+       if (!enc110)
+               return NULL;
+
+       link_regs_id =
+               map_transmitter_id_to_phy_instance(enc_init_data->transmitter);
+
+       dce110_link_encoder_construct(enc110,
+                                     enc_init_data,
+                                     &link_enc_feature,
+                                     &link_enc_regs[link_regs_id],
+                                     &link_enc_aux_regs[enc_init_data->channel - 1],
+                                     &link_enc_hpd_regs[enc_init_data->hpd_source]);
+       return &enc110->base;
+}
+
+static struct panel_cntl *dce100_panel_cntl_create(const struct panel_cntl_init_data *init_data)
+{
+       struct dce_panel_cntl *panel_cntl =
+               kzalloc(sizeof(struct dce_panel_cntl), GFP_KERNEL);
+
+       if (!panel_cntl)
+               return NULL;
+
+       dce_panel_cntl_construct(panel_cntl,
+                       init_data,
+                       &panel_cntl_regs[init_data->inst],
+                       &panel_cntl_shift,
+                       &panel_cntl_mask);
+
+       return &panel_cntl->base;
+}
+
+static struct output_pixel_processor *dce100_opp_create(
+       struct dc_context *ctx,
+       uint32_t inst)
+{
+       struct dce110_opp *opp =
+               kzalloc(sizeof(struct dce110_opp), GFP_KERNEL);
+
+       if (!opp)
+               return NULL;
+
+       dce110_opp_construct(opp,
+                            ctx, inst, &opp_regs[inst], &opp_shift, &opp_mask);
+       return &opp->base;
+}
+
+static struct dce_aux *dce100_aux_engine_create(
+       struct dc_context *ctx,
+       uint32_t inst)
+{
+       struct aux_engine_dce110 *aux_engine =
+               kzalloc(sizeof(struct aux_engine_dce110), GFP_KERNEL);
+
+       if (!aux_engine)
+               return NULL;
+
+       dce110_aux_engine_construct(aux_engine, ctx, inst,
+                                   SW_AUX_TIMEOUT_PERIOD_MULTIPLIER * AUX_TIMEOUT_PERIOD,
+                                   &aux_engine_regs[inst],
+                                       &aux_mask,
+                                       &aux_shift,
+                                       ctx->dc->caps.extended_aux_timeout_support);
+
+       return &aux_engine->base;
+}
+#define i2c_inst_regs(id) { I2C_HW_ENGINE_COMMON_REG_LIST(id) }
+
+static const struct dce_i2c_registers i2c_hw_regs[] = {
+               i2c_inst_regs(1),
+               i2c_inst_regs(2),
+               i2c_inst_regs(3),
+               i2c_inst_regs(4),
+               i2c_inst_regs(5),
+               i2c_inst_regs(6),
+};
+
+static const struct dce_i2c_shift i2c_shifts = {
+               I2C_COMMON_MASK_SH_LIST_DCE_COMMON_BASE(__SHIFT)
+};
+
+static const struct dce_i2c_mask i2c_masks = {
+               I2C_COMMON_MASK_SH_LIST_DCE_COMMON_BASE(_MASK)
+};
+
+static struct dce_i2c_hw *dce100_i2c_hw_create(
+       struct dc_context *ctx,
+       uint32_t inst)
+{
+       struct dce_i2c_hw *dce_i2c_hw =
+               kzalloc(sizeof(struct dce_i2c_hw), GFP_KERNEL);
+
+       if (!dce_i2c_hw)
+               return NULL;
+
+       dce100_i2c_hw_construct(dce_i2c_hw, ctx, inst,
+                                   &i2c_hw_regs[inst], &i2c_shifts, &i2c_masks);
+
+       return dce_i2c_hw;
+}
+static struct clock_source *dce100_clock_source_create(
+       struct dc_context *ctx,
+       struct dc_bios *bios,
+       enum clock_source_id id,
+       const struct dce110_clk_src_regs *regs,
+       bool dp_clk_src)
+{
+       struct dce110_clk_src *clk_src =
+               kzalloc(sizeof(struct dce110_clk_src), GFP_KERNEL);
+
+       if (!clk_src)
+               return NULL;
+
+       if (dce110_clk_src_construct(clk_src, ctx, bios, id,
+                       regs, &cs_shift, &cs_mask)) {
+               clk_src->base.dp_clk_src = dp_clk_src;
+               return &clk_src->base;
+       }
+
+       kfree(clk_src);
+       BREAK_TO_DEBUGGER();
+       return NULL;
+}
+
+static void dce100_clock_source_destroy(struct clock_source **clk_src)
+{
+       kfree(TO_DCE110_CLK_SRC(*clk_src));
+       *clk_src = NULL;
+}
+
+static void dce100_resource_destruct(struct dce110_resource_pool *pool)
+{
+       unsigned int i;
+
+       for (i = 0; i < pool->base.pipe_count; i++) {
+               if (pool->base.opps[i] != NULL)
+                       dce110_opp_destroy(&pool->base.opps[i]);
+
+               if (pool->base.transforms[i] != NULL)
+                       dce100_transform_destroy(&pool->base.transforms[i]);
+
+               if (pool->base.ipps[i] != NULL)
+                       dce_ipp_destroy(&pool->base.ipps[i]);
+
+               if (pool->base.mis[i] != NULL) {
+                       kfree(TO_DCE_MEM_INPUT(pool->base.mis[i]));
+                       pool->base.mis[i] = NULL;
+               }
+
+               if (pool->base.timing_generators[i] != NULL)    {
+                       kfree(DCE110TG_FROM_TG(pool->base.timing_generators[i]));
+                       pool->base.timing_generators[i] = NULL;
+               }
+       }
+
+       for (i = 0; i < pool->base.res_cap->num_ddc; i++) {
+               if (pool->base.engines[i] != NULL)
+                       dce110_engine_destroy(&pool->base.engines[i]);
+               if (pool->base.hw_i2cs[i] != NULL) {
+                       kfree(pool->base.hw_i2cs[i]);
+                       pool->base.hw_i2cs[i] = NULL;
+               }
+               if (pool->base.sw_i2cs[i] != NULL) {
+                       kfree(pool->base.sw_i2cs[i]);
+                       pool->base.sw_i2cs[i] = NULL;
+               }
+       }
+
+       for (i = 0; i < pool->base.stream_enc_count; i++) {
+               if (pool->base.stream_enc[i] != NULL)
+                       kfree(DCE110STRENC_FROM_STRENC(pool->base.stream_enc[i]));
+       }
+
+       for (i = 0; i < pool->base.clk_src_count; i++) {
+               if (pool->base.clock_sources[i] != NULL)
+                       dce100_clock_source_destroy(&pool->base.clock_sources[i]);
+       }
+
+       if (pool->base.dp_clock_source != NULL)
+               dce100_clock_source_destroy(&pool->base.dp_clock_source);
+
+       for (i = 0; i < pool->base.audio_count; i++)    {
+               if (pool->base.audios[i] != NULL)
+                       dce_aud_destroy(&pool->base.audios[i]);
+       }
+
+       if (pool->base.abm != NULL)
+                               dce_abm_destroy(&pool->base.abm);
+
+       if (pool->base.dmcu != NULL)
+                       dce_dmcu_destroy(&pool->base.dmcu);
+
+       if (pool->base.irqs != NULL)
+               dal_irq_service_destroy(&pool->base.irqs);
+}
+
+static enum dc_status build_mapped_resource(
+               const struct dc  *dc,
+               struct dc_state *context,
+               struct dc_stream_state *stream)
+{
+       struct pipe_ctx *pipe_ctx = resource_get_otg_master_for_stream(&context->res_ctx, stream);
+
+       if (!pipe_ctx)
+               return DC_ERROR_UNEXPECTED;
+
+       dce110_resource_build_pipe_hw_param(pipe_ctx);
+
+       resource_build_info_frame(pipe_ctx);
+
+       return DC_OK;
+}
+
+static bool dce100_validate_bandwidth(
+       struct dc  *dc,
+       struct dc_state *context,
+       bool fast_validate)
+{
+       int i;
+       bool at_least_one_pipe = false;
+
+       for (i = 0; i < dc->res_pool->pipe_count; i++) {
+               if (context->res_ctx.pipe_ctx[i].stream)
+                       at_least_one_pipe = true;
+       }
+
+       if (at_least_one_pipe) {
+               /* TODO implement when needed but for now hardcode max value*/
+               context->bw_ctx.bw.dce.dispclk_khz = 681000;
+               context->bw_ctx.bw.dce.yclk_khz = 250000 * MEMORY_TYPE_MULTIPLIER_CZ;
+       } else {
+               context->bw_ctx.bw.dce.dispclk_khz = 0;
+               context->bw_ctx.bw.dce.yclk_khz = 0;
+       }
+
+       return true;
+}
+
+static bool dce100_validate_surface_sets(
+               struct dc_state *context)
+{
+       int i;
+
+       for (i = 0; i < context->stream_count; i++) {
+               if (context->stream_status[i].plane_count == 0)
+                       continue;
+
+               if (context->stream_status[i].plane_count > 1)
+                       return false;
+
+               if (context->stream_status[i].plane_states[0]->format
+                               >= SURFACE_PIXEL_FORMAT_VIDEO_BEGIN)
+                       return false;
+       }
+
+       return true;
+}
+
+static enum dc_status dce100_validate_global(
+               struct dc  *dc,
+               struct dc_state *context)
+{
+       if (!dce100_validate_surface_sets(context))
+               return DC_FAIL_SURFACE_VALIDATE;
+
+       return DC_OK;
+}
+
+enum dc_status dce100_add_stream_to_ctx(
+               struct dc *dc,
+               struct dc_state *new_ctx,
+               struct dc_stream_state *dc_stream)
+{
+       enum dc_status result = DC_ERROR_UNEXPECTED;
+
+       result = resource_map_pool_resources(dc, new_ctx, dc_stream);
+
+       if (result == DC_OK)
+               result = resource_map_clock_resources(dc, new_ctx, dc_stream);
+
+       if (result == DC_OK)
+               result = build_mapped_resource(dc, new_ctx, dc_stream);
+
+       return result;
+}
+
+static void dce100_destroy_resource_pool(struct resource_pool **pool)
+{
+       struct dce110_resource_pool *dce110_pool = TO_DCE110_RES_POOL(*pool);
+
+       dce100_resource_destruct(dce110_pool);
+       kfree(dce110_pool);
+       *pool = NULL;
+}
+
+enum dc_status dce100_validate_plane(const struct dc_plane_state *plane_state, struct dc_caps *caps)
+{
+
+       if (plane_state->format < SURFACE_PIXEL_FORMAT_VIDEO_BEGIN)
+               return DC_OK;
+
+       return DC_FAIL_SURFACE_VALIDATE;
+}
+
+struct stream_encoder *dce100_find_first_free_match_stream_enc_for_link(
+               struct resource_context *res_ctx,
+               const struct resource_pool *pool,
+               struct dc_stream_state *stream)
+{
+       int i;
+       int j = -1;
+       struct dc_link *link = stream->link;
+
+       for (i = 0; i < pool->stream_enc_count; i++) {
+               if (!res_ctx->is_stream_enc_acquired[i] &&
+                               pool->stream_enc[i]) {
+                       /* Store first available for MST second display
+                        * in daisy chain use case
+                        */
+                       j = i;
+                       if (pool->stream_enc[i]->id ==
+                                       link->link_enc->preferred_engine)
+                               return pool->stream_enc[i];
+               }
+       }
+
+       /*
+        * below can happen in cases when stream encoder is acquired:
+        * 1) for second MST display in chain, so preferred engine already
+        * acquired;
+        * 2) for another link, which preferred engine already acquired by any
+        * MST configuration.
+        *
+        * If signal is of DP type and preferred engine not found, return last available
+        *
+        * TODO - This is just a patch up and a generic solution is
+        * required for non DP connectors.
+        */
+
+       if (j >= 0 && link->connector_signal == SIGNAL_TYPE_DISPLAY_PORT)
+               return pool->stream_enc[j];
+
+       return NULL;
+}
+
+static const struct resource_funcs dce100_res_pool_funcs = {
+       .destroy = dce100_destroy_resource_pool,
+       .link_enc_create = dce100_link_encoder_create,
+       .panel_cntl_create = dce100_panel_cntl_create,
+       .validate_bandwidth = dce100_validate_bandwidth,
+       .validate_plane = dce100_validate_plane,
+       .add_stream_to_ctx = dce100_add_stream_to_ctx,
+       .validate_global = dce100_validate_global,
+       .find_first_free_match_stream_enc_for_link = dce100_find_first_free_match_stream_enc_for_link
+};
+
+static bool dce100_resource_construct(
+       uint8_t num_virtual_links,
+       struct dc  *dc,
+       struct dce110_resource_pool *pool)
+{
+       unsigned int i;
+       struct dc_context *ctx = dc->ctx;
+       struct dc_bios *bp;
+
+       ctx->dc_bios->regs = &bios_regs;
+
+       pool->base.res_cap = &res_cap;
+       pool->base.funcs = &dce100_res_pool_funcs;
+       pool->base.underlay_pipe_index = NO_UNDERLAY_PIPE;
+
+       bp = ctx->dc_bios;
+
+       if (bp->fw_info_valid && bp->fw_info.external_clock_source_frequency_for_dp != 0) {
+               pool->base.dp_clock_source =
+                               dce100_clock_source_create(ctx, bp, CLOCK_SOURCE_ID_EXTERNAL, NULL, true);
+
+               pool->base.clock_sources[0] =
+                               dce100_clock_source_create(ctx, bp, CLOCK_SOURCE_ID_PLL0, &clk_src_regs[0], false);
+               pool->base.clock_sources[1] =
+                               dce100_clock_source_create(ctx, bp, CLOCK_SOURCE_ID_PLL1, &clk_src_regs[1], false);
+               pool->base.clock_sources[2] =
+                               dce100_clock_source_create(ctx, bp, CLOCK_SOURCE_ID_PLL2, &clk_src_regs[2], false);
+               pool->base.clk_src_count = 3;
+
+       } else {
+               pool->base.dp_clock_source =
+                               dce100_clock_source_create(ctx, bp, CLOCK_SOURCE_ID_PLL0, &clk_src_regs[0], true);
+
+               pool->base.clock_sources[0] =
+                               dce100_clock_source_create(ctx, bp, CLOCK_SOURCE_ID_PLL1, &clk_src_regs[1], false);
+               pool->base.clock_sources[1] =
+                               dce100_clock_source_create(ctx, bp, CLOCK_SOURCE_ID_PLL2, &clk_src_regs[2], false);
+               pool->base.clk_src_count = 2;
+       }
+
+       if (pool->base.dp_clock_source == NULL) {
+               dm_error("DC: failed to create dp clock source!\n");
+               BREAK_TO_DEBUGGER();
+               goto res_create_fail;
+       }
+
+       for (i = 0; i < pool->base.clk_src_count; i++) {
+               if (pool->base.clock_sources[i] == NULL) {
+                       dm_error("DC: failed to create clock sources!\n");
+                       BREAK_TO_DEBUGGER();
+                       goto res_create_fail;
+               }
+       }
+
+       pool->base.dmcu = dce_dmcu_create(ctx,
+                       &dmcu_regs,
+                       &dmcu_shift,
+                       &dmcu_mask);
+       if (pool->base.dmcu == NULL) {
+               dm_error("DC: failed to create dmcu!\n");
+               BREAK_TO_DEBUGGER();
+               goto res_create_fail;
+       }
+
+       pool->base.abm = dce_abm_create(ctx,
+                               &abm_regs,
+                               &abm_shift,
+                               &abm_mask);
+       if (pool->base.abm == NULL) {
+               dm_error("DC: failed to create abm!\n");
+               BREAK_TO_DEBUGGER();
+               goto res_create_fail;
+       }
+
+       {
+               struct irq_service_init_data init_data;
+               init_data.ctx = dc->ctx;
+               pool->base.irqs = dal_irq_service_dce110_create(&init_data);
+               if (!pool->base.irqs)
+                       goto res_create_fail;
+       }
+
+       /*************************************************
+       *  Resource + asic cap harcoding                *
+       *************************************************/
+       pool->base.underlay_pipe_index = NO_UNDERLAY_PIPE;
+       pool->base.pipe_count = res_cap.num_timing_generator;
+       pool->base.timing_generator_count = pool->base.res_cap->num_timing_generator;
+       dc->caps.max_downscale_ratio = 200;
+       dc->caps.i2c_speed_in_khz = 40;
+       dc->caps.i2c_speed_in_khz = 40;
+       dc->caps.max_cursor_size = 128;
+       dc->caps.min_horizontal_blanking_period = 80;
+       dc->caps.dual_link_dvi = true;
+       dc->caps.disable_dp_clk_share = true;
+       dc->caps.extended_aux_timeout_support = false;
+       dc->debug = debug_defaults;
+
+       for (i = 0; i < pool->base.pipe_count; i++) {
+               pool->base.timing_generators[i] =
+                       dce100_timing_generator_create(
+                               ctx,
+                               i,
+                               &dce100_tg_offsets[i]);
+               if (pool->base.timing_generators[i] == NULL) {
+                       BREAK_TO_DEBUGGER();
+                       dm_error("DC: failed to create tg!\n");
+                       goto res_create_fail;
+               }
+
+               pool->base.mis[i] = dce100_mem_input_create(ctx, i);
+               if (pool->base.mis[i] == NULL) {
+                       BREAK_TO_DEBUGGER();
+                       dm_error(
+                               "DC: failed to create memory input!\n");
+                       goto res_create_fail;
+               }
+
+               pool->base.ipps[i] = dce100_ipp_create(ctx, i);
+               if (pool->base.ipps[i] == NULL) {
+                       BREAK_TO_DEBUGGER();
+                       dm_error(
+                               "DC: failed to create input pixel processor!\n");
+                       goto res_create_fail;
+               }
+
+               pool->base.transforms[i] = dce100_transform_create(ctx, i);
+               if (pool->base.transforms[i] == NULL) {
+                       BREAK_TO_DEBUGGER();
+                       dm_error(
+                               "DC: failed to create transform!\n");
+                       goto res_create_fail;
+               }
+
+               pool->base.opps[i] = dce100_opp_create(ctx, i);
+               if (pool->base.opps[i] == NULL) {
+                       BREAK_TO_DEBUGGER();
+                       dm_error(
+                               "DC: failed to create output pixel processor!\n");
+                       goto res_create_fail;
+               }
+       }
+
+       for (i = 0; i < pool->base.res_cap->num_ddc; i++) {
+               pool->base.engines[i] = dce100_aux_engine_create(ctx, i);
+               if (pool->base.engines[i] == NULL) {
+                       BREAK_TO_DEBUGGER();
+                       dm_error(
+                               "DC:failed to create aux engine!!\n");
+                       goto res_create_fail;
+               }
+               pool->base.hw_i2cs[i] = dce100_i2c_hw_create(ctx, i);
+               if (pool->base.hw_i2cs[i] == NULL) {
+                       BREAK_TO_DEBUGGER();
+                       dm_error(
+                               "DC:failed to create i2c engine!!\n");
+                       goto res_create_fail;
+               }
+               pool->base.sw_i2cs[i] = NULL;
+       }
+
+       dc->caps.max_planes =  pool->base.pipe_count;
+
+       for (i = 0; i < dc->caps.max_planes; ++i)
+               dc->caps.planes[i] = plane_cap;
+
+       if (!resource_construct(num_virtual_links, dc, &pool->base,
+                       &res_create_funcs))
+               goto res_create_fail;
+
+       /* Create hardware sequencer */
+       dce100_hw_sequencer_construct(dc);
+       return true;
+
+res_create_fail:
+       dce100_resource_destruct(pool);
+
+       return false;
+}
+
+struct resource_pool *dce100_create_resource_pool(
+       uint8_t num_virtual_links,
+       struct dc  *dc)
+{
+       struct dce110_resource_pool *pool =
+               kzalloc(sizeof(struct dce110_resource_pool), GFP_KERNEL);
+
+       if (!pool)
+               return NULL;
+
+       if (dce100_resource_construct(num_virtual_links, dc, pool))
+               return &pool->base;
+
+       kfree(pool);
+       BREAK_TO_DEBUGGER();
+       return NULL;
+}
+
diff --git a/drivers/gpu/drm/amd/display/dc/resource/dce100/dce100_resource.h b/drivers/gpu/drm/amd/display/dc/resource/dce100/dce100_resource.h
new file mode 100644 (file)
index 0000000..fecab7c
--- /dev/null
@@ -0,0 +1,54 @@
+/*
+ * Copyright 2017 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.
+ *
+ *
+ */
+/*
+ * dce100_resource.h
+ *
+ *  Created on: 2016-01-20
+ *      Author: qyang
+ */
+
+#ifndef DCE100_RESOURCE_H_
+#define DCE100_RESOURCE_H_
+
+struct dc;
+struct resource_pool;
+struct dc_validation_set;
+
+struct resource_pool *dce100_create_resource_pool(
+       uint8_t num_virtual_links,
+       struct dc *dc);
+
+enum dc_status dce100_validate_plane(const struct dc_plane_state *plane_state, struct dc_caps *caps);
+
+enum dc_status dce100_add_stream_to_ctx(
+               struct dc *dc,
+               struct dc_state *new_ctx,
+               struct dc_stream_state *dc_stream);
+
+struct stream_encoder *dce100_find_first_free_match_stream_enc_for_link(
+               struct resource_context *res_ctx,
+               const struct resource_pool *pool,
+               struct dc_stream_state *stream);
+
+#endif /* DCE100_RESOURCE_H_ */
diff --git a/drivers/gpu/drm/amd/display/dc/resource/dce110/dce110_resource.c b/drivers/gpu/drm/amd/display/dc/resource/dce110/dce110_resource.c
new file mode 100644 (file)
index 0000000..fe518fd
--- /dev/null
@@ -0,0 +1,1551 @@
+/*
+ * Copyright 2012-15 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 "dm_services.h"
+
+#include "link_encoder.h"
+#include "stream_encoder.h"
+
+#include "resource.h"
+#include "dce110/dce110_resource.h"
+#include "include/irq_service_interface.h"
+#include "dce/dce_audio.h"
+#include "dce110/dce110_timing_generator.h"
+#include "irq/dce110/irq_service_dce110.h"
+#include "dce110/dce110_timing_generator_v.h"
+#include "dce/dce_link_encoder.h"
+#include "dce/dce_stream_encoder.h"
+#include "dce/dce_mem_input.h"
+#include "dce110/dce110_mem_input_v.h"
+#include "dce/dce_ipp.h"
+#include "dce/dce_transform.h"
+#include "dce110/dce110_transform_v.h"
+#include "dce/dce_opp.h"
+#include "dce110/dce110_opp_v.h"
+#include "dce/dce_clock_source.h"
+#include "dce/dce_hwseq.h"
+#include "dce110/dce110_hwseq.h"
+#include "dce/dce_aux.h"
+#include "dce/dce_abm.h"
+#include "dce/dce_dmcu.h"
+#include "dce/dce_i2c.h"
+#include "dce/dce_panel_cntl.h"
+
+#define DC_LOGGER \
+               dc->ctx->logger
+
+#include "dce110/dce110_compressor.h"
+
+#include "reg_helper.h"
+
+#include "dce/dce_11_0_d.h"
+#include "dce/dce_11_0_sh_mask.h"
+
+#ifndef mmMC_HUB_RDREQ_DMIF_LIMIT
+#include "gmc/gmc_8_2_d.h"
+#include "gmc/gmc_8_2_sh_mask.h"
+#endif
+
+#ifndef mmDP_DPHY_INTERNAL_CTRL
+       #define mmDP_DPHY_INTERNAL_CTRL 0x4aa7
+       #define mmDP0_DP_DPHY_INTERNAL_CTRL 0x4aa7
+       #define mmDP1_DP_DPHY_INTERNAL_CTRL 0x4ba7
+       #define mmDP2_DP_DPHY_INTERNAL_CTRL 0x4ca7
+       #define mmDP3_DP_DPHY_INTERNAL_CTRL 0x4da7
+       #define mmDP4_DP_DPHY_INTERNAL_CTRL 0x4ea7
+       #define mmDP5_DP_DPHY_INTERNAL_CTRL 0x4fa7
+       #define mmDP6_DP_DPHY_INTERNAL_CTRL 0x54a7
+       #define mmDP7_DP_DPHY_INTERNAL_CTRL 0x56a7
+       #define mmDP8_DP_DPHY_INTERNAL_CTRL 0x57a7
+#endif
+
+#ifndef mmBIOS_SCRATCH_2
+       #define mmBIOS_SCRATCH_2 0x05CB
+       #define mmBIOS_SCRATCH_3 0x05CC
+       #define mmBIOS_SCRATCH_6 0x05CF
+#endif
+
+#ifndef mmDP_DPHY_BS_SR_SWAP_CNTL
+       #define mmDP_DPHY_BS_SR_SWAP_CNTL                       0x4ADC
+       #define mmDP0_DP_DPHY_BS_SR_SWAP_CNTL                   0x4ADC
+       #define mmDP1_DP_DPHY_BS_SR_SWAP_CNTL                   0x4BDC
+       #define mmDP2_DP_DPHY_BS_SR_SWAP_CNTL                   0x4CDC
+       #define mmDP3_DP_DPHY_BS_SR_SWAP_CNTL                   0x4DDC
+       #define mmDP4_DP_DPHY_BS_SR_SWAP_CNTL                   0x4EDC
+       #define mmDP5_DP_DPHY_BS_SR_SWAP_CNTL                   0x4FDC
+       #define mmDP6_DP_DPHY_BS_SR_SWAP_CNTL                   0x54DC
+#endif
+
+#ifndef mmDP_DPHY_FAST_TRAINING
+       #define mmDP_DPHY_FAST_TRAINING                         0x4ABC
+       #define mmDP0_DP_DPHY_FAST_TRAINING                     0x4ABC
+       #define mmDP1_DP_DPHY_FAST_TRAINING                     0x4BBC
+       #define mmDP2_DP_DPHY_FAST_TRAINING                     0x4CBC
+       #define mmDP3_DP_DPHY_FAST_TRAINING                     0x4DBC
+       #define mmDP4_DP_DPHY_FAST_TRAINING                     0x4EBC
+       #define mmDP5_DP_DPHY_FAST_TRAINING                     0x4FBC
+       #define mmDP6_DP_DPHY_FAST_TRAINING                     0x54BC
+#endif
+
+#ifndef DPHY_RX_FAST_TRAINING_CAPABLE
+       #define DPHY_RX_FAST_TRAINING_CAPABLE 0x1
+#endif
+
+static const struct dce110_timing_generator_offsets dce110_tg_offsets[] = {
+       {
+               .crtc = (mmCRTC0_CRTC_CONTROL - mmCRTC_CONTROL),
+               .dcp =  (mmDCP0_GRPH_CONTROL - mmGRPH_CONTROL),
+       },
+       {
+               .crtc = (mmCRTC1_CRTC_CONTROL - mmCRTC_CONTROL),
+               .dcp = (mmDCP1_GRPH_CONTROL - mmGRPH_CONTROL),
+       },
+       {
+               .crtc = (mmCRTC2_CRTC_CONTROL - mmCRTC_CONTROL),
+               .dcp = (mmDCP2_GRPH_CONTROL - mmGRPH_CONTROL),
+       },
+       {
+               .crtc = (mmCRTC3_CRTC_CONTROL - mmCRTC_CONTROL),
+               .dcp =  (mmDCP3_GRPH_CONTROL - mmGRPH_CONTROL),
+       },
+       {
+               .crtc = (mmCRTC4_CRTC_CONTROL - mmCRTC_CONTROL),
+               .dcp = (mmDCP4_GRPH_CONTROL - mmGRPH_CONTROL),
+       },
+       {
+               .crtc = (mmCRTC5_CRTC_CONTROL - mmCRTC_CONTROL),
+               .dcp = (mmDCP5_GRPH_CONTROL - mmGRPH_CONTROL),
+       }
+};
+
+/* set register offset */
+#define SR(reg_name)\
+       .reg_name = mm ## reg_name
+
+/* set register offset with instance */
+#define SRI(reg_name, block, id)\
+       .reg_name = mm ## block ## id ## _ ## reg_name
+
+static const struct dce_dmcu_registers dmcu_regs = {
+               DMCU_DCE110_COMMON_REG_LIST()
+};
+
+static const struct dce_dmcu_shift dmcu_shift = {
+               DMCU_MASK_SH_LIST_DCE110(__SHIFT)
+};
+
+static const struct dce_dmcu_mask dmcu_mask = {
+               DMCU_MASK_SH_LIST_DCE110(_MASK)
+};
+
+static const struct dce_abm_registers abm_regs = {
+               ABM_DCE110_COMMON_REG_LIST()
+};
+
+static const struct dce_abm_shift abm_shift = {
+               ABM_MASK_SH_LIST_DCE110(__SHIFT)
+};
+
+static const struct dce_abm_mask abm_mask = {
+               ABM_MASK_SH_LIST_DCE110(_MASK)
+};
+
+#define ipp_regs(id)\
+[id] = {\
+               IPP_DCE110_REG_LIST_DCE_BASE(id)\
+}
+
+static const struct dce_ipp_registers ipp_regs[] = {
+               ipp_regs(0),
+               ipp_regs(1),
+               ipp_regs(2)
+};
+
+static const struct dce_ipp_shift ipp_shift = {
+               IPP_DCE100_MASK_SH_LIST_DCE_COMMON_BASE(__SHIFT)
+};
+
+static const struct dce_ipp_mask ipp_mask = {
+               IPP_DCE100_MASK_SH_LIST_DCE_COMMON_BASE(_MASK)
+};
+
+#define transform_regs(id)\
+[id] = {\
+               XFM_COMMON_REG_LIST_DCE110(id)\
+}
+
+static const struct dce_transform_registers xfm_regs[] = {
+               transform_regs(0),
+               transform_regs(1),
+               transform_regs(2)
+};
+
+static const struct dce_transform_shift xfm_shift = {
+               XFM_COMMON_MASK_SH_LIST_DCE110(__SHIFT)
+};
+
+static const struct dce_transform_mask xfm_mask = {
+               XFM_COMMON_MASK_SH_LIST_DCE110(_MASK)
+};
+
+#define aux_regs(id)\
+[id] = {\
+       AUX_REG_LIST(id)\
+}
+
+static const struct dce110_link_enc_aux_registers link_enc_aux_regs[] = {
+               aux_regs(0),
+               aux_regs(1),
+               aux_regs(2),
+               aux_regs(3),
+               aux_regs(4),
+               aux_regs(5)
+};
+
+#define hpd_regs(id)\
+[id] = {\
+       HPD_REG_LIST(id)\
+}
+
+static const struct dce110_link_enc_hpd_registers link_enc_hpd_regs[] = {
+               hpd_regs(0),
+               hpd_regs(1),
+               hpd_regs(2),
+               hpd_regs(3),
+               hpd_regs(4),
+               hpd_regs(5)
+};
+
+
+#define link_regs(id)\
+[id] = {\
+       LE_DCE110_REG_LIST(id)\
+}
+
+static const struct dce110_link_enc_registers link_enc_regs[] = {
+       link_regs(0),
+       link_regs(1),
+       link_regs(2),
+       link_regs(3),
+       link_regs(4),
+       link_regs(5),
+       link_regs(6),
+};
+
+#define stream_enc_regs(id)\
+[id] = {\
+       SE_COMMON_REG_LIST(id),\
+       .TMDS_CNTL = 0,\
+}
+
+static const struct dce110_stream_enc_registers stream_enc_regs[] = {
+       stream_enc_regs(0),
+       stream_enc_regs(1),
+       stream_enc_regs(2)
+};
+
+static const struct dce_stream_encoder_shift se_shift = {
+               SE_COMMON_MASK_SH_LIST_DCE110(__SHIFT)
+};
+
+static const struct dce_stream_encoder_mask se_mask = {
+               SE_COMMON_MASK_SH_LIST_DCE110(_MASK)
+};
+
+static const struct dce_panel_cntl_registers panel_cntl_regs[] = {
+       { DCE_PANEL_CNTL_REG_LIST() }
+};
+
+static const struct dce_panel_cntl_shift panel_cntl_shift = {
+       DCE_PANEL_CNTL_MASK_SH_LIST(__SHIFT)
+};
+
+static const struct dce_panel_cntl_mask panel_cntl_mask = {
+       DCE_PANEL_CNTL_MASK_SH_LIST(_MASK)
+};
+
+static const struct dce110_aux_registers_shift aux_shift = {
+       DCE_AUX_MASK_SH_LIST(__SHIFT)
+};
+
+static const struct dce110_aux_registers_mask aux_mask = {
+       DCE_AUX_MASK_SH_LIST(_MASK)
+};
+
+#define opp_regs(id)\
+[id] = {\
+       OPP_DCE_110_REG_LIST(id),\
+}
+
+static const struct dce_opp_registers opp_regs[] = {
+       opp_regs(0),
+       opp_regs(1),
+       opp_regs(2),
+       opp_regs(3),
+       opp_regs(4),
+       opp_regs(5)
+};
+
+static const struct dce_opp_shift opp_shift = {
+       OPP_COMMON_MASK_SH_LIST_DCE_110(__SHIFT)
+};
+
+static const struct dce_opp_mask opp_mask = {
+       OPP_COMMON_MASK_SH_LIST_DCE_110(_MASK)
+};
+
+#define aux_engine_regs(id)\
+[id] = {\
+       AUX_COMMON_REG_LIST(id), \
+       .AUX_RESET_MASK = 0 \
+}
+
+static const struct dce110_aux_registers aux_engine_regs[] = {
+               aux_engine_regs(0),
+               aux_engine_regs(1),
+               aux_engine_regs(2),
+               aux_engine_regs(3),
+               aux_engine_regs(4),
+               aux_engine_regs(5)
+};
+
+#define audio_regs(id)\
+[id] = {\
+       AUD_COMMON_REG_LIST(id)\
+}
+
+static const struct dce_audio_registers audio_regs[] = {
+       audio_regs(0),
+       audio_regs(1),
+       audio_regs(2),
+       audio_regs(3),
+       audio_regs(4),
+       audio_regs(5),
+       audio_regs(6),
+};
+
+static const struct dce_audio_shift audio_shift = {
+               AUD_COMMON_MASK_SH_LIST(__SHIFT)
+};
+
+static const struct dce_audio_mask audio_mask = {
+               AUD_COMMON_MASK_SH_LIST(_MASK)
+};
+
+/* AG TBD Needs to be reduced back to 3 pipes once dce10 hw sequencer implemented. */
+
+
+#define clk_src_regs(id)\
+[id] = {\
+       CS_COMMON_REG_LIST_DCE_100_110(id),\
+}
+
+static const struct dce110_clk_src_regs clk_src_regs[] = {
+       clk_src_regs(0),
+       clk_src_regs(1),
+       clk_src_regs(2)
+};
+
+static const struct dce110_clk_src_shift cs_shift = {
+               CS_COMMON_MASK_SH_LIST_DCE_COMMON_BASE(__SHIFT)
+};
+
+static const struct dce110_clk_src_mask cs_mask = {
+               CS_COMMON_MASK_SH_LIST_DCE_COMMON_BASE(_MASK)
+};
+
+static const struct bios_registers bios_regs = {
+       .BIOS_SCRATCH_3 = mmBIOS_SCRATCH_3,
+       .BIOS_SCRATCH_6 = mmBIOS_SCRATCH_6
+};
+
+static const struct resource_caps carrizo_resource_cap = {
+               .num_timing_generator = 3,
+               .num_video_plane = 1,
+               .num_audio = 3,
+               .num_stream_encoder = 3,
+               .num_pll = 2,
+               .num_ddc = 3,
+};
+
+static const struct resource_caps stoney_resource_cap = {
+               .num_timing_generator = 2,
+               .num_video_plane = 1,
+               .num_audio = 3,
+               .num_stream_encoder = 3,
+               .num_pll = 2,
+               .num_ddc = 3,
+};
+
+static const struct dc_plane_cap plane_cap = {
+               .type = DC_PLANE_TYPE_DCE_RGB,
+               .per_pixel_alpha = 1,
+
+               .pixel_format_support = {
+                               .argb8888 = true,
+                               .nv12 = false,
+                               .fp16 = true
+               },
+
+               .max_upscale_factor = {
+                               .argb8888 = 16000,
+                               .nv12 = 1,
+                               .fp16 = 1
+               },
+
+               .max_downscale_factor = {
+                               .argb8888 = 250,
+                               .nv12 = 1,
+                               .fp16 = 1
+               },
+               64,
+               64
+};
+
+static const struct dc_debug_options debug_defaults = {
+               .enable_legacy_fast_update = true,
+};
+
+static const struct dc_plane_cap underlay_plane_cap = {
+               .type = DC_PLANE_TYPE_DCE_UNDERLAY,
+               .per_pixel_alpha = 1,
+
+               .pixel_format_support = {
+                               .argb8888 = false,
+                               .nv12 = true,
+                               .fp16 = false
+               },
+
+               .max_upscale_factor = {
+                               .argb8888 = 1,
+                               .nv12 = 16000,
+                               .fp16 = 1
+               },
+
+               .max_downscale_factor = {
+                               .argb8888 = 1,
+                               .nv12 = 250,
+                               .fp16 = 1
+               },
+               64,
+               64
+};
+
+#define CTX  ctx
+#define REG(reg) mm ## reg
+
+#ifndef mmCC_DC_HDMI_STRAPS
+#define mmCC_DC_HDMI_STRAPS 0x4819
+#define CC_DC_HDMI_STRAPS__HDMI_DISABLE_MASK 0x40
+#define CC_DC_HDMI_STRAPS__HDMI_DISABLE__SHIFT 0x6
+#define CC_DC_HDMI_STRAPS__AUDIO_STREAM_NUMBER_MASK 0x700
+#define CC_DC_HDMI_STRAPS__AUDIO_STREAM_NUMBER__SHIFT 0x8
+#endif
+
+static int map_transmitter_id_to_phy_instance(
+       enum transmitter transmitter)
+{
+       switch (transmitter) {
+       case TRANSMITTER_UNIPHY_A:
+               return 0;
+       case TRANSMITTER_UNIPHY_B:
+               return 1;
+       case TRANSMITTER_UNIPHY_C:
+               return 2;
+       case TRANSMITTER_UNIPHY_D:
+               return 3;
+       case TRANSMITTER_UNIPHY_E:
+               return 4;
+       case TRANSMITTER_UNIPHY_F:
+               return 5;
+       case TRANSMITTER_UNIPHY_G:
+               return 6;
+       default:
+               ASSERT(0);
+               return 0;
+       }
+}
+
+static void read_dce_straps(
+       struct dc_context *ctx,
+       struct resource_straps *straps)
+{
+       REG_GET_2(CC_DC_HDMI_STRAPS,
+                       HDMI_DISABLE, &straps->hdmi_disable,
+                       AUDIO_STREAM_NUMBER, &straps->audio_stream_number);
+
+       REG_GET(DC_PINSTRAPS, DC_PINSTRAPS_AUDIO, &straps->dc_pinstraps_audio);
+}
+
+static struct audio *create_audio(
+               struct dc_context *ctx, unsigned int inst)
+{
+       return dce_audio_create(ctx, inst,
+                       &audio_regs[inst], &audio_shift, &audio_mask);
+}
+
+static struct timing_generator *dce110_timing_generator_create(
+               struct dc_context *ctx,
+               uint32_t instance,
+               const struct dce110_timing_generator_offsets *offsets)
+{
+       struct dce110_timing_generator *tg110 =
+               kzalloc(sizeof(struct dce110_timing_generator), GFP_KERNEL);
+
+       if (!tg110)
+               return NULL;
+
+       dce110_timing_generator_construct(tg110, ctx, instance, offsets);
+       return &tg110->base;
+}
+
+static struct stream_encoder *dce110_stream_encoder_create(
+       enum engine_id eng_id,
+       struct dc_context *ctx)
+{
+       struct dce110_stream_encoder *enc110 =
+               kzalloc(sizeof(struct dce110_stream_encoder), GFP_KERNEL);
+
+       if (!enc110)
+               return NULL;
+
+       dce110_stream_encoder_construct(enc110, ctx, ctx->dc_bios, eng_id,
+                                       &stream_enc_regs[eng_id],
+                                       &se_shift, &se_mask);
+       return &enc110->base;
+}
+
+#define SRII(reg_name, block, id)\
+       .reg_name[id] = mm ## block ## id ## _ ## reg_name
+
+static const struct dce_hwseq_registers hwseq_stoney_reg = {
+               HWSEQ_ST_REG_LIST()
+};
+
+static const struct dce_hwseq_registers hwseq_cz_reg = {
+               HWSEQ_CZ_REG_LIST()
+};
+
+static const struct dce_hwseq_shift hwseq_shift = {
+               HWSEQ_DCE11_MASK_SH_LIST(__SHIFT),
+};
+
+static const struct dce_hwseq_mask hwseq_mask = {
+               HWSEQ_DCE11_MASK_SH_LIST(_MASK),
+};
+
+static struct dce_hwseq *dce110_hwseq_create(
+       struct dc_context *ctx)
+{
+       struct dce_hwseq *hws = kzalloc(sizeof(struct dce_hwseq), GFP_KERNEL);
+
+       if (hws) {
+               hws->ctx = ctx;
+               hws->regs = ASIC_REV_IS_STONEY(ctx->asic_id.hw_internal_rev) ?
+                               &hwseq_stoney_reg : &hwseq_cz_reg;
+               hws->shifts = &hwseq_shift;
+               hws->masks = &hwseq_mask;
+               hws->wa.blnd_crtc_trigger = true;
+       }
+       return hws;
+}
+
+static const struct resource_create_funcs res_create_funcs = {
+       .read_dce_straps = read_dce_straps,
+       .create_audio = create_audio,
+       .create_stream_encoder = dce110_stream_encoder_create,
+       .create_hwseq = dce110_hwseq_create,
+};
+
+#define mi_inst_regs(id) { \
+       MI_DCE11_REG_LIST(id), \
+       .MC_HUB_RDREQ_DMIF_LIMIT = mmMC_HUB_RDREQ_DMIF_LIMIT \
+}
+static const struct dce_mem_input_registers mi_regs[] = {
+               mi_inst_regs(0),
+               mi_inst_regs(1),
+               mi_inst_regs(2),
+};
+
+static const struct dce_mem_input_shift mi_shifts = {
+               MI_DCE11_MASK_SH_LIST(__SHIFT),
+               .ENABLE = MC_HUB_RDREQ_DMIF_LIMIT__ENABLE__SHIFT
+};
+
+static const struct dce_mem_input_mask mi_masks = {
+               MI_DCE11_MASK_SH_LIST(_MASK),
+               .ENABLE = MC_HUB_RDREQ_DMIF_LIMIT__ENABLE_MASK
+};
+
+
+static struct mem_input *dce110_mem_input_create(
+       struct dc_context *ctx,
+       uint32_t inst)
+{
+       struct dce_mem_input *dce_mi = kzalloc(sizeof(struct dce_mem_input),
+                                              GFP_KERNEL);
+
+       if (!dce_mi) {
+               BREAK_TO_DEBUGGER();
+               return NULL;
+       }
+
+       dce_mem_input_construct(dce_mi, ctx, inst, &mi_regs[inst], &mi_shifts, &mi_masks);
+       dce_mi->wa.single_head_rdreq_dmif_limit = 3;
+       return &dce_mi->base;
+}
+
+static void dce110_transform_destroy(struct transform **xfm)
+{
+       kfree(TO_DCE_TRANSFORM(*xfm));
+       *xfm = NULL;
+}
+
+static struct transform *dce110_transform_create(
+       struct dc_context *ctx,
+       uint32_t inst)
+{
+       struct dce_transform *transform =
+               kzalloc(sizeof(struct dce_transform), GFP_KERNEL);
+
+       if (!transform)
+               return NULL;
+
+       dce_transform_construct(transform, ctx, inst,
+                               &xfm_regs[inst], &xfm_shift, &xfm_mask);
+       return &transform->base;
+}
+
+static struct input_pixel_processor *dce110_ipp_create(
+       struct dc_context *ctx, uint32_t inst)
+{
+       struct dce_ipp *ipp = kzalloc(sizeof(struct dce_ipp), GFP_KERNEL);
+
+       if (!ipp) {
+               BREAK_TO_DEBUGGER();
+               return NULL;
+       }
+
+       dce_ipp_construct(ipp, ctx, inst,
+                       &ipp_regs[inst], &ipp_shift, &ipp_mask);
+       return &ipp->base;
+}
+
+static const struct encoder_feature_support link_enc_feature = {
+               .max_hdmi_deep_color = COLOR_DEPTH_121212,
+               .max_hdmi_pixel_clock = 300000,
+               .flags.bits.IS_HBR2_CAPABLE = true,
+               .flags.bits.IS_TPS3_CAPABLE = true
+};
+
+static struct link_encoder *dce110_link_encoder_create(
+       struct dc_context *ctx,
+       const struct encoder_init_data *enc_init_data)
+{
+       struct dce110_link_encoder *enc110 =
+               kzalloc(sizeof(struct dce110_link_encoder), GFP_KERNEL);
+       int link_regs_id;
+
+       if (!enc110)
+               return NULL;
+
+       link_regs_id =
+               map_transmitter_id_to_phy_instance(enc_init_data->transmitter);
+
+       dce110_link_encoder_construct(enc110,
+                                     enc_init_data,
+                                     &link_enc_feature,
+                                     &link_enc_regs[link_regs_id],
+                                     &link_enc_aux_regs[enc_init_data->channel - 1],
+                                     &link_enc_hpd_regs[enc_init_data->hpd_source]);
+       return &enc110->base;
+}
+
+static struct panel_cntl *dce110_panel_cntl_create(const struct panel_cntl_init_data *init_data)
+{
+       struct dce_panel_cntl *panel_cntl =
+               kzalloc(sizeof(struct dce_panel_cntl), GFP_KERNEL);
+
+       if (!panel_cntl)
+               return NULL;
+
+       dce_panel_cntl_construct(panel_cntl,
+                       init_data,
+                       &panel_cntl_regs[init_data->inst],
+                       &panel_cntl_shift,
+                       &panel_cntl_mask);
+
+       return &panel_cntl->base;
+}
+
+static struct output_pixel_processor *dce110_opp_create(
+       struct dc_context *ctx,
+       uint32_t inst)
+{
+       struct dce110_opp *opp =
+               kzalloc(sizeof(struct dce110_opp), GFP_KERNEL);
+
+       if (!opp)
+               return NULL;
+
+       dce110_opp_construct(opp,
+                            ctx, inst, &opp_regs[inst], &opp_shift, &opp_mask);
+       return &opp->base;
+}
+
+static struct dce_aux *dce110_aux_engine_create(
+       struct dc_context *ctx,
+       uint32_t inst)
+{
+       struct aux_engine_dce110 *aux_engine =
+               kzalloc(sizeof(struct aux_engine_dce110), GFP_KERNEL);
+
+       if (!aux_engine)
+               return NULL;
+
+       dce110_aux_engine_construct(aux_engine, ctx, inst,
+                                   SW_AUX_TIMEOUT_PERIOD_MULTIPLIER * AUX_TIMEOUT_PERIOD,
+                                   &aux_engine_regs[inst],
+                                       &aux_mask,
+                                       &aux_shift,
+                                       ctx->dc->caps.extended_aux_timeout_support);
+
+       return &aux_engine->base;
+}
+#define i2c_inst_regs(id) { I2C_HW_ENGINE_COMMON_REG_LIST(id) }
+
+static const struct dce_i2c_registers i2c_hw_regs[] = {
+               i2c_inst_regs(1),
+               i2c_inst_regs(2),
+               i2c_inst_regs(3),
+               i2c_inst_regs(4),
+               i2c_inst_regs(5),
+               i2c_inst_regs(6),
+};
+
+static const struct dce_i2c_shift i2c_shifts = {
+               I2C_COMMON_MASK_SH_LIST_DCE110(__SHIFT)
+};
+
+static const struct dce_i2c_mask i2c_masks = {
+               I2C_COMMON_MASK_SH_LIST_DCE110(_MASK)
+};
+
+static struct dce_i2c_hw *dce110_i2c_hw_create(
+       struct dc_context *ctx,
+       uint32_t inst)
+{
+       struct dce_i2c_hw *dce_i2c_hw =
+               kzalloc(sizeof(struct dce_i2c_hw), GFP_KERNEL);
+
+       if (!dce_i2c_hw)
+               return NULL;
+
+       dce100_i2c_hw_construct(dce_i2c_hw, ctx, inst,
+                                   &i2c_hw_regs[inst], &i2c_shifts, &i2c_masks);
+
+       return dce_i2c_hw;
+}
+static struct clock_source *dce110_clock_source_create(
+       struct dc_context *ctx,
+       struct dc_bios *bios,
+       enum clock_source_id id,
+       const struct dce110_clk_src_regs *regs,
+       bool dp_clk_src)
+{
+       struct dce110_clk_src *clk_src =
+               kzalloc(sizeof(struct dce110_clk_src), GFP_KERNEL);
+
+       if (!clk_src)
+               return NULL;
+
+       if (dce110_clk_src_construct(clk_src, ctx, bios, id,
+                       regs, &cs_shift, &cs_mask)) {
+               clk_src->base.dp_clk_src = dp_clk_src;
+               return &clk_src->base;
+       }
+
+       kfree(clk_src);
+       BREAK_TO_DEBUGGER();
+       return NULL;
+}
+
+static void dce110_clock_source_destroy(struct clock_source **clk_src)
+{
+       struct dce110_clk_src *dce110_clk_src;
+
+       if (!clk_src)
+               return;
+
+       dce110_clk_src = TO_DCE110_CLK_SRC(*clk_src);
+
+       kfree(dce110_clk_src->dp_ss_params);
+       kfree(dce110_clk_src->hdmi_ss_params);
+       kfree(dce110_clk_src->dvi_ss_params);
+
+       kfree(dce110_clk_src);
+       *clk_src = NULL;
+}
+
+static void dce110_resource_destruct(struct dce110_resource_pool *pool)
+{
+       unsigned int i;
+
+       for (i = 0; i < pool->base.pipe_count; i++) {
+               if (pool->base.opps[i] != NULL)
+                       dce110_opp_destroy(&pool->base.opps[i]);
+
+               if (pool->base.transforms[i] != NULL)
+                       dce110_transform_destroy(&pool->base.transforms[i]);
+
+               if (pool->base.ipps[i] != NULL)
+                       dce_ipp_destroy(&pool->base.ipps[i]);
+
+               if (pool->base.mis[i] != NULL) {
+                       kfree(TO_DCE_MEM_INPUT(pool->base.mis[i]));
+                       pool->base.mis[i] = NULL;
+               }
+
+               if (pool->base.timing_generators[i] != NULL)    {
+                       kfree(DCE110TG_FROM_TG(pool->base.timing_generators[i]));
+                       pool->base.timing_generators[i] = NULL;
+               }
+       }
+
+       for (i = 0; i < pool->base.res_cap->num_ddc; i++) {
+               if (pool->base.engines[i] != NULL)
+                       dce110_engine_destroy(&pool->base.engines[i]);
+               if (pool->base.hw_i2cs[i] != NULL) {
+                       kfree(pool->base.hw_i2cs[i]);
+                       pool->base.hw_i2cs[i] = NULL;
+               }
+               if (pool->base.sw_i2cs[i] != NULL) {
+                       kfree(pool->base.sw_i2cs[i]);
+                       pool->base.sw_i2cs[i] = NULL;
+               }
+       }
+
+       for (i = 0; i < pool->base.stream_enc_count; i++) {
+               if (pool->base.stream_enc[i] != NULL)
+                       kfree(DCE110STRENC_FROM_STRENC(pool->base.stream_enc[i]));
+       }
+
+       for (i = 0; i < pool->base.clk_src_count; i++) {
+               if (pool->base.clock_sources[i] != NULL) {
+                       dce110_clock_source_destroy(&pool->base.clock_sources[i]);
+               }
+       }
+
+       if (pool->base.dp_clock_source != NULL)
+               dce110_clock_source_destroy(&pool->base.dp_clock_source);
+
+       for (i = 0; i < pool->base.audio_count; i++)    {
+               if (pool->base.audios[i] != NULL) {
+                       dce_aud_destroy(&pool->base.audios[i]);
+               }
+       }
+
+       if (pool->base.abm != NULL)
+               dce_abm_destroy(&pool->base.abm);
+
+       if (pool->base.dmcu != NULL)
+               dce_dmcu_destroy(&pool->base.dmcu);
+
+       if (pool->base.irqs != NULL) {
+               dal_irq_service_destroy(&pool->base.irqs);
+       }
+}
+
+
+static void get_pixel_clock_parameters(
+       const struct pipe_ctx *pipe_ctx,
+       struct pixel_clk_params *pixel_clk_params)
+{
+       const struct dc_stream_state *stream = pipe_ctx->stream;
+
+       /*TODO: is this halved for YCbCr 420? in that case we might want to move
+        * the pixel clock normalization for hdmi up to here instead of doing it
+        * in pll_adjust_pix_clk
+        */
+       pixel_clk_params->requested_pix_clk_100hz = stream->timing.pix_clk_100hz;
+       pixel_clk_params->encoder_object_id = stream->link->link_enc->id;
+       pixel_clk_params->signal_type = pipe_ctx->stream->signal;
+       pixel_clk_params->controller_id = pipe_ctx->stream_res.tg->inst + 1;
+       /* TODO: un-hardcode*/
+       pixel_clk_params->requested_sym_clk = LINK_RATE_LOW *
+                                               LINK_RATE_REF_FREQ_IN_KHZ;
+       pixel_clk_params->flags.ENABLE_SS = 0;
+       pixel_clk_params->color_depth =
+               stream->timing.display_color_depth;
+       pixel_clk_params->flags.DISPLAY_BLANKED = 1;
+       pixel_clk_params->flags.SUPPORT_YCBCR420 = (stream->timing.pixel_encoding ==
+                       PIXEL_ENCODING_YCBCR420);
+       pixel_clk_params->pixel_encoding = stream->timing.pixel_encoding;
+       if (stream->timing.pixel_encoding == PIXEL_ENCODING_YCBCR422) {
+               pixel_clk_params->color_depth = COLOR_DEPTH_888;
+       }
+       if (stream->timing.pixel_encoding == PIXEL_ENCODING_YCBCR420) {
+               pixel_clk_params->requested_pix_clk_100hz  = pixel_clk_params->requested_pix_clk_100hz / 2;
+       }
+       if (stream->timing.timing_3d_format == TIMING_3D_FORMAT_HW_FRAME_PACKING)
+               pixel_clk_params->requested_pix_clk_100hz *= 2;
+
+}
+
+void dce110_resource_build_pipe_hw_param(struct pipe_ctx *pipe_ctx)
+{
+       get_pixel_clock_parameters(pipe_ctx, &pipe_ctx->stream_res.pix_clk_params);
+       pipe_ctx->clock_source->funcs->get_pix_clk_dividers(
+               pipe_ctx->clock_source,
+               &pipe_ctx->stream_res.pix_clk_params,
+               &pipe_ctx->pll_settings);
+       resource_build_bit_depth_reduction_params(pipe_ctx->stream,
+                       &pipe_ctx->stream->bit_depth_params);
+       pipe_ctx->stream->clamping.pixel_encoding = pipe_ctx->stream->timing.pixel_encoding;
+}
+
+static bool is_surface_pixel_format_supported(struct pipe_ctx *pipe_ctx, unsigned int underlay_idx)
+{
+       if (pipe_ctx->pipe_idx != underlay_idx)
+               return true;
+       if (!pipe_ctx->plane_state)
+               return false;
+       if (pipe_ctx->plane_state->format < SURFACE_PIXEL_FORMAT_VIDEO_BEGIN)
+               return false;
+       return true;
+}
+
+static enum dc_status build_mapped_resource(
+               const struct dc *dc,
+               struct dc_state *context,
+               struct dc_stream_state *stream)
+{
+       struct pipe_ctx *pipe_ctx = resource_get_otg_master_for_stream(&context->res_ctx, stream);
+
+       if (!pipe_ctx)
+               return DC_ERROR_UNEXPECTED;
+
+       if (!is_surface_pixel_format_supported(pipe_ctx,
+                       dc->res_pool->underlay_pipe_index))
+               return DC_SURFACE_PIXEL_FORMAT_UNSUPPORTED;
+
+       dce110_resource_build_pipe_hw_param(pipe_ctx);
+
+       /* TODO: validate audio ASIC caps, encoder */
+
+       resource_build_info_frame(pipe_ctx);
+
+       return DC_OK;
+}
+
+static bool dce110_validate_bandwidth(
+       struct dc *dc,
+       struct dc_state *context,
+       bool fast_validate)
+{
+       bool result = false;
+
+       DC_LOG_BANDWIDTH_CALCS(
+               "%s: start",
+               __func__);
+
+       if (bw_calcs(
+                       dc->ctx,
+                       dc->bw_dceip,
+                       dc->bw_vbios,
+                       context->res_ctx.pipe_ctx,
+                       dc->res_pool->pipe_count,
+                       &context->bw_ctx.bw.dce))
+               result =  true;
+
+       if (!result)
+               DC_LOG_BANDWIDTH_VALIDATION("%s: %dx%d@%d Bandwidth validation failed!\n",
+                       __func__,
+                       context->streams[0]->timing.h_addressable,
+                       context->streams[0]->timing.v_addressable,
+                       context->streams[0]->timing.pix_clk_100hz / 10);
+
+       if (memcmp(&dc->current_state->bw_ctx.bw.dce,
+                       &context->bw_ctx.bw.dce, sizeof(context->bw_ctx.bw.dce))) {
+
+               DC_LOG_BANDWIDTH_CALCS(
+                       "%s: finish,\n"
+                       "nbpMark_b: %d nbpMark_a: %d urgentMark_b: %d urgentMark_a: %d\n"
+                       "stutMark_b: %d stutMark_a: %d\n"
+                       "nbpMark_b: %d nbpMark_a: %d urgentMark_b: %d urgentMark_a: %d\n"
+                       "stutMark_b: %d stutMark_a: %d\n"
+                       "nbpMark_b: %d nbpMark_a: %d urgentMark_b: %d urgentMark_a: %d\n"
+                       "stutMark_b: %d stutMark_a: %d stutter_mode_enable: %d\n"
+                       "cstate: %d pstate: %d nbpstate: %d sync: %d dispclk: %d\n"
+                       "sclk: %d sclk_sleep: %d yclk: %d blackout_recovery_time_us: %d\n"
+                       ,
+                       __func__,
+                       context->bw_ctx.bw.dce.nbp_state_change_wm_ns[0].b_mark,
+                       context->bw_ctx.bw.dce.nbp_state_change_wm_ns[0].a_mark,
+                       context->bw_ctx.bw.dce.urgent_wm_ns[0].b_mark,
+                       context->bw_ctx.bw.dce.urgent_wm_ns[0].a_mark,
+                       context->bw_ctx.bw.dce.stutter_exit_wm_ns[0].b_mark,
+                       context->bw_ctx.bw.dce.stutter_exit_wm_ns[0].a_mark,
+                       context->bw_ctx.bw.dce.nbp_state_change_wm_ns[1].b_mark,
+                       context->bw_ctx.bw.dce.nbp_state_change_wm_ns[1].a_mark,
+                       context->bw_ctx.bw.dce.urgent_wm_ns[1].b_mark,
+                       context->bw_ctx.bw.dce.urgent_wm_ns[1].a_mark,
+                       context->bw_ctx.bw.dce.stutter_exit_wm_ns[1].b_mark,
+                       context->bw_ctx.bw.dce.stutter_exit_wm_ns[1].a_mark,
+                       context->bw_ctx.bw.dce.nbp_state_change_wm_ns[2].b_mark,
+                       context->bw_ctx.bw.dce.nbp_state_change_wm_ns[2].a_mark,
+                       context->bw_ctx.bw.dce.urgent_wm_ns[2].b_mark,
+                       context->bw_ctx.bw.dce.urgent_wm_ns[2].a_mark,
+                       context->bw_ctx.bw.dce.stutter_exit_wm_ns[2].b_mark,
+                       context->bw_ctx.bw.dce.stutter_exit_wm_ns[2].a_mark,
+                       context->bw_ctx.bw.dce.stutter_mode_enable,
+                       context->bw_ctx.bw.dce.cpuc_state_change_enable,
+                       context->bw_ctx.bw.dce.cpup_state_change_enable,
+                       context->bw_ctx.bw.dce.nbp_state_change_enable,
+                       context->bw_ctx.bw.dce.all_displays_in_sync,
+                       context->bw_ctx.bw.dce.dispclk_khz,
+                       context->bw_ctx.bw.dce.sclk_khz,
+                       context->bw_ctx.bw.dce.sclk_deep_sleep_khz,
+                       context->bw_ctx.bw.dce.yclk_khz,
+                       context->bw_ctx.bw.dce.blackout_recovery_time_us);
+       }
+       return result;
+}
+
+static enum dc_status dce110_validate_plane(const struct dc_plane_state *plane_state,
+                                           struct dc_caps *caps)
+{
+       if (((plane_state->dst_rect.width * 2) < plane_state->src_rect.width) ||
+           ((plane_state->dst_rect.height * 2) < plane_state->src_rect.height))
+               return DC_FAIL_SURFACE_VALIDATE;
+
+       return DC_OK;
+}
+
+static bool dce110_validate_surface_sets(
+               struct dc_state *context)
+{
+       int i, j;
+
+       for (i = 0; i < context->stream_count; i++) {
+               if (context->stream_status[i].plane_count == 0)
+                       continue;
+
+               if (context->stream_status[i].plane_count > 2)
+                       return false;
+
+               for (j = 0; j < context->stream_status[i].plane_count; j++) {
+                       struct dc_plane_state *plane =
+                               context->stream_status[i].plane_states[j];
+
+                       /* underlay validation */
+                       if (plane->format >= SURFACE_PIXEL_FORMAT_VIDEO_BEGIN) {
+
+                               if ((plane->src_rect.width > 1920 ||
+                                       plane->src_rect.height > 1080))
+                                       return false;
+
+                               /* we don't have the logic to support underlay
+                                * only yet so block the use case where we get
+                                * NV12 plane as top layer
+                                */
+                               if (j == 0)
+                                       return false;
+
+                               /* irrespective of plane format,
+                                * stream should be RGB encoded
+                                */
+                               if (context->streams[i]->timing.pixel_encoding
+                                               != PIXEL_ENCODING_RGB)
+                                       return false;
+
+                       }
+
+               }
+       }
+
+       return true;
+}
+
+static enum dc_status dce110_validate_global(
+               struct dc *dc,
+               struct dc_state *context)
+{
+       if (!dce110_validate_surface_sets(context))
+               return DC_FAIL_SURFACE_VALIDATE;
+
+       return DC_OK;
+}
+
+static enum dc_status dce110_add_stream_to_ctx(
+               struct dc *dc,
+               struct dc_state *new_ctx,
+               struct dc_stream_state *dc_stream)
+{
+       enum dc_status result = DC_ERROR_UNEXPECTED;
+
+       result = resource_map_pool_resources(dc, new_ctx, dc_stream);
+
+       if (result == DC_OK)
+               result = resource_map_clock_resources(dc, new_ctx, dc_stream);
+
+
+       if (result == DC_OK)
+               result = build_mapped_resource(dc, new_ctx, dc_stream);
+
+       return result;
+}
+
+static struct pipe_ctx *dce110_acquire_underlay(
+               const struct dc_state *cur_ctx,
+               struct dc_state *new_ctx,
+               const struct resource_pool *pool,
+               const struct pipe_ctx *opp_head_pipe)
+{
+       struct dc_stream_state *stream = opp_head_pipe->stream;
+       struct dc *dc = stream->ctx->dc;
+       struct dce_hwseq *hws = dc->hwseq;
+       struct resource_context *res_ctx = &new_ctx->res_ctx;
+       unsigned int underlay_idx = pool->underlay_pipe_index;
+       struct pipe_ctx *pipe_ctx = &res_ctx->pipe_ctx[underlay_idx];
+
+       if (res_ctx->pipe_ctx[underlay_idx].stream)
+               return NULL;
+
+       pipe_ctx->stream_res.tg = pool->timing_generators[underlay_idx];
+       pipe_ctx->plane_res.mi = pool->mis[underlay_idx];
+       /*pipe_ctx->plane_res.ipp = res_ctx->pool->ipps[underlay_idx];*/
+       pipe_ctx->plane_res.xfm = pool->transforms[underlay_idx];
+       pipe_ctx->stream_res.opp = pool->opps[underlay_idx];
+       pipe_ctx->pipe_idx = underlay_idx;
+
+       pipe_ctx->stream = stream;
+
+       if (!dc->current_state->res_ctx.pipe_ctx[underlay_idx].stream) {
+               struct tg_color black_color = {0};
+               struct dc_bios *dcb = dc->ctx->dc_bios;
+
+               hws->funcs.enable_display_power_gating(
+                               dc,
+                               pipe_ctx->stream_res.tg->inst,
+                               dcb, PIPE_GATING_CONTROL_DISABLE);
+
+               /*
+                * This is for powering on underlay, so crtc does not
+                * need to be enabled
+                */
+
+               pipe_ctx->stream_res.tg->funcs->program_timing(pipe_ctx->stream_res.tg,
+                               &stream->timing,
+                               0,
+                               0,
+                               0,
+                               0,
+                               pipe_ctx->stream->signal,
+                               false);
+
+               pipe_ctx->stream_res.tg->funcs->enable_advanced_request(
+                               pipe_ctx->stream_res.tg,
+                               true,
+                               &stream->timing);
+
+               pipe_ctx->plane_res.mi->funcs->allocate_mem_input(pipe_ctx->plane_res.mi,
+                               stream->timing.h_total,
+                               stream->timing.v_total,
+                               stream->timing.pix_clk_100hz / 10,
+                               new_ctx->stream_count);
+
+               color_space_to_black_color(dc,
+                               COLOR_SPACE_YCBCR601, &black_color);
+               pipe_ctx->stream_res.tg->funcs->set_blank_color(
+                               pipe_ctx->stream_res.tg,
+                               &black_color);
+       }
+
+       return pipe_ctx;
+}
+
+static void dce110_destroy_resource_pool(struct resource_pool **pool)
+{
+       struct dce110_resource_pool *dce110_pool = TO_DCE110_RES_POOL(*pool);
+
+       dce110_resource_destruct(dce110_pool);
+       kfree(dce110_pool);
+       *pool = NULL;
+}
+
+struct stream_encoder *dce110_find_first_free_match_stream_enc_for_link(
+               struct resource_context *res_ctx,
+               const struct resource_pool *pool,
+               struct dc_stream_state *stream)
+{
+       int i;
+       int j = -1;
+       struct dc_link *link = stream->link;
+
+       for (i = 0; i < pool->stream_enc_count; i++) {
+               if (!res_ctx->is_stream_enc_acquired[i] &&
+                               pool->stream_enc[i]) {
+                       /* Store first available for MST second display
+                        * in daisy chain use case
+                        */
+                       j = i;
+                       if (pool->stream_enc[i]->id ==
+                                       link->link_enc->preferred_engine)
+                               return pool->stream_enc[i];
+               }
+       }
+
+       /*
+        * For CZ and later, we can allow DIG FE and BE to differ for all display types
+        */
+
+       if (j >= 0)
+               return pool->stream_enc[j];
+
+       return NULL;
+}
+
+
+static const struct resource_funcs dce110_res_pool_funcs = {
+       .destroy = dce110_destroy_resource_pool,
+       .link_enc_create = dce110_link_encoder_create,
+       .panel_cntl_create = dce110_panel_cntl_create,
+       .validate_bandwidth = dce110_validate_bandwidth,
+       .validate_plane = dce110_validate_plane,
+       .acquire_free_pipe_as_secondary_dpp_pipe = dce110_acquire_underlay,
+       .add_stream_to_ctx = dce110_add_stream_to_ctx,
+       .validate_global = dce110_validate_global,
+       .find_first_free_match_stream_enc_for_link = dce110_find_first_free_match_stream_enc_for_link
+};
+
+static bool underlay_create(struct dc_context *ctx, struct resource_pool *pool)
+{
+       struct dce110_timing_generator *dce110_tgv = kzalloc(sizeof(*dce110_tgv),
+                                                            GFP_KERNEL);
+       struct dce_transform *dce110_xfmv = kzalloc(sizeof(*dce110_xfmv),
+                                                   GFP_KERNEL);
+       struct dce_mem_input *dce110_miv = kzalloc(sizeof(*dce110_miv),
+                                                  GFP_KERNEL);
+       struct dce110_opp *dce110_oppv = kzalloc(sizeof(*dce110_oppv),
+                                                GFP_KERNEL);
+
+       if (!dce110_tgv || !dce110_xfmv || !dce110_miv || !dce110_oppv) {
+               kfree(dce110_tgv);
+               kfree(dce110_xfmv);
+               kfree(dce110_miv);
+               kfree(dce110_oppv);
+               return false;
+       }
+
+       dce110_opp_v_construct(dce110_oppv, ctx);
+
+       dce110_timing_generator_v_construct(dce110_tgv, ctx);
+       dce110_mem_input_v_construct(dce110_miv, ctx);
+       dce110_transform_v_construct(dce110_xfmv, ctx);
+
+       pool->opps[pool->pipe_count] = &dce110_oppv->base;
+       pool->timing_generators[pool->pipe_count] = &dce110_tgv->base;
+       pool->mis[pool->pipe_count] = &dce110_miv->base;
+       pool->transforms[pool->pipe_count] = &dce110_xfmv->base;
+       pool->pipe_count++;
+
+       /* update the public caps to indicate an underlay is available */
+       ctx->dc->caps.max_slave_planes = 1;
+       ctx->dc->caps.max_slave_yuv_planes = 1;
+       ctx->dc->caps.max_slave_rgb_planes = 0;
+
+       return true;
+}
+
+static void bw_calcs_data_update_from_pplib(struct dc *dc)
+{
+       struct dm_pp_clock_levels clks = {0};
+
+       /*do system clock*/
+       dm_pp_get_clock_levels_by_type(
+                       dc->ctx,
+                       DM_PP_CLOCK_TYPE_ENGINE_CLK,
+                       &clks);
+       /* convert all the clock fro kHz to fix point mHz */
+       dc->bw_vbios->high_sclk = bw_frc_to_fixed(
+                       clks.clocks_in_khz[clks.num_levels-1], 1000);
+       dc->bw_vbios->mid1_sclk  = bw_frc_to_fixed(
+                       clks.clocks_in_khz[clks.num_levels/8], 1000);
+       dc->bw_vbios->mid2_sclk  = bw_frc_to_fixed(
+                       clks.clocks_in_khz[clks.num_levels*2/8], 1000);
+       dc->bw_vbios->mid3_sclk  = bw_frc_to_fixed(
+                       clks.clocks_in_khz[clks.num_levels*3/8], 1000);
+       dc->bw_vbios->mid4_sclk  = bw_frc_to_fixed(
+                       clks.clocks_in_khz[clks.num_levels*4/8], 1000);
+       dc->bw_vbios->mid5_sclk  = bw_frc_to_fixed(
+                       clks.clocks_in_khz[clks.num_levels*5/8], 1000);
+       dc->bw_vbios->mid6_sclk  = bw_frc_to_fixed(
+                       clks.clocks_in_khz[clks.num_levels*6/8], 1000);
+       dc->bw_vbios->low_sclk  = bw_frc_to_fixed(
+                       clks.clocks_in_khz[0], 1000);
+       dc->sclk_lvls = clks;
+
+       /*do display clock*/
+       dm_pp_get_clock_levels_by_type(
+                       dc->ctx,
+                       DM_PP_CLOCK_TYPE_DISPLAY_CLK,
+                       &clks);
+       dc->bw_vbios->high_voltage_max_dispclk = bw_frc_to_fixed(
+                       clks.clocks_in_khz[clks.num_levels-1], 1000);
+       dc->bw_vbios->mid_voltage_max_dispclk  = bw_frc_to_fixed(
+                       clks.clocks_in_khz[clks.num_levels>>1], 1000);
+       dc->bw_vbios->low_voltage_max_dispclk  = bw_frc_to_fixed(
+                       clks.clocks_in_khz[0], 1000);
+
+       /*do memory clock*/
+       dm_pp_get_clock_levels_by_type(
+                       dc->ctx,
+                       DM_PP_CLOCK_TYPE_MEMORY_CLK,
+                       &clks);
+
+       dc->bw_vbios->low_yclk = bw_frc_to_fixed(
+               clks.clocks_in_khz[0] * MEMORY_TYPE_MULTIPLIER_CZ, 1000);
+       dc->bw_vbios->mid_yclk = bw_frc_to_fixed(
+               clks.clocks_in_khz[clks.num_levels>>1] * MEMORY_TYPE_MULTIPLIER_CZ,
+               1000);
+       dc->bw_vbios->high_yclk = bw_frc_to_fixed(
+               clks.clocks_in_khz[clks.num_levels-1] * MEMORY_TYPE_MULTIPLIER_CZ,
+               1000);
+}
+
+static const struct resource_caps *dce110_resource_cap(
+       struct hw_asic_id *asic_id)
+{
+       if (ASIC_REV_IS_STONEY(asic_id->hw_internal_rev))
+               return &stoney_resource_cap;
+       else
+               return &carrizo_resource_cap;
+}
+
+static bool dce110_resource_construct(
+       uint8_t num_virtual_links,
+       struct dc *dc,
+       struct dce110_resource_pool *pool,
+       struct hw_asic_id asic_id)
+{
+       unsigned int i;
+       struct dc_context *ctx = dc->ctx;
+       struct dc_bios *bp;
+
+       ctx->dc_bios->regs = &bios_regs;
+
+       pool->base.res_cap = dce110_resource_cap(&ctx->asic_id);
+       pool->base.funcs = &dce110_res_pool_funcs;
+
+       /*************************************************
+        *  Resource + asic cap harcoding                *
+        *************************************************/
+
+       pool->base.pipe_count = pool->base.res_cap->num_timing_generator;
+       pool->base.underlay_pipe_index = pool->base.pipe_count;
+       pool->base.timing_generator_count = pool->base.res_cap->num_timing_generator;
+       dc->caps.max_downscale_ratio = 150;
+       dc->caps.i2c_speed_in_khz = 40;
+       dc->caps.i2c_speed_in_khz_hdcp = 40;
+       dc->caps.max_cursor_size = 128;
+       dc->caps.min_horizontal_blanking_period = 80;
+       dc->caps.is_apu = true;
+       dc->caps.extended_aux_timeout_support = false;
+       dc->debug = debug_defaults;
+
+       /*************************************************
+        *  Create resources                             *
+        *************************************************/
+
+       bp = ctx->dc_bios;
+
+       if (bp->fw_info_valid && bp->fw_info.external_clock_source_frequency_for_dp != 0) {
+               pool->base.dp_clock_source =
+                               dce110_clock_source_create(ctx, bp, CLOCK_SOURCE_ID_EXTERNAL, NULL, true);
+
+               pool->base.clock_sources[0] =
+                               dce110_clock_source_create(ctx, bp, CLOCK_SOURCE_ID_PLL0,
+                                               &clk_src_regs[0], false);
+               pool->base.clock_sources[1] =
+                               dce110_clock_source_create(ctx, bp, CLOCK_SOURCE_ID_PLL1,
+                                               &clk_src_regs[1], false);
+
+               pool->base.clk_src_count = 2;
+
+               /* TODO: find out if CZ support 3 PLLs */
+       }
+
+       if (pool->base.dp_clock_source == NULL) {
+               dm_error("DC: failed to create dp clock source!\n");
+               BREAK_TO_DEBUGGER();
+               goto res_create_fail;
+       }
+
+       for (i = 0; i < pool->base.clk_src_count; i++) {
+               if (pool->base.clock_sources[i] == NULL) {
+                       dm_error("DC: failed to create clock sources!\n");
+                       BREAK_TO_DEBUGGER();
+                       goto res_create_fail;
+               }
+       }
+
+       pool->base.dmcu = dce_dmcu_create(ctx,
+                       &dmcu_regs,
+                       &dmcu_shift,
+                       &dmcu_mask);
+       if (pool->base.dmcu == NULL) {
+               dm_error("DC: failed to create dmcu!\n");
+               BREAK_TO_DEBUGGER();
+               goto res_create_fail;
+       }
+
+       pool->base.abm = dce_abm_create(ctx,
+                       &abm_regs,
+                       &abm_shift,
+                       &abm_mask);
+       if (pool->base.abm == NULL) {
+               dm_error("DC: failed to create abm!\n");
+               BREAK_TO_DEBUGGER();
+               goto res_create_fail;
+       }
+
+       {
+               struct irq_service_init_data init_data;
+               init_data.ctx = dc->ctx;
+               pool->base.irqs = dal_irq_service_dce110_create(&init_data);
+               if (!pool->base.irqs)
+                       goto res_create_fail;
+       }
+
+       for (i = 0; i < pool->base.pipe_count; i++) {
+               pool->base.timing_generators[i] = dce110_timing_generator_create(
+                               ctx, i, &dce110_tg_offsets[i]);
+               if (pool->base.timing_generators[i] == NULL) {
+                       BREAK_TO_DEBUGGER();
+                       dm_error("DC: failed to create tg!\n");
+                       goto res_create_fail;
+               }
+
+               pool->base.mis[i] = dce110_mem_input_create(ctx, i);
+               if (pool->base.mis[i] == NULL) {
+                       BREAK_TO_DEBUGGER();
+                       dm_error(
+                               "DC: failed to create memory input!\n");
+                       goto res_create_fail;
+               }
+
+               pool->base.ipps[i] = dce110_ipp_create(ctx, i);
+               if (pool->base.ipps[i] == NULL) {
+                       BREAK_TO_DEBUGGER();
+                       dm_error(
+                               "DC: failed to create input pixel processor!\n");
+                       goto res_create_fail;
+               }
+
+               pool->base.transforms[i] = dce110_transform_create(ctx, i);
+               if (pool->base.transforms[i] == NULL) {
+                       BREAK_TO_DEBUGGER();
+                       dm_error(
+                               "DC: failed to create transform!\n");
+                       goto res_create_fail;
+               }
+
+               pool->base.opps[i] = dce110_opp_create(ctx, i);
+               if (pool->base.opps[i] == NULL) {
+                       BREAK_TO_DEBUGGER();
+                       dm_error(
+                               "DC: failed to create output pixel processor!\n");
+                       goto res_create_fail;
+               }
+       }
+
+       for (i = 0; i < pool->base.res_cap->num_ddc; i++) {
+               pool->base.engines[i] = dce110_aux_engine_create(ctx, i);
+               if (pool->base.engines[i] == NULL) {
+                       BREAK_TO_DEBUGGER();
+                       dm_error(
+                               "DC:failed to create aux engine!!\n");
+                       goto res_create_fail;
+               }
+               pool->base.hw_i2cs[i] = dce110_i2c_hw_create(ctx, i);
+               if (pool->base.hw_i2cs[i] == NULL) {
+                       BREAK_TO_DEBUGGER();
+                       dm_error(
+                               "DC:failed to create i2c engine!!\n");
+                       goto res_create_fail;
+               }
+               pool->base.sw_i2cs[i] = NULL;
+       }
+
+       if (dc->config.fbc_support)
+               dc->fbc_compressor = dce110_compressor_create(ctx);
+
+       if (!underlay_create(ctx, &pool->base))
+               goto res_create_fail;
+
+       if (!resource_construct(num_virtual_links, dc, &pool->base,
+                       &res_create_funcs))
+               goto res_create_fail;
+
+       /* Create hardware sequencer */
+       dce110_hw_sequencer_construct(dc);
+
+       dc->caps.max_planes =  pool->base.pipe_count;
+
+       for (i = 0; i < pool->base.underlay_pipe_index; ++i)
+               dc->caps.planes[i] = plane_cap;
+
+       dc->caps.planes[pool->base.underlay_pipe_index] = underlay_plane_cap;
+
+       bw_calcs_init(dc->bw_dceip, dc->bw_vbios, dc->ctx->asic_id);
+
+       bw_calcs_data_update_from_pplib(dc);
+
+       return true;
+
+res_create_fail:
+       dce110_resource_destruct(pool);
+       return false;
+}
+
+struct resource_pool *dce110_create_resource_pool(
+       uint8_t num_virtual_links,
+       struct dc *dc,
+       struct hw_asic_id asic_id)
+{
+       struct dce110_resource_pool *pool =
+               kzalloc(sizeof(struct dce110_resource_pool), GFP_KERNEL);
+
+       if (!pool)
+               return NULL;
+
+       if (dce110_resource_construct(num_virtual_links, dc, pool, asic_id))
+               return &pool->base;
+
+       kfree(pool);
+       BREAK_TO_DEBUGGER();
+       return NULL;
+}
diff --git a/drivers/gpu/drm/amd/display/dc/resource/dce110/dce110_resource.h b/drivers/gpu/drm/amd/display/dc/resource/dce110/dce110_resource.h
new file mode 100644 (file)
index 0000000..aa4531e
--- /dev/null
@@ -0,0 +1,54 @@
+/*
+* Copyright 2012-15 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_RESOURCE_DCE110_H__
+#define __DC_RESOURCE_DCE110_H__
+
+#include "core_types.h"
+
+struct dc;
+struct resource_pool;
+
+#define TO_DCE110_RES_POOL(pool)\
+       container_of(pool, struct dce110_resource_pool, base)
+
+struct dce110_resource_pool {
+       struct resource_pool base;
+};
+
+void dce110_resource_build_pipe_hw_param(struct pipe_ctx *pipe_ctx);
+
+struct resource_pool *dce110_create_resource_pool(
+       uint8_t num_virtual_links,
+       struct dc *dc,
+       struct hw_asic_id asic_id);
+
+struct stream_encoder *dce110_find_first_free_match_stream_enc_for_link(
+               struct resource_context *res_ctx,
+               const struct resource_pool *pool,
+               struct dc_stream_state *stream);
+
+#endif /* __DC_RESOURCE_DCE110_H__ */
+
diff --git a/drivers/gpu/drm/amd/display/dc/resource/dce112/dce112_resource.c b/drivers/gpu/drm/amd/display/dc/resource/dce112/dce112_resource.c
new file mode 100644 (file)
index 0000000..d1edac4
--- /dev/null
@@ -0,0 +1,1431 @@
+/*
+* Copyright 2012-15 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 "dm_services.h"
+
+#include "link_encoder.h"
+#include "stream_encoder.h"
+
+#include "resource.h"
+#include "include/irq_service_interface.h"
+#include "dce110/dce110_resource.h"
+#include "dce110/dce110_timing_generator.h"
+
+#include "irq/dce110/irq_service_dce110.h"
+#include "dce/dce_mem_input.h"
+#include "dce/dce_transform.h"
+#include "dce/dce_link_encoder.h"
+#include "dce/dce_stream_encoder.h"
+#include "dce/dce_audio.h"
+#include "dce/dce_opp.h"
+#include "dce/dce_ipp.h"
+#include "dce/dce_clock_source.h"
+
+#include "dce/dce_hwseq.h"
+#include "dce112/dce112_hwseq.h"
+#include "dce/dce_abm.h"
+#include "dce/dce_dmcu.h"
+#include "dce/dce_aux.h"
+#include "dce/dce_i2c.h"
+#include "dce/dce_panel_cntl.h"
+
+#include "reg_helper.h"
+
+#include "dce/dce_11_2_d.h"
+#include "dce/dce_11_2_sh_mask.h"
+
+#include "dce100/dce100_resource.h"
+#include "dce112_resource.h"
+
+#define DC_LOGGER                              \
+               dc->ctx->logger
+
+#ifndef mmDP_DPHY_INTERNAL_CTRL
+       #define mmDP_DPHY_INTERNAL_CTRL 0x4aa7
+       #define mmDP0_DP_DPHY_INTERNAL_CTRL 0x4aa7
+       #define mmDP1_DP_DPHY_INTERNAL_CTRL 0x4ba7
+       #define mmDP2_DP_DPHY_INTERNAL_CTRL 0x4ca7
+       #define mmDP3_DP_DPHY_INTERNAL_CTRL 0x4da7
+       #define mmDP4_DP_DPHY_INTERNAL_CTRL 0x4ea7
+       #define mmDP5_DP_DPHY_INTERNAL_CTRL 0x4fa7
+       #define mmDP6_DP_DPHY_INTERNAL_CTRL 0x54a7
+       #define mmDP7_DP_DPHY_INTERNAL_CTRL 0x56a7
+       #define mmDP8_DP_DPHY_INTERNAL_CTRL 0x57a7
+#endif
+
+#ifndef mmBIOS_SCRATCH_2
+       #define mmBIOS_SCRATCH_2 0x05CB
+       #define mmBIOS_SCRATCH_3 0x05CC
+       #define mmBIOS_SCRATCH_6 0x05CF
+#endif
+
+#ifndef mmDP_DPHY_BS_SR_SWAP_CNTL
+       #define mmDP_DPHY_BS_SR_SWAP_CNTL                       0x4ADC
+       #define mmDP0_DP_DPHY_BS_SR_SWAP_CNTL                   0x4ADC
+       #define mmDP1_DP_DPHY_BS_SR_SWAP_CNTL                   0x4BDC
+       #define mmDP2_DP_DPHY_BS_SR_SWAP_CNTL                   0x4CDC
+       #define mmDP3_DP_DPHY_BS_SR_SWAP_CNTL                   0x4DDC
+       #define mmDP4_DP_DPHY_BS_SR_SWAP_CNTL                   0x4EDC
+       #define mmDP5_DP_DPHY_BS_SR_SWAP_CNTL                   0x4FDC
+       #define mmDP6_DP_DPHY_BS_SR_SWAP_CNTL                   0x54DC
+#endif
+
+#ifndef mmDP_DPHY_FAST_TRAINING
+       #define mmDP_DPHY_FAST_TRAINING                         0x4ABC
+       #define mmDP0_DP_DPHY_FAST_TRAINING                     0x4ABC
+       #define mmDP1_DP_DPHY_FAST_TRAINING                     0x4BBC
+       #define mmDP2_DP_DPHY_FAST_TRAINING                     0x4CBC
+       #define mmDP3_DP_DPHY_FAST_TRAINING                     0x4DBC
+       #define mmDP4_DP_DPHY_FAST_TRAINING                     0x4EBC
+       #define mmDP5_DP_DPHY_FAST_TRAINING                     0x4FBC
+       #define mmDP6_DP_DPHY_FAST_TRAINING                     0x54BC
+#endif
+
+enum dce112_clk_src_array_id {
+       DCE112_CLK_SRC_PLL0,
+       DCE112_CLK_SRC_PLL1,
+       DCE112_CLK_SRC_PLL2,
+       DCE112_CLK_SRC_PLL3,
+       DCE112_CLK_SRC_PLL4,
+       DCE112_CLK_SRC_PLL5,
+
+       DCE112_CLK_SRC_TOTAL
+};
+
+static const struct dce110_timing_generator_offsets dce112_tg_offsets[] = {
+       {
+               .crtc = (mmCRTC0_CRTC_CONTROL - mmCRTC_CONTROL),
+               .dcp =  (mmDCP0_GRPH_CONTROL - mmGRPH_CONTROL),
+       },
+       {
+               .crtc = (mmCRTC1_CRTC_CONTROL - mmCRTC_CONTROL),
+               .dcp = (mmDCP1_GRPH_CONTROL - mmGRPH_CONTROL),
+       },
+       {
+               .crtc = (mmCRTC2_CRTC_CONTROL - mmCRTC_CONTROL),
+               .dcp = (mmDCP2_GRPH_CONTROL - mmGRPH_CONTROL),
+       },
+       {
+               .crtc = (mmCRTC3_CRTC_CONTROL - mmCRTC_CONTROL),
+               .dcp = (mmDCP3_GRPH_CONTROL - mmGRPH_CONTROL),
+       },
+       {
+               .crtc = (mmCRTC4_CRTC_CONTROL - mmCRTC_CONTROL),
+               .dcp = (mmDCP4_GRPH_CONTROL - mmGRPH_CONTROL),
+       },
+       {
+               .crtc = (mmCRTC5_CRTC_CONTROL - mmCRTC_CONTROL),
+               .dcp = (mmDCP5_GRPH_CONTROL - mmGRPH_CONTROL),
+       }
+};
+
+/* set register offset */
+#define SR(reg_name)\
+       .reg_name = mm ## reg_name
+
+/* set register offset with instance */
+#define SRI(reg_name, block, id)\
+       .reg_name = mm ## block ## id ## _ ## reg_name
+
+static const struct dce_dmcu_registers dmcu_regs = {
+               DMCU_DCE110_COMMON_REG_LIST()
+};
+
+static const struct dce_dmcu_shift dmcu_shift = {
+               DMCU_MASK_SH_LIST_DCE110(__SHIFT)
+};
+
+static const struct dce_dmcu_mask dmcu_mask = {
+               DMCU_MASK_SH_LIST_DCE110(_MASK)
+};
+
+static const struct dce_abm_registers abm_regs = {
+               ABM_DCE110_COMMON_REG_LIST()
+};
+
+static const struct dce_abm_shift abm_shift = {
+               ABM_MASK_SH_LIST_DCE110(__SHIFT)
+};
+
+static const struct dce_abm_mask abm_mask = {
+               ABM_MASK_SH_LIST_DCE110(_MASK)
+};
+
+static const struct dce110_aux_registers_shift aux_shift = {
+       DCE_AUX_MASK_SH_LIST(__SHIFT)
+};
+
+static const struct dce110_aux_registers_mask aux_mask = {
+       DCE_AUX_MASK_SH_LIST(_MASK)
+};
+
+#define ipp_regs(id)\
+[id] = {\
+               IPP_DCE110_REG_LIST_DCE_BASE(id)\
+}
+
+static const struct dce_ipp_registers ipp_regs[] = {
+               ipp_regs(0),
+               ipp_regs(1),
+               ipp_regs(2),
+               ipp_regs(3),
+               ipp_regs(4),
+               ipp_regs(5)
+};
+
+static const struct dce_ipp_shift ipp_shift = {
+               IPP_DCE100_MASK_SH_LIST_DCE_COMMON_BASE(__SHIFT)
+};
+
+static const struct dce_ipp_mask ipp_mask = {
+               IPP_DCE100_MASK_SH_LIST_DCE_COMMON_BASE(_MASK)
+};
+
+#define transform_regs(id)\
+[id] = {\
+               XFM_COMMON_REG_LIST_DCE110(id)\
+}
+
+static const struct dce_transform_registers xfm_regs[] = {
+               transform_regs(0),
+               transform_regs(1),
+               transform_regs(2),
+               transform_regs(3),
+               transform_regs(4),
+               transform_regs(5)
+};
+
+static const struct dce_transform_shift xfm_shift = {
+               XFM_COMMON_MASK_SH_LIST_DCE110(__SHIFT)
+};
+
+static const struct dce_transform_mask xfm_mask = {
+               XFM_COMMON_MASK_SH_LIST_DCE110(_MASK)
+};
+
+#define aux_regs(id)\
+[id] = {\
+       AUX_REG_LIST(id)\
+}
+
+static const struct dce110_link_enc_aux_registers link_enc_aux_regs[] = {
+               aux_regs(0),
+               aux_regs(1),
+               aux_regs(2),
+               aux_regs(3),
+               aux_regs(4),
+               aux_regs(5)
+};
+
+static const struct dce_panel_cntl_registers panel_cntl_regs[] = {
+       { DCE_PANEL_CNTL_REG_LIST() }
+};
+
+static const struct dce_panel_cntl_shift panel_cntl_shift = {
+       DCE_PANEL_CNTL_MASK_SH_LIST(__SHIFT)
+};
+
+static const struct dce_panel_cntl_mask panel_cntl_mask = {
+       DCE_PANEL_CNTL_MASK_SH_LIST(_MASK)
+};
+
+#define hpd_regs(id)\
+[id] = {\
+       HPD_REG_LIST(id)\
+}
+
+static const struct dce110_link_enc_hpd_registers link_enc_hpd_regs[] = {
+               hpd_regs(0),
+               hpd_regs(1),
+               hpd_regs(2),
+               hpd_regs(3),
+               hpd_regs(4),
+               hpd_regs(5)
+};
+
+#define link_regs(id)\
+[id] = {\
+       LE_DCE110_REG_LIST(id)\
+}
+
+static const struct dce110_link_enc_registers link_enc_regs[] = {
+       link_regs(0),
+       link_regs(1),
+       link_regs(2),
+       link_regs(3),
+       link_regs(4),
+       link_regs(5),
+       link_regs(6),
+};
+
+#define stream_enc_regs(id)\
+[id] = {\
+       SE_COMMON_REG_LIST(id),\
+       .TMDS_CNTL = 0,\
+}
+
+static const struct dce110_stream_enc_registers stream_enc_regs[] = {
+       stream_enc_regs(0),
+       stream_enc_regs(1),
+       stream_enc_regs(2),
+       stream_enc_regs(3),
+       stream_enc_regs(4),
+       stream_enc_regs(5)
+};
+
+static const struct dce_stream_encoder_shift se_shift = {
+               SE_COMMON_MASK_SH_LIST_DCE112(__SHIFT)
+};
+
+static const struct dce_stream_encoder_mask se_mask = {
+               SE_COMMON_MASK_SH_LIST_DCE112(_MASK)
+};
+
+#define opp_regs(id)\
+[id] = {\
+       OPP_DCE_112_REG_LIST(id),\
+}
+
+static const struct dce_opp_registers opp_regs[] = {
+       opp_regs(0),
+       opp_regs(1),
+       opp_regs(2),
+       opp_regs(3),
+       opp_regs(4),
+       opp_regs(5)
+};
+
+static const struct dce_opp_shift opp_shift = {
+       OPP_COMMON_MASK_SH_LIST_DCE_112(__SHIFT)
+};
+
+static const struct dce_opp_mask opp_mask = {
+       OPP_COMMON_MASK_SH_LIST_DCE_112(_MASK)
+};
+
+#define aux_engine_regs(id)\
+[id] = {\
+       AUX_COMMON_REG_LIST(id), \
+       .AUX_RESET_MASK = 0 \
+}
+
+static const struct dce110_aux_registers aux_engine_regs[] = {
+               aux_engine_regs(0),
+               aux_engine_regs(1),
+               aux_engine_regs(2),
+               aux_engine_regs(3),
+               aux_engine_regs(4),
+               aux_engine_regs(5)
+};
+
+#define audio_regs(id)\
+[id] = {\
+       AUD_COMMON_REG_LIST(id)\
+}
+
+static const struct dce_audio_registers audio_regs[] = {
+       audio_regs(0),
+       audio_regs(1),
+       audio_regs(2),
+       audio_regs(3),
+       audio_regs(4),
+       audio_regs(5)
+};
+
+static const struct dce_audio_shift audio_shift = {
+               AUD_COMMON_MASK_SH_LIST(__SHIFT)
+};
+
+static const struct dce_audio_mask audio_mask = {
+               AUD_COMMON_MASK_SH_LIST(_MASK)
+};
+
+#define clk_src_regs(index, id)\
+[index] = {\
+       CS_COMMON_REG_LIST_DCE_112(id),\
+}
+
+static const struct dce110_clk_src_regs clk_src_regs[] = {
+       clk_src_regs(0, A),
+       clk_src_regs(1, B),
+       clk_src_regs(2, C),
+       clk_src_regs(3, D),
+       clk_src_regs(4, E),
+       clk_src_regs(5, F)
+};
+
+static const struct dce110_clk_src_shift cs_shift = {
+               CS_COMMON_MASK_SH_LIST_DCE_112(__SHIFT)
+};
+
+static const struct dce110_clk_src_mask cs_mask = {
+               CS_COMMON_MASK_SH_LIST_DCE_112(_MASK)
+};
+
+static const struct bios_registers bios_regs = {
+       .BIOS_SCRATCH_3 = mmBIOS_SCRATCH_3,
+       .BIOS_SCRATCH_6 = mmBIOS_SCRATCH_6
+};
+
+static const struct resource_caps polaris_10_resource_cap = {
+               .num_timing_generator = 6,
+               .num_audio = 6,
+               .num_stream_encoder = 6,
+               .num_pll = 8, /* why 8? 6 combo PHY PLL + 2 regular PLLs? */
+               .num_ddc = 6,
+};
+
+static const struct resource_caps polaris_11_resource_cap = {
+               .num_timing_generator = 5,
+               .num_audio = 5,
+               .num_stream_encoder = 5,
+               .num_pll = 8, /* why 8? 6 combo PHY PLL + 2 regular PLLs? */
+               .num_ddc = 5,
+};
+
+static const struct dc_plane_cap plane_cap = {
+       .type = DC_PLANE_TYPE_DCE_RGB,
+
+       .pixel_format_support = {
+                       .argb8888 = true,
+                       .nv12 = false,
+                       .fp16 = true
+       },
+
+       .max_upscale_factor = {
+                       .argb8888 = 16000,
+                       .nv12 = 1,
+                       .fp16 = 1
+       },
+
+       .max_downscale_factor = {
+                       .argb8888 = 250,
+                       .nv12 = 1,
+                       .fp16 = 1
+       },
+       64,
+       64
+};
+
+static const struct dc_debug_options debug_defaults = {
+               .enable_legacy_fast_update = true,
+};
+
+#define CTX  ctx
+#define REG(reg) mm ## reg
+
+#ifndef mmCC_DC_HDMI_STRAPS
+#define mmCC_DC_HDMI_STRAPS 0x4819
+#define CC_DC_HDMI_STRAPS__HDMI_DISABLE_MASK 0x40
+#define CC_DC_HDMI_STRAPS__HDMI_DISABLE__SHIFT 0x6
+#define CC_DC_HDMI_STRAPS__AUDIO_STREAM_NUMBER_MASK 0x700
+#define CC_DC_HDMI_STRAPS__AUDIO_STREAM_NUMBER__SHIFT 0x8
+#endif
+
+static int map_transmitter_id_to_phy_instance(
+       enum transmitter transmitter)
+{
+       switch (transmitter) {
+       case TRANSMITTER_UNIPHY_A:
+               return 0;
+       case TRANSMITTER_UNIPHY_B:
+               return 1;
+       case TRANSMITTER_UNIPHY_C:
+               return 2;
+       case TRANSMITTER_UNIPHY_D:
+               return 3;
+       case TRANSMITTER_UNIPHY_E:
+               return 4;
+       case TRANSMITTER_UNIPHY_F:
+               return 5;
+       case TRANSMITTER_UNIPHY_G:
+               return 6;
+       default:
+               ASSERT(0);
+               return 0;
+       }
+}
+
+static void read_dce_straps(
+       struct dc_context *ctx,
+       struct resource_straps *straps)
+{
+       REG_GET_2(CC_DC_HDMI_STRAPS,
+                       HDMI_DISABLE, &straps->hdmi_disable,
+                       AUDIO_STREAM_NUMBER, &straps->audio_stream_number);
+
+       REG_GET(DC_PINSTRAPS, DC_PINSTRAPS_AUDIO, &straps->dc_pinstraps_audio);
+}
+
+static struct audio *create_audio(
+               struct dc_context *ctx, unsigned int inst)
+{
+       return dce_audio_create(ctx, inst,
+                       &audio_regs[inst], &audio_shift, &audio_mask);
+}
+
+
+static struct timing_generator *dce112_timing_generator_create(
+               struct dc_context *ctx,
+               uint32_t instance,
+               const struct dce110_timing_generator_offsets *offsets)
+{
+       struct dce110_timing_generator *tg110 =
+               kzalloc(sizeof(struct dce110_timing_generator), GFP_KERNEL);
+
+       if (!tg110)
+               return NULL;
+
+       dce110_timing_generator_construct(tg110, ctx, instance, offsets);
+       return &tg110->base;
+}
+
+static struct stream_encoder *dce112_stream_encoder_create(
+       enum engine_id eng_id,
+       struct dc_context *ctx)
+{
+       struct dce110_stream_encoder *enc110 =
+               kzalloc(sizeof(struct dce110_stream_encoder), GFP_KERNEL);
+
+       if (!enc110)
+               return NULL;
+
+       dce110_stream_encoder_construct(enc110, ctx, ctx->dc_bios, eng_id,
+                                       &stream_enc_regs[eng_id],
+                                       &se_shift, &se_mask);
+       return &enc110->base;
+}
+
+#define SRII(reg_name, block, id)\
+       .reg_name[id] = mm ## block ## id ## _ ## reg_name
+
+static const struct dce_hwseq_registers hwseq_reg = {
+               HWSEQ_DCE112_REG_LIST()
+};
+
+static const struct dce_hwseq_shift hwseq_shift = {
+               HWSEQ_DCE112_MASK_SH_LIST(__SHIFT)
+};
+
+static const struct dce_hwseq_mask hwseq_mask = {
+               HWSEQ_DCE112_MASK_SH_LIST(_MASK)
+};
+
+static struct dce_hwseq *dce112_hwseq_create(
+       struct dc_context *ctx)
+{
+       struct dce_hwseq *hws = kzalloc(sizeof(struct dce_hwseq), GFP_KERNEL);
+
+       if (hws) {
+               hws->ctx = ctx;
+               hws->regs = &hwseq_reg;
+               hws->shifts = &hwseq_shift;
+               hws->masks = &hwseq_mask;
+       }
+       return hws;
+}
+
+static const struct resource_create_funcs res_create_funcs = {
+       .read_dce_straps = read_dce_straps,
+       .create_audio = create_audio,
+       .create_stream_encoder = dce112_stream_encoder_create,
+       .create_hwseq = dce112_hwseq_create,
+};
+
+#define mi_inst_regs(id) { MI_DCE11_2_REG_LIST(id) }
+static const struct dce_mem_input_registers mi_regs[] = {
+               mi_inst_regs(0),
+               mi_inst_regs(1),
+               mi_inst_regs(2),
+               mi_inst_regs(3),
+               mi_inst_regs(4),
+               mi_inst_regs(5),
+};
+
+static const struct dce_mem_input_shift mi_shifts = {
+               MI_DCE11_2_MASK_SH_LIST(__SHIFT)
+};
+
+static const struct dce_mem_input_mask mi_masks = {
+               MI_DCE11_2_MASK_SH_LIST(_MASK)
+};
+
+static struct mem_input *dce112_mem_input_create(
+       struct dc_context *ctx,
+       uint32_t inst)
+{
+       struct dce_mem_input *dce_mi = kzalloc(sizeof(struct dce_mem_input),
+                                              GFP_KERNEL);
+
+       if (!dce_mi) {
+               BREAK_TO_DEBUGGER();
+               return NULL;
+       }
+
+       dce112_mem_input_construct(dce_mi, ctx, inst, &mi_regs[inst], &mi_shifts, &mi_masks);
+       return &dce_mi->base;
+}
+
+static void dce112_transform_destroy(struct transform **xfm)
+{
+       kfree(TO_DCE_TRANSFORM(*xfm));
+       *xfm = NULL;
+}
+
+static struct transform *dce112_transform_create(
+       struct dc_context *ctx,
+       uint32_t inst)
+{
+       struct dce_transform *transform =
+               kzalloc(sizeof(struct dce_transform), GFP_KERNEL);
+
+       if (!transform)
+               return NULL;
+
+       dce_transform_construct(transform, ctx, inst,
+                               &xfm_regs[inst], &xfm_shift, &xfm_mask);
+       transform->lb_memory_size = 0x1404; /*5124*/
+       return &transform->base;
+}
+
+static const struct encoder_feature_support link_enc_feature = {
+               .max_hdmi_deep_color = COLOR_DEPTH_121212,
+               .max_hdmi_pixel_clock = 600000,
+               .hdmi_ycbcr420_supported = true,
+               .dp_ycbcr420_supported = false,
+               .flags.bits.IS_HBR2_CAPABLE = true,
+               .flags.bits.IS_HBR3_CAPABLE = true,
+               .flags.bits.IS_TPS3_CAPABLE = true,
+               .flags.bits.IS_TPS4_CAPABLE = true
+};
+
+static struct link_encoder *dce112_link_encoder_create(
+       struct dc_context *ctx,
+       const struct encoder_init_data *enc_init_data)
+{
+       struct dce110_link_encoder *enc110 =
+               kzalloc(sizeof(struct dce110_link_encoder), GFP_KERNEL);
+       int link_regs_id;
+
+       if (!enc110)
+               return NULL;
+
+       link_regs_id =
+               map_transmitter_id_to_phy_instance(enc_init_data->transmitter);
+
+       dce110_link_encoder_construct(enc110,
+                                     enc_init_data,
+                                     &link_enc_feature,
+                                     &link_enc_regs[link_regs_id],
+                                     &link_enc_aux_regs[enc_init_data->channel - 1],
+                                     &link_enc_hpd_regs[enc_init_data->hpd_source]);
+       return &enc110->base;
+}
+
+static struct panel_cntl *dce112_panel_cntl_create(const struct panel_cntl_init_data *init_data)
+{
+       struct dce_panel_cntl *panel_cntl =
+               kzalloc(sizeof(struct dce_panel_cntl), GFP_KERNEL);
+
+       if (!panel_cntl)
+               return NULL;
+
+       dce_panel_cntl_construct(panel_cntl,
+                       init_data,
+                       &panel_cntl_regs[init_data->inst],
+                       &panel_cntl_shift,
+                       &panel_cntl_mask);
+
+       return &panel_cntl->base;
+}
+
+static struct input_pixel_processor *dce112_ipp_create(
+       struct dc_context *ctx, uint32_t inst)
+{
+       struct dce_ipp *ipp = kzalloc(sizeof(struct dce_ipp), GFP_KERNEL);
+
+       if (!ipp) {
+               BREAK_TO_DEBUGGER();
+               return NULL;
+       }
+
+       dce_ipp_construct(ipp, ctx, inst,
+                       &ipp_regs[inst], &ipp_shift, &ipp_mask);
+       return &ipp->base;
+}
+
+static struct output_pixel_processor *dce112_opp_create(
+       struct dc_context *ctx,
+       uint32_t inst)
+{
+       struct dce110_opp *opp =
+               kzalloc(sizeof(struct dce110_opp), GFP_KERNEL);
+
+       if (!opp)
+               return NULL;
+
+       dce110_opp_construct(opp,
+                            ctx, inst, &opp_regs[inst], &opp_shift, &opp_mask);
+       return &opp->base;
+}
+
+static struct dce_aux *dce112_aux_engine_create(
+       struct dc_context *ctx,
+       uint32_t inst)
+{
+       struct aux_engine_dce110 *aux_engine =
+               kzalloc(sizeof(struct aux_engine_dce110), GFP_KERNEL);
+
+       if (!aux_engine)
+               return NULL;
+
+       dce110_aux_engine_construct(aux_engine, ctx, inst,
+                                   SW_AUX_TIMEOUT_PERIOD_MULTIPLIER * AUX_TIMEOUT_PERIOD,
+                                   &aux_engine_regs[inst],
+                                       &aux_mask,
+                                       &aux_shift,
+                                       ctx->dc->caps.extended_aux_timeout_support);
+
+       return &aux_engine->base;
+}
+#define i2c_inst_regs(id) { I2C_HW_ENGINE_COMMON_REG_LIST(id) }
+
+static const struct dce_i2c_registers i2c_hw_regs[] = {
+               i2c_inst_regs(1),
+               i2c_inst_regs(2),
+               i2c_inst_regs(3),
+               i2c_inst_regs(4),
+               i2c_inst_regs(5),
+               i2c_inst_regs(6),
+};
+
+static const struct dce_i2c_shift i2c_shifts = {
+               I2C_COMMON_MASK_SH_LIST_DCE110(__SHIFT)
+};
+
+static const struct dce_i2c_mask i2c_masks = {
+               I2C_COMMON_MASK_SH_LIST_DCE110(_MASK)
+};
+
+static struct dce_i2c_hw *dce112_i2c_hw_create(
+       struct dc_context *ctx,
+       uint32_t inst)
+{
+       struct dce_i2c_hw *dce_i2c_hw =
+               kzalloc(sizeof(struct dce_i2c_hw), GFP_KERNEL);
+
+       if (!dce_i2c_hw)
+               return NULL;
+
+       dce112_i2c_hw_construct(dce_i2c_hw, ctx, inst,
+                                   &i2c_hw_regs[inst], &i2c_shifts, &i2c_masks);
+
+       return dce_i2c_hw;
+}
+static struct clock_source *dce112_clock_source_create(
+       struct dc_context *ctx,
+       struct dc_bios *bios,
+       enum clock_source_id id,
+       const struct dce110_clk_src_regs *regs,
+       bool dp_clk_src)
+{
+       struct dce110_clk_src *clk_src =
+               kzalloc(sizeof(struct dce110_clk_src), GFP_KERNEL);
+
+       if (!clk_src)
+               return NULL;
+
+       if (dce112_clk_src_construct(clk_src, ctx, bios, id,
+                       regs, &cs_shift, &cs_mask)) {
+               clk_src->base.dp_clk_src = dp_clk_src;
+               return &clk_src->base;
+       }
+
+       kfree(clk_src);
+       BREAK_TO_DEBUGGER();
+       return NULL;
+}
+
+static void dce112_clock_source_destroy(struct clock_source **clk_src)
+{
+       kfree(TO_DCE110_CLK_SRC(*clk_src));
+       *clk_src = NULL;
+}
+
+static void dce112_resource_destruct(struct dce110_resource_pool *pool)
+{
+       unsigned int i;
+
+       for (i = 0; i < pool->base.pipe_count; i++) {
+               if (pool->base.opps[i] != NULL)
+                       dce110_opp_destroy(&pool->base.opps[i]);
+
+               if (pool->base.transforms[i] != NULL)
+                       dce112_transform_destroy(&pool->base.transforms[i]);
+
+               if (pool->base.ipps[i] != NULL)
+                       dce_ipp_destroy(&pool->base.ipps[i]);
+
+               if (pool->base.mis[i] != NULL) {
+                       kfree(TO_DCE_MEM_INPUT(pool->base.mis[i]));
+                       pool->base.mis[i] = NULL;
+               }
+
+               if (pool->base.timing_generators[i] != NULL) {
+                       kfree(DCE110TG_FROM_TG(pool->base.timing_generators[i]));
+                       pool->base.timing_generators[i] = NULL;
+               }
+       }
+
+       for (i = 0; i < pool->base.res_cap->num_ddc; i++) {
+               if (pool->base.engines[i] != NULL)
+                       dce110_engine_destroy(&pool->base.engines[i]);
+               if (pool->base.hw_i2cs[i] != NULL) {
+                       kfree(pool->base.hw_i2cs[i]);
+                       pool->base.hw_i2cs[i] = NULL;
+               }
+               if (pool->base.sw_i2cs[i] != NULL) {
+                       kfree(pool->base.sw_i2cs[i]);
+                       pool->base.sw_i2cs[i] = NULL;
+               }
+       }
+
+       for (i = 0; i < pool->base.stream_enc_count; i++) {
+               if (pool->base.stream_enc[i] != NULL)
+                       kfree(DCE110STRENC_FROM_STRENC(pool->base.stream_enc[i]));
+       }
+
+       for (i = 0; i < pool->base.clk_src_count; i++) {
+               if (pool->base.clock_sources[i] != NULL) {
+                       dce112_clock_source_destroy(&pool->base.clock_sources[i]);
+               }
+       }
+
+       if (pool->base.dp_clock_source != NULL)
+               dce112_clock_source_destroy(&pool->base.dp_clock_source);
+
+       for (i = 0; i < pool->base.audio_count; i++)    {
+               if (pool->base.audios[i] != NULL) {
+                       dce_aud_destroy(&pool->base.audios[i]);
+               }
+       }
+
+       if (pool->base.abm != NULL)
+               dce_abm_destroy(&pool->base.abm);
+
+       if (pool->base.dmcu != NULL)
+               dce_dmcu_destroy(&pool->base.dmcu);
+
+       if (pool->base.irqs != NULL) {
+               dal_irq_service_destroy(&pool->base.irqs);
+       }
+}
+
+static struct clock_source *find_matching_pll(
+               struct resource_context *res_ctx,
+               const struct resource_pool *pool,
+               const struct dc_stream_state *const stream)
+{
+       switch (stream->link->link_enc->transmitter) {
+       case TRANSMITTER_UNIPHY_A:
+               return pool->clock_sources[DCE112_CLK_SRC_PLL0];
+       case TRANSMITTER_UNIPHY_B:
+               return pool->clock_sources[DCE112_CLK_SRC_PLL1];
+       case TRANSMITTER_UNIPHY_C:
+               return pool->clock_sources[DCE112_CLK_SRC_PLL2];
+       case TRANSMITTER_UNIPHY_D:
+               return pool->clock_sources[DCE112_CLK_SRC_PLL3];
+       case TRANSMITTER_UNIPHY_E:
+               return pool->clock_sources[DCE112_CLK_SRC_PLL4];
+       case TRANSMITTER_UNIPHY_F:
+               return pool->clock_sources[DCE112_CLK_SRC_PLL5];
+       default:
+               return NULL;
+       }
+
+       return NULL;
+}
+
+static enum dc_status build_mapped_resource(
+               const struct dc *dc,
+               struct dc_state *context,
+               struct dc_stream_state *stream)
+{
+       struct pipe_ctx *pipe_ctx = resource_get_otg_master_for_stream(&context->res_ctx, stream);
+
+       if (!pipe_ctx)
+               return DC_ERROR_UNEXPECTED;
+
+       dce110_resource_build_pipe_hw_param(pipe_ctx);
+
+       resource_build_info_frame(pipe_ctx);
+
+       return DC_OK;
+}
+
+bool dce112_validate_bandwidth(
+       struct dc *dc,
+       struct dc_state *context,
+       bool fast_validate)
+{
+       bool result = false;
+
+       DC_LOG_BANDWIDTH_CALCS(
+               "%s: start",
+               __func__);
+
+       if (bw_calcs(
+                       dc->ctx,
+                       dc->bw_dceip,
+                       dc->bw_vbios,
+                       context->res_ctx.pipe_ctx,
+                       dc->res_pool->pipe_count,
+                       &context->bw_ctx.bw.dce))
+               result = true;
+
+       if (!result)
+               DC_LOG_BANDWIDTH_VALIDATION(
+                       "%s: Bandwidth validation failed!",
+                       __func__);
+
+       if (memcmp(&dc->current_state->bw_ctx.bw.dce,
+                       &context->bw_ctx.bw.dce, sizeof(context->bw_ctx.bw.dce))) {
+
+               DC_LOG_BANDWIDTH_CALCS(
+                       "%s: finish,\n"
+                       "nbpMark_b: %d nbpMark_a: %d urgentMark_b: %d urgentMark_a: %d\n"
+                       "stutMark_b: %d stutMark_a: %d\n"
+                       "nbpMark_b: %d nbpMark_a: %d urgentMark_b: %d urgentMark_a: %d\n"
+                       "stutMark_b: %d stutMark_a: %d\n"
+                       "nbpMark_b: %d nbpMark_a: %d urgentMark_b: %d urgentMark_a: %d\n"
+                       "stutMark_b: %d stutMark_a: %d stutter_mode_enable: %d\n"
+                       "cstate: %d pstate: %d nbpstate: %d sync: %d dispclk: %d\n"
+                       "sclk: %d sclk_sleep: %d yclk: %d blackout_recovery_time_us: %d\n"
+                       ,
+                       __func__,
+                       context->bw_ctx.bw.dce.nbp_state_change_wm_ns[0].b_mark,
+                       context->bw_ctx.bw.dce.nbp_state_change_wm_ns[0].a_mark,
+                       context->bw_ctx.bw.dce.urgent_wm_ns[0].b_mark,
+                       context->bw_ctx.bw.dce.urgent_wm_ns[0].a_mark,
+                       context->bw_ctx.bw.dce.stutter_exit_wm_ns[0].b_mark,
+                       context->bw_ctx.bw.dce.stutter_exit_wm_ns[0].a_mark,
+                       context->bw_ctx.bw.dce.nbp_state_change_wm_ns[1].b_mark,
+                       context->bw_ctx.bw.dce.nbp_state_change_wm_ns[1].a_mark,
+                       context->bw_ctx.bw.dce.urgent_wm_ns[1].b_mark,
+                       context->bw_ctx.bw.dce.urgent_wm_ns[1].a_mark,
+                       context->bw_ctx.bw.dce.stutter_exit_wm_ns[1].b_mark,
+                       context->bw_ctx.bw.dce.stutter_exit_wm_ns[1].a_mark,
+                       context->bw_ctx.bw.dce.nbp_state_change_wm_ns[2].b_mark,
+                       context->bw_ctx.bw.dce.nbp_state_change_wm_ns[2].a_mark,
+                       context->bw_ctx.bw.dce.urgent_wm_ns[2].b_mark,
+                       context->bw_ctx.bw.dce.urgent_wm_ns[2].a_mark,
+                       context->bw_ctx.bw.dce.stutter_exit_wm_ns[2].b_mark,
+                       context->bw_ctx.bw.dce.stutter_exit_wm_ns[2].a_mark,
+                       context->bw_ctx.bw.dce.stutter_mode_enable,
+                       context->bw_ctx.bw.dce.cpuc_state_change_enable,
+                       context->bw_ctx.bw.dce.cpup_state_change_enable,
+                       context->bw_ctx.bw.dce.nbp_state_change_enable,
+                       context->bw_ctx.bw.dce.all_displays_in_sync,
+                       context->bw_ctx.bw.dce.dispclk_khz,
+                       context->bw_ctx.bw.dce.sclk_khz,
+                       context->bw_ctx.bw.dce.sclk_deep_sleep_khz,
+                       context->bw_ctx.bw.dce.yclk_khz,
+                       context->bw_ctx.bw.dce.blackout_recovery_time_us);
+       }
+       return result;
+}
+
+enum dc_status resource_map_phy_clock_resources(
+               const struct dc *dc,
+               struct dc_state *context,
+               struct dc_stream_state *stream)
+{
+
+       /* acquire new resources */
+       struct pipe_ctx *pipe_ctx = resource_get_otg_master_for_stream(
+                       &context->res_ctx, stream);
+
+       if (!pipe_ctx)
+               return DC_ERROR_UNEXPECTED;
+
+       if (dc_is_dp_signal(pipe_ctx->stream->signal)
+               || dc_is_virtual_signal(pipe_ctx->stream->signal))
+               pipe_ctx->clock_source =
+                               dc->res_pool->dp_clock_source;
+       else {
+               if (stream && stream->link && stream->link->link_enc)
+                       pipe_ctx->clock_source = find_matching_pll(
+                               &context->res_ctx, dc->res_pool,
+                               stream);
+       }
+
+       if (pipe_ctx->clock_source == NULL)
+               return DC_NO_CLOCK_SOURCE_RESOURCE;
+
+       resource_reference_clock_source(
+               &context->res_ctx,
+               dc->res_pool,
+               pipe_ctx->clock_source);
+
+       return DC_OK;
+}
+
+static bool dce112_validate_surface_sets(
+               struct dc_state *context)
+{
+       int i;
+
+       for (i = 0; i < context->stream_count; i++) {
+               if (context->stream_status[i].plane_count == 0)
+                       continue;
+
+               if (context->stream_status[i].plane_count > 1)
+                       return false;
+
+               if (context->stream_status[i].plane_states[0]->format
+                               >= SURFACE_PIXEL_FORMAT_VIDEO_BEGIN)
+                       return false;
+       }
+
+       return true;
+}
+
+enum dc_status dce112_add_stream_to_ctx(
+               struct dc *dc,
+               struct dc_state *new_ctx,
+               struct dc_stream_state *dc_stream)
+{
+       enum dc_status result;
+
+       result = resource_map_pool_resources(dc, new_ctx, dc_stream);
+
+       if (result == DC_OK)
+               result = resource_map_phy_clock_resources(dc, new_ctx, dc_stream);
+
+
+       if (result == DC_OK)
+               result = build_mapped_resource(dc, new_ctx, dc_stream);
+
+       return result;
+}
+
+static enum dc_status dce112_validate_global(
+               struct dc *dc,
+               struct dc_state *context)
+{
+       if (!dce112_validate_surface_sets(context))
+               return DC_FAIL_SURFACE_VALIDATE;
+
+       return DC_OK;
+}
+
+static void dce112_destroy_resource_pool(struct resource_pool **pool)
+{
+       struct dce110_resource_pool *dce110_pool = TO_DCE110_RES_POOL(*pool);
+
+       dce112_resource_destruct(dce110_pool);
+       kfree(dce110_pool);
+       *pool = NULL;
+}
+
+static const struct resource_funcs dce112_res_pool_funcs = {
+       .destroy = dce112_destroy_resource_pool,
+       .link_enc_create = dce112_link_encoder_create,
+       .panel_cntl_create = dce112_panel_cntl_create,
+       .validate_bandwidth = dce112_validate_bandwidth,
+       .validate_plane = dce100_validate_plane,
+       .add_stream_to_ctx = dce112_add_stream_to_ctx,
+       .validate_global = dce112_validate_global,
+       .find_first_free_match_stream_enc_for_link = dce110_find_first_free_match_stream_enc_for_link
+};
+
+static void bw_calcs_data_update_from_pplib(struct dc *dc)
+{
+       struct dm_pp_clock_levels_with_latency eng_clks = {0};
+       struct dm_pp_clock_levels_with_latency mem_clks = {0};
+       struct dm_pp_wm_sets_with_clock_ranges clk_ranges = {0};
+       struct dm_pp_clock_levels clks = {0};
+       int memory_type_multiplier = MEMORY_TYPE_MULTIPLIER_CZ;
+
+       if (dc->bw_vbios && dc->bw_vbios->memory_type == bw_def_hbm)
+               memory_type_multiplier = MEMORY_TYPE_HBM;
+
+       /*do system clock  TODO PPLIB: after PPLIB implement,
+        * then remove old way
+        */
+       if (!dm_pp_get_clock_levels_by_type_with_latency(
+                       dc->ctx,
+                       DM_PP_CLOCK_TYPE_ENGINE_CLK,
+                       &eng_clks)) {
+
+               /* This is only for temporary */
+               dm_pp_get_clock_levels_by_type(
+                               dc->ctx,
+                               DM_PP_CLOCK_TYPE_ENGINE_CLK,
+                               &clks);
+               /* convert all the clock fro kHz to fix point mHz */
+               dc->bw_vbios->high_sclk = bw_frc_to_fixed(
+                               clks.clocks_in_khz[clks.num_levels-1], 1000);
+               dc->bw_vbios->mid1_sclk  = bw_frc_to_fixed(
+                               clks.clocks_in_khz[clks.num_levels/8], 1000);
+               dc->bw_vbios->mid2_sclk  = bw_frc_to_fixed(
+                               clks.clocks_in_khz[clks.num_levels*2/8], 1000);
+               dc->bw_vbios->mid3_sclk  = bw_frc_to_fixed(
+                               clks.clocks_in_khz[clks.num_levels*3/8], 1000);
+               dc->bw_vbios->mid4_sclk  = bw_frc_to_fixed(
+                               clks.clocks_in_khz[clks.num_levels*4/8], 1000);
+               dc->bw_vbios->mid5_sclk  = bw_frc_to_fixed(
+                               clks.clocks_in_khz[clks.num_levels*5/8], 1000);
+               dc->bw_vbios->mid6_sclk  = bw_frc_to_fixed(
+                               clks.clocks_in_khz[clks.num_levels*6/8], 1000);
+               dc->bw_vbios->low_sclk  = bw_frc_to_fixed(
+                               clks.clocks_in_khz[0], 1000);
+
+               /*do memory clock*/
+               dm_pp_get_clock_levels_by_type(
+                               dc->ctx,
+                               DM_PP_CLOCK_TYPE_MEMORY_CLK,
+                               &clks);
+
+               dc->bw_vbios->low_yclk = bw_frc_to_fixed(
+                       clks.clocks_in_khz[0] * memory_type_multiplier, 1000);
+               dc->bw_vbios->mid_yclk = bw_frc_to_fixed(
+                       clks.clocks_in_khz[clks.num_levels>>1] * memory_type_multiplier,
+                       1000);
+               dc->bw_vbios->high_yclk = bw_frc_to_fixed(
+                       clks.clocks_in_khz[clks.num_levels-1] * memory_type_multiplier,
+                       1000);
+
+               return;
+       }
+
+       /* convert all the clock fro kHz to fix point mHz  TODO: wloop data */
+       dc->bw_vbios->high_sclk = bw_frc_to_fixed(
+               eng_clks.data[eng_clks.num_levels-1].clocks_in_khz, 1000);
+       dc->bw_vbios->mid1_sclk  = bw_frc_to_fixed(
+               eng_clks.data[eng_clks.num_levels/8].clocks_in_khz, 1000);
+       dc->bw_vbios->mid2_sclk  = bw_frc_to_fixed(
+               eng_clks.data[eng_clks.num_levels*2/8].clocks_in_khz, 1000);
+       dc->bw_vbios->mid3_sclk  = bw_frc_to_fixed(
+               eng_clks.data[eng_clks.num_levels*3/8].clocks_in_khz, 1000);
+       dc->bw_vbios->mid4_sclk  = bw_frc_to_fixed(
+               eng_clks.data[eng_clks.num_levels*4/8].clocks_in_khz, 1000);
+       dc->bw_vbios->mid5_sclk  = bw_frc_to_fixed(
+               eng_clks.data[eng_clks.num_levels*5/8].clocks_in_khz, 1000);
+       dc->bw_vbios->mid6_sclk  = bw_frc_to_fixed(
+               eng_clks.data[eng_clks.num_levels*6/8].clocks_in_khz, 1000);
+       dc->bw_vbios->low_sclk  = bw_frc_to_fixed(
+                       eng_clks.data[0].clocks_in_khz, 1000);
+
+       /*do memory clock*/
+       dm_pp_get_clock_levels_by_type_with_latency(
+                       dc->ctx,
+                       DM_PP_CLOCK_TYPE_MEMORY_CLK,
+                       &mem_clks);
+
+       /* we don't need to call PPLIB for validation clock since they
+        * also give us the highest sclk and highest mclk (UMA clock).
+        * ALSO always convert UMA clock (from PPLIB)  to YCLK (HW formula):
+        * YCLK = UMACLK*m_memoryTypeMultiplier
+        */
+       dc->bw_vbios->low_yclk = bw_frc_to_fixed(
+               mem_clks.data[0].clocks_in_khz * memory_type_multiplier, 1000);
+       dc->bw_vbios->mid_yclk = bw_frc_to_fixed(
+               mem_clks.data[mem_clks.num_levels>>1].clocks_in_khz * memory_type_multiplier,
+               1000);
+       dc->bw_vbios->high_yclk = bw_frc_to_fixed(
+               mem_clks.data[mem_clks.num_levels-1].clocks_in_khz * memory_type_multiplier,
+               1000);
+
+       /* Now notify PPLib/SMU about which Watermarks sets they should select
+        * depending on DPM state they are in. And update BW MGR GFX Engine and
+        * Memory clock member variables for Watermarks calculations for each
+        * Watermark Set
+        */
+       clk_ranges.num_wm_sets = 4;
+       clk_ranges.wm_clk_ranges[0].wm_set_id = WM_SET_A;
+       clk_ranges.wm_clk_ranges[0].wm_min_eng_clk_in_khz =
+                       eng_clks.data[0].clocks_in_khz;
+       clk_ranges.wm_clk_ranges[0].wm_max_eng_clk_in_khz =
+                       eng_clks.data[eng_clks.num_levels*3/8].clocks_in_khz - 1;
+       clk_ranges.wm_clk_ranges[0].wm_min_mem_clk_in_khz =
+                       mem_clks.data[0].clocks_in_khz;
+       clk_ranges.wm_clk_ranges[0].wm_max_mem_clk_in_khz =
+                       mem_clks.data[mem_clks.num_levels>>1].clocks_in_khz - 1;
+
+       clk_ranges.wm_clk_ranges[1].wm_set_id = WM_SET_B;
+       clk_ranges.wm_clk_ranges[1].wm_min_eng_clk_in_khz =
+                       eng_clks.data[eng_clks.num_levels*3/8].clocks_in_khz;
+       /* 5 GHz instead of data[7].clockInKHz to cover Overdrive */
+       clk_ranges.wm_clk_ranges[1].wm_max_eng_clk_in_khz = 5000000;
+       clk_ranges.wm_clk_ranges[1].wm_min_mem_clk_in_khz =
+                       mem_clks.data[0].clocks_in_khz;
+       clk_ranges.wm_clk_ranges[1].wm_max_mem_clk_in_khz =
+                       mem_clks.data[mem_clks.num_levels>>1].clocks_in_khz - 1;
+
+       clk_ranges.wm_clk_ranges[2].wm_set_id = WM_SET_C;
+       clk_ranges.wm_clk_ranges[2].wm_min_eng_clk_in_khz =
+                       eng_clks.data[0].clocks_in_khz;
+       clk_ranges.wm_clk_ranges[2].wm_max_eng_clk_in_khz =
+                       eng_clks.data[eng_clks.num_levels*3/8].clocks_in_khz - 1;
+       clk_ranges.wm_clk_ranges[2].wm_min_mem_clk_in_khz =
+                       mem_clks.data[mem_clks.num_levels>>1].clocks_in_khz;
+       /* 5 GHz instead of data[2].clockInKHz to cover Overdrive */
+       clk_ranges.wm_clk_ranges[2].wm_max_mem_clk_in_khz = 5000000;
+
+       clk_ranges.wm_clk_ranges[3].wm_set_id = WM_SET_D;
+       clk_ranges.wm_clk_ranges[3].wm_min_eng_clk_in_khz =
+                       eng_clks.data[eng_clks.num_levels*3/8].clocks_in_khz;
+       /* 5 GHz instead of data[7].clockInKHz to cover Overdrive */
+       clk_ranges.wm_clk_ranges[3].wm_max_eng_clk_in_khz = 5000000;
+       clk_ranges.wm_clk_ranges[3].wm_min_mem_clk_in_khz =
+                       mem_clks.data[mem_clks.num_levels>>1].clocks_in_khz;
+       /* 5 GHz instead of data[2].clockInKHz to cover Overdrive */
+       clk_ranges.wm_clk_ranges[3].wm_max_mem_clk_in_khz = 5000000;
+
+       /* Notify PP Lib/SMU which Watermarks to use for which clock ranges */
+       dm_pp_notify_wm_clock_changes(dc->ctx, &clk_ranges);
+}
+
+static const struct resource_caps *dce112_resource_cap(
+       struct hw_asic_id *asic_id)
+{
+       if (ASIC_REV_IS_POLARIS11_M(asic_id->hw_internal_rev) ||
+           ASIC_REV_IS_POLARIS12_V(asic_id->hw_internal_rev))
+               return &polaris_11_resource_cap;
+       else
+               return &polaris_10_resource_cap;
+}
+
+static bool dce112_resource_construct(
+       uint8_t num_virtual_links,
+       struct dc *dc,
+       struct dce110_resource_pool *pool)
+{
+       unsigned int i;
+       struct dc_context *ctx = dc->ctx;
+
+       ctx->dc_bios->regs = &bios_regs;
+
+       pool->base.res_cap = dce112_resource_cap(&ctx->asic_id);
+       pool->base.funcs = &dce112_res_pool_funcs;
+
+       /*************************************************
+        *  Resource + asic cap harcoding                *
+        *************************************************/
+       pool->base.underlay_pipe_index = NO_UNDERLAY_PIPE;
+       pool->base.pipe_count = pool->base.res_cap->num_timing_generator;
+       pool->base.timing_generator_count = pool->base.res_cap->num_timing_generator;
+       dc->caps.max_downscale_ratio = 200;
+       dc->caps.i2c_speed_in_khz = 100;
+       dc->caps.i2c_speed_in_khz_hdcp = 100; /*1.4 w/a not applied by default*/
+       dc->caps.max_cursor_size = 128;
+       dc->caps.min_horizontal_blanking_period = 80;
+       dc->caps.dual_link_dvi = true;
+       dc->caps.extended_aux_timeout_support = false;
+       dc->debug = debug_defaults;
+
+       /*************************************************
+        *  Create resources                             *
+        *************************************************/
+
+       pool->base.clock_sources[DCE112_CLK_SRC_PLL0] =
+                       dce112_clock_source_create(
+                               ctx, ctx->dc_bios,
+                               CLOCK_SOURCE_COMBO_PHY_PLL0,
+                               &clk_src_regs[0], false);
+       pool->base.clock_sources[DCE112_CLK_SRC_PLL1] =
+                       dce112_clock_source_create(
+                               ctx, ctx->dc_bios,
+                               CLOCK_SOURCE_COMBO_PHY_PLL1,
+                               &clk_src_regs[1], false);
+       pool->base.clock_sources[DCE112_CLK_SRC_PLL2] =
+                       dce112_clock_source_create(
+                               ctx, ctx->dc_bios,
+                               CLOCK_SOURCE_COMBO_PHY_PLL2,
+                               &clk_src_regs[2], false);
+       pool->base.clock_sources[DCE112_CLK_SRC_PLL3] =
+                       dce112_clock_source_create(
+                               ctx, ctx->dc_bios,
+                               CLOCK_SOURCE_COMBO_PHY_PLL3,
+                               &clk_src_regs[3], false);
+       pool->base.clock_sources[DCE112_CLK_SRC_PLL4] =
+                       dce112_clock_source_create(
+                               ctx, ctx->dc_bios,
+                               CLOCK_SOURCE_COMBO_PHY_PLL4,
+                               &clk_src_regs[4], false);
+       pool->base.clock_sources[DCE112_CLK_SRC_PLL5] =
+                       dce112_clock_source_create(
+                               ctx, ctx->dc_bios,
+                               CLOCK_SOURCE_COMBO_PHY_PLL5,
+                               &clk_src_regs[5], false);
+       pool->base.clk_src_count = DCE112_CLK_SRC_TOTAL;
+
+       pool->base.dp_clock_source =  dce112_clock_source_create(
+               ctx, ctx->dc_bios,
+               CLOCK_SOURCE_ID_DP_DTO, &clk_src_regs[0], true);
+
+
+       for (i = 0; i < pool->base.clk_src_count; i++) {
+               if (pool->base.clock_sources[i] == NULL) {
+                       dm_error("DC: failed to create clock sources!\n");
+                       BREAK_TO_DEBUGGER();
+                       goto res_create_fail;
+               }
+       }
+
+       pool->base.dmcu = dce_dmcu_create(ctx,
+                       &dmcu_regs,
+                       &dmcu_shift,
+                       &dmcu_mask);
+       if (pool->base.dmcu == NULL) {
+               dm_error("DC: failed to create dmcu!\n");
+               BREAK_TO_DEBUGGER();
+               goto res_create_fail;
+       }
+
+       pool->base.abm = dce_abm_create(ctx,
+                       &abm_regs,
+                       &abm_shift,
+                       &abm_mask);
+       if (pool->base.abm == NULL) {
+               dm_error("DC: failed to create abm!\n");
+               BREAK_TO_DEBUGGER();
+               goto res_create_fail;
+       }
+
+       {
+               struct irq_service_init_data init_data;
+               init_data.ctx = dc->ctx;
+               pool->base.irqs = dal_irq_service_dce110_create(&init_data);
+               if (!pool->base.irqs)
+                       goto res_create_fail;
+       }
+
+       for (i = 0; i < pool->base.pipe_count; i++) {
+               pool->base.timing_generators[i] =
+                               dce112_timing_generator_create(
+                                       ctx,
+                                       i,
+                                       &dce112_tg_offsets[i]);
+               if (pool->base.timing_generators[i] == NULL) {
+                       BREAK_TO_DEBUGGER();
+                       dm_error("DC: failed to create tg!\n");
+                       goto res_create_fail;
+               }
+
+               pool->base.mis[i] = dce112_mem_input_create(ctx, i);
+               if (pool->base.mis[i] == NULL) {
+                       BREAK_TO_DEBUGGER();
+                       dm_error(
+                               "DC: failed to create memory input!\n");
+                       goto res_create_fail;
+               }
+
+               pool->base.ipps[i] = dce112_ipp_create(ctx, i);
+               if (pool->base.ipps[i] == NULL) {
+                       BREAK_TO_DEBUGGER();
+                       dm_error(
+                               "DC:failed to create input pixel processor!\n");
+                       goto res_create_fail;
+               }
+
+               pool->base.transforms[i] = dce112_transform_create(ctx, i);
+               if (pool->base.transforms[i] == NULL) {
+                       BREAK_TO_DEBUGGER();
+                       dm_error(
+                               "DC: failed to create transform!\n");
+                       goto res_create_fail;
+               }
+
+               pool->base.opps[i] = dce112_opp_create(
+                       ctx,
+                       i);
+               if (pool->base.opps[i] == NULL) {
+                       BREAK_TO_DEBUGGER();
+                       dm_error(
+                               "DC:failed to create output pixel processor!\n");
+                       goto res_create_fail;
+               }
+       }
+
+       for (i = 0; i < pool->base.res_cap->num_ddc; i++) {
+               pool->base.engines[i] = dce112_aux_engine_create(ctx, i);
+               if (pool->base.engines[i] == NULL) {
+                       BREAK_TO_DEBUGGER();
+                       dm_error(
+                               "DC:failed to create aux engine!!\n");
+                       goto res_create_fail;
+               }
+               pool->base.hw_i2cs[i] = dce112_i2c_hw_create(ctx, i);
+               if (pool->base.hw_i2cs[i] == NULL) {
+                       BREAK_TO_DEBUGGER();
+                       dm_error(
+                               "DC:failed to create i2c engine!!\n");
+                       goto res_create_fail;
+               }
+               pool->base.sw_i2cs[i] = NULL;
+       }
+
+       if (!resource_construct(num_virtual_links, dc, &pool->base,
+                         &res_create_funcs))
+               goto res_create_fail;
+
+       dc->caps.max_planes =  pool->base.pipe_count;
+
+       for (i = 0; i < dc->caps.max_planes; ++i)
+               dc->caps.planes[i] = plane_cap;
+
+       /* Create hardware sequencer */
+       dce112_hw_sequencer_construct(dc);
+
+       bw_calcs_init(dc->bw_dceip, dc->bw_vbios, dc->ctx->asic_id);
+
+       bw_calcs_data_update_from_pplib(dc);
+
+       return true;
+
+res_create_fail:
+       dce112_resource_destruct(pool);
+       return false;
+}
+
+struct resource_pool *dce112_create_resource_pool(
+       uint8_t num_virtual_links,
+       struct dc *dc)
+{
+       struct dce110_resource_pool *pool =
+               kzalloc(sizeof(struct dce110_resource_pool), GFP_KERNEL);
+
+       if (!pool)
+               return NULL;
+
+       if (dce112_resource_construct(num_virtual_links, dc, pool))
+               return &pool->base;
+
+       kfree(pool);
+       BREAK_TO_DEBUGGER();
+       return NULL;
+}
diff --git a/drivers/gpu/drm/amd/display/dc/resource/dce112/dce112_resource.h b/drivers/gpu/drm/amd/display/dc/resource/dce112/dce112_resource.h
new file mode 100644 (file)
index 0000000..1f57ebc
--- /dev/null
@@ -0,0 +1,57 @@
+/*
+* Copyright 2012-15 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_RESOURCE_DCE112_H__
+#define __DC_RESOURCE_DCE112_H__
+
+#include "core_types.h"
+
+struct dc;
+struct resource_pool;
+
+struct resource_pool *dce112_create_resource_pool(
+       uint8_t num_virtual_links,
+       struct dc *dc);
+
+enum dc_status dce112_validate_with_context(
+               struct dc *dc,
+               const struct dc_validation_set set[],
+               int set_count,
+               struct dc_state *context,
+               struct dc_state *old_context);
+
+bool dce112_validate_bandwidth(
+       struct dc *dc,
+       struct dc_state *context,
+       bool fast_validate);
+
+enum dc_status dce112_add_stream_to_ctx(
+               struct dc *dc,
+               struct dc_state *new_ctx,
+               struct dc_stream_state *dc_stream);
+
+
+#endif /* __DC_RESOURCE_DCE112_H__ */
+
diff --git a/drivers/gpu/drm/amd/display/dc/resource/dce120/dce120_resource.c b/drivers/gpu/drm/amd/display/dc/resource/dce120/dce120_resource.c
new file mode 100644 (file)
index 0000000..20662ed
--- /dev/null
@@ -0,0 +1,1288 @@
+/*
+* Copyright 2012-15 Advanced Micro Devices, Inc.cls
+*
+ *
+ * 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 "dm_services.h"
+
+
+#include "stream_encoder.h"
+#include "resource.h"
+#include "include/irq_service_interface.h"
+#include "dce120_resource.h"
+
+#include "dce112/dce112_resource.h"
+
+#include "dce110/dce110_resource.h"
+#include "virtual/virtual_stream_encoder.h"
+#include "dce120/dce120_timing_generator.h"
+#include "irq/dce120/irq_service_dce120.h"
+#include "dce/dce_opp.h"
+#include "dce/dce_clock_source.h"
+#include "dce/dce_ipp.h"
+#include "dce/dce_mem_input.h"
+#include "dce/dce_panel_cntl.h"
+
+#include "dce110/dce110_hwseq.h"
+#include "dce120/dce120_hwseq.h"
+#include "dce/dce_transform.h"
+#include "clk_mgr.h"
+#include "dce/dce_audio.h"
+#include "dce/dce_link_encoder.h"
+#include "dce/dce_stream_encoder.h"
+#include "dce/dce_hwseq.h"
+#include "dce/dce_abm.h"
+#include "dce/dce_dmcu.h"
+#include "dce/dce_aux.h"
+#include "dce/dce_i2c.h"
+
+#include "dce/dce_12_0_offset.h"
+#include "dce/dce_12_0_sh_mask.h"
+#include "soc15_hw_ip.h"
+#include "vega10_ip_offset.h"
+#include "nbio/nbio_6_1_offset.h"
+#include "mmhub/mmhub_1_0_offset.h"
+#include "mmhub/mmhub_1_0_sh_mask.h"
+#include "reg_helper.h"
+
+#include "dce100/dce100_resource.h"
+
+#ifndef mmDP0_DP_DPHY_INTERNAL_CTRL
+       #define mmDP0_DP_DPHY_INTERNAL_CTRL             0x210f
+       #define mmDP0_DP_DPHY_INTERNAL_CTRL_BASE_IDX    2
+       #define mmDP1_DP_DPHY_INTERNAL_CTRL             0x220f
+       #define mmDP1_DP_DPHY_INTERNAL_CTRL_BASE_IDX    2
+       #define mmDP2_DP_DPHY_INTERNAL_CTRL             0x230f
+       #define mmDP2_DP_DPHY_INTERNAL_CTRL_BASE_IDX    2
+       #define mmDP3_DP_DPHY_INTERNAL_CTRL             0x240f
+       #define mmDP3_DP_DPHY_INTERNAL_CTRL_BASE_IDX    2
+       #define mmDP4_DP_DPHY_INTERNAL_CTRL             0x250f
+       #define mmDP4_DP_DPHY_INTERNAL_CTRL_BASE_IDX    2
+       #define mmDP5_DP_DPHY_INTERNAL_CTRL             0x260f
+       #define mmDP5_DP_DPHY_INTERNAL_CTRL_BASE_IDX    2
+       #define mmDP6_DP_DPHY_INTERNAL_CTRL             0x270f
+       #define mmDP6_DP_DPHY_INTERNAL_CTRL_BASE_IDX    2
+#endif
+
+enum dce120_clk_src_array_id {
+       DCE120_CLK_SRC_PLL0,
+       DCE120_CLK_SRC_PLL1,
+       DCE120_CLK_SRC_PLL2,
+       DCE120_CLK_SRC_PLL3,
+       DCE120_CLK_SRC_PLL4,
+       DCE120_CLK_SRC_PLL5,
+
+       DCE120_CLK_SRC_TOTAL
+};
+
+static const struct dce110_timing_generator_offsets dce120_tg_offsets[] = {
+       {
+               .crtc = (mmCRTC0_CRTC_CONTROL - mmCRTC0_CRTC_CONTROL),
+       },
+       {
+               .crtc = (mmCRTC1_CRTC_CONTROL - mmCRTC0_CRTC_CONTROL),
+       },
+       {
+               .crtc = (mmCRTC2_CRTC_CONTROL - mmCRTC0_CRTC_CONTROL),
+       },
+       {
+               .crtc = (mmCRTC3_CRTC_CONTROL - mmCRTC0_CRTC_CONTROL),
+       },
+       {
+               .crtc = (mmCRTC4_CRTC_CONTROL - mmCRTC0_CRTC_CONTROL),
+       },
+       {
+               .crtc = (mmCRTC5_CRTC_CONTROL - mmCRTC0_CRTC_CONTROL),
+       }
+};
+
+/* begin *********************
+ * macros to expend register list macro defined in HW object header file */
+
+#define BASE_INNER(seg) \
+       DCE_BASE__INST0_SEG ## seg
+
+#define NBIO_BASE_INNER(seg) \
+       NBIF_BASE__INST0_SEG ## seg
+
+#define NBIO_BASE(seg) \
+       NBIO_BASE_INNER(seg)
+
+/* compile time expand base address. */
+#define BASE(seg) \
+       BASE_INNER(seg)
+
+#define SR(reg_name)\
+               .reg_name = BASE(mm ## reg_name ## _BASE_IDX) +  \
+                                       mm ## reg_name
+
+#define SRI(reg_name, block, id)\
+       .reg_name = BASE(mm ## block ## id ## _ ## reg_name ## _BASE_IDX) + \
+                                       mm ## block ## id ## _ ## reg_name
+
+/* MMHUB */
+#define MMHUB_BASE_INNER(seg) \
+       MMHUB_BASE__INST0_SEG ## seg
+
+#define MMHUB_BASE(seg) \
+       MMHUB_BASE_INNER(seg)
+
+#define MMHUB_SR(reg_name)\
+               .reg_name = MMHUB_BASE(mm ## reg_name ## _BASE_IDX) +  \
+                                       mm ## reg_name
+
+/* macros to expend register list macro defined in HW object header file
+ * end *********************/
+
+
+static const struct dce_dmcu_registers dmcu_regs = {
+               DMCU_DCE110_COMMON_REG_LIST()
+};
+
+static const struct dce_dmcu_shift dmcu_shift = {
+               DMCU_MASK_SH_LIST_DCE110(__SHIFT)
+};
+
+static const struct dce_dmcu_mask dmcu_mask = {
+               DMCU_MASK_SH_LIST_DCE110(_MASK)
+};
+
+static const struct dce_abm_registers abm_regs = {
+               ABM_DCE110_COMMON_REG_LIST()
+};
+
+static const struct dce_abm_shift abm_shift = {
+               ABM_MASK_SH_LIST_DCE110(__SHIFT)
+};
+
+static const struct dce_abm_mask abm_mask = {
+               ABM_MASK_SH_LIST_DCE110(_MASK)
+};
+
+#define ipp_regs(id)\
+[id] = {\
+               IPP_DCE110_REG_LIST_DCE_BASE(id)\
+}
+
+static const struct dce_ipp_registers ipp_regs[] = {
+               ipp_regs(0),
+               ipp_regs(1),
+               ipp_regs(2),
+               ipp_regs(3),
+               ipp_regs(4),
+               ipp_regs(5)
+};
+
+static const struct dce_ipp_shift ipp_shift = {
+               IPP_DCE120_MASK_SH_LIST_SOC_BASE(__SHIFT)
+};
+
+static const struct dce_ipp_mask ipp_mask = {
+               IPP_DCE120_MASK_SH_LIST_SOC_BASE(_MASK)
+};
+
+#define transform_regs(id)\
+[id] = {\
+               XFM_COMMON_REG_LIST_DCE110(id)\
+}
+
+static const struct dce_transform_registers xfm_regs[] = {
+               transform_regs(0),
+               transform_regs(1),
+               transform_regs(2),
+               transform_regs(3),
+               transform_regs(4),
+               transform_regs(5)
+};
+
+static const struct dce_transform_shift xfm_shift = {
+               XFM_COMMON_MASK_SH_LIST_SOC_BASE(__SHIFT)
+};
+
+static const struct dce_transform_mask xfm_mask = {
+               XFM_COMMON_MASK_SH_LIST_SOC_BASE(_MASK)
+};
+
+#define aux_regs(id)\
+[id] = {\
+       AUX_REG_LIST(id)\
+}
+
+static const struct dce110_link_enc_aux_registers link_enc_aux_regs[] = {
+               aux_regs(0),
+               aux_regs(1),
+               aux_regs(2),
+               aux_regs(3),
+               aux_regs(4),
+               aux_regs(5)
+};
+
+#define hpd_regs(id)\
+[id] = {\
+       HPD_REG_LIST(id)\
+}
+
+static const struct dce110_link_enc_hpd_registers link_enc_hpd_regs[] = {
+               hpd_regs(0),
+               hpd_regs(1),
+               hpd_regs(2),
+               hpd_regs(3),
+               hpd_regs(4),
+               hpd_regs(5)
+};
+
+#define link_regs(id)\
+[id] = {\
+       LE_DCE120_REG_LIST(id), \
+       SRI(DP_DPHY_INTERNAL_CTRL, DP, id) \
+}
+
+static const struct dce110_link_enc_registers link_enc_regs[] = {
+       link_regs(0),
+       link_regs(1),
+       link_regs(2),
+       link_regs(3),
+       link_regs(4),
+       link_regs(5),
+       link_regs(6),
+};
+
+
+#define stream_enc_regs(id)\
+[id] = {\
+       SE_COMMON_REG_LIST(id),\
+       .TMDS_CNTL = 0,\
+}
+
+static const struct dce110_stream_enc_registers stream_enc_regs[] = {
+       stream_enc_regs(0),
+       stream_enc_regs(1),
+       stream_enc_regs(2),
+       stream_enc_regs(3),
+       stream_enc_regs(4),
+       stream_enc_regs(5)
+};
+
+static const struct dce_stream_encoder_shift se_shift = {
+               SE_COMMON_MASK_SH_LIST_DCE120(__SHIFT)
+};
+
+static const struct dce_stream_encoder_mask se_mask = {
+               SE_COMMON_MASK_SH_LIST_DCE120(_MASK)
+};
+
+static const struct dce_panel_cntl_registers panel_cntl_regs[] = {
+       { DCE_PANEL_CNTL_REG_LIST() }
+};
+
+static const struct dce_panel_cntl_shift panel_cntl_shift = {
+       DCE_PANEL_CNTL_MASK_SH_LIST(__SHIFT)
+};
+
+static const struct dce_panel_cntl_mask panel_cntl_mask = {
+       DCE_PANEL_CNTL_MASK_SH_LIST(_MASK)
+};
+
+static const struct dce110_aux_registers_shift aux_shift = {
+       DCE12_AUX_MASK_SH_LIST(__SHIFT)
+};
+
+static const struct dce110_aux_registers_mask aux_mask = {
+       DCE12_AUX_MASK_SH_LIST(_MASK)
+};
+
+#define opp_regs(id)\
+[id] = {\
+       OPP_DCE_120_REG_LIST(id),\
+}
+
+static const struct dce_opp_registers opp_regs[] = {
+       opp_regs(0),
+       opp_regs(1),
+       opp_regs(2),
+       opp_regs(3),
+       opp_regs(4),
+       opp_regs(5)
+};
+
+static const struct dce_opp_shift opp_shift = {
+       OPP_COMMON_MASK_SH_LIST_DCE_120(__SHIFT)
+};
+
+static const struct dce_opp_mask opp_mask = {
+       OPP_COMMON_MASK_SH_LIST_DCE_120(_MASK)
+};
+ #define aux_engine_regs(id)\
+[id] = {\
+       AUX_COMMON_REG_LIST(id), \
+       .AUX_RESET_MASK = 0 \
+}
+
+static const struct dce110_aux_registers aux_engine_regs[] = {
+               aux_engine_regs(0),
+               aux_engine_regs(1),
+               aux_engine_regs(2),
+               aux_engine_regs(3),
+               aux_engine_regs(4),
+               aux_engine_regs(5)
+};
+
+#define audio_regs(id)\
+[id] = {\
+       AUD_COMMON_REG_LIST(id)\
+}
+
+static const struct dce_audio_registers audio_regs[] = {
+       audio_regs(0),
+       audio_regs(1),
+       audio_regs(2),
+       audio_regs(3),
+       audio_regs(4),
+       audio_regs(5),
+       audio_regs(6),
+};
+
+#define DCE120_AUD_COMMON_MASK_SH_LIST(mask_sh)\
+               SF(AZF0ENDPOINT0_AZALIA_F0_CODEC_ENDPOINT_INDEX, AZALIA_ENDPOINT_REG_INDEX, mask_sh),\
+               SF(AZF0ENDPOINT0_AZALIA_F0_CODEC_ENDPOINT_DATA, AZALIA_ENDPOINT_REG_DATA, mask_sh),\
+               AUD_COMMON_MASK_SH_LIST_BASE(mask_sh)
+
+static const struct dce_audio_shift audio_shift = {
+               DCE120_AUD_COMMON_MASK_SH_LIST(__SHIFT)
+};
+
+static const struct dce_audio_mask audio_mask = {
+               DCE120_AUD_COMMON_MASK_SH_LIST(_MASK)
+};
+
+static int map_transmitter_id_to_phy_instance(
+       enum transmitter transmitter)
+{
+       switch (transmitter) {
+       case TRANSMITTER_UNIPHY_A:
+               return 0;
+       case TRANSMITTER_UNIPHY_B:
+               return 1;
+       case TRANSMITTER_UNIPHY_C:
+               return 2;
+       case TRANSMITTER_UNIPHY_D:
+               return 3;
+       case TRANSMITTER_UNIPHY_E:
+               return 4;
+       case TRANSMITTER_UNIPHY_F:
+               return 5;
+       case TRANSMITTER_UNIPHY_G:
+               return 6;
+       default:
+               ASSERT(0);
+               return 0;
+       }
+}
+
+#define clk_src_regs(index, id)\
+[index] = {\
+       CS_COMMON_REG_LIST_DCE_112(id),\
+}
+
+static const struct dce110_clk_src_regs clk_src_regs[] = {
+       clk_src_regs(0, A),
+       clk_src_regs(1, B),
+       clk_src_regs(2, C),
+       clk_src_regs(3, D),
+       clk_src_regs(4, E),
+       clk_src_regs(5, F)
+};
+
+static const struct dce110_clk_src_shift cs_shift = {
+               CS_COMMON_MASK_SH_LIST_DCE_112(__SHIFT)
+};
+
+static const struct dce110_clk_src_mask cs_mask = {
+               CS_COMMON_MASK_SH_LIST_DCE_112(_MASK)
+};
+
+static struct output_pixel_processor *dce120_opp_create(
+       struct dc_context *ctx,
+       uint32_t inst)
+{
+       struct dce110_opp *opp =
+               kzalloc(sizeof(struct dce110_opp), GFP_KERNEL);
+
+       if (!opp)
+               return NULL;
+
+       dce110_opp_construct(opp,
+                            ctx, inst, &opp_regs[inst], &opp_shift, &opp_mask);
+       return &opp->base;
+}
+static struct dce_aux *dce120_aux_engine_create(
+       struct dc_context *ctx,
+       uint32_t inst)
+{
+       struct aux_engine_dce110 *aux_engine =
+               kzalloc(sizeof(struct aux_engine_dce110), GFP_KERNEL);
+
+       if (!aux_engine)
+               return NULL;
+
+       dce110_aux_engine_construct(aux_engine, ctx, inst,
+                                   SW_AUX_TIMEOUT_PERIOD_MULTIPLIER * AUX_TIMEOUT_PERIOD,
+                                   &aux_engine_regs[inst],
+                                       &aux_mask,
+                                       &aux_shift,
+                                       ctx->dc->caps.extended_aux_timeout_support);
+
+       return &aux_engine->base;
+}
+#define i2c_inst_regs(id) { I2C_HW_ENGINE_COMMON_REG_LIST(id) }
+
+static const struct dce_i2c_registers i2c_hw_regs[] = {
+               i2c_inst_regs(1),
+               i2c_inst_regs(2),
+               i2c_inst_regs(3),
+               i2c_inst_regs(4),
+               i2c_inst_regs(5),
+               i2c_inst_regs(6),
+};
+
+static const struct dce_i2c_shift i2c_shifts = {
+               I2C_COMMON_MASK_SH_LIST_DCE110(__SHIFT)
+};
+
+static const struct dce_i2c_mask i2c_masks = {
+               I2C_COMMON_MASK_SH_LIST_DCE110(_MASK)
+};
+
+static struct dce_i2c_hw *dce120_i2c_hw_create(
+       struct dc_context *ctx,
+       uint32_t inst)
+{
+       struct dce_i2c_hw *dce_i2c_hw =
+               kzalloc(sizeof(struct dce_i2c_hw), GFP_KERNEL);
+
+       if (!dce_i2c_hw)
+               return NULL;
+
+       dce112_i2c_hw_construct(dce_i2c_hw, ctx, inst,
+                                   &i2c_hw_regs[inst], &i2c_shifts, &i2c_masks);
+
+       return dce_i2c_hw;
+}
+static const struct bios_registers bios_regs = {
+       .BIOS_SCRATCH_3 = mmBIOS_SCRATCH_3 + NBIO_BASE(mmBIOS_SCRATCH_3_BASE_IDX),
+       .BIOS_SCRATCH_6 = mmBIOS_SCRATCH_6 + NBIO_BASE(mmBIOS_SCRATCH_6_BASE_IDX)
+};
+
+static const struct resource_caps res_cap = {
+               .num_timing_generator = 6,
+               .num_audio = 7,
+               .num_stream_encoder = 6,
+               .num_pll = 6,
+               .num_ddc = 6,
+};
+
+static const struct dc_plane_cap plane_cap = {
+       .type = DC_PLANE_TYPE_DCE_RGB,
+
+       .pixel_format_support = {
+                       .argb8888 = true,
+                       .nv12 = false,
+                       .fp16 = true
+       },
+
+       .max_upscale_factor = {
+                       .argb8888 = 16000,
+                       .nv12 = 1,
+                       .fp16 = 1
+       },
+
+       .max_downscale_factor = {
+                       .argb8888 = 250,
+                       .nv12 = 1,
+                       .fp16 = 1
+       }
+};
+
+static const struct dc_debug_options debug_defaults = {
+               .disable_clock_gate = true,
+               .enable_legacy_fast_update = true,
+};
+
+static struct clock_source *dce120_clock_source_create(
+       struct dc_context *ctx,
+       struct dc_bios *bios,
+       enum clock_source_id id,
+       const struct dce110_clk_src_regs *regs,
+       bool dp_clk_src)
+{
+       struct dce110_clk_src *clk_src =
+               kzalloc(sizeof(*clk_src), GFP_KERNEL);
+
+       if (!clk_src)
+               return NULL;
+
+       if (dce112_clk_src_construct(clk_src, ctx, bios, id,
+                                    regs, &cs_shift, &cs_mask)) {
+               clk_src->base.dp_clk_src = dp_clk_src;
+               return &clk_src->base;
+       }
+
+       kfree(clk_src);
+       BREAK_TO_DEBUGGER();
+       return NULL;
+}
+
+static void dce120_clock_source_destroy(struct clock_source **clk_src)
+{
+       kfree(TO_DCE110_CLK_SRC(*clk_src));
+       *clk_src = NULL;
+}
+
+
+static bool dce120_hw_sequencer_create(struct dc *dc)
+{
+       /* All registers used by dce11.2 match those in dce11 in offset and
+        * structure
+        */
+       dce120_hw_sequencer_construct(dc);
+
+       /*TODO  Move to separate file and Override what is needed */
+
+       return true;
+}
+
+static struct timing_generator *dce120_timing_generator_create(
+               struct dc_context *ctx,
+               uint32_t instance,
+               const struct dce110_timing_generator_offsets *offsets)
+{
+       struct dce110_timing_generator *tg110 =
+               kzalloc(sizeof(struct dce110_timing_generator), GFP_KERNEL);
+
+       if (!tg110)
+               return NULL;
+
+       dce120_timing_generator_construct(tg110, ctx, instance, offsets);
+       return &tg110->base;
+}
+
+static void dce120_transform_destroy(struct transform **xfm)
+{
+       kfree(TO_DCE_TRANSFORM(*xfm));
+       *xfm = NULL;
+}
+
+static void dce120_resource_destruct(struct dce110_resource_pool *pool)
+{
+       unsigned int i;
+
+       for (i = 0; i < pool->base.pipe_count; i++) {
+               if (pool->base.opps[i] != NULL)
+                       dce110_opp_destroy(&pool->base.opps[i]);
+
+               if (pool->base.transforms[i] != NULL)
+                       dce120_transform_destroy(&pool->base.transforms[i]);
+
+               if (pool->base.ipps[i] != NULL)
+                       dce_ipp_destroy(&pool->base.ipps[i]);
+
+               if (pool->base.mis[i] != NULL) {
+                       kfree(TO_DCE_MEM_INPUT(pool->base.mis[i]));
+                       pool->base.mis[i] = NULL;
+               }
+
+               if (pool->base.irqs != NULL) {
+                       dal_irq_service_destroy(&pool->base.irqs);
+               }
+
+               if (pool->base.timing_generators[i] != NULL) {
+                       kfree(DCE110TG_FROM_TG(pool->base.timing_generators[i]));
+                       pool->base.timing_generators[i] = NULL;
+               }
+       }
+
+       for (i = 0; i < pool->base.res_cap->num_ddc; i++) {
+               if (pool->base.engines[i] != NULL)
+                       dce110_engine_destroy(&pool->base.engines[i]);
+               if (pool->base.hw_i2cs[i] != NULL) {
+                       kfree(pool->base.hw_i2cs[i]);
+                       pool->base.hw_i2cs[i] = NULL;
+               }
+               if (pool->base.sw_i2cs[i] != NULL) {
+                       kfree(pool->base.sw_i2cs[i]);
+                       pool->base.sw_i2cs[i] = NULL;
+               }
+       }
+
+       for (i = 0; i < pool->base.audio_count; i++) {
+               if (pool->base.audios[i])
+                       dce_aud_destroy(&pool->base.audios[i]);
+       }
+
+       for (i = 0; i < pool->base.stream_enc_count; i++) {
+               if (pool->base.stream_enc[i] != NULL)
+                       kfree(DCE110STRENC_FROM_STRENC(pool->base.stream_enc[i]));
+       }
+
+       for (i = 0; i < pool->base.clk_src_count; i++) {
+               if (pool->base.clock_sources[i] != NULL)
+                       dce120_clock_source_destroy(
+                               &pool->base.clock_sources[i]);
+       }
+
+       if (pool->base.dp_clock_source != NULL)
+               dce120_clock_source_destroy(&pool->base.dp_clock_source);
+
+       if (pool->base.abm != NULL)
+               dce_abm_destroy(&pool->base.abm);
+
+       if (pool->base.dmcu != NULL)
+               dce_dmcu_destroy(&pool->base.dmcu);
+}
+
+static void read_dce_straps(
+       struct dc_context *ctx,
+       struct resource_straps *straps)
+{
+       uint32_t reg_val = dm_read_reg_soc15(ctx, mmCC_DC_MISC_STRAPS, 0);
+
+       straps->audio_stream_number = get_reg_field_value(reg_val,
+                                                         CC_DC_MISC_STRAPS,
+                                                         AUDIO_STREAM_NUMBER);
+       straps->hdmi_disable = get_reg_field_value(reg_val,
+                                                  CC_DC_MISC_STRAPS,
+                                                  HDMI_DISABLE);
+
+       reg_val = dm_read_reg_soc15(ctx, mmDC_PINSTRAPS, 0);
+       straps->dc_pinstraps_audio = get_reg_field_value(reg_val,
+                                                        DC_PINSTRAPS,
+                                                        DC_PINSTRAPS_AUDIO);
+}
+
+static struct audio *create_audio(
+               struct dc_context *ctx, unsigned int inst)
+{
+       return dce_audio_create(ctx, inst,
+                       &audio_regs[inst], &audio_shift, &audio_mask);
+}
+
+static const struct encoder_feature_support link_enc_feature = {
+               .max_hdmi_deep_color = COLOR_DEPTH_121212,
+               .max_hdmi_pixel_clock = 600000,
+               .hdmi_ycbcr420_supported = true,
+               .dp_ycbcr420_supported = false,
+               .flags.bits.IS_HBR2_CAPABLE = true,
+               .flags.bits.IS_HBR3_CAPABLE = true,
+               .flags.bits.IS_TPS3_CAPABLE = true,
+               .flags.bits.IS_TPS4_CAPABLE = true,
+};
+
+static struct link_encoder *dce120_link_encoder_create(
+       struct dc_context *ctx,
+       const struct encoder_init_data *enc_init_data)
+{
+       struct dce110_link_encoder *enc110 =
+               kzalloc(sizeof(struct dce110_link_encoder), GFP_KERNEL);
+       int link_regs_id;
+
+       if (!enc110)
+               return NULL;
+
+       link_regs_id =
+               map_transmitter_id_to_phy_instance(enc_init_data->transmitter);
+
+       dce110_link_encoder_construct(enc110,
+                                     enc_init_data,
+                                     &link_enc_feature,
+                                     &link_enc_regs[link_regs_id],
+                                     &link_enc_aux_regs[enc_init_data->channel - 1],
+                                     &link_enc_hpd_regs[enc_init_data->hpd_source]);
+
+       return &enc110->base;
+}
+
+static struct panel_cntl *dce120_panel_cntl_create(const struct panel_cntl_init_data *init_data)
+{
+       struct dce_panel_cntl *panel_cntl =
+               kzalloc(sizeof(struct dce_panel_cntl), GFP_KERNEL);
+
+       if (!panel_cntl)
+               return NULL;
+
+       dce_panel_cntl_construct(panel_cntl,
+                       init_data,
+                       &panel_cntl_regs[init_data->inst],
+                       &panel_cntl_shift,
+                       &panel_cntl_mask);
+
+       return &panel_cntl->base;
+}
+
+static struct input_pixel_processor *dce120_ipp_create(
+       struct dc_context *ctx, uint32_t inst)
+{
+       struct dce_ipp *ipp = kzalloc(sizeof(struct dce_ipp), GFP_KERNEL);
+
+       if (!ipp) {
+               BREAK_TO_DEBUGGER();
+               return NULL;
+       }
+
+       dce_ipp_construct(ipp, ctx, inst,
+                       &ipp_regs[inst], &ipp_shift, &ipp_mask);
+       return &ipp->base;
+}
+
+static struct stream_encoder *dce120_stream_encoder_create(
+       enum engine_id eng_id,
+       struct dc_context *ctx)
+{
+       struct dce110_stream_encoder *enc110 =
+               kzalloc(sizeof(struct dce110_stream_encoder), GFP_KERNEL);
+
+       if (!enc110)
+               return NULL;
+
+       dce110_stream_encoder_construct(enc110, ctx, ctx->dc_bios, eng_id,
+                                       &stream_enc_regs[eng_id],
+                                       &se_shift, &se_mask);
+       return &enc110->base;
+}
+
+#define SRII(reg_name, block, id)\
+       .reg_name[id] = BASE(mm ## block ## id ## _ ## reg_name ## _BASE_IDX) + \
+                                       mm ## block ## id ## _ ## reg_name
+
+static const struct dce_hwseq_registers hwseq_reg = {
+               HWSEQ_DCE120_REG_LIST()
+};
+
+static const struct dce_hwseq_shift hwseq_shift = {
+               HWSEQ_DCE12_MASK_SH_LIST(__SHIFT)
+};
+
+static const struct dce_hwseq_mask hwseq_mask = {
+               HWSEQ_DCE12_MASK_SH_LIST(_MASK)
+};
+
+/* HWSEQ regs for VG20 */
+static const struct dce_hwseq_registers dce121_hwseq_reg = {
+               HWSEQ_VG20_REG_LIST()
+};
+
+static const struct dce_hwseq_shift dce121_hwseq_shift = {
+               HWSEQ_VG20_MASK_SH_LIST(__SHIFT)
+};
+
+static const struct dce_hwseq_mask dce121_hwseq_mask = {
+               HWSEQ_VG20_MASK_SH_LIST(_MASK)
+};
+
+static struct dce_hwseq *dce120_hwseq_create(
+       struct dc_context *ctx)
+{
+       struct dce_hwseq *hws = kzalloc(sizeof(struct dce_hwseq), GFP_KERNEL);
+
+       if (hws) {
+               hws->ctx = ctx;
+               hws->regs = &hwseq_reg;
+               hws->shifts = &hwseq_shift;
+               hws->masks = &hwseq_mask;
+       }
+       return hws;
+}
+
+static struct dce_hwseq *dce121_hwseq_create(
+       struct dc_context *ctx)
+{
+       struct dce_hwseq *hws = kzalloc(sizeof(struct dce_hwseq), GFP_KERNEL);
+
+       if (hws) {
+               hws->ctx = ctx;
+               hws->regs = &dce121_hwseq_reg;
+               hws->shifts = &dce121_hwseq_shift;
+               hws->masks = &dce121_hwseq_mask;
+       }
+       return hws;
+}
+
+static const struct resource_create_funcs res_create_funcs = {
+       .read_dce_straps = read_dce_straps,
+       .create_audio = create_audio,
+       .create_stream_encoder = dce120_stream_encoder_create,
+       .create_hwseq = dce120_hwseq_create,
+};
+
+static const struct resource_create_funcs dce121_res_create_funcs = {
+       .read_dce_straps = read_dce_straps,
+       .create_audio = create_audio,
+       .create_stream_encoder = dce120_stream_encoder_create,
+       .create_hwseq = dce121_hwseq_create,
+};
+
+
+#define mi_inst_regs(id) { MI_DCE12_REG_LIST(id) }
+static const struct dce_mem_input_registers mi_regs[] = {
+               mi_inst_regs(0),
+               mi_inst_regs(1),
+               mi_inst_regs(2),
+               mi_inst_regs(3),
+               mi_inst_regs(4),
+               mi_inst_regs(5),
+};
+
+static const struct dce_mem_input_shift mi_shifts = {
+               MI_DCE12_MASK_SH_LIST(__SHIFT)
+};
+
+static const struct dce_mem_input_mask mi_masks = {
+               MI_DCE12_MASK_SH_LIST(_MASK)
+};
+
+static struct mem_input *dce120_mem_input_create(
+       struct dc_context *ctx,
+       uint32_t inst)
+{
+       struct dce_mem_input *dce_mi = kzalloc(sizeof(struct dce_mem_input),
+                                              GFP_KERNEL);
+
+       if (!dce_mi) {
+               BREAK_TO_DEBUGGER();
+               return NULL;
+       }
+
+       dce120_mem_input_construct(dce_mi, ctx, inst, &mi_regs[inst], &mi_shifts, &mi_masks);
+       return &dce_mi->base;
+}
+
+static struct transform *dce120_transform_create(
+       struct dc_context *ctx,
+       uint32_t inst)
+{
+       struct dce_transform *transform =
+               kzalloc(sizeof(struct dce_transform), GFP_KERNEL);
+
+       if (!transform)
+               return NULL;
+
+       dce_transform_construct(transform, ctx, inst,
+                               &xfm_regs[inst], &xfm_shift, &xfm_mask);
+       transform->lb_memory_size = 0x1404; /*5124*/
+       return &transform->base;
+}
+
+static void dce120_destroy_resource_pool(struct resource_pool **pool)
+{
+       struct dce110_resource_pool *dce110_pool = TO_DCE110_RES_POOL(*pool);
+
+       dce120_resource_destruct(dce110_pool);
+       kfree(dce110_pool);
+       *pool = NULL;
+}
+
+static const struct resource_funcs dce120_res_pool_funcs = {
+       .destroy = dce120_destroy_resource_pool,
+       .link_enc_create = dce120_link_encoder_create,
+       .panel_cntl_create = dce120_panel_cntl_create,
+       .validate_bandwidth = dce112_validate_bandwidth,
+       .validate_plane = dce100_validate_plane,
+       .add_stream_to_ctx = dce112_add_stream_to_ctx,
+       .find_first_free_match_stream_enc_for_link = dce110_find_first_free_match_stream_enc_for_link
+};
+
+static void bw_calcs_data_update_from_pplib(struct dc *dc)
+{
+       struct dm_pp_clock_levels_with_latency eng_clks = {0};
+       struct dm_pp_clock_levels_with_latency mem_clks = {0};
+       struct dm_pp_wm_sets_with_clock_ranges clk_ranges = {0};
+       int i;
+       unsigned int clk;
+       unsigned int latency;
+       /*original logic in dal3*/
+       int memory_type_multiplier = MEMORY_TYPE_MULTIPLIER_CZ;
+
+       /*do system clock*/
+       if (!dm_pp_get_clock_levels_by_type_with_latency(
+                               dc->ctx,
+                               DM_PP_CLOCK_TYPE_ENGINE_CLK,
+                               &eng_clks) || eng_clks.num_levels == 0) {
+
+               eng_clks.num_levels = 8;
+               clk = 300000;
+
+               for (i = 0; i < eng_clks.num_levels; i++) {
+                       eng_clks.data[i].clocks_in_khz = clk;
+                       clk += 100000;
+               }
+       }
+
+       /* convert all the clock fro kHz to fix point mHz  TODO: wloop data */
+       dc->bw_vbios->high_sclk = bw_frc_to_fixed(
+               eng_clks.data[eng_clks.num_levels-1].clocks_in_khz, 1000);
+       dc->bw_vbios->mid1_sclk  = bw_frc_to_fixed(
+               eng_clks.data[eng_clks.num_levels/8].clocks_in_khz, 1000);
+       dc->bw_vbios->mid2_sclk  = bw_frc_to_fixed(
+               eng_clks.data[eng_clks.num_levels*2/8].clocks_in_khz, 1000);
+       dc->bw_vbios->mid3_sclk  = bw_frc_to_fixed(
+               eng_clks.data[eng_clks.num_levels*3/8].clocks_in_khz, 1000);
+       dc->bw_vbios->mid4_sclk  = bw_frc_to_fixed(
+               eng_clks.data[eng_clks.num_levels*4/8].clocks_in_khz, 1000);
+       dc->bw_vbios->mid5_sclk  = bw_frc_to_fixed(
+               eng_clks.data[eng_clks.num_levels*5/8].clocks_in_khz, 1000);
+       dc->bw_vbios->mid6_sclk  = bw_frc_to_fixed(
+               eng_clks.data[eng_clks.num_levels*6/8].clocks_in_khz, 1000);
+       dc->bw_vbios->low_sclk  = bw_frc_to_fixed(
+                       eng_clks.data[0].clocks_in_khz, 1000);
+
+       /*do memory clock*/
+       if (!dm_pp_get_clock_levels_by_type_with_latency(
+                       dc->ctx,
+                       DM_PP_CLOCK_TYPE_MEMORY_CLK,
+                       &mem_clks) || mem_clks.num_levels == 0) {
+
+               mem_clks.num_levels = 3;
+               clk = 250000;
+               latency = 45;
+
+               for (i = 0; i < eng_clks.num_levels; i++) {
+                       mem_clks.data[i].clocks_in_khz = clk;
+                       mem_clks.data[i].latency_in_us = latency;
+                       clk += 500000;
+                       latency -= 5;
+               }
+
+       }
+
+       /* we don't need to call PPLIB for validation clock since they
+        * also give us the highest sclk and highest mclk (UMA clock).
+        * ALSO always convert UMA clock (from PPLIB)  to YCLK (HW formula):
+        * YCLK = UMACLK*m_memoryTypeMultiplier
+        */
+       if (dc->bw_vbios->memory_type == bw_def_hbm)
+               memory_type_multiplier = MEMORY_TYPE_HBM;
+
+       dc->bw_vbios->low_yclk = bw_frc_to_fixed(
+               mem_clks.data[0].clocks_in_khz * memory_type_multiplier, 1000);
+       dc->bw_vbios->mid_yclk = bw_frc_to_fixed(
+               mem_clks.data[mem_clks.num_levels>>1].clocks_in_khz * memory_type_multiplier,
+               1000);
+       dc->bw_vbios->high_yclk = bw_frc_to_fixed(
+               mem_clks.data[mem_clks.num_levels-1].clocks_in_khz * memory_type_multiplier,
+               1000);
+
+       /* Now notify PPLib/SMU about which Watermarks sets they should select
+        * depending on DPM state they are in. And update BW MGR GFX Engine and
+        * Memory clock member variables for Watermarks calculations for each
+        * Watermark Set
+        */
+       clk_ranges.num_wm_sets = 4;
+       clk_ranges.wm_clk_ranges[0].wm_set_id = WM_SET_A;
+       clk_ranges.wm_clk_ranges[0].wm_min_eng_clk_in_khz =
+                       eng_clks.data[0].clocks_in_khz;
+       clk_ranges.wm_clk_ranges[0].wm_max_eng_clk_in_khz =
+                       eng_clks.data[eng_clks.num_levels*3/8].clocks_in_khz - 1;
+       clk_ranges.wm_clk_ranges[0].wm_min_mem_clk_in_khz =
+                       mem_clks.data[0].clocks_in_khz;
+       clk_ranges.wm_clk_ranges[0].wm_max_mem_clk_in_khz =
+                       mem_clks.data[mem_clks.num_levels>>1].clocks_in_khz - 1;
+
+       clk_ranges.wm_clk_ranges[1].wm_set_id = WM_SET_B;
+       clk_ranges.wm_clk_ranges[1].wm_min_eng_clk_in_khz =
+                       eng_clks.data[eng_clks.num_levels*3/8].clocks_in_khz;
+       /* 5 GHz instead of data[7].clockInKHz to cover Overdrive */
+       clk_ranges.wm_clk_ranges[1].wm_max_eng_clk_in_khz = 5000000;
+       clk_ranges.wm_clk_ranges[1].wm_min_mem_clk_in_khz =
+                       mem_clks.data[0].clocks_in_khz;
+       clk_ranges.wm_clk_ranges[1].wm_max_mem_clk_in_khz =
+                       mem_clks.data[mem_clks.num_levels>>1].clocks_in_khz - 1;
+
+       clk_ranges.wm_clk_ranges[2].wm_set_id = WM_SET_C;
+       clk_ranges.wm_clk_ranges[2].wm_min_eng_clk_in_khz =
+                       eng_clks.data[0].clocks_in_khz;
+       clk_ranges.wm_clk_ranges[2].wm_max_eng_clk_in_khz =
+                       eng_clks.data[eng_clks.num_levels*3/8].clocks_in_khz - 1;
+       clk_ranges.wm_clk_ranges[2].wm_min_mem_clk_in_khz =
+                       mem_clks.data[mem_clks.num_levels>>1].clocks_in_khz;
+       /* 5 GHz instead of data[2].clockInKHz to cover Overdrive */
+       clk_ranges.wm_clk_ranges[2].wm_max_mem_clk_in_khz = 5000000;
+
+       clk_ranges.wm_clk_ranges[3].wm_set_id = WM_SET_D;
+       clk_ranges.wm_clk_ranges[3].wm_min_eng_clk_in_khz =
+                       eng_clks.data[eng_clks.num_levels*3/8].clocks_in_khz;
+       /* 5 GHz instead of data[7].clockInKHz to cover Overdrive */
+       clk_ranges.wm_clk_ranges[3].wm_max_eng_clk_in_khz = 5000000;
+       clk_ranges.wm_clk_ranges[3].wm_min_mem_clk_in_khz =
+                       mem_clks.data[mem_clks.num_levels>>1].clocks_in_khz;
+       /* 5 GHz instead of data[2].clockInKHz to cover Overdrive */
+       clk_ranges.wm_clk_ranges[3].wm_max_mem_clk_in_khz = 5000000;
+
+       /* Notify PP Lib/SMU which Watermarks to use for which clock ranges */
+       dm_pp_notify_wm_clock_changes(dc->ctx, &clk_ranges);
+}
+
+static uint32_t read_pipe_fuses(struct dc_context *ctx)
+{
+       uint32_t value = dm_read_reg_soc15(ctx, mmCC_DC_PIPE_DIS, 0);
+       /* VG20 support max 6 pipes */
+       value = value & 0x3f;
+       return value;
+}
+
+static bool dce120_resource_construct(
+       uint8_t num_virtual_links,
+       struct dc *dc,
+       struct dce110_resource_pool *pool)
+{
+       unsigned int i;
+       int j;
+       struct dc_context *ctx = dc->ctx;
+       struct irq_service_init_data irq_init_data;
+       static const struct resource_create_funcs *res_funcs;
+       bool is_vg20 = ASICREV_IS_VEGA20_P(ctx->asic_id.hw_internal_rev);
+       uint32_t pipe_fuses;
+
+       ctx->dc_bios->regs = &bios_regs;
+
+       pool->base.res_cap = &res_cap;
+       pool->base.funcs = &dce120_res_pool_funcs;
+
+       /* TODO: Fill more data from GreenlandAsicCapability.cpp */
+       pool->base.pipe_count = res_cap.num_timing_generator;
+       pool->base.timing_generator_count = pool->base.res_cap->num_timing_generator;
+       pool->base.underlay_pipe_index = NO_UNDERLAY_PIPE;
+
+       dc->caps.max_downscale_ratio = 200;
+       dc->caps.i2c_speed_in_khz = 100;
+       dc->caps.i2c_speed_in_khz_hdcp = 100; /*1.4 w/a not applied by default*/
+       dc->caps.max_cursor_size = 128;
+       dc->caps.min_horizontal_blanking_period = 80;
+       dc->caps.dual_link_dvi = true;
+       dc->caps.psp_setup_panel_mode = true;
+       dc->caps.extended_aux_timeout_support = false;
+       dc->debug = debug_defaults;
+
+       /*************************************************
+        *  Create resources                             *
+        *************************************************/
+
+       pool->base.clock_sources[DCE120_CLK_SRC_PLL0] =
+                       dce120_clock_source_create(ctx, ctx->dc_bios,
+                               CLOCK_SOURCE_COMBO_PHY_PLL0,
+                               &clk_src_regs[0], false);
+       pool->base.clock_sources[DCE120_CLK_SRC_PLL1] =
+                       dce120_clock_source_create(ctx, ctx->dc_bios,
+                               CLOCK_SOURCE_COMBO_PHY_PLL1,
+                               &clk_src_regs[1], false);
+       pool->base.clock_sources[DCE120_CLK_SRC_PLL2] =
+                       dce120_clock_source_create(ctx, ctx->dc_bios,
+                               CLOCK_SOURCE_COMBO_PHY_PLL2,
+                               &clk_src_regs[2], false);
+       pool->base.clock_sources[DCE120_CLK_SRC_PLL3] =
+                       dce120_clock_source_create(ctx, ctx->dc_bios,
+                               CLOCK_SOURCE_COMBO_PHY_PLL3,
+                               &clk_src_regs[3], false);
+       pool->base.clock_sources[DCE120_CLK_SRC_PLL4] =
+                       dce120_clock_source_create(ctx, ctx->dc_bios,
+                               CLOCK_SOURCE_COMBO_PHY_PLL4,
+                               &clk_src_regs[4], false);
+       pool->base.clock_sources[DCE120_CLK_SRC_PLL5] =
+                       dce120_clock_source_create(ctx, ctx->dc_bios,
+                               CLOCK_SOURCE_COMBO_PHY_PLL5,
+                               &clk_src_regs[5], false);
+       pool->base.clk_src_count = DCE120_CLK_SRC_TOTAL;
+
+       pool->base.dp_clock_source =
+                       dce120_clock_source_create(ctx, ctx->dc_bios,
+                               CLOCK_SOURCE_ID_DP_DTO,
+                               &clk_src_regs[0], true);
+
+       for (i = 0; i < pool->base.clk_src_count; i++) {
+               if (pool->base.clock_sources[i] == NULL) {
+                       dm_error("DC: failed to create clock sources!\n");
+                       BREAK_TO_DEBUGGER();
+                       goto clk_src_create_fail;
+               }
+       }
+
+       pool->base.dmcu = dce_dmcu_create(ctx,
+                       &dmcu_regs,
+                       &dmcu_shift,
+                       &dmcu_mask);
+       if (pool->base.dmcu == NULL) {
+               dm_error("DC: failed to create dmcu!\n");
+               BREAK_TO_DEBUGGER();
+               goto res_create_fail;
+       }
+
+       pool->base.abm = dce_abm_create(ctx,
+                       &abm_regs,
+                       &abm_shift,
+                       &abm_mask);
+       if (pool->base.abm == NULL) {
+               dm_error("DC: failed to create abm!\n");
+               BREAK_TO_DEBUGGER();
+               goto res_create_fail;
+       }
+
+
+       irq_init_data.ctx = dc->ctx;
+       pool->base.irqs = dal_irq_service_dce120_create(&irq_init_data);
+       if (!pool->base.irqs)
+               goto irqs_create_fail;
+
+       /* VG20: Pipe harvesting enabled, retrieve valid pipe fuses */
+       if (is_vg20)
+               pipe_fuses = read_pipe_fuses(ctx);
+
+       /* index to valid pipe resource */
+       j = 0;
+       for (i = 0; i < pool->base.pipe_count; i++) {
+               if (is_vg20) {
+                       if ((pipe_fuses & (1 << i)) != 0) {
+                               dm_error("DC: skip invalid pipe %d!\n", i);
+                               continue;
+                       }
+               }
+
+               pool->base.timing_generators[j] =
+                               dce120_timing_generator_create(
+                                       ctx,
+                                       i,
+                                       &dce120_tg_offsets[i]);
+               if (pool->base.timing_generators[j] == NULL) {
+                       BREAK_TO_DEBUGGER();
+                       dm_error("DC: failed to create tg!\n");
+                       goto controller_create_fail;
+               }
+
+               pool->base.mis[j] = dce120_mem_input_create(ctx, i);
+
+               if (pool->base.mis[j] == NULL) {
+                       BREAK_TO_DEBUGGER();
+                       dm_error(
+                               "DC: failed to create memory input!\n");
+                       goto controller_create_fail;
+               }
+
+               pool->base.ipps[j] = dce120_ipp_create(ctx, i);
+               if (pool->base.ipps[i] == NULL) {
+                       BREAK_TO_DEBUGGER();
+                       dm_error(
+                               "DC: failed to create input pixel processor!\n");
+                       goto controller_create_fail;
+               }
+
+               pool->base.transforms[j] = dce120_transform_create(ctx, i);
+               if (pool->base.transforms[i] == NULL) {
+                       BREAK_TO_DEBUGGER();
+                       dm_error(
+                               "DC: failed to create transform!\n");
+                       goto res_create_fail;
+               }
+
+               pool->base.opps[j] = dce120_opp_create(
+                       ctx,
+                       i);
+               if (pool->base.opps[j] == NULL) {
+                       BREAK_TO_DEBUGGER();
+                       dm_error(
+                               "DC: failed to create output pixel processor!\n");
+               }
+
+               /* check next valid pipe */
+               j++;
+       }
+
+       for (i = 0; i < pool->base.res_cap->num_ddc; i++) {
+               pool->base.engines[i] = dce120_aux_engine_create(ctx, i);
+               if (pool->base.engines[i] == NULL) {
+                       BREAK_TO_DEBUGGER();
+                       dm_error(
+                               "DC:failed to create aux engine!!\n");
+                       goto res_create_fail;
+               }
+               pool->base.hw_i2cs[i] = dce120_i2c_hw_create(ctx, i);
+               if (pool->base.hw_i2cs[i] == NULL) {
+                       BREAK_TO_DEBUGGER();
+                       dm_error(
+                               "DC:failed to create i2c engine!!\n");
+                       goto res_create_fail;
+               }
+               pool->base.sw_i2cs[i] = NULL;
+       }
+
+       /* valid pipe num */
+       pool->base.pipe_count = j;
+       pool->base.timing_generator_count = j;
+
+       if (is_vg20)
+               res_funcs = &dce121_res_create_funcs;
+       else
+               res_funcs = &res_create_funcs;
+
+       if (!resource_construct(num_virtual_links, dc, &pool->base, res_funcs))
+               goto res_create_fail;
+
+       /* Create hardware sequencer */
+       if (!dce120_hw_sequencer_create(dc))
+               goto controller_create_fail;
+
+       dc->caps.max_planes =  pool->base.pipe_count;
+
+       for (i = 0; i < dc->caps.max_planes; ++i)
+               dc->caps.planes[i] = plane_cap;
+
+       bw_calcs_init(dc->bw_dceip, dc->bw_vbios, dc->ctx->asic_id);
+
+       bw_calcs_data_update_from_pplib(dc);
+
+       return true;
+
+irqs_create_fail:
+controller_create_fail:
+clk_src_create_fail:
+res_create_fail:
+
+       dce120_resource_destruct(pool);
+
+       return false;
+}
+
+struct resource_pool *dce120_create_resource_pool(
+       uint8_t num_virtual_links,
+       struct dc *dc)
+{
+       struct dce110_resource_pool *pool =
+               kzalloc(sizeof(struct dce110_resource_pool), GFP_KERNEL);
+
+       if (!pool)
+               return NULL;
+
+       if (dce120_resource_construct(num_virtual_links, dc, pool))
+               return &pool->base;
+
+       kfree(pool);
+       BREAK_TO_DEBUGGER();
+       return NULL;
+}
diff --git a/drivers/gpu/drm/amd/display/dc/resource/dce120/dce120_resource.h b/drivers/gpu/drm/amd/display/dc/resource/dce120/dce120_resource.h
new file mode 100644 (file)
index 0000000..3d1f3cf
--- /dev/null
@@ -0,0 +1,39 @@
+/*
+* Copyright 2012-15 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_RESOURCE_DCE120_H__
+#define __DC_RESOURCE_DCE120_H__
+
+#include "core_types.h"
+
+struct dc;
+struct resource_pool;
+
+struct resource_pool *dce120_create_resource_pool(
+       uint8_t num_virtual_links,
+       struct dc *dc);
+
+#endif /* __DC_RESOURCE_DCE120_H__ */
+
diff --git a/drivers/gpu/drm/amd/display/dc/resource/dce80/CMakeLists.txt b/drivers/gpu/drm/amd/display/dc/resource/dce80/CMakeLists.txt
new file mode 100644 (file)
index 0000000..19dd73b
--- /dev/null
@@ -0,0 +1,4 @@
+dal3_subdirectory_sources(
+  dce80_resource.c
+  dce80_resource.h
+  )
\ No newline at end of file
diff --git a/drivers/gpu/drm/amd/display/dc/resource/dce80/dce80_resource.c b/drivers/gpu/drm/amd/display/dc/resource/dce80/dce80_resource.c
new file mode 100644 (file)
index 0000000..35a2cce
--- /dev/null
@@ -0,0 +1,1544 @@
+/*
+ * Copyright 2012-15 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 "dce/dce_8_0_d.h"
+#include "dce/dce_8_0_sh_mask.h"
+
+#include "dm_services.h"
+
+#include "link_encoder.h"
+#include "stream_encoder.h"
+
+#include "resource.h"
+#include "include/irq_service_interface.h"
+#include "irq/dce80/irq_service_dce80.h"
+#include "dce110/dce110_timing_generator.h"
+#include "dce110/dce110_resource.h"
+#include "dce80/dce80_timing_generator.h"
+#include "dce/dce_mem_input.h"
+#include "dce/dce_link_encoder.h"
+#include "dce/dce_stream_encoder.h"
+#include "dce/dce_ipp.h"
+#include "dce/dce_transform.h"
+#include "dce/dce_opp.h"
+#include "dce/dce_clock_source.h"
+#include "dce/dce_audio.h"
+#include "dce/dce_hwseq.h"
+#include "dce80/dce80_hwseq.h"
+#include "dce100/dce100_resource.h"
+#include "dce/dce_panel_cntl.h"
+
+#include "reg_helper.h"
+
+#include "dce/dce_dmcu.h"
+#include "dce/dce_aux.h"
+#include "dce/dce_abm.h"
+#include "dce/dce_i2c.h"
+/* TODO remove this include */
+
+#ifndef mmMC_HUB_RDREQ_DMIF_LIMIT
+#include "gmc/gmc_7_1_d.h"
+#include "gmc/gmc_7_1_sh_mask.h"
+#endif
+
+#include "dce80/dce80_resource.h"
+
+#ifndef mmDP_DPHY_INTERNAL_CTRL
+#define mmDP_DPHY_INTERNAL_CTRL                         0x1CDE
+#define mmDP0_DP_DPHY_INTERNAL_CTRL                     0x1CDE
+#define mmDP1_DP_DPHY_INTERNAL_CTRL                     0x1FDE
+#define mmDP2_DP_DPHY_INTERNAL_CTRL                     0x42DE
+#define mmDP3_DP_DPHY_INTERNAL_CTRL                     0x45DE
+#define mmDP4_DP_DPHY_INTERNAL_CTRL                     0x48DE
+#define mmDP5_DP_DPHY_INTERNAL_CTRL                     0x4BDE
+#define mmDP6_DP_DPHY_INTERNAL_CTRL                     0x4EDE
+#endif
+
+
+#ifndef mmBIOS_SCRATCH_2
+       #define mmBIOS_SCRATCH_2 0x05CB
+       #define mmBIOS_SCRATCH_3 0x05CC
+       #define mmBIOS_SCRATCH_6 0x05CF
+#endif
+
+#ifndef mmDP_DPHY_FAST_TRAINING
+       #define mmDP_DPHY_FAST_TRAINING                         0x1CCE
+       #define mmDP0_DP_DPHY_FAST_TRAINING                     0x1CCE
+       #define mmDP1_DP_DPHY_FAST_TRAINING                     0x1FCE
+       #define mmDP2_DP_DPHY_FAST_TRAINING                     0x42CE
+       #define mmDP3_DP_DPHY_FAST_TRAINING                     0x45CE
+       #define mmDP4_DP_DPHY_FAST_TRAINING                     0x48CE
+       #define mmDP5_DP_DPHY_FAST_TRAINING                     0x4BCE
+       #define mmDP6_DP_DPHY_FAST_TRAINING                     0x4ECE
+#endif
+
+
+#ifndef mmHPD_DC_HPD_CONTROL
+       #define mmHPD_DC_HPD_CONTROL                            0x189A
+       #define mmHPD0_DC_HPD_CONTROL                           0x189A
+       #define mmHPD1_DC_HPD_CONTROL                           0x18A2
+       #define mmHPD2_DC_HPD_CONTROL                           0x18AA
+       #define mmHPD3_DC_HPD_CONTROL                           0x18B2
+       #define mmHPD4_DC_HPD_CONTROL                           0x18BA
+       #define mmHPD5_DC_HPD_CONTROL                           0x18C2
+#endif
+
+#define DCE11_DIG_FE_CNTL 0x4a00
+#define DCE11_DIG_BE_CNTL 0x4a47
+#define DCE11_DP_SEC 0x4ac3
+
+static const struct dce110_timing_generator_offsets dce80_tg_offsets[] = {
+               {
+                       .crtc = (mmCRTC0_CRTC_CONTROL - mmCRTC_CONTROL),
+                       .dcp =  (mmGRPH_CONTROL - mmGRPH_CONTROL),
+                       .dmif = (mmDMIF_PG0_DPG_WATERMARK_MASK_CONTROL
+                                       - mmDPG_WATERMARK_MASK_CONTROL),
+               },
+               {
+                       .crtc = (mmCRTC1_CRTC_CONTROL - mmCRTC_CONTROL),
+                       .dcp = (mmDCP1_GRPH_CONTROL - mmGRPH_CONTROL),
+                       .dmif = (mmDMIF_PG1_DPG_WATERMARK_MASK_CONTROL
+                                       - mmDPG_WATERMARK_MASK_CONTROL),
+               },
+               {
+                       .crtc = (mmCRTC2_CRTC_CONTROL - mmCRTC_CONTROL),
+                       .dcp = (mmDCP2_GRPH_CONTROL - mmGRPH_CONTROL),
+                       .dmif = (mmDMIF_PG2_DPG_WATERMARK_MASK_CONTROL
+                                       - mmDPG_WATERMARK_MASK_CONTROL),
+               },
+               {
+                       .crtc = (mmCRTC3_CRTC_CONTROL - mmCRTC_CONTROL),
+                       .dcp = (mmDCP3_GRPH_CONTROL - mmGRPH_CONTROL),
+                       .dmif = (mmDMIF_PG3_DPG_WATERMARK_MASK_CONTROL
+                                       - mmDPG_WATERMARK_MASK_CONTROL),
+               },
+               {
+                       .crtc = (mmCRTC4_CRTC_CONTROL - mmCRTC_CONTROL),
+                       .dcp = (mmDCP4_GRPH_CONTROL - mmGRPH_CONTROL),
+                       .dmif = (mmDMIF_PG4_DPG_WATERMARK_MASK_CONTROL
+                                       - mmDPG_WATERMARK_MASK_CONTROL),
+               },
+               {
+                       .crtc = (mmCRTC5_CRTC_CONTROL - mmCRTC_CONTROL),
+                       .dcp = (mmDCP5_GRPH_CONTROL - mmGRPH_CONTROL),
+                       .dmif = (mmDMIF_PG5_DPG_WATERMARK_MASK_CONTROL
+                                       - mmDPG_WATERMARK_MASK_CONTROL),
+               }
+};
+
+/* set register offset */
+#define SR(reg_name)\
+       .reg_name = mm ## reg_name
+
+/* set register offset with instance */
+#define SRI(reg_name, block, id)\
+       .reg_name = mm ## block ## id ## _ ## reg_name
+
+#define ipp_regs(id)\
+[id] = {\
+               IPP_COMMON_REG_LIST_DCE_BASE(id)\
+}
+
+static const struct dce_ipp_registers ipp_regs[] = {
+               ipp_regs(0),
+               ipp_regs(1),
+               ipp_regs(2),
+               ipp_regs(3),
+               ipp_regs(4),
+               ipp_regs(5)
+};
+
+static const struct dce_ipp_shift ipp_shift = {
+               IPP_COMMON_MASK_SH_LIST_DCE_COMMON_BASE(__SHIFT)
+};
+
+static const struct dce_ipp_mask ipp_mask = {
+               IPP_COMMON_MASK_SH_LIST_DCE_COMMON_BASE(_MASK)
+};
+
+#define transform_regs(id)\
+[id] = {\
+               XFM_COMMON_REG_LIST_DCE80(id)\
+}
+
+static const struct dce_transform_registers xfm_regs[] = {
+               transform_regs(0),
+               transform_regs(1),
+               transform_regs(2),
+               transform_regs(3),
+               transform_regs(4),
+               transform_regs(5)
+};
+
+static const struct dce_transform_shift xfm_shift = {
+               XFM_COMMON_MASK_SH_LIST_DCE80(__SHIFT)
+};
+
+static const struct dce_transform_mask xfm_mask = {
+               XFM_COMMON_MASK_SH_LIST_DCE80(_MASK)
+};
+
+#define aux_regs(id)\
+[id] = {\
+       AUX_REG_LIST(id)\
+}
+
+static const struct dce110_link_enc_aux_registers link_enc_aux_regs[] = {
+       aux_regs(0),
+       aux_regs(1),
+       aux_regs(2),
+       aux_regs(3),
+       aux_regs(4),
+       aux_regs(5)
+};
+
+#define hpd_regs(id)\
+[id] = {\
+       HPD_REG_LIST(id)\
+}
+
+static const struct dce110_link_enc_hpd_registers link_enc_hpd_regs[] = {
+               hpd_regs(0),
+               hpd_regs(1),
+               hpd_regs(2),
+               hpd_regs(3),
+               hpd_regs(4),
+               hpd_regs(5)
+};
+
+#define link_regs(id)\
+[id] = {\
+       LE_DCE80_REG_LIST(id)\
+}
+
+static const struct dce110_link_enc_registers link_enc_regs[] = {
+       link_regs(0),
+       link_regs(1),
+       link_regs(2),
+       link_regs(3),
+       link_regs(4),
+       link_regs(5),
+       link_regs(6),
+};
+
+#define stream_enc_regs(id)\
+[id] = {\
+       SE_COMMON_REG_LIST_DCE_BASE(id),\
+       .AFMT_CNTL = 0,\
+}
+
+static const struct dce110_stream_enc_registers stream_enc_regs[] = {
+       stream_enc_regs(0),
+       stream_enc_regs(1),
+       stream_enc_regs(2),
+       stream_enc_regs(3),
+       stream_enc_regs(4),
+       stream_enc_regs(5),
+       stream_enc_regs(6)
+};
+
+static const struct dce_stream_encoder_shift se_shift = {
+               SE_COMMON_MASK_SH_LIST_DCE80_100(__SHIFT)
+};
+
+static const struct dce_stream_encoder_mask se_mask = {
+               SE_COMMON_MASK_SH_LIST_DCE80_100(_MASK)
+};
+
+static const struct dce_panel_cntl_registers panel_cntl_regs[] = {
+       { DCE_PANEL_CNTL_REG_LIST() }
+};
+
+static const struct dce_panel_cntl_shift panel_cntl_shift = {
+       DCE_PANEL_CNTL_MASK_SH_LIST(__SHIFT)
+};
+
+static const struct dce_panel_cntl_mask panel_cntl_mask = {
+       DCE_PANEL_CNTL_MASK_SH_LIST(_MASK)
+};
+
+#define opp_regs(id)\
+[id] = {\
+       OPP_DCE_80_REG_LIST(id),\
+}
+
+static const struct dce_opp_registers opp_regs[] = {
+       opp_regs(0),
+       opp_regs(1),
+       opp_regs(2),
+       opp_regs(3),
+       opp_regs(4),
+       opp_regs(5)
+};
+
+static const struct dce_opp_shift opp_shift = {
+       OPP_COMMON_MASK_SH_LIST_DCE_80(__SHIFT)
+};
+
+static const struct dce_opp_mask opp_mask = {
+       OPP_COMMON_MASK_SH_LIST_DCE_80(_MASK)
+};
+
+static const struct dce110_aux_registers_shift aux_shift = {
+       DCE10_AUX_MASK_SH_LIST(__SHIFT)
+};
+
+static const struct dce110_aux_registers_mask aux_mask = {
+       DCE10_AUX_MASK_SH_LIST(_MASK)
+};
+
+#define aux_engine_regs(id)\
+[id] = {\
+       AUX_COMMON_REG_LIST(id), \
+       .AUX_RESET_MASK = 0 \
+}
+
+static const struct dce110_aux_registers aux_engine_regs[] = {
+               aux_engine_regs(0),
+               aux_engine_regs(1),
+               aux_engine_regs(2),
+               aux_engine_regs(3),
+               aux_engine_regs(4),
+               aux_engine_regs(5)
+};
+
+#define audio_regs(id)\
+[id] = {\
+       AUD_COMMON_REG_LIST(id)\
+}
+
+static const struct dce_audio_registers audio_regs[] = {
+       audio_regs(0),
+       audio_regs(1),
+       audio_regs(2),
+       audio_regs(3),
+       audio_regs(4),
+       audio_regs(5),
+       audio_regs(6),
+};
+
+static const struct dce_audio_shift audio_shift = {
+               AUD_COMMON_MASK_SH_LIST(__SHIFT)
+};
+
+static const struct dce_audio_mask audio_mask = {
+               AUD_COMMON_MASK_SH_LIST(_MASK)
+};
+
+#define clk_src_regs(id)\
+[id] = {\
+       CS_COMMON_REG_LIST_DCE_80(id),\
+}
+
+
+static const struct dce110_clk_src_regs clk_src_regs[] = {
+       clk_src_regs(0),
+       clk_src_regs(1),
+       clk_src_regs(2)
+};
+
+static const struct dce110_clk_src_shift cs_shift = {
+               CS_COMMON_MASK_SH_LIST_DCE_COMMON_BASE(__SHIFT)
+};
+
+static const struct dce110_clk_src_mask cs_mask = {
+               CS_COMMON_MASK_SH_LIST_DCE_COMMON_BASE(_MASK)
+};
+
+static const struct bios_registers bios_regs = {
+       .BIOS_SCRATCH_3 = mmBIOS_SCRATCH_3,
+       .BIOS_SCRATCH_6 = mmBIOS_SCRATCH_6
+};
+
+static const struct resource_caps res_cap = {
+               .num_timing_generator = 6,
+               .num_audio = 6,
+               .num_stream_encoder = 6,
+               .num_pll = 3,
+               .num_ddc = 6,
+};
+
+static const struct resource_caps res_cap_81 = {
+               .num_timing_generator = 4,
+               .num_audio = 7,
+               .num_stream_encoder = 7,
+               .num_pll = 3,
+               .num_ddc = 6,
+};
+
+static const struct resource_caps res_cap_83 = {
+               .num_timing_generator = 2,
+               .num_audio = 6,
+               .num_stream_encoder = 6,
+               .num_pll = 2,
+               .num_ddc = 2,
+};
+
+static const struct dc_plane_cap plane_cap = {
+       .type = DC_PLANE_TYPE_DCE_RGB,
+
+       .pixel_format_support = {
+                       .argb8888 = true,
+                       .nv12 = false,
+                       .fp16 = true
+       },
+
+       .max_upscale_factor = {
+                       .argb8888 = 16000,
+                       .nv12 = 1,
+                       .fp16 = 1
+       },
+
+       .max_downscale_factor = {
+                       .argb8888 = 250,
+                       .nv12 = 1,
+                       .fp16 = 1
+       }
+};
+
+static const struct dc_debug_options debug_defaults = {
+               .enable_legacy_fast_update = true,
+};
+
+static const struct dce_dmcu_registers dmcu_regs = {
+               DMCU_DCE80_REG_LIST()
+};
+
+static const struct dce_dmcu_shift dmcu_shift = {
+               DMCU_MASK_SH_LIST_DCE80(__SHIFT)
+};
+
+static const struct dce_dmcu_mask dmcu_mask = {
+               DMCU_MASK_SH_LIST_DCE80(_MASK)
+};
+static const struct dce_abm_registers abm_regs = {
+               ABM_DCE110_COMMON_REG_LIST()
+};
+
+static const struct dce_abm_shift abm_shift = {
+               ABM_MASK_SH_LIST_DCE110(__SHIFT)
+};
+
+static const struct dce_abm_mask abm_mask = {
+               ABM_MASK_SH_LIST_DCE110(_MASK)
+};
+
+#define CTX  ctx
+#define REG(reg) mm ## reg
+
+#ifndef mmCC_DC_HDMI_STRAPS
+#define mmCC_DC_HDMI_STRAPS 0x1918
+#define CC_DC_HDMI_STRAPS__HDMI_DISABLE_MASK 0x40
+#define CC_DC_HDMI_STRAPS__HDMI_DISABLE__SHIFT 0x6
+#define CC_DC_HDMI_STRAPS__AUDIO_STREAM_NUMBER_MASK 0x700
+#define CC_DC_HDMI_STRAPS__AUDIO_STREAM_NUMBER__SHIFT 0x8
+#endif
+
+static int map_transmitter_id_to_phy_instance(
+       enum transmitter transmitter)
+{
+       switch (transmitter) {
+       case TRANSMITTER_UNIPHY_A:
+               return 0;
+       case TRANSMITTER_UNIPHY_B:
+               return 1;
+       case TRANSMITTER_UNIPHY_C:
+               return 2;
+       case TRANSMITTER_UNIPHY_D:
+               return 3;
+       case TRANSMITTER_UNIPHY_E:
+               return 4;
+       case TRANSMITTER_UNIPHY_F:
+               return 5;
+       case TRANSMITTER_UNIPHY_G:
+               return 6;
+       default:
+               ASSERT(0);
+               return 0;
+       }
+}
+
+static void read_dce_straps(
+       struct dc_context *ctx,
+       struct resource_straps *straps)
+{
+       REG_GET_2(CC_DC_HDMI_STRAPS,
+                       HDMI_DISABLE, &straps->hdmi_disable,
+                       AUDIO_STREAM_NUMBER, &straps->audio_stream_number);
+
+       REG_GET(DC_PINSTRAPS, DC_PINSTRAPS_AUDIO, &straps->dc_pinstraps_audio);
+}
+
+static struct audio *create_audio(
+               struct dc_context *ctx, unsigned int inst)
+{
+       return dce_audio_create(ctx, inst,
+                       &audio_regs[inst], &audio_shift, &audio_mask);
+}
+
+static struct timing_generator *dce80_timing_generator_create(
+               struct dc_context *ctx,
+               uint32_t instance,
+               const struct dce110_timing_generator_offsets *offsets)
+{
+       struct dce110_timing_generator *tg110 =
+               kzalloc(sizeof(struct dce110_timing_generator), GFP_KERNEL);
+
+       if (!tg110)
+               return NULL;
+
+       dce80_timing_generator_construct(tg110, ctx, instance, offsets);
+       return &tg110->base;
+}
+
+static struct output_pixel_processor *dce80_opp_create(
+       struct dc_context *ctx,
+       uint32_t inst)
+{
+       struct dce110_opp *opp =
+               kzalloc(sizeof(struct dce110_opp), GFP_KERNEL);
+
+       if (!opp)
+               return NULL;
+
+       dce110_opp_construct(opp,
+                            ctx, inst, &opp_regs[inst], &opp_shift, &opp_mask);
+       return &opp->base;
+}
+
+static struct dce_aux *dce80_aux_engine_create(
+       struct dc_context *ctx,
+       uint32_t inst)
+{
+       struct aux_engine_dce110 *aux_engine =
+               kzalloc(sizeof(struct aux_engine_dce110), GFP_KERNEL);
+
+       if (!aux_engine)
+               return NULL;
+
+       dce110_aux_engine_construct(aux_engine, ctx, inst,
+                                   SW_AUX_TIMEOUT_PERIOD_MULTIPLIER * AUX_TIMEOUT_PERIOD,
+                                   &aux_engine_regs[inst],
+                                       &aux_mask,
+                                       &aux_shift,
+                                       ctx->dc->caps.extended_aux_timeout_support);
+
+       return &aux_engine->base;
+}
+#define i2c_inst_regs(id) { I2C_HW_ENGINE_COMMON_REG_LIST(id) }
+
+static const struct dce_i2c_registers i2c_hw_regs[] = {
+               i2c_inst_regs(1),
+               i2c_inst_regs(2),
+               i2c_inst_regs(3),
+               i2c_inst_regs(4),
+               i2c_inst_regs(5),
+               i2c_inst_regs(6),
+};
+
+static const struct dce_i2c_shift i2c_shifts = {
+               I2C_COMMON_MASK_SH_LIST_DCE_COMMON_BASE(__SHIFT)
+};
+
+static const struct dce_i2c_mask i2c_masks = {
+               I2C_COMMON_MASK_SH_LIST_DCE_COMMON_BASE(_MASK)
+};
+
+static struct dce_i2c_hw *dce80_i2c_hw_create(
+       struct dc_context *ctx,
+       uint32_t inst)
+{
+       struct dce_i2c_hw *dce_i2c_hw =
+               kzalloc(sizeof(struct dce_i2c_hw), GFP_KERNEL);
+
+       if (!dce_i2c_hw)
+               return NULL;
+
+       dce_i2c_hw_construct(dce_i2c_hw, ctx, inst,
+                                   &i2c_hw_regs[inst], &i2c_shifts, &i2c_masks);
+
+       return dce_i2c_hw;
+}
+
+static struct dce_i2c_sw *dce80_i2c_sw_create(
+       struct dc_context *ctx)
+{
+       struct dce_i2c_sw *dce_i2c_sw =
+               kzalloc(sizeof(struct dce_i2c_sw), GFP_KERNEL);
+
+       if (!dce_i2c_sw)
+               return NULL;
+
+       dce_i2c_sw_construct(dce_i2c_sw, ctx);
+
+       return dce_i2c_sw;
+}
+static struct stream_encoder *dce80_stream_encoder_create(
+       enum engine_id eng_id,
+       struct dc_context *ctx)
+{
+       struct dce110_stream_encoder *enc110 =
+               kzalloc(sizeof(struct dce110_stream_encoder), GFP_KERNEL);
+
+       if (!enc110)
+               return NULL;
+
+       dce110_stream_encoder_construct(enc110, ctx, ctx->dc_bios, eng_id,
+                                       &stream_enc_regs[eng_id],
+                                       &se_shift, &se_mask);
+       return &enc110->base;
+}
+
+#define SRII(reg_name, block, id)\
+       .reg_name[id] = mm ## block ## id ## _ ## reg_name
+
+static const struct dce_hwseq_registers hwseq_reg = {
+               HWSEQ_DCE8_REG_LIST()
+};
+
+static const struct dce_hwseq_shift hwseq_shift = {
+               HWSEQ_DCE8_MASK_SH_LIST(__SHIFT)
+};
+
+static const struct dce_hwseq_mask hwseq_mask = {
+               HWSEQ_DCE8_MASK_SH_LIST(_MASK)
+};
+
+static struct dce_hwseq *dce80_hwseq_create(
+       struct dc_context *ctx)
+{
+       struct dce_hwseq *hws = kzalloc(sizeof(struct dce_hwseq), GFP_KERNEL);
+
+       if (hws) {
+               hws->ctx = ctx;
+               hws->regs = &hwseq_reg;
+               hws->shifts = &hwseq_shift;
+               hws->masks = &hwseq_mask;
+       }
+       return hws;
+}
+
+static const struct resource_create_funcs res_create_funcs = {
+       .read_dce_straps = read_dce_straps,
+       .create_audio = create_audio,
+       .create_stream_encoder = dce80_stream_encoder_create,
+       .create_hwseq = dce80_hwseq_create,
+};
+
+#define mi_inst_regs(id) { \
+       MI_DCE8_REG_LIST(id), \
+       .MC_HUB_RDREQ_DMIF_LIMIT = mmMC_HUB_RDREQ_DMIF_LIMIT \
+}
+static const struct dce_mem_input_registers mi_regs[] = {
+               mi_inst_regs(0),
+               mi_inst_regs(1),
+               mi_inst_regs(2),
+               mi_inst_regs(3),
+               mi_inst_regs(4),
+               mi_inst_regs(5),
+};
+
+static const struct dce_mem_input_shift mi_shifts = {
+               MI_DCE8_MASK_SH_LIST(__SHIFT),
+               .ENABLE = MC_HUB_RDREQ_DMIF_LIMIT__ENABLE__SHIFT
+};
+
+static const struct dce_mem_input_mask mi_masks = {
+               MI_DCE8_MASK_SH_LIST(_MASK),
+               .ENABLE = MC_HUB_RDREQ_DMIF_LIMIT__ENABLE_MASK
+};
+
+static struct mem_input *dce80_mem_input_create(
+       struct dc_context *ctx,
+       uint32_t inst)
+{
+       struct dce_mem_input *dce_mi = kzalloc(sizeof(struct dce_mem_input),
+                                              GFP_KERNEL);
+
+       if (!dce_mi) {
+               BREAK_TO_DEBUGGER();
+               return NULL;
+       }
+
+       dce_mem_input_construct(dce_mi, ctx, inst, &mi_regs[inst], &mi_shifts, &mi_masks);
+       dce_mi->wa.single_head_rdreq_dmif_limit = 2;
+       return &dce_mi->base;
+}
+
+static void dce80_transform_destroy(struct transform **xfm)
+{
+       kfree(TO_DCE_TRANSFORM(*xfm));
+       *xfm = NULL;
+}
+
+static struct transform *dce80_transform_create(
+       struct dc_context *ctx,
+       uint32_t inst)
+{
+       struct dce_transform *transform =
+               kzalloc(sizeof(struct dce_transform), GFP_KERNEL);
+
+       if (!transform)
+               return NULL;
+
+       dce_transform_construct(transform, ctx, inst,
+                               &xfm_regs[inst], &xfm_shift, &xfm_mask);
+       transform->prescaler_on = false;
+       return &transform->base;
+}
+
+static const struct encoder_feature_support link_enc_feature = {
+               .max_hdmi_deep_color = COLOR_DEPTH_121212,
+               .max_hdmi_pixel_clock = 297000,
+               .flags.bits.IS_HBR2_CAPABLE = true,
+               .flags.bits.IS_TPS3_CAPABLE = true
+};
+
+static struct link_encoder *dce80_link_encoder_create(
+       struct dc_context *ctx,
+       const struct encoder_init_data *enc_init_data)
+{
+       struct dce110_link_encoder *enc110 =
+               kzalloc(sizeof(struct dce110_link_encoder), GFP_KERNEL);
+       int link_regs_id;
+
+       if (!enc110)
+               return NULL;
+
+       link_regs_id =
+               map_transmitter_id_to_phy_instance(enc_init_data->transmitter);
+
+       dce110_link_encoder_construct(enc110,
+                                     enc_init_data,
+                                     &link_enc_feature,
+                                     &link_enc_regs[link_regs_id],
+                                     &link_enc_aux_regs[enc_init_data->channel - 1],
+                                     &link_enc_hpd_regs[enc_init_data->hpd_source]);
+       return &enc110->base;
+}
+
+static struct panel_cntl *dce80_panel_cntl_create(const struct panel_cntl_init_data *init_data)
+{
+       struct dce_panel_cntl *panel_cntl =
+               kzalloc(sizeof(struct dce_panel_cntl), GFP_KERNEL);
+
+       if (!panel_cntl)
+               return NULL;
+
+       dce_panel_cntl_construct(panel_cntl,
+                       init_data,
+                       &panel_cntl_regs[init_data->inst],
+                       &panel_cntl_shift,
+                       &panel_cntl_mask);
+
+       return &panel_cntl->base;
+}
+
+static struct clock_source *dce80_clock_source_create(
+       struct dc_context *ctx,
+       struct dc_bios *bios,
+       enum clock_source_id id,
+       const struct dce110_clk_src_regs *regs,
+       bool dp_clk_src)
+{
+       struct dce110_clk_src *clk_src =
+               kzalloc(sizeof(struct dce110_clk_src), GFP_KERNEL);
+
+       if (!clk_src)
+               return NULL;
+
+       if (dce110_clk_src_construct(clk_src, ctx, bios, id,
+                       regs, &cs_shift, &cs_mask)) {
+               clk_src->base.dp_clk_src = dp_clk_src;
+               return &clk_src->base;
+       }
+
+       kfree(clk_src);
+       BREAK_TO_DEBUGGER();
+       return NULL;
+}
+
+static void dce80_clock_source_destroy(struct clock_source **clk_src)
+{
+       kfree(TO_DCE110_CLK_SRC(*clk_src));
+       *clk_src = NULL;
+}
+
+static struct input_pixel_processor *dce80_ipp_create(
+       struct dc_context *ctx, uint32_t inst)
+{
+       struct dce_ipp *ipp = kzalloc(sizeof(struct dce_ipp), GFP_KERNEL);
+
+       if (!ipp) {
+               BREAK_TO_DEBUGGER();
+               return NULL;
+       }
+
+       dce_ipp_construct(ipp, ctx, inst,
+                       &ipp_regs[inst], &ipp_shift, &ipp_mask);
+       return &ipp->base;
+}
+
+static void dce80_resource_destruct(struct dce110_resource_pool *pool)
+{
+       unsigned int i;
+
+       for (i = 0; i < pool->base.pipe_count; i++) {
+               if (pool->base.opps[i] != NULL)
+                       dce110_opp_destroy(&pool->base.opps[i]);
+
+               if (pool->base.transforms[i] != NULL)
+                       dce80_transform_destroy(&pool->base.transforms[i]);
+
+               if (pool->base.ipps[i] != NULL)
+                       dce_ipp_destroy(&pool->base.ipps[i]);
+
+               if (pool->base.mis[i] != NULL) {
+                       kfree(TO_DCE_MEM_INPUT(pool->base.mis[i]));
+                       pool->base.mis[i] = NULL;
+               }
+
+               if (pool->base.timing_generators[i] != NULL)    {
+                       kfree(DCE110TG_FROM_TG(pool->base.timing_generators[i]));
+                       pool->base.timing_generators[i] = NULL;
+               }
+       }
+
+       for (i = 0; i < pool->base.res_cap->num_ddc; i++) {
+               if (pool->base.engines[i] != NULL)
+                       dce110_engine_destroy(&pool->base.engines[i]);
+               if (pool->base.hw_i2cs[i] != NULL) {
+                       kfree(pool->base.hw_i2cs[i]);
+                       pool->base.hw_i2cs[i] = NULL;
+               }
+               if (pool->base.sw_i2cs[i] != NULL) {
+                       kfree(pool->base.sw_i2cs[i]);
+                       pool->base.sw_i2cs[i] = NULL;
+               }
+       }
+
+       for (i = 0; i < pool->base.stream_enc_count; i++) {
+               if (pool->base.stream_enc[i] != NULL)
+                       kfree(DCE110STRENC_FROM_STRENC(pool->base.stream_enc[i]));
+       }
+
+       for (i = 0; i < pool->base.clk_src_count; i++) {
+               if (pool->base.clock_sources[i] != NULL) {
+                       dce80_clock_source_destroy(&pool->base.clock_sources[i]);
+               }
+       }
+
+       if (pool->base.abm != NULL)
+                       dce_abm_destroy(&pool->base.abm);
+
+       if (pool->base.dmcu != NULL)
+                       dce_dmcu_destroy(&pool->base.dmcu);
+
+       if (pool->base.dp_clock_source != NULL)
+               dce80_clock_source_destroy(&pool->base.dp_clock_source);
+
+       for (i = 0; i < pool->base.audio_count; i++)    {
+               if (pool->base.audios[i] != NULL) {
+                       dce_aud_destroy(&pool->base.audios[i]);
+               }
+       }
+
+       if (pool->base.irqs != NULL) {
+               dal_irq_service_destroy(&pool->base.irqs);
+       }
+}
+
+static bool dce80_validate_bandwidth(
+       struct dc *dc,
+       struct dc_state *context,
+       bool fast_validate)
+{
+       int i;
+       bool at_least_one_pipe = false;
+
+       for (i = 0; i < dc->res_pool->pipe_count; i++) {
+               if (context->res_ctx.pipe_ctx[i].stream)
+                       at_least_one_pipe = true;
+       }
+
+       if (at_least_one_pipe) {
+               /* TODO implement when needed but for now hardcode max value*/
+               context->bw_ctx.bw.dce.dispclk_khz = 681000;
+               context->bw_ctx.bw.dce.yclk_khz = 250000 * MEMORY_TYPE_MULTIPLIER_CZ;
+       } else {
+               context->bw_ctx.bw.dce.dispclk_khz = 0;
+               context->bw_ctx.bw.dce.yclk_khz = 0;
+       }
+
+       return true;
+}
+
+static bool dce80_validate_surface_sets(
+               struct dc_state *context)
+{
+       int i;
+
+       for (i = 0; i < context->stream_count; i++) {
+               if (context->stream_status[i].plane_count == 0)
+                       continue;
+
+               if (context->stream_status[i].plane_count > 1)
+                       return false;
+
+               if (context->stream_status[i].plane_states[0]->format
+                               >= SURFACE_PIXEL_FORMAT_VIDEO_BEGIN)
+                       return false;
+       }
+
+       return true;
+}
+
+static enum dc_status dce80_validate_global(
+               struct dc *dc,
+               struct dc_state *context)
+{
+       if (!dce80_validate_surface_sets(context))
+               return DC_FAIL_SURFACE_VALIDATE;
+
+       return DC_OK;
+}
+
+static void dce80_destroy_resource_pool(struct resource_pool **pool)
+{
+       struct dce110_resource_pool *dce110_pool = TO_DCE110_RES_POOL(*pool);
+
+       dce80_resource_destruct(dce110_pool);
+       kfree(dce110_pool);
+       *pool = NULL;
+}
+
+static const struct resource_funcs dce80_res_pool_funcs = {
+       .destroy = dce80_destroy_resource_pool,
+       .link_enc_create = dce80_link_encoder_create,
+       .panel_cntl_create = dce80_panel_cntl_create,
+       .validate_bandwidth = dce80_validate_bandwidth,
+       .validate_plane = dce100_validate_plane,
+       .add_stream_to_ctx = dce100_add_stream_to_ctx,
+       .validate_global = dce80_validate_global,
+       .find_first_free_match_stream_enc_for_link = dce100_find_first_free_match_stream_enc_for_link
+};
+
+static bool dce80_construct(
+       uint8_t num_virtual_links,
+       struct dc *dc,
+       struct dce110_resource_pool *pool)
+{
+       unsigned int i;
+       struct dc_context *ctx = dc->ctx;
+       struct dc_bios *bp;
+
+       ctx->dc_bios->regs = &bios_regs;
+
+       pool->base.res_cap = &res_cap;
+       pool->base.funcs = &dce80_res_pool_funcs;
+
+
+       /*************************************************
+        *  Resource + asic cap harcoding                *
+        *************************************************/
+       pool->base.underlay_pipe_index = NO_UNDERLAY_PIPE;
+       pool->base.pipe_count = res_cap.num_timing_generator;
+       pool->base.timing_generator_count = res_cap.num_timing_generator;
+       dc->caps.max_downscale_ratio = 200;
+       dc->caps.i2c_speed_in_khz = 40;
+       dc->caps.i2c_speed_in_khz_hdcp = 40;
+       dc->caps.max_cursor_size = 128;
+       dc->caps.min_horizontal_blanking_period = 80;
+       dc->caps.dual_link_dvi = true;
+       dc->caps.extended_aux_timeout_support = false;
+       dc->debug = debug_defaults;
+
+       /*************************************************
+        *  Create resources                             *
+        *************************************************/
+
+       bp = ctx->dc_bios;
+
+       if (bp->fw_info_valid && bp->fw_info.external_clock_source_frequency_for_dp != 0) {
+               pool->base.dp_clock_source =
+                               dce80_clock_source_create(ctx, bp, CLOCK_SOURCE_ID_EXTERNAL, NULL, true);
+
+               pool->base.clock_sources[0] =
+                               dce80_clock_source_create(ctx, bp, CLOCK_SOURCE_ID_PLL0, &clk_src_regs[0], false);
+               pool->base.clock_sources[1] =
+                               dce80_clock_source_create(ctx, bp, CLOCK_SOURCE_ID_PLL1, &clk_src_regs[1], false);
+               pool->base.clock_sources[2] =
+                               dce80_clock_source_create(ctx, bp, CLOCK_SOURCE_ID_PLL2, &clk_src_regs[2], false);
+               pool->base.clk_src_count = 3;
+
+       } else {
+               pool->base.dp_clock_source =
+                               dce80_clock_source_create(ctx, bp, CLOCK_SOURCE_ID_PLL0, &clk_src_regs[0], true);
+
+               pool->base.clock_sources[0] =
+                               dce80_clock_source_create(ctx, bp, CLOCK_SOURCE_ID_PLL1, &clk_src_regs[1], false);
+               pool->base.clock_sources[1] =
+                               dce80_clock_source_create(ctx, bp, CLOCK_SOURCE_ID_PLL2, &clk_src_regs[2], false);
+               pool->base.clk_src_count = 2;
+       }
+
+       if (pool->base.dp_clock_source == NULL) {
+               dm_error("DC: failed to create dp clock source!\n");
+               BREAK_TO_DEBUGGER();
+               goto res_create_fail;
+       }
+
+       for (i = 0; i < pool->base.clk_src_count; i++) {
+               if (pool->base.clock_sources[i] == NULL) {
+                       dm_error("DC: failed to create clock sources!\n");
+                       BREAK_TO_DEBUGGER();
+                       goto res_create_fail;
+               }
+       }
+
+       pool->base.dmcu = dce_dmcu_create(ctx,
+                       &dmcu_regs,
+                       &dmcu_shift,
+                       &dmcu_mask);
+       if (pool->base.dmcu == NULL) {
+               dm_error("DC: failed to create dmcu!\n");
+               BREAK_TO_DEBUGGER();
+               goto res_create_fail;
+       }
+
+       pool->base.abm = dce_abm_create(ctx,
+                       &abm_regs,
+                       &abm_shift,
+                       &abm_mask);
+       if (pool->base.abm == NULL) {
+               dm_error("DC: failed to create abm!\n");
+               BREAK_TO_DEBUGGER();
+               goto res_create_fail;
+       }
+
+       {
+               struct irq_service_init_data init_data;
+               init_data.ctx = dc->ctx;
+               pool->base.irqs = dal_irq_service_dce80_create(&init_data);
+               if (!pool->base.irqs)
+                       goto res_create_fail;
+       }
+
+       for (i = 0; i < pool->base.pipe_count; i++) {
+               pool->base.timing_generators[i] = dce80_timing_generator_create(
+                               ctx, i, &dce80_tg_offsets[i]);
+               if (pool->base.timing_generators[i] == NULL) {
+                       BREAK_TO_DEBUGGER();
+                       dm_error("DC: failed to create tg!\n");
+                       goto res_create_fail;
+               }
+
+               pool->base.mis[i] = dce80_mem_input_create(ctx, i);
+               if (pool->base.mis[i] == NULL) {
+                       BREAK_TO_DEBUGGER();
+                       dm_error("DC: failed to create memory input!\n");
+                       goto res_create_fail;
+               }
+
+               pool->base.ipps[i] = dce80_ipp_create(ctx, i);
+               if (pool->base.ipps[i] == NULL) {
+                       BREAK_TO_DEBUGGER();
+                       dm_error("DC: failed to create input pixel processor!\n");
+                       goto res_create_fail;
+               }
+
+               pool->base.transforms[i] = dce80_transform_create(ctx, i);
+               if (pool->base.transforms[i] == NULL) {
+                       BREAK_TO_DEBUGGER();
+                       dm_error("DC: failed to create transform!\n");
+                       goto res_create_fail;
+               }
+
+               pool->base.opps[i] = dce80_opp_create(ctx, i);
+               if (pool->base.opps[i] == NULL) {
+                       BREAK_TO_DEBUGGER();
+                       dm_error("DC: failed to create output pixel processor!\n");
+                       goto res_create_fail;
+               }
+       }
+
+       for (i = 0; i < pool->base.res_cap->num_ddc; i++) {
+               pool->base.engines[i] = dce80_aux_engine_create(ctx, i);
+               if (pool->base.engines[i] == NULL) {
+                       BREAK_TO_DEBUGGER();
+                       dm_error(
+                               "DC:failed to create aux engine!!\n");
+                       goto res_create_fail;
+               }
+               pool->base.hw_i2cs[i] = dce80_i2c_hw_create(ctx, i);
+               if (pool->base.hw_i2cs[i] == NULL) {
+                       BREAK_TO_DEBUGGER();
+                       dm_error(
+                               "DC:failed to create i2c engine!!\n");
+                       goto res_create_fail;
+               }
+               pool->base.sw_i2cs[i] = dce80_i2c_sw_create(ctx);
+               if (pool->base.sw_i2cs[i] == NULL) {
+                       BREAK_TO_DEBUGGER();
+                       dm_error(
+                               "DC:failed to create sw i2c!!\n");
+                       goto res_create_fail;
+               }
+       }
+
+       dc->caps.max_planes =  pool->base.pipe_count;
+
+       for (i = 0; i < dc->caps.max_planes; ++i)
+               dc->caps.planes[i] = plane_cap;
+
+       dc->caps.disable_dp_clk_share = true;
+
+       if (!resource_construct(num_virtual_links, dc, &pool->base,
+                       &res_create_funcs))
+               goto res_create_fail;
+
+       /* Create hardware sequencer */
+       dce80_hw_sequencer_construct(dc);
+
+       return true;
+
+res_create_fail:
+       dce80_resource_destruct(pool);
+       return false;
+}
+
+struct resource_pool *dce80_create_resource_pool(
+       uint8_t num_virtual_links,
+       struct dc *dc)
+{
+       struct dce110_resource_pool *pool =
+               kzalloc(sizeof(struct dce110_resource_pool), GFP_KERNEL);
+
+       if (!pool)
+               return NULL;
+
+       if (dce80_construct(num_virtual_links, dc, pool))
+               return &pool->base;
+
+       kfree(pool);
+       BREAK_TO_DEBUGGER();
+       return NULL;
+}
+
+static bool dce81_construct(
+       uint8_t num_virtual_links,
+       struct dc *dc,
+       struct dce110_resource_pool *pool)
+{
+       unsigned int i;
+       struct dc_context *ctx = dc->ctx;
+       struct dc_bios *bp;
+
+       ctx->dc_bios->regs = &bios_regs;
+
+       pool->base.res_cap = &res_cap_81;
+       pool->base.funcs = &dce80_res_pool_funcs;
+
+
+       /*************************************************
+        *  Resource + asic cap harcoding                *
+        *************************************************/
+       pool->base.underlay_pipe_index = NO_UNDERLAY_PIPE;
+       pool->base.pipe_count = res_cap_81.num_timing_generator;
+       pool->base.timing_generator_count = res_cap_81.num_timing_generator;
+       dc->caps.max_downscale_ratio = 200;
+       dc->caps.i2c_speed_in_khz = 40;
+       dc->caps.i2c_speed_in_khz_hdcp = 40;
+       dc->caps.max_cursor_size = 128;
+       dc->caps.min_horizontal_blanking_period = 80;
+       dc->caps.is_apu = true;
+
+       /*************************************************
+        *  Create resources                             *
+        *************************************************/
+
+       bp = ctx->dc_bios;
+
+       if (bp->fw_info_valid && bp->fw_info.external_clock_source_frequency_for_dp != 0) {
+               pool->base.dp_clock_source =
+                               dce80_clock_source_create(ctx, bp, CLOCK_SOURCE_ID_EXTERNAL, NULL, true);
+
+               pool->base.clock_sources[0] =
+                               dce80_clock_source_create(ctx, bp, CLOCK_SOURCE_ID_PLL0, &clk_src_regs[0], false);
+               pool->base.clock_sources[1] =
+                               dce80_clock_source_create(ctx, bp, CLOCK_SOURCE_ID_PLL1, &clk_src_regs[1], false);
+               pool->base.clock_sources[2] =
+                               dce80_clock_source_create(ctx, bp, CLOCK_SOURCE_ID_PLL2, &clk_src_regs[2], false);
+               pool->base.clk_src_count = 3;
+
+       } else {
+               pool->base.dp_clock_source =
+                               dce80_clock_source_create(ctx, bp, CLOCK_SOURCE_ID_PLL0, &clk_src_regs[0], true);
+
+               pool->base.clock_sources[0] =
+                               dce80_clock_source_create(ctx, bp, CLOCK_SOURCE_ID_PLL1, &clk_src_regs[1], false);
+               pool->base.clock_sources[1] =
+                               dce80_clock_source_create(ctx, bp, CLOCK_SOURCE_ID_PLL2, &clk_src_regs[2], false);
+               pool->base.clk_src_count = 2;
+       }
+
+       if (pool->base.dp_clock_source == NULL) {
+               dm_error("DC: failed to create dp clock source!\n");
+               BREAK_TO_DEBUGGER();
+               goto res_create_fail;
+       }
+
+       for (i = 0; i < pool->base.clk_src_count; i++) {
+               if (pool->base.clock_sources[i] == NULL) {
+                       dm_error("DC: failed to create clock sources!\n");
+                       BREAK_TO_DEBUGGER();
+                       goto res_create_fail;
+               }
+       }
+
+       pool->base.dmcu = dce_dmcu_create(ctx,
+                       &dmcu_regs,
+                       &dmcu_shift,
+                       &dmcu_mask);
+       if (pool->base.dmcu == NULL) {
+               dm_error("DC: failed to create dmcu!\n");
+               BREAK_TO_DEBUGGER();
+               goto res_create_fail;
+       }
+
+       pool->base.abm = dce_abm_create(ctx,
+                       &abm_regs,
+                       &abm_shift,
+                       &abm_mask);
+       if (pool->base.abm == NULL) {
+               dm_error("DC: failed to create abm!\n");
+               BREAK_TO_DEBUGGER();
+               goto res_create_fail;
+       }
+
+       {
+               struct irq_service_init_data init_data;
+               init_data.ctx = dc->ctx;
+               pool->base.irqs = dal_irq_service_dce80_create(&init_data);
+               if (!pool->base.irqs)
+                       goto res_create_fail;
+       }
+
+       for (i = 0; i < pool->base.pipe_count; i++) {
+               pool->base.timing_generators[i] = dce80_timing_generator_create(
+                               ctx, i, &dce80_tg_offsets[i]);
+               if (pool->base.timing_generators[i] == NULL) {
+                       BREAK_TO_DEBUGGER();
+                       dm_error("DC: failed to create tg!\n");
+                       goto res_create_fail;
+               }
+
+               pool->base.mis[i] = dce80_mem_input_create(ctx, i);
+               if (pool->base.mis[i] == NULL) {
+                       BREAK_TO_DEBUGGER();
+                       dm_error("DC: failed to create memory input!\n");
+                       goto res_create_fail;
+               }
+
+               pool->base.ipps[i] = dce80_ipp_create(ctx, i);
+               if (pool->base.ipps[i] == NULL) {
+                       BREAK_TO_DEBUGGER();
+                       dm_error("DC: failed to create input pixel processor!\n");
+                       goto res_create_fail;
+               }
+
+               pool->base.transforms[i] = dce80_transform_create(ctx, i);
+               if (pool->base.transforms[i] == NULL) {
+                       BREAK_TO_DEBUGGER();
+                       dm_error("DC: failed to create transform!\n");
+                       goto res_create_fail;
+               }
+
+               pool->base.opps[i] = dce80_opp_create(ctx, i);
+               if (pool->base.opps[i] == NULL) {
+                       BREAK_TO_DEBUGGER();
+                       dm_error("DC: failed to create output pixel processor!\n");
+                       goto res_create_fail;
+               }
+       }
+
+       for (i = 0; i < pool->base.res_cap->num_ddc; i++) {
+               pool->base.engines[i] = dce80_aux_engine_create(ctx, i);
+               if (pool->base.engines[i] == NULL) {
+                       BREAK_TO_DEBUGGER();
+                       dm_error(
+                               "DC:failed to create aux engine!!\n");
+                       goto res_create_fail;
+               }
+               pool->base.hw_i2cs[i] = dce80_i2c_hw_create(ctx, i);
+               if (pool->base.hw_i2cs[i] == NULL) {
+                       BREAK_TO_DEBUGGER();
+                       dm_error(
+                               "DC:failed to create i2c engine!!\n");
+                       goto res_create_fail;
+               }
+               pool->base.sw_i2cs[i] = dce80_i2c_sw_create(ctx);
+               if (pool->base.sw_i2cs[i] == NULL) {
+                       BREAK_TO_DEBUGGER();
+                       dm_error(
+                               "DC:failed to create sw i2c!!\n");
+                       goto res_create_fail;
+               }
+       }
+
+       dc->caps.max_planes =  pool->base.pipe_count;
+
+       for (i = 0; i < dc->caps.max_planes; ++i)
+               dc->caps.planes[i] = plane_cap;
+
+       dc->caps.disable_dp_clk_share = true;
+
+       if (!resource_construct(num_virtual_links, dc, &pool->base,
+                       &res_create_funcs))
+               goto res_create_fail;
+
+       /* Create hardware sequencer */
+       dce80_hw_sequencer_construct(dc);
+
+       return true;
+
+res_create_fail:
+       dce80_resource_destruct(pool);
+       return false;
+}
+
+struct resource_pool *dce81_create_resource_pool(
+       uint8_t num_virtual_links,
+       struct dc *dc)
+{
+       struct dce110_resource_pool *pool =
+               kzalloc(sizeof(struct dce110_resource_pool), GFP_KERNEL);
+
+       if (!pool)
+               return NULL;
+
+       if (dce81_construct(num_virtual_links, dc, pool))
+               return &pool->base;
+
+       kfree(pool);
+       BREAK_TO_DEBUGGER();
+       return NULL;
+}
+
+static bool dce83_construct(
+       uint8_t num_virtual_links,
+       struct dc *dc,
+       struct dce110_resource_pool *pool)
+{
+       unsigned int i;
+       struct dc_context *ctx = dc->ctx;
+       struct dc_bios *bp;
+
+       ctx->dc_bios->regs = &bios_regs;
+
+       pool->base.res_cap = &res_cap_83;
+       pool->base.funcs = &dce80_res_pool_funcs;
+
+
+       /*************************************************
+        *  Resource + asic cap harcoding                *
+        *************************************************/
+       pool->base.underlay_pipe_index = NO_UNDERLAY_PIPE;
+       pool->base.pipe_count = res_cap_83.num_timing_generator;
+       pool->base.timing_generator_count = res_cap_83.num_timing_generator;
+       dc->caps.max_downscale_ratio = 200;
+       dc->caps.i2c_speed_in_khz = 40;
+       dc->caps.i2c_speed_in_khz_hdcp = 40;
+       dc->caps.max_cursor_size = 128;
+       dc->caps.min_horizontal_blanking_period = 80;
+       dc->caps.is_apu = true;
+       dc->debug = debug_defaults;
+
+       /*************************************************
+        *  Create resources                             *
+        *************************************************/
+
+       bp = ctx->dc_bios;
+
+       if (bp->fw_info_valid && bp->fw_info.external_clock_source_frequency_for_dp != 0) {
+               pool->base.dp_clock_source =
+                               dce80_clock_source_create(ctx, bp, CLOCK_SOURCE_ID_EXTERNAL, NULL, true);
+
+               pool->base.clock_sources[0] =
+                               dce80_clock_source_create(ctx, bp, CLOCK_SOURCE_ID_PLL1, &clk_src_regs[0], false);
+               pool->base.clock_sources[1] =
+                               dce80_clock_source_create(ctx, bp, CLOCK_SOURCE_ID_PLL2, &clk_src_regs[1], false);
+               pool->base.clk_src_count = 2;
+
+       } else {
+               pool->base.dp_clock_source =
+                               dce80_clock_source_create(ctx, bp, CLOCK_SOURCE_ID_PLL1, &clk_src_regs[0], true);
+
+               pool->base.clock_sources[0] =
+                               dce80_clock_source_create(ctx, bp, CLOCK_SOURCE_ID_PLL2, &clk_src_regs[1], false);
+               pool->base.clk_src_count = 1;
+       }
+
+       if (pool->base.dp_clock_source == NULL) {
+               dm_error("DC: failed to create dp clock source!\n");
+               BREAK_TO_DEBUGGER();
+               goto res_create_fail;
+       }
+
+       for (i = 0; i < pool->base.clk_src_count; i++) {
+               if (pool->base.clock_sources[i] == NULL) {
+                       dm_error("DC: failed to create clock sources!\n");
+                       BREAK_TO_DEBUGGER();
+                       goto res_create_fail;
+               }
+       }
+
+       pool->base.dmcu = dce_dmcu_create(ctx,
+                       &dmcu_regs,
+                       &dmcu_shift,
+                       &dmcu_mask);
+       if (pool->base.dmcu == NULL) {
+               dm_error("DC: failed to create dmcu!\n");
+               BREAK_TO_DEBUGGER();
+               goto res_create_fail;
+       }
+
+       pool->base.abm = dce_abm_create(ctx,
+                       &abm_regs,
+                       &abm_shift,
+                       &abm_mask);
+       if (pool->base.abm == NULL) {
+               dm_error("DC: failed to create abm!\n");
+               BREAK_TO_DEBUGGER();
+               goto res_create_fail;
+       }
+
+       {
+               struct irq_service_init_data init_data;
+               init_data.ctx = dc->ctx;
+               pool->base.irqs = dal_irq_service_dce80_create(&init_data);
+               if (!pool->base.irqs)
+                       goto res_create_fail;
+       }
+
+       for (i = 0; i < pool->base.pipe_count; i++) {
+               pool->base.timing_generators[i] = dce80_timing_generator_create(
+                               ctx, i, &dce80_tg_offsets[i]);
+               if (pool->base.timing_generators[i] == NULL) {
+                       BREAK_TO_DEBUGGER();
+                       dm_error("DC: failed to create tg!\n");
+                       goto res_create_fail;
+               }
+
+               pool->base.mis[i] = dce80_mem_input_create(ctx, i);
+               if (pool->base.mis[i] == NULL) {
+                       BREAK_TO_DEBUGGER();
+                       dm_error("DC: failed to create memory input!\n");
+                       goto res_create_fail;
+               }
+
+               pool->base.ipps[i] = dce80_ipp_create(ctx, i);
+               if (pool->base.ipps[i] == NULL) {
+                       BREAK_TO_DEBUGGER();
+                       dm_error("DC: failed to create input pixel processor!\n");
+                       goto res_create_fail;
+               }
+
+               pool->base.transforms[i] = dce80_transform_create(ctx, i);
+               if (pool->base.transforms[i] == NULL) {
+                       BREAK_TO_DEBUGGER();
+                       dm_error("DC: failed to create transform!\n");
+                       goto res_create_fail;
+               }
+
+               pool->base.opps[i] = dce80_opp_create(ctx, i);
+               if (pool->base.opps[i] == NULL) {
+                       BREAK_TO_DEBUGGER();
+                       dm_error("DC: failed to create output pixel processor!\n");
+                       goto res_create_fail;
+               }
+       }
+
+       for (i = 0; i < pool->base.res_cap->num_ddc; i++) {
+               pool->base.engines[i] = dce80_aux_engine_create(ctx, i);
+               if (pool->base.engines[i] == NULL) {
+                       BREAK_TO_DEBUGGER();
+                       dm_error(
+                               "DC:failed to create aux engine!!\n");
+                       goto res_create_fail;
+               }
+               pool->base.hw_i2cs[i] = dce80_i2c_hw_create(ctx, i);
+               if (pool->base.hw_i2cs[i] == NULL) {
+                       BREAK_TO_DEBUGGER();
+                       dm_error(
+                               "DC:failed to create i2c engine!!\n");
+                       goto res_create_fail;
+               }
+               pool->base.sw_i2cs[i] = dce80_i2c_sw_create(ctx);
+               if (pool->base.sw_i2cs[i] == NULL) {
+                       BREAK_TO_DEBUGGER();
+                       dm_error(
+                               "DC:failed to create sw i2c!!\n");
+                       goto res_create_fail;
+               }
+       }
+
+       dc->caps.max_planes =  pool->base.pipe_count;
+
+       for (i = 0; i < dc->caps.max_planes; ++i)
+               dc->caps.planes[i] = plane_cap;
+
+       dc->caps.disable_dp_clk_share = true;
+
+       if (!resource_construct(num_virtual_links, dc, &pool->base,
+                       &res_create_funcs))
+               goto res_create_fail;
+
+       /* Create hardware sequencer */
+       dce80_hw_sequencer_construct(dc);
+
+       return true;
+
+res_create_fail:
+       dce80_resource_destruct(pool);
+       return false;
+}
+
+struct resource_pool *dce83_create_resource_pool(
+       uint8_t num_virtual_links,
+       struct dc *dc)
+{
+       struct dce110_resource_pool *pool =
+               kzalloc(sizeof(struct dce110_resource_pool), GFP_KERNEL);
+
+       if (!pool)
+               return NULL;
+
+       if (dce83_construct(num_virtual_links, dc, pool))
+               return &pool->base;
+
+       BREAK_TO_DEBUGGER();
+       return NULL;
+}
diff --git a/drivers/gpu/drm/amd/display/dc/resource/dce80/dce80_resource.h b/drivers/gpu/drm/amd/display/dc/resource/dce80/dce80_resource.h
new file mode 100644 (file)
index 0000000..eff31ab
--- /dev/null
@@ -0,0 +1,47 @@
+/*
+* Copyright 2012-15 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_RESOURCE_DCE80_H__
+#define __DC_RESOURCE_DCE80_H__
+
+#include "core_types.h"
+
+struct dc;
+struct resource_pool;
+
+struct resource_pool *dce80_create_resource_pool(
+       uint8_t num_virtual_links,
+       struct dc *dc);
+
+struct resource_pool *dce81_create_resource_pool(
+       uint8_t num_virtual_links,
+       struct dc *dc);
+
+struct resource_pool *dce83_create_resource_pool(
+       uint8_t num_virtual_links,
+       struct dc *dc);
+
+#endif /* __DC_RESOURCE_DCE80_H__ */
+
diff --git a/drivers/gpu/drm/amd/display/dc/resource/dcn10/dcn10_resource.c b/drivers/gpu/drm/amd/display/dc/resource/dcn10/dcn10_resource.c
new file mode 100644 (file)
index 0000000..af1b31f
--- /dev/null
@@ -0,0 +1,1689 @@
+/*
+* Copyright 2016 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 "dm_services.h"
+#include "dc.h"
+
+#include "dcn10/dcn10_init.h"
+
+#include "resource.h"
+#include "include/irq_service_interface.h"
+#include "dcn10/dcn10_resource.h"
+#include "dcn10/dcn10_ipp.h"
+#include "dcn10/dcn10_mpc.h"
+
+#include "dcn10/dcn10_dwb.h"
+
+#include "irq/dcn10/irq_service_dcn10.h"
+#include "dcn10/dcn10_dpp.h"
+#include "dcn10/dcn10_optc.h"
+#include "dcn10/dcn10_hwseq.h"
+#include "dce110/dce110_hwseq.h"
+#include "dcn10/dcn10_opp.h"
+#include "dcn10/dcn10_link_encoder.h"
+#include "dcn10/dcn10_stream_encoder.h"
+#include "dce/dce_clock_source.h"
+#include "dce/dce_audio.h"
+#include "dce/dce_hwseq.h"
+#include "virtual/virtual_stream_encoder.h"
+#include "dce110/dce110_resource.h"
+#include "dce112/dce112_resource.h"
+#include "dcn10/dcn10_hubp.h"
+#include "dcn10/dcn10_hubbub.h"
+#include "dce/dce_panel_cntl.h"
+
+#include "soc15_hw_ip.h"
+#include "vega10_ip_offset.h"
+
+#include "dcn/dcn_1_0_offset.h"
+#include "dcn/dcn_1_0_sh_mask.h"
+
+#include "nbio/nbio_7_0_offset.h"
+
+#include "mmhub/mmhub_9_1_offset.h"
+#include "mmhub/mmhub_9_1_sh_mask.h"
+
+#include "reg_helper.h"
+#include "dce/dce_abm.h"
+#include "dce/dce_dmcu.h"
+#include "dce/dce_aux.h"
+#include "dce/dce_i2c.h"
+
+#ifndef mmDP0_DP_DPHY_INTERNAL_CTRL
+       #define mmDP0_DP_DPHY_INTERNAL_CTRL             0x210f
+       #define mmDP0_DP_DPHY_INTERNAL_CTRL_BASE_IDX    2
+       #define mmDP1_DP_DPHY_INTERNAL_CTRL             0x220f
+       #define mmDP1_DP_DPHY_INTERNAL_CTRL_BASE_IDX    2
+       #define mmDP2_DP_DPHY_INTERNAL_CTRL             0x230f
+       #define mmDP2_DP_DPHY_INTERNAL_CTRL_BASE_IDX    2
+       #define mmDP3_DP_DPHY_INTERNAL_CTRL             0x240f
+       #define mmDP3_DP_DPHY_INTERNAL_CTRL_BASE_IDX    2
+       #define mmDP4_DP_DPHY_INTERNAL_CTRL             0x250f
+       #define mmDP4_DP_DPHY_INTERNAL_CTRL_BASE_IDX    2
+       #define mmDP5_DP_DPHY_INTERNAL_CTRL             0x260f
+       #define mmDP5_DP_DPHY_INTERNAL_CTRL_BASE_IDX    2
+       #define mmDP6_DP_DPHY_INTERNAL_CTRL             0x270f
+       #define mmDP6_DP_DPHY_INTERNAL_CTRL_BASE_IDX    2
+#endif
+
+
+enum dcn10_clk_src_array_id {
+       DCN10_CLK_SRC_PLL0,
+       DCN10_CLK_SRC_PLL1,
+       DCN10_CLK_SRC_PLL2,
+       DCN10_CLK_SRC_PLL3,
+       DCN10_CLK_SRC_TOTAL,
+       DCN101_CLK_SRC_TOTAL = DCN10_CLK_SRC_PLL3
+};
+
+/* begin *********************
+ * macros to expend register list macro defined in HW object header file */
+
+/* DCN */
+#define BASE_INNER(seg) \
+       DCE_BASE__INST0_SEG ## seg
+
+#define BASE(seg) \
+       BASE_INNER(seg)
+
+#define SR(reg_name)\
+               .reg_name = BASE(mm ## reg_name ## _BASE_IDX) +  \
+                                       mm ## reg_name
+
+#define SRI(reg_name, block, id)\
+       .reg_name = BASE(mm ## block ## id ## _ ## reg_name ## _BASE_IDX) + \
+                                       mm ## block ## id ## _ ## reg_name
+
+
+#define SRII(reg_name, block, id)\
+       .reg_name[id] = BASE(mm ## block ## id ## _ ## reg_name ## _BASE_IDX) + \
+                                       mm ## block ## id ## _ ## reg_name
+
+#define VUPDATE_SRII(reg_name, block, id)\
+       .reg_name[id] = BASE(mm ## reg_name ## 0 ## _ ## block ## id ## _BASE_IDX) + \
+                                       mm ## reg_name ## 0 ## _ ## block ## id
+
+/* set field/register/bitfield name */
+#define SFRB(field_name, reg_name, bitfield, post_fix)\
+       .field_name = reg_name ## __ ## bitfield ## post_fix
+
+/* NBIO */
+#define NBIO_BASE_INNER(seg) \
+       NBIF_BASE__INST0_SEG ## seg
+
+#define NBIO_BASE(seg) \
+       NBIO_BASE_INNER(seg)
+
+#define NBIO_SR(reg_name)\
+               .reg_name = NBIO_BASE(mm ## reg_name ## _BASE_IDX) +  \
+                                       mm ## reg_name
+
+/* MMHUB */
+#define MMHUB_BASE_INNER(seg) \
+       MMHUB_BASE__INST0_SEG ## seg
+
+#define MMHUB_BASE(seg) \
+       MMHUB_BASE_INNER(seg)
+
+#define MMHUB_SR(reg_name)\
+               .reg_name = MMHUB_BASE(mm ## reg_name ## _BASE_IDX) +  \
+                                       mm ## reg_name
+
+/* macros to expend register list macro defined in HW object header file
+ * end *********************/
+
+
+static const struct dce_dmcu_registers dmcu_regs = {
+               DMCU_DCN10_REG_LIST()
+};
+
+static const struct dce_dmcu_shift dmcu_shift = {
+               DMCU_MASK_SH_LIST_DCN10(__SHIFT)
+};
+
+static const struct dce_dmcu_mask dmcu_mask = {
+               DMCU_MASK_SH_LIST_DCN10(_MASK)
+};
+
+static const struct dce_abm_registers abm_regs = {
+               ABM_DCN10_REG_LIST(0)
+};
+
+static const struct dce_abm_shift abm_shift = {
+               ABM_MASK_SH_LIST_DCN10(__SHIFT)
+};
+
+static const struct dce_abm_mask abm_mask = {
+               ABM_MASK_SH_LIST_DCN10(_MASK)
+};
+
+#define stream_enc_regs(id)\
+[id] = {\
+       SE_DCN_REG_LIST(id)\
+}
+
+static const struct dcn10_stream_enc_registers stream_enc_regs[] = {
+       stream_enc_regs(0),
+       stream_enc_regs(1),
+       stream_enc_regs(2),
+       stream_enc_regs(3),
+};
+
+static const struct dcn10_stream_encoder_shift se_shift = {
+               SE_COMMON_MASK_SH_LIST_DCN10(__SHIFT)
+};
+
+static const struct dcn10_stream_encoder_mask se_mask = {
+               SE_COMMON_MASK_SH_LIST_DCN10(_MASK)
+};
+
+#define audio_regs(id)\
+[id] = {\
+               AUD_COMMON_REG_LIST(id)\
+}
+
+static const struct dce_audio_registers audio_regs[] = {
+       audio_regs(0),
+       audio_regs(1),
+       audio_regs(2),
+       audio_regs(3),
+};
+
+#define DCE120_AUD_COMMON_MASK_SH_LIST(mask_sh)\
+               SF(AZF0ENDPOINT0_AZALIA_F0_CODEC_ENDPOINT_INDEX, AZALIA_ENDPOINT_REG_INDEX, mask_sh),\
+               SF(AZF0ENDPOINT0_AZALIA_F0_CODEC_ENDPOINT_DATA, AZALIA_ENDPOINT_REG_DATA, mask_sh),\
+               AUD_COMMON_MASK_SH_LIST_BASE(mask_sh)
+
+static const struct dce_audio_shift audio_shift = {
+               DCE120_AUD_COMMON_MASK_SH_LIST(__SHIFT)
+};
+
+static const struct dce_audio_mask audio_mask = {
+               DCE120_AUD_COMMON_MASK_SH_LIST(_MASK)
+};
+
+#define aux_regs(id)\
+[id] = {\
+       AUX_REG_LIST(id)\
+}
+
+static const struct dcn10_link_enc_aux_registers link_enc_aux_regs[] = {
+               aux_regs(0),
+               aux_regs(1),
+               aux_regs(2),
+               aux_regs(3)
+};
+
+#define hpd_regs(id)\
+[id] = {\
+       HPD_REG_LIST(id)\
+}
+
+static const struct dcn10_link_enc_hpd_registers link_enc_hpd_regs[] = {
+               hpd_regs(0),
+               hpd_regs(1),
+               hpd_regs(2),
+               hpd_regs(3)
+};
+
+#define link_regs(id)\
+[id] = {\
+       LE_DCN10_REG_LIST(id), \
+       SRI(DP_DPHY_INTERNAL_CTRL, DP, id) \
+}
+
+static const struct dcn10_link_enc_registers link_enc_regs[] = {
+       link_regs(0),
+       link_regs(1),
+       link_regs(2),
+       link_regs(3)
+};
+
+static const struct dcn10_link_enc_shift le_shift = {
+               LINK_ENCODER_MASK_SH_LIST_DCN10(__SHIFT)
+};
+
+static const struct dcn10_link_enc_mask le_mask = {
+               LINK_ENCODER_MASK_SH_LIST_DCN10(_MASK)
+};
+
+static const struct dce_panel_cntl_registers panel_cntl_regs[] = {
+       { DCN_PANEL_CNTL_REG_LIST() }
+};
+
+static const struct dce_panel_cntl_shift panel_cntl_shift = {
+       DCE_PANEL_CNTL_MASK_SH_LIST(__SHIFT)
+};
+
+static const struct dce_panel_cntl_mask panel_cntl_mask = {
+       DCE_PANEL_CNTL_MASK_SH_LIST(_MASK)
+};
+
+static const struct dce110_aux_registers_shift aux_shift = {
+       DCN10_AUX_MASK_SH_LIST(__SHIFT)
+};
+
+static const struct dce110_aux_registers_mask aux_mask = {
+       DCN10_AUX_MASK_SH_LIST(_MASK)
+};
+
+#define ipp_regs(id)\
+[id] = {\
+       IPP_REG_LIST_DCN10(id),\
+}
+
+static const struct dcn10_ipp_registers ipp_regs[] = {
+       ipp_regs(0),
+       ipp_regs(1),
+       ipp_regs(2),
+       ipp_regs(3),
+};
+
+static const struct dcn10_ipp_shift ipp_shift = {
+               IPP_MASK_SH_LIST_DCN10(__SHIFT)
+};
+
+static const struct dcn10_ipp_mask ipp_mask = {
+               IPP_MASK_SH_LIST_DCN10(_MASK),
+};
+
+#define opp_regs(id)\
+[id] = {\
+       OPP_REG_LIST_DCN10(id),\
+}
+
+static const struct dcn10_opp_registers opp_regs[] = {
+       opp_regs(0),
+       opp_regs(1),
+       opp_regs(2),
+       opp_regs(3),
+};
+
+static const struct dcn10_opp_shift opp_shift = {
+               OPP_MASK_SH_LIST_DCN10(__SHIFT)
+};
+
+static const struct dcn10_opp_mask opp_mask = {
+               OPP_MASK_SH_LIST_DCN10(_MASK),
+};
+
+#define aux_engine_regs(id)\
+[id] = {\
+       AUX_COMMON_REG_LIST(id), \
+       .AUX_RESET_MASK = 0 \
+}
+
+static const struct dce110_aux_registers aux_engine_regs[] = {
+               aux_engine_regs(0),
+               aux_engine_regs(1),
+               aux_engine_regs(2),
+               aux_engine_regs(3),
+               aux_engine_regs(4),
+               aux_engine_regs(5)
+};
+
+#define tf_regs(id)\
+[id] = {\
+       TF_REG_LIST_DCN10(id),\
+}
+
+static const struct dcn_dpp_registers tf_regs[] = {
+       tf_regs(0),
+       tf_regs(1),
+       tf_regs(2),
+       tf_regs(3),
+};
+
+static const struct dcn_dpp_shift tf_shift = {
+       TF_REG_LIST_SH_MASK_DCN10(__SHIFT),
+       TF_DEBUG_REG_LIST_SH_DCN10
+
+};
+
+static const struct dcn_dpp_mask tf_mask = {
+       TF_REG_LIST_SH_MASK_DCN10(_MASK),
+       TF_DEBUG_REG_LIST_MASK_DCN10
+};
+
+static const struct dcn_mpc_registers mpc_regs = {
+               MPC_COMMON_REG_LIST_DCN1_0(0),
+               MPC_COMMON_REG_LIST_DCN1_0(1),
+               MPC_COMMON_REG_LIST_DCN1_0(2),
+               MPC_COMMON_REG_LIST_DCN1_0(3),
+               MPC_OUT_MUX_COMMON_REG_LIST_DCN1_0(0),
+               MPC_OUT_MUX_COMMON_REG_LIST_DCN1_0(1),
+               MPC_OUT_MUX_COMMON_REG_LIST_DCN1_0(2),
+               MPC_OUT_MUX_COMMON_REG_LIST_DCN1_0(3)
+};
+
+static const struct dcn_mpc_shift mpc_shift = {
+       MPC_COMMON_MASK_SH_LIST_DCN1_0(__SHIFT),\
+       SFRB(CUR_VUPDATE_LOCK_SET, CUR0_VUPDATE_LOCK_SET0, CUR0_VUPDATE_LOCK_SET, __SHIFT)
+};
+
+static const struct dcn_mpc_mask mpc_mask = {
+       MPC_COMMON_MASK_SH_LIST_DCN1_0(_MASK),\
+       SFRB(CUR_VUPDATE_LOCK_SET, CUR0_VUPDATE_LOCK_SET0, CUR0_VUPDATE_LOCK_SET, _MASK)
+};
+
+#define tg_regs(id)\
+[id] = {TG_COMMON_REG_LIST_DCN1_0(id)}
+
+static const struct dcn_optc_registers tg_regs[] = {
+       tg_regs(0),
+       tg_regs(1),
+       tg_regs(2),
+       tg_regs(3),
+};
+
+static const struct dcn_optc_shift tg_shift = {
+       TG_COMMON_MASK_SH_LIST_DCN1_0(__SHIFT)
+};
+
+static const struct dcn_optc_mask tg_mask = {
+       TG_COMMON_MASK_SH_LIST_DCN1_0(_MASK)
+};
+
+static const struct bios_registers bios_regs = {
+               NBIO_SR(BIOS_SCRATCH_3),
+               NBIO_SR(BIOS_SCRATCH_6)
+};
+
+#define hubp_regs(id)\
+[id] = {\
+       HUBP_REG_LIST_DCN10(id)\
+}
+
+static const struct dcn_mi_registers hubp_regs[] = {
+       hubp_regs(0),
+       hubp_regs(1),
+       hubp_regs(2),
+       hubp_regs(3),
+};
+
+static const struct dcn_mi_shift hubp_shift = {
+               HUBP_MASK_SH_LIST_DCN10(__SHIFT)
+};
+
+static const struct dcn_mi_mask hubp_mask = {
+               HUBP_MASK_SH_LIST_DCN10(_MASK)
+};
+
+static const struct dcn_hubbub_registers hubbub_reg = {
+               HUBBUB_REG_LIST_DCN10(0)
+};
+
+static const struct dcn_hubbub_shift hubbub_shift = {
+               HUBBUB_MASK_SH_LIST_DCN10(__SHIFT)
+};
+
+static const struct dcn_hubbub_mask hubbub_mask = {
+               HUBBUB_MASK_SH_LIST_DCN10(_MASK)
+};
+
+static int map_transmitter_id_to_phy_instance(
+       enum transmitter transmitter)
+{
+       switch (transmitter) {
+       case TRANSMITTER_UNIPHY_A:
+               return 0;
+       break;
+       case TRANSMITTER_UNIPHY_B:
+               return 1;
+       break;
+       case TRANSMITTER_UNIPHY_C:
+               return 2;
+       break;
+       case TRANSMITTER_UNIPHY_D:
+               return 3;
+       break;
+       default:
+               ASSERT(0);
+               return 0;
+       }
+}
+
+#define clk_src_regs(index, pllid)\
+[index] = {\
+       CS_COMMON_REG_LIST_DCN1_0(index, pllid),\
+}
+
+static const struct dce110_clk_src_regs clk_src_regs[] = {
+       clk_src_regs(0, A),
+       clk_src_regs(1, B),
+       clk_src_regs(2, C),
+       clk_src_regs(3, D)
+};
+
+static const struct dce110_clk_src_shift cs_shift = {
+               CS_COMMON_MASK_SH_LIST_DCN1_0(__SHIFT)
+};
+
+static const struct dce110_clk_src_mask cs_mask = {
+               CS_COMMON_MASK_SH_LIST_DCN1_0(_MASK)
+};
+
+static const struct resource_caps res_cap = {
+               .num_timing_generator = 4,
+               .num_opp = 4,
+               .num_video_plane = 4,
+               .num_audio = 4,
+               .num_stream_encoder = 4,
+               .num_pll = 4,
+               .num_ddc = 4,
+};
+
+static const struct resource_caps rv2_res_cap = {
+               .num_timing_generator = 3,
+               .num_opp = 3,
+               .num_video_plane = 3,
+               .num_audio = 3,
+               .num_stream_encoder = 3,
+               .num_pll = 3,
+               .num_ddc = 4,
+};
+
+static const struct dc_plane_cap plane_cap = {
+       .type = DC_PLANE_TYPE_DCN_UNIVERSAL,
+       .per_pixel_alpha = true,
+
+       .pixel_format_support = {
+                       .argb8888 = true,
+                       .nv12 = true,
+                       .fp16 = true,
+                       .p010 = true
+       },
+
+       .max_upscale_factor = {
+                       .argb8888 = 16000,
+                       .nv12 = 16000,
+                       .fp16 = 1
+       },
+
+       .max_downscale_factor = {
+                       .argb8888 = 250,
+                       .nv12 = 250,
+                       .fp16 = 1
+       }
+};
+
+static const struct dc_debug_options debug_defaults_drv = {
+               .sanity_checks = true,
+               .disable_dmcu = false,
+               .force_abm_enable = false,
+               .timing_trace = false,
+               .clock_trace = true,
+
+               /* raven smu dones't allow 0 disp clk,
+                * smu min disp clk limit is 50Mhz
+                * keep min disp clk 100Mhz avoid smu hang
+                */
+               .min_disp_clk_khz = 100000,
+
+               .disable_pplib_clock_request = false,
+               .disable_pplib_wm_range = false,
+               .pplib_wm_report_mode = WM_REPORT_DEFAULT,
+               .pipe_split_policy = MPC_SPLIT_DYNAMIC,
+               .force_single_disp_pipe_split = true,
+               .disable_dcc = DCC_ENABLE,
+               .voltage_align_fclk = true,
+               .disable_stereo_support = true,
+               .vsr_support = true,
+               .performance_trace = false,
+               .az_endpoint_mute_only = true,
+               .recovery_enabled = false, /*enable this by default after testing.*/
+               .max_downscale_src_width = 3840,
+               .underflow_assert_delay_us = 0xFFFFFFFF,
+               .enable_legacy_fast_update = true,
+               .using_dml2 = false,
+};
+
+static const struct dc_debug_options debug_defaults_diags = {
+               .disable_dmcu = false,
+               .force_abm_enable = false,
+               .timing_trace = true,
+               .clock_trace = true,
+               .disable_stutter = true,
+               .disable_pplib_clock_request = true,
+               .disable_pplib_wm_range = true,
+               .underflow_assert_delay_us = 0xFFFFFFFF,
+};
+
+static void dcn10_dpp_destroy(struct dpp **dpp)
+{
+       kfree(TO_DCN10_DPP(*dpp));
+       *dpp = NULL;
+}
+
+static struct dpp *dcn10_dpp_create(
+       struct dc_context *ctx,
+       uint32_t inst)
+{
+       struct dcn10_dpp *dpp =
+               kzalloc(sizeof(struct dcn10_dpp), GFP_KERNEL);
+
+       if (!dpp)
+               return NULL;
+
+       dpp1_construct(dpp, ctx, inst,
+                      &tf_regs[inst], &tf_shift, &tf_mask);
+       return &dpp->base;
+}
+
+static struct input_pixel_processor *dcn10_ipp_create(
+       struct dc_context *ctx, uint32_t inst)
+{
+       struct dcn10_ipp *ipp =
+               kzalloc(sizeof(struct dcn10_ipp), GFP_KERNEL);
+
+       if (!ipp) {
+               BREAK_TO_DEBUGGER();
+               return NULL;
+       }
+
+       dcn10_ipp_construct(ipp, ctx, inst,
+                       &ipp_regs[inst], &ipp_shift, &ipp_mask);
+       return &ipp->base;
+}
+
+
+static struct output_pixel_processor *dcn10_opp_create(
+       struct dc_context *ctx, uint32_t inst)
+{
+       struct dcn10_opp *opp =
+               kzalloc(sizeof(struct dcn10_opp), GFP_KERNEL);
+
+       if (!opp) {
+               BREAK_TO_DEBUGGER();
+               return NULL;
+       }
+
+       dcn10_opp_construct(opp, ctx, inst,
+                       &opp_regs[inst], &opp_shift, &opp_mask);
+       return &opp->base;
+}
+
+static struct dce_aux *dcn10_aux_engine_create(struct dc_context *ctx,
+                                              uint32_t inst)
+{
+       struct aux_engine_dce110 *aux_engine =
+               kzalloc(sizeof(struct aux_engine_dce110), GFP_KERNEL);
+
+       if (!aux_engine)
+               return NULL;
+
+       dce110_aux_engine_construct(aux_engine, ctx, inst,
+                                   SW_AUX_TIMEOUT_PERIOD_MULTIPLIER * AUX_TIMEOUT_PERIOD,
+                                   &aux_engine_regs[inst],
+                                       &aux_mask,
+                                       &aux_shift,
+                                       ctx->dc->caps.extended_aux_timeout_support);
+
+       return &aux_engine->base;
+}
+#define i2c_inst_regs(id) { I2C_HW_ENGINE_COMMON_REG_LIST(id) }
+
+static const struct dce_i2c_registers i2c_hw_regs[] = {
+               i2c_inst_regs(1),
+               i2c_inst_regs(2),
+               i2c_inst_regs(3),
+               i2c_inst_regs(4),
+               i2c_inst_regs(5),
+               i2c_inst_regs(6),
+};
+
+static const struct dce_i2c_shift i2c_shifts = {
+               I2C_COMMON_MASK_SH_LIST_DCE110(__SHIFT)
+};
+
+static const struct dce_i2c_mask i2c_masks = {
+               I2C_COMMON_MASK_SH_LIST_DCE110(_MASK)
+};
+
+static struct dce_i2c_hw *dcn10_i2c_hw_create(struct dc_context *ctx,
+                                             uint32_t inst)
+{
+       struct dce_i2c_hw *dce_i2c_hw =
+               kzalloc(sizeof(struct dce_i2c_hw), GFP_KERNEL);
+
+       if (!dce_i2c_hw)
+               return NULL;
+
+       dcn1_i2c_hw_construct(dce_i2c_hw, ctx, inst,
+                                   &i2c_hw_regs[inst], &i2c_shifts, &i2c_masks);
+
+       return dce_i2c_hw;
+}
+static struct mpc *dcn10_mpc_create(struct dc_context *ctx)
+{
+       struct dcn10_mpc *mpc10 = kzalloc(sizeof(struct dcn10_mpc),
+                                         GFP_KERNEL);
+
+       if (!mpc10)
+               return NULL;
+
+       dcn10_mpc_construct(mpc10, ctx,
+                       &mpc_regs,
+                       &mpc_shift,
+                       &mpc_mask,
+                       4);
+
+       return &mpc10->base;
+}
+
+static struct hubbub *dcn10_hubbub_create(struct dc_context *ctx)
+{
+       struct dcn10_hubbub *dcn10_hubbub = kzalloc(sizeof(struct dcn10_hubbub),
+                                         GFP_KERNEL);
+
+       if (!dcn10_hubbub)
+               return NULL;
+
+       hubbub1_construct(&dcn10_hubbub->base, ctx,
+                       &hubbub_reg,
+                       &hubbub_shift,
+                       &hubbub_mask);
+
+       return &dcn10_hubbub->base;
+}
+
+static struct timing_generator *dcn10_timing_generator_create(
+               struct dc_context *ctx,
+               uint32_t instance)
+{
+       struct optc *tgn10 =
+               kzalloc(sizeof(struct optc), GFP_KERNEL);
+
+       if (!tgn10)
+               return NULL;
+
+       tgn10->base.inst = instance;
+       tgn10->base.ctx = ctx;
+
+       tgn10->tg_regs = &tg_regs[instance];
+       tgn10->tg_shift = &tg_shift;
+       tgn10->tg_mask = &tg_mask;
+
+       dcn10_timing_generator_init(tgn10);
+
+       return &tgn10->base;
+}
+
+static const struct encoder_feature_support link_enc_feature = {
+               .max_hdmi_deep_color = COLOR_DEPTH_121212,
+               .max_hdmi_pixel_clock = 600000,
+               .hdmi_ycbcr420_supported = true,
+               .dp_ycbcr420_supported = true,
+               .flags.bits.IS_HBR2_CAPABLE = true,
+               .flags.bits.IS_HBR3_CAPABLE = true,
+               .flags.bits.IS_TPS3_CAPABLE = true,
+               .flags.bits.IS_TPS4_CAPABLE = true
+};
+
+static struct link_encoder *dcn10_link_encoder_create(
+       struct dc_context *ctx,
+       const struct encoder_init_data *enc_init_data)
+{
+       struct dcn10_link_encoder *enc10 =
+               kzalloc(sizeof(struct dcn10_link_encoder), GFP_KERNEL);
+       int link_regs_id;
+
+       if (!enc10)
+               return NULL;
+
+       link_regs_id =
+               map_transmitter_id_to_phy_instance(enc_init_data->transmitter);
+
+       dcn10_link_encoder_construct(enc10,
+                                     enc_init_data,
+                                     &link_enc_feature,
+                                     &link_enc_regs[link_regs_id],
+                                     &link_enc_aux_regs[enc_init_data->channel - 1],
+                                     &link_enc_hpd_regs[enc_init_data->hpd_source],
+                                     &le_shift,
+                                     &le_mask);
+
+       return &enc10->base;
+}
+
+static struct panel_cntl *dcn10_panel_cntl_create(const struct panel_cntl_init_data *init_data)
+{
+       struct dce_panel_cntl *panel_cntl =
+               kzalloc(sizeof(struct dce_panel_cntl), GFP_KERNEL);
+
+       if (!panel_cntl)
+               return NULL;
+
+       dce_panel_cntl_construct(panel_cntl,
+                       init_data,
+                       &panel_cntl_regs[init_data->inst],
+                       &panel_cntl_shift,
+                       &panel_cntl_mask);
+
+       return &panel_cntl->base;
+}
+
+static struct clock_source *dcn10_clock_source_create(
+       struct dc_context *ctx,
+       struct dc_bios *bios,
+       enum clock_source_id id,
+       const struct dce110_clk_src_regs *regs,
+       bool dp_clk_src)
+{
+       struct dce110_clk_src *clk_src =
+               kzalloc(sizeof(struct dce110_clk_src), GFP_KERNEL);
+
+       if (!clk_src)
+               return NULL;
+
+       if (dce112_clk_src_construct(clk_src, ctx, bios, id,
+                       regs, &cs_shift, &cs_mask)) {
+               clk_src->base.dp_clk_src = dp_clk_src;
+               return &clk_src->base;
+       }
+
+       kfree(clk_src);
+       BREAK_TO_DEBUGGER();
+       return NULL;
+}
+
+static void read_dce_straps(
+       struct dc_context *ctx,
+       struct resource_straps *straps)
+{
+       generic_reg_get(ctx, mmDC_PINSTRAPS + BASE(mmDC_PINSTRAPS_BASE_IDX),
+               FN(DC_PINSTRAPS, DC_PINSTRAPS_AUDIO), &straps->dc_pinstraps_audio);
+}
+
+static struct audio *create_audio(
+               struct dc_context *ctx, unsigned int inst)
+{
+       return dce_audio_create(ctx, inst,
+                       &audio_regs[inst], &audio_shift, &audio_mask);
+}
+
+static struct stream_encoder *dcn10_stream_encoder_create(
+       enum engine_id eng_id,
+       struct dc_context *ctx)
+{
+       struct dcn10_stream_encoder *enc1 =
+               kzalloc(sizeof(struct dcn10_stream_encoder), GFP_KERNEL);
+
+       if (!enc1)
+               return NULL;
+
+       dcn10_stream_encoder_construct(enc1, ctx, ctx->dc_bios, eng_id,
+                                       &stream_enc_regs[eng_id],
+                                       &se_shift, &se_mask);
+       return &enc1->base;
+}
+
+static const struct dce_hwseq_registers hwseq_reg = {
+               HWSEQ_DCN1_REG_LIST()
+};
+
+static const struct dce_hwseq_shift hwseq_shift = {
+               HWSEQ_DCN1_MASK_SH_LIST(__SHIFT)
+};
+
+static const struct dce_hwseq_mask hwseq_mask = {
+               HWSEQ_DCN1_MASK_SH_LIST(_MASK)
+};
+
+static struct dce_hwseq *dcn10_hwseq_create(
+       struct dc_context *ctx)
+{
+       struct dce_hwseq *hws = kzalloc(sizeof(struct dce_hwseq), GFP_KERNEL);
+
+       if (hws) {
+               hws->ctx = ctx;
+               hws->regs = &hwseq_reg;
+               hws->shifts = &hwseq_shift;
+               hws->masks = &hwseq_mask;
+               hws->wa.DEGVIDCN10_253 = true;
+               hws->wa.false_optc_underflow = true;
+               hws->wa.DEGVIDCN10_254 = true;
+
+               if ((ctx->asic_id.chip_family == FAMILY_RV) &&
+                       ASICREV_IS_RAVEN2(ctx->asic_id.hw_internal_rev))
+                       switch (ctx->asic_id.pci_revision_id) {
+                       case PRID_POLLOCK_94:
+                       case PRID_POLLOCK_95:
+                       case PRID_POLLOCK_E9:
+                       case PRID_POLLOCK_EA:
+                       case PRID_POLLOCK_EB:
+                               hws->wa.wait_hubpret_read_start_during_mpo_transition = true;
+                               break;
+                       default:
+                               hws->wa.wait_hubpret_read_start_during_mpo_transition = false;
+                               break;
+                       }
+       }
+       return hws;
+}
+
+static const struct resource_create_funcs res_create_funcs = {
+       .read_dce_straps = read_dce_straps,
+       .create_audio = create_audio,
+       .create_stream_encoder = dcn10_stream_encoder_create,
+       .create_hwseq = dcn10_hwseq_create,
+};
+
+static void dcn10_clock_source_destroy(struct clock_source **clk_src)
+{
+       kfree(TO_DCE110_CLK_SRC(*clk_src));
+       *clk_src = NULL;
+}
+
+static struct pp_smu_funcs *dcn10_pp_smu_create(struct dc_context *ctx)
+{
+       struct pp_smu_funcs *pp_smu = kzalloc(sizeof(*pp_smu), GFP_KERNEL);
+
+       if (!pp_smu)
+               return pp_smu;
+
+       dm_pp_get_funcs(ctx, pp_smu);
+       return pp_smu;
+}
+
+static void dcn10_resource_destruct(struct dcn10_resource_pool *pool)
+{
+       unsigned int i;
+
+       for (i = 0; i < pool->base.stream_enc_count; i++) {
+               if (pool->base.stream_enc[i] != NULL) {
+                       kfree(DCN10STRENC_FROM_STRENC(pool->base.stream_enc[i]));
+                       pool->base.stream_enc[i] = NULL;
+               }
+       }
+
+       if (pool->base.mpc != NULL) {
+               kfree(TO_DCN10_MPC(pool->base.mpc));
+               pool->base.mpc = NULL;
+       }
+
+       kfree(pool->base.hubbub);
+       pool->base.hubbub = NULL;
+
+       for (i = 0; i < pool->base.pipe_count; i++) {
+               if (pool->base.opps[i] != NULL)
+                       pool->base.opps[i]->funcs->opp_destroy(&pool->base.opps[i]);
+
+               if (pool->base.dpps[i] != NULL)
+                       dcn10_dpp_destroy(&pool->base.dpps[i]);
+
+               if (pool->base.ipps[i] != NULL)
+                       pool->base.ipps[i]->funcs->ipp_destroy(&pool->base.ipps[i]);
+
+               if (pool->base.hubps[i] != NULL) {
+                       kfree(TO_DCN10_HUBP(pool->base.hubps[i]));
+                       pool->base.hubps[i] = NULL;
+               }
+
+               if (pool->base.irqs != NULL) {
+                       dal_irq_service_destroy(&pool->base.irqs);
+               }
+
+               if (pool->base.timing_generators[i] != NULL)    {
+                       kfree(DCN10TG_FROM_TG(pool->base.timing_generators[i]));
+                       pool->base.timing_generators[i] = NULL;
+               }
+       }
+
+       for (i = 0; i < pool->base.res_cap->num_ddc; i++) {
+               if (pool->base.engines[i] != NULL)
+                       dce110_engine_destroy(&pool->base.engines[i]);
+               kfree(pool->base.hw_i2cs[i]);
+               pool->base.hw_i2cs[i] = NULL;
+               kfree(pool->base.sw_i2cs[i]);
+               pool->base.sw_i2cs[i] = NULL;
+       }
+
+       for (i = 0; i < pool->base.audio_count; i++) {
+               if (pool->base.audios[i])
+                       dce_aud_destroy(&pool->base.audios[i]);
+       }
+
+       for (i = 0; i < pool->base.clk_src_count; i++) {
+               if (pool->base.clock_sources[i] != NULL) {
+                       dcn10_clock_source_destroy(&pool->base.clock_sources[i]);
+                       pool->base.clock_sources[i] = NULL;
+               }
+       }
+
+       if (pool->base.dp_clock_source != NULL) {
+               dcn10_clock_source_destroy(&pool->base.dp_clock_source);
+               pool->base.dp_clock_source = NULL;
+       }
+
+       if (pool->base.abm != NULL)
+               dce_abm_destroy(&pool->base.abm);
+
+       if (pool->base.dmcu != NULL)
+               dce_dmcu_destroy(&pool->base.dmcu);
+
+       kfree(pool->base.pp_smu);
+}
+
+static struct hubp *dcn10_hubp_create(
+       struct dc_context *ctx,
+       uint32_t inst)
+{
+       struct dcn10_hubp *hubp1 =
+               kzalloc(sizeof(struct dcn10_hubp), GFP_KERNEL);
+
+       if (!hubp1)
+               return NULL;
+
+       dcn10_hubp_construct(hubp1, ctx, inst,
+                            &hubp_regs[inst], &hubp_shift, &hubp_mask);
+       return &hubp1->base;
+}
+
+static void get_pixel_clock_parameters(
+       const struct pipe_ctx *pipe_ctx,
+       struct pixel_clk_params *pixel_clk_params)
+{
+       const struct dc_stream_state *stream = pipe_ctx->stream;
+       pixel_clk_params->requested_pix_clk_100hz = stream->timing.pix_clk_100hz;
+       pixel_clk_params->encoder_object_id = stream->link->link_enc->id;
+       pixel_clk_params->signal_type = pipe_ctx->stream->signal;
+       pixel_clk_params->controller_id = pipe_ctx->stream_res.tg->inst + 1;
+       /* TODO: un-hardcode*/
+       pixel_clk_params->requested_sym_clk = LINK_RATE_LOW *
+               LINK_RATE_REF_FREQ_IN_KHZ;
+       pixel_clk_params->flags.ENABLE_SS = 0;
+       pixel_clk_params->color_depth =
+               stream->timing.display_color_depth;
+       pixel_clk_params->flags.DISPLAY_BLANKED = 1;
+       pixel_clk_params->pixel_encoding = stream->timing.pixel_encoding;
+
+       if (stream->timing.pixel_encoding == PIXEL_ENCODING_YCBCR422)
+               pixel_clk_params->color_depth = COLOR_DEPTH_888;
+
+       if (stream->timing.pixel_encoding == PIXEL_ENCODING_YCBCR420)
+               pixel_clk_params->requested_pix_clk_100hz  /= 2;
+       if (stream->timing.timing_3d_format == TIMING_3D_FORMAT_HW_FRAME_PACKING)
+               pixel_clk_params->requested_pix_clk_100hz *= 2;
+
+}
+
+static void build_clamping_params(struct dc_stream_state *stream)
+{
+       stream->clamping.clamping_level = CLAMPING_FULL_RANGE;
+       stream->clamping.c_depth = stream->timing.display_color_depth;
+       stream->clamping.pixel_encoding = stream->timing.pixel_encoding;
+}
+
+static void build_pipe_hw_param(struct pipe_ctx *pipe_ctx)
+{
+
+       get_pixel_clock_parameters(pipe_ctx, &pipe_ctx->stream_res.pix_clk_params);
+
+       pipe_ctx->clock_source->funcs->get_pix_clk_dividers(
+               pipe_ctx->clock_source,
+               &pipe_ctx->stream_res.pix_clk_params,
+               &pipe_ctx->pll_settings);
+
+       pipe_ctx->stream->clamping.pixel_encoding = pipe_ctx->stream->timing.pixel_encoding;
+
+       resource_build_bit_depth_reduction_params(pipe_ctx->stream,
+                                       &pipe_ctx->stream->bit_depth_params);
+       build_clamping_params(pipe_ctx->stream);
+}
+
+static enum dc_status build_mapped_resource(
+               const struct dc *dc,
+               struct dc_state *context,
+               struct dc_stream_state *stream)
+{
+       struct pipe_ctx *pipe_ctx = resource_get_otg_master_for_stream(&context->res_ctx, stream);
+
+       if (!pipe_ctx)
+               return DC_ERROR_UNEXPECTED;
+
+       build_pipe_hw_param(pipe_ctx);
+       return DC_OK;
+}
+
+static enum dc_status dcn10_add_stream_to_ctx(
+               struct dc *dc,
+               struct dc_state *new_ctx,
+               struct dc_stream_state *dc_stream)
+{
+       enum dc_status result = DC_ERROR_UNEXPECTED;
+
+       result = resource_map_pool_resources(dc, new_ctx, dc_stream);
+
+       if (result == DC_OK)
+               result = resource_map_phy_clock_resources(dc, new_ctx, dc_stream);
+
+
+       if (result == DC_OK)
+               result = build_mapped_resource(dc, new_ctx, dc_stream);
+
+       return result;
+}
+
+static struct pipe_ctx *dcn10_acquire_free_pipe_for_layer(
+               const struct dc_state *cur_ctx,
+               struct dc_state *new_ctx,
+               const struct resource_pool *pool,
+               const struct pipe_ctx *opp_head_pipe)
+{
+       struct resource_context *res_ctx = &new_ctx->res_ctx;
+       struct pipe_ctx *head_pipe = resource_get_otg_master_for_stream(res_ctx, opp_head_pipe->stream);
+       struct pipe_ctx *idle_pipe = resource_find_free_secondary_pipe_legacy(res_ctx, pool, head_pipe);
+
+       if (!head_pipe) {
+               ASSERT(0);
+               return NULL;
+       }
+
+       if (!idle_pipe)
+               return NULL;
+
+       idle_pipe->stream = head_pipe->stream;
+       idle_pipe->stream_res.tg = head_pipe->stream_res.tg;
+       idle_pipe->stream_res.abm = head_pipe->stream_res.abm;
+       idle_pipe->stream_res.opp = head_pipe->stream_res.opp;
+
+       idle_pipe->plane_res.hubp = pool->hubps[idle_pipe->pipe_idx];
+       idle_pipe->plane_res.ipp = pool->ipps[idle_pipe->pipe_idx];
+       idle_pipe->plane_res.dpp = pool->dpps[idle_pipe->pipe_idx];
+       idle_pipe->plane_res.mpcc_inst = pool->dpps[idle_pipe->pipe_idx]->inst;
+
+       return idle_pipe;
+}
+
+static bool dcn10_get_dcc_compression_cap(const struct dc *dc,
+               const struct dc_dcc_surface_param *input,
+               struct dc_surface_dcc_cap *output)
+{
+       return dc->res_pool->hubbub->funcs->get_dcc_compression_cap(
+                       dc->res_pool->hubbub,
+                       input,
+                       output);
+}
+
+static void dcn10_destroy_resource_pool(struct resource_pool **pool)
+{
+       struct dcn10_resource_pool *dcn10_pool = TO_DCN10_RES_POOL(*pool);
+
+       dcn10_resource_destruct(dcn10_pool);
+       kfree(dcn10_pool);
+       *pool = NULL;
+}
+
+static bool dcn10_validate_bandwidth(
+               struct dc *dc,
+               struct dc_state *context,
+               bool fast_validate)
+{
+       bool voltage_supported;
+
+       DC_FP_START();
+       voltage_supported = dcn_validate_bandwidth(dc, context, fast_validate);
+       DC_FP_END();
+
+       return voltage_supported;
+}
+
+static enum dc_status dcn10_validate_plane(const struct dc_plane_state *plane_state, struct dc_caps *caps)
+{
+       if (plane_state->format >= SURFACE_PIXEL_FORMAT_VIDEO_BEGIN
+                       && caps->max_video_width != 0
+                       && plane_state->src_rect.width > caps->max_video_width)
+               return DC_FAIL_SURFACE_VALIDATE;
+
+       return DC_OK;
+}
+
+static enum dc_status dcn10_validate_global(struct dc *dc, struct dc_state *context)
+{
+       int i, j;
+       bool video_down_scaled = false;
+       bool video_large = false;
+       bool desktop_large = false;
+       bool dcc_disabled = false;
+       bool mpo_enabled = false;
+
+       for (i = 0; i < context->stream_count; i++) {
+               if (context->stream_status[i].plane_count == 0)
+                       continue;
+
+               if (context->stream_status[i].plane_count > 2)
+                       return DC_FAIL_UNSUPPORTED_1;
+
+               if (context->stream_status[i].plane_count > 1)
+                       mpo_enabled = true;
+
+               for (j = 0; j < context->stream_status[i].plane_count; j++) {
+                       struct dc_plane_state *plane =
+                               context->stream_status[i].plane_states[j];
+
+
+                       if (plane->format >= SURFACE_PIXEL_FORMAT_VIDEO_BEGIN) {
+
+                               if (plane->src_rect.width > plane->dst_rect.width ||
+                                               plane->src_rect.height > plane->dst_rect.height)
+                                       video_down_scaled = true;
+
+                               if (plane->src_rect.width >= 3840)
+                                       video_large = true;
+
+                       } else {
+                               if (plane->src_rect.width >= 3840)
+                                       desktop_large = true;
+                               if (!plane->dcc.enable)
+                                       dcc_disabled = true;
+                       }
+               }
+       }
+
+       /* Disable MPO in multi-display configurations. */
+       if (context->stream_count > 1 && mpo_enabled)
+               return DC_FAIL_UNSUPPORTED_1;
+
+       /*
+        * Workaround: On DCN10 there is UMC issue that causes underflow when
+        * playing 4k video on 4k desktop with video downscaled and single channel
+        * memory
+        */
+       if (video_large && desktop_large && video_down_scaled && dcc_disabled &&
+                       dc->dcn_soc->number_of_channels == 1)
+               return DC_FAIL_SURFACE_VALIDATE;
+
+       return DC_OK;
+}
+
+static enum dc_status dcn10_patch_unknown_plane_state(struct dc_plane_state *plane_state)
+{
+       enum surface_pixel_format surf_pix_format = plane_state->format;
+       unsigned int bpp = resource_pixel_format_to_bpp(surf_pix_format);
+
+       enum swizzle_mode_values swizzle = DC_SW_LINEAR;
+
+       if (bpp == 64)
+               swizzle = DC_SW_64KB_D;
+       else
+               swizzle = DC_SW_64KB_S;
+
+       plane_state->tiling_info.gfx9.swizzle = swizzle;
+       return DC_OK;
+}
+
+struct stream_encoder *dcn10_find_first_free_match_stream_enc_for_link(
+               struct resource_context *res_ctx,
+               const struct resource_pool *pool,
+               struct dc_stream_state *stream)
+{
+       int i;
+       int j = -1;
+       struct dc_link *link = stream->link;
+
+       for (i = 0; i < pool->stream_enc_count; i++) {
+               if (!res_ctx->is_stream_enc_acquired[i] &&
+                               pool->stream_enc[i]) {
+                       /* Store first available for MST second display
+                        * in daisy chain use case
+                        */
+                       j = i;
+                       if (link->ep_type == DISPLAY_ENDPOINT_PHY && pool->stream_enc[i]->id ==
+                                       link->link_enc->preferred_engine)
+                               return pool->stream_enc[i];
+               }
+       }
+
+       /*
+        * For CZ and later, we can allow DIG FE and BE to differ for all display types
+        */
+
+       if (j >= 0)
+               return pool->stream_enc[j];
+
+       return NULL;
+}
+
+static const struct dc_cap_funcs cap_funcs = {
+       .get_dcc_compression_cap = dcn10_get_dcc_compression_cap
+};
+
+static const struct resource_funcs dcn10_res_pool_funcs = {
+       .destroy = dcn10_destroy_resource_pool,
+       .link_enc_create = dcn10_link_encoder_create,
+       .panel_cntl_create = dcn10_panel_cntl_create,
+       .validate_bandwidth = dcn10_validate_bandwidth,
+       .acquire_free_pipe_as_secondary_dpp_pipe = dcn10_acquire_free_pipe_for_layer,
+       .validate_plane = dcn10_validate_plane,
+       .validate_global = dcn10_validate_global,
+       .add_stream_to_ctx = dcn10_add_stream_to_ctx,
+       .patch_unknown_plane_state = dcn10_patch_unknown_plane_state,
+       .find_first_free_match_stream_enc_for_link = dcn10_find_first_free_match_stream_enc_for_link
+};
+
+static uint32_t read_pipe_fuses(struct dc_context *ctx)
+{
+       uint32_t value = dm_read_reg_soc15(ctx, mmCC_DC_PIPE_DIS, 0);
+       /* RV1 support max 4 pipes */
+       value = value & 0xf;
+       return value;
+}
+
+static bool verify_clock_values(struct dm_pp_clock_levels_with_voltage *clks)
+{
+       int i;
+
+       if (clks->num_levels == 0)
+               return false;
+
+       for (i = 0; i < clks->num_levels; i++)
+               /* Ensure that the result is sane */
+               if (clks->data[i].clocks_in_khz == 0)
+                       return false;
+
+       return true;
+}
+
+static bool dcn10_resource_construct(
+       uint8_t num_virtual_links,
+       struct dc *dc,
+       struct dcn10_resource_pool *pool)
+{
+       int i;
+       int j;
+       struct dc_context *ctx = dc->ctx;
+       uint32_t pipe_fuses = read_pipe_fuses(ctx);
+       struct dm_pp_clock_levels_with_voltage fclks = {0}, dcfclks = {0};
+       int min_fclk_khz, min_dcfclk_khz, socclk_khz;
+       bool res;
+
+       ctx->dc_bios->regs = &bios_regs;
+
+       if (ctx->dce_version == DCN_VERSION_1_01)
+               pool->base.res_cap = &rv2_res_cap;
+       else
+               pool->base.res_cap = &res_cap;
+       pool->base.funcs = &dcn10_res_pool_funcs;
+
+       /*
+        * TODO fill in from actual raven resource when we create
+        * more than virtual encoder
+        */
+
+       /*************************************************
+        *  Resource + asic cap harcoding                *
+        *************************************************/
+       pool->base.underlay_pipe_index = NO_UNDERLAY_PIPE;
+
+       /* max pipe num for ASIC before check pipe fuses */
+       pool->base.pipe_count = pool->base.res_cap->num_timing_generator;
+
+       if (dc->ctx->dce_version == DCN_VERSION_1_01)
+               pool->base.pipe_count = 3;
+       dc->caps.max_video_width = 3840;
+       dc->caps.max_downscale_ratio = 200;
+       dc->caps.i2c_speed_in_khz = 100;
+       dc->caps.i2c_speed_in_khz_hdcp = 100; /*1.4 w/a not applied by default*/
+       dc->caps.max_cursor_size = 256;
+       dc->caps.min_horizontal_blanking_period = 80;
+       dc->caps.max_slave_planes = 1;
+       dc->caps.max_slave_yuv_planes = 1;
+       dc->caps.max_slave_rgb_planes = 0;
+       dc->caps.is_apu = true;
+       dc->caps.post_blend_color_processing = false;
+       dc->caps.extended_aux_timeout_support = false;
+
+       /* Raven DP PHY HBR2 eye diagram pattern is not stable. Use TP4 */
+       dc->caps.force_dp_tps4_for_cp2520 = true;
+
+       /* Color pipeline capabilities */
+       dc->caps.color.dpp.dcn_arch = 1;
+       dc->caps.color.dpp.input_lut_shared = 1;
+       dc->caps.color.dpp.icsc = 1;
+       dc->caps.color.dpp.dgam_ram = 1;
+       dc->caps.color.dpp.dgam_rom_caps.srgb = 1;
+       dc->caps.color.dpp.dgam_rom_caps.bt2020 = 1;
+       dc->caps.color.dpp.dgam_rom_caps.gamma2_2 = 0;
+       dc->caps.color.dpp.dgam_rom_caps.pq = 0;
+       dc->caps.color.dpp.dgam_rom_caps.hlg = 0;
+       dc->caps.color.dpp.post_csc = 0;
+       dc->caps.color.dpp.gamma_corr = 0;
+       dc->caps.color.dpp.dgam_rom_for_yuv = 1;
+
+       dc->caps.color.dpp.hw_3d_lut = 0;
+       dc->caps.color.dpp.ogam_ram = 1; // RGAM on DCN1
+       dc->caps.color.dpp.ogam_rom_caps.srgb = 1;
+       dc->caps.color.dpp.ogam_rom_caps.bt2020 = 1;
+       dc->caps.color.dpp.ogam_rom_caps.gamma2_2 = 0;
+       dc->caps.color.dpp.ogam_rom_caps.pq = 0;
+       dc->caps.color.dpp.ogam_rom_caps.hlg = 0;
+       dc->caps.color.dpp.ocsc = 1;
+
+       /* no post-blend color operations */
+       dc->caps.color.mpc.gamut_remap = 0;
+       dc->caps.color.mpc.num_3dluts = 0;
+       dc->caps.color.mpc.shared_3d_lut = 0;
+       dc->caps.color.mpc.ogam_ram = 0;
+       dc->caps.color.mpc.ogam_rom_caps.srgb = 0;
+       dc->caps.color.mpc.ogam_rom_caps.bt2020 = 0;
+       dc->caps.color.mpc.ogam_rom_caps.gamma2_2 = 0;
+       dc->caps.color.mpc.ogam_rom_caps.pq = 0;
+       dc->caps.color.mpc.ogam_rom_caps.hlg = 0;
+       dc->caps.color.mpc.ocsc = 0;
+
+       if (dc->ctx->dce_environment == DCE_ENV_PRODUCTION_DRV)
+               dc->debug = debug_defaults_drv;
+       else
+               dc->debug = debug_defaults_diags;
+
+       /*************************************************
+        *  Create resources                             *
+        *************************************************/
+
+       pool->base.clock_sources[DCN10_CLK_SRC_PLL0] =
+                       dcn10_clock_source_create(ctx, ctx->dc_bios,
+                               CLOCK_SOURCE_COMBO_PHY_PLL0,
+                               &clk_src_regs[0], false);
+       pool->base.clock_sources[DCN10_CLK_SRC_PLL1] =
+                       dcn10_clock_source_create(ctx, ctx->dc_bios,
+                               CLOCK_SOURCE_COMBO_PHY_PLL1,
+                               &clk_src_regs[1], false);
+       pool->base.clock_sources[DCN10_CLK_SRC_PLL2] =
+                       dcn10_clock_source_create(ctx, ctx->dc_bios,
+                               CLOCK_SOURCE_COMBO_PHY_PLL2,
+                               &clk_src_regs[2], false);
+
+       if (dc->ctx->dce_version == DCN_VERSION_1_0) {
+               pool->base.clock_sources[DCN10_CLK_SRC_PLL3] =
+                               dcn10_clock_source_create(ctx, ctx->dc_bios,
+                                       CLOCK_SOURCE_COMBO_PHY_PLL3,
+                                       &clk_src_regs[3], false);
+       }
+
+       pool->base.clk_src_count = DCN10_CLK_SRC_TOTAL;
+
+       if (dc->ctx->dce_version == DCN_VERSION_1_01)
+               pool->base.clk_src_count = DCN101_CLK_SRC_TOTAL;
+
+       pool->base.dp_clock_source =
+                       dcn10_clock_source_create(ctx, ctx->dc_bios,
+                               CLOCK_SOURCE_ID_DP_DTO,
+                               /* todo: not reuse phy_pll registers */
+                               &clk_src_regs[0], true);
+
+       for (i = 0; i < pool->base.clk_src_count; i++) {
+               if (pool->base.clock_sources[i] == NULL) {
+                       dm_error("DC: failed to create clock sources!\n");
+                       BREAK_TO_DEBUGGER();
+                       goto fail;
+               }
+       }
+
+       pool->base.dmcu = dcn10_dmcu_create(ctx,
+                       &dmcu_regs,
+                       &dmcu_shift,
+                       &dmcu_mask);
+       if (pool->base.dmcu == NULL) {
+               dm_error("DC: failed to create dmcu!\n");
+               BREAK_TO_DEBUGGER();
+               goto fail;
+       }
+
+       pool->base.abm = dce_abm_create(ctx,
+                       &abm_regs,
+                       &abm_shift,
+                       &abm_mask);
+       if (pool->base.abm == NULL) {
+               dm_error("DC: failed to create abm!\n");
+               BREAK_TO_DEBUGGER();
+               goto fail;
+       }
+
+       dml_init_instance(&dc->dml, &dcn1_0_soc, &dcn1_0_ip, DML_PROJECT_RAVEN1);
+       memcpy(dc->dcn_ip, &dcn10_ip_defaults, sizeof(dcn10_ip_defaults));
+       memcpy(dc->dcn_soc, &dcn10_soc_defaults, sizeof(dcn10_soc_defaults));
+
+       DC_FP_START();
+       dcn10_resource_construct_fp(dc);
+       DC_FP_END();
+
+       if (!dc->config.is_vmin_only_asic)
+               if (ASICREV_IS_RAVEN2(dc->ctx->asic_id.hw_internal_rev))
+                       switch (dc->ctx->asic_id.pci_revision_id) {
+                       case PRID_DALI_DE:
+                       case PRID_DALI_DF:
+                       case PRID_DALI_E3:
+                       case PRID_DALI_E4:
+                       case PRID_POLLOCK_94:
+                       case PRID_POLLOCK_95:
+                       case PRID_POLLOCK_E9:
+                       case PRID_POLLOCK_EA:
+                       case PRID_POLLOCK_EB:
+                               dc->config.is_vmin_only_asic = true;
+                               break;
+                       default:
+                               break;
+                       }
+
+       pool->base.pp_smu = dcn10_pp_smu_create(ctx);
+
+       /*
+        * Right now SMU/PPLIB and DAL all have the AZ D3 force PME notification *
+        * implemented. So AZ D3 should work.For issue 197007.                   *
+        */
+       if (pool->base.pp_smu != NULL
+                       && pool->base.pp_smu->rv_funcs.set_pme_wa_enable != NULL)
+               dc->debug.az_endpoint_mute_only = false;
+
+
+       if (!dc->debug.disable_pplib_clock_request) {
+               /*
+                * TODO: This is not the proper way to obtain
+                * fabric_and_dram_bandwidth, should be min(fclk, memclk).
+                */
+               res = dm_pp_get_clock_levels_by_type_with_voltage(
+                               ctx, DM_PP_CLOCK_TYPE_FCLK, &fclks);
+
+               DC_FP_START();
+
+               if (res)
+                       res = verify_clock_values(&fclks);
+
+               if (res)
+                       dcn_bw_update_from_pplib_fclks(dc, &fclks);
+               else
+                       BREAK_TO_DEBUGGER();
+
+               DC_FP_END();
+
+               res = dm_pp_get_clock_levels_by_type_with_voltage(
+                       ctx, DM_PP_CLOCK_TYPE_DCFCLK, &dcfclks);
+
+               DC_FP_START();
+
+               if (res)
+                       res = verify_clock_values(&dcfclks);
+
+               if (res)
+                       dcn_bw_update_from_pplib_dcfclks(dc, &dcfclks);
+               else
+                       BREAK_TO_DEBUGGER();
+
+               DC_FP_END();
+       }
+
+       dcn_bw_sync_calcs_and_dml(dc);
+       if (!dc->debug.disable_pplib_wm_range) {
+               dc->res_pool = &pool->base;
+               DC_FP_START();
+               dcn_get_soc_clks(
+                       dc, &min_fclk_khz, &min_dcfclk_khz, &socclk_khz);
+               DC_FP_END();
+               dcn_bw_notify_pplib_of_wm_ranges(
+                       dc, min_fclk_khz, min_dcfclk_khz, socclk_khz);
+       }
+
+       {
+               struct irq_service_init_data init_data;
+               init_data.ctx = dc->ctx;
+               pool->base.irqs = dal_irq_service_dcn10_create(&init_data);
+               if (!pool->base.irqs)
+                       goto fail;
+       }
+
+       /* index to valid pipe resource  */
+       j = 0;
+       /* mem input -> ipp -> dpp -> opp -> TG */
+       for (i = 0; i < pool->base.pipe_count; i++) {
+               /* if pipe is disabled, skip instance of HW pipe,
+                * i.e, skip ASIC register instance
+                */
+               if ((pipe_fuses & (1 << i)) != 0)
+                       continue;
+
+               pool->base.hubps[j] = dcn10_hubp_create(ctx, i);
+               if (pool->base.hubps[j] == NULL) {
+                       BREAK_TO_DEBUGGER();
+                       dm_error(
+                               "DC: failed to create memory input!\n");
+                       goto fail;
+               }
+
+               pool->base.ipps[j] = dcn10_ipp_create(ctx, i);
+               if (pool->base.ipps[j] == NULL) {
+                       BREAK_TO_DEBUGGER();
+                       dm_error(
+                               "DC: failed to create input pixel processor!\n");
+                       goto fail;
+               }
+
+               pool->base.dpps[j] = dcn10_dpp_create(ctx, i);
+               if (pool->base.dpps[j] == NULL) {
+                       BREAK_TO_DEBUGGER();
+                       dm_error(
+                               "DC: failed to create dpp!\n");
+                       goto fail;
+               }
+
+               pool->base.opps[j] = dcn10_opp_create(ctx, i);
+               if (pool->base.opps[j] == NULL) {
+                       BREAK_TO_DEBUGGER();
+                       dm_error(
+                               "DC: failed to create output pixel processor!\n");
+                       goto fail;
+               }
+
+               pool->base.timing_generators[j] = dcn10_timing_generator_create(
+                               ctx, i);
+               if (pool->base.timing_generators[j] == NULL) {
+                       BREAK_TO_DEBUGGER();
+                       dm_error("DC: failed to create tg!\n");
+                       goto fail;
+               }
+               /* check next valid pipe */
+               j++;
+       }
+
+       for (i = 0; i < pool->base.res_cap->num_ddc; i++) {
+               pool->base.engines[i] = dcn10_aux_engine_create(ctx, i);
+               if (pool->base.engines[i] == NULL) {
+                       BREAK_TO_DEBUGGER();
+                       dm_error(
+                               "DC:failed to create aux engine!!\n");
+                       goto fail;
+               }
+               pool->base.hw_i2cs[i] = dcn10_i2c_hw_create(ctx, i);
+               if (pool->base.hw_i2cs[i] == NULL) {
+                       BREAK_TO_DEBUGGER();
+                       dm_error(
+                               "DC:failed to create hw i2c!!\n");
+                       goto fail;
+               }
+               pool->base.sw_i2cs[i] = NULL;
+       }
+
+       /* valid pipe num */
+       pool->base.pipe_count = j;
+       pool->base.timing_generator_count = j;
+
+       /* within dml lib, it is hard code to 4. If ASIC pipe is fused,
+        * the value may be changed
+        */
+       dc->dml.ip.max_num_dpp = pool->base.pipe_count;
+       dc->dcn_ip->max_num_dpp = pool->base.pipe_count;
+
+       pool->base.mpc = dcn10_mpc_create(ctx);
+       if (pool->base.mpc == NULL) {
+               BREAK_TO_DEBUGGER();
+               dm_error("DC: failed to create mpc!\n");
+               goto fail;
+       }
+
+       pool->base.hubbub = dcn10_hubbub_create(ctx);
+       if (pool->base.hubbub == NULL) {
+               BREAK_TO_DEBUGGER();
+               dm_error("DC: failed to create hubbub!\n");
+               goto fail;
+       }
+
+       if (!resource_construct(num_virtual_links, dc, &pool->base,
+                       &res_create_funcs))
+               goto fail;
+
+       dcn10_hw_sequencer_construct(dc);
+       dc->caps.max_planes =  pool->base.pipe_count;
+
+       for (i = 0; i < dc->caps.max_planes; ++i)
+               dc->caps.planes[i] = plane_cap;
+
+       dc->cap_funcs = cap_funcs;
+
+       return true;
+
+fail:
+
+       dcn10_resource_destruct(pool);
+
+       return false;
+}
+
+struct resource_pool *dcn10_create_resource_pool(
+               const struct dc_init_data *init_data,
+               struct dc *dc)
+{
+       struct dcn10_resource_pool *pool =
+               kzalloc(sizeof(struct dcn10_resource_pool), GFP_KERNEL);
+
+       if (!pool)
+               return NULL;
+
+       if (dcn10_resource_construct(init_data->num_virtual_links, dc, pool))
+               return &pool->base;
+
+       kfree(pool);
+       BREAK_TO_DEBUGGER();
+       return NULL;
+}
diff --git a/drivers/gpu/drm/amd/display/dc/resource/dcn10/dcn10_resource.h b/drivers/gpu/drm/amd/display/dc/resource/dcn10/dcn10_resource.h
new file mode 100644 (file)
index 0000000..bf8e33c
--- /dev/null
@@ -0,0 +1,56 @@
+/*
+* Copyright 2016 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_RESOURCE_DCN10_H__
+#define __DC_RESOURCE_DCN10_H__
+
+#include "core_types.h"
+#include "dml/dcn10/dcn10_fpu.h"
+
+#define TO_DCN10_RES_POOL(pool)\
+       container_of(pool, struct dcn10_resource_pool, base)
+
+struct dc;
+struct resource_pool;
+struct _vcs_dpi_display_pipe_params_st;
+
+extern struct _vcs_dpi_ip_params_st dcn1_0_ip;
+extern struct _vcs_dpi_soc_bounding_box_st dcn1_0_soc;
+
+struct dcn10_resource_pool {
+       struct resource_pool base;
+};
+struct resource_pool *dcn10_create_resource_pool(
+               const struct dc_init_data *init_data,
+               struct dc *dc);
+
+struct stream_encoder *dcn10_find_first_free_match_stream_enc_for_link(
+               struct resource_context *res_ctx,
+               const struct resource_pool *pool,
+               struct dc_stream_state *stream);
+
+
+#endif /* __DC_RESOURCE_DCN10_H__ */
+
diff --git a/drivers/gpu/drm/amd/display/dc/resource/dcn20/dcn20_resource.c b/drivers/gpu/drm/amd/display/dc/resource/dcn20/dcn20_resource.c
new file mode 100644 (file)
index 0000000..f04bb5b
--- /dev/null
@@ -0,0 +1,2789 @@
+/*
+* Copyright 2016 Advanced Micro Devices, Inc.
+ * Copyright 2019 Raptor Engineering, LLC
+ *
+ * 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 <linux/slab.h>
+
+#include "dm_services.h"
+#include "dc.h"
+
+#include "dcn20/dcn20_init.h"
+
+#include "resource.h"
+#include "include/irq_service_interface.h"
+#include "dcn20/dcn20_resource.h"
+
+#include "dml/dcn20/dcn20_fpu.h"
+
+#include "dcn10/dcn10_hubp.h"
+#include "dcn10/dcn10_ipp.h"
+#include "dcn20/dcn20_hubbub.h"
+#include "dcn20/dcn20_mpc.h"
+#include "dcn20/dcn20_hubp.h"
+#include "irq/dcn20/irq_service_dcn20.h"
+#include "dcn20/dcn20_dpp.h"
+#include "dcn20/dcn20_optc.h"
+#include "dcn20/dcn20_hwseq.h"
+#include "dce110/dce110_hwseq.h"
+#include "dcn10/dcn10_resource.h"
+#include "dcn20/dcn20_opp.h"
+
+#include "dcn20/dcn20_dsc.h"
+
+#include "dcn20/dcn20_link_encoder.h"
+#include "dcn20/dcn20_stream_encoder.h"
+#include "dce/dce_clock_source.h"
+#include "dce/dce_audio.h"
+#include "dce/dce_hwseq.h"
+#include "virtual/virtual_stream_encoder.h"
+#include "dce110/dce110_resource.h"
+#include "dml/display_mode_vba.h"
+#include "dcn20/dcn20_dccg.h"
+#include "dcn20/dcn20_vmid.h"
+#include "dce/dce_panel_cntl.h"
+
+#include "navi10_ip_offset.h"
+
+#include "dcn/dcn_2_0_0_offset.h"
+#include "dcn/dcn_2_0_0_sh_mask.h"
+#include "dpcs/dpcs_2_0_0_offset.h"
+#include "dpcs/dpcs_2_0_0_sh_mask.h"
+
+#include "nbio/nbio_2_3_offset.h"
+
+#include "dcn20/dcn20_dwb.h"
+#include "dcn20/dcn20_mmhubbub.h"
+
+#include "mmhub/mmhub_2_0_0_offset.h"
+#include "mmhub/mmhub_2_0_0_sh_mask.h"
+
+#include "reg_helper.h"
+#include "dce/dce_abm.h"
+#include "dce/dce_dmcu.h"
+#include "dce/dce_aux.h"
+#include "dce/dce_i2c.h"
+#include "vm_helper.h"
+#include "link_enc_cfg.h"
+
+#include "amdgpu_socbb.h"
+
+#include "link.h"
+#define DC_LOGGER_INIT(logger)
+
+#ifndef mmDP0_DP_DPHY_INTERNAL_CTRL
+       #define mmDP0_DP_DPHY_INTERNAL_CTRL             0x210f
+       #define mmDP0_DP_DPHY_INTERNAL_CTRL_BASE_IDX    2
+       #define mmDP1_DP_DPHY_INTERNAL_CTRL             0x220f
+       #define mmDP1_DP_DPHY_INTERNAL_CTRL_BASE_IDX    2
+       #define mmDP2_DP_DPHY_INTERNAL_CTRL             0x230f
+       #define mmDP2_DP_DPHY_INTERNAL_CTRL_BASE_IDX    2
+       #define mmDP3_DP_DPHY_INTERNAL_CTRL             0x240f
+       #define mmDP3_DP_DPHY_INTERNAL_CTRL_BASE_IDX    2
+       #define mmDP4_DP_DPHY_INTERNAL_CTRL             0x250f
+       #define mmDP4_DP_DPHY_INTERNAL_CTRL_BASE_IDX    2
+       #define mmDP5_DP_DPHY_INTERNAL_CTRL             0x260f
+       #define mmDP5_DP_DPHY_INTERNAL_CTRL_BASE_IDX    2
+       #define mmDP6_DP_DPHY_INTERNAL_CTRL             0x270f
+       #define mmDP6_DP_DPHY_INTERNAL_CTRL_BASE_IDX    2
+#endif
+
+
+enum dcn20_clk_src_array_id {
+       DCN20_CLK_SRC_PLL0,
+       DCN20_CLK_SRC_PLL1,
+       DCN20_CLK_SRC_PLL2,
+       DCN20_CLK_SRC_PLL3,
+       DCN20_CLK_SRC_PLL4,
+       DCN20_CLK_SRC_PLL5,
+       DCN20_CLK_SRC_TOTAL
+};
+
+/* begin *********************
+ * macros to expend register list macro defined in HW object header file */
+
+/* DCN */
+#define BASE_INNER(seg) DCN_BASE__INST0_SEG ## seg
+
+#define BASE(seg) BASE_INNER(seg)
+
+#define SR(reg_name)\
+               .reg_name = BASE(mm ## reg_name ## _BASE_IDX) +  \
+                                       mm ## reg_name
+
+#define SRI(reg_name, block, id)\
+       .reg_name = BASE(mm ## block ## id ## _ ## reg_name ## _BASE_IDX) + \
+                                       mm ## block ## id ## _ ## reg_name
+
+#define SRI2_DWB(reg_name, block, id)\
+       .reg_name = BASE(mm ## reg_name ## _BASE_IDX) + \
+                                       mm ## reg_name
+#define SF_DWB(reg_name, field_name, post_fix)\
+       .field_name = reg_name ## __ ## field_name ## post_fix
+
+#define SF_DWB2(reg_name, block, id, field_name, post_fix)     \
+       .field_name = reg_name ## __ ## field_name ## post_fix
+
+#define SRIR(var_name, reg_name, block, id)\
+       .var_name = BASE(mm ## block ## id ## _ ## reg_name ## _BASE_IDX) + \
+                                       mm ## block ## id ## _ ## reg_name
+
+#define SRII(reg_name, block, id)\
+       .reg_name[id] = BASE(mm ## block ## id ## _ ## reg_name ## _BASE_IDX) + \
+                                       mm ## block ## id ## _ ## reg_name
+
+#define DCCG_SRII(reg_name, block, id)\
+       .block ## _ ## reg_name[id] = BASE(mm ## block ## id ## _ ## reg_name ## _BASE_IDX) + \
+                                       mm ## block ## id ## _ ## reg_name
+
+#define VUPDATE_SRII(reg_name, block, id)\
+       .reg_name[id] = BASE(mm ## reg_name ## _ ## block ## id ## _BASE_IDX) + \
+                                       mm ## reg_name ## _ ## block ## id
+
+/* NBIO */
+#define NBIO_BASE_INNER(seg) \
+       NBIO_BASE__INST0_SEG ## seg
+
+#define NBIO_BASE(seg) \
+       NBIO_BASE_INNER(seg)
+
+#define NBIO_SR(reg_name)\
+               .reg_name = NBIO_BASE(mm ## reg_name ## _BASE_IDX) + \
+                                       mm ## reg_name
+
+/* MMHUB */
+#define MMHUB_BASE_INNER(seg) \
+       MMHUB_BASE__INST0_SEG ## seg
+
+#define MMHUB_BASE(seg) \
+       MMHUB_BASE_INNER(seg)
+
+#define MMHUB_SR(reg_name)\
+               .reg_name = MMHUB_BASE(mmMM ## reg_name ## _BASE_IDX) + \
+                                       mmMM ## reg_name
+
+static const struct bios_registers bios_regs = {
+               NBIO_SR(BIOS_SCRATCH_3),
+               NBIO_SR(BIOS_SCRATCH_6)
+};
+
+#define clk_src_regs(index, pllid)\
+[index] = {\
+       CS_COMMON_REG_LIST_DCN2_0(index, pllid),\
+}
+
+static const struct dce110_clk_src_regs clk_src_regs[] = {
+       clk_src_regs(0, A),
+       clk_src_regs(1, B),
+       clk_src_regs(2, C),
+       clk_src_regs(3, D),
+       clk_src_regs(4, E),
+       clk_src_regs(5, F)
+};
+
+static const struct dce110_clk_src_shift cs_shift = {
+               CS_COMMON_MASK_SH_LIST_DCN2_0(__SHIFT)
+};
+
+static const struct dce110_clk_src_mask cs_mask = {
+               CS_COMMON_MASK_SH_LIST_DCN2_0(_MASK)
+};
+
+static const struct dce_dmcu_registers dmcu_regs = {
+               DMCU_DCN10_REG_LIST()
+};
+
+static const struct dce_dmcu_shift dmcu_shift = {
+               DMCU_MASK_SH_LIST_DCN10(__SHIFT)
+};
+
+static const struct dce_dmcu_mask dmcu_mask = {
+               DMCU_MASK_SH_LIST_DCN10(_MASK)
+};
+
+static const struct dce_abm_registers abm_regs = {
+               ABM_DCN20_REG_LIST()
+};
+
+static const struct dce_abm_shift abm_shift = {
+               ABM_MASK_SH_LIST_DCN20(__SHIFT)
+};
+
+static const struct dce_abm_mask abm_mask = {
+               ABM_MASK_SH_LIST_DCN20(_MASK)
+};
+
+#define audio_regs(id)\
+[id] = {\
+               AUD_COMMON_REG_LIST(id)\
+}
+
+static const struct dce_audio_registers audio_regs[] = {
+       audio_regs(0),
+       audio_regs(1),
+       audio_regs(2),
+       audio_regs(3),
+       audio_regs(4),
+       audio_regs(5),
+       audio_regs(6),
+};
+
+#define DCE120_AUD_COMMON_MASK_SH_LIST(mask_sh)\
+               SF(AZF0ENDPOINT0_AZALIA_F0_CODEC_ENDPOINT_INDEX, AZALIA_ENDPOINT_REG_INDEX, mask_sh),\
+               SF(AZF0ENDPOINT0_AZALIA_F0_CODEC_ENDPOINT_DATA, AZALIA_ENDPOINT_REG_DATA, mask_sh),\
+               AUD_COMMON_MASK_SH_LIST_BASE(mask_sh)
+
+static const struct dce_audio_shift audio_shift = {
+               DCE120_AUD_COMMON_MASK_SH_LIST(__SHIFT)
+};
+
+static const struct dce_audio_mask audio_mask = {
+               DCE120_AUD_COMMON_MASK_SH_LIST(_MASK)
+};
+
+#define stream_enc_regs(id)\
+[id] = {\
+       SE_DCN2_REG_LIST(id)\
+}
+
+static const struct dcn10_stream_enc_registers stream_enc_regs[] = {
+       stream_enc_regs(0),
+       stream_enc_regs(1),
+       stream_enc_regs(2),
+       stream_enc_regs(3),
+       stream_enc_regs(4),
+       stream_enc_regs(5),
+};
+
+static const struct dcn10_stream_encoder_shift se_shift = {
+               SE_COMMON_MASK_SH_LIST_DCN20(__SHIFT)
+};
+
+static const struct dcn10_stream_encoder_mask se_mask = {
+               SE_COMMON_MASK_SH_LIST_DCN20(_MASK)
+};
+
+
+#define aux_regs(id)\
+[id] = {\
+       DCN2_AUX_REG_LIST(id)\
+}
+
+static const struct dcn10_link_enc_aux_registers link_enc_aux_regs[] = {
+               aux_regs(0),
+               aux_regs(1),
+               aux_regs(2),
+               aux_regs(3),
+               aux_regs(4),
+               aux_regs(5)
+};
+
+#define hpd_regs(id)\
+[id] = {\
+       HPD_REG_LIST(id)\
+}
+
+static const struct dcn10_link_enc_hpd_registers link_enc_hpd_regs[] = {
+               hpd_regs(0),
+               hpd_regs(1),
+               hpd_regs(2),
+               hpd_regs(3),
+               hpd_regs(4),
+               hpd_regs(5)
+};
+
+#define link_regs(id, phyid)\
+[id] = {\
+       LE_DCN10_REG_LIST(id), \
+       UNIPHY_DCN2_REG_LIST(phyid), \
+       DPCS_DCN2_REG_LIST(id), \
+       SRI(DP_DPHY_INTERNAL_CTRL, DP, id) \
+}
+
+static const struct dcn10_link_enc_registers link_enc_regs[] = {
+       link_regs(0, A),
+       link_regs(1, B),
+       link_regs(2, C),
+       link_regs(3, D),
+       link_regs(4, E),
+       link_regs(5, F)
+};
+
+static const struct dcn10_link_enc_shift le_shift = {
+       LINK_ENCODER_MASK_SH_LIST_DCN20(__SHIFT),\
+       DPCS_DCN2_MASK_SH_LIST(__SHIFT)
+};
+
+static const struct dcn10_link_enc_mask le_mask = {
+       LINK_ENCODER_MASK_SH_LIST_DCN20(_MASK),\
+       DPCS_DCN2_MASK_SH_LIST(_MASK)
+};
+
+static const struct dce_panel_cntl_registers panel_cntl_regs[] = {
+       { DCN_PANEL_CNTL_REG_LIST() }
+};
+
+static const struct dce_panel_cntl_shift panel_cntl_shift = {
+       DCE_PANEL_CNTL_MASK_SH_LIST(__SHIFT)
+};
+
+static const struct dce_panel_cntl_mask panel_cntl_mask = {
+       DCE_PANEL_CNTL_MASK_SH_LIST(_MASK)
+};
+
+#define ipp_regs(id)\
+[id] = {\
+       IPP_REG_LIST_DCN20(id),\
+}
+
+static const struct dcn10_ipp_registers ipp_regs[] = {
+       ipp_regs(0),
+       ipp_regs(1),
+       ipp_regs(2),
+       ipp_regs(3),
+       ipp_regs(4),
+       ipp_regs(5),
+};
+
+static const struct dcn10_ipp_shift ipp_shift = {
+               IPP_MASK_SH_LIST_DCN20(__SHIFT)
+};
+
+static const struct dcn10_ipp_mask ipp_mask = {
+               IPP_MASK_SH_LIST_DCN20(_MASK),
+};
+
+#define opp_regs(id)\
+[id] = {\
+       OPP_REG_LIST_DCN20(id),\
+}
+
+static const struct dcn20_opp_registers opp_regs[] = {
+       opp_regs(0),
+       opp_regs(1),
+       opp_regs(2),
+       opp_regs(3),
+       opp_regs(4),
+       opp_regs(5),
+};
+
+static const struct dcn20_opp_shift opp_shift = {
+               OPP_MASK_SH_LIST_DCN20(__SHIFT)
+};
+
+static const struct dcn20_opp_mask opp_mask = {
+               OPP_MASK_SH_LIST_DCN20(_MASK)
+};
+
+#define aux_engine_regs(id)\
+[id] = {\
+       AUX_COMMON_REG_LIST0(id), \
+       .AUXN_IMPCAL = 0, \
+       .AUXP_IMPCAL = 0, \
+       .AUX_RESET_MASK = DP_AUX0_AUX_CONTROL__AUX_RESET_MASK, \
+}
+
+static const struct dce110_aux_registers aux_engine_regs[] = {
+               aux_engine_regs(0),
+               aux_engine_regs(1),
+               aux_engine_regs(2),
+               aux_engine_regs(3),
+               aux_engine_regs(4),
+               aux_engine_regs(5)
+};
+
+#define tf_regs(id)\
+[id] = {\
+       TF_REG_LIST_DCN20(id),\
+       TF_REG_LIST_DCN20_COMMON_APPEND(id),\
+}
+
+static const struct dcn2_dpp_registers tf_regs[] = {
+       tf_regs(0),
+       tf_regs(1),
+       tf_regs(2),
+       tf_regs(3),
+       tf_regs(4),
+       tf_regs(5),
+};
+
+static const struct dcn2_dpp_shift tf_shift = {
+               TF_REG_LIST_SH_MASK_DCN20(__SHIFT),
+               TF_DEBUG_REG_LIST_SH_DCN20
+};
+
+static const struct dcn2_dpp_mask tf_mask = {
+               TF_REG_LIST_SH_MASK_DCN20(_MASK),
+               TF_DEBUG_REG_LIST_MASK_DCN20
+};
+
+#define dwbc_regs_dcn2(id)\
+[id] = {\
+       DWBC_COMMON_REG_LIST_DCN2_0(id),\
+               }
+
+static const struct dcn20_dwbc_registers dwbc20_regs[] = {
+       dwbc_regs_dcn2(0),
+};
+
+static const struct dcn20_dwbc_shift dwbc20_shift = {
+       DWBC_COMMON_MASK_SH_LIST_DCN2_0(__SHIFT)
+};
+
+static const struct dcn20_dwbc_mask dwbc20_mask = {
+       DWBC_COMMON_MASK_SH_LIST_DCN2_0(_MASK)
+};
+
+#define mcif_wb_regs_dcn2(id)\
+[id] = {\
+       MCIF_WB_COMMON_REG_LIST_DCN2_0(id),\
+               }
+
+static const struct dcn20_mmhubbub_registers mcif_wb20_regs[] = {
+       mcif_wb_regs_dcn2(0),
+};
+
+static const struct dcn20_mmhubbub_shift mcif_wb20_shift = {
+       MCIF_WB_COMMON_MASK_SH_LIST_DCN2_0(__SHIFT)
+};
+
+static const struct dcn20_mmhubbub_mask mcif_wb20_mask = {
+       MCIF_WB_COMMON_MASK_SH_LIST_DCN2_0(_MASK)
+};
+
+static const struct dcn20_mpc_registers mpc_regs = {
+               MPC_REG_LIST_DCN2_0(0),
+               MPC_REG_LIST_DCN2_0(1),
+               MPC_REG_LIST_DCN2_0(2),
+               MPC_REG_LIST_DCN2_0(3),
+               MPC_REG_LIST_DCN2_0(4),
+               MPC_REG_LIST_DCN2_0(5),
+               MPC_OUT_MUX_REG_LIST_DCN2_0(0),
+               MPC_OUT_MUX_REG_LIST_DCN2_0(1),
+               MPC_OUT_MUX_REG_LIST_DCN2_0(2),
+               MPC_OUT_MUX_REG_LIST_DCN2_0(3),
+               MPC_OUT_MUX_REG_LIST_DCN2_0(4),
+               MPC_OUT_MUX_REG_LIST_DCN2_0(5),
+               MPC_DBG_REG_LIST_DCN2_0()
+};
+
+static const struct dcn20_mpc_shift mpc_shift = {
+       MPC_COMMON_MASK_SH_LIST_DCN2_0(__SHIFT),
+       MPC_DEBUG_REG_LIST_SH_DCN20
+};
+
+static const struct dcn20_mpc_mask mpc_mask = {
+       MPC_COMMON_MASK_SH_LIST_DCN2_0(_MASK),
+       MPC_DEBUG_REG_LIST_MASK_DCN20
+};
+
+#define tg_regs(id)\
+[id] = {TG_COMMON_REG_LIST_DCN2_0(id)}
+
+
+static const struct dcn_optc_registers tg_regs[] = {
+       tg_regs(0),
+       tg_regs(1),
+       tg_regs(2),
+       tg_regs(3),
+       tg_regs(4),
+       tg_regs(5)
+};
+
+static const struct dcn_optc_shift tg_shift = {
+       TG_COMMON_MASK_SH_LIST_DCN2_0(__SHIFT)
+};
+
+static const struct dcn_optc_mask tg_mask = {
+       TG_COMMON_MASK_SH_LIST_DCN2_0(_MASK)
+};
+
+#define hubp_regs(id)\
+[id] = {\
+       HUBP_REG_LIST_DCN20(id)\
+}
+
+static const struct dcn_hubp2_registers hubp_regs[] = {
+               hubp_regs(0),
+               hubp_regs(1),
+               hubp_regs(2),
+               hubp_regs(3),
+               hubp_regs(4),
+               hubp_regs(5)
+};
+
+static const struct dcn_hubp2_shift hubp_shift = {
+               HUBP_MASK_SH_LIST_DCN20(__SHIFT)
+};
+
+static const struct dcn_hubp2_mask hubp_mask = {
+               HUBP_MASK_SH_LIST_DCN20(_MASK)
+};
+
+static const struct dcn_hubbub_registers hubbub_reg = {
+               HUBBUB_REG_LIST_DCN20(0)
+};
+
+static const struct dcn_hubbub_shift hubbub_shift = {
+               HUBBUB_MASK_SH_LIST_DCN20(__SHIFT)
+};
+
+static const struct dcn_hubbub_mask hubbub_mask = {
+               HUBBUB_MASK_SH_LIST_DCN20(_MASK)
+};
+
+#define vmid_regs(id)\
+[id] = {\
+               DCN20_VMID_REG_LIST(id)\
+}
+
+static const struct dcn_vmid_registers vmid_regs[] = {
+       vmid_regs(0),
+       vmid_regs(1),
+       vmid_regs(2),
+       vmid_regs(3),
+       vmid_regs(4),
+       vmid_regs(5),
+       vmid_regs(6),
+       vmid_regs(7),
+       vmid_regs(8),
+       vmid_regs(9),
+       vmid_regs(10),
+       vmid_regs(11),
+       vmid_regs(12),
+       vmid_regs(13),
+       vmid_regs(14),
+       vmid_regs(15)
+};
+
+static const struct dcn20_vmid_shift vmid_shifts = {
+               DCN20_VMID_MASK_SH_LIST(__SHIFT)
+};
+
+static const struct dcn20_vmid_mask vmid_masks = {
+               DCN20_VMID_MASK_SH_LIST(_MASK)
+};
+
+static const struct dce110_aux_registers_shift aux_shift = {
+               DCN_AUX_MASK_SH_LIST(__SHIFT)
+};
+
+static const struct dce110_aux_registers_mask aux_mask = {
+               DCN_AUX_MASK_SH_LIST(_MASK)
+};
+
+static int map_transmitter_id_to_phy_instance(
+       enum transmitter transmitter)
+{
+       switch (transmitter) {
+       case TRANSMITTER_UNIPHY_A:
+               return 0;
+       break;
+       case TRANSMITTER_UNIPHY_B:
+               return 1;
+       break;
+       case TRANSMITTER_UNIPHY_C:
+               return 2;
+       break;
+       case TRANSMITTER_UNIPHY_D:
+               return 3;
+       break;
+       case TRANSMITTER_UNIPHY_E:
+               return 4;
+       break;
+       case TRANSMITTER_UNIPHY_F:
+               return 5;
+       break;
+       default:
+               ASSERT(0);
+               return 0;
+       }
+}
+
+#define dsc_regsDCN20(id)\
+[id] = {\
+       DSC_REG_LIST_DCN20(id)\
+}
+
+static const struct dcn20_dsc_registers dsc_regs[] = {
+       dsc_regsDCN20(0),
+       dsc_regsDCN20(1),
+       dsc_regsDCN20(2),
+       dsc_regsDCN20(3),
+       dsc_regsDCN20(4),
+       dsc_regsDCN20(5)
+};
+
+static const struct dcn20_dsc_shift dsc_shift = {
+       DSC_REG_LIST_SH_MASK_DCN20(__SHIFT)
+};
+
+static const struct dcn20_dsc_mask dsc_mask = {
+       DSC_REG_LIST_SH_MASK_DCN20(_MASK)
+};
+
+static const struct dccg_registers dccg_regs = {
+               DCCG_REG_LIST_DCN2()
+};
+
+static const struct dccg_shift dccg_shift = {
+               DCCG_MASK_SH_LIST_DCN2(__SHIFT)
+};
+
+static const struct dccg_mask dccg_mask = {
+               DCCG_MASK_SH_LIST_DCN2(_MASK)
+};
+
+static const struct resource_caps res_cap_nv10 = {
+               .num_timing_generator = 6,
+               .num_opp = 6,
+               .num_video_plane = 6,
+               .num_audio = 7,
+               .num_stream_encoder = 6,
+               .num_pll = 6,
+               .num_dwb = 1,
+               .num_ddc = 6,
+               .num_vmid = 16,
+               .num_dsc = 6,
+};
+
+static const struct dc_plane_cap plane_cap = {
+       .type = DC_PLANE_TYPE_DCN_UNIVERSAL,
+       .per_pixel_alpha = true,
+
+       .pixel_format_support = {
+                       .argb8888 = true,
+                       .nv12 = true,
+                       .fp16 = true,
+                       .p010 = true
+       },
+
+       .max_upscale_factor = {
+                       .argb8888 = 16000,
+                       .nv12 = 16000,
+                       .fp16 = 1
+       },
+
+       .max_downscale_factor = {
+                       .argb8888 = 250,
+                       .nv12 = 250,
+                       .fp16 = 1
+       },
+       16,
+       16
+};
+static const struct resource_caps res_cap_nv14 = {
+               .num_timing_generator = 5,
+               .num_opp = 5,
+               .num_video_plane = 5,
+               .num_audio = 6,
+               .num_stream_encoder = 5,
+               .num_pll = 5,
+               .num_dwb = 1,
+               .num_ddc = 5,
+               .num_vmid = 16,
+               .num_dsc = 5,
+};
+
+static const struct dc_debug_options debug_defaults_drv = {
+               .disable_dmcu = false,
+               .force_abm_enable = false,
+               .timing_trace = false,
+               .clock_trace = true,
+               .disable_pplib_clock_request = true,
+               .pipe_split_policy = MPC_SPLIT_AVOID_MULT_DISP,
+               .force_single_disp_pipe_split = false,
+               .disable_dcc = DCC_ENABLE,
+               .vsr_support = true,
+               .performance_trace = false,
+               .max_downscale_src_width = 5120,/*upto 5K*/
+               .disable_pplib_wm_range = false,
+               .scl_reset_length10 = true,
+               .sanity_checks = false,
+               .underflow_assert_delay_us = 0xFFFFFFFF,
+               .enable_legacy_fast_update = true,
+               .using_dml2 = false,
+};
+
+void dcn20_dpp_destroy(struct dpp **dpp)
+{
+       kfree(TO_DCN20_DPP(*dpp));
+       *dpp = NULL;
+}
+
+struct dpp *dcn20_dpp_create(
+       struct dc_context *ctx,
+       uint32_t inst)
+{
+       struct dcn20_dpp *dpp =
+               kzalloc(sizeof(struct dcn20_dpp), GFP_ATOMIC);
+
+       if (!dpp)
+               return NULL;
+
+       if (dpp2_construct(dpp, ctx, inst,
+                       &tf_regs[inst], &tf_shift, &tf_mask))
+               return &dpp->base;
+
+       BREAK_TO_DEBUGGER();
+       kfree(dpp);
+       return NULL;
+}
+
+struct input_pixel_processor *dcn20_ipp_create(
+       struct dc_context *ctx, uint32_t inst)
+{
+       struct dcn10_ipp *ipp =
+               kzalloc(sizeof(struct dcn10_ipp), GFP_ATOMIC);
+
+       if (!ipp) {
+               BREAK_TO_DEBUGGER();
+               return NULL;
+       }
+
+       dcn20_ipp_construct(ipp, ctx, inst,
+                       &ipp_regs[inst], &ipp_shift, &ipp_mask);
+       return &ipp->base;
+}
+
+
+struct output_pixel_processor *dcn20_opp_create(
+       struct dc_context *ctx, uint32_t inst)
+{
+       struct dcn20_opp *opp =
+               kzalloc(sizeof(struct dcn20_opp), GFP_ATOMIC);
+
+       if (!opp) {
+               BREAK_TO_DEBUGGER();
+               return NULL;
+       }
+
+       dcn20_opp_construct(opp, ctx, inst,
+                       &opp_regs[inst], &opp_shift, &opp_mask);
+       return &opp->base;
+}
+
+struct dce_aux *dcn20_aux_engine_create(
+       struct dc_context *ctx,
+       uint32_t inst)
+{
+       struct aux_engine_dce110 *aux_engine =
+               kzalloc(sizeof(struct aux_engine_dce110), GFP_ATOMIC);
+
+       if (!aux_engine)
+               return NULL;
+
+       dce110_aux_engine_construct(aux_engine, ctx, inst,
+                                   SW_AUX_TIMEOUT_PERIOD_MULTIPLIER * AUX_TIMEOUT_PERIOD,
+                                   &aux_engine_regs[inst],
+                                       &aux_mask,
+                                       &aux_shift,
+                                       ctx->dc->caps.extended_aux_timeout_support);
+
+       return &aux_engine->base;
+}
+#define i2c_inst_regs(id) { I2C_HW_ENGINE_COMMON_REG_LIST(id) }
+
+static const struct dce_i2c_registers i2c_hw_regs[] = {
+               i2c_inst_regs(1),
+               i2c_inst_regs(2),
+               i2c_inst_regs(3),
+               i2c_inst_regs(4),
+               i2c_inst_regs(5),
+               i2c_inst_regs(6),
+};
+
+static const struct dce_i2c_shift i2c_shifts = {
+               I2C_COMMON_MASK_SH_LIST_DCN2(__SHIFT)
+};
+
+static const struct dce_i2c_mask i2c_masks = {
+               I2C_COMMON_MASK_SH_LIST_DCN2(_MASK)
+};
+
+struct dce_i2c_hw *dcn20_i2c_hw_create(
+       struct dc_context *ctx,
+       uint32_t inst)
+{
+       struct dce_i2c_hw *dce_i2c_hw =
+               kzalloc(sizeof(struct dce_i2c_hw), GFP_ATOMIC);
+
+       if (!dce_i2c_hw)
+               return NULL;
+
+       dcn2_i2c_hw_construct(dce_i2c_hw, ctx, inst,
+                                   &i2c_hw_regs[inst], &i2c_shifts, &i2c_masks);
+
+       return dce_i2c_hw;
+}
+struct mpc *dcn20_mpc_create(struct dc_context *ctx)
+{
+       struct dcn20_mpc *mpc20 = kzalloc(sizeof(struct dcn20_mpc),
+                                         GFP_ATOMIC);
+
+       if (!mpc20)
+               return NULL;
+
+       dcn20_mpc_construct(mpc20, ctx,
+                       &mpc_regs,
+                       &mpc_shift,
+                       &mpc_mask,
+                       6);
+
+       return &mpc20->base;
+}
+
+struct hubbub *dcn20_hubbub_create(struct dc_context *ctx)
+{
+       int i;
+       struct dcn20_hubbub *hubbub = kzalloc(sizeof(struct dcn20_hubbub),
+                                         GFP_ATOMIC);
+
+       if (!hubbub)
+               return NULL;
+
+       hubbub2_construct(hubbub, ctx,
+                       &hubbub_reg,
+                       &hubbub_shift,
+                       &hubbub_mask);
+
+       for (i = 0; i < res_cap_nv10.num_vmid; i++) {
+               struct dcn20_vmid *vmid = &hubbub->vmid[i];
+
+               vmid->ctx = ctx;
+
+               vmid->regs = &vmid_regs[i];
+               vmid->shifts = &vmid_shifts;
+               vmid->masks = &vmid_masks;
+       }
+
+       return &hubbub->base;
+}
+
+struct timing_generator *dcn20_timing_generator_create(
+               struct dc_context *ctx,
+               uint32_t instance)
+{
+       struct optc *tgn10 =
+               kzalloc(sizeof(struct optc), GFP_ATOMIC);
+
+       if (!tgn10)
+               return NULL;
+
+       tgn10->base.inst = instance;
+       tgn10->base.ctx = ctx;
+
+       tgn10->tg_regs = &tg_regs[instance];
+       tgn10->tg_shift = &tg_shift;
+       tgn10->tg_mask = &tg_mask;
+
+       dcn20_timing_generator_init(tgn10);
+
+       return &tgn10->base;
+}
+
+static const struct encoder_feature_support link_enc_feature = {
+               .max_hdmi_deep_color = COLOR_DEPTH_121212,
+               .max_hdmi_pixel_clock = 600000,
+               .hdmi_ycbcr420_supported = true,
+               .dp_ycbcr420_supported = true,
+               .fec_supported = true,
+               .flags.bits.IS_HBR2_CAPABLE = true,
+               .flags.bits.IS_HBR3_CAPABLE = true,
+               .flags.bits.IS_TPS3_CAPABLE = true,
+               .flags.bits.IS_TPS4_CAPABLE = true
+};
+
+struct link_encoder *dcn20_link_encoder_create(
+       struct dc_context *ctx,
+       const struct encoder_init_data *enc_init_data)
+{
+       struct dcn20_link_encoder *enc20 =
+               kzalloc(sizeof(struct dcn20_link_encoder), GFP_KERNEL);
+       int link_regs_id;
+
+       if (!enc20)
+               return NULL;
+
+       link_regs_id =
+               map_transmitter_id_to_phy_instance(enc_init_data->transmitter);
+
+       dcn20_link_encoder_construct(enc20,
+                                     enc_init_data,
+                                     &link_enc_feature,
+                                     &link_enc_regs[link_regs_id],
+                                     &link_enc_aux_regs[enc_init_data->channel - 1],
+                                     &link_enc_hpd_regs[enc_init_data->hpd_source],
+                                     &le_shift,
+                                     &le_mask);
+
+       return &enc20->enc10.base;
+}
+
+static struct panel_cntl *dcn20_panel_cntl_create(const struct panel_cntl_init_data *init_data)
+{
+       struct dce_panel_cntl *panel_cntl =
+               kzalloc(sizeof(struct dce_panel_cntl), GFP_KERNEL);
+
+       if (!panel_cntl)
+               return NULL;
+
+       dce_panel_cntl_construct(panel_cntl,
+                       init_data,
+                       &panel_cntl_regs[init_data->inst],
+                       &panel_cntl_shift,
+                       &panel_cntl_mask);
+
+       return &panel_cntl->base;
+}
+
+static struct clock_source *dcn20_clock_source_create(
+       struct dc_context *ctx,
+       struct dc_bios *bios,
+       enum clock_source_id id,
+       const struct dce110_clk_src_regs *regs,
+       bool dp_clk_src)
+{
+       struct dce110_clk_src *clk_src =
+               kzalloc(sizeof(struct dce110_clk_src), GFP_ATOMIC);
+
+       if (!clk_src)
+               return NULL;
+
+       if (dcn20_clk_src_construct(clk_src, ctx, bios, id,
+                       regs, &cs_shift, &cs_mask)) {
+               clk_src->base.dp_clk_src = dp_clk_src;
+               return &clk_src->base;
+       }
+
+       kfree(clk_src);
+       BREAK_TO_DEBUGGER();
+       return NULL;
+}
+
+static void read_dce_straps(
+       struct dc_context *ctx,
+       struct resource_straps *straps)
+{
+       generic_reg_get(ctx, mmDC_PINSTRAPS + BASE(mmDC_PINSTRAPS_BASE_IDX),
+               FN(DC_PINSTRAPS, DC_PINSTRAPS_AUDIO), &straps->dc_pinstraps_audio);
+}
+
+static struct audio *dcn20_create_audio(
+               struct dc_context *ctx, unsigned int inst)
+{
+       return dce_audio_create(ctx, inst,
+                       &audio_regs[inst], &audio_shift, &audio_mask);
+}
+
+struct stream_encoder *dcn20_stream_encoder_create(
+       enum engine_id eng_id,
+       struct dc_context *ctx)
+{
+       struct dcn10_stream_encoder *enc1 =
+               kzalloc(sizeof(struct dcn10_stream_encoder), GFP_KERNEL);
+
+       if (!enc1)
+               return NULL;
+
+       if (ASICREV_IS_NAVI14_M(ctx->asic_id.hw_internal_rev)) {
+               if (eng_id >= ENGINE_ID_DIGD)
+                       eng_id++;
+       }
+
+       dcn20_stream_encoder_construct(enc1, ctx, ctx->dc_bios, eng_id,
+                                       &stream_enc_regs[eng_id],
+                                       &se_shift, &se_mask);
+
+       return &enc1->base;
+}
+
+static const struct dce_hwseq_registers hwseq_reg = {
+               HWSEQ_DCN2_REG_LIST()
+};
+
+static const struct dce_hwseq_shift hwseq_shift = {
+               HWSEQ_DCN2_MASK_SH_LIST(__SHIFT)
+};
+
+static const struct dce_hwseq_mask hwseq_mask = {
+               HWSEQ_DCN2_MASK_SH_LIST(_MASK)
+};
+
+struct dce_hwseq *dcn20_hwseq_create(
+       struct dc_context *ctx)
+{
+       struct dce_hwseq *hws = kzalloc(sizeof(struct dce_hwseq), GFP_KERNEL);
+
+       if (hws) {
+               hws->ctx = ctx;
+               hws->regs = &hwseq_reg;
+               hws->shifts = &hwseq_shift;
+               hws->masks = &hwseq_mask;
+       }
+       return hws;
+}
+
+static const struct resource_create_funcs res_create_funcs = {
+       .read_dce_straps = read_dce_straps,
+       .create_audio = dcn20_create_audio,
+       .create_stream_encoder = dcn20_stream_encoder_create,
+       .create_hwseq = dcn20_hwseq_create,
+};
+
+static void dcn20_pp_smu_destroy(struct pp_smu_funcs **pp_smu);
+
+void dcn20_clock_source_destroy(struct clock_source **clk_src)
+{
+       kfree(TO_DCE110_CLK_SRC(*clk_src));
+       *clk_src = NULL;
+}
+
+
+struct display_stream_compressor *dcn20_dsc_create(
+       struct dc_context *ctx, uint32_t inst)
+{
+       struct dcn20_dsc *dsc =
+               kzalloc(sizeof(struct dcn20_dsc), GFP_ATOMIC);
+
+       if (!dsc) {
+               BREAK_TO_DEBUGGER();
+               return NULL;
+       }
+
+       dsc2_construct(dsc, ctx, inst, &dsc_regs[inst], &dsc_shift, &dsc_mask);
+       return &dsc->base;
+}
+
+void dcn20_dsc_destroy(struct display_stream_compressor **dsc)
+{
+       kfree(container_of(*dsc, struct dcn20_dsc, base));
+       *dsc = NULL;
+}
+
+
+static void dcn20_resource_destruct(struct dcn20_resource_pool *pool)
+{
+       unsigned int i;
+
+       for (i = 0; i < pool->base.stream_enc_count; i++) {
+               if (pool->base.stream_enc[i] != NULL) {
+                       kfree(DCN10STRENC_FROM_STRENC(pool->base.stream_enc[i]));
+                       pool->base.stream_enc[i] = NULL;
+               }
+       }
+
+       for (i = 0; i < pool->base.res_cap->num_dsc; i++) {
+               if (pool->base.dscs[i] != NULL)
+                       dcn20_dsc_destroy(&pool->base.dscs[i]);
+       }
+
+       if (pool->base.mpc != NULL) {
+               kfree(TO_DCN20_MPC(pool->base.mpc));
+               pool->base.mpc = NULL;
+       }
+       if (pool->base.hubbub != NULL) {
+               kfree(pool->base.hubbub);
+               pool->base.hubbub = NULL;
+       }
+       for (i = 0; i < pool->base.pipe_count; i++) {
+               if (pool->base.dpps[i] != NULL)
+                       dcn20_dpp_destroy(&pool->base.dpps[i]);
+
+               if (pool->base.ipps[i] != NULL)
+                       pool->base.ipps[i]->funcs->ipp_destroy(&pool->base.ipps[i]);
+
+               if (pool->base.hubps[i] != NULL) {
+                       kfree(TO_DCN20_HUBP(pool->base.hubps[i]));
+                       pool->base.hubps[i] = NULL;
+               }
+
+               if (pool->base.irqs != NULL) {
+                       dal_irq_service_destroy(&pool->base.irqs);
+               }
+       }
+
+       for (i = 0; i < pool->base.res_cap->num_ddc; i++) {
+               if (pool->base.engines[i] != NULL)
+                       dce110_engine_destroy(&pool->base.engines[i]);
+               if (pool->base.hw_i2cs[i] != NULL) {
+                       kfree(pool->base.hw_i2cs[i]);
+                       pool->base.hw_i2cs[i] = NULL;
+               }
+               if (pool->base.sw_i2cs[i] != NULL) {
+                       kfree(pool->base.sw_i2cs[i]);
+                       pool->base.sw_i2cs[i] = NULL;
+               }
+       }
+
+       for (i = 0; i < pool->base.res_cap->num_opp; i++) {
+               if (pool->base.opps[i] != NULL)
+                       pool->base.opps[i]->funcs->opp_destroy(&pool->base.opps[i]);
+       }
+
+       for (i = 0; i < pool->base.res_cap->num_timing_generator; i++) {
+               if (pool->base.timing_generators[i] != NULL)    {
+                       kfree(DCN10TG_FROM_TG(pool->base.timing_generators[i]));
+                       pool->base.timing_generators[i] = NULL;
+               }
+       }
+
+       for (i = 0; i < pool->base.res_cap->num_dwb; i++) {
+               if (pool->base.dwbc[i] != NULL) {
+                       kfree(TO_DCN20_DWBC(pool->base.dwbc[i]));
+                       pool->base.dwbc[i] = NULL;
+               }
+               if (pool->base.mcif_wb[i] != NULL) {
+                       kfree(TO_DCN20_MMHUBBUB(pool->base.mcif_wb[i]));
+                       pool->base.mcif_wb[i] = NULL;
+               }
+       }
+
+       for (i = 0; i < pool->base.audio_count; i++) {
+               if (pool->base.audios[i])
+                       dce_aud_destroy(&pool->base.audios[i]);
+       }
+
+       for (i = 0; i < pool->base.clk_src_count; i++) {
+               if (pool->base.clock_sources[i] != NULL) {
+                       dcn20_clock_source_destroy(&pool->base.clock_sources[i]);
+                       pool->base.clock_sources[i] = NULL;
+               }
+       }
+
+       if (pool->base.dp_clock_source != NULL) {
+               dcn20_clock_source_destroy(&pool->base.dp_clock_source);
+               pool->base.dp_clock_source = NULL;
+       }
+
+
+       if (pool->base.abm != NULL)
+               dce_abm_destroy(&pool->base.abm);
+
+       if (pool->base.dmcu != NULL)
+               dce_dmcu_destroy(&pool->base.dmcu);
+
+       if (pool->base.dccg != NULL)
+               dcn_dccg_destroy(&pool->base.dccg);
+
+       if (pool->base.pp_smu != NULL)
+               dcn20_pp_smu_destroy(&pool->base.pp_smu);
+
+       if (pool->base.oem_device != NULL) {
+               struct dc *dc = pool->base.oem_device->ctx->dc;
+
+               dc->link_srv->destroy_ddc_service(&pool->base.oem_device);
+       }
+}
+
+struct hubp *dcn20_hubp_create(
+       struct dc_context *ctx,
+       uint32_t inst)
+{
+       struct dcn20_hubp *hubp2 =
+               kzalloc(sizeof(struct dcn20_hubp), GFP_ATOMIC);
+
+       if (!hubp2)
+               return NULL;
+
+       if (hubp2_construct(hubp2, ctx, inst,
+                       &hubp_regs[inst], &hubp_shift, &hubp_mask))
+               return &hubp2->base;
+
+       BREAK_TO_DEBUGGER();
+       kfree(hubp2);
+       return NULL;
+}
+
+static void get_pixel_clock_parameters(
+       struct pipe_ctx *pipe_ctx,
+       struct pixel_clk_params *pixel_clk_params)
+{
+       const struct dc_stream_state *stream = pipe_ctx->stream;
+       struct pipe_ctx *odm_pipe;
+       int opp_cnt = 1;
+       struct dc_link *link = stream->link;
+       struct link_encoder *link_enc = NULL;
+       struct dc *dc = pipe_ctx->stream->ctx->dc;
+       struct dce_hwseq *hws = dc->hwseq;
+
+       for (odm_pipe = pipe_ctx->next_odm_pipe; odm_pipe; odm_pipe = odm_pipe->next_odm_pipe)
+               opp_cnt++;
+
+       pixel_clk_params->requested_pix_clk_100hz = stream->timing.pix_clk_100hz;
+
+       link_enc = link_enc_cfg_get_link_enc(link);
+       if (link_enc)
+               pixel_clk_params->encoder_object_id = link_enc->id;
+
+       pixel_clk_params->signal_type = pipe_ctx->stream->signal;
+       pixel_clk_params->controller_id = pipe_ctx->stream_res.tg->inst + 1;
+       /* TODO: un-hardcode*/
+       /* TODO - DP2.0 HW: calculate requested_sym_clk for UHBR rates */
+       pixel_clk_params->requested_sym_clk = LINK_RATE_LOW *
+               LINK_RATE_REF_FREQ_IN_KHZ;
+       pixel_clk_params->flags.ENABLE_SS = 0;
+       pixel_clk_params->color_depth =
+               stream->timing.display_color_depth;
+       pixel_clk_params->flags.DISPLAY_BLANKED = 1;
+       pixel_clk_params->pixel_encoding = stream->timing.pixel_encoding;
+
+       if (stream->timing.pixel_encoding == PIXEL_ENCODING_YCBCR422)
+               pixel_clk_params->color_depth = COLOR_DEPTH_888;
+
+       if (opp_cnt == 4)
+               pixel_clk_params->requested_pix_clk_100hz /= 4;
+       else if (optc2_is_two_pixels_per_containter(&stream->timing) || opp_cnt == 2)
+               pixel_clk_params->requested_pix_clk_100hz /= 2;
+       else if (hws->funcs.is_dp_dig_pixel_rate_div_policy) {
+               if (hws->funcs.is_dp_dig_pixel_rate_div_policy(pipe_ctx))
+                       pixel_clk_params->requested_pix_clk_100hz /= 2;
+       }
+
+       if (stream->timing.timing_3d_format == TIMING_3D_FORMAT_HW_FRAME_PACKING)
+               pixel_clk_params->requested_pix_clk_100hz *= 2;
+
+}
+
+static void build_clamping_params(struct dc_stream_state *stream)
+{
+       stream->clamping.clamping_level = CLAMPING_FULL_RANGE;
+       stream->clamping.c_depth = stream->timing.display_color_depth;
+       stream->clamping.pixel_encoding = stream->timing.pixel_encoding;
+}
+
+static enum dc_status build_pipe_hw_param(struct pipe_ctx *pipe_ctx)
+{
+
+       get_pixel_clock_parameters(pipe_ctx, &pipe_ctx->stream_res.pix_clk_params);
+
+       pipe_ctx->clock_source->funcs->get_pix_clk_dividers(
+               pipe_ctx->clock_source,
+               &pipe_ctx->stream_res.pix_clk_params,
+               &pipe_ctx->pll_settings);
+
+       pipe_ctx->stream->clamping.pixel_encoding = pipe_ctx->stream->timing.pixel_encoding;
+
+       resource_build_bit_depth_reduction_params(pipe_ctx->stream,
+                                       &pipe_ctx->stream->bit_depth_params);
+       build_clamping_params(pipe_ctx->stream);
+
+       return DC_OK;
+}
+
+enum dc_status dcn20_build_mapped_resource(const struct dc *dc, struct dc_state *context, struct dc_stream_state *stream)
+{
+       enum dc_status status = DC_OK;
+       struct pipe_ctx *pipe_ctx = resource_get_otg_master_for_stream(&context->res_ctx, stream);
+
+       if (!pipe_ctx)
+               return DC_ERROR_UNEXPECTED;
+
+
+       status = build_pipe_hw_param(pipe_ctx);
+
+       return status;
+}
+
+
+void dcn20_acquire_dsc(const struct dc *dc,
+                       struct resource_context *res_ctx,
+                       struct display_stream_compressor **dsc,
+                       int pipe_idx)
+{
+       int i;
+       const struct resource_pool *pool = dc->res_pool;
+       struct display_stream_compressor *dsc_old = dc->current_state->res_ctx.pipe_ctx[pipe_idx].stream_res.dsc;
+
+       ASSERT(*dsc == NULL); /* If this ASSERT fails, dsc was not released properly */
+       *dsc = NULL;
+
+       /* Always do 1-to-1 mapping when number of DSCs is same as number of pipes */
+       if (pool->res_cap->num_dsc == pool->res_cap->num_opp) {
+               *dsc = pool->dscs[pipe_idx];
+               res_ctx->is_dsc_acquired[pipe_idx] = true;
+               return;
+       }
+
+       /* Return old DSC to avoid the need for re-programming */
+       if (dsc_old && !res_ctx->is_dsc_acquired[dsc_old->inst]) {
+               *dsc = dsc_old;
+               res_ctx->is_dsc_acquired[dsc_old->inst] = true;
+               return ;
+       }
+
+       /* Find first free DSC */
+       for (i = 0; i < pool->res_cap->num_dsc; i++)
+               if (!res_ctx->is_dsc_acquired[i]) {
+                       *dsc = pool->dscs[i];
+                       res_ctx->is_dsc_acquired[i] = true;
+                       break;
+               }
+}
+
+void dcn20_release_dsc(struct resource_context *res_ctx,
+                       const struct resource_pool *pool,
+                       struct display_stream_compressor **dsc)
+{
+       int i;
+
+       for (i = 0; i < pool->res_cap->num_dsc; i++)
+               if (pool->dscs[i] == *dsc) {
+                       res_ctx->is_dsc_acquired[i] = false;
+                       *dsc = NULL;
+                       break;
+               }
+}
+
+
+
+enum dc_status dcn20_add_dsc_to_stream_resource(struct dc *dc,
+               struct dc_state *dc_ctx,
+               struct dc_stream_state *dc_stream)
+{
+       enum dc_status result = DC_OK;
+       int i;
+
+       /* Get a DSC if required and available */
+       for (i = 0; i < dc->res_pool->pipe_count; i++) {
+               struct pipe_ctx *pipe_ctx = &dc_ctx->res_ctx.pipe_ctx[i];
+
+               if (pipe_ctx->top_pipe)
+                       continue;
+
+               if (pipe_ctx->stream != dc_stream)
+                       continue;
+
+               if (pipe_ctx->stream_res.dsc)
+                       continue;
+
+               dcn20_acquire_dsc(dc, &dc_ctx->res_ctx, &pipe_ctx->stream_res.dsc, i);
+
+               /* The number of DSCs can be less than the number of pipes */
+               if (!pipe_ctx->stream_res.dsc) {
+                       result = DC_NO_DSC_RESOURCE;
+               }
+
+               break;
+       }
+
+       return result;
+}
+
+
+static enum dc_status remove_dsc_from_stream_resource(struct dc *dc,
+               struct dc_state *new_ctx,
+               struct dc_stream_state *dc_stream)
+{
+       struct pipe_ctx *pipe_ctx = NULL;
+       int i;
+
+       for (i = 0; i < MAX_PIPES; i++) {
+               if (new_ctx->res_ctx.pipe_ctx[i].stream == dc_stream && !new_ctx->res_ctx.pipe_ctx[i].top_pipe) {
+                       pipe_ctx = &new_ctx->res_ctx.pipe_ctx[i];
+
+                       if (pipe_ctx->stream_res.dsc)
+                               dcn20_release_dsc(&new_ctx->res_ctx, dc->res_pool, &pipe_ctx->stream_res.dsc);
+               }
+       }
+
+       if (!pipe_ctx)
+               return DC_ERROR_UNEXPECTED;
+       else
+               return DC_OK;
+}
+
+
+enum dc_status dcn20_add_stream_to_ctx(struct dc *dc, struct dc_state *new_ctx, struct dc_stream_state *dc_stream)
+{
+       enum dc_status result = DC_ERROR_UNEXPECTED;
+
+       result = resource_map_pool_resources(dc, new_ctx, dc_stream);
+
+       if (result == DC_OK)
+               result = resource_map_phy_clock_resources(dc, new_ctx, dc_stream);
+
+       /* Get a DSC if required and available */
+       if (result == DC_OK && dc_stream->timing.flags.DSC)
+               result = dcn20_add_dsc_to_stream_resource(dc, new_ctx, dc_stream);
+
+       if (result == DC_OK)
+               result = dcn20_build_mapped_resource(dc, new_ctx, dc_stream);
+
+       return result;
+}
+
+
+enum dc_status dcn20_remove_stream_from_ctx(struct dc *dc, struct dc_state *new_ctx, struct dc_stream_state *dc_stream)
+{
+       enum dc_status result = DC_OK;
+
+       result = remove_dsc_from_stream_resource(dc, new_ctx, dc_stream);
+
+       return result;
+}
+
+/**
+ * dcn20_split_stream_for_odm - Check if stream can be splited for ODM
+ *
+ * @dc: DC object with resource pool info required for pipe split
+ * @res_ctx: Persistent state of resources
+ * @prev_odm_pipe: Reference to the previous ODM pipe
+ * @next_odm_pipe: Reference to the next ODM pipe
+ *
+ * This function takes a logically active pipe and a logically free pipe and
+ * halves all the scaling parameters that need to be halved while populating
+ * the free pipe with the required resources and configuring the next/previous
+ * ODM pipe pointers.
+ *
+ * Return:
+ * Return true if split stream for ODM is possible, otherwise, return false.
+ */
+bool dcn20_split_stream_for_odm(
+               const struct dc *dc,
+               struct resource_context *res_ctx,
+               struct pipe_ctx *prev_odm_pipe,
+               struct pipe_ctx *next_odm_pipe)
+{
+       int pipe_idx = next_odm_pipe->pipe_idx;
+       const struct resource_pool *pool = dc->res_pool;
+
+       *next_odm_pipe = *prev_odm_pipe;
+
+       next_odm_pipe->pipe_idx = pipe_idx;
+       next_odm_pipe->plane_res.mi = pool->mis[next_odm_pipe->pipe_idx];
+       next_odm_pipe->plane_res.hubp = pool->hubps[next_odm_pipe->pipe_idx];
+       next_odm_pipe->plane_res.ipp = pool->ipps[next_odm_pipe->pipe_idx];
+       next_odm_pipe->plane_res.xfm = pool->transforms[next_odm_pipe->pipe_idx];
+       next_odm_pipe->plane_res.dpp = pool->dpps[next_odm_pipe->pipe_idx];
+       next_odm_pipe->plane_res.mpcc_inst = pool->dpps[next_odm_pipe->pipe_idx]->inst;
+       next_odm_pipe->stream_res.dsc = NULL;
+       if (prev_odm_pipe->next_odm_pipe && prev_odm_pipe->next_odm_pipe != next_odm_pipe) {
+               next_odm_pipe->next_odm_pipe = prev_odm_pipe->next_odm_pipe;
+               next_odm_pipe->next_odm_pipe->prev_odm_pipe = next_odm_pipe;
+       }
+       if (prev_odm_pipe->top_pipe && prev_odm_pipe->top_pipe->next_odm_pipe) {
+               prev_odm_pipe->top_pipe->next_odm_pipe->bottom_pipe = next_odm_pipe;
+               next_odm_pipe->top_pipe = prev_odm_pipe->top_pipe->next_odm_pipe;
+       }
+       if (prev_odm_pipe->bottom_pipe && prev_odm_pipe->bottom_pipe->next_odm_pipe) {
+               prev_odm_pipe->bottom_pipe->next_odm_pipe->top_pipe = next_odm_pipe;
+               next_odm_pipe->bottom_pipe = prev_odm_pipe->bottom_pipe->next_odm_pipe;
+       }
+       prev_odm_pipe->next_odm_pipe = next_odm_pipe;
+       next_odm_pipe->prev_odm_pipe = prev_odm_pipe;
+
+       if (prev_odm_pipe->plane_state) {
+               struct scaler_data *sd = &prev_odm_pipe->plane_res.scl_data;
+               int new_width;
+
+               /* HACTIVE halved for odm combine */
+               sd->h_active /= 2;
+               /* Calculate new vp and recout for left pipe */
+               /* Need at least 16 pixels width per side */
+               if (sd->recout.x + 16 >= sd->h_active)
+                       return false;
+               new_width = sd->h_active - sd->recout.x;
+               sd->viewport.width -= dc_fixpt_floor(dc_fixpt_mul_int(
+                               sd->ratios.horz, sd->recout.width - new_width));
+               sd->viewport_c.width -= dc_fixpt_floor(dc_fixpt_mul_int(
+                               sd->ratios.horz_c, sd->recout.width - new_width));
+               sd->recout.width = new_width;
+
+               /* Calculate new vp and recout for right pipe */
+               sd = &next_odm_pipe->plane_res.scl_data;
+               /* HACTIVE halved for odm combine */
+               sd->h_active /= 2;
+               /* Need at least 16 pixels width per side */
+               if (new_width <= 16)
+                       return false;
+               new_width = sd->recout.width + sd->recout.x - sd->h_active;
+               sd->viewport.width -= dc_fixpt_floor(dc_fixpt_mul_int(
+                               sd->ratios.horz, sd->recout.width - new_width));
+               sd->viewport_c.width -= dc_fixpt_floor(dc_fixpt_mul_int(
+                               sd->ratios.horz_c, sd->recout.width - new_width));
+               sd->recout.width = new_width;
+               sd->viewport.x += dc_fixpt_floor(dc_fixpt_mul_int(
+                               sd->ratios.horz, sd->h_active - sd->recout.x));
+               sd->viewport_c.x += dc_fixpt_floor(dc_fixpt_mul_int(
+                               sd->ratios.horz_c, sd->h_active - sd->recout.x));
+               sd->recout.x = 0;
+       }
+       if (!next_odm_pipe->top_pipe)
+               next_odm_pipe->stream_res.opp = pool->opps[next_odm_pipe->pipe_idx];
+       else
+               next_odm_pipe->stream_res.opp = next_odm_pipe->top_pipe->stream_res.opp;
+       if (next_odm_pipe->stream->timing.flags.DSC == 1 && !next_odm_pipe->top_pipe) {
+               dcn20_acquire_dsc(dc, res_ctx, &next_odm_pipe->stream_res.dsc, next_odm_pipe->pipe_idx);
+               ASSERT(next_odm_pipe->stream_res.dsc);
+               if (next_odm_pipe->stream_res.dsc == NULL)
+                       return false;
+       }
+
+       return true;
+}
+
+void dcn20_split_stream_for_mpc(
+               struct resource_context *res_ctx,
+               const struct resource_pool *pool,
+               struct pipe_ctx *primary_pipe,
+               struct pipe_ctx *secondary_pipe)
+{
+       int pipe_idx = secondary_pipe->pipe_idx;
+       struct pipe_ctx *sec_bot_pipe = secondary_pipe->bottom_pipe;
+
+       *secondary_pipe = *primary_pipe;
+       secondary_pipe->bottom_pipe = sec_bot_pipe;
+
+       secondary_pipe->pipe_idx = pipe_idx;
+       secondary_pipe->plane_res.mi = pool->mis[secondary_pipe->pipe_idx];
+       secondary_pipe->plane_res.hubp = pool->hubps[secondary_pipe->pipe_idx];
+       secondary_pipe->plane_res.ipp = pool->ipps[secondary_pipe->pipe_idx];
+       secondary_pipe->plane_res.xfm = pool->transforms[secondary_pipe->pipe_idx];
+       secondary_pipe->plane_res.dpp = pool->dpps[secondary_pipe->pipe_idx];
+       secondary_pipe->plane_res.mpcc_inst = pool->dpps[secondary_pipe->pipe_idx]->inst;
+       secondary_pipe->stream_res.dsc = NULL;
+       if (primary_pipe->bottom_pipe && primary_pipe->bottom_pipe != secondary_pipe) {
+               ASSERT(!secondary_pipe->bottom_pipe);
+               secondary_pipe->bottom_pipe = primary_pipe->bottom_pipe;
+               secondary_pipe->bottom_pipe->top_pipe = secondary_pipe;
+       }
+       primary_pipe->bottom_pipe = secondary_pipe;
+       secondary_pipe->top_pipe = primary_pipe;
+
+       ASSERT(primary_pipe->plane_state);
+}
+
+unsigned int dcn20_calc_max_scaled_time(
+               unsigned int time_per_pixel,
+               enum mmhubbub_wbif_mode mode,
+               unsigned int urgent_watermark)
+{
+       unsigned int time_per_byte = 0;
+       unsigned int total_y_free_entry = 0x200; /* two memory piece for luma */
+       unsigned int total_c_free_entry = 0x140; /* two memory piece for chroma */
+       unsigned int small_free_entry, max_free_entry;
+       unsigned int buf_lh_capability;
+       unsigned int max_scaled_time;
+
+       if (mode == PACKED_444) /* packed mode */
+               time_per_byte = time_per_pixel/4;
+       else if (mode == PLANAR_420_8BPC)
+               time_per_byte  = time_per_pixel;
+       else if (mode == PLANAR_420_10BPC) /* p010 */
+               time_per_byte  = time_per_pixel * 819/1024;
+
+       if (time_per_byte == 0)
+               time_per_byte = 1;
+
+       small_free_entry  = (total_y_free_entry > total_c_free_entry) ? total_c_free_entry : total_y_free_entry;
+       max_free_entry    = (mode == PACKED_444) ? total_y_free_entry + total_c_free_entry : small_free_entry;
+       buf_lh_capability = max_free_entry*time_per_byte*32/16; /* there is 4bit fraction */
+       max_scaled_time   = buf_lh_capability - urgent_watermark;
+       return max_scaled_time;
+}
+
+void dcn20_set_mcif_arb_params(
+               struct dc *dc,
+               struct dc_state *context,
+               display_e2e_pipe_params_st *pipes,
+               int pipe_cnt)
+{
+       enum mmhubbub_wbif_mode wbif_mode;
+       struct mcif_arb_params *wb_arb_params;
+       int i, j, dwb_pipe;
+
+       /* Writeback MCIF_WB arbitration parameters */
+       dwb_pipe = 0;
+       for (i = 0; i < dc->res_pool->pipe_count; i++) {
+
+               if (!context->res_ctx.pipe_ctx[i].stream)
+                       continue;
+
+               for (j = 0; j < MAX_DWB_PIPES; j++) {
+                       if (context->res_ctx.pipe_ctx[i].stream->writeback_info[j].wb_enabled == false)
+                               continue;
+
+                       //wb_arb_params = &context->res_ctx.pipe_ctx[i].stream->writeback_info[j].mcif_arb_params;
+                       wb_arb_params = &context->bw_ctx.bw.dcn.bw_writeback.mcif_wb_arb[dwb_pipe];
+
+                       if (context->res_ctx.pipe_ctx[i].stream->writeback_info[j].dwb_params.out_format == dwb_scaler_mode_yuv420) {
+                               if (context->res_ctx.pipe_ctx[i].stream->writeback_info[j].dwb_params.output_depth == DWB_OUTPUT_PIXEL_DEPTH_8BPC)
+                                       wbif_mode = PLANAR_420_8BPC;
+                               else
+                                       wbif_mode = PLANAR_420_10BPC;
+                       } else
+                               wbif_mode = PACKED_444;
+
+                       DC_FP_START();
+                       dcn20_fpu_set_wb_arb_params(wb_arb_params, context, pipes, pipe_cnt, i);
+                       DC_FP_END();
+
+                       wb_arb_params->slice_lines = 32;
+                       wb_arb_params->arbitration_slice = 2;
+                       wb_arb_params->max_scaled_time = dcn20_calc_max_scaled_time(wb_arb_params->time_per_pixel,
+                               wbif_mode,
+                               wb_arb_params->cli_watermark[0]); /* assume 4 watermark sets have the same value */
+
+                       dwb_pipe++;
+
+                       if (dwb_pipe >= MAX_DWB_PIPES)
+                               return;
+               }
+               if (dwb_pipe >= MAX_DWB_PIPES)
+                       return;
+       }
+}
+
+bool dcn20_validate_dsc(struct dc *dc, struct dc_state *new_ctx)
+{
+       int i;
+
+       /* Validate DSC config, dsc count validation is already done */
+       for (i = 0; i < dc->res_pool->pipe_count; i++) {
+               struct pipe_ctx *pipe_ctx = &new_ctx->res_ctx.pipe_ctx[i];
+               struct dc_stream_state *stream = pipe_ctx->stream;
+               struct dsc_config dsc_cfg;
+               struct pipe_ctx *odm_pipe;
+               int opp_cnt = 1;
+
+               for (odm_pipe = pipe_ctx->next_odm_pipe; odm_pipe; odm_pipe = odm_pipe->next_odm_pipe)
+                       opp_cnt++;
+
+               /* Only need to validate top pipe */
+               if (pipe_ctx->top_pipe || pipe_ctx->prev_odm_pipe || !stream || !stream->timing.flags.DSC)
+                       continue;
+
+               dsc_cfg.pic_width = (stream->timing.h_addressable + stream->timing.h_border_left
+                               + stream->timing.h_border_right) / opp_cnt;
+               dsc_cfg.pic_height = stream->timing.v_addressable + stream->timing.v_border_top
+                               + stream->timing.v_border_bottom;
+               dsc_cfg.pixel_encoding = stream->timing.pixel_encoding;
+               dsc_cfg.color_depth = stream->timing.display_color_depth;
+               dsc_cfg.is_odm = pipe_ctx->next_odm_pipe ? true : false;
+               dsc_cfg.dc_dsc_cfg = stream->timing.dsc_cfg;
+               dsc_cfg.dc_dsc_cfg.num_slices_h /= opp_cnt;
+
+               if (!pipe_ctx->stream_res.dsc->funcs->dsc_validate_stream(pipe_ctx->stream_res.dsc, &dsc_cfg))
+                       return false;
+       }
+       return true;
+}
+
+struct pipe_ctx *dcn20_find_secondary_pipe(struct dc *dc,
+               struct resource_context *res_ctx,
+               const struct resource_pool *pool,
+               const struct pipe_ctx *primary_pipe)
+{
+       struct pipe_ctx *secondary_pipe = NULL;
+
+       if (dc && primary_pipe) {
+               int j;
+               int preferred_pipe_idx = 0;
+
+               /* first check the prev dc state:
+                * if this primary pipe has a bottom pipe in prev. state
+                * and if the bottom pipe is still available (which it should be),
+                * pick that pipe as secondary
+                * Same logic applies for ODM pipes
+                */
+               if (dc->current_state->res_ctx.pipe_ctx[primary_pipe->pipe_idx].next_odm_pipe) {
+                       preferred_pipe_idx = dc->current_state->res_ctx.pipe_ctx[primary_pipe->pipe_idx].next_odm_pipe->pipe_idx;
+                       if (res_ctx->pipe_ctx[preferred_pipe_idx].stream == NULL) {
+                               secondary_pipe = &res_ctx->pipe_ctx[preferred_pipe_idx];
+                               secondary_pipe->pipe_idx = preferred_pipe_idx;
+                       }
+               }
+               if (secondary_pipe == NULL &&
+                               dc->current_state->res_ctx.pipe_ctx[primary_pipe->pipe_idx].bottom_pipe) {
+                       preferred_pipe_idx = dc->current_state->res_ctx.pipe_ctx[primary_pipe->pipe_idx].bottom_pipe->pipe_idx;
+                       if (res_ctx->pipe_ctx[preferred_pipe_idx].stream == NULL) {
+                               secondary_pipe = &res_ctx->pipe_ctx[preferred_pipe_idx];
+                               secondary_pipe->pipe_idx = preferred_pipe_idx;
+                       }
+               }
+
+               /*
+                * if this primary pipe does not have a bottom pipe in prev. state
+                * start backward and find a pipe that did not used to be a bottom pipe in
+                * prev. dc state. This way we make sure we keep the same assignment as
+                * last state and will not have to reprogram every pipe
+                */
+               if (secondary_pipe == NULL) {
+                       for (j = dc->res_pool->pipe_count - 1; j >= 0; j--) {
+                               if (dc->current_state->res_ctx.pipe_ctx[j].top_pipe == NULL
+                                               && dc->current_state->res_ctx.pipe_ctx[j].prev_odm_pipe == NULL) {
+                                       preferred_pipe_idx = j;
+
+                                       if (res_ctx->pipe_ctx[preferred_pipe_idx].stream == NULL) {
+                                               secondary_pipe = &res_ctx->pipe_ctx[preferred_pipe_idx];
+                                               secondary_pipe->pipe_idx = preferred_pipe_idx;
+                                               break;
+                                       }
+                               }
+                       }
+               }
+               /*
+                * We should never hit this assert unless assignments are shuffled around
+                * if this happens we will prob. hit a vsync tdr
+                */
+               ASSERT(secondary_pipe);
+               /*
+                * search backwards for the second pipe to keep pipe
+                * assignment more consistent
+                */
+               if (secondary_pipe == NULL) {
+                       for (j = dc->res_pool->pipe_count - 1; j >= 0; j--) {
+                               preferred_pipe_idx = j;
+
+                               if (res_ctx->pipe_ctx[preferred_pipe_idx].stream == NULL) {
+                                       secondary_pipe = &res_ctx->pipe_ctx[preferred_pipe_idx];
+                                       secondary_pipe->pipe_idx = preferred_pipe_idx;
+                                       break;
+                               }
+                       }
+               }
+       }
+
+       return secondary_pipe;
+}
+
+void dcn20_merge_pipes_for_validate(
+               struct dc *dc,
+               struct dc_state *context)
+{
+       int i;
+
+       /* merge previously split odm pipes since mode support needs to make the decision */
+       for (i = 0; i < dc->res_pool->pipe_count; i++) {
+               struct pipe_ctx *pipe = &context->res_ctx.pipe_ctx[i];
+               struct pipe_ctx *odm_pipe = pipe->next_odm_pipe;
+
+               if (pipe->prev_odm_pipe)
+                       continue;
+
+               pipe->next_odm_pipe = NULL;
+               while (odm_pipe) {
+                       struct pipe_ctx *next_odm_pipe = odm_pipe->next_odm_pipe;
+
+                       odm_pipe->plane_state = NULL;
+                       odm_pipe->stream = NULL;
+                       odm_pipe->top_pipe = NULL;
+                       odm_pipe->bottom_pipe = NULL;
+                       odm_pipe->prev_odm_pipe = NULL;
+                       odm_pipe->next_odm_pipe = NULL;
+                       if (odm_pipe->stream_res.dsc)
+                               dcn20_release_dsc(&context->res_ctx, dc->res_pool, &odm_pipe->stream_res.dsc);
+                       /* Clear plane_res and stream_res */
+                       memset(&odm_pipe->plane_res, 0, sizeof(odm_pipe->plane_res));
+                       memset(&odm_pipe->stream_res, 0, sizeof(odm_pipe->stream_res));
+                       odm_pipe = next_odm_pipe;
+               }
+               if (pipe->plane_state)
+                       resource_build_scaling_params(pipe);
+       }
+
+       /* merge previously mpc split pipes since mode support needs to make the decision */
+       for (i = 0; i < dc->res_pool->pipe_count; i++) {
+               struct pipe_ctx *pipe = &context->res_ctx.pipe_ctx[i];
+               struct pipe_ctx *hsplit_pipe = pipe->bottom_pipe;
+
+               if (!hsplit_pipe || hsplit_pipe->plane_state != pipe->plane_state)
+                       continue;
+
+               pipe->bottom_pipe = hsplit_pipe->bottom_pipe;
+               if (hsplit_pipe->bottom_pipe)
+                       hsplit_pipe->bottom_pipe->top_pipe = pipe;
+               hsplit_pipe->plane_state = NULL;
+               hsplit_pipe->stream = NULL;
+               hsplit_pipe->top_pipe = NULL;
+               hsplit_pipe->bottom_pipe = NULL;
+
+               /* Clear plane_res and stream_res */
+               memset(&hsplit_pipe->plane_res, 0, sizeof(hsplit_pipe->plane_res));
+               memset(&hsplit_pipe->stream_res, 0, sizeof(hsplit_pipe->stream_res));
+               if (pipe->plane_state)
+                       resource_build_scaling_params(pipe);
+       }
+}
+
+int dcn20_validate_apply_pipe_split_flags(
+               struct dc *dc,
+               struct dc_state *context,
+               int vlevel,
+               int *split,
+               bool *merge)
+{
+       int i, pipe_idx, vlevel_split;
+       int plane_count = 0;
+       bool force_split = false;
+       bool avoid_split = dc->debug.pipe_split_policy == MPC_SPLIT_AVOID;
+       struct vba_vars_st *v = &context->bw_ctx.dml.vba;
+       int max_mpc_comb = v->maxMpcComb;
+
+       if (context->stream_count > 1) {
+               if (dc->debug.pipe_split_policy == MPC_SPLIT_AVOID_MULT_DISP)
+                       avoid_split = true;
+       } else if (dc->debug.force_single_disp_pipe_split)
+                       force_split = true;
+
+       for (i = 0; i < dc->res_pool->pipe_count; i++) {
+               struct pipe_ctx *pipe = &context->res_ctx.pipe_ctx[i];
+
+               /**
+                * Workaround for avoiding pipe-split in cases where we'd split
+                * planes that are too small, resulting in splits that aren't
+                * valid for the scaler.
+                */
+               if (pipe->plane_state &&
+                   (pipe->plane_state->dst_rect.width <= 16 ||
+                    pipe->plane_state->dst_rect.height <= 16 ||
+                    pipe->plane_state->src_rect.width <= 16 ||
+                    pipe->plane_state->src_rect.height <= 16))
+                       avoid_split = true;
+
+               /* TODO: fix dc bugs and remove this split threshold thing */
+               if (pipe->stream && !pipe->prev_odm_pipe &&
+                               (!pipe->top_pipe || pipe->top_pipe->plane_state != pipe->plane_state))
+                       ++plane_count;
+       }
+       if (plane_count > dc->res_pool->pipe_count / 2)
+               avoid_split = true;
+
+       /* W/A: Mode timing with borders may not work well with pipe split, avoid for this corner case */
+       for (i = 0; i < dc->res_pool->pipe_count; i++) {
+               struct pipe_ctx *pipe = &context->res_ctx.pipe_ctx[i];
+               struct dc_crtc_timing timing;
+
+               if (!pipe->stream)
+                       continue;
+               else {
+                       timing = pipe->stream->timing;
+                       if (timing.h_border_left + timing.h_border_right
+                                       + timing.v_border_top + timing.v_border_bottom > 0) {
+                               avoid_split = true;
+                               break;
+                       }
+               }
+       }
+
+       /* Avoid split loop looks for lowest voltage level that allows most unsplit pipes possible */
+       if (avoid_split) {
+               for (i = 0, pipe_idx = 0; i < dc->res_pool->pipe_count; i++) {
+                       if (!context->res_ctx.pipe_ctx[i].stream)
+                               continue;
+
+                       for (vlevel_split = vlevel; vlevel <= context->bw_ctx.dml.soc.num_states; vlevel++)
+                               if (v->NoOfDPP[vlevel][0][pipe_idx] == 1 &&
+                                               v->ModeSupport[vlevel][0])
+                                       break;
+                       /* Impossible to not split this pipe */
+                       if (vlevel > context->bw_ctx.dml.soc.num_states)
+                               vlevel = vlevel_split;
+                       else
+                               max_mpc_comb = 0;
+                       pipe_idx++;
+               }
+               v->maxMpcComb = max_mpc_comb;
+       }
+
+       /* Split loop sets which pipe should be split based on dml outputs and dc flags */
+       for (i = 0, pipe_idx = 0; i < dc->res_pool->pipe_count; i++) {
+               struct pipe_ctx *pipe = &context->res_ctx.pipe_ctx[i];
+               int pipe_plane = v->pipe_plane[pipe_idx];
+               bool split4mpc = context->stream_count == 1 && plane_count == 1
+                               && dc->config.enable_4to1MPC && dc->res_pool->pipe_count >= 4;
+
+               if (!context->res_ctx.pipe_ctx[i].stream)
+                       continue;
+
+               if (split4mpc || v->NoOfDPP[vlevel][max_mpc_comb][pipe_plane] == 4)
+                       split[i] = 4;
+               else if (force_split || v->NoOfDPP[vlevel][max_mpc_comb][pipe_plane] == 2)
+                               split[i] = 2;
+
+               if ((pipe->stream->view_format ==
+                               VIEW_3D_FORMAT_SIDE_BY_SIDE ||
+                               pipe->stream->view_format ==
+                               VIEW_3D_FORMAT_TOP_AND_BOTTOM) &&
+                               (pipe->stream->timing.timing_3d_format ==
+                               TIMING_3D_FORMAT_TOP_AND_BOTTOM ||
+                                pipe->stream->timing.timing_3d_format ==
+                               TIMING_3D_FORMAT_SIDE_BY_SIDE))
+                       split[i] = 2;
+               if (dc->debug.force_odm_combine & (1 << pipe->stream_res.tg->inst)) {
+                       split[i] = 2;
+                       v->ODMCombineEnablePerState[vlevel][pipe_plane] = dm_odm_combine_mode_2to1;
+               }
+               if (dc->debug.force_odm_combine_4to1 & (1 << pipe->stream_res.tg->inst)) {
+                       split[i] = 4;
+                       v->ODMCombineEnablePerState[vlevel][pipe_plane] = dm_odm_combine_mode_4to1;
+               }
+               /*420 format workaround*/
+               if (pipe->stream->timing.h_addressable > 7680 &&
+                               pipe->stream->timing.pixel_encoding == PIXEL_ENCODING_YCBCR420) {
+                       split[i] = 4;
+               }
+               v->ODMCombineEnabled[pipe_plane] =
+                       v->ODMCombineEnablePerState[vlevel][pipe_plane];
+
+               if (v->ODMCombineEnabled[pipe_plane] == dm_odm_combine_mode_disabled) {
+                       if (resource_get_mpc_slice_count(pipe) == 2) {
+                               /*If need split for mpc but 2 way split already*/
+                               if (split[i] == 4)
+                                       split[i] = 2; /* 2 -> 4 MPC */
+                               else if (split[i] == 2)
+                                       split[i] = 0; /* 2 -> 2 MPC */
+                               else if (pipe->top_pipe && pipe->top_pipe->plane_state == pipe->plane_state)
+                                       merge[i] = true; /* 2 -> 1 MPC */
+                       } else if (resource_get_mpc_slice_count(pipe) == 4) {
+                               /*If need split for mpc but 4 way split already*/
+                               if (split[i] == 2 && ((pipe->top_pipe && !pipe->top_pipe->top_pipe)
+                                               || !pipe->bottom_pipe)) {
+                                       merge[i] = true; /* 4 -> 2 MPC */
+                               } else if (split[i] == 0 && pipe->top_pipe &&
+                                               pipe->top_pipe->plane_state == pipe->plane_state)
+                                       merge[i] = true; /* 4 -> 1 MPC */
+                               split[i] = 0;
+                       } else if (resource_get_odm_slice_count(pipe) > 1) {
+                               /* ODM -> MPC transition */
+                               if (pipe->prev_odm_pipe) {
+                                       split[i] = 0;
+                                       merge[i] = true;
+                               }
+                       }
+               } else {
+                       if (resource_get_odm_slice_count(pipe) == 2) {
+                               /*If need split for odm but 2 way split already*/
+                               if (split[i] == 4)
+                                       split[i] = 2; /* 2 -> 4 ODM */
+                               else if (split[i] == 2)
+                                       split[i] = 0; /* 2 -> 2 ODM */
+                               else if (pipe->prev_odm_pipe) {
+                                       ASSERT(0); /* NOT expected yet */
+                                       merge[i] = true; /* exit ODM */
+                               }
+                       } else if (resource_get_odm_slice_count(pipe) == 4) {
+                               /*If need split for odm but 4 way split already*/
+                               if (split[i] == 2 && ((pipe->prev_odm_pipe && !pipe->prev_odm_pipe->prev_odm_pipe)
+                                               || !pipe->next_odm_pipe)) {
+                                       merge[i] = true; /* 4 -> 2 ODM */
+                               } else if (split[i] == 0 && pipe->prev_odm_pipe) {
+                                       ASSERT(0); /* NOT expected yet */
+                                       merge[i] = true; /* exit ODM */
+                               }
+                               split[i] = 0;
+                       } else if (resource_get_mpc_slice_count(pipe) > 1) {
+                               /* MPC -> ODM transition */
+                               ASSERT(0); /* NOT expected yet */
+                               if (pipe->top_pipe && pipe->top_pipe->plane_state == pipe->plane_state) {
+                                       split[i] = 0;
+                                       merge[i] = true;
+                               }
+                       }
+               }
+
+               /* Adjust dppclk when split is forced, do not bother with dispclk */
+               if (split[i] != 0 && v->NoOfDPP[vlevel][max_mpc_comb][pipe_idx] == 1) {
+                       DC_FP_START();
+                       dcn20_fpu_adjust_dppclk(v, vlevel, max_mpc_comb, pipe_idx, false);
+                       DC_FP_END();
+               }
+               pipe_idx++;
+       }
+
+       return vlevel;
+}
+
+bool dcn20_fast_validate_bw(
+               struct dc *dc,
+               struct dc_state *context,
+               display_e2e_pipe_params_st *pipes,
+               int *pipe_cnt_out,
+               int *pipe_split_from,
+               int *vlevel_out,
+               bool fast_validate)
+{
+       bool out = false;
+       int split[MAX_PIPES] = { 0 };
+       int pipe_cnt, i, pipe_idx, vlevel;
+
+       ASSERT(pipes);
+       if (!pipes)
+               return false;
+
+       dcn20_merge_pipes_for_validate(dc, context);
+
+       DC_FP_START();
+       pipe_cnt = dc->res_pool->funcs->populate_dml_pipes(dc, context, pipes, fast_validate);
+       DC_FP_END();
+
+       *pipe_cnt_out = pipe_cnt;
+
+       if (!pipe_cnt) {
+               out = true;
+               goto validate_out;
+       }
+
+       vlevel = dml_get_voltage_level(&context->bw_ctx.dml, pipes, pipe_cnt);
+
+       if (vlevel > context->bw_ctx.dml.soc.num_states)
+               goto validate_fail;
+
+       vlevel = dcn20_validate_apply_pipe_split_flags(dc, context, vlevel, split, NULL);
+
+       /*initialize pipe_just_split_from to invalid idx*/
+       for (i = 0; i < MAX_PIPES; i++)
+               pipe_split_from[i] = -1;
+
+       for (i = 0, pipe_idx = -1; i < dc->res_pool->pipe_count; i++) {
+               struct pipe_ctx *pipe = &context->res_ctx.pipe_ctx[i];
+               struct pipe_ctx *hsplit_pipe = pipe->bottom_pipe;
+
+               if (!pipe->stream || pipe_split_from[i] >= 0)
+                       continue;
+
+               pipe_idx++;
+
+               if (!pipe->top_pipe && !pipe->plane_state && context->bw_ctx.dml.vba.ODMCombineEnabled[pipe_idx]) {
+                       hsplit_pipe = dcn20_find_secondary_pipe(dc, &context->res_ctx, dc->res_pool, pipe);
+                       ASSERT(hsplit_pipe);
+                       if (!dcn20_split_stream_for_odm(
+                                       dc, &context->res_ctx,
+                                       pipe, hsplit_pipe))
+                               goto validate_fail;
+                       pipe_split_from[hsplit_pipe->pipe_idx] = pipe_idx;
+                       dcn20_build_mapped_resource(dc, context, pipe->stream);
+               }
+
+               if (!pipe->plane_state)
+                       continue;
+               /* Skip 2nd half of already split pipe */
+               if (pipe->top_pipe && pipe->plane_state == pipe->top_pipe->plane_state)
+                       continue;
+
+               /* We do not support mpo + odm at the moment */
+               if (hsplit_pipe && hsplit_pipe->plane_state != pipe->plane_state
+                               && context->bw_ctx.dml.vba.ODMCombineEnabled[pipe_idx])
+                       goto validate_fail;
+
+               if (split[i] == 2) {
+                       if (!hsplit_pipe || hsplit_pipe->plane_state != pipe->plane_state) {
+                               /* pipe not split previously needs split */
+                               hsplit_pipe = dcn20_find_secondary_pipe(dc, &context->res_ctx, dc->res_pool, pipe);
+                               ASSERT(hsplit_pipe);
+                               if (!hsplit_pipe) {
+                                       DC_FP_START();
+                                       dcn20_fpu_adjust_dppclk(&context->bw_ctx.dml.vba, vlevel, context->bw_ctx.dml.vba.maxMpcComb, pipe_idx, true);
+                                       DC_FP_END();
+                                       continue;
+                               }
+                               if (context->bw_ctx.dml.vba.ODMCombineEnabled[pipe_idx]) {
+                                       if (!dcn20_split_stream_for_odm(
+                                                       dc, &context->res_ctx,
+                                                       pipe, hsplit_pipe))
+                                               goto validate_fail;
+                                       dcn20_build_mapped_resource(dc, context, pipe->stream);
+                               } else {
+                                       dcn20_split_stream_for_mpc(
+                                                       &context->res_ctx, dc->res_pool,
+                                                       pipe, hsplit_pipe);
+                                       resource_build_scaling_params(pipe);
+                                       resource_build_scaling_params(hsplit_pipe);
+                               }
+                               pipe_split_from[hsplit_pipe->pipe_idx] = pipe_idx;
+                       }
+               } else if (hsplit_pipe && hsplit_pipe->plane_state == pipe->plane_state) {
+                       /* merge should already have been done */
+                       ASSERT(0);
+               }
+       }
+       /* Actual dsc count per stream dsc validation*/
+       if (!dcn20_validate_dsc(dc, context)) {
+               context->bw_ctx.dml.vba.ValidationStatus[context->bw_ctx.dml.vba.soc.num_states] =
+                               DML_FAIL_DSC_VALIDATION_FAILURE;
+               goto validate_fail;
+       }
+
+       *vlevel_out = vlevel;
+
+       out = true;
+       goto validate_out;
+
+validate_fail:
+       out = false;
+
+validate_out:
+       return out;
+}
+
+bool dcn20_validate_bandwidth(struct dc *dc, struct dc_state *context,
+               bool fast_validate)
+{
+       bool voltage_supported;
+       display_e2e_pipe_params_st *pipes;
+
+       pipes = kcalloc(dc->res_pool->pipe_count, sizeof(display_e2e_pipe_params_st), GFP_KERNEL);
+       if (!pipes)
+               return false;
+
+       DC_FP_START();
+       voltage_supported = dcn20_validate_bandwidth_fp(dc, context, fast_validate, pipes);
+       DC_FP_END();
+
+       kfree(pipes);
+       return voltage_supported;
+}
+
+struct pipe_ctx *dcn20_acquire_free_pipe_for_layer(
+               const struct dc_state *cur_ctx,
+               struct dc_state *new_ctx,
+               const struct resource_pool *pool,
+               const struct pipe_ctx *opp_head)
+{
+       struct resource_context *res_ctx = &new_ctx->res_ctx;
+       struct pipe_ctx *otg_master = resource_get_otg_master_for_stream(res_ctx, opp_head->stream);
+       struct pipe_ctx *sec_dpp_pipe = resource_find_free_secondary_pipe_legacy(res_ctx, pool, otg_master);
+
+       ASSERT(otg_master);
+
+       if (!sec_dpp_pipe)
+               return NULL;
+
+       sec_dpp_pipe->stream = opp_head->stream;
+       sec_dpp_pipe->stream_res.tg = opp_head->stream_res.tg;
+       sec_dpp_pipe->stream_res.opp = opp_head->stream_res.opp;
+
+       sec_dpp_pipe->plane_res.hubp = pool->hubps[sec_dpp_pipe->pipe_idx];
+       sec_dpp_pipe->plane_res.ipp = pool->ipps[sec_dpp_pipe->pipe_idx];
+       sec_dpp_pipe->plane_res.dpp = pool->dpps[sec_dpp_pipe->pipe_idx];
+       sec_dpp_pipe->plane_res.mpcc_inst = pool->dpps[sec_dpp_pipe->pipe_idx]->inst;
+
+       return sec_dpp_pipe;
+}
+
+bool dcn20_get_dcc_compression_cap(const struct dc *dc,
+               const struct dc_dcc_surface_param *input,
+               struct dc_surface_dcc_cap *output)
+{
+       return dc->res_pool->hubbub->funcs->get_dcc_compression_cap(
+                       dc->res_pool->hubbub,
+                       input,
+                       output);
+}
+
+static void dcn20_destroy_resource_pool(struct resource_pool **pool)
+{
+       struct dcn20_resource_pool *dcn20_pool = TO_DCN20_RES_POOL(*pool);
+
+       dcn20_resource_destruct(dcn20_pool);
+       kfree(dcn20_pool);
+       *pool = NULL;
+}
+
+
+static struct dc_cap_funcs cap_funcs = {
+       .get_dcc_compression_cap = dcn20_get_dcc_compression_cap
+};
+
+
+enum dc_status dcn20_patch_unknown_plane_state(struct dc_plane_state *plane_state)
+{
+       enum surface_pixel_format surf_pix_format = plane_state->format;
+       unsigned int bpp = resource_pixel_format_to_bpp(surf_pix_format);
+
+       plane_state->tiling_info.gfx9.swizzle = DC_SW_64KB_S;
+       if (bpp == 64)
+               plane_state->tiling_info.gfx9.swizzle = DC_SW_64KB_D;
+
+       return DC_OK;
+}
+
+void dcn20_release_pipe(struct dc_state *context,
+                       struct pipe_ctx *pipe,
+                       const struct resource_pool *pool)
+{
+       if (resource_is_pipe_type(pipe, OPP_HEAD) && pipe->stream_res.dsc)
+               dcn20_release_dsc(&context->res_ctx, pool, &pipe->stream_res.dsc);
+       memset(pipe, 0, sizeof(*pipe));
+}
+
+static const struct resource_funcs dcn20_res_pool_funcs = {
+       .destroy = dcn20_destroy_resource_pool,
+       .link_enc_create = dcn20_link_encoder_create,
+       .panel_cntl_create = dcn20_panel_cntl_create,
+       .validate_bandwidth = dcn20_validate_bandwidth,
+       .acquire_free_pipe_as_secondary_dpp_pipe = dcn20_acquire_free_pipe_for_layer,
+       .release_pipe = dcn20_release_pipe,
+       .add_stream_to_ctx = dcn20_add_stream_to_ctx,
+       .add_dsc_to_stream_resource = dcn20_add_dsc_to_stream_resource,
+       .remove_stream_from_ctx = dcn20_remove_stream_from_ctx,
+       .populate_dml_writeback_from_context = dcn20_populate_dml_writeback_from_context,
+       .patch_unknown_plane_state = dcn20_patch_unknown_plane_state,
+       .set_mcif_arb_params = dcn20_set_mcif_arb_params,
+       .populate_dml_pipes = dcn20_populate_dml_pipes_from_context,
+       .find_first_free_match_stream_enc_for_link = dcn10_find_first_free_match_stream_enc_for_link
+};
+
+bool dcn20_dwbc_create(struct dc_context *ctx, struct resource_pool *pool)
+{
+       int i;
+       uint32_t pipe_count = pool->res_cap->num_dwb;
+
+       for (i = 0; i < pipe_count; i++) {
+               struct dcn20_dwbc *dwbc20 = kzalloc(sizeof(struct dcn20_dwbc),
+                                                   GFP_KERNEL);
+
+               if (!dwbc20) {
+                       dm_error("DC: failed to create dwbc20!\n");
+                       return false;
+               }
+               dcn20_dwbc_construct(dwbc20, ctx,
+                               &dwbc20_regs[i],
+                               &dwbc20_shift,
+                               &dwbc20_mask,
+                               i);
+               pool->dwbc[i] = &dwbc20->base;
+       }
+       return true;
+}
+
+bool dcn20_mmhubbub_create(struct dc_context *ctx, struct resource_pool *pool)
+{
+       int i;
+       uint32_t pipe_count = pool->res_cap->num_dwb;
+
+       ASSERT(pipe_count > 0);
+
+       for (i = 0; i < pipe_count; i++) {
+               struct dcn20_mmhubbub *mcif_wb20 = kzalloc(sizeof(struct dcn20_mmhubbub),
+                                                   GFP_KERNEL);
+
+               if (!mcif_wb20) {
+                       dm_error("DC: failed to create mcif_wb20!\n");
+                       return false;
+               }
+
+               dcn20_mmhubbub_construct(mcif_wb20, ctx,
+                               &mcif_wb20_regs[i],
+                               &mcif_wb20_shift,
+                               &mcif_wb20_mask,
+                               i);
+
+               pool->mcif_wb[i] = &mcif_wb20->base;
+       }
+       return true;
+}
+
+static struct pp_smu_funcs *dcn20_pp_smu_create(struct dc_context *ctx)
+{
+       struct pp_smu_funcs *pp_smu = kzalloc(sizeof(*pp_smu), GFP_ATOMIC);
+
+       if (!pp_smu)
+               return pp_smu;
+
+       dm_pp_get_funcs(ctx, pp_smu);
+
+       if (pp_smu->ctx.ver != PP_SMU_VER_NV)
+               pp_smu = memset(pp_smu, 0, sizeof(struct pp_smu_funcs));
+
+       return pp_smu;
+}
+
+static void dcn20_pp_smu_destroy(struct pp_smu_funcs **pp_smu)
+{
+       if (pp_smu && *pp_smu) {
+               kfree(*pp_smu);
+               *pp_smu = NULL;
+       }
+}
+
+static struct _vcs_dpi_soc_bounding_box_st *get_asic_rev_soc_bb(
+       uint32_t hw_internal_rev)
+{
+       if (ASICREV_IS_NAVI14_M(hw_internal_rev))
+               return &dcn2_0_nv14_soc;
+
+       if (ASICREV_IS_NAVI12_P(hw_internal_rev))
+               return &dcn2_0_nv12_soc;
+
+       return &dcn2_0_soc;
+}
+
+static struct _vcs_dpi_ip_params_st *get_asic_rev_ip_params(
+       uint32_t hw_internal_rev)
+{
+       /* NV14 */
+       if (ASICREV_IS_NAVI14_M(hw_internal_rev))
+               return &dcn2_0_nv14_ip;
+
+       /* NV12 and NV10 */
+       return &dcn2_0_ip;
+}
+
+static enum dml_project get_dml_project_version(uint32_t hw_internal_rev)
+{
+       return DML_PROJECT_NAVI10v2;
+}
+
+static bool init_soc_bounding_box(struct dc *dc,
+                                 struct dcn20_resource_pool *pool)
+{
+       struct _vcs_dpi_soc_bounding_box_st *loaded_bb =
+                       get_asic_rev_soc_bb(dc->ctx->asic_id.hw_internal_rev);
+       struct _vcs_dpi_ip_params_st *loaded_ip =
+                       get_asic_rev_ip_params(dc->ctx->asic_id.hw_internal_rev);
+
+       DC_LOGGER_INIT(dc->ctx->logger);
+
+       if (pool->base.pp_smu) {
+               struct pp_smu_nv_clock_table max_clocks = {0};
+               unsigned int uclk_states[8] = {0};
+               unsigned int num_states = 0;
+               enum pp_smu_status status;
+               bool clock_limits_available = false;
+               bool uclk_states_available = false;
+
+               if (pool->base.pp_smu->nv_funcs.get_uclk_dpm_states) {
+                       status = (pool->base.pp_smu->nv_funcs.get_uclk_dpm_states)
+                               (&pool->base.pp_smu->nv_funcs.pp_smu, uclk_states, &num_states);
+
+                       uclk_states_available = (status == PP_SMU_RESULT_OK);
+               }
+
+               if (pool->base.pp_smu->nv_funcs.get_maximum_sustainable_clocks) {
+                       status = (*pool->base.pp_smu->nv_funcs.get_maximum_sustainable_clocks)
+                                       (&pool->base.pp_smu->nv_funcs.pp_smu, &max_clocks);
+                       /* SMU cannot set DCF clock to anything equal to or higher than SOC clock
+                        */
+                       if (max_clocks.dcfClockInKhz >= max_clocks.socClockInKhz)
+                               max_clocks.dcfClockInKhz = max_clocks.socClockInKhz - 1000;
+                       clock_limits_available = (status == PP_SMU_RESULT_OK);
+               }
+
+               if (clock_limits_available && uclk_states_available && num_states) {
+                       DC_FP_START();
+                       dcn20_update_bounding_box(dc, loaded_bb, &max_clocks, uclk_states, num_states);
+                       DC_FP_END();
+               } else if (clock_limits_available) {
+                       DC_FP_START();
+                       dcn20_cap_soc_clocks(loaded_bb, max_clocks);
+                       DC_FP_END();
+               }
+       }
+
+       loaded_ip->max_num_otg = pool->base.res_cap->num_timing_generator;
+       loaded_ip->max_num_dpp = pool->base.pipe_count;
+       DC_FP_START();
+       dcn20_patch_bounding_box(dc, loaded_bb);
+       DC_FP_END();
+       return true;
+}
+
+static bool dcn20_resource_construct(
+       uint8_t num_virtual_links,
+       struct dc *dc,
+       struct dcn20_resource_pool *pool)
+{
+       int i;
+       struct dc_context *ctx = dc->ctx;
+       struct irq_service_init_data init_data;
+       struct ddc_service_init_data ddc_init_data = {0};
+       struct _vcs_dpi_soc_bounding_box_st *loaded_bb =
+                       get_asic_rev_soc_bb(ctx->asic_id.hw_internal_rev);
+       struct _vcs_dpi_ip_params_st *loaded_ip =
+                       get_asic_rev_ip_params(ctx->asic_id.hw_internal_rev);
+       enum dml_project dml_project_version =
+                       get_dml_project_version(ctx->asic_id.hw_internal_rev);
+
+       ctx->dc_bios->regs = &bios_regs;
+       pool->base.funcs = &dcn20_res_pool_funcs;
+
+       if (ASICREV_IS_NAVI14_M(ctx->asic_id.hw_internal_rev)) {
+               pool->base.res_cap = &res_cap_nv14;
+               pool->base.pipe_count = 5;
+               pool->base.mpcc_count = 5;
+       } else {
+               pool->base.res_cap = &res_cap_nv10;
+               pool->base.pipe_count = 6;
+               pool->base.mpcc_count = 6;
+       }
+       /*************************************************
+        *  Resource + asic cap harcoding                *
+        *************************************************/
+       pool->base.underlay_pipe_index = NO_UNDERLAY_PIPE;
+
+       dc->caps.max_downscale_ratio = 200;
+       dc->caps.i2c_speed_in_khz = 100;
+       dc->caps.i2c_speed_in_khz_hdcp = 100; /*1.4 w/a not applied by default*/
+       dc->caps.max_cursor_size = 256;
+       dc->caps.min_horizontal_blanking_period = 80;
+       dc->caps.dmdata_alloc_size = 2048;
+
+       dc->caps.max_slave_planes = 1;
+       dc->caps.max_slave_yuv_planes = 1;
+       dc->caps.max_slave_rgb_planes = 1;
+       dc->caps.post_blend_color_processing = true;
+       dc->caps.force_dp_tps4_for_cp2520 = true;
+       dc->caps.extended_aux_timeout_support = true;
+
+       /* Color pipeline capabilities */
+       dc->caps.color.dpp.dcn_arch = 1;
+       dc->caps.color.dpp.input_lut_shared = 0;
+       dc->caps.color.dpp.icsc = 1;
+       dc->caps.color.dpp.dgam_ram = 1;
+       dc->caps.color.dpp.dgam_rom_caps.srgb = 1;
+       dc->caps.color.dpp.dgam_rom_caps.bt2020 = 1;
+       dc->caps.color.dpp.dgam_rom_caps.gamma2_2 = 0;
+       dc->caps.color.dpp.dgam_rom_caps.pq = 0;
+       dc->caps.color.dpp.dgam_rom_caps.hlg = 0;
+       dc->caps.color.dpp.post_csc = 0;
+       dc->caps.color.dpp.gamma_corr = 0;
+       dc->caps.color.dpp.dgam_rom_for_yuv = 1;
+
+       dc->caps.color.dpp.hw_3d_lut = 1;
+       dc->caps.color.dpp.ogam_ram = 1;
+       // no OGAM ROM on DCN2, only MPC ROM
+       dc->caps.color.dpp.ogam_rom_caps.srgb = 0;
+       dc->caps.color.dpp.ogam_rom_caps.bt2020 = 0;
+       dc->caps.color.dpp.ogam_rom_caps.gamma2_2 = 0;
+       dc->caps.color.dpp.ogam_rom_caps.pq = 0;
+       dc->caps.color.dpp.ogam_rom_caps.hlg = 0;
+       dc->caps.color.dpp.ocsc = 0;
+
+       dc->caps.color.mpc.gamut_remap = 0;
+       dc->caps.color.mpc.num_3dluts = 0;
+       dc->caps.color.mpc.shared_3d_lut = 0;
+       dc->caps.color.mpc.ogam_ram = 1;
+       dc->caps.color.mpc.ogam_rom_caps.srgb = 0;
+       dc->caps.color.mpc.ogam_rom_caps.bt2020 = 0;
+       dc->caps.color.mpc.ogam_rom_caps.gamma2_2 = 0;
+       dc->caps.color.mpc.ogam_rom_caps.pq = 0;
+       dc->caps.color.mpc.ogam_rom_caps.hlg = 0;
+       dc->caps.color.mpc.ocsc = 1;
+
+       dc->caps.dp_hdmi21_pcon_support = true;
+
+       if (dc->ctx->dce_environment == DCE_ENV_PRODUCTION_DRV)
+               dc->debug = debug_defaults_drv;
+
+       //dcn2.0x
+       dc->work_arounds.dedcn20_305_wa = true;
+
+       // Init the vm_helper
+       if (dc->vm_helper)
+               vm_helper_init(dc->vm_helper, 16);
+
+       /*************************************************
+        *  Create resources                             *
+        *************************************************/
+
+       pool->base.clock_sources[DCN20_CLK_SRC_PLL0] =
+                       dcn20_clock_source_create(ctx, ctx->dc_bios,
+                               CLOCK_SOURCE_COMBO_PHY_PLL0,
+                               &clk_src_regs[0], false);
+       pool->base.clock_sources[DCN20_CLK_SRC_PLL1] =
+                       dcn20_clock_source_create(ctx, ctx->dc_bios,
+                               CLOCK_SOURCE_COMBO_PHY_PLL1,
+                               &clk_src_regs[1], false);
+       pool->base.clock_sources[DCN20_CLK_SRC_PLL2] =
+                       dcn20_clock_source_create(ctx, ctx->dc_bios,
+                               CLOCK_SOURCE_COMBO_PHY_PLL2,
+                               &clk_src_regs[2], false);
+       pool->base.clock_sources[DCN20_CLK_SRC_PLL3] =
+                       dcn20_clock_source_create(ctx, ctx->dc_bios,
+                               CLOCK_SOURCE_COMBO_PHY_PLL3,
+                               &clk_src_regs[3], false);
+       pool->base.clock_sources[DCN20_CLK_SRC_PLL4] =
+                       dcn20_clock_source_create(ctx, ctx->dc_bios,
+                               CLOCK_SOURCE_COMBO_PHY_PLL4,
+                               &clk_src_regs[4], false);
+       pool->base.clock_sources[DCN20_CLK_SRC_PLL5] =
+                       dcn20_clock_source_create(ctx, ctx->dc_bios,
+                               CLOCK_SOURCE_COMBO_PHY_PLL5,
+                               &clk_src_regs[5], false);
+       pool->base.clk_src_count = DCN20_CLK_SRC_TOTAL;
+       /* todo: not reuse phy_pll registers */
+       pool->base.dp_clock_source =
+                       dcn20_clock_source_create(ctx, ctx->dc_bios,
+                               CLOCK_SOURCE_ID_DP_DTO,
+                               &clk_src_regs[0], true);
+
+       for (i = 0; i < pool->base.clk_src_count; i++) {
+               if (pool->base.clock_sources[i] == NULL) {
+                       dm_error("DC: failed to create clock sources!\n");
+                       BREAK_TO_DEBUGGER();
+                       goto create_fail;
+               }
+       }
+
+       pool->base.dccg = dccg2_create(ctx, &dccg_regs, &dccg_shift, &dccg_mask);
+       if (pool->base.dccg == NULL) {
+               dm_error("DC: failed to create dccg!\n");
+               BREAK_TO_DEBUGGER();
+               goto create_fail;
+       }
+
+       pool->base.dmcu = dcn20_dmcu_create(ctx,
+                       &dmcu_regs,
+                       &dmcu_shift,
+                       &dmcu_mask);
+       if (pool->base.dmcu == NULL) {
+               dm_error("DC: failed to create dmcu!\n");
+               BREAK_TO_DEBUGGER();
+               goto create_fail;
+       }
+
+       pool->base.abm = dce_abm_create(ctx,
+                       &abm_regs,
+                       &abm_shift,
+                       &abm_mask);
+       if (pool->base.abm == NULL) {
+               dm_error("DC: failed to create abm!\n");
+               BREAK_TO_DEBUGGER();
+               goto create_fail;
+       }
+
+       pool->base.pp_smu = dcn20_pp_smu_create(ctx);
+
+
+       if (!init_soc_bounding_box(dc, pool)) {
+               dm_error("DC: failed to initialize soc bounding box!\n");
+               BREAK_TO_DEBUGGER();
+               goto create_fail;
+       }
+
+       dml_init_instance(&dc->dml, loaded_bb, loaded_ip, dml_project_version);
+
+       if (!dc->debug.disable_pplib_wm_range) {
+               struct pp_smu_wm_range_sets ranges = {0};
+               int i = 0;
+
+               ranges.num_reader_wm_sets = 0;
+
+               if (loaded_bb->num_states == 1) {
+                       ranges.reader_wm_sets[0].wm_inst = i;
+                       ranges.reader_wm_sets[0].min_drain_clk_mhz = PP_SMU_WM_SET_RANGE_CLK_UNCONSTRAINED_MIN;
+                       ranges.reader_wm_sets[0].max_drain_clk_mhz = PP_SMU_WM_SET_RANGE_CLK_UNCONSTRAINED_MAX;
+                       ranges.reader_wm_sets[0].min_fill_clk_mhz = PP_SMU_WM_SET_RANGE_CLK_UNCONSTRAINED_MIN;
+                       ranges.reader_wm_sets[0].max_fill_clk_mhz = PP_SMU_WM_SET_RANGE_CLK_UNCONSTRAINED_MAX;
+
+                       ranges.num_reader_wm_sets = 1;
+               } else if (loaded_bb->num_states > 1) {
+                       for (i = 0; i < 4 && i < loaded_bb->num_states; i++) {
+                               ranges.reader_wm_sets[i].wm_inst = i;
+                               ranges.reader_wm_sets[i].min_drain_clk_mhz = PP_SMU_WM_SET_RANGE_CLK_UNCONSTRAINED_MIN;
+                               ranges.reader_wm_sets[i].max_drain_clk_mhz = PP_SMU_WM_SET_RANGE_CLK_UNCONSTRAINED_MAX;
+                               DC_FP_START();
+                               dcn20_fpu_set_wm_ranges(i, &ranges, loaded_bb);
+                               DC_FP_END();
+
+                               ranges.num_reader_wm_sets = i + 1;
+                       }
+
+                       ranges.reader_wm_sets[0].min_fill_clk_mhz = PP_SMU_WM_SET_RANGE_CLK_UNCONSTRAINED_MIN;
+                       ranges.reader_wm_sets[ranges.num_reader_wm_sets - 1].max_fill_clk_mhz = PP_SMU_WM_SET_RANGE_CLK_UNCONSTRAINED_MAX;
+               }
+
+               ranges.num_writer_wm_sets = 1;
+
+               ranges.writer_wm_sets[0].wm_inst = 0;
+               ranges.writer_wm_sets[0].min_fill_clk_mhz = PP_SMU_WM_SET_RANGE_CLK_UNCONSTRAINED_MIN;
+               ranges.writer_wm_sets[0].max_fill_clk_mhz = PP_SMU_WM_SET_RANGE_CLK_UNCONSTRAINED_MAX;
+               ranges.writer_wm_sets[0].min_drain_clk_mhz = PP_SMU_WM_SET_RANGE_CLK_UNCONSTRAINED_MIN;
+               ranges.writer_wm_sets[0].max_drain_clk_mhz = PP_SMU_WM_SET_RANGE_CLK_UNCONSTRAINED_MAX;
+
+               /* Notify PP Lib/SMU which Watermarks to use for which clock ranges */
+               if (pool->base.pp_smu->nv_funcs.set_wm_ranges)
+                       pool->base.pp_smu->nv_funcs.set_wm_ranges(&pool->base.pp_smu->nv_funcs.pp_smu, &ranges);
+       }
+
+       init_data.ctx = dc->ctx;
+       pool->base.irqs = dal_irq_service_dcn20_create(&init_data);
+       if (!pool->base.irqs)
+               goto create_fail;
+
+       /* mem input -> ipp -> dpp -> opp -> TG */
+       for (i = 0; i < pool->base.pipe_count; i++) {
+               pool->base.hubps[i] = dcn20_hubp_create(ctx, i);
+               if (pool->base.hubps[i] == NULL) {
+                       BREAK_TO_DEBUGGER();
+                       dm_error(
+                               "DC: failed to create memory input!\n");
+                       goto create_fail;
+               }
+
+               pool->base.ipps[i] = dcn20_ipp_create(ctx, i);
+               if (pool->base.ipps[i] == NULL) {
+                       BREAK_TO_DEBUGGER();
+                       dm_error(
+                               "DC: failed to create input pixel processor!\n");
+                       goto create_fail;
+               }
+
+               pool->base.dpps[i] = dcn20_dpp_create(ctx, i);
+               if (pool->base.dpps[i] == NULL) {
+                       BREAK_TO_DEBUGGER();
+                       dm_error(
+                               "DC: failed to create dpps!\n");
+                       goto create_fail;
+               }
+       }
+       for (i = 0; i < pool->base.res_cap->num_ddc; i++) {
+               pool->base.engines[i] = dcn20_aux_engine_create(ctx, i);
+               if (pool->base.engines[i] == NULL) {
+                       BREAK_TO_DEBUGGER();
+                       dm_error(
+                               "DC:failed to create aux engine!!\n");
+                       goto create_fail;
+               }
+               pool->base.hw_i2cs[i] = dcn20_i2c_hw_create(ctx, i);
+               if (pool->base.hw_i2cs[i] == NULL) {
+                       BREAK_TO_DEBUGGER();
+                       dm_error(
+                               "DC:failed to create hw i2c!!\n");
+                       goto create_fail;
+               }
+               pool->base.sw_i2cs[i] = NULL;
+       }
+
+       for (i = 0; i < pool->base.res_cap->num_opp; i++) {
+               pool->base.opps[i] = dcn20_opp_create(ctx, i);
+               if (pool->base.opps[i] == NULL) {
+                       BREAK_TO_DEBUGGER();
+                       dm_error(
+                               "DC: failed to create output pixel processor!\n");
+                       goto create_fail;
+               }
+       }
+
+       for (i = 0; i < pool->base.res_cap->num_timing_generator; i++) {
+               pool->base.timing_generators[i] = dcn20_timing_generator_create(
+                               ctx, i);
+               if (pool->base.timing_generators[i] == NULL) {
+                       BREAK_TO_DEBUGGER();
+                       dm_error("DC: failed to create tg!\n");
+                       goto create_fail;
+               }
+       }
+
+       pool->base.timing_generator_count = i;
+
+       pool->base.mpc = dcn20_mpc_create(ctx);
+       if (pool->base.mpc == NULL) {
+               BREAK_TO_DEBUGGER();
+               dm_error("DC: failed to create mpc!\n");
+               goto create_fail;
+       }
+
+       pool->base.hubbub = dcn20_hubbub_create(ctx);
+       if (pool->base.hubbub == NULL) {
+               BREAK_TO_DEBUGGER();
+               dm_error("DC: failed to create hubbub!\n");
+               goto create_fail;
+       }
+
+       for (i = 0; i < pool->base.res_cap->num_dsc; i++) {
+               pool->base.dscs[i] = dcn20_dsc_create(ctx, i);
+               if (pool->base.dscs[i] == NULL) {
+                       BREAK_TO_DEBUGGER();
+                       dm_error("DC: failed to create display stream compressor %d!\n", i);
+                       goto create_fail;
+               }
+       }
+
+       if (!dcn20_dwbc_create(ctx, &pool->base)) {
+               BREAK_TO_DEBUGGER();
+               dm_error("DC: failed to create dwbc!\n");
+               goto create_fail;
+       }
+       if (!dcn20_mmhubbub_create(ctx, &pool->base)) {
+               BREAK_TO_DEBUGGER();
+               dm_error("DC: failed to create mcif_wb!\n");
+               goto create_fail;
+       }
+
+       if (!resource_construct(num_virtual_links, dc, &pool->base,
+                       &res_create_funcs))
+               goto create_fail;
+
+       dcn20_hw_sequencer_construct(dc);
+
+       // IF NV12, set PG function pointer to NULL. It's not that
+       // PG isn't supported for NV12, it's that we don't want to
+       // program the registers because that will cause more power
+       // to be consumed. We could have created dcn20_init_hw to get
+       // the same effect by checking ASIC rev, but there was a
+       // request at some point to not check ASIC rev on hw sequencer.
+       if (ASICREV_IS_NAVI12_P(dc->ctx->asic_id.hw_internal_rev)) {
+               dc->hwseq->funcs.enable_power_gating_plane = NULL;
+               dc->debug.disable_dpp_power_gate = true;
+               dc->debug.disable_hubp_power_gate = true;
+       }
+
+
+       dc->caps.max_planes =  pool->base.pipe_count;
+
+       for (i = 0; i < dc->caps.max_planes; ++i)
+               dc->caps.planes[i] = plane_cap;
+
+       dc->cap_funcs = cap_funcs;
+
+       if (dc->ctx->dc_bios->fw_info.oem_i2c_present) {
+               ddc_init_data.ctx = dc->ctx;
+               ddc_init_data.link = NULL;
+               ddc_init_data.id.id = dc->ctx->dc_bios->fw_info.oem_i2c_obj_id;
+               ddc_init_data.id.enum_id = 0;
+               ddc_init_data.id.type = OBJECT_TYPE_GENERIC;
+               pool->base.oem_device = dc->link_srv->create_ddc_service(&ddc_init_data);
+       } else {
+               pool->base.oem_device = NULL;
+       }
+
+       return true;
+
+create_fail:
+
+       dcn20_resource_destruct(pool);
+
+       return false;
+}
+
+struct resource_pool *dcn20_create_resource_pool(
+               const struct dc_init_data *init_data,
+               struct dc *dc)
+{
+       struct dcn20_resource_pool *pool =
+               kzalloc(sizeof(struct dcn20_resource_pool), GFP_ATOMIC);
+
+       if (!pool)
+               return NULL;
+
+       if (dcn20_resource_construct(init_data->num_virtual_links, dc, pool))
+               return &pool->base;
+
+       BREAK_TO_DEBUGGER();
+       kfree(pool);
+       return NULL;
+}
diff --git a/drivers/gpu/drm/amd/display/dc/resource/dcn20/dcn20_resource.h b/drivers/gpu/drm/amd/display/dc/resource/dcn20/dcn20_resource.h
new file mode 100644 (file)
index 0000000..37ecacc
--- /dev/null
@@ -0,0 +1,170 @@
+/*
+* Copyright 2017 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_RESOURCE_DCN20_H__
+#define __DC_RESOURCE_DCN20_H__
+
+#include "core_types.h"
+#include "dml/dcn20/dcn20_fpu.h"
+
+#define TO_DCN20_RES_POOL(pool)\
+       container_of(pool, struct dcn20_resource_pool, base)
+
+struct dc;
+struct resource_pool;
+struct _vcs_dpi_display_pipe_params_st;
+
+extern struct _vcs_dpi_ip_params_st dcn2_0_ip;
+extern struct _vcs_dpi_ip_params_st dcn2_0_nv14_ip;
+extern struct _vcs_dpi_soc_bounding_box_st dcn2_0_soc;
+extern struct _vcs_dpi_soc_bounding_box_st dcn2_0_nv14_soc;
+extern struct _vcs_dpi_soc_bounding_box_st dcn2_0_nv12_soc;
+
+struct dcn20_resource_pool {
+       struct resource_pool base;
+};
+struct resource_pool *dcn20_create_resource_pool(
+               const struct dc_init_data *init_data,
+               struct dc *dc);
+
+struct link_encoder *dcn20_link_encoder_create(
+       struct dc_context *ctx,
+       const struct encoder_init_data *enc_init_data);
+
+unsigned int dcn20_calc_max_scaled_time(
+               unsigned int time_per_pixel,
+               enum mmhubbub_wbif_mode mode,
+               unsigned int urgent_watermark);
+
+struct pipe_ctx *dcn20_acquire_free_pipe_for_layer(
+               const struct dc_state *cur_ctx,
+               struct dc_state *new_ctx,
+               const struct resource_pool *pool,
+               const struct pipe_ctx *opp_head_pipe);
+void dcn20_release_pipe(struct dc_state *context,
+                       struct pipe_ctx *pipe,
+                       const struct resource_pool *pool);
+struct stream_encoder *dcn20_stream_encoder_create(
+       enum engine_id eng_id,
+       struct dc_context *ctx);
+
+struct dce_hwseq *dcn20_hwseq_create(
+       struct dc_context *ctx);
+
+bool dcn20_get_dcc_compression_cap(const struct dc *dc,
+               const struct dc_dcc_surface_param *input,
+               struct dc_surface_dcc_cap *output);
+
+void dcn20_dpp_destroy(struct dpp **dpp);
+
+struct dpp *dcn20_dpp_create(
+       struct dc_context *ctx,
+       uint32_t inst);
+
+struct input_pixel_processor *dcn20_ipp_create(
+       struct dc_context *ctx, uint32_t inst);
+
+struct output_pixel_processor *dcn20_opp_create(
+       struct dc_context *ctx, uint32_t inst);
+
+struct dce_aux *dcn20_aux_engine_create(
+       struct dc_context *ctx, uint32_t inst);
+
+struct dce_i2c_hw *dcn20_i2c_hw_create(
+       struct dc_context *ctx,
+       uint32_t inst);
+
+void dcn20_clock_source_destroy(struct clock_source **clk_src);
+
+struct display_stream_compressor *dcn20_dsc_create(
+       struct dc_context *ctx, uint32_t inst);
+void dcn20_dsc_destroy(struct display_stream_compressor **dsc);
+
+struct hubp *dcn20_hubp_create(
+       struct dc_context *ctx,
+       uint32_t inst);
+struct timing_generator *dcn20_timing_generator_create(
+               struct dc_context *ctx,
+               uint32_t instance);
+struct mpc *dcn20_mpc_create(struct dc_context *ctx);
+struct hubbub *dcn20_hubbub_create(struct dc_context *ctx);
+
+bool dcn20_dwbc_create(struct dc_context *ctx, struct resource_pool *pool);
+bool dcn20_mmhubbub_create(struct dc_context *ctx, struct resource_pool *pool);
+
+void dcn20_set_mcif_arb_params(
+               struct dc *dc,
+               struct dc_state *context,
+               display_e2e_pipe_params_st *pipes,
+               int pipe_cnt);
+bool dcn20_validate_bandwidth(struct dc *dc, struct dc_state *context, bool fast_validate);
+void dcn20_merge_pipes_for_validate(
+               struct dc *dc,
+               struct dc_state *context);
+int dcn20_validate_apply_pipe_split_flags(
+               struct dc *dc,
+               struct dc_state *context,
+               int vlevel,
+               int *split,
+               bool *merge);
+void dcn20_release_dsc(struct resource_context *res_ctx,
+                       const struct resource_pool *pool,
+                       struct display_stream_compressor **dsc);
+bool dcn20_validate_dsc(struct dc *dc, struct dc_state *new_ctx);
+void dcn20_split_stream_for_mpc(
+               struct resource_context *res_ctx,
+               const struct resource_pool *pool,
+               struct pipe_ctx *primary_pipe,
+               struct pipe_ctx *secondary_pipe);
+bool dcn20_split_stream_for_odm(
+               const struct dc *dc,
+               struct resource_context *res_ctx,
+               struct pipe_ctx *prev_odm_pipe,
+               struct pipe_ctx *next_odm_pipe);
+void dcn20_acquire_dsc(const struct dc *dc,
+                       struct resource_context *res_ctx,
+                       struct display_stream_compressor **dsc,
+                       int pipe_idx);
+struct pipe_ctx *dcn20_find_secondary_pipe(struct dc *dc,
+               struct resource_context *res_ctx,
+               const struct resource_pool *pool,
+               const struct pipe_ctx *primary_pipe);
+bool dcn20_fast_validate_bw(
+               struct dc *dc,
+               struct dc_state *context,
+               display_e2e_pipe_params_st *pipes,
+               int *pipe_cnt_out,
+               int *pipe_split_from,
+               int *vlevel_out,
+               bool fast_validate);
+
+enum dc_status dcn20_build_mapped_resource(const struct dc *dc, struct dc_state *context, struct dc_stream_state *stream);
+enum dc_status dcn20_add_stream_to_ctx(struct dc *dc, struct dc_state *new_ctx, struct dc_stream_state *dc_stream);
+enum dc_status dcn20_add_dsc_to_stream_resource(struct dc *dc, struct dc_state *dc_ctx, struct dc_stream_state *dc_stream);
+enum dc_status dcn20_remove_stream_from_ctx(struct dc *dc, struct dc_state *new_ctx, struct dc_stream_state *dc_stream);
+enum dc_status dcn20_patch_unknown_plane_state(struct dc_plane_state *plane_state);
+
+#endif /* __DC_RESOURCE_DCN20_H__ */
+
diff --git a/drivers/gpu/drm/amd/display/dc/resource/dcn201/dcn201_resource.c b/drivers/gpu/drm/amd/display/dc/resource/dcn201/dcn201_resource.c
new file mode 100644 (file)
index 0000000..914b234
--- /dev/null
@@ -0,0 +1,1308 @@
+/*
+* Copyright 2016 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 "dm_services.h"
+#include "dc.h"
+
+#include "dcn201/dcn201_init.h"
+#include "dml/dcn20/dcn20_fpu.h"
+#include "resource.h"
+#include "include/irq_service_interface.h"
+#include "dcn201_resource.h"
+
+#include "dcn20/dcn20_resource.h"
+
+#include "dcn10/dcn10_hubp.h"
+#include "dcn10/dcn10_ipp.h"
+#include "dcn201/dcn201_mpc.h"
+#include "dcn201/dcn201_hubp.h"
+#include "irq/dcn201/irq_service_dcn201.h"
+#include "dcn201/dcn201_dpp.h"
+#include "dcn201/dcn201_hubbub.h"
+#include "dcn201/dcn201_dccg.h"
+#include "dcn201/dcn201_optc.h"
+#include "dcn201/dcn201_hwseq.h"
+#include "dce110/dce110_hwseq.h"
+#include "dcn201/dcn201_opp.h"
+#include "dcn201/dcn201_link_encoder.h"
+#include "dcn20/dcn20_stream_encoder.h"
+#include "dce/dce_clock_source.h"
+#include "dce/dce_audio.h"
+#include "dce/dce_hwseq.h"
+#include "virtual/virtual_stream_encoder.h"
+#include "dce110/dce110_resource.h"
+#include "dce/dce_aux.h"
+#include "dce/dce_i2c.h"
+#include "dcn201/dcn201_hubbub.h"
+#include "dcn10/dcn10_resource.h"
+
+#include "cyan_skillfish_ip_offset.h"
+
+#include "dcn/dcn_2_0_3_offset.h"
+#include "dcn/dcn_2_0_3_sh_mask.h"
+#include "dpcs/dpcs_2_0_3_offset.h"
+#include "dpcs/dpcs_2_0_3_sh_mask.h"
+
+#include "mmhub/mmhub_2_0_0_offset.h"
+#include "mmhub/mmhub_2_0_0_sh_mask.h"
+#include "nbio/nbio_7_4_offset.h"
+
+#include "reg_helper.h"
+
+#define MIN_DISP_CLK_KHZ 100000
+#define MIN_DPP_CLK_KHZ 100000
+
+static struct _vcs_dpi_ip_params_st dcn201_ip = {
+       .gpuvm_enable = 0,
+       .hostvm_enable = 0,
+       .gpuvm_max_page_table_levels = 4,
+       .hostvm_max_page_table_levels = 4,
+       .hostvm_cached_page_table_levels = 0,
+       .pte_group_size_bytes = 2048,
+       .rob_buffer_size_kbytes = 168,
+       .det_buffer_size_kbytes = 164,
+       .dpte_buffer_size_in_pte_reqs_luma = 84,
+       .pde_proc_buffer_size_64k_reqs = 48,
+       .dpp_output_buffer_pixels = 2560,
+       .opp_output_buffer_lines = 1,
+       .pixel_chunk_size_kbytes = 8,
+       .pte_chunk_size_kbytes = 2,
+       .meta_chunk_size_kbytes = 2,
+       .writeback_chunk_size_kbytes = 2,
+       .line_buffer_size_bits = 789504,
+       .is_line_buffer_bpp_fixed = 0,
+       .line_buffer_fixed_bpp = 0,
+       .dcc_supported = true,
+       .max_line_buffer_lines = 12,
+       .writeback_luma_buffer_size_kbytes = 12,
+       .writeback_chroma_buffer_size_kbytes = 8,
+       .writeback_chroma_line_buffer_width_pixels = 4,
+       .writeback_max_hscl_ratio = 1,
+       .writeback_max_vscl_ratio = 1,
+       .writeback_min_hscl_ratio = 1,
+       .writeback_min_vscl_ratio = 1,
+       .writeback_max_hscl_taps = 12,
+       .writeback_max_vscl_taps = 12,
+       .writeback_line_buffer_luma_buffer_size = 0,
+       .writeback_line_buffer_chroma_buffer_size = 9600,
+       .cursor_buffer_size = 8,
+       .cursor_chunk_size = 2,
+       .max_num_otg = 2,
+       .max_num_dpp = 4,
+       .max_num_wb = 0,
+       .max_dchub_pscl_bw_pix_per_clk = 4,
+       .max_pscl_lb_bw_pix_per_clk = 2,
+       .max_lb_vscl_bw_pix_per_clk = 4,
+       .max_vscl_hscl_bw_pix_per_clk = 4,
+       .max_hscl_ratio = 8,
+       .max_vscl_ratio = 8,
+       .hscl_mults = 4,
+       .vscl_mults = 4,
+       .max_hscl_taps = 8,
+       .max_vscl_taps = 8,
+       .dispclk_ramp_margin_percent = 1,
+       .underscan_factor = 1.10,
+       .min_vblank_lines = 30,
+       .dppclk_delay_subtotal = 77,
+       .dppclk_delay_scl_lb_only = 16,
+       .dppclk_delay_scl = 50,
+       .dppclk_delay_cnvc_formatter = 8,
+       .dppclk_delay_cnvc_cursor = 6,
+       .dispclk_delay_subtotal = 87,
+       .dcfclk_cstate_latency = 10,
+       .max_inter_dcn_tile_repeaters = 8,
+       .number_of_cursors = 1,
+};
+
+static struct _vcs_dpi_soc_bounding_box_st dcn201_soc = {
+       .clock_limits = {
+                       {
+                               .state = 0,
+                               .dscclk_mhz = 400.0,
+                               .dcfclk_mhz = 1000.0,
+                               .fabricclk_mhz = 200.0,
+                               .dispclk_mhz = 300.0,
+                               .dppclk_mhz = 300.0,
+                               .phyclk_mhz = 810.0,
+                               .socclk_mhz = 1254.0,
+                               .dram_speed_mts = 2000.0,
+                       },
+                       {
+                               .state = 1,
+                               .dscclk_mhz = 400.0,
+                               .dcfclk_mhz = 1000.0,
+                               .fabricclk_mhz = 250.0,
+                               .dispclk_mhz = 1200.0,
+                               .dppclk_mhz = 1200.0,
+                               .phyclk_mhz = 810.0,
+                               .socclk_mhz = 1254.0,
+                               .dram_speed_mts = 3600.0,
+                       },
+                       {
+                               .state = 2,
+                               .dscclk_mhz = 400.0,
+                               .dcfclk_mhz = 1000.0,
+                               .fabricclk_mhz = 750.0,
+                               .dispclk_mhz = 1200.0,
+                               .dppclk_mhz = 1200.0,
+                               .phyclk_mhz = 810.0,
+                               .socclk_mhz = 1254.0,
+                               .dram_speed_mts = 6800.0,
+                       },
+                       {
+                               .state = 3,
+                               .dscclk_mhz = 400.0,
+                               .dcfclk_mhz = 1000.0,
+                               .fabricclk_mhz = 250.0,
+                               .dispclk_mhz = 1200.0,
+                               .dppclk_mhz = 1200.0,
+                               .phyclk_mhz = 810.0,
+                               .socclk_mhz = 1254.0,
+                               .dram_speed_mts = 14000.0,
+                       },
+                       {
+                               .state = 4,
+                               .dscclk_mhz = 400.0,
+                               .dcfclk_mhz = 1000.0,
+                               .fabricclk_mhz = 750.0,
+                               .dispclk_mhz = 1200.0,
+                               .dppclk_mhz = 1200.0,
+                               .phyclk_mhz = 810.0,
+                               .socclk_mhz = 1254.0,
+                               .dram_speed_mts = 14000.0,
+                       }
+               },
+       .num_states = 4,
+       .sr_exit_time_us = 9.0,
+       .sr_enter_plus_exit_time_us = 11.0,
+       .urgent_latency_us = 4.0,
+       .urgent_latency_pixel_data_only_us = 4.0,
+       .urgent_latency_pixel_mixed_with_vm_data_us = 4.0,
+       .urgent_latency_vm_data_only_us = 4.0,
+       .urgent_out_of_order_return_per_channel_pixel_only_bytes = 256,
+       .urgent_out_of_order_return_per_channel_pixel_and_vm_bytes = 256,
+       .urgent_out_of_order_return_per_channel_vm_only_bytes = 256,
+       .pct_ideal_dram_sdp_bw_after_urgent_pixel_only = 80.0,
+       .pct_ideal_dram_sdp_bw_after_urgent_pixel_and_vm = 80.0,
+       .pct_ideal_dram_sdp_bw_after_urgent_vm_only = 80.0,
+       .max_avg_sdp_bw_use_normal_percent = 80.0,
+       .max_avg_dram_bw_use_normal_percent = 69.0,
+       .writeback_latency_us = 12.0,
+       .ideal_dram_bw_after_urgent_percent = 80.0,
+       .max_request_size_bytes = 256,
+       .dram_channel_width_bytes = 2,
+       .fabric_datapath_to_dcn_data_return_bytes = 64,
+       .dcn_downspread_percent = 0.3,
+       .downspread_percent = 0.3,
+       .dram_page_open_time_ns = 50.0,
+       .dram_rw_turnaround_time_ns = 17.5,
+       .dram_return_buffer_per_channel_bytes = 8192,
+       .round_trip_ping_latency_dcfclk_cycles = 128,
+       .urgent_out_of_order_return_per_channel_bytes = 256,
+       .channel_interleave_bytes = 256,
+       .num_banks = 8,
+       .num_chans = 16,
+       .vmm_page_size_bytes = 4096,
+       .dram_clock_change_latency_us = 250.0,
+       .writeback_dram_clock_change_latency_us = 23.0,
+       .return_bus_width_bytes = 64,
+       .dispclk_dppclk_vco_speed_mhz = 3000,
+       .use_urgent_burst_bw = 0,
+};
+
+enum dcn20_clk_src_array_id {
+       DCN20_CLK_SRC_PLL0,
+       DCN20_CLK_SRC_PLL1,
+       DCN20_CLK_SRC_TOTAL_DCN201
+};
+
+/* begin *********************
+ * macros to expend register list macro defined in HW object header file */
+
+/* DCN */
+
+#undef BASE_INNER
+#define BASE_INNER(seg) DMU_BASE__INST0_SEG ## seg
+
+#define BASE(seg) BASE_INNER(seg)
+
+#define SR(reg_name)\
+               .reg_name = BASE(mm ## reg_name ## _BASE_IDX) +  \
+                                       mm ## reg_name
+
+#define SRI(reg_name, block, id)\
+       .reg_name = BASE(mm ## block ## id ## _ ## reg_name ## _BASE_IDX) + \
+                                       mm ## block ## id ## _ ## reg_name
+
+#define SRIR(var_name, reg_name, block, id)\
+       .var_name = BASE(mm ## block ## id ## _ ## reg_name ## _BASE_IDX) + \
+                                       mm ## block ## id ## _ ## reg_name
+
+#define SRII(reg_name, block, id)\
+       .reg_name[id] = BASE(mm ## block ## id ## _ ## reg_name ## _BASE_IDX) + \
+                                       mm ## block ## id ## _ ## reg_name
+
+#define SRI_IX(reg_name, block, id)\
+       .reg_name = ix ## block ## id ## _ ## reg_name
+
+#define DCCG_SRII(reg_name, block, id)\
+       .block ## _ ## reg_name[id] = BASE(mm ## block ## id ## _ ## reg_name ## _BASE_IDX) + \
+                                       mm ## block ## id ## _ ## reg_name
+
+#define VUPDATE_SRII(reg_name, block, id)\
+       .reg_name[id] = BASE(mm ## reg_name ## _ ## block ## id ## _BASE_IDX) + \
+                                       mm ## reg_name ## _ ## block ## id
+
+/* NBIO */
+#define NBIO_BASE_INNER(seg) \
+       NBIO_BASE__INST0_SEG ## seg
+
+#define NBIO_BASE(seg) \
+       NBIO_BASE_INNER(seg)
+
+#define NBIO_SR(reg_name)\
+               .reg_name = NBIO_BASE(mm ## reg_name ## _BASE_IDX) + \
+                                       mm ## reg_name
+
+/* MMHUB */
+#define MMHUB_BASE_INNER(seg) \
+       MMHUB_BASE__INST0_SEG ## seg
+
+#define MMHUB_BASE(seg) \
+       MMHUB_BASE_INNER(seg)
+
+#define MMHUB_SR(reg_name)\
+               .reg_name = MMHUB_BASE(mmMM ## reg_name ## _BASE_IDX) + \
+                                       mmMM ## reg_name
+
+static const struct bios_registers bios_regs = {
+               NBIO_SR(BIOS_SCRATCH_3),
+               NBIO_SR(BIOS_SCRATCH_6)
+};
+
+#define clk_src_regs(index, pllid)\
+[index] = {\
+       CS_COMMON_REG_LIST_DCN201(index, pllid),\
+}
+
+static const struct dce110_clk_src_regs clk_src_regs[] = {
+       clk_src_regs(0, A),
+       clk_src_regs(1, B)
+};
+
+static const struct dce110_clk_src_shift cs_shift = {
+               CS_COMMON_MASK_SH_LIST_DCN2_0(__SHIFT)
+};
+
+static const struct dce110_clk_src_mask cs_mask = {
+               CS_COMMON_MASK_SH_LIST_DCN2_0(_MASK)
+};
+
+#define audio_regs(id)\
+[id] = {\
+               AUD_COMMON_REG_LIST(id)\
+}
+
+static const struct dce_audio_registers audio_regs[] = {
+       audio_regs(0),
+       audio_regs(1),
+};
+
+#define DCE120_AUD_COMMON_MASK_SH_LIST(mask_sh)\
+               SF(AZF0ENDPOINT0_AZALIA_F0_CODEC_ENDPOINT_INDEX, AZALIA_ENDPOINT_REG_INDEX, mask_sh),\
+               SF(AZF0ENDPOINT0_AZALIA_F0_CODEC_ENDPOINT_DATA, AZALIA_ENDPOINT_REG_DATA, mask_sh),\
+               AUD_COMMON_MASK_SH_LIST_BASE(mask_sh)
+
+static const struct dce_audio_shift audio_shift = {
+               DCE120_AUD_COMMON_MASK_SH_LIST(__SHIFT)
+};
+
+static const struct dce_audio_mask audio_mask = {
+               DCE120_AUD_COMMON_MASK_SH_LIST(_MASK)
+};
+
+#define stream_enc_regs(id)\
+[id] = {\
+       SE_DCN2_REG_LIST(id)\
+}
+
+static const struct dcn10_stream_enc_registers stream_enc_regs[] = {
+       stream_enc_regs(0),
+       stream_enc_regs(1)
+};
+
+static const struct dcn10_stream_encoder_shift se_shift = {
+               SE_COMMON_MASK_SH_LIST_DCN20(__SHIFT)
+};
+
+static const struct dcn10_stream_encoder_mask se_mask = {
+               SE_COMMON_MASK_SH_LIST_DCN20(_MASK)
+};
+
+static const struct dce110_aux_registers_shift aux_shift = {
+       DCN_AUX_MASK_SH_LIST(__SHIFT)
+};
+
+static const struct dce110_aux_registers_mask aux_mask = {
+       DCN_AUX_MASK_SH_LIST(_MASK)
+};
+
+#define aux_regs(id)\
+[id] = {\
+       DCN2_AUX_REG_LIST(id)\
+}
+
+static const struct dcn10_link_enc_aux_registers link_enc_aux_regs[] = {
+               aux_regs(0),
+               aux_regs(1),
+};
+
+#define hpd_regs(id)\
+[id] = {\
+       HPD_REG_LIST(id)\
+}
+
+static const struct dcn10_link_enc_hpd_registers link_enc_hpd_regs[] = {
+               hpd_regs(0),
+               hpd_regs(1),
+};
+
+#define link_regs(id, phyid)\
+[id] = {\
+       LE_DCN_COMMON_REG_LIST(id), \
+       UNIPHY_DCN2_REG_LIST(phyid) \
+}
+
+static const struct dcn10_link_enc_registers link_enc_regs[] = {
+       link_regs(0, A),
+       link_regs(1, B),
+};
+
+#define LINK_ENCODER_MASK_SH_LIST_DCN201(mask_sh)\
+       LINK_ENCODER_MASK_SH_LIST_DCN20(mask_sh)
+
+static const struct dcn10_link_enc_shift le_shift = {
+               LINK_ENCODER_MASK_SH_LIST_DCN201(__SHIFT)
+};
+
+static const struct dcn10_link_enc_mask le_mask = {
+               LINK_ENCODER_MASK_SH_LIST_DCN201(_MASK)
+};
+
+#define ipp_regs(id)\
+[id] = {\
+               IPP_REG_LIST_DCN201(id),\
+}
+
+static const struct dcn10_ipp_registers ipp_regs[] = {
+       ipp_regs(0),
+       ipp_regs(1),
+       ipp_regs(2),
+       ipp_regs(3),
+};
+
+static const struct dcn10_ipp_shift ipp_shift = {
+               IPP_MASK_SH_LIST_DCN201(__SHIFT)
+};
+
+static const struct dcn10_ipp_mask ipp_mask = {
+               IPP_MASK_SH_LIST_DCN201(_MASK)
+};
+
+#define opp_regs(id)\
+[id] = {\
+       OPP_REG_LIST_DCN201(id),\
+}
+
+static const struct dcn201_opp_registers opp_regs[] = {
+       opp_regs(0),
+       opp_regs(1),
+};
+
+static const struct dcn201_opp_shift opp_shift = {
+               OPP_MASK_SH_LIST_DCN201(__SHIFT)
+};
+
+static const struct dcn201_opp_mask opp_mask = {
+               OPP_MASK_SH_LIST_DCN201(_MASK)
+};
+
+#define aux_engine_regs(id)\
+[id] = {\
+       AUX_COMMON_REG_LIST0(id), \
+       .AUX_RESET_MASK = 0 \
+}
+
+static const struct dce110_aux_registers aux_engine_regs[] = {
+               aux_engine_regs(0),
+               aux_engine_regs(1)
+};
+
+#define tf_regs(id)\
+[id] = {\
+       TF_REG_LIST_DCN201(id),\
+}
+
+static const struct dcn201_dpp_registers tf_regs[] = {
+       tf_regs(0),
+       tf_regs(1),
+       tf_regs(2),
+       tf_regs(3),
+};
+
+static const struct dcn201_dpp_shift tf_shift = {
+               TF_REG_LIST_SH_MASK_DCN201(__SHIFT)
+};
+
+static const struct dcn201_dpp_mask tf_mask = {
+               TF_REG_LIST_SH_MASK_DCN201(_MASK)
+};
+
+static const struct dcn201_mpc_registers mpc_regs = {
+               MPC_REG_LIST_DCN201(0),
+               MPC_REG_LIST_DCN201(1),
+               MPC_REG_LIST_DCN201(2),
+               MPC_REG_LIST_DCN201(3),
+               MPC_REG_LIST_DCN201(4),
+               MPC_OUT_MUX_REG_LIST_DCN201(0),
+               MPC_OUT_MUX_REG_LIST_DCN201(1),
+};
+
+static const struct dcn201_mpc_shift mpc_shift = {
+       MPC_COMMON_MASK_SH_LIST_DCN201(__SHIFT)
+};
+
+static const struct dcn201_mpc_mask mpc_mask = {
+       MPC_COMMON_MASK_SH_LIST_DCN201(_MASK)
+};
+
+#define tg_regs_dcn201(id)\
+[id] = {TG_COMMON_REG_LIST_DCN201(id)}
+
+static const struct dcn_optc_registers tg_regs[] = {
+       tg_regs_dcn201(0),
+       tg_regs_dcn201(1)
+};
+
+static const struct dcn_optc_shift tg_shift = {
+       TG_COMMON_MASK_SH_LIST_DCN201(__SHIFT)
+};
+
+static const struct dcn_optc_mask tg_mask = {
+       TG_COMMON_MASK_SH_LIST_DCN201(_MASK)
+};
+
+#define hubp_regsDCN201(id)\
+[id] = {\
+       HUBP_REG_LIST_DCN201(id)\
+}
+
+static const struct dcn201_hubp_registers hubp_regs[] = {
+               hubp_regsDCN201(0),
+               hubp_regsDCN201(1),
+               hubp_regsDCN201(2),
+               hubp_regsDCN201(3)
+};
+
+static const struct dcn201_hubp_shift hubp_shift = {
+               HUBP_MASK_SH_LIST_DCN201(__SHIFT)
+};
+
+static const struct dcn201_hubp_mask hubp_mask = {
+               HUBP_MASK_SH_LIST_DCN201(_MASK)
+};
+
+static const struct dcn_hubbub_registers hubbub_reg = {
+               HUBBUB_REG_LIST_DCN201(0)
+};
+
+static const struct dcn_hubbub_shift hubbub_shift = {
+               HUBBUB_MASK_SH_LIST_DCN201(__SHIFT)
+};
+
+static const struct dcn_hubbub_mask hubbub_mask = {
+               HUBBUB_MASK_SH_LIST_DCN201(_MASK)
+};
+
+
+static const struct dccg_registers dccg_regs = {
+               DCCG_COMMON_REG_LIST_DCN_BASE()
+};
+
+static const struct dccg_shift dccg_shift = {
+               DCCG_COMMON_MASK_SH_LIST_DCN_COMMON_BASE(__SHIFT)
+};
+
+static const struct dccg_mask dccg_mask = {
+               DCCG_COMMON_MASK_SH_LIST_DCN_COMMON_BASE(_MASK)
+};
+
+static const struct resource_caps res_cap_dnc201 = {
+               .num_timing_generator = 2,
+               .num_opp = 2,
+               .num_video_plane = 4,
+               .num_audio = 2,
+               .num_stream_encoder = 2,
+               .num_pll = 2,
+               .num_ddc = 2,
+};
+
+static const struct dc_plane_cap plane_cap = {
+       .type = DC_PLANE_TYPE_DCN_UNIVERSAL,
+       .per_pixel_alpha = true,
+
+       .pixel_format_support = {
+                       .argb8888 = true,
+                       .nv12 = false,
+                       .fp16 = true,
+                       .p010 = false,
+       },
+
+       .max_upscale_factor = {
+                       .argb8888 = 16000,
+                       .nv12 = 16000,
+                       .fp16 = 1
+       },
+
+       .max_downscale_factor = {
+                       .argb8888 = 250,
+                       .nv12 = 250,
+                       .fp16 = 250
+       },
+       64,
+       64
+};
+
+static const struct dc_debug_options debug_defaults_drv = {
+               .disable_dmcu = true,
+               .force_abm_enable = false,
+               .timing_trace = false,
+               .clock_trace = true,
+               .disable_pplib_clock_request = true,
+               .pipe_split_policy = MPC_SPLIT_DYNAMIC,
+               .force_single_disp_pipe_split = false,
+               .disable_dcc = DCC_ENABLE,
+               .vsr_support = true,
+               .performance_trace = false,
+               .az_endpoint_mute_only = true,
+               .max_downscale_src_width = 3840,
+               .disable_pplib_wm_range = true,
+               .scl_reset_length10 = true,
+               .sanity_checks = false,
+               .underflow_assert_delay_us = 0xFFFFFFFF,
+               .enable_tri_buf = false,
+               .enable_legacy_fast_update = true,
+               .using_dml2 = false,
+};
+
+static void dcn201_dpp_destroy(struct dpp **dpp)
+{
+       kfree(TO_DCN201_DPP(*dpp));
+       *dpp = NULL;
+}
+
+static struct dpp *dcn201_dpp_create(
+       struct dc_context *ctx,
+       uint32_t inst)
+{
+       struct dcn201_dpp *dpp =
+               kzalloc(sizeof(struct dcn201_dpp), GFP_ATOMIC);
+
+       if (!dpp)
+               return NULL;
+
+       if (dpp201_construct(dpp, ctx, inst,
+                       &tf_regs[inst], &tf_shift, &tf_mask))
+               return &dpp->base;
+
+       kfree(dpp);
+       return NULL;
+}
+
+static struct input_pixel_processor *dcn201_ipp_create(
+       struct dc_context *ctx, uint32_t inst)
+{
+       struct dcn10_ipp *ipp =
+               kzalloc(sizeof(struct dcn10_ipp), GFP_ATOMIC);
+
+       if (!ipp) {
+               return NULL;
+       }
+
+       dcn20_ipp_construct(ipp, ctx, inst,
+                       &ipp_regs[inst], &ipp_shift, &ipp_mask);
+       return &ipp->base;
+}
+
+
+static struct output_pixel_processor *dcn201_opp_create(
+       struct dc_context *ctx, uint32_t inst)
+{
+       struct dcn201_opp *opp =
+               kzalloc(sizeof(struct dcn201_opp), GFP_ATOMIC);
+
+       if (!opp) {
+               return NULL;
+       }
+
+       dcn201_opp_construct(opp, ctx, inst,
+                       &opp_regs[inst], &opp_shift, &opp_mask);
+       return &opp->base;
+}
+
+static struct dce_aux *dcn201_aux_engine_create(struct dc_context *ctx,
+                                               uint32_t inst)
+{
+       struct aux_engine_dce110 *aux_engine =
+               kzalloc(sizeof(struct aux_engine_dce110), GFP_ATOMIC);
+
+       if (!aux_engine)
+               return NULL;
+
+       dce110_aux_engine_construct(aux_engine, ctx, inst,
+                                   SW_AUX_TIMEOUT_PERIOD_MULTIPLIER * AUX_TIMEOUT_PERIOD,
+                                   &aux_engine_regs[inst],
+                                       &aux_mask,
+                                       &aux_shift,
+                                       ctx->dc->caps.extended_aux_timeout_support);
+
+       return &aux_engine->base;
+}
+#define i2c_inst_regs(id) { I2C_HW_ENGINE_COMMON_REG_LIST(id) }
+
+static const struct dce_i2c_registers i2c_hw_regs[] = {
+               i2c_inst_regs(1),
+               i2c_inst_regs(2),
+};
+
+static const struct dce_i2c_shift i2c_shifts = {
+               I2C_COMMON_MASK_SH_LIST_DCN2(__SHIFT)
+};
+
+static const struct dce_i2c_mask i2c_masks = {
+               I2C_COMMON_MASK_SH_LIST_DCN2(_MASK)
+};
+
+static struct dce_i2c_hw *dcn201_i2c_hw_create(struct dc_context *ctx,
+                                              uint32_t inst)
+{
+       struct dce_i2c_hw *dce_i2c_hw =
+               kzalloc(sizeof(struct dce_i2c_hw), GFP_ATOMIC);
+
+       if (!dce_i2c_hw)
+               return NULL;
+
+       dcn2_i2c_hw_construct(dce_i2c_hw, ctx, inst,
+                                   &i2c_hw_regs[inst], &i2c_shifts, &i2c_masks);
+
+       return dce_i2c_hw;
+}
+
+static struct mpc *dcn201_mpc_create(struct dc_context *ctx, uint32_t num_mpcc)
+{
+       struct dcn201_mpc *mpc201 = kzalloc(sizeof(struct dcn201_mpc),
+                                           GFP_ATOMIC);
+
+       if (!mpc201)
+               return NULL;
+
+       dcn201_mpc_construct(mpc201, ctx,
+                       &mpc_regs,
+                       &mpc_shift,
+                       &mpc_mask,
+                       num_mpcc);
+
+       return &mpc201->base;
+}
+
+static struct hubbub *dcn201_hubbub_create(struct dc_context *ctx)
+{
+       struct dcn20_hubbub *hubbub = kzalloc(sizeof(struct dcn20_hubbub),
+                                         GFP_ATOMIC);
+
+       if (!hubbub)
+               return NULL;
+
+       hubbub201_construct(hubbub, ctx,
+                       &hubbub_reg,
+                       &hubbub_shift,
+                       &hubbub_mask);
+
+       return &hubbub->base;
+}
+
+static struct timing_generator *dcn201_timing_generator_create(
+               struct dc_context *ctx,
+               uint32_t instance)
+{
+       struct optc *tgn10 =
+               kzalloc(sizeof(struct optc), GFP_ATOMIC);
+
+       if (!tgn10)
+               return NULL;
+
+       tgn10->base.inst = instance;
+       tgn10->base.ctx = ctx;
+
+       tgn10->tg_regs = &tg_regs[instance];
+       tgn10->tg_shift = &tg_shift;
+       tgn10->tg_mask = &tg_mask;
+
+       dcn201_timing_generator_init(tgn10);
+
+       return &tgn10->base;
+}
+
+static const struct encoder_feature_support link_enc_feature = {
+               .max_hdmi_deep_color = COLOR_DEPTH_121212,
+               .max_hdmi_pixel_clock = 600000,
+               .hdmi_ycbcr420_supported = true,
+               .dp_ycbcr420_supported = true,
+               .fec_supported = true,
+               .flags.bits.IS_HBR2_CAPABLE = true,
+               .flags.bits.IS_HBR3_CAPABLE = true,
+               .flags.bits.IS_TPS3_CAPABLE = true,
+               .flags.bits.IS_TPS4_CAPABLE = true
+};
+
+static struct link_encoder *dcn201_link_encoder_create(
+       struct dc_context *ctx,
+       const struct encoder_init_data *enc_init_data)
+{
+       struct dcn20_link_encoder *enc20 =
+               kzalloc(sizeof(struct dcn20_link_encoder), GFP_ATOMIC);
+       struct dcn10_link_encoder *enc10 = &enc20->enc10;
+
+       if (!enc20)
+               return NULL;
+
+       dcn201_link_encoder_construct(enc20,
+                       enc_init_data,
+                       &link_enc_feature,
+                       &link_enc_regs[enc_init_data->transmitter],
+                       &link_enc_aux_regs[enc_init_data->channel - 1],
+                       &link_enc_hpd_regs[enc_init_data->hpd_source],
+                       &le_shift,
+                       &le_mask);
+
+       return &enc10->base;
+}
+
+static struct clock_source *dcn201_clock_source_create(
+       struct dc_context *ctx,
+       struct dc_bios *bios,
+       enum clock_source_id id,
+       const struct dce110_clk_src_regs *regs,
+       bool dp_clk_src)
+{
+       struct dce110_clk_src *clk_src =
+               kzalloc(sizeof(struct dce110_clk_src), GFP_ATOMIC);
+
+       if (!clk_src)
+               return NULL;
+
+       if (dce112_clk_src_construct(clk_src, ctx, bios, id,
+                       regs, &cs_shift, &cs_mask)) {
+               clk_src->base.dp_clk_src = dp_clk_src;
+               return &clk_src->base;
+       }
+       kfree(clk_src);
+       return NULL;
+}
+
+static void read_dce_straps(
+       struct dc_context *ctx,
+       struct resource_straps *straps)
+{
+       generic_reg_get(ctx, mmDC_PINSTRAPS + BASE(mmDC_PINSTRAPS_BASE_IDX),
+
+               FN(DC_PINSTRAPS, DC_PINSTRAPS_AUDIO), &straps->dc_pinstraps_audio);
+}
+
+static struct audio *dcn201_create_audio(
+               struct dc_context *ctx, unsigned int inst)
+{
+       return dce_audio_create(ctx, inst,
+                       &audio_regs[inst], &audio_shift, &audio_mask);
+}
+
+static struct stream_encoder *dcn201_stream_encoder_create(
+       enum engine_id eng_id,
+       struct dc_context *ctx)
+{
+       struct dcn10_stream_encoder *enc1 =
+               kzalloc(sizeof(struct dcn10_stream_encoder), GFP_ATOMIC);
+
+       if (!enc1)
+               return NULL;
+
+       dcn20_stream_encoder_construct(enc1, ctx, ctx->dc_bios, eng_id,
+                                       &stream_enc_regs[eng_id],
+                                       &se_shift, &se_mask);
+
+       return &enc1->base;
+}
+
+static const struct dce_hwseq_registers hwseq_reg = {
+               HWSEQ_DCN201_REG_LIST()
+};
+
+static const struct dce_hwseq_shift hwseq_shift = {
+               HWSEQ_DCN201_MASK_SH_LIST(__SHIFT)
+};
+
+static const struct dce_hwseq_mask hwseq_mask = {
+               HWSEQ_DCN201_MASK_SH_LIST(_MASK)
+};
+
+static struct dce_hwseq *dcn201_hwseq_create(
+       struct dc_context *ctx)
+{
+       struct dce_hwseq *hws = kzalloc(sizeof(struct dce_hwseq), GFP_ATOMIC);
+
+       if (hws) {
+               hws->ctx = ctx;
+               hws->regs = &hwseq_reg;
+               hws->shifts = &hwseq_shift;
+               hws->masks = &hwseq_mask;
+       }
+       return hws;
+}
+
+static const struct resource_create_funcs res_create_funcs = {
+       .read_dce_straps = read_dce_straps,
+       .create_audio = dcn201_create_audio,
+       .create_stream_encoder = dcn201_stream_encoder_create,
+       .create_hwseq = dcn201_hwseq_create,
+};
+
+static void dcn201_clock_source_destroy(struct clock_source **clk_src)
+{
+       kfree(TO_DCE110_CLK_SRC(*clk_src));
+       *clk_src = NULL;
+}
+
+static void dcn201_resource_destruct(struct dcn201_resource_pool *pool)
+{
+       unsigned int i;
+
+       for (i = 0; i < pool->base.stream_enc_count; i++) {
+               if (pool->base.stream_enc[i] != NULL) {
+                       kfree(DCN10STRENC_FROM_STRENC(pool->base.stream_enc[i]));
+                       pool->base.stream_enc[i] = NULL;
+               }
+       }
+
+
+       if (pool->base.mpc != NULL) {
+               kfree(TO_DCN201_MPC(pool->base.mpc));
+               pool->base.mpc = NULL;
+       }
+
+       if (pool->base.hubbub != NULL) {
+               kfree(pool->base.hubbub);
+               pool->base.hubbub = NULL;
+       }
+
+       for (i = 0; i < pool->base.pipe_count; i++) {
+               if (pool->base.dpps[i] != NULL)
+                       dcn201_dpp_destroy(&pool->base.dpps[i]);
+
+               if (pool->base.ipps[i] != NULL)
+                       pool->base.ipps[i]->funcs->ipp_destroy(&pool->base.ipps[i]);
+
+               if (pool->base.hubps[i] != NULL) {
+                       kfree(TO_DCN10_HUBP(pool->base.hubps[i]));
+                       pool->base.hubps[i] = NULL;
+               }
+
+               if (pool->base.irqs != NULL) {
+                       dal_irq_service_destroy(&pool->base.irqs);
+               }
+       }
+
+       for (i = 0; i < pool->base.res_cap->num_opp; i++) {
+               if (pool->base.opps[i] != NULL)
+                       pool->base.opps[i]->funcs->opp_destroy(&pool->base.opps[i]);
+       }
+
+       for (i = 0; i < pool->base.res_cap->num_timing_generator; i++) {
+               if (pool->base.timing_generators[i] != NULL)    {
+                       kfree(DCN10TG_FROM_TG(pool->base.timing_generators[i]));
+                       pool->base.timing_generators[i] = NULL;
+               }
+       }
+       for (i = 0; i < pool->base.audio_count; i++) {
+               if (pool->base.audios[i])
+                       dce_aud_destroy(&pool->base.audios[i]);
+       }
+
+       for (i = 0; i < pool->base.clk_src_count; i++) {
+               if (pool->base.clock_sources[i] != NULL) {
+                       dcn201_clock_source_destroy(&pool->base.clock_sources[i]);
+                       pool->base.clock_sources[i] = NULL;
+               }
+       }
+
+       if (pool->base.dp_clock_source != NULL) {
+               dcn201_clock_source_destroy(&pool->base.dp_clock_source);
+               pool->base.dp_clock_source = NULL;
+       }
+
+       if (pool->base.dccg != NULL)
+               dcn_dccg_destroy(&pool->base.dccg);
+}
+
+static struct hubp *dcn201_hubp_create(
+       struct dc_context *ctx,
+       uint32_t inst)
+{
+       struct dcn201_hubp *hubp201 =
+               kzalloc(sizeof(struct dcn201_hubp), GFP_ATOMIC);
+
+       if (!hubp201)
+               return NULL;
+
+       if (dcn201_hubp_construct(hubp201, ctx, inst,
+                       &hubp_regs[inst], &hubp_shift, &hubp_mask))
+               return &hubp201->base;
+
+       kfree(hubp201);
+       return NULL;
+}
+
+static struct pipe_ctx *dcn201_acquire_free_pipe_for_layer(
+               const struct dc_state *cur_ctx,
+               struct dc_state *new_ctx,
+               const struct resource_pool *pool,
+               const struct pipe_ctx *opp_head_pipe)
+{
+       struct resource_context *res_ctx = &new_ctx->res_ctx;
+       struct pipe_ctx *head_pipe = resource_get_otg_master_for_stream(res_ctx, opp_head_pipe->stream);
+       struct pipe_ctx *idle_pipe = resource_find_free_secondary_pipe_legacy(res_ctx, pool, head_pipe);
+
+       if (!head_pipe)
+               ASSERT(0);
+
+       if (!idle_pipe)
+               return NULL;
+
+       idle_pipe->stream = head_pipe->stream;
+       idle_pipe->stream_res.tg = head_pipe->stream_res.tg;
+       idle_pipe->stream_res.opp = head_pipe->stream_res.opp;
+
+       idle_pipe->plane_res.hubp = pool->hubps[idle_pipe->pipe_idx];
+       idle_pipe->plane_res.ipp = pool->ipps[idle_pipe->pipe_idx];
+       idle_pipe->plane_res.dpp = pool->dpps[idle_pipe->pipe_idx];
+       idle_pipe->plane_res.mpcc_inst = pool->dpps[idle_pipe->pipe_idx]->inst;
+
+       return idle_pipe;
+}
+
+static bool dcn201_get_dcc_compression_cap(const struct dc *dc,
+               const struct dc_dcc_surface_param *input,
+               struct dc_surface_dcc_cap *output)
+{
+       return dc->res_pool->hubbub->funcs->get_dcc_compression_cap(
+                       dc->res_pool->hubbub,
+                       input,
+                       output);
+}
+
+static void dcn201_populate_dml_writeback_from_context(struct dc *dc,
+                                                      struct resource_context *res_ctx,
+                                                      display_e2e_pipe_params_st *pipes)
+{
+       DC_FP_START();
+       dcn201_populate_dml_writeback_from_context_fpu(dc, res_ctx, pipes);
+       DC_FP_END();
+}
+
+static void dcn201_destroy_resource_pool(struct resource_pool **pool)
+{
+       struct dcn201_resource_pool *dcn201_pool = TO_DCN201_RES_POOL(*pool);
+
+       dcn201_resource_destruct(dcn201_pool);
+       kfree(dcn201_pool);
+       *pool = NULL;
+}
+
+static void dcn201_link_init(struct dc_link *link)
+{
+       if (link->ctx->dc_bios->integrated_info)
+               link->dp_ss_off = !link->ctx->dc_bios->integrated_info->dp_ss_control;
+}
+
+static struct dc_cap_funcs cap_funcs = {
+       .get_dcc_compression_cap = dcn201_get_dcc_compression_cap,
+};
+
+static struct resource_funcs dcn201_res_pool_funcs = {
+       .link_init = dcn201_link_init,
+       .destroy = dcn201_destroy_resource_pool,
+       .link_enc_create = dcn201_link_encoder_create,
+       .panel_cntl_create = NULL,
+       .validate_bandwidth = dcn20_validate_bandwidth,
+       .populate_dml_pipes = dcn20_populate_dml_pipes_from_context,
+       .add_stream_to_ctx = dcn20_add_stream_to_ctx,
+       .add_dsc_to_stream_resource = NULL,
+       .remove_stream_from_ctx = dcn20_remove_stream_from_ctx,
+       .acquire_free_pipe_as_secondary_dpp_pipe = dcn201_acquire_free_pipe_for_layer,
+       .release_pipe = dcn20_release_pipe,
+       .populate_dml_writeback_from_context = dcn201_populate_dml_writeback_from_context,
+       .patch_unknown_plane_state = dcn20_patch_unknown_plane_state,
+       .set_mcif_arb_params = dcn20_set_mcif_arb_params,
+       .find_first_free_match_stream_enc_for_link = dcn10_find_first_free_match_stream_enc_for_link
+};
+
+static bool dcn201_resource_construct(
+       uint8_t num_virtual_links,
+       struct dc *dc,
+       struct dcn201_resource_pool *pool)
+{
+       int i;
+       struct dc_context *ctx = dc->ctx;
+
+       ctx->dc_bios->regs = &bios_regs;
+
+       pool->base.res_cap = &res_cap_dnc201;
+       pool->base.funcs = &dcn201_res_pool_funcs;
+
+       /*************************************************
+        *  Resource + asic cap harcoding                *
+        *************************************************/
+       pool->base.underlay_pipe_index = NO_UNDERLAY_PIPE;
+
+       pool->base.pipe_count = 4;
+       pool->base.mpcc_count = 5;
+       dc->caps.max_downscale_ratio = 200;
+       dc->caps.i2c_speed_in_khz = 100;
+       dc->caps.i2c_speed_in_khz_hdcp = 5; /*1.5 w/a applied by default*/
+       dc->caps.max_cursor_size = 256;
+       dc->caps.min_horizontal_blanking_period = 80;
+       dc->caps.dmdata_alloc_size = 2048;
+
+       dc->caps.max_slave_planes = 1;
+       dc->caps.max_slave_yuv_planes = 1;
+       dc->caps.max_slave_rgb_planes = 1;
+       dc->caps.post_blend_color_processing = true;
+       dc->caps.force_dp_tps4_for_cp2520 = true;
+       dc->caps.extended_aux_timeout_support = true;
+
+       /* Color pipeline capabilities */
+       dc->caps.color.dpp.dcn_arch = 1;
+       dc->caps.color.dpp.input_lut_shared = 0;
+       dc->caps.color.dpp.icsc = 1;
+       dc->caps.color.dpp.dgam_ram = 1;
+       dc->caps.color.dpp.dgam_rom_caps.srgb = 1;
+       dc->caps.color.dpp.dgam_rom_caps.bt2020 = 1;
+       dc->caps.color.dpp.dgam_rom_caps.gamma2_2 = 0;
+       dc->caps.color.dpp.dgam_rom_caps.pq = 0;
+       dc->caps.color.dpp.dgam_rom_caps.hlg = 0;
+       dc->caps.color.dpp.post_csc = 0;
+       dc->caps.color.dpp.gamma_corr = 0;
+       dc->caps.color.dpp.dgam_rom_for_yuv = 1;
+
+       dc->caps.color.dpp.hw_3d_lut = 1;
+       dc->caps.color.dpp.ogam_ram = 1;
+       // no OGAM ROM on DCN2
+       dc->caps.color.dpp.ogam_rom_caps.srgb = 0;
+       dc->caps.color.dpp.ogam_rom_caps.bt2020 = 0;
+       dc->caps.color.dpp.ogam_rom_caps.gamma2_2 = 0;
+       dc->caps.color.dpp.ogam_rom_caps.pq = 0;
+       dc->caps.color.dpp.ogam_rom_caps.hlg = 0;
+       dc->caps.color.dpp.ocsc = 0;
+
+       dc->caps.color.mpc.gamut_remap = 0;
+       dc->caps.color.mpc.num_3dluts = 0;
+       dc->caps.color.mpc.shared_3d_lut = 0;
+       dc->caps.color.mpc.ogam_ram = 1;
+       dc->caps.color.mpc.ogam_rom_caps.srgb = 0;
+       dc->caps.color.mpc.ogam_rom_caps.bt2020 = 0;
+       dc->caps.color.mpc.ogam_rom_caps.gamma2_2 = 0;
+       dc->caps.color.mpc.ogam_rom_caps.pq = 0;
+       dc->caps.color.mpc.ogam_rom_caps.hlg = 0;
+       dc->caps.color.mpc.ocsc = 1;
+
+       dc->debug = debug_defaults_drv;
+
+       /*a0 only, remove later*/
+       dc->work_arounds.no_connect_phy_config  = true;
+       dc->work_arounds.dedcn20_305_wa = true;
+       /*************************************************
+        *  Create resources                             *
+        *************************************************/
+
+       pool->base.clock_sources[DCN20_CLK_SRC_PLL0] =
+                       dcn201_clock_source_create(ctx, ctx->dc_bios,
+                               CLOCK_SOURCE_COMBO_PHY_PLL0,
+                               &clk_src_regs[0], false);
+       pool->base.clock_sources[DCN20_CLK_SRC_PLL1] =
+                       dcn201_clock_source_create(ctx, ctx->dc_bios,
+                               CLOCK_SOURCE_COMBO_PHY_PLL1,
+                               &clk_src_regs[1], false);
+
+       pool->base.clk_src_count = DCN20_CLK_SRC_TOTAL_DCN201;
+
+       /* todo: not reuse phy_pll registers */
+       pool->base.dp_clock_source =
+                       dcn201_clock_source_create(ctx, ctx->dc_bios,
+                               CLOCK_SOURCE_ID_DP_DTO,
+                               &clk_src_regs[0], true);
+
+       for (i = 0; i < pool->base.clk_src_count; i++) {
+               if (pool->base.clock_sources[i] == NULL) {
+                       dm_error("DC: failed to create clock sources!\n");
+                       goto create_fail;
+               }
+       }
+
+       pool->base.dccg = dccg201_create(ctx, &dccg_regs, &dccg_shift, &dccg_mask);
+       if (pool->base.dccg == NULL) {
+               dm_error("DC: failed to create dccg!\n");
+               goto create_fail;
+       }
+
+       dcn201_ip.max_num_otg = pool->base.res_cap->num_timing_generator;
+       dcn201_ip.max_num_dpp = pool->base.pipe_count;
+       dml_init_instance(&dc->dml, &dcn201_soc, &dcn201_ip, DML_PROJECT_DCN201);
+       {
+               struct irq_service_init_data init_data;
+               init_data.ctx = dc->ctx;
+               pool->base.irqs = dal_irq_service_dcn201_create(&init_data);
+               if (!pool->base.irqs)
+                       goto create_fail;
+       }
+
+       /* mem input -> ipp -> dpp -> opp -> TG */
+       for (i = 0; i < pool->base.pipe_count; i++) {
+               pool->base.hubps[i] = dcn201_hubp_create(ctx, i);
+               if (pool->base.hubps[i] == NULL) {
+                       dm_error(
+                               "DC: failed to create memory input!\n");
+                       goto create_fail;
+               }
+
+               pool->base.ipps[i] = dcn201_ipp_create(ctx, i);
+               if (pool->base.ipps[i] == NULL) {
+                       dm_error(
+                               "DC: failed to create input pixel processor!\n");
+                       goto create_fail;
+               }
+
+               pool->base.dpps[i] = dcn201_dpp_create(ctx, i);
+               if (pool->base.dpps[i] == NULL) {
+                       dm_error(
+                               "DC: failed to create dpps!\n");
+                       goto create_fail;
+               }
+       }
+
+       for (i = 0; i < pool->base.res_cap->num_opp; i++) {
+               pool->base.opps[i] = dcn201_opp_create(ctx, i);
+               if (pool->base.opps[i] == NULL) {
+                       dm_error(
+                               "DC: failed to create output pixel processor!\n");
+                       goto create_fail;
+               }
+       }
+
+       for (i = 0; i < pool->base.res_cap->num_ddc; i++) {
+               pool->base.engines[i] = dcn201_aux_engine_create(ctx, i);
+               if (pool->base.engines[i] == NULL) {
+                       dm_error(
+                               "DC:failed to create aux engine!!\n");
+                       goto create_fail;
+               }
+               pool->base.hw_i2cs[i] = dcn201_i2c_hw_create(ctx, i);
+               if (pool->base.hw_i2cs[i] == NULL) {
+                       dm_error(
+                               "DC:failed to create hw i2c!!\n");
+                       goto create_fail;
+               }
+               pool->base.sw_i2cs[i] = NULL;
+       }
+
+       for (i = 0; i < pool->base.res_cap->num_timing_generator; i++) {
+               pool->base.timing_generators[i] = dcn201_timing_generator_create(
+                               ctx, i);
+               if (pool->base.timing_generators[i] == NULL) {
+                       dm_error("DC: failed to create tg!\n");
+                       goto create_fail;
+               }
+       }
+
+       pool->base.timing_generator_count = i;
+
+       pool->base.mpc = dcn201_mpc_create(ctx, pool->base.mpcc_count);
+       if (pool->base.mpc == NULL) {
+               dm_error("DC: failed to create mpc!\n");
+               goto create_fail;
+       }
+
+       pool->base.hubbub = dcn201_hubbub_create(ctx);
+       if (pool->base.hubbub == NULL) {
+               dm_error("DC: failed to create hubbub!\n");
+               goto create_fail;
+       }
+
+       if (!resource_construct(num_virtual_links, dc, &pool->base,
+                       &res_create_funcs))
+               goto create_fail;
+
+       dcn201_hw_sequencer_construct(dc);
+
+       dc->caps.max_planes =  pool->base.pipe_count;
+
+       for (i = 0; i < dc->caps.max_planes; ++i)
+               dc->caps.planes[i] = plane_cap;
+
+       dc->cap_funcs = cap_funcs;
+
+       return true;
+
+create_fail:
+
+       dcn201_resource_destruct(pool);
+
+       return false;
+}
+
+struct resource_pool *dcn201_create_resource_pool(
+               const struct dc_init_data *init_data,
+               struct dc *dc)
+{
+       struct dcn201_resource_pool *pool =
+               kzalloc(sizeof(struct dcn201_resource_pool), GFP_ATOMIC);
+
+       if (!pool)
+               return NULL;
+
+       if (dcn201_resource_construct(init_data->num_virtual_links, dc, pool))
+               return &pool->base;
+
+       kfree(pool);
+       return NULL;
+}
diff --git a/drivers/gpu/drm/amd/display/dc/resource/dcn201/dcn201_resource.h b/drivers/gpu/drm/amd/display/dc/resource/dcn201/dcn201_resource.h
new file mode 100644 (file)
index 0000000..e0467d1
--- /dev/null
@@ -0,0 +1,50 @@
+/*
+* Copyright 2017 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_RESOURCE_DCN201_H__
+#define __DC_RESOURCE_DCN201_H__
+
+#include "core_types.h"
+
+#define RRDPCS_PHY_DP_TX_PSTATE_POWER_UP    0x00000000
+#define RRDPCS_PHY_DP_TX_PSTATE_HOLD        0x00000001
+#define RRDPCS_PHY_DP_TX_PSTATE_HOLD_OFF    0x00000002
+#define RRDPCS_PHY_DP_TX_PSTATE_POWER_DOWN  0x00000003
+
+#define TO_DCN201_RES_POOL(pool)\
+       container_of(pool, struct dcn201_resource_pool, base)
+
+struct dc;
+struct resource_pool;
+struct _vcs_dpi_display_pipe_params_st;
+
+struct dcn201_resource_pool {
+       struct resource_pool base;
+};
+struct resource_pool *dcn201_create_resource_pool(
+               const struct dc_init_data *init_data,
+               struct dc *dc);
+
+#endif /* __DC_RESOURCE_DCN201_H__ */
diff --git a/drivers/gpu/drm/amd/display/dc/resource/dcn21/dcn21_resource.c b/drivers/gpu/drm/amd/display/dc/resource/dcn21/dcn21_resource.c
new file mode 100644 (file)
index 0000000..c07da45
--- /dev/null
@@ -0,0 +1,1745 @@
+/*
+* Copyright 2018 Advanced Micro Devices, Inc.
+ * Copyright 2019 Raptor Engineering, LLC
+ *
+ * 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 <linux/slab.h>
+
+#include "dm_services.h"
+#include "dc.h"
+
+#include "dcn21/dcn21_init.h"
+
+#include "resource.h"
+#include "include/irq_service_interface.h"
+#include "dcn20/dcn20_resource.h"
+#include "dcn21/dcn21_resource.h"
+
+#include "dml/dcn20/dcn20_fpu.h"
+
+#include "clk_mgr.h"
+#include "dcn10/dcn10_hubp.h"
+#include "dcn10/dcn10_ipp.h"
+#include "dcn20/dcn20_hubbub.h"
+#include "dcn20/dcn20_mpc.h"
+#include "dcn20/dcn20_hubp.h"
+#include "dcn21/dcn21_hubp.h"
+#include "irq/dcn21/irq_service_dcn21.h"
+#include "dcn20/dcn20_dpp.h"
+#include "dcn20/dcn20_optc.h"
+#include "dcn21/dcn21_hwseq.h"
+#include "dce110/dce110_hwseq.h"
+#include "dcn20/dcn20_opp.h"
+#include "dcn20/dcn20_dsc.h"
+#include "dcn21/dcn21_link_encoder.h"
+#include "dcn20/dcn20_stream_encoder.h"
+#include "dce/dce_clock_source.h"
+#include "dce/dce_audio.h"
+#include "dce/dce_hwseq.h"
+#include "virtual/virtual_stream_encoder.h"
+#include "dml/display_mode_vba.h"
+#include "dcn20/dcn20_dccg.h"
+#include "dcn21/dcn21_dccg.h"
+#include "dcn21/dcn21_hubbub.h"
+#include "dcn10/dcn10_resource.h"
+#include "dce/dce_panel_cntl.h"
+
+#include "dcn20/dcn20_dwb.h"
+#include "dcn20/dcn20_mmhubbub.h"
+#include "dpcs/dpcs_2_1_0_offset.h"
+#include "dpcs/dpcs_2_1_0_sh_mask.h"
+
+#include "renoir_ip_offset.h"
+#include "dcn/dcn_2_1_0_offset.h"
+#include "dcn/dcn_2_1_0_sh_mask.h"
+
+#include "nbio/nbio_7_0_offset.h"
+
+#include "mmhub/mmhub_2_0_0_offset.h"
+#include "mmhub/mmhub_2_0_0_sh_mask.h"
+
+#include "reg_helper.h"
+#include "dce/dce_abm.h"
+#include "dce/dce_dmcu.h"
+#include "dce/dce_aux.h"
+#include "dce/dce_i2c.h"
+#include "dcn21_resource.h"
+#include "vm_helper.h"
+#include "dcn20/dcn20_vmid.h"
+#include "dce/dmub_psr.h"
+#include "dce/dmub_abm.h"
+
+/* begin *********************
+ * macros to expend register list macro defined in HW object header file */
+
+/* DCN */
+#define BASE_INNER(seg) DMU_BASE__INST0_SEG ## seg
+
+#define BASE(seg) BASE_INNER(seg)
+
+#define SR(reg_name)\
+               .reg_name = BASE(mm ## reg_name ## _BASE_IDX) +  \
+                                       mm ## reg_name
+
+#define SRI(reg_name, block, id)\
+       .reg_name = BASE(mm ## block ## id ## _ ## reg_name ## _BASE_IDX) + \
+                                       mm ## block ## id ## _ ## reg_name
+
+#define SRIR(var_name, reg_name, block, id)\
+       .var_name = BASE(mm ## block ## id ## _ ## reg_name ## _BASE_IDX) + \
+                                       mm ## block ## id ## _ ## reg_name
+
+#define SRII(reg_name, block, id)\
+       .reg_name[id] = BASE(mm ## block ## id ## _ ## reg_name ## _BASE_IDX) + \
+                                       mm ## block ## id ## _ ## reg_name
+
+#define DCCG_SRII(reg_name, block, id)\
+       .block ## _ ## reg_name[id] = BASE(mm ## block ## id ## _ ## reg_name ## _BASE_IDX) + \
+                                       mm ## block ## id ## _ ## reg_name
+
+#define VUPDATE_SRII(reg_name, block, id)\
+       .reg_name[id] = BASE(mm ## reg_name ## _ ## block ## id ## _BASE_IDX) + \
+                                       mm ## reg_name ## _ ## block ## id
+
+/* NBIO */
+#define NBIO_BASE_INNER(seg) \
+       NBIF0_BASE__INST0_SEG ## seg
+
+#define NBIO_BASE(seg) \
+       NBIO_BASE_INNER(seg)
+
+#define NBIO_SR(reg_name)\
+               .reg_name = NBIO_BASE(mm ## reg_name ## _BASE_IDX) + \
+                                       mm ## reg_name
+
+/* MMHUB */
+#define MMHUB_BASE_INNER(seg) \
+       MMHUB_BASE__INST0_SEG ## seg
+
+#define MMHUB_BASE(seg) \
+       MMHUB_BASE_INNER(seg)
+
+#define MMHUB_SR(reg_name)\
+               .reg_name = MMHUB_BASE(mmMM ## reg_name ## _BASE_IDX) + \
+                                       mmMM ## reg_name
+
+#define clk_src_regs(index, pllid)\
+[index] = {\
+       CS_COMMON_REG_LIST_DCN2_1(index, pllid),\
+}
+
+static const struct dce110_clk_src_regs clk_src_regs[] = {
+       clk_src_regs(0, A),
+       clk_src_regs(1, B),
+       clk_src_regs(2, C),
+       clk_src_regs(3, D),
+       clk_src_regs(4, E),
+};
+
+static const struct dce110_clk_src_shift cs_shift = {
+               CS_COMMON_MASK_SH_LIST_DCN2_0(__SHIFT)
+};
+
+static const struct dce110_clk_src_mask cs_mask = {
+               CS_COMMON_MASK_SH_LIST_DCN2_0(_MASK)
+};
+
+static const struct bios_registers bios_regs = {
+               NBIO_SR(BIOS_SCRATCH_3),
+               NBIO_SR(BIOS_SCRATCH_6)
+};
+
+static const struct dce_dmcu_registers dmcu_regs = {
+               DMCU_DCN20_REG_LIST()
+};
+
+static const struct dce_dmcu_shift dmcu_shift = {
+               DMCU_MASK_SH_LIST_DCN10(__SHIFT)
+};
+
+static const struct dce_dmcu_mask dmcu_mask = {
+               DMCU_MASK_SH_LIST_DCN10(_MASK)
+};
+
+static const struct dce_abm_registers abm_regs = {
+               ABM_DCN20_REG_LIST()
+};
+
+static const struct dce_abm_shift abm_shift = {
+               ABM_MASK_SH_LIST_DCN20(__SHIFT)
+};
+
+static const struct dce_abm_mask abm_mask = {
+               ABM_MASK_SH_LIST_DCN20(_MASK)
+};
+
+#define audio_regs(id)\
+[id] = {\
+               AUD_COMMON_REG_LIST(id)\
+}
+
+static const struct dce_audio_registers audio_regs[] = {
+       audio_regs(0),
+       audio_regs(1),
+       audio_regs(2),
+       audio_regs(3),
+       audio_regs(4),
+       audio_regs(5),
+};
+
+#define DCE120_AUD_COMMON_MASK_SH_LIST(mask_sh)\
+               SF(AZF0ENDPOINT0_AZALIA_F0_CODEC_ENDPOINT_INDEX, AZALIA_ENDPOINT_REG_INDEX, mask_sh),\
+               SF(AZF0ENDPOINT0_AZALIA_F0_CODEC_ENDPOINT_DATA, AZALIA_ENDPOINT_REG_DATA, mask_sh),\
+               AUD_COMMON_MASK_SH_LIST_BASE(mask_sh)
+
+static const struct dce_audio_shift audio_shift = {
+               DCE120_AUD_COMMON_MASK_SH_LIST(__SHIFT)
+};
+
+static const struct dce_audio_mask audio_mask = {
+               DCE120_AUD_COMMON_MASK_SH_LIST(_MASK)
+};
+
+static const struct dccg_registers dccg_regs = {
+               DCCG_COMMON_REG_LIST_DCN_BASE()
+};
+
+static const struct dccg_shift dccg_shift = {
+               DCCG_MASK_SH_LIST_DCN2_1(__SHIFT)
+};
+
+static const struct dccg_mask dccg_mask = {
+               DCCG_MASK_SH_LIST_DCN2_1(_MASK)
+};
+
+#define opp_regs(id)\
+[id] = {\
+       OPP_REG_LIST_DCN20(id),\
+}
+
+static const struct dcn20_opp_registers opp_regs[] = {
+       opp_regs(0),
+       opp_regs(1),
+       opp_regs(2),
+       opp_regs(3),
+       opp_regs(4),
+       opp_regs(5),
+};
+
+static const struct dcn20_opp_shift opp_shift = {
+               OPP_MASK_SH_LIST_DCN20(__SHIFT)
+};
+
+static const struct dcn20_opp_mask opp_mask = {
+               OPP_MASK_SH_LIST_DCN20(_MASK)
+};
+
+#define tg_regs(id)\
+[id] = {TG_COMMON_REG_LIST_DCN2_0(id)}
+
+static const struct dcn_optc_registers tg_regs[] = {
+       tg_regs(0),
+       tg_regs(1),
+       tg_regs(2),
+       tg_regs(3)
+};
+
+static const struct dcn_optc_shift tg_shift = {
+       TG_COMMON_MASK_SH_LIST_DCN2_0(__SHIFT)
+};
+
+static const struct dcn_optc_mask tg_mask = {
+       TG_COMMON_MASK_SH_LIST_DCN2_0(_MASK)
+};
+
+static const struct dcn20_mpc_registers mpc_regs = {
+               MPC_REG_LIST_DCN2_0(0),
+               MPC_REG_LIST_DCN2_0(1),
+               MPC_REG_LIST_DCN2_0(2),
+               MPC_REG_LIST_DCN2_0(3),
+               MPC_REG_LIST_DCN2_0(4),
+               MPC_REG_LIST_DCN2_0(5),
+               MPC_OUT_MUX_REG_LIST_DCN2_0(0),
+               MPC_OUT_MUX_REG_LIST_DCN2_0(1),
+               MPC_OUT_MUX_REG_LIST_DCN2_0(2),
+               MPC_OUT_MUX_REG_LIST_DCN2_0(3),
+               MPC_DBG_REG_LIST_DCN2_0()
+};
+
+static const struct dcn20_mpc_shift mpc_shift = {
+       MPC_COMMON_MASK_SH_LIST_DCN2_0(__SHIFT),
+       MPC_DEBUG_REG_LIST_SH_DCN20
+};
+
+static const struct dcn20_mpc_mask mpc_mask = {
+       MPC_COMMON_MASK_SH_LIST_DCN2_0(_MASK),
+       MPC_DEBUG_REG_LIST_MASK_DCN20
+};
+
+#define hubp_regs(id)\
+[id] = {\
+       HUBP_REG_LIST_DCN21(id)\
+}
+
+static const struct dcn_hubp2_registers hubp_regs[] = {
+               hubp_regs(0),
+               hubp_regs(1),
+               hubp_regs(2),
+               hubp_regs(3)
+};
+
+static const struct dcn_hubp2_shift hubp_shift = {
+               HUBP_MASK_SH_LIST_DCN21(__SHIFT)
+};
+
+static const struct dcn_hubp2_mask hubp_mask = {
+               HUBP_MASK_SH_LIST_DCN21(_MASK)
+};
+
+static const struct dcn_hubbub_registers hubbub_reg = {
+               HUBBUB_REG_LIST_DCN21()
+};
+
+static const struct dcn_hubbub_shift hubbub_shift = {
+               HUBBUB_MASK_SH_LIST_DCN21(__SHIFT)
+};
+
+static const struct dcn_hubbub_mask hubbub_mask = {
+               HUBBUB_MASK_SH_LIST_DCN21(_MASK)
+};
+
+
+#define vmid_regs(id)\
+[id] = {\
+               DCN20_VMID_REG_LIST(id)\
+}
+
+static const struct dcn_vmid_registers vmid_regs[] = {
+       vmid_regs(0),
+       vmid_regs(1),
+       vmid_regs(2),
+       vmid_regs(3),
+       vmid_regs(4),
+       vmid_regs(5),
+       vmid_regs(6),
+       vmid_regs(7),
+       vmid_regs(8),
+       vmid_regs(9),
+       vmid_regs(10),
+       vmid_regs(11),
+       vmid_regs(12),
+       vmid_regs(13),
+       vmid_regs(14),
+       vmid_regs(15)
+};
+
+static const struct dcn20_vmid_shift vmid_shifts = {
+               DCN20_VMID_MASK_SH_LIST(__SHIFT)
+};
+
+static const struct dcn20_vmid_mask vmid_masks = {
+               DCN20_VMID_MASK_SH_LIST(_MASK)
+};
+
+#define dsc_regsDCN20(id)\
+[id] = {\
+       DSC_REG_LIST_DCN20(id)\
+}
+
+static const struct dcn20_dsc_registers dsc_regs[] = {
+       dsc_regsDCN20(0),
+       dsc_regsDCN20(1),
+       dsc_regsDCN20(2),
+       dsc_regsDCN20(3),
+       dsc_regsDCN20(4),
+       dsc_regsDCN20(5)
+};
+
+static const struct dcn20_dsc_shift dsc_shift = {
+       DSC_REG_LIST_SH_MASK_DCN20(__SHIFT)
+};
+
+static const struct dcn20_dsc_mask dsc_mask = {
+       DSC_REG_LIST_SH_MASK_DCN20(_MASK)
+};
+
+#define ipp_regs(id)\
+[id] = {\
+       IPP_REG_LIST_DCN20(id),\
+}
+
+static const struct dcn10_ipp_registers ipp_regs[] = {
+       ipp_regs(0),
+       ipp_regs(1),
+       ipp_regs(2),
+       ipp_regs(3),
+};
+
+static const struct dcn10_ipp_shift ipp_shift = {
+               IPP_MASK_SH_LIST_DCN20(__SHIFT)
+};
+
+static const struct dcn10_ipp_mask ipp_mask = {
+               IPP_MASK_SH_LIST_DCN20(_MASK),
+};
+
+#define opp_regs(id)\
+[id] = {\
+       OPP_REG_LIST_DCN20(id),\
+}
+
+
+#define aux_engine_regs(id)\
+[id] = {\
+       AUX_COMMON_REG_LIST0(id), \
+       .AUXN_IMPCAL = 0, \
+       .AUXP_IMPCAL = 0, \
+       .AUX_RESET_MASK = DP_AUX0_AUX_CONTROL__AUX_RESET_MASK, \
+}
+
+static const struct dce110_aux_registers aux_engine_regs[] = {
+               aux_engine_regs(0),
+               aux_engine_regs(1),
+               aux_engine_regs(2),
+               aux_engine_regs(3),
+               aux_engine_regs(4),
+};
+
+#define tf_regs(id)\
+[id] = {\
+       TF_REG_LIST_DCN20(id),\
+       TF_REG_LIST_DCN20_COMMON_APPEND(id),\
+}
+
+static const struct dcn2_dpp_registers tf_regs[] = {
+       tf_regs(0),
+       tf_regs(1),
+       tf_regs(2),
+       tf_regs(3),
+};
+
+static const struct dcn2_dpp_shift tf_shift = {
+               TF_REG_LIST_SH_MASK_DCN20(__SHIFT),
+               TF_DEBUG_REG_LIST_SH_DCN20
+};
+
+static const struct dcn2_dpp_mask tf_mask = {
+               TF_REG_LIST_SH_MASK_DCN20(_MASK),
+               TF_DEBUG_REG_LIST_MASK_DCN20
+};
+
+#define stream_enc_regs(id)\
+[id] = {\
+       SE_DCN2_REG_LIST(id)\
+}
+
+static const struct dcn10_stream_enc_registers stream_enc_regs[] = {
+       stream_enc_regs(0),
+       stream_enc_regs(1),
+       stream_enc_regs(2),
+       stream_enc_regs(3),
+       stream_enc_regs(4),
+};
+
+static const struct dce110_aux_registers_shift aux_shift = {
+       DCN_AUX_MASK_SH_LIST(__SHIFT)
+};
+
+static const struct dce110_aux_registers_mask aux_mask = {
+       DCN_AUX_MASK_SH_LIST(_MASK)
+};
+
+static const struct dcn10_stream_encoder_shift se_shift = {
+               SE_COMMON_MASK_SH_LIST_DCN20(__SHIFT)
+};
+
+static const struct dcn10_stream_encoder_mask se_mask = {
+               SE_COMMON_MASK_SH_LIST_DCN20(_MASK)
+};
+
+static void dcn21_pp_smu_destroy(struct pp_smu_funcs **pp_smu);
+
+static struct input_pixel_processor *dcn21_ipp_create(
+       struct dc_context *ctx, uint32_t inst)
+{
+       struct dcn10_ipp *ipp =
+               kzalloc(sizeof(struct dcn10_ipp), GFP_KERNEL);
+
+       if (!ipp) {
+               BREAK_TO_DEBUGGER();
+               return NULL;
+       }
+
+       dcn20_ipp_construct(ipp, ctx, inst,
+                       &ipp_regs[inst], &ipp_shift, &ipp_mask);
+       return &ipp->base;
+}
+
+static struct dpp *dcn21_dpp_create(
+       struct dc_context *ctx,
+       uint32_t inst)
+{
+       struct dcn20_dpp *dpp =
+               kzalloc(sizeof(struct dcn20_dpp), GFP_KERNEL);
+
+       if (!dpp)
+               return NULL;
+
+       if (dpp2_construct(dpp, ctx, inst,
+                       &tf_regs[inst], &tf_shift, &tf_mask))
+               return &dpp->base;
+
+       BREAK_TO_DEBUGGER();
+       kfree(dpp);
+       return NULL;
+}
+
+static struct dce_aux *dcn21_aux_engine_create(
+       struct dc_context *ctx,
+       uint32_t inst)
+{
+       struct aux_engine_dce110 *aux_engine =
+               kzalloc(sizeof(struct aux_engine_dce110), GFP_KERNEL);
+
+       if (!aux_engine)
+               return NULL;
+
+       dce110_aux_engine_construct(aux_engine, ctx, inst,
+                                   SW_AUX_TIMEOUT_PERIOD_MULTIPLIER * AUX_TIMEOUT_PERIOD,
+                                   &aux_engine_regs[inst],
+                                       &aux_mask,
+                                       &aux_shift,
+                                       ctx->dc->caps.extended_aux_timeout_support);
+
+       return &aux_engine->base;
+}
+
+#define i2c_inst_regs(id) { I2C_HW_ENGINE_COMMON_REG_LIST(id) }
+
+static const struct dce_i2c_registers i2c_hw_regs[] = {
+               i2c_inst_regs(1),
+               i2c_inst_regs(2),
+               i2c_inst_regs(3),
+               i2c_inst_regs(4),
+               i2c_inst_regs(5),
+};
+
+static const struct dce_i2c_shift i2c_shifts = {
+               I2C_COMMON_MASK_SH_LIST_DCN2(__SHIFT)
+};
+
+static const struct dce_i2c_mask i2c_masks = {
+               I2C_COMMON_MASK_SH_LIST_DCN2(_MASK)
+};
+
+static struct dce_i2c_hw *dcn21_i2c_hw_create(struct dc_context *ctx,
+                                             uint32_t inst)
+{
+       struct dce_i2c_hw *dce_i2c_hw =
+               kzalloc(sizeof(struct dce_i2c_hw), GFP_KERNEL);
+
+       if (!dce_i2c_hw)
+               return NULL;
+
+       dcn2_i2c_hw_construct(dce_i2c_hw, ctx, inst,
+                                   &i2c_hw_regs[inst], &i2c_shifts, &i2c_masks);
+
+       return dce_i2c_hw;
+}
+
+static const struct resource_caps res_cap_rn = {
+               .num_timing_generator = 4,
+               .num_opp = 4,
+               .num_video_plane = 4,
+               .num_audio = 4, // 4 audio endpoints.  4 audio streams
+               .num_stream_encoder = 5,
+               .num_pll = 5,  // maybe 3 because the last two used for USB-c
+               .num_dwb = 1,
+               .num_ddc = 5,
+               .num_vmid = 16,
+               .num_dsc = 3,
+};
+
+#ifdef DIAGS_BUILD
+static const struct resource_caps res_cap_rn_FPGA_4pipe = {
+               .num_timing_generator = 4,
+               .num_opp = 4,
+               .num_video_plane = 4,
+               .num_audio = 7,
+               .num_stream_encoder = 4,
+               .num_pll = 4,
+               .num_dwb = 1,
+               .num_ddc = 4,
+               .num_dsc = 0,
+};
+
+static const struct resource_caps res_cap_rn_FPGA_2pipe_dsc = {
+               .num_timing_generator = 2,
+               .num_opp = 2,
+               .num_video_plane = 2,
+               .num_audio = 7,
+               .num_stream_encoder = 2,
+               .num_pll = 4,
+               .num_dwb = 1,
+               .num_ddc = 4,
+               .num_dsc = 2,
+};
+#endif
+
+static const struct dc_plane_cap plane_cap = {
+       .type = DC_PLANE_TYPE_DCN_UNIVERSAL,
+       .per_pixel_alpha = true,
+
+       .pixel_format_support = {
+                       .argb8888 = true,
+                       .nv12 = true,
+                       .fp16 = true,
+                       .p010 = true
+       },
+
+       .max_upscale_factor = {
+                       .argb8888 = 16000,
+                       .nv12 = 16000,
+                       .fp16 = 16000
+       },
+
+       .max_downscale_factor = {
+                       .argb8888 = 250,
+                       .nv12 = 250,
+                       .fp16 = 250
+       },
+       64,
+       64
+};
+
+static const struct dc_debug_options debug_defaults_drv = {
+               .disable_dmcu = false,
+               .force_abm_enable = false,
+               .timing_trace = false,
+               .clock_trace = true,
+               .disable_pplib_clock_request = true,
+               .min_disp_clk_khz = 100000,
+               .pipe_split_policy = MPC_SPLIT_DYNAMIC,
+               .force_single_disp_pipe_split = false,
+               .disable_dcc = DCC_ENABLE,
+               .vsr_support = true,
+               .performance_trace = false,
+               .max_downscale_src_width = 4096,
+               .disable_pplib_wm_range = false,
+               .scl_reset_length10 = true,
+               .sanity_checks = true,
+               .disable_48mhz_pwrdwn = false,
+               .usbc_combo_phy_reset_wa = true,
+               .dmub_command_table = true,
+               .use_max_lb = true,
+               .enable_legacy_fast_update = true,
+               .using_dml2 = false,
+};
+
+static const struct dc_panel_config panel_config_defaults = {
+               .psr = {
+                       .disable_psr = false,
+                       .disallow_psrsu = false,
+                       .disallow_replay = false,
+               },
+               .ilr = {
+                       .optimize_edp_link_rate = true,
+               },
+};
+
+enum dcn20_clk_src_array_id {
+       DCN20_CLK_SRC_PLL0,
+       DCN20_CLK_SRC_PLL1,
+       DCN20_CLK_SRC_PLL2,
+       DCN20_CLK_SRC_PLL3,
+       DCN20_CLK_SRC_PLL4,
+       DCN20_CLK_SRC_TOTAL_DCN21
+};
+
+static void dcn21_resource_destruct(struct dcn21_resource_pool *pool)
+{
+       unsigned int i;
+
+       for (i = 0; i < pool->base.stream_enc_count; i++) {
+               if (pool->base.stream_enc[i] != NULL) {
+                       kfree(DCN10STRENC_FROM_STRENC(pool->base.stream_enc[i]));
+                       pool->base.stream_enc[i] = NULL;
+               }
+       }
+
+       for (i = 0; i < pool->base.res_cap->num_dsc; i++) {
+               if (pool->base.dscs[i] != NULL)
+                       dcn20_dsc_destroy(&pool->base.dscs[i]);
+       }
+
+       if (pool->base.mpc != NULL) {
+               kfree(TO_DCN20_MPC(pool->base.mpc));
+               pool->base.mpc = NULL;
+       }
+       if (pool->base.hubbub != NULL) {
+               kfree(pool->base.hubbub);
+               pool->base.hubbub = NULL;
+       }
+       for (i = 0; i < pool->base.pipe_count; i++) {
+               if (pool->base.dpps[i] != NULL)
+                       dcn20_dpp_destroy(&pool->base.dpps[i]);
+
+               if (pool->base.ipps[i] != NULL)
+                       pool->base.ipps[i]->funcs->ipp_destroy(&pool->base.ipps[i]);
+
+               if (pool->base.hubps[i] != NULL) {
+                       kfree(TO_DCN20_HUBP(pool->base.hubps[i]));
+                       pool->base.hubps[i] = NULL;
+               }
+
+               if (pool->base.irqs != NULL) {
+                       dal_irq_service_destroy(&pool->base.irqs);
+               }
+       }
+
+       for (i = 0; i < pool->base.res_cap->num_ddc; i++) {
+               if (pool->base.engines[i] != NULL)
+                       dce110_engine_destroy(&pool->base.engines[i]);
+               if (pool->base.hw_i2cs[i] != NULL) {
+                       kfree(pool->base.hw_i2cs[i]);
+                       pool->base.hw_i2cs[i] = NULL;
+               }
+               if (pool->base.sw_i2cs[i] != NULL) {
+                       kfree(pool->base.sw_i2cs[i]);
+                       pool->base.sw_i2cs[i] = NULL;
+               }
+       }
+
+       for (i = 0; i < pool->base.res_cap->num_opp; i++) {
+               if (pool->base.opps[i] != NULL)
+                       pool->base.opps[i]->funcs->opp_destroy(&pool->base.opps[i]);
+       }
+
+       for (i = 0; i < pool->base.res_cap->num_timing_generator; i++) {
+               if (pool->base.timing_generators[i] != NULL)    {
+                       kfree(DCN10TG_FROM_TG(pool->base.timing_generators[i]));
+                       pool->base.timing_generators[i] = NULL;
+               }
+       }
+
+       for (i = 0; i < pool->base.res_cap->num_dwb; i++) {
+               if (pool->base.dwbc[i] != NULL) {
+                       kfree(TO_DCN20_DWBC(pool->base.dwbc[i]));
+                       pool->base.dwbc[i] = NULL;
+               }
+               if (pool->base.mcif_wb[i] != NULL) {
+                       kfree(TO_DCN20_MMHUBBUB(pool->base.mcif_wb[i]));
+                       pool->base.mcif_wb[i] = NULL;
+               }
+       }
+
+       for (i = 0; i < pool->base.audio_count; i++) {
+               if (pool->base.audios[i])
+                       dce_aud_destroy(&pool->base.audios[i]);
+       }
+
+       for (i = 0; i < pool->base.clk_src_count; i++) {
+               if (pool->base.clock_sources[i] != NULL) {
+                       dcn20_clock_source_destroy(&pool->base.clock_sources[i]);
+                       pool->base.clock_sources[i] = NULL;
+               }
+       }
+
+       if (pool->base.dp_clock_source != NULL) {
+               dcn20_clock_source_destroy(&pool->base.dp_clock_source);
+               pool->base.dp_clock_source = NULL;
+       }
+
+       if (pool->base.abm != NULL) {
+               if (pool->base.abm->ctx->dc->config.disable_dmcu)
+                       dmub_abm_destroy(&pool->base.abm);
+               else
+                       dce_abm_destroy(&pool->base.abm);
+       }
+
+       if (pool->base.dmcu != NULL)
+               dce_dmcu_destroy(&pool->base.dmcu);
+
+       if (pool->base.psr != NULL)
+               dmub_psr_destroy(&pool->base.psr);
+
+       if (pool->base.dccg != NULL)
+               dcn_dccg_destroy(&pool->base.dccg);
+
+       if (pool->base.pp_smu != NULL)
+               dcn21_pp_smu_destroy(&pool->base.pp_smu);
+}
+
+bool dcn21_fast_validate_bw(struct dc *dc,
+                           struct dc_state *context,
+                           display_e2e_pipe_params_st *pipes,
+                           int *pipe_cnt_out,
+                           int *pipe_split_from,
+                           int *vlevel_out,
+                           bool fast_validate)
+{
+       bool out = false;
+       int split[MAX_PIPES] = { 0 };
+       int pipe_cnt, i, pipe_idx, vlevel;
+
+       ASSERT(pipes);
+       if (!pipes)
+               return false;
+
+       dcn20_merge_pipes_for_validate(dc, context);
+
+       DC_FP_START();
+       pipe_cnt = dc->res_pool->funcs->populate_dml_pipes(dc, context, pipes, fast_validate);
+       DC_FP_END();
+
+       *pipe_cnt_out = pipe_cnt;
+
+       if (!pipe_cnt) {
+               out = true;
+               goto validate_out;
+       }
+       /*
+        * DML favors voltage over p-state, but we're more interested in
+        * supporting p-state over voltage. We can't support p-state in
+        * prefetch mode > 0 so try capping the prefetch mode to start.
+        */
+       context->bw_ctx.dml.soc.allow_dram_self_refresh_or_dram_clock_change_in_vblank =
+                               dm_allow_self_refresh_and_mclk_switch;
+       vlevel = dml_get_voltage_level(&context->bw_ctx.dml, pipes, pipe_cnt);
+
+       if (vlevel > context->bw_ctx.dml.soc.num_states) {
+               /*
+                * If mode is unsupported or there's still no p-state support then
+                * fall back to favoring voltage.
+                *
+                * We don't actually support prefetch mode 2, so require that we
+                * at least support prefetch mode 1.
+                */
+               context->bw_ctx.dml.soc.allow_dram_self_refresh_or_dram_clock_change_in_vblank =
+                                       dm_allow_self_refresh;
+               vlevel = dml_get_voltage_level(&context->bw_ctx.dml, pipes, pipe_cnt);
+               if (vlevel > context->bw_ctx.dml.soc.num_states)
+                       goto validate_fail;
+       }
+
+       vlevel = dcn20_validate_apply_pipe_split_flags(dc, context, vlevel, split, NULL);
+
+       for (i = 0, pipe_idx = 0; i < dc->res_pool->pipe_count; i++) {
+               struct pipe_ctx *pipe = &context->res_ctx.pipe_ctx[i];
+               struct pipe_ctx *mpo_pipe = pipe->bottom_pipe;
+               struct vba_vars_st *vba = &context->bw_ctx.dml.vba;
+
+               if (!pipe->stream)
+                       continue;
+
+               /* We only support full screen mpo with ODM */
+               if (vba->ODMCombineEnabled[vba->pipe_plane[pipe_idx]] != dm_odm_combine_mode_disabled
+                               && pipe->plane_state && mpo_pipe
+                               && memcmp(&mpo_pipe->plane_state->clip_rect,
+                                               &pipe->stream->src,
+                                               sizeof(struct rect)) != 0) {
+                       ASSERT(mpo_pipe->plane_state != pipe->plane_state);
+                       goto validate_fail;
+               }
+               pipe_idx++;
+       }
+
+       /*initialize pipe_just_split_from to invalid idx*/
+       for (i = 0; i < MAX_PIPES; i++)
+               pipe_split_from[i] = -1;
+
+       for (i = 0, pipe_idx = -1; i < dc->res_pool->pipe_count; i++) {
+               struct pipe_ctx *pipe = &context->res_ctx.pipe_ctx[i];
+               struct pipe_ctx *hsplit_pipe = pipe->bottom_pipe;
+
+               if (!pipe->stream || pipe_split_from[i] >= 0)
+                       continue;
+
+               pipe_idx++;
+
+               if (!pipe->top_pipe && !pipe->plane_state && context->bw_ctx.dml.vba.ODMCombineEnabled[pipe_idx]) {
+                       hsplit_pipe = dcn20_find_secondary_pipe(dc, &context->res_ctx, dc->res_pool, pipe);
+                       ASSERT(hsplit_pipe);
+                       if (!dcn20_split_stream_for_odm(
+                                       dc, &context->res_ctx,
+                                       pipe, hsplit_pipe))
+                               goto validate_fail;
+                       pipe_split_from[hsplit_pipe->pipe_idx] = pipe_idx;
+                       dcn20_build_mapped_resource(dc, context, pipe->stream);
+               }
+
+               if (!pipe->plane_state)
+                       continue;
+               /* Skip 2nd half of already split pipe */
+               if (pipe->top_pipe && pipe->plane_state == pipe->top_pipe->plane_state)
+                       continue;
+
+               if (split[i] == 2) {
+                       if (!hsplit_pipe || hsplit_pipe->plane_state != pipe->plane_state) {
+                               /* pipe not split previously needs split */
+                               hsplit_pipe = dcn20_find_secondary_pipe(dc, &context->res_ctx, dc->res_pool, pipe);
+                               ASSERT(hsplit_pipe);
+                               if (!hsplit_pipe) {
+                                       DC_FP_START();
+                                       dcn20_fpu_adjust_dppclk(&context->bw_ctx.dml.vba, vlevel, context->bw_ctx.dml.vba.maxMpcComb, pipe_idx, true);
+                                       DC_FP_END();
+                                       continue;
+                               }
+                               if (context->bw_ctx.dml.vba.ODMCombineEnabled[pipe_idx]) {
+                                       if (!dcn20_split_stream_for_odm(
+                                                       dc, &context->res_ctx,
+                                                       pipe, hsplit_pipe))
+                                               goto validate_fail;
+                                       dcn20_build_mapped_resource(dc, context, pipe->stream);
+                               } else {
+                                       dcn20_split_stream_for_mpc(
+                                                       &context->res_ctx, dc->res_pool,
+                                                       pipe, hsplit_pipe);
+                                       resource_build_scaling_params(pipe);
+                                       resource_build_scaling_params(hsplit_pipe);
+                               }
+                               pipe_split_from[hsplit_pipe->pipe_idx] = pipe_idx;
+                       }
+               } else if (hsplit_pipe && hsplit_pipe->plane_state == pipe->plane_state) {
+                       /* merge should already have been done */
+                       ASSERT(0);
+               }
+       }
+       /* Actual dsc count per stream dsc validation*/
+       if (!dcn20_validate_dsc(dc, context)) {
+               context->bw_ctx.dml.vba.ValidationStatus[context->bw_ctx.dml.vba.soc.num_states] =
+                               DML_FAIL_DSC_VALIDATION_FAILURE;
+               goto validate_fail;
+       }
+
+       *vlevel_out = vlevel;
+
+       out = true;
+       goto validate_out;
+
+validate_fail:
+       out = false;
+
+validate_out:
+       return out;
+}
+
+/*
+ * Some of the functions further below use the FPU, so we need to wrap this
+ * with DC_FP_START()/DC_FP_END(). Use the same approach as for
+ * dcn20_validate_bandwidth in dcn20_resource.c.
+ */
+static bool dcn21_validate_bandwidth(struct dc *dc, struct dc_state *context,
+               bool fast_validate)
+{
+       bool voltage_supported;
+       display_e2e_pipe_params_st *pipes;
+
+       pipes = kcalloc(dc->res_pool->pipe_count, sizeof(display_e2e_pipe_params_st), GFP_KERNEL);
+       if (!pipes)
+               return false;
+
+       DC_FP_START();
+       voltage_supported = dcn21_validate_bandwidth_fp(dc, context, fast_validate, pipes);
+       DC_FP_END();
+
+       kfree(pipes);
+       return voltage_supported;
+}
+
+static void dcn21_destroy_resource_pool(struct resource_pool **pool)
+{
+       struct dcn21_resource_pool *dcn21_pool = TO_DCN21_RES_POOL(*pool);
+
+       dcn21_resource_destruct(dcn21_pool);
+       kfree(dcn21_pool);
+       *pool = NULL;
+}
+
+static struct clock_source *dcn21_clock_source_create(
+               struct dc_context *ctx,
+               struct dc_bios *bios,
+               enum clock_source_id id,
+               const struct dce110_clk_src_regs *regs,
+               bool dp_clk_src)
+{
+       struct dce110_clk_src *clk_src =
+               kzalloc(sizeof(struct dce110_clk_src), GFP_KERNEL);
+
+       if (!clk_src)
+               return NULL;
+
+       if (dcn20_clk_src_construct(clk_src, ctx, bios, id,
+                       regs, &cs_shift, &cs_mask)) {
+               clk_src->base.dp_clk_src = dp_clk_src;
+               return &clk_src->base;
+       }
+
+       kfree(clk_src);
+       BREAK_TO_DEBUGGER();
+       return NULL;
+}
+
+static struct hubp *dcn21_hubp_create(
+       struct dc_context *ctx,
+       uint32_t inst)
+{
+       struct dcn21_hubp *hubp21 =
+               kzalloc(sizeof(struct dcn21_hubp), GFP_KERNEL);
+
+       if (!hubp21)
+               return NULL;
+
+       if (hubp21_construct(hubp21, ctx, inst,
+                       &hubp_regs[inst], &hubp_shift, &hubp_mask))
+               return &hubp21->base;
+
+       BREAK_TO_DEBUGGER();
+       kfree(hubp21);
+       return NULL;
+}
+
+static struct hubbub *dcn21_hubbub_create(struct dc_context *ctx)
+{
+       int i;
+
+       struct dcn20_hubbub *hubbub = kzalloc(sizeof(struct dcn20_hubbub),
+                                         GFP_KERNEL);
+
+       if (!hubbub)
+               return NULL;
+
+       hubbub21_construct(hubbub, ctx,
+                       &hubbub_reg,
+                       &hubbub_shift,
+                       &hubbub_mask);
+
+       for (i = 0; i < res_cap_rn.num_vmid; i++) {
+               struct dcn20_vmid *vmid = &hubbub->vmid[i];
+
+               vmid->ctx = ctx;
+
+               vmid->regs = &vmid_regs[i];
+               vmid->shifts = &vmid_shifts;
+               vmid->masks = &vmid_masks;
+       }
+       hubbub->num_vmid = res_cap_rn.num_vmid;
+
+       return &hubbub->base;
+}
+
+static struct output_pixel_processor *dcn21_opp_create(struct dc_context *ctx,
+                                                      uint32_t inst)
+{
+       struct dcn20_opp *opp =
+               kzalloc(sizeof(struct dcn20_opp), GFP_KERNEL);
+
+       if (!opp) {
+               BREAK_TO_DEBUGGER();
+               return NULL;
+       }
+
+       dcn20_opp_construct(opp, ctx, inst,
+                       &opp_regs[inst], &opp_shift, &opp_mask);
+       return &opp->base;
+}
+
+static struct timing_generator *dcn21_timing_generator_create(struct dc_context *ctx,
+                                                             uint32_t instance)
+{
+       struct optc *tgn10 =
+               kzalloc(sizeof(struct optc), GFP_KERNEL);
+
+       if (!tgn10)
+               return NULL;
+
+       tgn10->base.inst = instance;
+       tgn10->base.ctx = ctx;
+
+       tgn10->tg_regs = &tg_regs[instance];
+       tgn10->tg_shift = &tg_shift;
+       tgn10->tg_mask = &tg_mask;
+
+       dcn20_timing_generator_init(tgn10);
+
+       return &tgn10->base;
+}
+
+static struct mpc *dcn21_mpc_create(struct dc_context *ctx)
+{
+       struct dcn20_mpc *mpc20 = kzalloc(sizeof(struct dcn20_mpc),
+                                         GFP_KERNEL);
+
+       if (!mpc20)
+               return NULL;
+
+       dcn20_mpc_construct(mpc20, ctx,
+                       &mpc_regs,
+                       &mpc_shift,
+                       &mpc_mask,
+                       6);
+
+       return &mpc20->base;
+}
+
+static void read_dce_straps(
+       struct dc_context *ctx,
+       struct resource_straps *straps)
+{
+       generic_reg_get(ctx, mmDC_PINSTRAPS + BASE(mmDC_PINSTRAPS_BASE_IDX),
+               FN(DC_PINSTRAPS, DC_PINSTRAPS_AUDIO), &straps->dc_pinstraps_audio);
+
+}
+
+
+static struct display_stream_compressor *dcn21_dsc_create(struct dc_context *ctx,
+                                                         uint32_t inst)
+{
+       struct dcn20_dsc *dsc =
+               kzalloc(sizeof(struct dcn20_dsc), GFP_KERNEL);
+
+       if (!dsc) {
+               BREAK_TO_DEBUGGER();
+               return NULL;
+       }
+
+       dsc2_construct(dsc, ctx, inst, &dsc_regs[inst], &dsc_shift, &dsc_mask);
+       return &dsc->base;
+}
+
+static struct pp_smu_funcs *dcn21_pp_smu_create(struct dc_context *ctx)
+{
+       struct pp_smu_funcs *pp_smu = kzalloc(sizeof(*pp_smu), GFP_KERNEL);
+
+       if (!pp_smu)
+               return pp_smu;
+
+       dm_pp_get_funcs(ctx, pp_smu);
+
+       if (pp_smu->ctx.ver != PP_SMU_VER_RN)
+               pp_smu = memset(pp_smu, 0, sizeof(struct pp_smu_funcs));
+
+
+       return pp_smu;
+}
+
+static void dcn21_pp_smu_destroy(struct pp_smu_funcs **pp_smu)
+{
+       if (pp_smu && *pp_smu) {
+               kfree(*pp_smu);
+               *pp_smu = NULL;
+       }
+}
+
+static struct audio *dcn21_create_audio(
+               struct dc_context *ctx, unsigned int inst)
+{
+       return dce_audio_create(ctx, inst,
+                       &audio_regs[inst], &audio_shift, &audio_mask);
+}
+
+static struct dc_cap_funcs cap_funcs = {
+       .get_dcc_compression_cap = dcn20_get_dcc_compression_cap
+};
+
+static struct stream_encoder *dcn21_stream_encoder_create(enum engine_id eng_id,
+                                                         struct dc_context *ctx)
+{
+       struct dcn10_stream_encoder *enc1 =
+               kzalloc(sizeof(struct dcn10_stream_encoder), GFP_KERNEL);
+
+       if (!enc1)
+               return NULL;
+
+       dcn20_stream_encoder_construct(enc1, ctx, ctx->dc_bios, eng_id,
+                                       &stream_enc_regs[eng_id],
+                                       &se_shift, &se_mask);
+
+       return &enc1->base;
+}
+
+static const struct dce_hwseq_registers hwseq_reg = {
+               HWSEQ_DCN21_REG_LIST()
+};
+
+static const struct dce_hwseq_shift hwseq_shift = {
+               HWSEQ_DCN21_MASK_SH_LIST(__SHIFT)
+};
+
+static const struct dce_hwseq_mask hwseq_mask = {
+               HWSEQ_DCN21_MASK_SH_LIST(_MASK)
+};
+
+static struct dce_hwseq *dcn21_hwseq_create(
+       struct dc_context *ctx)
+{
+       struct dce_hwseq *hws = kzalloc(sizeof(struct dce_hwseq), GFP_KERNEL);
+
+       if (hws) {
+               hws->ctx = ctx;
+               hws->regs = &hwseq_reg;
+               hws->shifts = &hwseq_shift;
+               hws->masks = &hwseq_mask;
+               hws->wa.DEGVIDCN21 = true;
+               hws->wa.disallow_self_refresh_during_multi_plane_transition = true;
+       }
+       return hws;
+}
+
+static const struct resource_create_funcs res_create_funcs = {
+       .read_dce_straps = read_dce_straps,
+       .create_audio = dcn21_create_audio,
+       .create_stream_encoder = dcn21_stream_encoder_create,
+       .create_hwseq = dcn21_hwseq_create,
+};
+
+static const struct encoder_feature_support link_enc_feature = {
+               .max_hdmi_deep_color = COLOR_DEPTH_121212,
+               .max_hdmi_pixel_clock = 600000,
+               .hdmi_ycbcr420_supported = true,
+               .dp_ycbcr420_supported = true,
+               .fec_supported = true,
+               .flags.bits.IS_HBR2_CAPABLE = true,
+               .flags.bits.IS_HBR3_CAPABLE = true,
+               .flags.bits.IS_TPS3_CAPABLE = true,
+               .flags.bits.IS_TPS4_CAPABLE = true
+};
+
+
+#define link_regs(id, phyid)\
+[id] = {\
+       LE_DCN2_REG_LIST(id), \
+       UNIPHY_DCN2_REG_LIST(phyid), \
+       DPCS_DCN21_REG_LIST(id), \
+       SRI(DP_DPHY_INTERNAL_CTRL, DP, id) \
+}
+
+static const struct dcn10_link_enc_registers link_enc_regs[] = {
+       link_regs(0, A),
+       link_regs(1, B),
+       link_regs(2, C),
+       link_regs(3, D),
+       link_regs(4, E),
+};
+
+static const struct dce_panel_cntl_registers panel_cntl_regs[] = {
+       { DCN_PANEL_CNTL_REG_LIST() }
+};
+
+static const struct dce_panel_cntl_shift panel_cntl_shift = {
+       DCE_PANEL_CNTL_MASK_SH_LIST(__SHIFT)
+};
+
+static const struct dce_panel_cntl_mask panel_cntl_mask = {
+       DCE_PANEL_CNTL_MASK_SH_LIST(_MASK)
+};
+
+#define aux_regs(id)\
+[id] = {\
+       DCN2_AUX_REG_LIST(id)\
+}
+
+static const struct dcn10_link_enc_aux_registers link_enc_aux_regs[] = {
+               aux_regs(0),
+               aux_regs(1),
+               aux_regs(2),
+               aux_regs(3),
+               aux_regs(4)
+};
+
+#define hpd_regs(id)\
+[id] = {\
+       HPD_REG_LIST(id)\
+}
+
+static const struct dcn10_link_enc_hpd_registers link_enc_hpd_regs[] = {
+               hpd_regs(0),
+               hpd_regs(1),
+               hpd_regs(2),
+               hpd_regs(3),
+               hpd_regs(4)
+};
+
+static const struct dcn10_link_enc_shift le_shift = {
+       LINK_ENCODER_MASK_SH_LIST_DCN20(__SHIFT),\
+       DPCS_DCN21_MASK_SH_LIST(__SHIFT)
+};
+
+static const struct dcn10_link_enc_mask le_mask = {
+       LINK_ENCODER_MASK_SH_LIST_DCN20(_MASK),\
+       DPCS_DCN21_MASK_SH_LIST(_MASK)
+};
+
+static int map_transmitter_id_to_phy_instance(
+       enum transmitter transmitter)
+{
+       switch (transmitter) {
+       case TRANSMITTER_UNIPHY_A:
+               return 0;
+       break;
+       case TRANSMITTER_UNIPHY_B:
+               return 1;
+       break;
+       case TRANSMITTER_UNIPHY_C:
+               return 2;
+       break;
+       case TRANSMITTER_UNIPHY_D:
+               return 3;
+       break;
+       case TRANSMITTER_UNIPHY_E:
+               return 4;
+       break;
+       default:
+               ASSERT(0);
+               return 0;
+       }
+}
+
+static struct link_encoder *dcn21_link_encoder_create(
+       struct dc_context *ctx,
+       const struct encoder_init_data *enc_init_data)
+{
+       struct dcn21_link_encoder *enc21 =
+               kzalloc(sizeof(struct dcn21_link_encoder), GFP_KERNEL);
+       int link_regs_id;
+
+       if (!enc21)
+               return NULL;
+
+       link_regs_id =
+               map_transmitter_id_to_phy_instance(enc_init_data->transmitter);
+
+       dcn21_link_encoder_construct(enc21,
+                                     enc_init_data,
+                                     &link_enc_feature,
+                                     &link_enc_regs[link_regs_id],
+                                     &link_enc_aux_regs[enc_init_data->channel - 1],
+                                     &link_enc_hpd_regs[enc_init_data->hpd_source],
+                                     &le_shift,
+                                     &le_mask);
+
+       return &enc21->enc10.base;
+}
+
+static struct panel_cntl *dcn21_panel_cntl_create(const struct panel_cntl_init_data *init_data)
+{
+       struct dce_panel_cntl *panel_cntl =
+               kzalloc(sizeof(struct dce_panel_cntl), GFP_KERNEL);
+
+       if (!panel_cntl)
+               return NULL;
+
+       dce_panel_cntl_construct(panel_cntl,
+                       init_data,
+                       &panel_cntl_regs[init_data->inst],
+                       &panel_cntl_shift,
+                       &panel_cntl_mask);
+
+       return &panel_cntl->base;
+}
+
+static void dcn21_get_panel_config_defaults(struct dc_panel_config *panel_config)
+{
+       *panel_config = panel_config_defaults;
+}
+
+#define CTX ctx
+
+#define REG(reg_name) \
+       (DCN_BASE.instance[0].segment[mm ## reg_name ## _BASE_IDX] + mm ## reg_name)
+
+static uint32_t read_pipe_fuses(struct dc_context *ctx)
+{
+       uint32_t value = REG_READ(CC_DC_PIPE_DIS);
+       /* RV1 support max 4 pipes */
+       value = value & 0xf;
+       return value;
+}
+
+static enum dc_status dcn21_patch_unknown_plane_state(struct dc_plane_state *plane_state)
+{
+       if (plane_state->ctx->dc->debug.disable_dcc == DCC_ENABLE) {
+               plane_state->dcc.enable = 1;
+               /* align to our worst case block width */
+               plane_state->dcc.meta_pitch = ((plane_state->src_rect.width + 1023) / 1024) * 1024;
+       }
+
+       return dcn20_patch_unknown_plane_state(plane_state);
+}
+
+static const struct resource_funcs dcn21_res_pool_funcs = {
+       .destroy = dcn21_destroy_resource_pool,
+       .link_enc_create = dcn21_link_encoder_create,
+       .panel_cntl_create = dcn21_panel_cntl_create,
+       .validate_bandwidth = dcn21_validate_bandwidth,
+       .populate_dml_pipes = dcn21_populate_dml_pipes_from_context,
+       .add_stream_to_ctx = dcn20_add_stream_to_ctx,
+       .add_dsc_to_stream_resource = dcn20_add_dsc_to_stream_resource,
+       .remove_stream_from_ctx = dcn20_remove_stream_from_ctx,
+       .acquire_free_pipe_as_secondary_dpp_pipe = dcn20_acquire_free_pipe_for_layer,
+       .release_pipe = dcn20_release_pipe,
+       .populate_dml_writeback_from_context = dcn20_populate_dml_writeback_from_context,
+       .patch_unknown_plane_state = dcn21_patch_unknown_plane_state,
+       .set_mcif_arb_params = dcn20_set_mcif_arb_params,
+       .find_first_free_match_stream_enc_for_link = dcn10_find_first_free_match_stream_enc_for_link,
+       .update_bw_bounding_box = dcn21_update_bw_bounding_box,
+       .get_panel_config_defaults = dcn21_get_panel_config_defaults,
+};
+
+static bool dcn21_resource_construct(
+       uint8_t num_virtual_links,
+       struct dc *dc,
+       struct dcn21_resource_pool *pool)
+{
+       int i, j;
+       struct dc_context *ctx = dc->ctx;
+       struct irq_service_init_data init_data;
+       uint32_t pipe_fuses = read_pipe_fuses(ctx);
+       uint32_t num_pipes;
+
+       ctx->dc_bios->regs = &bios_regs;
+
+       pool->base.res_cap = &res_cap_rn;
+#ifdef DIAGS_BUILD
+       if (IS_FPGA_MAXIMUS_DC(dc->ctx->dce_environment))
+               //pool->base.res_cap = &res_cap_nv10_FPGA_2pipe_dsc;
+               pool->base.res_cap = &res_cap_rn_FPGA_4pipe;
+#endif
+
+       pool->base.funcs = &dcn21_res_pool_funcs;
+
+       /*************************************************
+        *  Resource + asic cap harcoding                *
+        *************************************************/
+       pool->base.underlay_pipe_index = NO_UNDERLAY_PIPE;
+
+       /* max pipe num for ASIC before check pipe fuses */
+       pool->base.pipe_count = pool->base.res_cap->num_timing_generator;
+
+       dc->caps.max_downscale_ratio = 200;
+       dc->caps.i2c_speed_in_khz = 100;
+       dc->caps.i2c_speed_in_khz_hdcp = 5; /*1.4 w/a applied by default*/
+       dc->caps.max_cursor_size = 256;
+       dc->caps.min_horizontal_blanking_period = 80;
+       dc->caps.dmdata_alloc_size = 2048;
+
+       dc->caps.max_slave_planes = 1;
+       dc->caps.max_slave_yuv_planes = 1;
+       dc->caps.max_slave_rgb_planes = 1;
+       dc->caps.post_blend_color_processing = true;
+       dc->caps.force_dp_tps4_for_cp2520 = true;
+       dc->caps.extended_aux_timeout_support = true;
+       dc->caps.dmcub_support = true;
+       dc->caps.is_apu = true;
+
+       /* Color pipeline capabilities */
+       dc->caps.color.dpp.dcn_arch = 1;
+       dc->caps.color.dpp.input_lut_shared = 0;
+       dc->caps.color.dpp.icsc = 1;
+       dc->caps.color.dpp.dgam_ram = 1;
+       dc->caps.color.dpp.dgam_rom_caps.srgb = 1;
+       dc->caps.color.dpp.dgam_rom_caps.bt2020 = 1;
+       dc->caps.color.dpp.dgam_rom_caps.gamma2_2 = 0;
+       dc->caps.color.dpp.dgam_rom_caps.pq = 0;
+       dc->caps.color.dpp.dgam_rom_caps.hlg = 0;
+       dc->caps.color.dpp.post_csc = 0;
+       dc->caps.color.dpp.gamma_corr = 0;
+       dc->caps.color.dpp.dgam_rom_for_yuv = 1;
+
+       dc->caps.color.dpp.hw_3d_lut = 1;
+       dc->caps.color.dpp.ogam_ram = 1;
+       // no OGAM ROM on DCN2
+       dc->caps.color.dpp.ogam_rom_caps.srgb = 0;
+       dc->caps.color.dpp.ogam_rom_caps.bt2020 = 0;
+       dc->caps.color.dpp.ogam_rom_caps.gamma2_2 = 0;
+       dc->caps.color.dpp.ogam_rom_caps.pq = 0;
+       dc->caps.color.dpp.ogam_rom_caps.hlg = 0;
+       dc->caps.color.dpp.ocsc = 0;
+
+       dc->caps.color.mpc.gamut_remap = 0;
+       dc->caps.color.mpc.num_3dluts = 0;
+       dc->caps.color.mpc.shared_3d_lut = 0;
+       dc->caps.color.mpc.ogam_ram = 1;
+       dc->caps.color.mpc.ogam_rom_caps.srgb = 0;
+       dc->caps.color.mpc.ogam_rom_caps.bt2020 = 0;
+       dc->caps.color.mpc.ogam_rom_caps.gamma2_2 = 0;
+       dc->caps.color.mpc.ogam_rom_caps.pq = 0;
+       dc->caps.color.mpc.ogam_rom_caps.hlg = 0;
+       dc->caps.color.mpc.ocsc = 1;
+
+       dc->caps.dp_hdmi21_pcon_support = true;
+
+       if (dc->ctx->dce_environment == DCE_ENV_PRODUCTION_DRV)
+               dc->debug = debug_defaults_drv;
+
+       // Init the vm_helper
+       if (dc->vm_helper)
+               vm_helper_init(dc->vm_helper, 16);
+
+       /*************************************************
+        *  Create resources                             *
+        *************************************************/
+
+       pool->base.clock_sources[DCN20_CLK_SRC_PLL0] =
+                       dcn21_clock_source_create(ctx, ctx->dc_bios,
+                               CLOCK_SOURCE_COMBO_PHY_PLL0,
+                               &clk_src_regs[0], false);
+       pool->base.clock_sources[DCN20_CLK_SRC_PLL1] =
+                       dcn21_clock_source_create(ctx, ctx->dc_bios,
+                               CLOCK_SOURCE_COMBO_PHY_PLL1,
+                               &clk_src_regs[1], false);
+       pool->base.clock_sources[DCN20_CLK_SRC_PLL2] =
+                       dcn21_clock_source_create(ctx, ctx->dc_bios,
+                               CLOCK_SOURCE_COMBO_PHY_PLL2,
+                               &clk_src_regs[2], false);
+       pool->base.clock_sources[DCN20_CLK_SRC_PLL3] =
+                       dcn21_clock_source_create(ctx, ctx->dc_bios,
+                               CLOCK_SOURCE_COMBO_PHY_PLL3,
+                               &clk_src_regs[3], false);
+       pool->base.clock_sources[DCN20_CLK_SRC_PLL4] =
+                       dcn21_clock_source_create(ctx, ctx->dc_bios,
+                               CLOCK_SOURCE_COMBO_PHY_PLL4,
+                               &clk_src_regs[4], false);
+
+       pool->base.clk_src_count = DCN20_CLK_SRC_TOTAL_DCN21;
+
+       /* todo: not reuse phy_pll registers */
+       pool->base.dp_clock_source =
+                       dcn21_clock_source_create(ctx, ctx->dc_bios,
+                               CLOCK_SOURCE_ID_DP_DTO,
+                               &clk_src_regs[0], true);
+
+       for (i = 0; i < pool->base.clk_src_count; i++) {
+               if (pool->base.clock_sources[i] == NULL) {
+                       dm_error("DC: failed to create clock sources!\n");
+                       BREAK_TO_DEBUGGER();
+                       goto create_fail;
+               }
+       }
+
+       pool->base.dccg = dccg21_create(ctx, &dccg_regs, &dccg_shift, &dccg_mask);
+       if (pool->base.dccg == NULL) {
+               dm_error("DC: failed to create dccg!\n");
+               BREAK_TO_DEBUGGER();
+               goto create_fail;
+       }
+
+       if (!dc->config.disable_dmcu) {
+               pool->base.dmcu = dcn21_dmcu_create(ctx,
+                               &dmcu_regs,
+                               &dmcu_shift,
+                               &dmcu_mask);
+               if (pool->base.dmcu == NULL) {
+                       dm_error("DC: failed to create dmcu!\n");
+                       BREAK_TO_DEBUGGER();
+                       goto create_fail;
+               }
+
+               dc->debug.dmub_command_table = false;
+       }
+
+       if (dc->config.disable_dmcu) {
+               pool->base.psr = dmub_psr_create(ctx);
+
+               if (pool->base.psr == NULL) {
+                       dm_error("DC: failed to create psr obj!\n");
+                       BREAK_TO_DEBUGGER();
+                       goto create_fail;
+               }
+       }
+
+       if (dc->config.disable_dmcu)
+               pool->base.abm = dmub_abm_create(ctx,
+                       &abm_regs,
+                       &abm_shift,
+                       &abm_mask);
+       else
+               pool->base.abm = dce_abm_create(ctx,
+                       &abm_regs,
+                       &abm_shift,
+                       &abm_mask);
+
+       pool->base.pp_smu = dcn21_pp_smu_create(ctx);
+
+       num_pipes = dcn2_1_ip.max_num_dpp;
+
+       for (i = 0; i < dcn2_1_ip.max_num_dpp; i++)
+               if (pipe_fuses & 1 << i)
+                       num_pipes--;
+       dcn2_1_ip.max_num_dpp = num_pipes;
+       dcn2_1_ip.max_num_otg = num_pipes;
+
+       dml_init_instance(&dc->dml, &dcn2_1_soc, &dcn2_1_ip, DML_PROJECT_DCN21);
+
+       init_data.ctx = dc->ctx;
+       pool->base.irqs = dal_irq_service_dcn21_create(&init_data);
+       if (!pool->base.irqs)
+               goto create_fail;
+
+       j = 0;
+       /* mem input -> ipp -> dpp -> opp -> TG */
+       for (i = 0; i < pool->base.pipe_count; i++) {
+               /* if pipe is disabled, skip instance of HW pipe,
+                * i.e, skip ASIC register instance
+                */
+               if ((pipe_fuses & (1 << i)) != 0)
+                       continue;
+
+               pool->base.hubps[j] = dcn21_hubp_create(ctx, i);
+               if (pool->base.hubps[j] == NULL) {
+                       BREAK_TO_DEBUGGER();
+                       dm_error(
+                               "DC: failed to create memory input!\n");
+                       goto create_fail;
+               }
+
+               pool->base.ipps[j] = dcn21_ipp_create(ctx, i);
+               if (pool->base.ipps[j] == NULL) {
+                       BREAK_TO_DEBUGGER();
+                       dm_error(
+                               "DC: failed to create input pixel processor!\n");
+                       goto create_fail;
+               }
+
+               pool->base.dpps[j] = dcn21_dpp_create(ctx, i);
+               if (pool->base.dpps[j] == NULL) {
+                       BREAK_TO_DEBUGGER();
+                       dm_error(
+                               "DC: failed to create dpps!\n");
+                       goto create_fail;
+               }
+
+               pool->base.opps[j] = dcn21_opp_create(ctx, i);
+               if (pool->base.opps[j] == NULL) {
+                       BREAK_TO_DEBUGGER();
+                       dm_error(
+                               "DC: failed to create output pixel processor!\n");
+                       goto create_fail;
+               }
+
+               pool->base.timing_generators[j] = dcn21_timing_generator_create(
+                               ctx, i);
+               if (pool->base.timing_generators[j] == NULL) {
+                       BREAK_TO_DEBUGGER();
+                       dm_error("DC: failed to create tg!\n");
+                       goto create_fail;
+               }
+               j++;
+       }
+
+       for (i = 0; i < pool->base.res_cap->num_ddc; i++) {
+               pool->base.engines[i] = dcn21_aux_engine_create(ctx, i);
+               if (pool->base.engines[i] == NULL) {
+                       BREAK_TO_DEBUGGER();
+                       dm_error(
+                               "DC:failed to create aux engine!!\n");
+                       goto create_fail;
+               }
+               pool->base.hw_i2cs[i] = dcn21_i2c_hw_create(ctx, i);
+               if (pool->base.hw_i2cs[i] == NULL) {
+                       BREAK_TO_DEBUGGER();
+                       dm_error(
+                               "DC:failed to create hw i2c!!\n");
+                       goto create_fail;
+               }
+               pool->base.sw_i2cs[i] = NULL;
+       }
+
+       pool->base.timing_generator_count = j;
+       pool->base.pipe_count = j;
+       pool->base.mpcc_count = j;
+
+       pool->base.mpc = dcn21_mpc_create(ctx);
+       if (pool->base.mpc == NULL) {
+               BREAK_TO_DEBUGGER();
+               dm_error("DC: failed to create mpc!\n");
+               goto create_fail;
+       }
+
+       pool->base.hubbub = dcn21_hubbub_create(ctx);
+       if (pool->base.hubbub == NULL) {
+               BREAK_TO_DEBUGGER();
+               dm_error("DC: failed to create hubbub!\n");
+               goto create_fail;
+       }
+
+       for (i = 0; i < pool->base.res_cap->num_dsc; i++) {
+               pool->base.dscs[i] = dcn21_dsc_create(ctx, i);
+               if (pool->base.dscs[i] == NULL) {
+                       BREAK_TO_DEBUGGER();
+                       dm_error("DC: failed to create display stream compressor %d!\n", i);
+                       goto create_fail;
+               }
+       }
+
+       if (!dcn20_dwbc_create(ctx, &pool->base)) {
+               BREAK_TO_DEBUGGER();
+               dm_error("DC: failed to create dwbc!\n");
+               goto create_fail;
+       }
+       if (!dcn20_mmhubbub_create(ctx, &pool->base)) {
+               BREAK_TO_DEBUGGER();
+               dm_error("DC: failed to create mcif_wb!\n");
+               goto create_fail;
+       }
+
+       if (!resource_construct(num_virtual_links, dc, &pool->base,
+                       &res_create_funcs))
+               goto create_fail;
+
+       dcn21_hw_sequencer_construct(dc);
+
+       dc->caps.max_planes =  pool->base.pipe_count;
+
+       for (i = 0; i < dc->caps.max_planes; ++i)
+               dc->caps.planes[i] = plane_cap;
+
+       dc->cap_funcs = cap_funcs;
+
+       return true;
+
+create_fail:
+
+       dcn21_resource_destruct(pool);
+
+       return false;
+}
+
+struct resource_pool *dcn21_create_resource_pool(
+               const struct dc_init_data *init_data,
+               struct dc *dc)
+{
+       struct dcn21_resource_pool *pool =
+               kzalloc(sizeof(struct dcn21_resource_pool), GFP_KERNEL);
+
+       if (!pool)
+               return NULL;
+
+       if (dcn21_resource_construct(init_data->num_virtual_links, dc, pool))
+               return &pool->base;
+
+       BREAK_TO_DEBUGGER();
+       kfree(pool);
+       return NULL;
+}
diff --git a/drivers/gpu/drm/amd/display/dc/resource/dcn21/dcn21_resource.h b/drivers/gpu/drm/amd/display/dc/resource/dcn21/dcn21_resource.h
new file mode 100644 (file)
index 0000000..f7ecc00
--- /dev/null
@@ -0,0 +1,56 @@
+/*
+ * Copyright 2018 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 _DCN21_RESOURCE_H_
+#define _DCN21_RESOURCE_H_
+
+#include "core_types.h"
+
+#define TO_DCN21_RES_POOL(pool)\
+       container_of(pool, struct dcn21_resource_pool, base)
+
+struct dc;
+struct resource_pool;
+struct _vcs_dpi_display_pipe_params_st;
+
+extern struct _vcs_dpi_ip_params_st dcn2_1_ip;
+extern struct _vcs_dpi_soc_bounding_box_st dcn2_1_soc;
+
+struct dcn21_resource_pool {
+       struct resource_pool base;
+};
+struct resource_pool *dcn21_create_resource_pool(
+               const struct dc_init_data *init_data,
+               struct dc *dc);
+bool dcn21_fast_validate_bw(
+               struct dc *dc,
+               struct dc_state *context,
+               display_e2e_pipe_params_st *pipes,
+               int *pipe_cnt_out,
+               int *pipe_split_from,
+               int *vlevel_out,
+               bool fast_validate);
+
+#endif /* _DCN21_RESOURCE_H_ */
diff --git a/drivers/gpu/drm/amd/display/dc/resource/dcn30/dcn30_resource.c b/drivers/gpu/drm/amd/display/dc/resource/dcn30/dcn30_resource.c
new file mode 100644 (file)
index 0000000..2b6dcb4
--- /dev/null
@@ -0,0 +1,2611 @@
+/*
+ * 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
+ *
+ */
+
+
+#include "dm_services.h"
+#include "dc.h"
+
+#include "dcn30/dcn30_init.h"
+
+#include "resource.h"
+#include "include/irq_service_interface.h"
+#include "dcn20/dcn20_resource.h"
+
+#include "dcn30_resource.h"
+
+#include "dcn10/dcn10_ipp.h"
+#include "dcn30/dcn30_hubbub.h"
+#include "dcn30/dcn30_mpc.h"
+#include "dcn30/dcn30_hubp.h"
+#include "irq/dcn30/irq_service_dcn30.h"
+#include "dcn30/dcn30_dpp.h"
+#include "dcn30/dcn30_optc.h"
+#include "dcn20/dcn20_hwseq.h"
+#include "dcn30/dcn30_hwseq.h"
+#include "dce110/dce110_hwseq.h"
+#include "dcn30/dcn30_opp.h"
+#include "dcn20/dcn20_dsc.h"
+#include "dcn30/dcn30_vpg.h"
+#include "dcn30/dcn30_afmt.h"
+#include "dcn30/dcn30_dio_stream_encoder.h"
+#include "dcn30/dcn30_dio_link_encoder.h"
+#include "dce/dce_clock_source.h"
+#include "dce/dce_audio.h"
+#include "dce/dce_hwseq.h"
+#include "clk_mgr.h"
+#include "virtual/virtual_stream_encoder.h"
+#include "dce110/dce110_resource.h"
+#include "dml/display_mode_vba.h"
+#include "dcn30/dcn30_dccg.h"
+#include "dcn10/dcn10_resource.h"
+#include "link.h"
+#include "dce/dce_panel_cntl.h"
+
+#include "dcn30/dcn30_dwb.h"
+#include "dcn30/dcn30_mmhubbub.h"
+
+#include "sienna_cichlid_ip_offset.h"
+#include "dcn/dcn_3_0_0_offset.h"
+#include "dcn/dcn_3_0_0_sh_mask.h"
+
+#include "nbio/nbio_7_4_offset.h"
+
+#include "dpcs/dpcs_3_0_0_offset.h"
+#include "dpcs/dpcs_3_0_0_sh_mask.h"
+
+#include "mmhub/mmhub_2_0_0_offset.h"
+#include "mmhub/mmhub_2_0_0_sh_mask.h"
+
+#include "reg_helper.h"
+#include "dce/dmub_abm.h"
+#include "dce/dmub_psr.h"
+#include "dce/dce_aux.h"
+#include "dce/dce_i2c.h"
+
+#include "dml/dcn30/dcn30_fpu.h"
+#include "dml/dcn30/display_mode_vba_30.h"
+#include "vm_helper.h"
+#include "dcn20/dcn20_vmid.h"
+#include "amdgpu_socbb.h"
+#include "dc_dmub_srv.h"
+
+#define DC_LOGGER \
+       dc->ctx->logger
+#define DC_LOGGER_INIT(logger)
+
+enum dcn30_clk_src_array_id {
+       DCN30_CLK_SRC_PLL0,
+       DCN30_CLK_SRC_PLL1,
+       DCN30_CLK_SRC_PLL2,
+       DCN30_CLK_SRC_PLL3,
+       DCN30_CLK_SRC_PLL4,
+       DCN30_CLK_SRC_PLL5,
+       DCN30_CLK_SRC_TOTAL
+};
+
+/* begin *********************
+ * macros to expend register list macro defined in HW object header file
+ */
+
+/* DCN */
+#define BASE_INNER(seg) DCN_BASE__INST0_SEG ## seg
+
+#define BASE(seg) BASE_INNER(seg)
+
+#define SR(reg_name)\
+               .reg_name = BASE(mm ## reg_name ## _BASE_IDX) +  \
+                                       mm ## reg_name
+
+#define SRI(reg_name, block, id)\
+       .reg_name = BASE(mm ## block ## id ## _ ## reg_name ## _BASE_IDX) + \
+                                       mm ## block ## id ## _ ## reg_name
+
+#define SRI2(reg_name, block, id)\
+       .reg_name = BASE(mm ## reg_name ## _BASE_IDX) + \
+                                       mm ## reg_name
+
+#define SRIR(var_name, reg_name, block, id)\
+       .var_name = BASE(mm ## block ## id ## _ ## reg_name ## _BASE_IDX) + \
+                                       mm ## block ## id ## _ ## reg_name
+
+#define SRII(reg_name, block, id)\
+       .reg_name[id] = BASE(mm ## block ## id ## _ ## reg_name ## _BASE_IDX) + \
+                                       mm ## block ## id ## _ ## reg_name
+
+#define SRII_MPC_RMU(reg_name, block, id)\
+       .RMU##_##reg_name[id] = BASE(mm ## block ## id ## _ ## reg_name ## _BASE_IDX) + \
+                                       mm ## block ## id ## _ ## reg_name
+
+#define SRII_DWB(reg_name, temp_name, block, id)\
+       .reg_name[id] = BASE(mm ## block ## id ## _ ## temp_name ## _BASE_IDX) + \
+                                       mm ## block ## id ## _ ## temp_name
+
+#define SF_DWB2(reg_name, block, id, field_name, post_fix)     \
+       .field_name = reg_name ## __ ## field_name ## post_fix
+
+#define DCCG_SRII(reg_name, block, id)\
+       .block ## _ ## reg_name[id] = BASE(mm ## block ## id ## _ ## reg_name ## _BASE_IDX) + \
+                                       mm ## block ## id ## _ ## reg_name
+
+#define VUPDATE_SRII(reg_name, block, id)\
+       .reg_name[id] = BASE(mm ## reg_name ## _ ## block ## id ## _BASE_IDX) + \
+                                       mm ## reg_name ## _ ## block ## id
+
+/* NBIO */
+#define NBIO_BASE_INNER(seg) \
+       NBIO_BASE__INST0_SEG ## seg
+
+#define NBIO_BASE(seg) \
+       NBIO_BASE_INNER(seg)
+
+#define NBIO_SR(reg_name)\
+               .reg_name = NBIO_BASE(mm ## reg_name ## _BASE_IDX) + \
+                                       mm ## reg_name
+
+/* MMHUB */
+#define MMHUB_BASE_INNER(seg) \
+       MMHUB_BASE__INST0_SEG ## seg
+
+#define MMHUB_BASE(seg) \
+       MMHUB_BASE_INNER(seg)
+
+#define MMHUB_SR(reg_name)\
+               .reg_name = MMHUB_BASE(mmMM ## reg_name ## _BASE_IDX) + \
+                                       mmMM ## reg_name
+
+/* CLOCK */
+#define CLK_BASE_INNER(seg) \
+       CLK_BASE__INST0_SEG ## seg
+
+#define CLK_BASE(seg) \
+       CLK_BASE_INNER(seg)
+
+#define CLK_SRI(reg_name, block, inst)\
+       .reg_name = CLK_BASE(mm ## block ## _ ## inst ## _ ## reg_name ## _BASE_IDX) + \
+                                       mm ## block ## _ ## inst ## _ ## reg_name
+
+
+static const struct bios_registers bios_regs = {
+               NBIO_SR(BIOS_SCRATCH_3),
+               NBIO_SR(BIOS_SCRATCH_6)
+};
+
+#define clk_src_regs(index, pllid)\
+[index] = {\
+       CS_COMMON_REG_LIST_DCN2_0(index, pllid),\
+}
+
+static const struct dce110_clk_src_regs clk_src_regs[] = {
+       clk_src_regs(0, A),
+       clk_src_regs(1, B),
+       clk_src_regs(2, C),
+       clk_src_regs(3, D),
+       clk_src_regs(4, E),
+       clk_src_regs(5, F)
+};
+
+static const struct dce110_clk_src_shift cs_shift = {
+               CS_COMMON_MASK_SH_LIST_DCN2_0(__SHIFT)
+};
+
+static const struct dce110_clk_src_mask cs_mask = {
+               CS_COMMON_MASK_SH_LIST_DCN2_0(_MASK)
+};
+
+#define abm_regs(id)\
+[id] = {\
+               ABM_DCN30_REG_LIST(id)\
+}
+
+static const struct dce_abm_registers abm_regs[] = {
+               abm_regs(0),
+               abm_regs(1),
+               abm_regs(2),
+               abm_regs(3),
+               abm_regs(4),
+               abm_regs(5),
+};
+
+static const struct dce_abm_shift abm_shift = {
+               ABM_MASK_SH_LIST_DCN30(__SHIFT)
+};
+
+static const struct dce_abm_mask abm_mask = {
+               ABM_MASK_SH_LIST_DCN30(_MASK)
+};
+
+
+
+#define audio_regs(id)\
+[id] = {\
+               AUD_COMMON_REG_LIST(id)\
+}
+
+static const struct dce_audio_registers audio_regs[] = {
+       audio_regs(0),
+       audio_regs(1),
+       audio_regs(2),
+       audio_regs(3),
+       audio_regs(4),
+       audio_regs(5),
+       audio_regs(6)
+};
+
+#define DCE120_AUD_COMMON_MASK_SH_LIST(mask_sh)\
+               SF(AZF0ENDPOINT0_AZALIA_F0_CODEC_ENDPOINT_INDEX, AZALIA_ENDPOINT_REG_INDEX, mask_sh),\
+               SF(AZF0ENDPOINT0_AZALIA_F0_CODEC_ENDPOINT_DATA, AZALIA_ENDPOINT_REG_DATA, mask_sh),\
+               AUD_COMMON_MASK_SH_LIST_BASE(mask_sh)
+
+static const struct dce_audio_shift audio_shift = {
+               DCE120_AUD_COMMON_MASK_SH_LIST(__SHIFT)
+};
+
+static const struct dce_audio_mask audio_mask = {
+               DCE120_AUD_COMMON_MASK_SH_LIST(_MASK)
+};
+
+#define vpg_regs(id)\
+[id] = {\
+       VPG_DCN3_REG_LIST(id)\
+}
+
+static const struct dcn30_vpg_registers vpg_regs[] = {
+       vpg_regs(0),
+       vpg_regs(1),
+       vpg_regs(2),
+       vpg_regs(3),
+       vpg_regs(4),
+       vpg_regs(5),
+       vpg_regs(6),
+};
+
+static const struct dcn30_vpg_shift vpg_shift = {
+       DCN3_VPG_MASK_SH_LIST(__SHIFT)
+};
+
+static const struct dcn30_vpg_mask vpg_mask = {
+       DCN3_VPG_MASK_SH_LIST(_MASK)
+};
+
+#define afmt_regs(id)\
+[id] = {\
+       AFMT_DCN3_REG_LIST(id)\
+}
+
+static const struct dcn30_afmt_registers afmt_regs[] = {
+       afmt_regs(0),
+       afmt_regs(1),
+       afmt_regs(2),
+       afmt_regs(3),
+       afmt_regs(4),
+       afmt_regs(5),
+       afmt_regs(6),
+};
+
+static const struct dcn30_afmt_shift afmt_shift = {
+       DCN3_AFMT_MASK_SH_LIST(__SHIFT)
+};
+
+static const struct dcn30_afmt_mask afmt_mask = {
+       DCN3_AFMT_MASK_SH_LIST(_MASK)
+};
+
+#define stream_enc_regs(id)\
+[id] = {\
+       SE_DCN3_REG_LIST(id)\
+}
+
+static const struct dcn10_stream_enc_registers stream_enc_regs[] = {
+       stream_enc_regs(0),
+       stream_enc_regs(1),
+       stream_enc_regs(2),
+       stream_enc_regs(3),
+       stream_enc_regs(4),
+       stream_enc_regs(5)
+};
+
+static const struct dcn10_stream_encoder_shift se_shift = {
+               SE_COMMON_MASK_SH_LIST_DCN30(__SHIFT)
+};
+
+static const struct dcn10_stream_encoder_mask se_mask = {
+               SE_COMMON_MASK_SH_LIST_DCN30(_MASK)
+};
+
+
+#define aux_regs(id)\
+[id] = {\
+       DCN2_AUX_REG_LIST(id)\
+}
+
+static const struct dcn10_link_enc_aux_registers link_enc_aux_regs[] = {
+               aux_regs(0),
+               aux_regs(1),
+               aux_regs(2),
+               aux_regs(3),
+               aux_regs(4),
+               aux_regs(5)
+};
+
+#define hpd_regs(id)\
+[id] = {\
+       HPD_REG_LIST(id)\
+}
+
+static const struct dcn10_link_enc_hpd_registers link_enc_hpd_regs[] = {
+               hpd_regs(0),
+               hpd_regs(1),
+               hpd_regs(2),
+               hpd_regs(3),
+               hpd_regs(4),
+               hpd_regs(5)
+};
+
+#define link_regs(id, phyid)\
+[id] = {\
+       LE_DCN3_REG_LIST(id), \
+       UNIPHY_DCN2_REG_LIST(phyid), \
+       DPCS_DCN2_REG_LIST(id), \
+       SRI(DP_DPHY_INTERNAL_CTRL, DP, id) \
+}
+
+static const struct dce110_aux_registers_shift aux_shift = {
+       DCN_AUX_MASK_SH_LIST(__SHIFT)
+};
+
+static const struct dce110_aux_registers_mask aux_mask = {
+       DCN_AUX_MASK_SH_LIST(_MASK)
+};
+
+static const struct dcn10_link_enc_registers link_enc_regs[] = {
+       link_regs(0, A),
+       link_regs(1, B),
+       link_regs(2, C),
+       link_regs(3, D),
+       link_regs(4, E),
+       link_regs(5, F)
+};
+
+static const struct dcn10_link_enc_shift le_shift = {
+       LINK_ENCODER_MASK_SH_LIST_DCN30(__SHIFT),\
+       DPCS_DCN2_MASK_SH_LIST(__SHIFT)
+};
+
+static const struct dcn10_link_enc_mask le_mask = {
+       LINK_ENCODER_MASK_SH_LIST_DCN30(_MASK),\
+       DPCS_DCN2_MASK_SH_LIST(_MASK)
+};
+
+
+static const struct dce_panel_cntl_registers panel_cntl_regs[] = {
+       { DCN_PANEL_CNTL_REG_LIST() }
+};
+
+static const struct dce_panel_cntl_shift panel_cntl_shift = {
+       DCE_PANEL_CNTL_MASK_SH_LIST(__SHIFT)
+};
+
+static const struct dce_panel_cntl_mask panel_cntl_mask = {
+       DCE_PANEL_CNTL_MASK_SH_LIST(_MASK)
+};
+
+#define dpp_regs(id)\
+[id] = {\
+       DPP_REG_LIST_DCN30(id),\
+}
+
+static const struct dcn3_dpp_registers dpp_regs[] = {
+       dpp_regs(0),
+       dpp_regs(1),
+       dpp_regs(2),
+       dpp_regs(3),
+       dpp_regs(4),
+       dpp_regs(5),
+};
+
+static const struct dcn3_dpp_shift tf_shift = {
+               DPP_REG_LIST_SH_MASK_DCN30(__SHIFT)
+};
+
+static const struct dcn3_dpp_mask tf_mask = {
+               DPP_REG_LIST_SH_MASK_DCN30(_MASK)
+};
+
+#define opp_regs(id)\
+[id] = {\
+       OPP_REG_LIST_DCN30(id),\
+}
+
+static const struct dcn20_opp_registers opp_regs[] = {
+       opp_regs(0),
+       opp_regs(1),
+       opp_regs(2),
+       opp_regs(3),
+       opp_regs(4),
+       opp_regs(5)
+};
+
+static const struct dcn20_opp_shift opp_shift = {
+       OPP_MASK_SH_LIST_DCN20(__SHIFT)
+};
+
+static const struct dcn20_opp_mask opp_mask = {
+       OPP_MASK_SH_LIST_DCN20(_MASK)
+};
+
+#define aux_engine_regs(id)\
+[id] = {\
+       AUX_COMMON_REG_LIST0(id), \
+       .AUXN_IMPCAL = 0, \
+       .AUXP_IMPCAL = 0, \
+       .AUX_RESET_MASK = DP_AUX0_AUX_CONTROL__AUX_RESET_MASK, \
+}
+
+static const struct dce110_aux_registers aux_engine_regs[] = {
+               aux_engine_regs(0),
+               aux_engine_regs(1),
+               aux_engine_regs(2),
+               aux_engine_regs(3),
+               aux_engine_regs(4),
+               aux_engine_regs(5)
+};
+
+#define dwbc_regs_dcn3(id)\
+[id] = {\
+       DWBC_COMMON_REG_LIST_DCN30(id),\
+}
+
+static const struct dcn30_dwbc_registers dwbc30_regs[] = {
+       dwbc_regs_dcn3(0),
+};
+
+static const struct dcn30_dwbc_shift dwbc30_shift = {
+       DWBC_COMMON_MASK_SH_LIST_DCN30(__SHIFT)
+};
+
+static const struct dcn30_dwbc_mask dwbc30_mask = {
+       DWBC_COMMON_MASK_SH_LIST_DCN30(_MASK)
+};
+
+#define mcif_wb_regs_dcn3(id)\
+[id] = {\
+       MCIF_WB_COMMON_REG_LIST_DCN30(id),\
+}
+
+static const struct dcn30_mmhubbub_registers mcif_wb30_regs[] = {
+       mcif_wb_regs_dcn3(0)
+};
+
+static const struct dcn30_mmhubbub_shift mcif_wb30_shift = {
+       MCIF_WB_COMMON_MASK_SH_LIST_DCN30(__SHIFT)
+};
+
+static const struct dcn30_mmhubbub_mask mcif_wb30_mask = {
+       MCIF_WB_COMMON_MASK_SH_LIST_DCN30(_MASK)
+};
+
+#define dsc_regsDCN20(id)\
+[id] = {\
+       DSC_REG_LIST_DCN20(id)\
+}
+
+static const struct dcn20_dsc_registers dsc_regs[] = {
+       dsc_regsDCN20(0),
+       dsc_regsDCN20(1),
+       dsc_regsDCN20(2),
+       dsc_regsDCN20(3),
+       dsc_regsDCN20(4),
+       dsc_regsDCN20(5)
+};
+
+static const struct dcn20_dsc_shift dsc_shift = {
+       DSC_REG_LIST_SH_MASK_DCN20(__SHIFT)
+};
+
+static const struct dcn20_dsc_mask dsc_mask = {
+       DSC_REG_LIST_SH_MASK_DCN20(_MASK)
+};
+
+static const struct dcn30_mpc_registers mpc_regs = {
+               MPC_REG_LIST_DCN3_0(0),
+               MPC_REG_LIST_DCN3_0(1),
+               MPC_REG_LIST_DCN3_0(2),
+               MPC_REG_LIST_DCN3_0(3),
+               MPC_REG_LIST_DCN3_0(4),
+               MPC_REG_LIST_DCN3_0(5),
+               MPC_OUT_MUX_REG_LIST_DCN3_0(0),
+               MPC_OUT_MUX_REG_LIST_DCN3_0(1),
+               MPC_OUT_MUX_REG_LIST_DCN3_0(2),
+               MPC_OUT_MUX_REG_LIST_DCN3_0(3),
+               MPC_OUT_MUX_REG_LIST_DCN3_0(4),
+               MPC_OUT_MUX_REG_LIST_DCN3_0(5),
+               MPC_RMU_GLOBAL_REG_LIST_DCN3AG,
+               MPC_RMU_REG_LIST_DCN3AG(0),
+               MPC_RMU_REG_LIST_DCN3AG(1),
+               MPC_RMU_REG_LIST_DCN3AG(2),
+               MPC_DWB_MUX_REG_LIST_DCN3_0(0),
+};
+
+static const struct dcn30_mpc_shift mpc_shift = {
+       MPC_COMMON_MASK_SH_LIST_DCN30(__SHIFT)
+};
+
+static const struct dcn30_mpc_mask mpc_mask = {
+       MPC_COMMON_MASK_SH_LIST_DCN30(_MASK)
+};
+
+#define optc_regs(id)\
+[id] = {OPTC_COMMON_REG_LIST_DCN3_0(id)}
+
+
+static const struct dcn_optc_registers optc_regs[] = {
+       optc_regs(0),
+       optc_regs(1),
+       optc_regs(2),
+       optc_regs(3),
+       optc_regs(4),
+       optc_regs(5)
+};
+
+static const struct dcn_optc_shift optc_shift = {
+       OPTC_COMMON_MASK_SH_LIST_DCN30(__SHIFT)
+};
+
+static const struct dcn_optc_mask optc_mask = {
+       OPTC_COMMON_MASK_SH_LIST_DCN30(_MASK)
+};
+
+#define hubp_regs(id)\
+[id] = {\
+       HUBP_REG_LIST_DCN30(id)\
+}
+
+static const struct dcn_hubp2_registers hubp_regs[] = {
+               hubp_regs(0),
+               hubp_regs(1),
+               hubp_regs(2),
+               hubp_regs(3),
+               hubp_regs(4),
+               hubp_regs(5)
+};
+
+static const struct dcn_hubp2_shift hubp_shift = {
+               HUBP_MASK_SH_LIST_DCN30(__SHIFT)
+};
+
+static const struct dcn_hubp2_mask hubp_mask = {
+               HUBP_MASK_SH_LIST_DCN30(_MASK)
+};
+
+static const struct dcn_hubbub_registers hubbub_reg = {
+               HUBBUB_REG_LIST_DCN30(0)
+};
+
+static const struct dcn_hubbub_shift hubbub_shift = {
+               HUBBUB_MASK_SH_LIST_DCN30(__SHIFT)
+};
+
+static const struct dcn_hubbub_mask hubbub_mask = {
+               HUBBUB_MASK_SH_LIST_DCN30(_MASK)
+};
+
+static const struct dccg_registers dccg_regs = {
+               DCCG_REG_LIST_DCN30()
+};
+
+static const struct dccg_shift dccg_shift = {
+               DCCG_MASK_SH_LIST_DCN3(__SHIFT)
+};
+
+static const struct dccg_mask dccg_mask = {
+               DCCG_MASK_SH_LIST_DCN3(_MASK)
+};
+
+static const struct dce_hwseq_registers hwseq_reg = {
+               HWSEQ_DCN30_REG_LIST()
+};
+
+static const struct dce_hwseq_shift hwseq_shift = {
+               HWSEQ_DCN30_MASK_SH_LIST(__SHIFT)
+};
+
+static const struct dce_hwseq_mask hwseq_mask = {
+               HWSEQ_DCN30_MASK_SH_LIST(_MASK)
+};
+#define vmid_regs(id)\
+[id] = {\
+               DCN20_VMID_REG_LIST(id)\
+}
+
+static const struct dcn_vmid_registers vmid_regs[] = {
+       vmid_regs(0),
+       vmid_regs(1),
+       vmid_regs(2),
+       vmid_regs(3),
+       vmid_regs(4),
+       vmid_regs(5),
+       vmid_regs(6),
+       vmid_regs(7),
+       vmid_regs(8),
+       vmid_regs(9),
+       vmid_regs(10),
+       vmid_regs(11),
+       vmid_regs(12),
+       vmid_regs(13),
+       vmid_regs(14),
+       vmid_regs(15)
+};
+
+static const struct dcn20_vmid_shift vmid_shifts = {
+               DCN20_VMID_MASK_SH_LIST(__SHIFT)
+};
+
+static const struct dcn20_vmid_mask vmid_masks = {
+               DCN20_VMID_MASK_SH_LIST(_MASK)
+};
+
+static const struct resource_caps res_cap_dcn3 = {
+       .num_timing_generator = 6,
+       .num_opp = 6,
+       .num_video_plane = 6,
+       .num_audio = 6,
+       .num_stream_encoder = 6,
+       .num_pll = 6,
+       .num_dwb = 1,
+       .num_ddc = 6,
+       .num_vmid = 16,
+       .num_mpc_3dlut = 3,
+       .num_dsc = 6,
+};
+
+static const struct dc_plane_cap plane_cap = {
+       .type = DC_PLANE_TYPE_DCN_UNIVERSAL,
+       .per_pixel_alpha = true,
+
+       .pixel_format_support = {
+                       .argb8888 = true,
+                       .nv12 = true,
+                       .fp16 = true,
+                       .p010 = true,
+                       .ayuv = false,
+       },
+
+       .max_upscale_factor = {
+                       .argb8888 = 16000,
+                       .nv12 = 16000,
+                       .fp16 = 16000
+       },
+
+       /* 6:1 downscaling ratio: 1000/6 = 166.666 */
+       .max_downscale_factor = {
+                       .argb8888 = 167,
+                       .nv12 = 167,
+                       .fp16 = 167
+       },
+       16,
+       16
+};
+
+static const struct dc_debug_options debug_defaults_drv = {
+       .disable_dmcu = true, //No DMCU on DCN30
+       .force_abm_enable = false,
+       .timing_trace = false,
+       .clock_trace = true,
+       .disable_pplib_clock_request = true,
+       .pipe_split_policy = MPC_SPLIT_DYNAMIC,
+       .force_single_disp_pipe_split = false,
+       .disable_dcc = DCC_ENABLE,
+       .vsr_support = true,
+       .performance_trace = false,
+       .max_downscale_src_width = 7680,/*upto 8K*/
+       .disable_pplib_wm_range = false,
+       .scl_reset_length10 = true,
+       .sanity_checks = false,
+       .underflow_assert_delay_us = 0xFFFFFFFF,
+       .dwb_fi_phase = -1, // -1 = disable,
+       .dmub_command_table = true,
+       .use_max_lb = true,
+       .exit_idle_opt_for_cursor_updates = true,
+       .enable_legacy_fast_update = false,
+       .using_dml2 = false,
+};
+
+static const struct dc_panel_config panel_config_defaults = {
+       .psr = {
+               .disable_psr = false,
+               .disallow_psrsu = false,
+               .disallow_replay = false,
+       },
+};
+
+static void dcn30_dpp_destroy(struct dpp **dpp)
+{
+       kfree(TO_DCN20_DPP(*dpp));
+       *dpp = NULL;
+}
+
+static struct dpp *dcn30_dpp_create(
+       struct dc_context *ctx,
+       uint32_t inst)
+{
+       struct dcn3_dpp *dpp =
+               kzalloc(sizeof(struct dcn3_dpp), GFP_KERNEL);
+
+       if (!dpp)
+               return NULL;
+
+       if (dpp3_construct(dpp, ctx, inst,
+                       &dpp_regs[inst], &tf_shift, &tf_mask))
+               return &dpp->base;
+
+       BREAK_TO_DEBUGGER();
+       kfree(dpp);
+       return NULL;
+}
+
+static struct output_pixel_processor *dcn30_opp_create(
+       struct dc_context *ctx, uint32_t inst)
+{
+       struct dcn20_opp *opp =
+               kzalloc(sizeof(struct dcn20_opp), GFP_KERNEL);
+
+       if (!opp) {
+               BREAK_TO_DEBUGGER();
+               return NULL;
+       }
+
+       dcn20_opp_construct(opp, ctx, inst,
+                       &opp_regs[inst], &opp_shift, &opp_mask);
+       return &opp->base;
+}
+
+static struct dce_aux *dcn30_aux_engine_create(
+       struct dc_context *ctx,
+       uint32_t inst)
+{
+       struct aux_engine_dce110 *aux_engine =
+               kzalloc(sizeof(struct aux_engine_dce110), GFP_KERNEL);
+
+       if (!aux_engine)
+               return NULL;
+
+       dce110_aux_engine_construct(aux_engine, ctx, inst,
+                                   SW_AUX_TIMEOUT_PERIOD_MULTIPLIER * AUX_TIMEOUT_PERIOD,
+                                   &aux_engine_regs[inst],
+                                       &aux_mask,
+                                       &aux_shift,
+                                       ctx->dc->caps.extended_aux_timeout_support);
+
+       return &aux_engine->base;
+}
+
+#define i2c_inst_regs(id) { I2C_HW_ENGINE_COMMON_REG_LIST_DCN30(id) }
+
+static const struct dce_i2c_registers i2c_hw_regs[] = {
+               i2c_inst_regs(1),
+               i2c_inst_regs(2),
+               i2c_inst_regs(3),
+               i2c_inst_regs(4),
+               i2c_inst_regs(5),
+               i2c_inst_regs(6),
+};
+
+static const struct dce_i2c_shift i2c_shifts = {
+               I2C_COMMON_MASK_SH_LIST_DCN30(__SHIFT)
+};
+
+static const struct dce_i2c_mask i2c_masks = {
+               I2C_COMMON_MASK_SH_LIST_DCN30(_MASK)
+};
+
+static struct dce_i2c_hw *dcn30_i2c_hw_create(
+       struct dc_context *ctx,
+       uint32_t inst)
+{
+       struct dce_i2c_hw *dce_i2c_hw =
+               kzalloc(sizeof(struct dce_i2c_hw), GFP_KERNEL);
+
+       if (!dce_i2c_hw)
+               return NULL;
+
+       dcn2_i2c_hw_construct(dce_i2c_hw, ctx, inst,
+                                   &i2c_hw_regs[inst], &i2c_shifts, &i2c_masks);
+
+       return dce_i2c_hw;
+}
+
+static struct mpc *dcn30_mpc_create(
+               struct dc_context *ctx,
+               int num_mpcc,
+               int num_rmu)
+{
+       struct dcn30_mpc *mpc30 = kzalloc(sizeof(struct dcn30_mpc),
+                                         GFP_KERNEL);
+
+       if (!mpc30)
+               return NULL;
+
+       dcn30_mpc_construct(mpc30, ctx,
+                       &mpc_regs,
+                       &mpc_shift,
+                       &mpc_mask,
+                       num_mpcc,
+                       num_rmu);
+
+       return &mpc30->base;
+}
+
+static struct hubbub *dcn30_hubbub_create(struct dc_context *ctx)
+{
+       int i;
+
+       struct dcn20_hubbub *hubbub3 = kzalloc(sizeof(struct dcn20_hubbub),
+                                         GFP_KERNEL);
+
+       if (!hubbub3)
+               return NULL;
+
+       hubbub3_construct(hubbub3, ctx,
+                       &hubbub_reg,
+                       &hubbub_shift,
+                       &hubbub_mask);
+
+
+       for (i = 0; i < res_cap_dcn3.num_vmid; i++) {
+               struct dcn20_vmid *vmid = &hubbub3->vmid[i];
+
+               vmid->ctx = ctx;
+
+               vmid->regs = &vmid_regs[i];
+               vmid->shifts = &vmid_shifts;
+               vmid->masks = &vmid_masks;
+       }
+
+       return &hubbub3->base;
+}
+
+static struct timing_generator *dcn30_timing_generator_create(
+               struct dc_context *ctx,
+               uint32_t instance)
+{
+       struct optc *tgn10 =
+               kzalloc(sizeof(struct optc), GFP_KERNEL);
+
+       if (!tgn10)
+               return NULL;
+
+       tgn10->base.inst = instance;
+       tgn10->base.ctx = ctx;
+
+       tgn10->tg_regs = &optc_regs[instance];
+       tgn10->tg_shift = &optc_shift;
+       tgn10->tg_mask = &optc_mask;
+
+       dcn30_timing_generator_init(tgn10);
+
+       return &tgn10->base;
+}
+
+static const struct encoder_feature_support link_enc_feature = {
+               .max_hdmi_deep_color = COLOR_DEPTH_121212,
+               .max_hdmi_pixel_clock = 600000,
+               .hdmi_ycbcr420_supported = true,
+               .dp_ycbcr420_supported = true,
+               .fec_supported = true,
+               .flags.bits.IS_HBR2_CAPABLE = true,
+               .flags.bits.IS_HBR3_CAPABLE = true,
+               .flags.bits.IS_TPS3_CAPABLE = true,
+               .flags.bits.IS_TPS4_CAPABLE = true
+};
+
+static struct link_encoder *dcn30_link_encoder_create(
+       struct dc_context *ctx,
+       const struct encoder_init_data *enc_init_data)
+{
+       struct dcn20_link_encoder *enc20 =
+               kzalloc(sizeof(struct dcn20_link_encoder), GFP_KERNEL);
+
+       if (!enc20)
+               return NULL;
+
+       dcn30_link_encoder_construct(enc20,
+                       enc_init_data,
+                       &link_enc_feature,
+                       &link_enc_regs[enc_init_data->transmitter],
+                       &link_enc_aux_regs[enc_init_data->channel - 1],
+                       &link_enc_hpd_regs[enc_init_data->hpd_source],
+                       &le_shift,
+                       &le_mask);
+
+       return &enc20->enc10.base;
+}
+
+static struct panel_cntl *dcn30_panel_cntl_create(const struct panel_cntl_init_data *init_data)
+{
+       struct dce_panel_cntl *panel_cntl =
+               kzalloc(sizeof(struct dce_panel_cntl), GFP_KERNEL);
+
+       if (!panel_cntl)
+               return NULL;
+
+       dce_panel_cntl_construct(panel_cntl,
+                       init_data,
+                       &panel_cntl_regs[init_data->inst],
+                       &panel_cntl_shift,
+                       &panel_cntl_mask);
+
+       return &panel_cntl->base;
+}
+
+static void read_dce_straps(
+       struct dc_context *ctx,
+       struct resource_straps *straps)
+{
+       generic_reg_get(ctx, mmDC_PINSTRAPS + BASE(mmDC_PINSTRAPS_BASE_IDX),
+               FN(DC_PINSTRAPS, DC_PINSTRAPS_AUDIO), &straps->dc_pinstraps_audio);
+
+}
+
+static struct audio *dcn30_create_audio(
+               struct dc_context *ctx, unsigned int inst)
+{
+       return dce_audio_create(ctx, inst,
+                       &audio_regs[inst], &audio_shift, &audio_mask);
+}
+
+static struct vpg *dcn30_vpg_create(
+       struct dc_context *ctx,
+       uint32_t inst)
+{
+       struct dcn30_vpg *vpg3 = kzalloc(sizeof(struct dcn30_vpg), GFP_KERNEL);
+
+       if (!vpg3)
+               return NULL;
+
+       vpg3_construct(vpg3, ctx, inst,
+                       &vpg_regs[inst],
+                       &vpg_shift,
+                       &vpg_mask);
+
+       return &vpg3->base;
+}
+
+static struct afmt *dcn30_afmt_create(
+       struct dc_context *ctx,
+       uint32_t inst)
+{
+       struct dcn30_afmt *afmt3 = kzalloc(sizeof(struct dcn30_afmt), GFP_KERNEL);
+
+       if (!afmt3)
+               return NULL;
+
+       afmt3_construct(afmt3, ctx, inst,
+                       &afmt_regs[inst],
+                       &afmt_shift,
+                       &afmt_mask);
+
+       return &afmt3->base;
+}
+
+static struct stream_encoder *dcn30_stream_encoder_create(enum engine_id eng_id,
+                                                         struct dc_context *ctx)
+{
+       struct dcn10_stream_encoder *enc1;
+       struct vpg *vpg;
+       struct afmt *afmt;
+       int vpg_inst;
+       int afmt_inst;
+
+       /* Mapping of VPG, AFMT, DME register blocks to DIO block instance */
+       if (eng_id <= ENGINE_ID_DIGF) {
+               vpg_inst = eng_id;
+               afmt_inst = eng_id;
+       } else
+               return NULL;
+
+       enc1 = kzalloc(sizeof(struct dcn10_stream_encoder), GFP_KERNEL);
+       vpg = dcn30_vpg_create(ctx, vpg_inst);
+       afmt = dcn30_afmt_create(ctx, afmt_inst);
+
+       if (!enc1 || !vpg || !afmt) {
+               kfree(enc1);
+               kfree(vpg);
+               kfree(afmt);
+               return NULL;
+       }
+
+       dcn30_dio_stream_encoder_construct(enc1, ctx, ctx->dc_bios,
+                                       eng_id, vpg, afmt,
+                                       &stream_enc_regs[eng_id],
+                                       &se_shift, &se_mask);
+
+       return &enc1->base;
+}
+
+static struct dce_hwseq *dcn30_hwseq_create(struct dc_context *ctx)
+{
+       struct dce_hwseq *hws = kzalloc(sizeof(struct dce_hwseq), GFP_KERNEL);
+
+       if (hws) {
+               hws->ctx = ctx;
+               hws->regs = &hwseq_reg;
+               hws->shifts = &hwseq_shift;
+               hws->masks = &hwseq_mask;
+       }
+       return hws;
+}
+static const struct resource_create_funcs res_create_funcs = {
+       .read_dce_straps = read_dce_straps,
+       .create_audio = dcn30_create_audio,
+       .create_stream_encoder = dcn30_stream_encoder_create,
+       .create_hwseq = dcn30_hwseq_create,
+};
+
+static void dcn30_resource_destruct(struct dcn30_resource_pool *pool)
+{
+       unsigned int i;
+
+       for (i = 0; i < pool->base.stream_enc_count; i++) {
+               if (pool->base.stream_enc[i] != NULL) {
+                       if (pool->base.stream_enc[i]->vpg != NULL) {
+                               kfree(DCN30_VPG_FROM_VPG(pool->base.stream_enc[i]->vpg));
+                               pool->base.stream_enc[i]->vpg = NULL;
+                       }
+                       if (pool->base.stream_enc[i]->afmt != NULL) {
+                               kfree(DCN30_AFMT_FROM_AFMT(pool->base.stream_enc[i]->afmt));
+                               pool->base.stream_enc[i]->afmt = NULL;
+                       }
+                       kfree(DCN10STRENC_FROM_STRENC(pool->base.stream_enc[i]));
+                       pool->base.stream_enc[i] = NULL;
+               }
+       }
+
+       for (i = 0; i < pool->base.res_cap->num_dsc; i++) {
+               if (pool->base.dscs[i] != NULL)
+                       dcn20_dsc_destroy(&pool->base.dscs[i]);
+       }
+
+       if (pool->base.mpc != NULL) {
+               kfree(TO_DCN20_MPC(pool->base.mpc));
+               pool->base.mpc = NULL;
+       }
+       if (pool->base.hubbub != NULL) {
+               kfree(pool->base.hubbub);
+               pool->base.hubbub = NULL;
+       }
+       for (i = 0; i < pool->base.pipe_count; i++) {
+               if (pool->base.dpps[i] != NULL)
+                       dcn30_dpp_destroy(&pool->base.dpps[i]);
+
+               if (pool->base.ipps[i] != NULL)
+                       pool->base.ipps[i]->funcs->ipp_destroy(&pool->base.ipps[i]);
+
+               if (pool->base.hubps[i] != NULL) {
+                       kfree(TO_DCN20_HUBP(pool->base.hubps[i]));
+                       pool->base.hubps[i] = NULL;
+               }
+
+               if (pool->base.irqs != NULL) {
+                       dal_irq_service_destroy(&pool->base.irqs);
+               }
+       }
+
+       for (i = 0; i < pool->base.res_cap->num_ddc; i++) {
+               if (pool->base.engines[i] != NULL)
+                       dce110_engine_destroy(&pool->base.engines[i]);
+               if (pool->base.hw_i2cs[i] != NULL) {
+                       kfree(pool->base.hw_i2cs[i]);
+                       pool->base.hw_i2cs[i] = NULL;
+               }
+               if (pool->base.sw_i2cs[i] != NULL) {
+                       kfree(pool->base.sw_i2cs[i]);
+                       pool->base.sw_i2cs[i] = NULL;
+               }
+       }
+
+       for (i = 0; i < pool->base.res_cap->num_opp; i++) {
+               if (pool->base.opps[i] != NULL)
+                       pool->base.opps[i]->funcs->opp_destroy(&pool->base.opps[i]);
+       }
+
+       for (i = 0; i < pool->base.res_cap->num_timing_generator; i++) {
+               if (pool->base.timing_generators[i] != NULL)    {
+                       kfree(DCN10TG_FROM_TG(pool->base.timing_generators[i]));
+                       pool->base.timing_generators[i] = NULL;
+               }
+       }
+
+       for (i = 0; i < pool->base.res_cap->num_dwb; i++) {
+               if (pool->base.dwbc[i] != NULL) {
+                       kfree(TO_DCN30_DWBC(pool->base.dwbc[i]));
+                       pool->base.dwbc[i] = NULL;
+               }
+               if (pool->base.mcif_wb[i] != NULL) {
+                       kfree(TO_DCN30_MMHUBBUB(pool->base.mcif_wb[i]));
+                       pool->base.mcif_wb[i] = NULL;
+               }
+       }
+
+       for (i = 0; i < pool->base.audio_count; i++) {
+               if (pool->base.audios[i])
+                       dce_aud_destroy(&pool->base.audios[i]);
+       }
+
+       for (i = 0; i < pool->base.clk_src_count; i++) {
+               if (pool->base.clock_sources[i] != NULL) {
+                       dcn20_clock_source_destroy(&pool->base.clock_sources[i]);
+                       pool->base.clock_sources[i] = NULL;
+               }
+       }
+
+       for (i = 0; i < pool->base.res_cap->num_mpc_3dlut; i++) {
+               if (pool->base.mpc_lut[i] != NULL) {
+                       dc_3dlut_func_release(pool->base.mpc_lut[i]);
+                       pool->base.mpc_lut[i] = NULL;
+               }
+               if (pool->base.mpc_shaper[i] != NULL) {
+                       dc_transfer_func_release(pool->base.mpc_shaper[i]);
+                       pool->base.mpc_shaper[i] = NULL;
+               }
+       }
+
+       if (pool->base.dp_clock_source != NULL) {
+               dcn20_clock_source_destroy(&pool->base.dp_clock_source);
+               pool->base.dp_clock_source = NULL;
+       }
+
+       for (i = 0; i < pool->base.pipe_count; i++) {
+               if (pool->base.multiple_abms[i] != NULL)
+                       dce_abm_destroy(&pool->base.multiple_abms[i]);
+       }
+
+       if (pool->base.psr != NULL)
+               dmub_psr_destroy(&pool->base.psr);
+
+       if (pool->base.dccg != NULL)
+               dcn_dccg_destroy(&pool->base.dccg);
+
+       if (pool->base.oem_device != NULL) {
+               struct dc *dc = pool->base.oem_device->ctx->dc;
+
+               dc->link_srv->destroy_ddc_service(&pool->base.oem_device);
+       }
+}
+
+static struct hubp *dcn30_hubp_create(
+       struct dc_context *ctx,
+       uint32_t inst)
+{
+       struct dcn20_hubp *hubp2 =
+               kzalloc(sizeof(struct dcn20_hubp), GFP_KERNEL);
+
+       if (!hubp2)
+               return NULL;
+
+       if (hubp3_construct(hubp2, ctx, inst,
+                       &hubp_regs[inst], &hubp_shift, &hubp_mask))
+               return &hubp2->base;
+
+       BREAK_TO_DEBUGGER();
+       kfree(hubp2);
+       return NULL;
+}
+
+static bool dcn30_dwbc_create(struct dc_context *ctx, struct resource_pool *pool)
+{
+       int i;
+       uint32_t pipe_count = pool->res_cap->num_dwb;
+
+       for (i = 0; i < pipe_count; i++) {
+               struct dcn30_dwbc *dwbc30 = kzalloc(sizeof(struct dcn30_dwbc),
+                                                   GFP_KERNEL);
+
+               if (!dwbc30) {
+                       dm_error("DC: failed to create dwbc30!\n");
+                       return false;
+               }
+
+               dcn30_dwbc_construct(dwbc30, ctx,
+                               &dwbc30_regs[i],
+                               &dwbc30_shift,
+                               &dwbc30_mask,
+                               i);
+
+               pool->dwbc[i] = &dwbc30->base;
+       }
+       return true;
+}
+
+static bool dcn30_mmhubbub_create(struct dc_context *ctx, struct resource_pool *pool)
+{
+       int i;
+       uint32_t pipe_count = pool->res_cap->num_dwb;
+
+       for (i = 0; i < pipe_count; i++) {
+               struct dcn30_mmhubbub *mcif_wb30 = kzalloc(sizeof(struct dcn30_mmhubbub),
+                                                   GFP_KERNEL);
+
+               if (!mcif_wb30) {
+                       dm_error("DC: failed to create mcif_wb30!\n");
+                       return false;
+               }
+
+               dcn30_mmhubbub_construct(mcif_wb30, ctx,
+                               &mcif_wb30_regs[i],
+                               &mcif_wb30_shift,
+                               &mcif_wb30_mask,
+                               i);
+
+               pool->mcif_wb[i] = &mcif_wb30->base;
+       }
+       return true;
+}
+
+static struct display_stream_compressor *dcn30_dsc_create(
+       struct dc_context *ctx, uint32_t inst)
+{
+       struct dcn20_dsc *dsc =
+               kzalloc(sizeof(struct dcn20_dsc), GFP_KERNEL);
+
+       if (!dsc) {
+               BREAK_TO_DEBUGGER();
+               return NULL;
+       }
+
+       dsc2_construct(dsc, ctx, inst, &dsc_regs[inst], &dsc_shift, &dsc_mask);
+       return &dsc->base;
+}
+
+enum dc_status dcn30_add_stream_to_ctx(struct dc *dc, struct dc_state *new_ctx, struct dc_stream_state *dc_stream)
+{
+
+       return dcn20_add_stream_to_ctx(dc, new_ctx, dc_stream);
+}
+
+static void dcn30_destroy_resource_pool(struct resource_pool **pool)
+{
+       struct dcn30_resource_pool *dcn30_pool = TO_DCN30_RES_POOL(*pool);
+
+       dcn30_resource_destruct(dcn30_pool);
+       kfree(dcn30_pool);
+       *pool = NULL;
+}
+
+static struct clock_source *dcn30_clock_source_create(
+               struct dc_context *ctx,
+               struct dc_bios *bios,
+               enum clock_source_id id,
+               const struct dce110_clk_src_regs *regs,
+               bool dp_clk_src)
+{
+       struct dce110_clk_src *clk_src =
+               kzalloc(sizeof(struct dce110_clk_src), GFP_KERNEL);
+
+       if (!clk_src)
+               return NULL;
+
+       if (dcn3_clk_src_construct(clk_src, ctx, bios, id,
+                       regs, &cs_shift, &cs_mask)) {
+               clk_src->base.dp_clk_src = dp_clk_src;
+               return &clk_src->base;
+       }
+
+       kfree(clk_src);
+       BREAK_TO_DEBUGGER();
+       return NULL;
+}
+
+int dcn30_populate_dml_pipes_from_context(
+       struct dc *dc, struct dc_state *context,
+       display_e2e_pipe_params_st *pipes,
+       bool fast_validate)
+{
+       int i, pipe_cnt;
+       struct resource_context *res_ctx = &context->res_ctx;
+
+       DC_FP_START();
+       dcn20_populate_dml_pipes_from_context(dc, context, pipes, fast_validate);
+       DC_FP_END();
+
+       for (i = 0, pipe_cnt = 0; i < dc->res_pool->pipe_count; i++) {
+               if (!res_ctx->pipe_ctx[i].stream)
+                       continue;
+
+               pipes[pipe_cnt++].pipe.scale_ratio_depth.lb_depth =
+                       dm_lb_16;
+       }
+
+       return pipe_cnt;
+}
+
+void dcn30_populate_dml_writeback_from_context(
+       struct dc *dc, struct resource_context *res_ctx, display_e2e_pipe_params_st *pipes)
+{
+       DC_FP_START();
+       dcn30_fpu_populate_dml_writeback_from_context(dc, res_ctx, pipes);
+       DC_FP_END();
+}
+
+unsigned int dcn30_calc_max_scaled_time(
+               unsigned int time_per_pixel,
+               enum mmhubbub_wbif_mode mode,
+               unsigned int urgent_watermark)
+{
+       unsigned int time_per_byte = 0;
+       unsigned int total_free_entry = 0xb40;
+       unsigned int buf_lh_capability;
+       unsigned int max_scaled_time;
+
+       if (mode == PACKED_444) /* packed mode 32 bpp */
+               time_per_byte = time_per_pixel/4;
+       else if (mode == PACKED_444_FP16) /* packed mode 64 bpp */
+               time_per_byte = time_per_pixel/8;
+
+       if (time_per_byte == 0)
+               time_per_byte = 1;
+
+       buf_lh_capability = (total_free_entry*time_per_byte*32) >> 6; /* time_per_byte is in u6.6*/
+       max_scaled_time   = buf_lh_capability - urgent_watermark;
+       return max_scaled_time;
+}
+
+void dcn30_set_mcif_arb_params(
+               struct dc *dc,
+               struct dc_state *context,
+               display_e2e_pipe_params_st *pipes,
+               int pipe_cnt)
+{
+       enum mmhubbub_wbif_mode wbif_mode;
+       struct display_mode_lib *dml = &context->bw_ctx.dml;
+       struct mcif_arb_params *wb_arb_params;
+       int i, j, dwb_pipe;
+
+       /* Writeback MCIF_WB arbitration parameters */
+       dwb_pipe = 0;
+       for (i = 0; i < dc->res_pool->pipe_count; i++) {
+
+               if (!context->res_ctx.pipe_ctx[i].stream)
+                       continue;
+
+               for (j = 0; j < MAX_DWB_PIPES; j++) {
+                       struct dc_writeback_info *writeback_info = &context->res_ctx.pipe_ctx[i].stream->writeback_info[j];
+
+                       if (writeback_info->wb_enabled == false)
+                               continue;
+
+                       //wb_arb_params = &context->res_ctx.pipe_ctx[i].stream->writeback_info[j].mcif_arb_params;
+                       wb_arb_params = &context->bw_ctx.bw.dcn.bw_writeback.mcif_wb_arb[dwb_pipe];
+
+                       if (writeback_info->dwb_params.cnv_params.fc_out_format == DWB_OUT_FORMAT_64BPP_ARGB ||
+                               writeback_info->dwb_params.cnv_params.fc_out_format == DWB_OUT_FORMAT_64BPP_RGBA)
+                               wbif_mode = PACKED_444_FP16;
+                       else
+                               wbif_mode = PACKED_444;
+
+                       DC_FP_START();
+                       dcn30_fpu_set_mcif_arb_params(wb_arb_params, dml, pipes, pipe_cnt, j);
+                       DC_FP_END();
+                       wb_arb_params->time_per_pixel = (1000000 << 6) / context->res_ctx.pipe_ctx[i].stream->phy_pix_clk; /* time_per_pixel should be in u6.6 format */
+                       wb_arb_params->slice_lines = 32;
+                       wb_arb_params->arbitration_slice = 2; /* irrelevant since there is no YUV output */
+                       wb_arb_params->max_scaled_time = dcn30_calc_max_scaled_time(wb_arb_params->time_per_pixel,
+                                       wbif_mode,
+                                       wb_arb_params->cli_watermark[0]); /* assume 4 watermark sets have the same value */
+
+                       dwb_pipe++;
+
+                       if (dwb_pipe >= MAX_DWB_PIPES)
+                               return;
+               }
+               if (dwb_pipe >= MAX_DWB_PIPES)
+                       return;
+       }
+
+}
+
+static struct dc_cap_funcs cap_funcs = {
+       .get_dcc_compression_cap = dcn20_get_dcc_compression_cap
+};
+
+bool dcn30_acquire_post_bldn_3dlut(
+               struct resource_context *res_ctx,
+               const struct resource_pool *pool,
+               int mpcc_id,
+               struct dc_3dlut **lut,
+               struct dc_transfer_func **shaper)
+{
+       int i;
+       bool ret = false;
+       union dc_3dlut_state *state;
+
+       ASSERT(*lut == NULL && *shaper == NULL);
+       *lut = NULL;
+       *shaper = NULL;
+
+       for (i = 0; i < pool->res_cap->num_mpc_3dlut; i++) {
+               if (!res_ctx->is_mpc_3dlut_acquired[i]) {
+                       *lut = pool->mpc_lut[i];
+                       *shaper = pool->mpc_shaper[i];
+                       state = &pool->mpc_lut[i]->state;
+                       res_ctx->is_mpc_3dlut_acquired[i] = true;
+                       state->bits.rmu_idx_valid = 1;
+                       state->bits.rmu_mux_num = i;
+                       if (state->bits.rmu_mux_num == 0)
+                               state->bits.mpc_rmu0_mux = mpcc_id;
+                       else if (state->bits.rmu_mux_num == 1)
+                               state->bits.mpc_rmu1_mux = mpcc_id;
+                       else if (state->bits.rmu_mux_num == 2)
+                               state->bits.mpc_rmu2_mux = mpcc_id;
+                       ret = true;
+                       break;
+               }
+       }
+       return ret;
+}
+
+bool dcn30_release_post_bldn_3dlut(
+               struct resource_context *res_ctx,
+               const struct resource_pool *pool,
+               struct dc_3dlut **lut,
+               struct dc_transfer_func **shaper)
+{
+       int i;
+       bool ret = false;
+
+       for (i = 0; i < pool->res_cap->num_mpc_3dlut; i++) {
+               if (pool->mpc_lut[i] == *lut && pool->mpc_shaper[i] == *shaper) {
+                       res_ctx->is_mpc_3dlut_acquired[i] = false;
+                       pool->mpc_lut[i]->state.raw = 0;
+                       *lut = NULL;
+                       *shaper = NULL;
+                       ret = true;
+                       break;
+               }
+       }
+       return ret;
+}
+
+static bool is_soc_bounding_box_valid(struct dc *dc)
+{
+       uint32_t hw_internal_rev = dc->ctx->asic_id.hw_internal_rev;
+
+       if (ASICREV_IS_SIENNA_CICHLID_P(hw_internal_rev))
+               return true;
+
+       return false;
+}
+
+static bool init_soc_bounding_box(struct dc *dc,
+                                 struct dcn30_resource_pool *pool)
+{
+       struct _vcs_dpi_soc_bounding_box_st *loaded_bb = &dcn3_0_soc;
+       struct _vcs_dpi_ip_params_st *loaded_ip = &dcn3_0_ip;
+
+       DC_LOGGER_INIT(dc->ctx->logger);
+
+       if (!is_soc_bounding_box_valid(dc)) {
+               DC_LOG_ERROR("%s: not valid soc bounding box\n", __func__);
+               return false;
+       }
+
+       loaded_ip->max_num_otg = pool->base.res_cap->num_timing_generator;
+       loaded_ip->max_num_dpp = pool->base.pipe_count;
+       loaded_ip->clamp_min_dcfclk = dc->config.clamp_min_dcfclk;
+       dcn20_patch_bounding_box(dc, loaded_bb);
+       DC_FP_START();
+       patch_dcn30_soc_bounding_box(dc, &dcn3_0_soc);
+       DC_FP_END();
+
+       return true;
+}
+
+static bool dcn30_split_stream_for_mpc_or_odm(
+               const struct dc *dc,
+               struct resource_context *res_ctx,
+               struct pipe_ctx *pri_pipe,
+               struct pipe_ctx *sec_pipe,
+               bool odm)
+{
+       int pipe_idx = sec_pipe->pipe_idx;
+       const struct resource_pool *pool = dc->res_pool;
+
+       *sec_pipe = *pri_pipe;
+
+       sec_pipe->pipe_idx = pipe_idx;
+       sec_pipe->plane_res.mi = pool->mis[pipe_idx];
+       sec_pipe->plane_res.hubp = pool->hubps[pipe_idx];
+       sec_pipe->plane_res.ipp = pool->ipps[pipe_idx];
+       sec_pipe->plane_res.xfm = pool->transforms[pipe_idx];
+       sec_pipe->plane_res.dpp = pool->dpps[pipe_idx];
+       sec_pipe->plane_res.mpcc_inst = pool->dpps[pipe_idx]->inst;
+       sec_pipe->stream_res.dsc = NULL;
+       if (odm) {
+               if (pri_pipe->next_odm_pipe) {
+                       ASSERT(pri_pipe->next_odm_pipe != sec_pipe);
+                       sec_pipe->next_odm_pipe = pri_pipe->next_odm_pipe;
+                       sec_pipe->next_odm_pipe->prev_odm_pipe = sec_pipe;
+               }
+               if (pri_pipe->top_pipe && pri_pipe->top_pipe->next_odm_pipe) {
+                       pri_pipe->top_pipe->next_odm_pipe->bottom_pipe = sec_pipe;
+                       sec_pipe->top_pipe = pri_pipe->top_pipe->next_odm_pipe;
+               }
+               if (pri_pipe->bottom_pipe && pri_pipe->bottom_pipe->next_odm_pipe) {
+                       pri_pipe->bottom_pipe->next_odm_pipe->top_pipe = sec_pipe;
+                       sec_pipe->bottom_pipe = pri_pipe->bottom_pipe->next_odm_pipe;
+               }
+               pri_pipe->next_odm_pipe = sec_pipe;
+               sec_pipe->prev_odm_pipe = pri_pipe;
+
+               if (!sec_pipe->top_pipe)
+                       sec_pipe->stream_res.opp = pool->opps[pipe_idx];
+               else
+                       sec_pipe->stream_res.opp = sec_pipe->top_pipe->stream_res.opp;
+               if (sec_pipe->stream->timing.flags.DSC == 1) {
+                       dcn20_acquire_dsc(dc, res_ctx, &sec_pipe->stream_res.dsc, pipe_idx);
+                       ASSERT(sec_pipe->stream_res.dsc);
+                       if (sec_pipe->stream_res.dsc == NULL)
+                               return false;
+               }
+       } else {
+               if (pri_pipe->bottom_pipe) {
+                       ASSERT(pri_pipe->bottom_pipe != sec_pipe);
+                       sec_pipe->bottom_pipe = pri_pipe->bottom_pipe;
+                       sec_pipe->bottom_pipe->top_pipe = sec_pipe;
+               }
+               pri_pipe->bottom_pipe = sec_pipe;
+               sec_pipe->top_pipe = pri_pipe;
+
+               ASSERT(pri_pipe->plane_state);
+       }
+
+       return true;
+}
+
+static struct pipe_ctx *dcn30_find_split_pipe(
+               struct dc *dc,
+               struct dc_state *context,
+               int old_index)
+{
+       struct pipe_ctx *pipe = NULL;
+       int i;
+
+       if (old_index >= 0 && context->res_ctx.pipe_ctx[old_index].stream == NULL) {
+               pipe = &context->res_ctx.pipe_ctx[old_index];
+               pipe->pipe_idx = old_index;
+       }
+
+       if (!pipe)
+               for (i = dc->res_pool->pipe_count - 1; i >= 0; i--) {
+                       if (dc->current_state->res_ctx.pipe_ctx[i].top_pipe == NULL
+                                       && dc->current_state->res_ctx.pipe_ctx[i].prev_odm_pipe == NULL) {
+                               if (context->res_ctx.pipe_ctx[i].stream == NULL) {
+                                       pipe = &context->res_ctx.pipe_ctx[i];
+                                       pipe->pipe_idx = i;
+                                       break;
+                               }
+                       }
+               }
+
+       /*
+        * May need to fix pipes getting tossed from 1 opp to another on flip
+        * Add for debugging transient underflow during topology updates:
+        * ASSERT(pipe);
+        */
+       if (!pipe)
+               for (i = dc->res_pool->pipe_count - 1; i >= 0; i--) {
+                       if (context->res_ctx.pipe_ctx[i].stream == NULL) {
+                               pipe = &context->res_ctx.pipe_ctx[i];
+                               pipe->pipe_idx = i;
+                               break;
+                       }
+               }
+
+       return pipe;
+}
+
+noinline bool dcn30_internal_validate_bw(
+               struct dc *dc,
+               struct dc_state *context,
+               display_e2e_pipe_params_st *pipes,
+               int *pipe_cnt_out,
+               int *vlevel_out,
+               bool fast_validate,
+               bool allow_self_refresh_only)
+{
+       bool out = false;
+       bool repopulate_pipes = false;
+       int split[MAX_PIPES] = { 0 };
+       bool merge[MAX_PIPES] = { false };
+       bool newly_split[MAX_PIPES] = { false };
+       int pipe_cnt, i, pipe_idx, vlevel;
+       struct vba_vars_st *vba = &context->bw_ctx.dml.vba;
+
+       ASSERT(pipes);
+       if (!pipes)
+               return false;
+
+       context->bw_ctx.dml.vba.maxMpcComb = 0;
+       context->bw_ctx.dml.vba.VoltageLevel = 0;
+       context->bw_ctx.dml.vba.DRAMClockChangeSupport[0][0] = dm_dram_clock_change_vactive;
+       dc->res_pool->funcs->update_soc_for_wm_a(dc, context);
+       pipe_cnt = dc->res_pool->funcs->populate_dml_pipes(dc, context, pipes, fast_validate);
+
+       if (!pipe_cnt) {
+               out = true;
+               goto validate_out;
+       }
+
+       dml_log_pipe_params(&context->bw_ctx.dml, pipes, pipe_cnt);
+
+       if (!fast_validate || !allow_self_refresh_only) {
+               /*
+                * DML favors voltage over p-state, but we're more interested in
+                * supporting p-state over voltage. We can't support p-state in
+                * prefetch mode > 0 so try capping the prefetch mode to start.
+                */
+               context->bw_ctx.dml.soc.allow_dram_self_refresh_or_dram_clock_change_in_vblank =
+                       dm_allow_self_refresh_and_mclk_switch;
+               vlevel = dml_get_voltage_level(&context->bw_ctx.dml, pipes, pipe_cnt);
+               /* This may adjust vlevel and maxMpcComb */
+               if (vlevel < context->bw_ctx.dml.soc.num_states)
+                       vlevel = dcn20_validate_apply_pipe_split_flags(dc, context, vlevel, split, merge);
+       }
+       if (allow_self_refresh_only &&
+           (fast_validate || vlevel == context->bw_ctx.dml.soc.num_states ||
+                       vba->DRAMClockChangeSupport[vlevel][vba->maxMpcComb] == dm_dram_clock_change_unsupported)) {
+               /*
+                * If mode is unsupported or there's still no p-state support
+                * then fall back to favoring voltage.
+                *
+                * We don't actually support prefetch mode 2, so require that we
+                * at least support prefetch mode 1.
+                */
+               context->bw_ctx.dml.soc.allow_dram_self_refresh_or_dram_clock_change_in_vblank =
+                       dm_allow_self_refresh;
+
+               vlevel = dml_get_voltage_level(&context->bw_ctx.dml, pipes, pipe_cnt);
+               if (vlevel < context->bw_ctx.dml.soc.num_states) {
+                       memset(split, 0, sizeof(split));
+                       memset(merge, 0, sizeof(merge));
+                       vlevel = dcn20_validate_apply_pipe_split_flags(dc, context, vlevel, split, merge);
+               }
+       }
+
+       dml_log_mode_support_params(&context->bw_ctx.dml);
+
+       if (vlevel == context->bw_ctx.dml.soc.num_states)
+               goto validate_fail;
+
+       if (!dc->config.enable_windowed_mpo_odm) {
+               for (i = 0, pipe_idx = 0; i < dc->res_pool->pipe_count; i++) {
+                       struct pipe_ctx *pipe = &context->res_ctx.pipe_ctx[i];
+                       struct pipe_ctx *mpo_pipe = pipe->bottom_pipe;
+
+                       if (!pipe->stream)
+                               continue;
+
+                       /* We only support full screen mpo with ODM */
+                       if (vba->ODMCombineEnabled[vba->pipe_plane[pipe_idx]] != dm_odm_combine_mode_disabled
+                                       && pipe->plane_state && mpo_pipe
+                                       && memcmp(&mpo_pipe->plane_state->clip_rect,
+                                                       &pipe->stream->src,
+                                                       sizeof(struct rect)) != 0) {
+                               ASSERT(mpo_pipe->plane_state != pipe->plane_state);
+                               goto validate_fail;
+                       }
+                       pipe_idx++;
+               }
+       }
+
+       /* merge pipes if necessary */
+       for (i = 0; i < dc->res_pool->pipe_count; i++) {
+               struct pipe_ctx *pipe = &context->res_ctx.pipe_ctx[i];
+
+               /*skip pipes that don't need merging*/
+               if (!merge[i])
+                       continue;
+
+               /* 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));
+                       repopulate_pipes = true;
+               } 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));
+                       repopulate_pipes = true;
+               } else
+                       ASSERT(0); /* Should never try to merge master pipe */
+
+       }
+
+       for (i = 0, pipe_idx = -1; i < dc->res_pool->pipe_count; i++) {
+               struct pipe_ctx *pipe = &context->res_ctx.pipe_ctx[i];
+               struct pipe_ctx *old_pipe = &dc->current_state->res_ctx.pipe_ctx[i];
+               struct pipe_ctx *hsplit_pipe = NULL;
+               bool odm;
+               int old_index = -1;
+
+               if (!pipe->stream || newly_split[i])
+                       continue;
+
+               pipe_idx++;
+               odm = vba->ODMCombineEnabled[vba->pipe_plane[pipe_idx]] != dm_odm_combine_mode_disabled;
+
+               if (!pipe->plane_state && !odm)
+                       continue;
+
+               if (split[i]) {
+                       if (odm) {
+                               if (split[i] == 4 && old_pipe->next_odm_pipe && old_pipe->next_odm_pipe->next_odm_pipe)
+                                       old_index = old_pipe->next_odm_pipe->next_odm_pipe->pipe_idx;
+                               else if (old_pipe->next_odm_pipe)
+                                       old_index = old_pipe->next_odm_pipe->pipe_idx;
+                       } else {
+                               if (split[i] == 4 && old_pipe->bottom_pipe && old_pipe->bottom_pipe->bottom_pipe &&
+                                               old_pipe->bottom_pipe->bottom_pipe->plane_state == old_pipe->plane_state)
+                                       old_index = old_pipe->bottom_pipe->bottom_pipe->pipe_idx;
+                               else if (old_pipe->bottom_pipe &&
+                                               old_pipe->bottom_pipe->plane_state == old_pipe->plane_state)
+                                       old_index = old_pipe->bottom_pipe->pipe_idx;
+                       }
+                       hsplit_pipe = dcn30_find_split_pipe(dc, context, old_index);
+                       ASSERT(hsplit_pipe);
+                       if (!hsplit_pipe)
+                               goto validate_fail;
+
+                       if (!dcn30_split_stream_for_mpc_or_odm(
+                                       dc, &context->res_ctx,
+                                       pipe, hsplit_pipe, odm))
+                               goto validate_fail;
+
+                       newly_split[hsplit_pipe->pipe_idx] = true;
+                       repopulate_pipes = true;
+               }
+               if (split[i] == 4) {
+                       struct pipe_ctx *pipe_4to1;
+
+                       if (odm && old_pipe->next_odm_pipe)
+                               old_index = old_pipe->next_odm_pipe->pipe_idx;
+                       else if (!odm && old_pipe->bottom_pipe &&
+                                               old_pipe->bottom_pipe->plane_state == old_pipe->plane_state)
+                               old_index = old_pipe->bottom_pipe->pipe_idx;
+                       else
+                               old_index = -1;
+                       pipe_4to1 = dcn30_find_split_pipe(dc, context, old_index);
+                       ASSERT(pipe_4to1);
+                       if (!pipe_4to1)
+                               goto validate_fail;
+                       if (!dcn30_split_stream_for_mpc_or_odm(
+                                       dc, &context->res_ctx,
+                                       pipe, pipe_4to1, odm))
+                               goto validate_fail;
+                       newly_split[pipe_4to1->pipe_idx] = true;
+
+                       if (odm && old_pipe->next_odm_pipe && old_pipe->next_odm_pipe->next_odm_pipe
+                                       && old_pipe->next_odm_pipe->next_odm_pipe->next_odm_pipe)
+                               old_index = old_pipe->next_odm_pipe->next_odm_pipe->next_odm_pipe->pipe_idx;
+                       else if (!odm && old_pipe->bottom_pipe && old_pipe->bottom_pipe->bottom_pipe &&
+                                       old_pipe->bottom_pipe->bottom_pipe->bottom_pipe &&
+                                       old_pipe->bottom_pipe->bottom_pipe->bottom_pipe->plane_state == old_pipe->plane_state)
+                               old_index = old_pipe->bottom_pipe->bottom_pipe->bottom_pipe->pipe_idx;
+                       else
+                               old_index = -1;
+                       pipe_4to1 = dcn30_find_split_pipe(dc, context, old_index);
+                       ASSERT(pipe_4to1);
+                       if (!pipe_4to1)
+                               goto validate_fail;
+                       if (!dcn30_split_stream_for_mpc_or_odm(
+                                       dc, &context->res_ctx,
+                                       hsplit_pipe, pipe_4to1, odm))
+                               goto validate_fail;
+                       newly_split[pipe_4to1->pipe_idx] = true;
+               }
+               if (odm)
+                       dcn20_build_mapped_resource(dc, context, pipe->stream);
+       }
+
+       for (i = 0; i < dc->res_pool->pipe_count; i++) {
+               struct pipe_ctx *pipe = &context->res_ctx.pipe_ctx[i];
+
+               if (pipe->plane_state) {
+                       if (!resource_build_scaling_params(pipe))
+                               goto validate_fail;
+               }
+       }
+
+       /* Actual dsc count per stream dsc validation*/
+       if (!dcn20_validate_dsc(dc, context)) {
+               vba->ValidationStatus[vba->soc.num_states] = DML_FAIL_DSC_VALIDATION_FAILURE;
+               goto validate_fail;
+       }
+
+       if (repopulate_pipes)
+               pipe_cnt = dc->res_pool->funcs->populate_dml_pipes(dc, context, pipes, fast_validate);
+       context->bw_ctx.dml.vba.VoltageLevel = vlevel;
+       *vlevel_out = vlevel;
+       *pipe_cnt_out = pipe_cnt;
+
+       out = true;
+       goto validate_out;
+
+validate_fail:
+       out = false;
+
+validate_out:
+       return out;
+}
+
+static int get_refresh_rate(struct dc_state *context)
+{
+       int refresh_rate = 0;
+       int h_v_total = 0;
+       struct dc_crtc_timing *timing = NULL;
+
+       if (context == NULL || context->streams[0] == NULL)
+               return 0;
+
+       /* check if refresh rate at least 120hz */
+       timing = &context->streams[0]->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;
+}
+
+#define MAX_STRETCHED_V_BLANK 500 // in micro-seconds
+/*
+ * 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_state *context)
+{
+       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;
+
+       if (context == NULL || context->streams[0] == NULL)
+               return 0;
+
+       /* check if refresh rate at least 120hz */
+       timing = &context->streams[0]->timing;
+       if (timing == NULL)
+               return 0;
+
+       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_state *context)
+{
+       int refresh_rate_max_stretch_100hz;
+       int min_refresh_100hz;
+
+       if (context == NULL || context->streams[0] == NULL)
+               return false;
+
+       refresh_rate_max_stretch_100hz = get_frame_rate_at_max_stretch_100hz(context);
+       min_refresh_100hz = context->streams[0]->timing.min_refresh_in_uhz / 10000;
+
+       if (refresh_rate_max_stretch_100hz < min_refresh_100hz)
+               return false;
+
+       return true;
+}
+
+bool dcn30_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;
+
+       if (context == NULL || context->streams[0] == NULL)
+               return false;
+
+       if (context->streams[0]->sink->edid_caps.panel_patch.disable_fams)
+               return false;
+
+       if (dc->debug.disable_fams)
+               return false;
+
+       if (!dc->caps.dmub_caps.mclk_sw)
+               return false;
+
+       if (context->bw_ctx.bw.dcn.clk.fw_based_mclk_switching_shut_down)
+               return false;
+
+       /* more then 1 monitor connected */
+       if (context->stream_count != 1)
+               return false;
+
+       refresh_rate = get_refresh_rate(context);
+       if (refresh_rate < minimum_refreshrate_supported)
+               return false;
+
+       if (!is_refresh_rate_support_mclk_switch_using_fw_based_vblank_stretch(context))
+               return false;
+
+       if (!context->streams[0]->allow_freesync)
+               return false;
+
+       if (context->streams[0]->vrr_active_variable && dc->debug.disable_fams_gaming)
+               return false;
+
+       context->streams[0]->fpo_in_use = true;
+
+       return true;
+}
+
+/*
+ * set up FPO watermarks, pstate, dram latency
+ */
+void dcn30_setup_mclk_switch_using_fw_based_vblank_stretch(struct dc *dc, struct dc_state *context)
+{
+       ASSERT(dc != NULL && context != NULL);
+       if (dc == NULL || context == NULL)
+               return;
+
+       /* Set wm_a.pstate so high natural MCLK switches are impossible: 4 seconds */
+       context->bw_ctx.bw.dcn.watermarks.a.cstate_pstate.pstate_change_ns = 4U * 1000U * 1000U * 1000U;
+}
+
+void dcn30_update_soc_for_wm_a(struct dc *dc, struct dc_state *context)
+{
+       DC_FP_START();
+       dcn30_fpu_update_soc_for_wm_a(dc, context);
+       DC_FP_END();
+}
+
+void dcn30_calculate_wm_and_dlg(
+               struct dc *dc, struct dc_state *context,
+               display_e2e_pipe_params_st *pipes,
+               int pipe_cnt,
+               int vlevel)
+{
+       DC_FP_START();
+       dcn30_fpu_calculate_wm_and_dlg(dc, context, pipes, pipe_cnt, vlevel);
+       DC_FP_END();
+}
+
+bool dcn30_validate_bandwidth(struct dc *dc,
+               struct dc_state *context,
+               bool fast_validate)
+{
+       bool out = false;
+
+       BW_VAL_TRACE_SETUP();
+
+       int vlevel = 0;
+       int pipe_cnt = 0;
+       display_e2e_pipe_params_st *pipes = kzalloc(dc->res_pool->pipe_count * sizeof(display_e2e_pipe_params_st), GFP_KERNEL);
+       DC_LOGGER_INIT(dc->ctx->logger);
+
+       BW_VAL_TRACE_COUNT();
+
+       DC_FP_START();
+       out = dcn30_internal_validate_bw(dc, context, pipes, &pipe_cnt, &vlevel, fast_validate, true);
+       DC_FP_END();
+
+       if (pipe_cnt == 0)
+               goto validate_out;
+
+       if (!out)
+               goto validate_fail;
+
+       BW_VAL_TRACE_END_VOLTAGE_LEVEL();
+
+       if (fast_validate) {
+               BW_VAL_TRACE_SKIP(fast);
+               goto validate_out;
+       }
+
+       DC_FP_START();
+       if (dc->res_pool->funcs->calculate_wm_and_dlg)
+               dc->res_pool->funcs->calculate_wm_and_dlg(dc, context, pipes, pipe_cnt, vlevel);
+       DC_FP_END();
+
+       BW_VAL_TRACE_END_WATERMARKS();
+
+       goto validate_out;
+
+validate_fail:
+       DC_LOG_WARNING("Mode Validation Warning: %s failed validation.\n",
+               dml_get_status_message(context->bw_ctx.dml.vba.ValidationStatus[context->bw_ctx.dml.vba.soc.num_states]));
+
+       BW_VAL_TRACE_SKIP(fail);
+       out = false;
+
+validate_out:
+       kfree(pipes);
+
+       BW_VAL_TRACE_FINISH();
+
+       return out;
+}
+
+void dcn30_update_bw_bounding_box(struct dc *dc, struct clk_bw_params *bw_params)
+{
+       unsigned int i, j;
+       unsigned int num_states = 0;
+
+       unsigned int dcfclk_mhz[DC__VOLTAGE_STATES] = {0};
+       unsigned int dram_speed_mts[DC__VOLTAGE_STATES] = {0};
+       unsigned int optimal_uclk_for_dcfclk_sta_targets[DC__VOLTAGE_STATES] = {0};
+       unsigned int optimal_dcfclk_for_uclk[DC__VOLTAGE_STATES] = {0};
+
+       unsigned int dcfclk_sta_targets[DC__VOLTAGE_STATES] = {694, 875, 1000, 1200};
+       unsigned int num_dcfclk_sta_targets = 4;
+       unsigned int num_uclk_states;
+
+       struct dc_bounding_box_max_clk dcn30_bb_max_clk;
+
+       memset(&dcn30_bb_max_clk, 0, sizeof(dcn30_bb_max_clk));
+
+       if (dc->ctx->dc_bios->vram_info.num_chans)
+               dcn3_0_soc.num_chans = dc->ctx->dc_bios->vram_info.num_chans;
+
+       DC_FP_START();
+       dcn30_fpu_update_dram_channel_width_bytes(dc);
+       DC_FP_END();
+
+       if (bw_params->clk_table.entries[0].memclk_mhz) {
+
+               for (i = 0; i < MAX_NUM_DPM_LVL; i++) {
+                       if (bw_params->clk_table.entries[i].dcfclk_mhz > dcn30_bb_max_clk.max_dcfclk_mhz)
+                               dcn30_bb_max_clk.max_dcfclk_mhz = bw_params->clk_table.entries[i].dcfclk_mhz;
+                       if (bw_params->clk_table.entries[i].dispclk_mhz > dcn30_bb_max_clk.max_dispclk_mhz)
+                               dcn30_bb_max_clk.max_dispclk_mhz = bw_params->clk_table.entries[i].dispclk_mhz;
+                       if (bw_params->clk_table.entries[i].dppclk_mhz > dcn30_bb_max_clk.max_dppclk_mhz)
+                               dcn30_bb_max_clk.max_dppclk_mhz = bw_params->clk_table.entries[i].dppclk_mhz;
+                       if (bw_params->clk_table.entries[i].phyclk_mhz > dcn30_bb_max_clk.max_phyclk_mhz)
+                               dcn30_bb_max_clk.max_phyclk_mhz = bw_params->clk_table.entries[i].phyclk_mhz;
+               }
+
+               DC_FP_START();
+               dcn30_fpu_update_max_clk(&dcn30_bb_max_clk);
+               DC_FP_END();
+
+               if (dcn30_bb_max_clk.max_dcfclk_mhz > dcfclk_sta_targets[num_dcfclk_sta_targets-1]) {
+                       // If max DCFCLK is greater than the max DCFCLK STA target, insert into the DCFCLK STA target array
+                       dcfclk_sta_targets[num_dcfclk_sta_targets] = dcn30_bb_max_clk.max_dcfclk_mhz;
+                       num_dcfclk_sta_targets++;
+               } else if (dcn30_bb_max_clk.max_dcfclk_mhz < dcfclk_sta_targets[num_dcfclk_sta_targets-1]) {
+                       // If max DCFCLK is less than the max DCFCLK STA target, cap values and remove duplicates
+                       for (i = 0; i < num_dcfclk_sta_targets; i++) {
+                               if (dcfclk_sta_targets[i] > dcn30_bb_max_clk.max_dcfclk_mhz) {
+                                       dcfclk_sta_targets[i] = dcn30_bb_max_clk.max_dcfclk_mhz;
+                                       break;
+                               }
+                       }
+                       // Update size of array since we "removed" duplicates
+                       num_dcfclk_sta_targets = i + 1;
+               }
+
+               num_uclk_states = bw_params->clk_table.num_entries;
+
+               // Calculate optimal dcfclk for each uclk
+               for (i = 0; i < num_uclk_states; i++) {
+                       DC_FP_START();
+                       dcn30_fpu_get_optimal_dcfclk_fclk_for_uclk(bw_params->clk_table.entries[i].memclk_mhz * 16,
+                                       &optimal_dcfclk_for_uclk[i], NULL);
+                       DC_FP_END();
+                       if (optimal_dcfclk_for_uclk[i] < bw_params->clk_table.entries[0].dcfclk_mhz) {
+                               optimal_dcfclk_for_uclk[i] = bw_params->clk_table.entries[0].dcfclk_mhz;
+                       }
+               }
+
+               // Calculate optimal uclk for each dcfclk sta target
+               for (i = 0; i < num_dcfclk_sta_targets; i++) {
+                       for (j = 0; j < num_uclk_states; j++) {
+                               if (dcfclk_sta_targets[i] < optimal_dcfclk_for_uclk[j]) {
+                                       optimal_uclk_for_dcfclk_sta_targets[i] =
+                                                       bw_params->clk_table.entries[j].memclk_mhz * 16;
+                                       break;
+                               }
+                       }
+               }
+
+               i = 0;
+               j = 0;
+               // create the final dcfclk and uclk table
+               while (i < num_dcfclk_sta_targets && j < num_uclk_states && num_states < DC__VOLTAGE_STATES) {
+                       if (dcfclk_sta_targets[i] < optimal_dcfclk_for_uclk[j] && i < num_dcfclk_sta_targets) {
+                               dcfclk_mhz[num_states] = dcfclk_sta_targets[i];
+                               dram_speed_mts[num_states++] = optimal_uclk_for_dcfclk_sta_targets[i++];
+                       } else {
+                               if (j < num_uclk_states && optimal_dcfclk_for_uclk[j] <= dcn30_bb_max_clk.max_dcfclk_mhz) {
+                                       dcfclk_mhz[num_states] = optimal_dcfclk_for_uclk[j];
+                                       dram_speed_mts[num_states++] = bw_params->clk_table.entries[j++].memclk_mhz * 16;
+                               } else {
+                                       j = num_uclk_states;
+                               }
+                       }
+               }
+
+               while (i < num_dcfclk_sta_targets && num_states < DC__VOLTAGE_STATES) {
+                       dcfclk_mhz[num_states] = dcfclk_sta_targets[i];
+                       dram_speed_mts[num_states++] = optimal_uclk_for_dcfclk_sta_targets[i++];
+               }
+
+               while (j < num_uclk_states && num_states < DC__VOLTAGE_STATES &&
+                               optimal_dcfclk_for_uclk[j] <= dcn30_bb_max_clk.max_dcfclk_mhz) {
+                       dcfclk_mhz[num_states] = optimal_dcfclk_for_uclk[j];
+                       dram_speed_mts[num_states++] = bw_params->clk_table.entries[j++].memclk_mhz * 16;
+               }
+
+               dcn3_0_soc.num_states = num_states;
+               DC_FP_START();
+               dcn30_fpu_update_bw_bounding_box(dc, bw_params, &dcn30_bb_max_clk, dcfclk_mhz, dram_speed_mts);
+               DC_FP_END();
+       }
+}
+
+static void dcn30_get_panel_config_defaults(struct dc_panel_config *panel_config)
+{
+       *panel_config = panel_config_defaults;
+}
+
+static const struct resource_funcs dcn30_res_pool_funcs = {
+       .destroy = dcn30_destroy_resource_pool,
+       .link_enc_create = dcn30_link_encoder_create,
+       .panel_cntl_create = dcn30_panel_cntl_create,
+       .validate_bandwidth = dcn30_validate_bandwidth,
+       .calculate_wm_and_dlg = dcn30_calculate_wm_and_dlg,
+       .update_soc_for_wm_a = dcn30_update_soc_for_wm_a,
+       .populate_dml_pipes = dcn30_populate_dml_pipes_from_context,
+       .acquire_free_pipe_as_secondary_dpp_pipe = dcn20_acquire_free_pipe_for_layer,
+       .release_pipe = dcn20_release_pipe,
+       .add_stream_to_ctx = dcn30_add_stream_to_ctx,
+       .add_dsc_to_stream_resource = dcn20_add_dsc_to_stream_resource,
+       .remove_stream_from_ctx = dcn20_remove_stream_from_ctx,
+       .populate_dml_writeback_from_context = dcn30_populate_dml_writeback_from_context,
+       .set_mcif_arb_params = dcn30_set_mcif_arb_params,
+       .find_first_free_match_stream_enc_for_link = dcn10_find_first_free_match_stream_enc_for_link,
+       .acquire_post_bldn_3dlut = dcn30_acquire_post_bldn_3dlut,
+       .release_post_bldn_3dlut = dcn30_release_post_bldn_3dlut,
+       .update_bw_bounding_box = dcn30_update_bw_bounding_box,
+       .patch_unknown_plane_state = dcn20_patch_unknown_plane_state,
+       .get_panel_config_defaults = dcn30_get_panel_config_defaults,
+};
+
+#define CTX ctx
+
+#define REG(reg_name) \
+       (DCN_BASE.instance[0].segment[mm ## reg_name ## _BASE_IDX] + mm ## reg_name)
+
+static uint32_t read_pipe_fuses(struct dc_context *ctx)
+{
+       uint32_t value = REG_READ(CC_DC_PIPE_DIS);
+       /* Support for max 6 pipes */
+       value = value & 0x3f;
+       return value;
+}
+
+static bool dcn30_resource_construct(
+       uint8_t num_virtual_links,
+       struct dc *dc,
+       struct dcn30_resource_pool *pool)
+{
+       int i;
+       struct dc_context *ctx = dc->ctx;
+       struct irq_service_init_data init_data;
+       struct ddc_service_init_data ddc_init_data = {0};
+       uint32_t pipe_fuses = read_pipe_fuses(ctx);
+       uint32_t num_pipes = 0;
+
+       if (!(pipe_fuses == 0 || pipe_fuses == 0x3e)) {
+               BREAK_TO_DEBUGGER();
+               dm_error("DC: Unexpected fuse recipe for navi2x !\n");
+               /* fault to single pipe */
+               pipe_fuses = 0x3e;
+       }
+
+       DC_FP_START();
+
+       ctx->dc_bios->regs = &bios_regs;
+
+       pool->base.res_cap = &res_cap_dcn3;
+
+       pool->base.funcs = &dcn30_res_pool_funcs;
+
+       /*************************************************
+        *  Resource + asic cap harcoding                *
+        *************************************************/
+       pool->base.underlay_pipe_index = NO_UNDERLAY_PIPE;
+       pool->base.pipe_count = pool->base.res_cap->num_timing_generator;
+       pool->base.mpcc_count = pool->base.res_cap->num_timing_generator;
+       dc->caps.max_downscale_ratio = 600;
+       dc->caps.i2c_speed_in_khz = 100;
+       dc->caps.i2c_speed_in_khz_hdcp = 100; /*1.4 w/a not applied by default*/
+       dc->caps.max_cursor_size = 256;
+       dc->caps.min_horizontal_blanking_period = 80;
+       dc->caps.dmdata_alloc_size = 2048;
+       dc->caps.mall_size_per_mem_channel = 8;
+       /* total size = mall per channel * num channels * 1024 * 1024 */
+       dc->caps.mall_size_total = dc->caps.mall_size_per_mem_channel * dc->ctx->dc_bios->vram_info.num_chans * 1048576;
+       dc->caps.cursor_cache_size = dc->caps.max_cursor_size * dc->caps.max_cursor_size * 8;
+
+       dc->caps.max_slave_planes = 2;
+       dc->caps.max_slave_yuv_planes = 2;
+       dc->caps.max_slave_rgb_planes = 2;
+       dc->caps.post_blend_color_processing = true;
+       dc->caps.force_dp_tps4_for_cp2520 = true;
+       dc->caps.extended_aux_timeout_support = true;
+       dc->caps.dmcub_support = true;
+
+       /* Color pipeline capabilities */
+       dc->caps.color.dpp.dcn_arch = 1;
+       dc->caps.color.dpp.input_lut_shared = 0;
+       dc->caps.color.dpp.icsc = 1;
+       dc->caps.color.dpp.dgam_ram = 0; // must use gamma_corr
+       dc->caps.color.dpp.dgam_rom_caps.srgb = 1;
+       dc->caps.color.dpp.dgam_rom_caps.bt2020 = 1;
+       dc->caps.color.dpp.dgam_rom_caps.gamma2_2 = 1;
+       dc->caps.color.dpp.dgam_rom_caps.pq = 1;
+       dc->caps.color.dpp.dgam_rom_caps.hlg = 1;
+       dc->caps.color.dpp.post_csc = 1;
+       dc->caps.color.dpp.gamma_corr = 1;
+       dc->caps.color.dpp.dgam_rom_for_yuv = 0;
+
+       dc->caps.color.dpp.hw_3d_lut = 1;
+       dc->caps.color.dpp.ogam_ram = 1;
+       // no OGAM ROM on DCN3
+       dc->caps.color.dpp.ogam_rom_caps.srgb = 0;
+       dc->caps.color.dpp.ogam_rom_caps.bt2020 = 0;
+       dc->caps.color.dpp.ogam_rom_caps.gamma2_2 = 0;
+       dc->caps.color.dpp.ogam_rom_caps.pq = 0;
+       dc->caps.color.dpp.ogam_rom_caps.hlg = 0;
+       dc->caps.color.dpp.ocsc = 0;
+
+       dc->caps.color.mpc.gamut_remap = 1;
+       dc->caps.color.mpc.num_3dluts = pool->base.res_cap->num_mpc_3dlut; //3
+       dc->caps.color.mpc.ogam_ram = 1;
+       dc->caps.color.mpc.ogam_rom_caps.srgb = 0;
+       dc->caps.color.mpc.ogam_rom_caps.bt2020 = 0;
+       dc->caps.color.mpc.ogam_rom_caps.gamma2_2 = 0;
+       dc->caps.color.mpc.ogam_rom_caps.pq = 0;
+       dc->caps.color.mpc.ogam_rom_caps.hlg = 0;
+       dc->caps.color.mpc.ocsc = 1;
+
+       dc->caps.dp_hdmi21_pcon_support = true;
+       dc->caps.max_v_total = (1 << 15) - 1;
+
+       /* read VBIOS LTTPR caps */
+       {
+               if (ctx->dc_bios->funcs->get_lttpr_caps) {
+                       enum bp_result bp_query_result;
+                       uint8_t is_vbios_lttpr_enable = 0;
+
+                       bp_query_result = ctx->dc_bios->funcs->get_lttpr_caps(ctx->dc_bios, &is_vbios_lttpr_enable);
+                       dc->caps.vbios_lttpr_enable = (bp_query_result == BP_RESULT_OK) && !!is_vbios_lttpr_enable;
+               }
+
+               if (ctx->dc_bios->funcs->get_lttpr_interop) {
+                       enum bp_result bp_query_result;
+                       uint8_t is_vbios_interop_enabled = 0;
+
+                       bp_query_result = ctx->dc_bios->funcs->get_lttpr_interop(ctx->dc_bios,
+                                       &is_vbios_interop_enabled);
+                       dc->caps.vbios_lttpr_aware = (bp_query_result == BP_RESULT_OK) && !!is_vbios_interop_enabled;
+               }
+       }
+
+       if (dc->ctx->dce_environment == DCE_ENV_PRODUCTION_DRV)
+               dc->debug = debug_defaults_drv;
+
+       // Init the vm_helper
+       if (dc->vm_helper)
+               vm_helper_init(dc->vm_helper, 16);
+
+       /*************************************************
+        *  Create resources                             *
+        *************************************************/
+
+       /* Clock Sources for Pixel Clock*/
+       pool->base.clock_sources[DCN30_CLK_SRC_PLL0] =
+                       dcn30_clock_source_create(ctx, ctx->dc_bios,
+                               CLOCK_SOURCE_COMBO_PHY_PLL0,
+                               &clk_src_regs[0], false);
+       pool->base.clock_sources[DCN30_CLK_SRC_PLL1] =
+                       dcn30_clock_source_create(ctx, ctx->dc_bios,
+                               CLOCK_SOURCE_COMBO_PHY_PLL1,
+                               &clk_src_regs[1], false);
+       pool->base.clock_sources[DCN30_CLK_SRC_PLL2] =
+                       dcn30_clock_source_create(ctx, ctx->dc_bios,
+                               CLOCK_SOURCE_COMBO_PHY_PLL2,
+                               &clk_src_regs[2], false);
+       pool->base.clock_sources[DCN30_CLK_SRC_PLL3] =
+                       dcn30_clock_source_create(ctx, ctx->dc_bios,
+                               CLOCK_SOURCE_COMBO_PHY_PLL3,
+                               &clk_src_regs[3], false);
+       pool->base.clock_sources[DCN30_CLK_SRC_PLL4] =
+                       dcn30_clock_source_create(ctx, ctx->dc_bios,
+                               CLOCK_SOURCE_COMBO_PHY_PLL4,
+                               &clk_src_regs[4], false);
+       pool->base.clock_sources[DCN30_CLK_SRC_PLL5] =
+                       dcn30_clock_source_create(ctx, ctx->dc_bios,
+                               CLOCK_SOURCE_COMBO_PHY_PLL5,
+                               &clk_src_regs[5], false);
+
+       pool->base.clk_src_count = DCN30_CLK_SRC_TOTAL;
+
+       /* todo: not reuse phy_pll registers */
+       pool->base.dp_clock_source =
+                       dcn30_clock_source_create(ctx, ctx->dc_bios,
+                               CLOCK_SOURCE_ID_DP_DTO,
+                               &clk_src_regs[0], true);
+
+       for (i = 0; i < pool->base.clk_src_count; i++) {
+               if (pool->base.clock_sources[i] == NULL) {
+                       dm_error("DC: failed to create clock sources!\n");
+                       BREAK_TO_DEBUGGER();
+                       goto create_fail;
+               }
+       }
+
+       /* DCCG */
+       pool->base.dccg = dccg30_create(ctx, &dccg_regs, &dccg_shift, &dccg_mask);
+       if (pool->base.dccg == NULL) {
+               dm_error("DC: failed to create dccg!\n");
+               BREAK_TO_DEBUGGER();
+               goto create_fail;
+       }
+
+       /* PP Lib and SMU interfaces */
+       init_soc_bounding_box(dc, pool);
+
+       num_pipes = dcn3_0_ip.max_num_dpp;
+
+       for (i = 0; i < dcn3_0_ip.max_num_dpp; i++)
+               if (pipe_fuses & 1 << i)
+                       num_pipes--;
+
+       dcn3_0_ip.max_num_dpp = num_pipes;
+       dcn3_0_ip.max_num_otg = num_pipes;
+
+       dml_init_instance(&dc->dml, &dcn3_0_soc, &dcn3_0_ip, DML_PROJECT_DCN30);
+
+       /* IRQ */
+       init_data.ctx = dc->ctx;
+       pool->base.irqs = dal_irq_service_dcn30_create(&init_data);
+       if (!pool->base.irqs)
+               goto create_fail;
+
+       /* HUBBUB */
+       pool->base.hubbub = dcn30_hubbub_create(ctx);
+       if (pool->base.hubbub == NULL) {
+               BREAK_TO_DEBUGGER();
+               dm_error("DC: failed to create hubbub!\n");
+               goto create_fail;
+       }
+
+       /* HUBPs, DPPs, OPPs and TGs */
+       for (i = 0; i < pool->base.pipe_count; i++) {
+               pool->base.hubps[i] = dcn30_hubp_create(ctx, i);
+               if (pool->base.hubps[i] == NULL) {
+                       BREAK_TO_DEBUGGER();
+                       dm_error(
+                               "DC: failed to create hubps!\n");
+                       goto create_fail;
+               }
+
+               pool->base.dpps[i] = dcn30_dpp_create(ctx, i);
+               if (pool->base.dpps[i] == NULL) {
+                       BREAK_TO_DEBUGGER();
+                       dm_error(
+                               "DC: failed to create dpps!\n");
+                       goto create_fail;
+               }
+       }
+
+       for (i = 0; i < pool->base.res_cap->num_opp; i++) {
+               pool->base.opps[i] = dcn30_opp_create(ctx, i);
+               if (pool->base.opps[i] == NULL) {
+                       BREAK_TO_DEBUGGER();
+                       dm_error(
+                               "DC: failed to create output pixel processor!\n");
+                       goto create_fail;
+               }
+       }
+
+       for (i = 0; i < pool->base.res_cap->num_timing_generator; i++) {
+               pool->base.timing_generators[i] = dcn30_timing_generator_create(
+                               ctx, i);
+               if (pool->base.timing_generators[i] == NULL) {
+                       BREAK_TO_DEBUGGER();
+                       dm_error("DC: failed to create tg!\n");
+                       goto create_fail;
+               }
+       }
+       pool->base.timing_generator_count = i;
+       /* PSR */
+       pool->base.psr = dmub_psr_create(ctx);
+
+       if (pool->base.psr == NULL) {
+               dm_error("DC: failed to create PSR obj!\n");
+               BREAK_TO_DEBUGGER();
+               goto create_fail;
+       }
+
+       /* ABM */
+       for (i = 0; i < pool->base.res_cap->num_timing_generator; i++) {
+               pool->base.multiple_abms[i] = dmub_abm_create(ctx,
+                               &abm_regs[i],
+                               &abm_shift,
+                               &abm_mask);
+               if (pool->base.multiple_abms[i] == NULL) {
+                       dm_error("DC: failed to create abm for pipe %d!\n", i);
+                       BREAK_TO_DEBUGGER();
+                       goto create_fail;
+               }
+       }
+       /* MPC and DSC */
+       pool->base.mpc = dcn30_mpc_create(ctx, pool->base.mpcc_count, pool->base.res_cap->num_mpc_3dlut);
+       if (pool->base.mpc == NULL) {
+               BREAK_TO_DEBUGGER();
+               dm_error("DC: failed to create mpc!\n");
+               goto create_fail;
+       }
+
+       for (i = 0; i < pool->base.res_cap->num_dsc; i++) {
+               pool->base.dscs[i] = dcn30_dsc_create(ctx, i);
+               if (pool->base.dscs[i] == NULL) {
+                       BREAK_TO_DEBUGGER();
+                       dm_error("DC: failed to create display stream compressor %d!\n", i);
+                       goto create_fail;
+               }
+       }
+
+       /* DWB and MMHUBBUB */
+       if (!dcn30_dwbc_create(ctx, &pool->base)) {
+               BREAK_TO_DEBUGGER();
+               dm_error("DC: failed to create dwbc!\n");
+               goto create_fail;
+       }
+
+       if (!dcn30_mmhubbub_create(ctx, &pool->base)) {
+               BREAK_TO_DEBUGGER();
+               dm_error("DC: failed to create mcif_wb!\n");
+               goto create_fail;
+       }
+
+       /* AUX and I2C */
+       for (i = 0; i < pool->base.res_cap->num_ddc; i++) {
+               pool->base.engines[i] = dcn30_aux_engine_create(ctx, i);
+               if (pool->base.engines[i] == NULL) {
+                       BREAK_TO_DEBUGGER();
+                       dm_error(
+                               "DC:failed to create aux engine!!\n");
+                       goto create_fail;
+               }
+               pool->base.hw_i2cs[i] = dcn30_i2c_hw_create(ctx, i);
+               if (pool->base.hw_i2cs[i] == NULL) {
+                       BREAK_TO_DEBUGGER();
+                       dm_error(
+                               "DC:failed to create hw i2c!!\n");
+                       goto create_fail;
+               }
+               pool->base.sw_i2cs[i] = NULL;
+       }
+
+       /* Audio, Stream Encoders including DIG and virtual, MPC 3D LUTs */
+       if (!resource_construct(num_virtual_links, dc, &pool->base,
+                       &res_create_funcs))
+               goto create_fail;
+
+       /* HW Sequencer and Plane caps */
+       dcn30_hw_sequencer_construct(dc);
+
+       dc->caps.max_planes =  pool->base.pipe_count;
+
+       for (i = 0; i < dc->caps.max_planes; ++i)
+               dc->caps.planes[i] = plane_cap;
+
+       dc->cap_funcs = cap_funcs;
+
+       if (dc->ctx->dc_bios->fw_info.oem_i2c_present) {
+               ddc_init_data.ctx = dc->ctx;
+               ddc_init_data.link = NULL;
+               ddc_init_data.id.id = dc->ctx->dc_bios->fw_info.oem_i2c_obj_id;
+               ddc_init_data.id.enum_id = 0;
+               ddc_init_data.id.type = OBJECT_TYPE_GENERIC;
+               pool->base.oem_device = dc->link_srv->create_ddc_service(&ddc_init_data);
+       } else {
+               pool->base.oem_device = NULL;
+       }
+
+       DC_FP_END();
+
+       return true;
+
+create_fail:
+
+       DC_FP_END();
+       dcn30_resource_destruct(pool);
+
+       return false;
+}
+
+struct resource_pool *dcn30_create_resource_pool(
+               const struct dc_init_data *init_data,
+               struct dc *dc)
+{
+       struct dcn30_resource_pool *pool =
+               kzalloc(sizeof(struct dcn30_resource_pool), GFP_KERNEL);
+
+       if (!pool)
+               return NULL;
+
+       if (dcn30_resource_construct(init_data->num_virtual_links, dc, pool))
+               return &pool->base;
+
+       BREAK_TO_DEBUGGER();
+       kfree(pool);
+       return NULL;
+}
diff --git a/drivers/gpu/drm/amd/display/dc/resource/dcn30/dcn30_resource.h b/drivers/gpu/drm/amd/display/dc/resource/dcn30/dcn30_resource.h
new file mode 100644 (file)
index 0000000..8e6b8b7
--- /dev/null
@@ -0,0 +1,108 @@
+/*
+ * 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
+ *
+ */
+
+#ifndef _DCN30_RESOURCE_H_
+#define _DCN30_RESOURCE_H_
+
+#include "core_types.h"
+
+#define TO_DCN30_RES_POOL(pool)\
+       container_of(pool, struct dcn30_resource_pool, base)
+
+struct dc;
+struct resource_pool;
+struct _vcs_dpi_display_pipe_params_st;
+
+extern struct _vcs_dpi_ip_params_st dcn3_0_ip;
+extern struct _vcs_dpi_soc_bounding_box_st dcn3_0_soc;
+
+struct dcn30_resource_pool {
+       struct resource_pool base;
+};
+struct resource_pool *dcn30_create_resource_pool(
+               const struct dc_init_data *init_data,
+               struct dc *dc);
+
+void dcn30_set_mcif_arb_params(
+               struct dc *dc,
+               struct dc_state *context,
+               display_e2e_pipe_params_st *pipes,
+               int pipe_cnt);
+
+unsigned int dcn30_calc_max_scaled_time(
+               unsigned int time_per_pixel,
+               enum mmhubbub_wbif_mode mode,
+               unsigned int urgent_watermark);
+
+bool dcn30_validate_bandwidth(struct dc *dc, struct dc_state *context,
+               bool fast_validate);
+bool dcn30_internal_validate_bw(
+               struct dc *dc,
+               struct dc_state *context,
+               display_e2e_pipe_params_st *pipes,
+               int *pipe_cnt_out,
+               int *vlevel_out,
+               bool fast_validate,
+               bool allow_self_refresh_only);
+void dcn30_calculate_wm_and_dlg(
+               struct dc *dc, struct dc_state *context,
+               display_e2e_pipe_params_st *pipes,
+               int pipe_cnt,
+               int vlevel);
+void dcn30_update_soc_for_wm_a(struct dc *dc, struct dc_state *context);
+void dcn30_populate_dml_writeback_from_context(
+               struct dc *dc, struct resource_context *res_ctx, display_e2e_pipe_params_st *pipes);
+
+int dcn30_populate_dml_pipes_from_context(
+       struct dc *dc, struct dc_state *context,
+       display_e2e_pipe_params_st *pipes,
+       bool fast_validate);
+
+bool dcn30_acquire_post_bldn_3dlut(
+               struct resource_context *res_ctx,
+               const struct resource_pool *pool,
+               int mpcc_id,
+               struct dc_3dlut **lut,
+               struct dc_transfer_func **shaper);
+
+bool dcn30_release_post_bldn_3dlut(
+               struct resource_context *res_ctx,
+               const struct resource_pool *pool,
+               struct dc_3dlut **lut,
+               struct dc_transfer_func **shaper);
+
+enum dc_status dcn30_add_stream_to_ctx(
+               struct dc *dc,
+               struct dc_state *new_ctx,
+               struct dc_stream_state *dc_stream);
+
+void dcn30_update_bw_bounding_box(struct dc *dc, struct clk_bw_params *bw_params);
+
+bool dcn30_can_support_mclk_switch_using_fw_based_vblank_stretch(struct dc *dc, struct dc_state *context);
+void dcn30_setup_mclk_switch_using_fw_based_vblank_stretch(struct dc *dc, struct dc_state *context);
+int dcn30_find_dummy_latency_index_for_fw_based_mclk_switch(struct dc *dc, struct dc_state *context,
+               display_e2e_pipe_params_st *pipes, int pipe_cnt, int vlevel);
+
+#endif /* _DCN30_RESOURCE_H_ */
diff --git a/drivers/gpu/drm/amd/display/dc/resource/dcn301/dcn301_resource.c b/drivers/gpu/drm/amd/display/dc/resource/dcn301/dcn301_resource.c
new file mode 100644 (file)
index 0000000..511ff6b
--- /dev/null
@@ -0,0 +1,1728 @@
+/*
+ * Copyright 2019-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 "dm_services.h"
+#include "dc.h"
+
+#include "dcn301/dcn301_init.h"
+
+#include "resource.h"
+#include "include/irq_service_interface.h"
+#include "dcn30/dcn30_resource.h"
+#include "dcn301_resource.h"
+
+#include "dcn20/dcn20_resource.h"
+
+#include "dcn10/dcn10_ipp.h"
+#include "dcn301/dcn301_hubbub.h"
+#include "dcn30/dcn30_mpc.h"
+#include "dcn30/dcn30_hubp.h"
+#include "irq/dcn30/irq_service_dcn30.h"
+#include "dcn30/dcn30_dpp.h"
+#include "dcn301/dcn301_optc.h"
+#include "dcn20/dcn20_hwseq.h"
+#include "dcn30/dcn30_hwseq.h"
+#include "dce110/dce110_hwseq.h"
+#include "dcn30/dcn30_opp.h"
+#include "dcn20/dcn20_dsc.h"
+#include "dcn30/dcn30_vpg.h"
+#include "dcn30/dcn30_afmt.h"
+#include "dce/dce_clock_source.h"
+#include "dce/dce_audio.h"
+#include "dce/dce_hwseq.h"
+#include "clk_mgr.h"
+#include "virtual/virtual_stream_encoder.h"
+#include "dce110/dce110_resource.h"
+#include "dml/display_mode_vba.h"
+#include "dcn301/dcn301_dccg.h"
+#include "dcn10/dcn10_resource.h"
+#include "dcn30/dcn30_dio_stream_encoder.h"
+#include "dcn301/dcn301_dio_link_encoder.h"
+#include "dcn301/dcn301_panel_cntl.h"
+
+#include "vangogh_ip_offset.h"
+
+#include "dcn30/dcn30_dwb.h"
+#include "dcn30/dcn30_mmhubbub.h"
+
+#include "dcn/dcn_3_0_1_offset.h"
+#include "dcn/dcn_3_0_1_sh_mask.h"
+
+#include "nbio/nbio_7_2_0_offset.h"
+
+#include "dpcs/dpcs_3_0_0_offset.h"
+#include "dpcs/dpcs_3_0_0_sh_mask.h"
+
+#include "reg_helper.h"
+#include "dce/dmub_abm.h"
+#include "dce/dce_aux.h"
+#include "dce/dce_i2c.h"
+
+#include "dml/dcn30/dcn30_fpu.h"
+
+#include "dml/dcn30/display_mode_vba_30.h"
+#include "dml/dcn301/dcn301_fpu.h"
+#include "vm_helper.h"
+#include "dcn20/dcn20_vmid.h"
+#include "amdgpu_socbb.h"
+
+#define TO_DCN301_RES_POOL(pool)\
+       container_of(pool, struct dcn301_resource_pool, base)
+
+#define DC_LOGGER \
+       dc->ctx->logger
+#define DC_LOGGER_INIT(logger)
+
+enum dcn301_clk_src_array_id {
+       DCN301_CLK_SRC_PLL0,
+       DCN301_CLK_SRC_PLL1,
+       DCN301_CLK_SRC_PLL2,
+       DCN301_CLK_SRC_PLL3,
+       DCN301_CLK_SRC_TOTAL
+};
+
+/* begin *********************
+ * macros to expend register list macro defined in HW object header file
+ */
+
+/* DCN */
+#define BASE_INNER(seg) DCN_BASE__INST0_SEG ## seg
+
+#define BASE(seg) BASE_INNER(seg)
+
+#define SR(reg_name)\
+               .reg_name = BASE(mm ## reg_name ## _BASE_IDX) +  \
+                                       mm ## reg_name
+
+#define SRI(reg_name, block, id)\
+       .reg_name = BASE(mm ## block ## id ## _ ## reg_name ## _BASE_IDX) + \
+                                       mm ## block ## id ## _ ## reg_name
+
+#define SRI2(reg_name, block, id)\
+       .reg_name = BASE(mm ## reg_name ## _BASE_IDX) + \
+                                       mm ## reg_name
+
+#define SRIR(var_name, reg_name, block, id)\
+       .var_name = BASE(mm ## block ## id ## _ ## reg_name ## _BASE_IDX) + \
+                                       mm ## block ## id ## _ ## reg_name
+
+#define SRII(reg_name, block, id)\
+       .reg_name[id] = BASE(mm ## block ## id ## _ ## reg_name ## _BASE_IDX) + \
+                                       mm ## block ## id ## _ ## reg_name
+
+#define SRII2(reg_name_pre, reg_name_post, id)\
+       .reg_name_pre ## _ ##  reg_name_post[id] = BASE(mm ## reg_name_pre \
+                       ## id ## _ ## reg_name_post ## _BASE_IDX) + \
+                       mm ## reg_name_pre ## id ## _ ## reg_name_post
+
+#define SRII_MPC_RMU(reg_name, block, id)\
+       .RMU##_##reg_name[id] = BASE(mm ## block ## id ## _ ## reg_name ## _BASE_IDX) + \
+                                       mm ## block ## id ## _ ## reg_name
+
+#define SRII_DWB(reg_name, temp_name, block, id)\
+       .reg_name[id] = BASE(mm ## block ## id ## _ ## temp_name ## _BASE_IDX) + \
+                                       mm ## block ## id ## _ ## temp_name
+
+#define SF_DWB2(reg_name, block, id, field_name, post_fix)     \
+       .field_name = reg_name ## __ ## field_name ## post_fix
+
+#define DCCG_SRII(reg_name, block, id)\
+       .block ## _ ## reg_name[id] = BASE(mm ## block ## id ## _ ## reg_name ## _BASE_IDX) + \
+                                       mm ## block ## id ## _ ## reg_name
+
+#define VUPDATE_SRII(reg_name, block, id)\
+       .reg_name[id] = BASE(mm ## reg_name ## _ ## block ## id ## _BASE_IDX) + \
+                                       mm ## reg_name ## _ ## block ## id
+
+/* NBIO */
+#define NBIO_BASE_INNER(seg) \
+       NBIO_BASE__INST0_SEG ## seg
+
+#define NBIO_BASE(seg) \
+       NBIO_BASE_INNER(seg)
+
+#define NBIO_SR(reg_name)\
+               .reg_name = NBIO_BASE(regBIF_BX0_ ## reg_name ## _BASE_IDX) + \
+                                       regBIF_BX0_ ## reg_name
+
+/* MMHUB */
+#define MMHUB_BASE_INNER(seg) \
+       MMHUB_BASE__INST0_SEG ## seg
+
+#define MMHUB_BASE(seg) \
+       MMHUB_BASE_INNER(seg)
+
+#define MMHUB_SR(reg_name)\
+               .reg_name = MMHUB_BASE(regMM ## reg_name ## _BASE_IDX) + \
+                                       regMM ## reg_name
+
+/* CLOCK */
+#define CLK_BASE_INNER(seg) \
+       CLK_BASE__INST0_SEG ## seg
+
+#define CLK_BASE(seg) \
+       CLK_BASE_INNER(seg)
+
+#define CLK_SRI(reg_name, block, inst)\
+       .reg_name = CLK_BASE(mm ## block ## _ ## inst ## _ ## reg_name ## _BASE_IDX) + \
+                                       mm ## block ## _ ## inst ## _ ## reg_name
+
+static const struct bios_registers bios_regs = {
+               NBIO_SR(BIOS_SCRATCH_3),
+               NBIO_SR(BIOS_SCRATCH_6)
+};
+
+#define clk_src_regs(index, pllid)\
+[index] = {\
+       CS_COMMON_REG_LIST_DCN3_01(index, pllid),\
+}
+
+static const struct dce110_clk_src_regs clk_src_regs[] = {
+       clk_src_regs(0, A),
+       clk_src_regs(1, B),
+       clk_src_regs(2, C),
+       clk_src_regs(3, D)
+};
+
+static const struct dce110_clk_src_shift cs_shift = {
+               CS_COMMON_MASK_SH_LIST_DCN2_0(__SHIFT)
+};
+
+static const struct dce110_clk_src_mask cs_mask = {
+               CS_COMMON_MASK_SH_LIST_DCN2_0(_MASK)
+};
+
+#define abm_regs(id)\
+[id] = {\
+               ABM_DCN301_REG_LIST(id)\
+}
+
+static const struct dce_abm_registers abm_regs[] = {
+               abm_regs(0),
+               abm_regs(1),
+               abm_regs(2),
+               abm_regs(3),
+};
+
+static const struct dce_abm_shift abm_shift = {
+               ABM_MASK_SH_LIST_DCN30(__SHIFT)
+};
+
+static const struct dce_abm_mask abm_mask = {
+               ABM_MASK_SH_LIST_DCN30(_MASK)
+};
+
+#define audio_regs(id)\
+[id] = {\
+               AUD_COMMON_REG_LIST(id)\
+}
+
+static const struct dce_audio_registers audio_regs[] = {
+       audio_regs(0),
+       audio_regs(1),
+       audio_regs(2),
+       audio_regs(3),
+       audio_regs(4),
+       audio_regs(5),
+       audio_regs(6)
+};
+
+#define DCE120_AUD_COMMON_MASK_SH_LIST(mask_sh)\
+               SF(AZF0ENDPOINT0_AZALIA_F0_CODEC_ENDPOINT_INDEX, AZALIA_ENDPOINT_REG_INDEX, mask_sh),\
+               SF(AZF0ENDPOINT0_AZALIA_F0_CODEC_ENDPOINT_DATA, AZALIA_ENDPOINT_REG_DATA, mask_sh),\
+               AUD_COMMON_MASK_SH_LIST_BASE(mask_sh)
+
+static const struct dce_audio_shift audio_shift = {
+               DCE120_AUD_COMMON_MASK_SH_LIST(__SHIFT)
+};
+
+static const struct dce_audio_mask audio_mask = {
+               DCE120_AUD_COMMON_MASK_SH_LIST(_MASK)
+};
+
+#define vpg_regs(id)\
+[id] = {\
+       VPG_DCN3_REG_LIST(id)\
+}
+
+static const struct dcn30_vpg_registers vpg_regs[] = {
+       vpg_regs(0),
+       vpg_regs(1),
+       vpg_regs(2),
+       vpg_regs(3),
+};
+
+static const struct dcn30_vpg_shift vpg_shift = {
+       DCN3_VPG_MASK_SH_LIST(__SHIFT)
+};
+
+static const struct dcn30_vpg_mask vpg_mask = {
+       DCN3_VPG_MASK_SH_LIST(_MASK)
+};
+
+#define afmt_regs(id)\
+[id] = {\
+       AFMT_DCN3_REG_LIST(id)\
+}
+
+static const struct dcn30_afmt_registers afmt_regs[] = {
+       afmt_regs(0),
+       afmt_regs(1),
+       afmt_regs(2),
+       afmt_regs(3),
+};
+
+static const struct dcn30_afmt_shift afmt_shift = {
+       DCN3_AFMT_MASK_SH_LIST(__SHIFT)
+};
+
+static const struct dcn30_afmt_mask afmt_mask = {
+       DCN3_AFMT_MASK_SH_LIST(_MASK)
+};
+
+#define stream_enc_regs(id)\
+[id] = {\
+       SE_DCN3_REG_LIST(id)\
+}
+
+static const struct dcn10_stream_enc_registers stream_enc_regs[] = {
+       stream_enc_regs(0),
+       stream_enc_regs(1),
+       stream_enc_regs(2),
+       stream_enc_regs(3),
+};
+
+static const struct dcn10_stream_encoder_shift se_shift = {
+               SE_COMMON_MASK_SH_LIST_DCN30(__SHIFT)
+};
+
+static const struct dcn10_stream_encoder_mask se_mask = {
+               SE_COMMON_MASK_SH_LIST_DCN30(_MASK)
+};
+
+
+#define aux_regs(id)\
+[id] = {\
+       DCN2_AUX_REG_LIST(id)\
+}
+
+static const struct dcn10_link_enc_aux_registers link_enc_aux_regs[] = {
+               aux_regs(0),
+               aux_regs(1),
+               aux_regs(2),
+               aux_regs(3),
+};
+
+#define hpd_regs(id)\
+[id] = {\
+       HPD_REG_LIST(id)\
+}
+
+static const struct dcn10_link_enc_hpd_registers link_enc_hpd_regs[] = {
+               hpd_regs(0),
+               hpd_regs(1),
+               hpd_regs(2),
+               hpd_regs(3),
+};
+
+
+#define link_regs(id, phyid)\
+[id] = {\
+       LE_DCN301_REG_LIST(id), \
+       UNIPHY_DCN2_REG_LIST(phyid), \
+       DPCS_DCN2_REG_LIST(id), \
+       SRI(DP_DPHY_INTERNAL_CTRL, DP, id) \
+}
+
+static const struct dce110_aux_registers_shift aux_shift = {
+       DCN_AUX_MASK_SH_LIST(__SHIFT)
+};
+
+static const struct dce110_aux_registers_mask aux_mask = {
+       DCN_AUX_MASK_SH_LIST(_MASK)
+};
+
+static const struct dcn10_link_enc_registers link_enc_regs[] = {
+       link_regs(0, A),
+       link_regs(1, B),
+       link_regs(2, C),
+       link_regs(3, D),
+};
+
+static const struct dcn10_link_enc_shift le_shift = {
+       LINK_ENCODER_MASK_SH_LIST_DCN301(__SHIFT),\
+       DPCS_DCN2_MASK_SH_LIST(__SHIFT)
+};
+
+static const struct dcn10_link_enc_mask le_mask = {
+       LINK_ENCODER_MASK_SH_LIST_DCN301(_MASK),\
+       DPCS_DCN2_MASK_SH_LIST(_MASK)
+};
+
+#define panel_cntl_regs(id)\
+[id] = {\
+       DCN301_PANEL_CNTL_REG_LIST(id),\
+}
+
+static const struct dce_panel_cntl_registers panel_cntl_regs[] = {
+       panel_cntl_regs(0),
+       panel_cntl_regs(1),
+};
+
+static const struct dcn301_panel_cntl_shift panel_cntl_shift = {
+       DCN301_PANEL_CNTL_MASK_SH_LIST(__SHIFT)
+};
+
+static const struct dcn301_panel_cntl_mask panel_cntl_mask = {
+       DCN301_PANEL_CNTL_MASK_SH_LIST(_MASK)
+};
+
+#define dpp_regs(id)\
+[id] = {\
+       DPP_REG_LIST_DCN30(id),\
+}
+
+static const struct dcn3_dpp_registers dpp_regs[] = {
+       dpp_regs(0),
+       dpp_regs(1),
+       dpp_regs(2),
+       dpp_regs(3),
+};
+
+static const struct dcn3_dpp_shift tf_shift = {
+               DPP_REG_LIST_SH_MASK_DCN30(__SHIFT)
+};
+
+static const struct dcn3_dpp_mask tf_mask = {
+               DPP_REG_LIST_SH_MASK_DCN30(_MASK)
+};
+
+#define opp_regs(id)\
+[id] = {\
+       OPP_REG_LIST_DCN30(id),\
+}
+
+static const struct dcn20_opp_registers opp_regs[] = {
+       opp_regs(0),
+       opp_regs(1),
+       opp_regs(2),
+       opp_regs(3),
+};
+
+static const struct dcn20_opp_shift opp_shift = {
+       OPP_MASK_SH_LIST_DCN20(__SHIFT)
+};
+
+static const struct dcn20_opp_mask opp_mask = {
+       OPP_MASK_SH_LIST_DCN20(_MASK)
+};
+
+#define aux_engine_regs(id)\
+[id] = {\
+       AUX_COMMON_REG_LIST0(id), \
+       .AUXN_IMPCAL = 0, \
+       .AUXP_IMPCAL = 0, \
+       .AUX_RESET_MASK = DP_AUX0_AUX_CONTROL__AUX_RESET_MASK, \
+}
+
+static const struct dce110_aux_registers aux_engine_regs[] = {
+               aux_engine_regs(0),
+               aux_engine_regs(1),
+               aux_engine_regs(2),
+               aux_engine_regs(3),
+};
+
+#define dwbc_regs_dcn3(id)\
+[id] = {\
+       DWBC_COMMON_REG_LIST_DCN30(id),\
+}
+
+static const struct dcn30_dwbc_registers dwbc30_regs[] = {
+       dwbc_regs_dcn3(0),
+};
+
+static const struct dcn30_dwbc_shift dwbc30_shift = {
+       DWBC_COMMON_MASK_SH_LIST_DCN30(__SHIFT)
+};
+
+static const struct dcn30_dwbc_mask dwbc30_mask = {
+       DWBC_COMMON_MASK_SH_LIST_DCN30(_MASK)
+};
+
+#define mcif_wb_regs_dcn3(id)\
+[id] = {\
+       MCIF_WB_COMMON_REG_LIST_DCN30(id),\
+}
+
+static const struct dcn30_mmhubbub_registers mcif_wb30_regs[] = {
+       mcif_wb_regs_dcn3(0)
+};
+
+static const struct dcn30_mmhubbub_shift mcif_wb30_shift = {
+       MCIF_WB_COMMON_MASK_SH_LIST_DCN30(__SHIFT)
+};
+
+static const struct dcn30_mmhubbub_mask mcif_wb30_mask = {
+       MCIF_WB_COMMON_MASK_SH_LIST_DCN30(_MASK)
+};
+
+#define dsc_regsDCN20(id)\
+[id] = {\
+       DSC_REG_LIST_DCN20(id)\
+}
+
+static const struct dcn20_dsc_registers dsc_regs[] = {
+       dsc_regsDCN20(0),
+       dsc_regsDCN20(1),
+       dsc_regsDCN20(2),
+};
+
+static const struct dcn20_dsc_shift dsc_shift = {
+       DSC_REG_LIST_SH_MASK_DCN20(__SHIFT)
+};
+
+static const struct dcn20_dsc_mask dsc_mask = {
+       DSC_REG_LIST_SH_MASK_DCN20(_MASK)
+};
+
+static const struct dcn30_mpc_registers mpc_regs = {
+               MPC_REG_LIST_DCN3_0(0),
+               MPC_REG_LIST_DCN3_0(1),
+               MPC_REG_LIST_DCN3_0(2),
+               MPC_REG_LIST_DCN3_0(3),
+               MPC_OUT_MUX_REG_LIST_DCN3_0(0),
+               MPC_OUT_MUX_REG_LIST_DCN3_0(1),
+               MPC_OUT_MUX_REG_LIST_DCN3_0(2),
+               MPC_OUT_MUX_REG_LIST_DCN3_0(3),
+               MPC_RMU_GLOBAL_REG_LIST_DCN3AG,
+               MPC_RMU_REG_LIST_DCN3AG(0),
+               MPC_RMU_REG_LIST_DCN3AG(1),
+               MPC_DWB_MUX_REG_LIST_DCN3_0(0),
+};
+
+static const struct dcn30_mpc_shift mpc_shift = {
+       MPC_COMMON_MASK_SH_LIST_DCN30(__SHIFT)
+};
+
+static const struct dcn30_mpc_mask mpc_mask = {
+       MPC_COMMON_MASK_SH_LIST_DCN30(_MASK)
+};
+
+#define optc_regs(id)\
+[id] = {OPTC_COMMON_REG_LIST_DCN3_0(id)}
+
+
+static const struct dcn_optc_registers optc_regs[] = {
+       optc_regs(0),
+       optc_regs(1),
+       optc_regs(2),
+       optc_regs(3),
+};
+
+static const struct dcn_optc_shift optc_shift = {
+       OPTC_COMMON_MASK_SH_LIST_DCN30(__SHIFT)
+};
+
+static const struct dcn_optc_mask optc_mask = {
+       OPTC_COMMON_MASK_SH_LIST_DCN30(_MASK)
+};
+
+#define hubp_regs(id)\
+[id] = {\
+       HUBP_REG_LIST_DCN30(id)\
+}
+
+static const struct dcn_hubp2_registers hubp_regs[] = {
+               hubp_regs(0),
+               hubp_regs(1),
+               hubp_regs(2),
+               hubp_regs(3),
+};
+
+static const struct dcn_hubp2_shift hubp_shift = {
+               HUBP_MASK_SH_LIST_DCN30(__SHIFT)
+};
+
+static const struct dcn_hubp2_mask hubp_mask = {
+               HUBP_MASK_SH_LIST_DCN30(_MASK)
+};
+
+static const struct dcn_hubbub_registers hubbub_reg = {
+               HUBBUB_REG_LIST_DCN301(0)
+};
+
+static const struct dcn_hubbub_shift hubbub_shift = {
+               HUBBUB_MASK_SH_LIST_DCN301(__SHIFT)
+};
+
+static const struct dcn_hubbub_mask hubbub_mask = {
+               HUBBUB_MASK_SH_LIST_DCN301(_MASK)
+};
+
+static const struct dccg_registers dccg_regs = {
+               DCCG_REG_LIST_DCN301()
+};
+
+static const struct dccg_shift dccg_shift = {
+               DCCG_MASK_SH_LIST_DCN301(__SHIFT)
+};
+
+static const struct dccg_mask dccg_mask = {
+               DCCG_MASK_SH_LIST_DCN301(_MASK)
+};
+
+static const struct dce_hwseq_registers hwseq_reg = {
+               HWSEQ_DCN301_REG_LIST()
+};
+
+static const struct dce_hwseq_shift hwseq_shift = {
+               HWSEQ_DCN301_MASK_SH_LIST(__SHIFT)
+};
+
+static const struct dce_hwseq_mask hwseq_mask = {
+               HWSEQ_DCN301_MASK_SH_LIST(_MASK)
+};
+#define vmid_regs(id)\
+[id] = {\
+               DCN20_VMID_REG_LIST(id)\
+}
+
+static const struct dcn_vmid_registers vmid_regs[] = {
+       vmid_regs(0),
+       vmid_regs(1),
+       vmid_regs(2),
+       vmid_regs(3),
+       vmid_regs(4),
+       vmid_regs(5),
+       vmid_regs(6),
+       vmid_regs(7),
+       vmid_regs(8),
+       vmid_regs(9),
+       vmid_regs(10),
+       vmid_regs(11),
+       vmid_regs(12),
+       vmid_regs(13),
+       vmid_regs(14),
+       vmid_regs(15)
+};
+
+static const struct dcn20_vmid_shift vmid_shifts = {
+               DCN20_VMID_MASK_SH_LIST(__SHIFT)
+};
+
+static const struct dcn20_vmid_mask vmid_masks = {
+               DCN20_VMID_MASK_SH_LIST(_MASK)
+};
+
+static struct resource_caps res_cap_dcn301 = {
+       .num_timing_generator = 4,
+       .num_opp = 4,
+       .num_video_plane = 4,
+       .num_audio = 4,
+       .num_stream_encoder = 4,
+       .num_pll = 4,
+       .num_dwb = 1,
+       .num_ddc = 4,
+       .num_vmid = 16,
+       .num_mpc_3dlut = 2,
+       .num_dsc = 3,
+};
+
+static const struct dc_plane_cap plane_cap = {
+       .type = DC_PLANE_TYPE_DCN_UNIVERSAL,
+       .per_pixel_alpha = true,
+
+       .pixel_format_support = {
+                       .argb8888 = true,
+                       .nv12 = true,
+                       .fp16 = true,
+                       .p010 = true,
+                       .ayuv = false,
+       },
+
+       .max_upscale_factor = {
+                       .argb8888 = 16000,
+                       .nv12 = 16000,
+                       .fp16 = 16000
+       },
+
+       /* 6:1 downscaling ratio: 1000/6 = 166.666 */
+       .max_downscale_factor = {
+                       .argb8888 = 167,
+                       .nv12 = 167,
+                       .fp16 = 167 
+       },
+       64,
+       64
+};
+
+static const struct dc_debug_options debug_defaults_drv = {
+       .disable_dmcu = true,
+       .force_abm_enable = false,
+       .timing_trace = false,
+       .clock_trace = true,
+       .disable_dpp_power_gate = false,
+       .disable_hubp_power_gate = false,
+       .disable_clock_gate = true,
+       .disable_pplib_clock_request = true,
+       .disable_pplib_wm_range = true,
+       .pipe_split_policy = MPC_SPLIT_DYNAMIC,
+       .force_single_disp_pipe_split = false,
+       .disable_dcc = DCC_ENABLE,
+       .vsr_support = true,
+       .performance_trace = false,
+       .max_downscale_src_width = 7680,/*upto 8K*/
+       .scl_reset_length10 = true,
+       .sanity_checks = false,
+       .underflow_assert_delay_us = 0xFFFFFFFF,
+       .dwb_fi_phase = -1, // -1 = disable
+       .dmub_command_table = true,
+       .use_max_lb = false,
+       .exit_idle_opt_for_cursor_updates = true,
+       .using_dml2 = false,
+};
+
+static void dcn301_dpp_destroy(struct dpp **dpp)
+{
+       kfree(TO_DCN20_DPP(*dpp));
+       *dpp = NULL;
+}
+
+static struct dpp *dcn301_dpp_create(struct dc_context *ctx, uint32_t inst)
+{
+       struct dcn3_dpp *dpp =
+               kzalloc(sizeof(struct dcn3_dpp), GFP_KERNEL);
+
+       if (!dpp)
+               return NULL;
+
+       if (dpp3_construct(dpp, ctx, inst,
+                       &dpp_regs[inst], &tf_shift, &tf_mask))
+               return &dpp->base;
+
+       BREAK_TO_DEBUGGER();
+       kfree(dpp);
+       return NULL;
+}
+static struct output_pixel_processor *dcn301_opp_create(struct dc_context *ctx,
+                                                       uint32_t inst)
+{
+       struct dcn20_opp *opp =
+               kzalloc(sizeof(struct dcn20_opp), GFP_KERNEL);
+
+       if (!opp) {
+               BREAK_TO_DEBUGGER();
+               return NULL;
+       }
+
+       dcn20_opp_construct(opp, ctx, inst,
+                       &opp_regs[inst], &opp_shift, &opp_mask);
+       return &opp->base;
+}
+
+static struct dce_aux *dcn301_aux_engine_create(struct dc_context *ctx, uint32_t inst)
+{
+       struct aux_engine_dce110 *aux_engine =
+               kzalloc(sizeof(struct aux_engine_dce110), GFP_KERNEL);
+
+       if (!aux_engine)
+               return NULL;
+
+       dce110_aux_engine_construct(aux_engine, ctx, inst,
+                                   SW_AUX_TIMEOUT_PERIOD_MULTIPLIER * AUX_TIMEOUT_PERIOD,
+                                   &aux_engine_regs[inst],
+                                       &aux_mask,
+                                       &aux_shift,
+                                       ctx->dc->caps.extended_aux_timeout_support);
+
+       return &aux_engine->base;
+}
+#define i2c_inst_regs(id) { I2C_HW_ENGINE_COMMON_REG_LIST(id) }
+
+static const struct dce_i2c_registers i2c_hw_regs[] = {
+               i2c_inst_regs(1),
+               i2c_inst_regs(2),
+               i2c_inst_regs(3),
+               i2c_inst_regs(4),
+};
+
+static const struct dce_i2c_shift i2c_shifts = {
+               I2C_COMMON_MASK_SH_LIST_DCN2(__SHIFT)
+};
+
+static const struct dce_i2c_mask i2c_masks = {
+               I2C_COMMON_MASK_SH_LIST_DCN2(_MASK)
+};
+
+static struct dce_i2c_hw *dcn301_i2c_hw_create(struct dc_context *ctx, uint32_t inst)
+{
+       struct dce_i2c_hw *dce_i2c_hw =
+               kzalloc(sizeof(struct dce_i2c_hw), GFP_KERNEL);
+
+       if (!dce_i2c_hw)
+               return NULL;
+
+       dcn2_i2c_hw_construct(dce_i2c_hw, ctx, inst,
+                                   &i2c_hw_regs[inst], &i2c_shifts, &i2c_masks);
+
+       return dce_i2c_hw;
+}
+static struct mpc *dcn301_mpc_create(
+               struct dc_context *ctx,
+               int num_mpcc,
+               int num_rmu)
+{
+       struct dcn30_mpc *mpc30 = kzalloc(sizeof(struct dcn30_mpc),
+                                         GFP_KERNEL);
+
+       if (!mpc30)
+               return NULL;
+
+       dcn30_mpc_construct(mpc30, ctx,
+                       &mpc_regs,
+                       &mpc_shift,
+                       &mpc_mask,
+                       num_mpcc,
+                       num_rmu);
+
+       return &mpc30->base;
+}
+
+static struct hubbub *dcn301_hubbub_create(struct dc_context *ctx)
+{
+       int i;
+
+       struct dcn20_hubbub *hubbub3 = kzalloc(sizeof(struct dcn20_hubbub),
+                                         GFP_KERNEL);
+
+       if (!hubbub3)
+               return NULL;
+
+       hubbub301_construct(hubbub3, ctx,
+                       &hubbub_reg,
+                       &hubbub_shift,
+                       &hubbub_mask);
+
+
+       for (i = 0; i < res_cap_dcn301.num_vmid; i++) {
+               struct dcn20_vmid *vmid = &hubbub3->vmid[i];
+
+               vmid->ctx = ctx;
+
+               vmid->regs = &vmid_regs[i];
+               vmid->shifts = &vmid_shifts;
+               vmid->masks = &vmid_masks;
+       }
+
+       hubbub3->num_vmid = res_cap_dcn301.num_vmid;
+
+       return &hubbub3->base;
+}
+
+static struct timing_generator *dcn301_timing_generator_create(
+       struct dc_context *ctx, uint32_t instance)
+{
+       struct optc *tgn10 =
+               kzalloc(sizeof(struct optc), GFP_KERNEL);
+
+       if (!tgn10)
+               return NULL;
+
+       tgn10->base.inst = instance;
+       tgn10->base.ctx = ctx;
+
+       tgn10->tg_regs = &optc_regs[instance];
+       tgn10->tg_shift = &optc_shift;
+       tgn10->tg_mask = &optc_mask;
+
+       dcn301_timing_generator_init(tgn10);
+
+       return &tgn10->base;
+}
+
+static const struct encoder_feature_support link_enc_feature = {
+               .max_hdmi_deep_color = COLOR_DEPTH_121212,
+               .max_hdmi_pixel_clock = 600000,
+               .hdmi_ycbcr420_supported = true,
+               .dp_ycbcr420_supported = true,
+               .fec_supported = true,
+               .flags.bits.IS_HBR2_CAPABLE = true,
+               .flags.bits.IS_HBR3_CAPABLE = true,
+               .flags.bits.IS_TPS3_CAPABLE = true,
+               .flags.bits.IS_TPS4_CAPABLE = true
+};
+
+static struct link_encoder *dcn301_link_encoder_create(
+       struct dc_context *ctx,
+       const struct encoder_init_data *enc_init_data)
+{
+       struct dcn20_link_encoder *enc20 =
+               kzalloc(sizeof(struct dcn20_link_encoder), GFP_KERNEL);
+
+       if (!enc20)
+               return NULL;
+
+       dcn301_link_encoder_construct(enc20,
+                       enc_init_data,
+                       &link_enc_feature,
+                       &link_enc_regs[enc_init_data->transmitter],
+                       &link_enc_aux_regs[enc_init_data->channel - 1],
+                       &link_enc_hpd_regs[enc_init_data->hpd_source],
+                       &le_shift,
+                       &le_mask);
+
+       return &enc20->enc10.base;
+}
+
+static struct panel_cntl *dcn301_panel_cntl_create(const struct panel_cntl_init_data *init_data)
+{
+       struct dcn301_panel_cntl *panel_cntl =
+               kzalloc(sizeof(struct dcn301_panel_cntl), GFP_KERNEL);
+
+       if (!panel_cntl)
+               return NULL;
+
+       dcn301_panel_cntl_construct(panel_cntl,
+                       init_data,
+                       &panel_cntl_regs[init_data->inst],
+                       &panel_cntl_shift,
+                       &panel_cntl_mask);
+
+       return &panel_cntl->base;
+}
+
+
+#define CTX ctx
+
+#define REG(reg_name) \
+       (DCN_BASE.instance[0].segment[mm ## reg_name ## _BASE_IDX] + mm ## reg_name)
+
+static uint32_t read_pipe_fuses(struct dc_context *ctx)
+{
+       uint32_t value = REG_READ(CC_DC_PIPE_DIS);
+       /* RV1 support max 4 pipes */
+       value = value & 0xf;
+       return value;
+}
+
+
+static void read_dce_straps(
+       struct dc_context *ctx,
+       struct resource_straps *straps)
+{
+       generic_reg_get(ctx, mmDC_PINSTRAPS + BASE(mmDC_PINSTRAPS_BASE_IDX),
+               FN(DC_PINSTRAPS, DC_PINSTRAPS_AUDIO), &straps->dc_pinstraps_audio);
+
+}
+
+static struct audio *dcn301_create_audio(
+               struct dc_context *ctx, unsigned int inst)
+{
+       return dce_audio_create(ctx, inst,
+                       &audio_regs[inst], &audio_shift, &audio_mask);
+}
+
+static struct vpg *dcn301_vpg_create(
+       struct dc_context *ctx,
+       uint32_t inst)
+{
+       struct dcn30_vpg *vpg3 = kzalloc(sizeof(struct dcn30_vpg), GFP_KERNEL);
+
+       if (!vpg3)
+               return NULL;
+
+       vpg3_construct(vpg3, ctx, inst,
+                       &vpg_regs[inst],
+                       &vpg_shift,
+                       &vpg_mask);
+
+       return &vpg3->base;
+}
+
+static struct afmt *dcn301_afmt_create(
+       struct dc_context *ctx,
+       uint32_t inst)
+{
+       struct dcn30_afmt *afmt3 = kzalloc(sizeof(struct dcn30_afmt), GFP_KERNEL);
+
+       if (!afmt3)
+               return NULL;
+
+       afmt3_construct(afmt3, ctx, inst,
+                       &afmt_regs[inst],
+                       &afmt_shift,
+                       &afmt_mask);
+
+       return &afmt3->base;
+}
+
+static struct stream_encoder *dcn301_stream_encoder_create(enum engine_id eng_id,
+                                                          struct dc_context *ctx)
+{
+       struct dcn10_stream_encoder *enc1;
+       struct vpg *vpg;
+       struct afmt *afmt;
+       int vpg_inst;
+       int afmt_inst;
+
+       /* Mapping of VPG, AFMT, DME register blocks to DIO block instance */
+       if (eng_id <= ENGINE_ID_DIGF) {
+               vpg_inst = eng_id;
+               afmt_inst = eng_id;
+       } else
+               return NULL;
+
+       enc1 = kzalloc(sizeof(struct dcn10_stream_encoder), GFP_KERNEL);
+       vpg = dcn301_vpg_create(ctx, vpg_inst);
+       afmt = dcn301_afmt_create(ctx, afmt_inst);
+
+       if (!enc1 || !vpg || !afmt) {
+               kfree(enc1);
+               kfree(vpg);
+               kfree(afmt);
+               return NULL;
+       }
+
+       dcn30_dio_stream_encoder_construct(enc1, ctx, ctx->dc_bios,
+                                       eng_id, vpg, afmt,
+                                       &stream_enc_regs[eng_id],
+                                       &se_shift, &se_mask);
+
+       return &enc1->base;
+}
+
+static struct dce_hwseq *dcn301_hwseq_create(struct dc_context *ctx)
+{
+       struct dce_hwseq *hws = kzalloc(sizeof(struct dce_hwseq), GFP_KERNEL);
+
+       if (hws) {
+               hws->ctx = ctx;
+               hws->regs = &hwseq_reg;
+               hws->shifts = &hwseq_shift;
+               hws->masks = &hwseq_mask;
+       }
+       return hws;
+}
+static const struct resource_create_funcs res_create_funcs = {
+       .read_dce_straps = read_dce_straps,
+       .create_audio = dcn301_create_audio,
+       .create_stream_encoder = dcn301_stream_encoder_create,
+       .create_hwseq = dcn301_hwseq_create,
+};
+
+static void dcn301_destruct(struct dcn301_resource_pool *pool)
+{
+       unsigned int i;
+
+       for (i = 0; i < pool->base.stream_enc_count; i++) {
+               if (pool->base.stream_enc[i] != NULL) {
+                       if (pool->base.stream_enc[i]->vpg != NULL) {
+                               kfree(DCN30_VPG_FROM_VPG(pool->base.stream_enc[i]->vpg));
+                               pool->base.stream_enc[i]->vpg = NULL;
+                       }
+                       if (pool->base.stream_enc[i]->afmt != NULL) {
+                               kfree(DCN30_AFMT_FROM_AFMT(pool->base.stream_enc[i]->afmt));
+                               pool->base.stream_enc[i]->afmt = NULL;
+                       }
+                       kfree(DCN10STRENC_FROM_STRENC(pool->base.stream_enc[i]));
+                       pool->base.stream_enc[i] = NULL;
+               }
+       }
+
+       for (i = 0; i < pool->base.res_cap->num_dsc; i++) {
+               if (pool->base.dscs[i] != NULL)
+                       dcn20_dsc_destroy(&pool->base.dscs[i]);
+       }
+
+       if (pool->base.mpc != NULL) {
+               kfree(TO_DCN20_MPC(pool->base.mpc));
+               pool->base.mpc = NULL;
+       }
+       if (pool->base.hubbub != NULL) {
+               kfree(pool->base.hubbub);
+               pool->base.hubbub = NULL;
+       }
+       for (i = 0; i < pool->base.pipe_count; i++) {
+               if (pool->base.dpps[i] != NULL)
+                       dcn301_dpp_destroy(&pool->base.dpps[i]);
+
+               if (pool->base.ipps[i] != NULL)
+                       pool->base.ipps[i]->funcs->ipp_destroy(&pool->base.ipps[i]);
+
+               if (pool->base.hubps[i] != NULL) {
+                       kfree(TO_DCN20_HUBP(pool->base.hubps[i]));
+                       pool->base.hubps[i] = NULL;
+               }
+
+               if (pool->base.irqs != NULL) {
+                       dal_irq_service_destroy(&pool->base.irqs);
+               }
+       }
+
+       for (i = 0; i < pool->base.res_cap->num_ddc; i++) {
+               if (pool->base.engines[i] != NULL)
+                       dce110_engine_destroy(&pool->base.engines[i]);
+               if (pool->base.hw_i2cs[i] != NULL) {
+                       kfree(pool->base.hw_i2cs[i]);
+                       pool->base.hw_i2cs[i] = NULL;
+               }
+               if (pool->base.sw_i2cs[i] != NULL) {
+                       kfree(pool->base.sw_i2cs[i]);
+                       pool->base.sw_i2cs[i] = NULL;
+               }
+       }
+
+       for (i = 0; i < pool->base.res_cap->num_opp; i++) {
+               if (pool->base.opps[i] != NULL)
+                       pool->base.opps[i]->funcs->opp_destroy(&pool->base.opps[i]);
+       }
+
+       for (i = 0; i < pool->base.res_cap->num_timing_generator; i++) {
+               if (pool->base.timing_generators[i] != NULL)    {
+                       kfree(DCN10TG_FROM_TG(pool->base.timing_generators[i]));
+                       pool->base.timing_generators[i] = NULL;
+               }
+       }
+
+       for (i = 0; i < pool->base.res_cap->num_dwb; i++) {
+               if (pool->base.dwbc[i] != NULL) {
+                       kfree(TO_DCN30_DWBC(pool->base.dwbc[i]));
+                       pool->base.dwbc[i] = NULL;
+               }
+               if (pool->base.mcif_wb[i] != NULL) {
+                       kfree(TO_DCN30_MMHUBBUB(pool->base.mcif_wb[i]));
+                       pool->base.mcif_wb[i] = NULL;
+               }
+       }
+
+       for (i = 0; i < pool->base.audio_count; i++) {
+               if (pool->base.audios[i])
+                       dce_aud_destroy(&pool->base.audios[i]);
+       }
+
+       for (i = 0; i < pool->base.clk_src_count; i++) {
+               if (pool->base.clock_sources[i] != NULL) {
+                       dcn20_clock_source_destroy(&pool->base.clock_sources[i]);
+                       pool->base.clock_sources[i] = NULL;
+               }
+       }
+
+       for (i = 0; i < pool->base.res_cap->num_mpc_3dlut; i++) {
+               if (pool->base.mpc_lut[i] != NULL) {
+                       dc_3dlut_func_release(pool->base.mpc_lut[i]);
+                       pool->base.mpc_lut[i] = NULL;
+               }
+               if (pool->base.mpc_shaper[i] != NULL) {
+                       dc_transfer_func_release(pool->base.mpc_shaper[i]);
+                       pool->base.mpc_shaper[i] = NULL;
+               }
+       }
+
+       if (pool->base.dp_clock_source != NULL) {
+               dcn20_clock_source_destroy(&pool->base.dp_clock_source);
+               pool->base.dp_clock_source = NULL;
+       }
+
+       for (i = 0; i < pool->base.res_cap->num_timing_generator; i++) {
+               if (pool->base.multiple_abms[i] != NULL)
+                       dce_abm_destroy(&pool->base.multiple_abms[i]);
+       }
+
+       if (pool->base.dccg != NULL)
+               dcn_dccg_destroy(&pool->base.dccg);
+}
+
+static struct hubp *dcn301_hubp_create(struct dc_context *ctx, uint32_t inst)
+{
+       struct dcn20_hubp *hubp2 =
+               kzalloc(sizeof(struct dcn20_hubp), GFP_KERNEL);
+
+       if (!hubp2)
+               return NULL;
+
+       if (hubp3_construct(hubp2, ctx, inst,
+                       &hubp_regs[inst], &hubp_shift, &hubp_mask))
+               return &hubp2->base;
+
+       BREAK_TO_DEBUGGER();
+       kfree(hubp2);
+       return NULL;
+}
+
+static bool dcn301_dwbc_create(struct dc_context *ctx, struct resource_pool *pool)
+{
+       int i;
+       uint32_t pipe_count = pool->res_cap->num_dwb;
+
+       for (i = 0; i < pipe_count; i++) {
+               struct dcn30_dwbc *dwbc30 = kzalloc(sizeof(struct dcn30_dwbc),
+                                                   GFP_KERNEL);
+
+               if (!dwbc30) {
+                       dm_error("DC: failed to create dwbc30!\n");
+                       return false;
+               }
+
+               dcn30_dwbc_construct(dwbc30, ctx,
+                               &dwbc30_regs[i],
+                               &dwbc30_shift,
+                               &dwbc30_mask,
+                               i);
+
+               pool->dwbc[i] = &dwbc30->base;
+       }
+       return true;
+}
+
+static bool dcn301_mmhubbub_create(struct dc_context *ctx, struct resource_pool *pool)
+{
+       int i;
+       uint32_t pipe_count = pool->res_cap->num_dwb;
+
+       for (i = 0; i < pipe_count; i++) {
+               struct dcn30_mmhubbub *mcif_wb30 = kzalloc(sizeof(struct dcn30_mmhubbub),
+                                                   GFP_KERNEL);
+
+               if (!mcif_wb30) {
+                       dm_error("DC: failed to create mcif_wb30!\n");
+                       return false;
+               }
+
+               dcn30_mmhubbub_construct(mcif_wb30, ctx,
+                               &mcif_wb30_regs[i],
+                               &mcif_wb30_shift,
+                               &mcif_wb30_mask,
+                               i);
+
+               pool->mcif_wb[i] = &mcif_wb30->base;
+       }
+       return true;
+}
+
+static struct display_stream_compressor *dcn301_dsc_create(
+       struct dc_context *ctx, uint32_t inst)
+{
+       struct dcn20_dsc *dsc =
+               kzalloc(sizeof(struct dcn20_dsc), GFP_KERNEL);
+
+       if (!dsc) {
+               BREAK_TO_DEBUGGER();
+               return NULL;
+       }
+
+       dsc2_construct(dsc, ctx, inst, &dsc_regs[inst], &dsc_shift, &dsc_mask);
+       return &dsc->base;
+}
+
+
+static void dcn301_destroy_resource_pool(struct resource_pool **pool)
+{
+       struct dcn301_resource_pool *dcn301_pool = TO_DCN301_RES_POOL(*pool);
+
+       dcn301_destruct(dcn301_pool);
+       kfree(dcn301_pool);
+       *pool = NULL;
+}
+
+static struct clock_source *dcn301_clock_source_create(
+               struct dc_context *ctx,
+               struct dc_bios *bios,
+               enum clock_source_id id,
+               const struct dce110_clk_src_regs *regs,
+               bool dp_clk_src)
+{
+       struct dce110_clk_src *clk_src =
+               kzalloc(sizeof(struct dce110_clk_src), GFP_KERNEL);
+
+       if (!clk_src)
+               return NULL;
+
+       if (dcn301_clk_src_construct(clk_src, ctx, bios, id,
+                       regs, &cs_shift, &cs_mask)) {
+               clk_src->base.dp_clk_src = dp_clk_src;
+               return &clk_src->base;
+       }
+
+       kfree(clk_src);
+       BREAK_TO_DEBUGGER();
+       return NULL;
+}
+
+static struct dc_cap_funcs cap_funcs = {
+       .get_dcc_compression_cap = dcn20_get_dcc_compression_cap
+};
+
+
+static bool is_soc_bounding_box_valid(struct dc *dc)
+{
+       uint32_t hw_internal_rev = dc->ctx->asic_id.hw_internal_rev;
+
+       if (ASICREV_IS_VANGOGH(hw_internal_rev))
+               return true;
+
+       return false;
+}
+
+static bool init_soc_bounding_box(struct dc *dc,
+                                 struct dcn301_resource_pool *pool)
+{
+       struct _vcs_dpi_soc_bounding_box_st *loaded_bb = &dcn3_01_soc;
+       struct _vcs_dpi_ip_params_st *loaded_ip = &dcn3_01_ip;
+
+       DC_LOGGER_INIT(dc->ctx->logger);
+
+       if (!is_soc_bounding_box_valid(dc)) {
+               DC_LOG_ERROR("%s: not valid soc bounding box\n", __func__);
+               return false;
+       }
+
+       loaded_ip->max_num_otg = pool->base.res_cap->num_timing_generator;
+       loaded_ip->max_num_dpp = pool->base.pipe_count;
+       DC_FP_START();
+       dcn20_patch_bounding_box(dc, loaded_bb);
+       DC_FP_END();
+
+       if (dc->ctx->dc_bios->funcs->get_soc_bb_info) {
+               struct bp_soc_bb_info bb_info = {0};
+
+               if (dc->ctx->dc_bios->funcs->get_soc_bb_info(dc->ctx->dc_bios, &bb_info) == BP_RESULT_OK) {
+                       DC_FP_START();
+                       dcn301_fpu_init_soc_bounding_box(bb_info);
+                       DC_FP_END();
+               }
+       }
+
+       return true;
+}
+
+
+static void set_wm_ranges(
+               struct pp_smu_funcs *pp_smu,
+               struct _vcs_dpi_soc_bounding_box_st *loaded_bb)
+{
+       struct pp_smu_wm_range_sets ranges = {0};
+       int i;
+
+       ranges.num_reader_wm_sets = 0;
+
+       if (loaded_bb->num_states == 1) {
+               ranges.reader_wm_sets[0].wm_inst = 0;
+               ranges.reader_wm_sets[0].min_drain_clk_mhz = PP_SMU_WM_SET_RANGE_CLK_UNCONSTRAINED_MIN;
+               ranges.reader_wm_sets[0].max_drain_clk_mhz = PP_SMU_WM_SET_RANGE_CLK_UNCONSTRAINED_MAX;
+               ranges.reader_wm_sets[0].min_fill_clk_mhz = PP_SMU_WM_SET_RANGE_CLK_UNCONSTRAINED_MIN;
+               ranges.reader_wm_sets[0].max_fill_clk_mhz = PP_SMU_WM_SET_RANGE_CLK_UNCONSTRAINED_MAX;
+
+               ranges.num_reader_wm_sets = 1;
+       } else if (loaded_bb->num_states > 1) {
+               for (i = 0; i < 4 && i < loaded_bb->num_states; i++) {
+                       ranges.reader_wm_sets[i].wm_inst = i;
+                       ranges.reader_wm_sets[i].min_drain_clk_mhz = PP_SMU_WM_SET_RANGE_CLK_UNCONSTRAINED_MIN;
+                       ranges.reader_wm_sets[i].max_drain_clk_mhz = PP_SMU_WM_SET_RANGE_CLK_UNCONSTRAINED_MAX;
+                       DC_FP_START();
+                       dcn301_fpu_set_wm_ranges(i, &ranges, loaded_bb);
+                       DC_FP_END();
+                       ranges.num_reader_wm_sets = i + 1;
+               }
+
+               ranges.reader_wm_sets[0].min_fill_clk_mhz = PP_SMU_WM_SET_RANGE_CLK_UNCONSTRAINED_MIN;
+               ranges.reader_wm_sets[ranges.num_reader_wm_sets - 1].max_fill_clk_mhz = PP_SMU_WM_SET_RANGE_CLK_UNCONSTRAINED_MAX;
+       }
+
+       ranges.num_writer_wm_sets = 1;
+
+       ranges.writer_wm_sets[0].wm_inst = 0;
+       ranges.writer_wm_sets[0].min_fill_clk_mhz = PP_SMU_WM_SET_RANGE_CLK_UNCONSTRAINED_MIN;
+       ranges.writer_wm_sets[0].max_fill_clk_mhz = PP_SMU_WM_SET_RANGE_CLK_UNCONSTRAINED_MAX;
+       ranges.writer_wm_sets[0].min_drain_clk_mhz = PP_SMU_WM_SET_RANGE_CLK_UNCONSTRAINED_MIN;
+       ranges.writer_wm_sets[0].max_drain_clk_mhz = PP_SMU_WM_SET_RANGE_CLK_UNCONSTRAINED_MAX;
+
+       /* Notify PP Lib/SMU which Watermarks to use for which clock ranges */
+       pp_smu->nv_funcs.set_wm_ranges(&pp_smu->nv_funcs.pp_smu, &ranges);
+}
+
+static void dcn301_calculate_wm_and_dlg(
+               struct dc *dc, struct dc_state *context,
+               display_e2e_pipe_params_st *pipes,
+               int pipe_cnt,
+               int vlevel)
+{
+       DC_FP_START();
+       dcn301_calculate_wm_and_dlg_fp(dc, context, pipes, pipe_cnt, vlevel);
+       DC_FP_END();
+}
+
+static struct resource_funcs dcn301_res_pool_funcs = {
+       .destroy = dcn301_destroy_resource_pool,
+       .link_enc_create = dcn301_link_encoder_create,
+       .panel_cntl_create = dcn301_panel_cntl_create,
+       .validate_bandwidth = dcn30_validate_bandwidth,
+       .calculate_wm_and_dlg = dcn301_calculate_wm_and_dlg,
+       .update_soc_for_wm_a = dcn30_update_soc_for_wm_a,
+       .populate_dml_pipes = dcn30_populate_dml_pipes_from_context,
+       .acquire_free_pipe_as_secondary_dpp_pipe = dcn20_acquire_free_pipe_for_layer,
+       .release_pipe = dcn20_release_pipe,
+       .add_stream_to_ctx = dcn30_add_stream_to_ctx,
+       .add_dsc_to_stream_resource = dcn20_add_dsc_to_stream_resource,
+       .remove_stream_from_ctx = dcn20_remove_stream_from_ctx,
+       .populate_dml_writeback_from_context = dcn30_populate_dml_writeback_from_context,
+       .set_mcif_arb_params = dcn30_set_mcif_arb_params,
+       .find_first_free_match_stream_enc_for_link = dcn10_find_first_free_match_stream_enc_for_link,
+       .acquire_post_bldn_3dlut = dcn30_acquire_post_bldn_3dlut,
+       .release_post_bldn_3dlut = dcn30_release_post_bldn_3dlut,
+       .update_bw_bounding_box = dcn301_update_bw_bounding_box,
+       .patch_unknown_plane_state = dcn20_patch_unknown_plane_state
+};
+
+static bool dcn301_resource_construct(
+       uint8_t num_virtual_links,
+       struct dc *dc,
+       struct dcn301_resource_pool *pool)
+{
+       int i, j;
+       struct dc_context *ctx = dc->ctx;
+       struct irq_service_init_data init_data;
+       uint32_t pipe_fuses = read_pipe_fuses(ctx);
+       uint32_t num_pipes = 0;
+
+       DC_LOGGER_INIT(dc->ctx->logger);
+
+       ctx->dc_bios->regs = &bios_regs;
+
+       if (dc->ctx->asic_id.chip_id == DEVICE_ID_VGH_1435)
+               res_cap_dcn301.num_pll = 2;
+       pool->base.res_cap = &res_cap_dcn301;
+
+       pool->base.funcs = &dcn301_res_pool_funcs;
+
+       /*************************************************
+        *  Resource + asic cap harcoding                *
+        *************************************************/
+       pool->base.underlay_pipe_index = NO_UNDERLAY_PIPE;
+       pool->base.pipe_count = pool->base.res_cap->num_timing_generator;
+       pool->base.mpcc_count = pool->base.res_cap->num_timing_generator;
+       dc->caps.max_downscale_ratio = 600;
+       dc->caps.i2c_speed_in_khz = 100;
+       dc->caps.i2c_speed_in_khz_hdcp = 5; /*1.4 w/a enabled by default*/
+       dc->caps.max_cursor_size = 256;
+       dc->caps.min_horizontal_blanking_period = 80;
+       dc->caps.dmdata_alloc_size = 2048;
+       dc->caps.max_slave_planes = 2;
+       dc->caps.max_slave_yuv_planes = 2;
+       dc->caps.max_slave_rgb_planes = 2;
+       dc->caps.is_apu = true;
+       dc->caps.post_blend_color_processing = true;
+       dc->caps.force_dp_tps4_for_cp2520 = true;
+       dc->caps.extended_aux_timeout_support = true;
+       dc->caps.dmcub_support = true;
+
+       /* Color pipeline capabilities */
+       dc->caps.color.dpp.dcn_arch = 1;
+       dc->caps.color.dpp.input_lut_shared = 0;
+       dc->caps.color.dpp.icsc = 1;
+       dc->caps.color.dpp.dgam_ram = 0; // must use gamma_corr
+       dc->caps.color.dpp.dgam_rom_caps.srgb = 1;
+       dc->caps.color.dpp.dgam_rom_caps.bt2020 = 1;
+       dc->caps.color.dpp.dgam_rom_caps.gamma2_2 = 1;
+       dc->caps.color.dpp.dgam_rom_caps.pq = 1;
+       dc->caps.color.dpp.dgam_rom_caps.hlg = 1;
+       dc->caps.color.dpp.post_csc = 1;
+       dc->caps.color.dpp.gamma_corr = 1;
+       dc->caps.color.dpp.dgam_rom_for_yuv = 0;
+
+       dc->caps.color.dpp.hw_3d_lut = 1;
+       dc->caps.color.dpp.ogam_ram = 1;
+       // no OGAM ROM on DCN301
+       dc->caps.color.dpp.ogam_rom_caps.srgb = 0;
+       dc->caps.color.dpp.ogam_rom_caps.bt2020 = 0;
+       dc->caps.color.dpp.ogam_rom_caps.gamma2_2 = 0;
+       dc->caps.color.dpp.ogam_rom_caps.pq = 0;
+       dc->caps.color.dpp.ogam_rom_caps.hlg = 0;
+       dc->caps.color.dpp.ocsc = 0;
+
+       dc->caps.color.mpc.gamut_remap = 1;
+       dc->caps.color.mpc.num_3dluts = pool->base.res_cap->num_mpc_3dlut; //2
+       dc->caps.color.mpc.ogam_ram = 1;
+       dc->caps.color.mpc.ogam_rom_caps.srgb = 0;
+       dc->caps.color.mpc.ogam_rom_caps.bt2020 = 0;
+       dc->caps.color.mpc.ogam_rom_caps.gamma2_2 = 0;
+       dc->caps.color.mpc.ogam_rom_caps.pq = 0;
+       dc->caps.color.mpc.ogam_rom_caps.hlg = 0;
+       dc->caps.color.mpc.ocsc = 1;
+
+       dc->caps.dp_hdmi21_pcon_support = true;
+
+       /* read VBIOS LTTPR caps */
+       if (ctx->dc_bios->funcs->get_lttpr_caps) {
+               enum bp_result bp_query_result;
+               uint8_t is_vbios_lttpr_enable = 0;
+
+               bp_query_result = ctx->dc_bios->funcs->get_lttpr_caps(ctx->dc_bios, &is_vbios_lttpr_enable);
+               dc->caps.vbios_lttpr_enable = (bp_query_result == BP_RESULT_OK) && !!is_vbios_lttpr_enable;
+       }
+
+       if (ctx->dc_bios->funcs->get_lttpr_interop) {
+               enum bp_result bp_query_result;
+               uint8_t is_vbios_interop_enabled = 0;
+
+               bp_query_result = ctx->dc_bios->funcs->get_lttpr_interop(ctx->dc_bios, &is_vbios_interop_enabled);
+               dc->caps.vbios_lttpr_aware = (bp_query_result == BP_RESULT_OK) && !!is_vbios_interop_enabled;
+       }
+
+       if (dc->ctx->dce_environment == DCE_ENV_PRODUCTION_DRV)
+               dc->debug = debug_defaults_drv;
+
+       // Init the vm_helper
+       if (dc->vm_helper)
+               vm_helper_init(dc->vm_helper, 16);
+
+       /*************************************************
+        *  Create resources                             *
+        *************************************************/
+
+       /* Clock Sources for Pixel Clock*/
+       pool->base.clock_sources[DCN301_CLK_SRC_PLL0] =
+                       dcn301_clock_source_create(ctx, ctx->dc_bios,
+                               CLOCK_SOURCE_COMBO_PHY_PLL0,
+                               &clk_src_regs[0], false);
+       pool->base.clock_sources[DCN301_CLK_SRC_PLL1] =
+                       dcn301_clock_source_create(ctx, ctx->dc_bios,
+                               CLOCK_SOURCE_COMBO_PHY_PLL1,
+                               &clk_src_regs[1], false);
+       pool->base.clock_sources[DCN301_CLK_SRC_PLL2] =
+                       dcn301_clock_source_create(ctx, ctx->dc_bios,
+                               CLOCK_SOURCE_COMBO_PHY_PLL2,
+                               &clk_src_regs[2], false);
+       pool->base.clock_sources[DCN301_CLK_SRC_PLL3] =
+                       dcn301_clock_source_create(ctx, ctx->dc_bios,
+                               CLOCK_SOURCE_COMBO_PHY_PLL3,
+                               &clk_src_regs[3], false);
+
+       pool->base.clk_src_count = DCN301_CLK_SRC_TOTAL;
+
+       /* todo: not reuse phy_pll registers */
+       pool->base.dp_clock_source =
+                       dcn301_clock_source_create(ctx, ctx->dc_bios,
+                               CLOCK_SOURCE_ID_DP_DTO,
+                               &clk_src_regs[0], true);
+
+       for (i = 0; i < pool->base.clk_src_count; i++) {
+               if (pool->base.clock_sources[i] == NULL) {
+                       dm_error("DC: failed to create clock sources!\n");
+                       BREAK_TO_DEBUGGER();
+                       goto create_fail;
+               }
+       }
+
+       /* DCCG */
+       pool->base.dccg = dccg301_create(ctx, &dccg_regs, &dccg_shift, &dccg_mask);
+       if (pool->base.dccg == NULL) {
+               dm_error("DC: failed to create dccg!\n");
+               BREAK_TO_DEBUGGER();
+               goto create_fail;
+       }
+
+       init_soc_bounding_box(dc, pool);
+
+       if (!dc->debug.disable_pplib_wm_range && pool->base.pp_smu->nv_funcs.set_wm_ranges)
+               set_wm_ranges(pool->base.pp_smu, &dcn3_01_soc);
+
+       num_pipes = dcn3_01_ip.max_num_dpp;
+
+       for (i = 0; i < dcn3_01_ip.max_num_dpp; i++)
+               if (pipe_fuses & 1 << i)
+                       num_pipes--;
+       dcn3_01_ip.max_num_dpp = num_pipes;
+       dcn3_01_ip.max_num_otg = num_pipes;
+
+
+       dml_init_instance(&dc->dml, &dcn3_01_soc, &dcn3_01_ip, DML_PROJECT_DCN30);
+
+       /* IRQ */
+       init_data.ctx = dc->ctx;
+       pool->base.irqs = dal_irq_service_dcn30_create(&init_data);
+       if (!pool->base.irqs)
+               goto create_fail;
+
+       /* HUBBUB */
+       pool->base.hubbub = dcn301_hubbub_create(ctx);
+       if (pool->base.hubbub == NULL) {
+               BREAK_TO_DEBUGGER();
+               dm_error("DC: failed to create hubbub!\n");
+               goto create_fail;
+       }
+
+       j = 0;
+       /* HUBPs, DPPs, OPPs and TGs */
+       for (i = 0; i < pool->base.pipe_count; i++) {
+
+               /* if pipe is disabled, skip instance of HW pipe,
+                * i.e, skip ASIC register instance
+                */
+               if ((pipe_fuses & (1 << i)) != 0) {
+                       DC_LOG_DEBUG("%s: fusing pipe %d\n", __func__, i);
+                       continue;
+               }
+
+               pool->base.hubps[j] = dcn301_hubp_create(ctx, i);
+               if (pool->base.hubps[j] == NULL) {
+                       BREAK_TO_DEBUGGER();
+                       dm_error(
+                               "DC: failed to create hubps!\n");
+                       goto create_fail;
+               }
+
+               pool->base.dpps[j] = dcn301_dpp_create(ctx, i);
+               if (pool->base.dpps[j] == NULL) {
+                       BREAK_TO_DEBUGGER();
+                       dm_error(
+                               "DC: failed to create dpps!\n");
+                       goto create_fail;
+               }
+
+               pool->base.opps[j] = dcn301_opp_create(ctx, i);
+               if (pool->base.opps[j] == NULL) {
+                       BREAK_TO_DEBUGGER();
+                       dm_error(
+                               "DC: failed to create output pixel processor!\n");
+                       goto create_fail;
+               }
+
+               pool->base.timing_generators[j] = dcn301_timing_generator_create(ctx, i);
+               if (pool->base.timing_generators[j] == NULL) {
+                       BREAK_TO_DEBUGGER();
+                       dm_error("DC: failed to create tg!\n");
+                       goto create_fail;
+               }
+               j++;
+       }
+       pool->base.timing_generator_count = j;
+       pool->base.pipe_count = j;
+       pool->base.mpcc_count = j;
+
+       /* ABM (or ABMs for NV2x) */
+       /* TODO: */
+       for (i = 0; i < pool->base.res_cap->num_timing_generator; i++) {
+               pool->base.multiple_abms[i] = dmub_abm_create(ctx,
+                               &abm_regs[i],
+                               &abm_shift,
+                               &abm_mask);
+               if (pool->base.multiple_abms[i] == NULL) {
+                       dm_error("DC: failed to create abm for pipe %d!\n", i);
+                       BREAK_TO_DEBUGGER();
+                       goto create_fail;
+               }
+       }
+
+       /* MPC and DSC */
+       pool->base.mpc = dcn301_mpc_create(ctx, pool->base.mpcc_count, pool->base.res_cap->num_mpc_3dlut);
+       if (pool->base.mpc == NULL) {
+               BREAK_TO_DEBUGGER();
+               dm_error("DC: failed to create mpc!\n");
+               goto create_fail;
+       }
+
+       for (i = 0; i < pool->base.res_cap->num_dsc; i++) {
+               pool->base.dscs[i] = dcn301_dsc_create(ctx, i);
+               if (pool->base.dscs[i] == NULL) {
+                       BREAK_TO_DEBUGGER();
+                       dm_error("DC: failed to create display stream compressor %d!\n", i);
+                       goto create_fail;
+               }
+       }
+
+       /* DWB and MMHUBBUB */
+       if (!dcn301_dwbc_create(ctx, &pool->base)) {
+               BREAK_TO_DEBUGGER();
+               dm_error("DC: failed to create dwbc!\n");
+               goto create_fail;
+       }
+
+       if (!dcn301_mmhubbub_create(ctx, &pool->base)) {
+               BREAK_TO_DEBUGGER();
+               dm_error("DC: failed to create mcif_wb!\n");
+               goto create_fail;
+       }
+
+       /* AUX and I2C */
+       for (i = 0; i < pool->base.res_cap->num_ddc; i++) {
+               pool->base.engines[i] = dcn301_aux_engine_create(ctx, i);
+               if (pool->base.engines[i] == NULL) {
+                       BREAK_TO_DEBUGGER();
+                       dm_error(
+                               "DC:failed to create aux engine!!\n");
+                       goto create_fail;
+               }
+               pool->base.hw_i2cs[i] = dcn301_i2c_hw_create(ctx, i);
+               if (pool->base.hw_i2cs[i] == NULL) {
+                       BREAK_TO_DEBUGGER();
+                       dm_error(
+                               "DC:failed to create hw i2c!!\n");
+                       goto create_fail;
+               }
+               pool->base.sw_i2cs[i] = NULL;
+       }
+
+       /* Audio, Stream Encoders including HPO and virtual, MPC 3D LUTs */
+       if (!resource_construct(num_virtual_links, dc, &pool->base,
+                       &res_create_funcs))
+               goto create_fail;
+
+       /* HW Sequencer and Plane caps */
+       dcn301_hw_sequencer_construct(dc);
+
+       dc->caps.max_planes =  pool->base.pipe_count;
+
+       for (i = 0; i < dc->caps.max_planes; ++i)
+               dc->caps.planes[i] = plane_cap;
+
+       dc->cap_funcs = cap_funcs;
+
+       return true;
+
+create_fail:
+
+       dcn301_destruct(pool);
+
+       return false;
+}
+
+struct resource_pool *dcn301_create_resource_pool(
+               const struct dc_init_data *init_data,
+               struct dc *dc)
+{
+       struct dcn301_resource_pool *pool =
+               kzalloc(sizeof(struct dcn301_resource_pool), GFP_KERNEL);
+
+       if (!pool)
+               return NULL;
+
+       if (dcn301_resource_construct(init_data->num_virtual_links, dc, pool))
+               return &pool->base;
+
+       BREAK_TO_DEBUGGER();
+       kfree(pool);
+       return NULL;
+}
diff --git a/drivers/gpu/drm/amd/display/dc/resource/dcn301/dcn301_resource.h b/drivers/gpu/drm/amd/display/dc/resource/dcn301/dcn301_resource.h
new file mode 100644 (file)
index 0000000..ae86726
--- /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
+ *
+ */
+
+#ifndef _DCN301_RESOURCE_H_
+#define _DCN301_RESOURCE_H_
+
+#include "core_types.h"
+
+struct dc;
+struct resource_pool;
+struct _vcs_dpi_display_pipe_params_st;
+
+extern struct _vcs_dpi_ip_params_st dcn3_01_ip;
+extern struct _vcs_dpi_soc_bounding_box_st dcn3_01_soc;
+
+struct dcn301_resource_pool {
+       struct resource_pool base;
+};
+struct resource_pool *dcn301_create_resource_pool(
+               const struct dc_init_data *init_data,
+               struct dc *dc);
+
+#endif /* _DCN301_RESOURCE_H_ */
diff --git a/drivers/gpu/drm/amd/display/dc/resource/dcn302/dcn302_resource.c b/drivers/gpu/drm/amd/display/dc/resource/dcn302/dcn302_resource.c
new file mode 100644 (file)
index 0000000..5791b5c
--- /dev/null
@@ -0,0 +1,1518 @@
+/*
+ * 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
+ *
+ */
+
+#include "dcn302/dcn302_init.h"
+#include "dcn302_resource.h"
+#include "dcn302/dcn302_dccg.h"
+#include "irq/dcn302/irq_service_dcn302.h"
+
+#include "dcn30/dcn30_dio_link_encoder.h"
+#include "dcn30/dcn30_dio_stream_encoder.h"
+#include "dcn30/dcn30_dwb.h"
+#include "dcn30/dcn30_dpp.h"
+#include "dcn30/dcn30_hubbub.h"
+#include "dcn30/dcn30_hubp.h"
+#include "dcn30/dcn30_mmhubbub.h"
+#include "dcn30/dcn30_mpc.h"
+#include "dcn30/dcn30_opp.h"
+#include "dcn30/dcn30_optc.h"
+#include "dcn30/dcn30_resource.h"
+
+#include "dcn20/dcn20_dsc.h"
+#include "dcn20/dcn20_resource.h"
+
+#include "dml/dcn30/dcn30_fpu.h"
+
+#include "dcn10/dcn10_resource.h"
+
+#include "link.h"
+#include "dce/dce_abm.h"
+#include "dce/dce_audio.h"
+#include "dce/dce_aux.h"
+#include "dce/dce_clock_source.h"
+#include "dce/dce_hwseq.h"
+#include "dce/dce_i2c_hw.h"
+#include "dce/dce_panel_cntl.h"
+#include "dce/dmub_abm.h"
+#include "dce/dmub_psr.h"
+#include "clk_mgr.h"
+
+#include "hw_sequencer_private.h"
+#include "reg_helper.h"
+#include "resource.h"
+#include "vm_helper.h"
+
+#include "dml/dcn302/dcn302_fpu.h"
+
+#include "dimgrey_cavefish_ip_offset.h"
+#include "dcn/dcn_3_0_2_offset.h"
+#include "dcn/dcn_3_0_2_sh_mask.h"
+#include "dpcs/dpcs_3_0_0_offset.h"
+#include "dpcs/dpcs_3_0_0_sh_mask.h"
+#include "nbio/nbio_7_4_offset.h"
+#include "amdgpu_socbb.h"
+
+#define DC_LOGGER \
+       dc->ctx->logger
+#define DC_LOGGER_INIT(logger)
+
+static const struct dc_debug_options debug_defaults_drv = {
+               .disable_dmcu = true,
+               .force_abm_enable = false,
+               .timing_trace = false,
+               .clock_trace = true,
+               .disable_pplib_clock_request = true,
+               .pipe_split_policy = MPC_SPLIT_DYNAMIC,
+               .force_single_disp_pipe_split = false,
+               .disable_dcc = DCC_ENABLE,
+               .vsr_support = true,
+               .performance_trace = false,
+               .max_downscale_src_width = 7680,/*upto 8K*/
+               .disable_pplib_wm_range = false,
+               .scl_reset_length10 = true,
+               .sanity_checks = false,
+               .underflow_assert_delay_us = 0xFFFFFFFF,
+               .dwb_fi_phase = -1, // -1 = disable,
+               .dmub_command_table = true,
+               .use_max_lb = true,
+               .exit_idle_opt_for_cursor_updates = true,
+               .enable_legacy_fast_update = false,
+               .using_dml2 = false,
+};
+
+static const struct dc_panel_config panel_config_defaults = {
+               .psr = {
+                       .disable_psr = false,
+                       .disallow_psrsu = false,
+                       .disallow_replay = false,
+               },
+};
+
+enum dcn302_clk_src_array_id {
+       DCN302_CLK_SRC_PLL0,
+       DCN302_CLK_SRC_PLL1,
+       DCN302_CLK_SRC_PLL2,
+       DCN302_CLK_SRC_PLL3,
+       DCN302_CLK_SRC_PLL4,
+       DCN302_CLK_SRC_TOTAL
+};
+
+static const struct resource_caps res_cap_dcn302 = {
+               .num_timing_generator = 5,
+               .num_opp = 5,
+               .num_video_plane = 5,
+               .num_audio = 5,
+               .num_stream_encoder = 5,
+               .num_dwb = 1,
+               .num_ddc = 5,
+               .num_vmid = 16,
+               .num_mpc_3dlut = 2,
+               .num_dsc = 5,
+};
+
+static const struct dc_plane_cap plane_cap = {
+               .type = DC_PLANE_TYPE_DCN_UNIVERSAL,
+               .per_pixel_alpha = true,
+               .pixel_format_support = {
+                               .argb8888 = true,
+                               .nv12 = true,
+                               .fp16 = true,
+                               .p010 = true,
+                               .ayuv = false,
+               },
+               .max_upscale_factor = {
+                               .argb8888 = 16000,
+                               .nv12 = 16000,
+                               .fp16 = 16000
+               },
+               /* 6:1 downscaling ratio: 1000/6 = 166.666 */
+               .max_downscale_factor = {
+                               .argb8888 = 167,
+                               .nv12 = 167,
+                               .fp16 = 167
+               },
+               16,
+               16
+};
+
+/* NBIO */
+#define NBIO_BASE_INNER(seg) \
+               NBIO_BASE__INST0_SEG ## seg
+
+#define NBIO_BASE(seg) \
+               NBIO_BASE_INNER(seg)
+
+#define NBIO_SR(reg_name)\
+               .reg_name = NBIO_BASE(mm ## reg_name ## _BASE_IDX) + \
+               mm ## reg_name
+
+/* DCN */
+#define BASE_INNER(seg) DCN_BASE__INST0_SEG ## seg
+
+#define BASE(seg) BASE_INNER(seg)
+
+#define SR(reg_name)\
+               .reg_name = BASE(mm ## reg_name ## _BASE_IDX) + mm ## reg_name
+
+#define SF(reg_name, field_name, post_fix)\
+               .field_name = reg_name ## __ ## field_name ## post_fix
+
+#define SRI(reg_name, block, id)\
+               .reg_name = BASE(mm ## block ## id ## _ ## reg_name ## _BASE_IDX) + mm ## block ## id ## _ ## reg_name
+
+#define SRI2(reg_name, block, id)\
+               .reg_name = BASE(mm ## reg_name ## _BASE_IDX) + mm ## reg_name
+
+#define SRII(reg_name, block, id)\
+               .reg_name[id] = BASE(mm ## block ## id ## _ ## reg_name ## _BASE_IDX) + \
+               mm ## block ## id ## _ ## reg_name
+
+#define DCCG_SRII(reg_name, block, id)\
+               .block ## _ ## reg_name[id] = BASE(mm ## block ## id ## _ ## reg_name ## _BASE_IDX) + \
+               mm ## block ## id ## _ ## reg_name
+
+#define VUPDATE_SRII(reg_name, block, id)\
+               .reg_name[id] = BASE(mm ## reg_name ## _ ## block ## id ## _BASE_IDX) + \
+               mm ## reg_name ## _ ## block ## id
+
+#define SRII_DWB(reg_name, temp_name, block, id)\
+               .reg_name[id] = BASE(mm ## block ## id ## _ ## temp_name ## _BASE_IDX) + \
+               mm ## block ## id ## _ ## temp_name
+
+#define SF_DWB2(reg_name, block, id, field_name, post_fix)     \
+       .field_name = reg_name ## __ ## field_name ## post_fix
+
+#define SRII_MPC_RMU(reg_name, block, id)\
+               .RMU##_##reg_name[id] = BASE(mm ## block ## id ## _ ## reg_name ## _BASE_IDX) + \
+               mm ## block ## id ## _ ## reg_name
+
+static const struct dcn_hubbub_registers hubbub_reg = {
+               HUBBUB_REG_LIST_DCN30(0)
+};
+
+static const struct dcn_hubbub_shift hubbub_shift = {
+               HUBBUB_MASK_SH_LIST_DCN30(__SHIFT)
+};
+
+static const struct dcn_hubbub_mask hubbub_mask = {
+               HUBBUB_MASK_SH_LIST_DCN30(_MASK)
+};
+
+#define vmid_regs(id)\
+               [id] = { DCN20_VMID_REG_LIST(id) }
+
+static const struct dcn_vmid_registers vmid_regs[] = {
+               vmid_regs(0),
+               vmid_regs(1),
+               vmid_regs(2),
+               vmid_regs(3),
+               vmid_regs(4),
+               vmid_regs(5),
+               vmid_regs(6),
+               vmid_regs(7),
+               vmid_regs(8),
+               vmid_regs(9),
+               vmid_regs(10),
+               vmid_regs(11),
+               vmid_regs(12),
+               vmid_regs(13),
+               vmid_regs(14),
+               vmid_regs(15)
+};
+
+static const struct dcn20_vmid_shift vmid_shifts = {
+               DCN20_VMID_MASK_SH_LIST(__SHIFT)
+};
+
+static const struct dcn20_vmid_mask vmid_masks = {
+               DCN20_VMID_MASK_SH_LIST(_MASK)
+};
+
+static struct hubbub *dcn302_hubbub_create(struct dc_context *ctx)
+{
+       int i;
+
+       struct dcn20_hubbub *hubbub3 = kzalloc(sizeof(struct dcn20_hubbub), GFP_KERNEL);
+
+       if (!hubbub3)
+               return NULL;
+
+       hubbub3_construct(hubbub3, ctx, &hubbub_reg, &hubbub_shift, &hubbub_mask);
+
+       for (i = 0; i < res_cap_dcn302.num_vmid; i++) {
+               struct dcn20_vmid *vmid = &hubbub3->vmid[i];
+
+               vmid->ctx = ctx;
+
+               vmid->regs = &vmid_regs[i];
+               vmid->shifts = &vmid_shifts;
+               vmid->masks = &vmid_masks;
+       }
+
+       return &hubbub3->base;
+}
+
+#define vpg_regs(id)\
+               [id] = { VPG_DCN3_REG_LIST(id) }
+
+static const struct dcn30_vpg_registers vpg_regs[] = {
+               vpg_regs(0),
+               vpg_regs(1),
+               vpg_regs(2),
+               vpg_regs(3),
+               vpg_regs(4),
+               vpg_regs(5)
+};
+
+static const struct dcn30_vpg_shift vpg_shift = {
+               DCN3_VPG_MASK_SH_LIST(__SHIFT)
+};
+
+static const struct dcn30_vpg_mask vpg_mask = {
+               DCN3_VPG_MASK_SH_LIST(_MASK)
+};
+
+static struct vpg *dcn302_vpg_create(struct dc_context *ctx, uint32_t inst)
+{
+       struct dcn30_vpg *vpg3 = kzalloc(sizeof(struct dcn30_vpg), GFP_KERNEL);
+
+       if (!vpg3)
+               return NULL;
+
+       vpg3_construct(vpg3, ctx, inst, &vpg_regs[inst], &vpg_shift, &vpg_mask);
+
+       return &vpg3->base;
+}
+
+#define afmt_regs(id)\
+               [id] = { AFMT_DCN3_REG_LIST(id) }
+
+static const struct dcn30_afmt_registers afmt_regs[] = {
+               afmt_regs(0),
+               afmt_regs(1),
+               afmt_regs(2),
+               afmt_regs(3),
+               afmt_regs(4),
+               afmt_regs(5)
+};
+
+static const struct dcn30_afmt_shift afmt_shift = {
+               DCN3_AFMT_MASK_SH_LIST(__SHIFT)
+};
+
+static const struct dcn30_afmt_mask afmt_mask = {
+               DCN3_AFMT_MASK_SH_LIST(_MASK)
+};
+
+static struct afmt *dcn302_afmt_create(struct dc_context *ctx, uint32_t inst)
+{
+       struct dcn30_afmt *afmt3 = kzalloc(sizeof(struct dcn30_afmt), GFP_KERNEL);
+
+       if (!afmt3)
+               return NULL;
+
+       afmt3_construct(afmt3, ctx, inst, &afmt_regs[inst], &afmt_shift, &afmt_mask);
+
+       return &afmt3->base;
+}
+
+#define audio_regs(id)\
+               [id] = { AUD_COMMON_REG_LIST(id) }
+
+static const struct dce_audio_registers audio_regs[] = {
+               audio_regs(0),
+               audio_regs(1),
+               audio_regs(2),
+               audio_regs(3),
+               audio_regs(4),
+               audio_regs(5),
+               audio_regs(6)
+};
+
+#define DCE120_AUD_COMMON_MASK_SH_LIST(mask_sh)\
+               SF(AZF0ENDPOINT0_AZALIA_F0_CODEC_ENDPOINT_INDEX, AZALIA_ENDPOINT_REG_INDEX, mask_sh),\
+               SF(AZF0ENDPOINT0_AZALIA_F0_CODEC_ENDPOINT_DATA, AZALIA_ENDPOINT_REG_DATA, mask_sh),\
+               AUD_COMMON_MASK_SH_LIST_BASE(mask_sh)
+
+static const struct dce_audio_shift audio_shift = {
+               DCE120_AUD_COMMON_MASK_SH_LIST(__SHIFT)
+};
+
+static const struct dce_audio_mask audio_mask = {
+               DCE120_AUD_COMMON_MASK_SH_LIST(_MASK)
+};
+
+static struct audio *dcn302_create_audio(struct dc_context *ctx, unsigned int inst)
+{
+       return dce_audio_create(ctx, inst, &audio_regs[inst], &audio_shift, &audio_mask);
+}
+
+#define stream_enc_regs(id)\
+               [id] = { SE_DCN3_REG_LIST(id) }
+
+static const struct dcn10_stream_enc_registers stream_enc_regs[] = {
+               stream_enc_regs(0),
+               stream_enc_regs(1),
+               stream_enc_regs(2),
+               stream_enc_regs(3),
+               stream_enc_regs(4)
+};
+
+static const struct dcn10_stream_encoder_shift se_shift = {
+               SE_COMMON_MASK_SH_LIST_DCN30(__SHIFT)
+};
+
+static const struct dcn10_stream_encoder_mask se_mask = {
+               SE_COMMON_MASK_SH_LIST_DCN30(_MASK)
+};
+
+static struct stream_encoder *dcn302_stream_encoder_create(enum engine_id eng_id, struct dc_context *ctx)
+{
+       struct dcn10_stream_encoder *enc1;
+       struct vpg *vpg;
+       struct afmt *afmt;
+       int vpg_inst;
+       int afmt_inst;
+
+       /* Mapping of VPG, AFMT, DME register blocks to DIO block instance */
+       if (eng_id <= ENGINE_ID_DIGE) {
+               vpg_inst = eng_id;
+               afmt_inst = eng_id;
+       } else
+               return NULL;
+
+       enc1 = kzalloc(sizeof(struct dcn10_stream_encoder), GFP_KERNEL);
+       vpg = dcn302_vpg_create(ctx, vpg_inst);
+       afmt = dcn302_afmt_create(ctx, afmt_inst);
+
+       if (!enc1 || !vpg || !afmt) {
+               kfree(enc1);
+               kfree(vpg);
+               kfree(afmt);
+               return NULL;
+       }
+
+       dcn30_dio_stream_encoder_construct(enc1, ctx, ctx->dc_bios, eng_id, vpg, afmt, &stream_enc_regs[eng_id],
+                       &se_shift, &se_mask);
+
+       return &enc1->base;
+}
+
+#define clk_src_regs(index, pllid)\
+               [index] = { CS_COMMON_REG_LIST_DCN3_02(index, pllid) }
+
+static const struct dce110_clk_src_regs clk_src_regs[] = {
+               clk_src_regs(0, A),
+               clk_src_regs(1, B),
+               clk_src_regs(2, C),
+               clk_src_regs(3, D),
+               clk_src_regs(4, E)
+};
+
+static const struct dce110_clk_src_shift cs_shift = {
+               CS_COMMON_MASK_SH_LIST_DCN2_0(__SHIFT)
+};
+
+static const struct dce110_clk_src_mask cs_mask = {
+               CS_COMMON_MASK_SH_LIST_DCN2_0(_MASK)
+};
+
+static struct clock_source *dcn302_clock_source_create(struct dc_context *ctx, struct dc_bios *bios,
+               enum clock_source_id id, const struct dce110_clk_src_regs *regs, bool dp_clk_src)
+{
+       struct dce110_clk_src *clk_src = kzalloc(sizeof(struct dce110_clk_src), GFP_KERNEL);
+
+       if (!clk_src)
+               return NULL;
+
+       if (dcn3_clk_src_construct(clk_src, ctx, bios, id, regs, &cs_shift, &cs_mask)) {
+               clk_src->base.dp_clk_src = dp_clk_src;
+               return &clk_src->base;
+       }
+
+       kfree(clk_src);
+       BREAK_TO_DEBUGGER();
+       return NULL;
+}
+
+static const struct dce_hwseq_registers hwseq_reg = {
+               HWSEQ_DCN302_REG_LIST()
+};
+
+static const struct dce_hwseq_shift hwseq_shift = {
+               HWSEQ_DCN302_MASK_SH_LIST(__SHIFT)
+};
+
+static const struct dce_hwseq_mask hwseq_mask = {
+               HWSEQ_DCN302_MASK_SH_LIST(_MASK)
+};
+
+static struct dce_hwseq *dcn302_hwseq_create(struct dc_context *ctx)
+{
+       struct dce_hwseq *hws = kzalloc(sizeof(struct dce_hwseq), GFP_KERNEL);
+
+       if (hws) {
+               hws->ctx = ctx;
+               hws->regs = &hwseq_reg;
+               hws->shifts = &hwseq_shift;
+               hws->masks = &hwseq_mask;
+       }
+       return hws;
+}
+
+#define hubp_regs(id)\
+               [id] = { HUBP_REG_LIST_DCN30(id) }
+
+static const struct dcn_hubp2_registers hubp_regs[] = {
+               hubp_regs(0),
+               hubp_regs(1),
+               hubp_regs(2),
+               hubp_regs(3),
+               hubp_regs(4)
+};
+
+static const struct dcn_hubp2_shift hubp_shift = {
+               HUBP_MASK_SH_LIST_DCN30(__SHIFT)
+};
+
+static const struct dcn_hubp2_mask hubp_mask = {
+               HUBP_MASK_SH_LIST_DCN30(_MASK)
+};
+
+static struct hubp *dcn302_hubp_create(struct dc_context *ctx, uint32_t inst)
+{
+       struct dcn20_hubp *hubp2 = kzalloc(sizeof(struct dcn20_hubp), GFP_KERNEL);
+
+       if (!hubp2)
+               return NULL;
+
+       if (hubp3_construct(hubp2, ctx, inst, &hubp_regs[inst], &hubp_shift, &hubp_mask))
+               return &hubp2->base;
+
+       BREAK_TO_DEBUGGER();
+       kfree(hubp2);
+       return NULL;
+}
+
+#define dpp_regs(id)\
+               [id] = { DPP_REG_LIST_DCN30(id) }
+
+static const struct dcn3_dpp_registers dpp_regs[] = {
+               dpp_regs(0),
+               dpp_regs(1),
+               dpp_regs(2),
+               dpp_regs(3),
+               dpp_regs(4)
+};
+
+static const struct dcn3_dpp_shift tf_shift = {
+               DPP_REG_LIST_SH_MASK_DCN30(__SHIFT)
+};
+
+static const struct dcn3_dpp_mask tf_mask = {
+               DPP_REG_LIST_SH_MASK_DCN30(_MASK)
+};
+
+static struct dpp *dcn302_dpp_create(struct dc_context *ctx, uint32_t inst)
+{
+       struct dcn3_dpp *dpp = kzalloc(sizeof(struct dcn3_dpp), GFP_KERNEL);
+
+       if (!dpp)
+               return NULL;
+
+       if (dpp3_construct(dpp, ctx, inst, &dpp_regs[inst], &tf_shift, &tf_mask))
+               return &dpp->base;
+
+       BREAK_TO_DEBUGGER();
+       kfree(dpp);
+       return NULL;
+}
+
+#define opp_regs(id)\
+               [id] = { OPP_REG_LIST_DCN30(id) }
+
+static const struct dcn20_opp_registers opp_regs[] = {
+               opp_regs(0),
+               opp_regs(1),
+               opp_regs(2),
+               opp_regs(3),
+               opp_regs(4)
+};
+
+static const struct dcn20_opp_shift opp_shift = {
+               OPP_MASK_SH_LIST_DCN20(__SHIFT)
+};
+
+static const struct dcn20_opp_mask opp_mask = {
+               OPP_MASK_SH_LIST_DCN20(_MASK)
+};
+
+static struct output_pixel_processor *dcn302_opp_create(struct dc_context *ctx, uint32_t inst)
+{
+       struct dcn20_opp *opp = kzalloc(sizeof(struct dcn20_opp), GFP_KERNEL);
+
+       if (!opp) {
+               BREAK_TO_DEBUGGER();
+               return NULL;
+       }
+
+       dcn20_opp_construct(opp, ctx, inst, &opp_regs[inst], &opp_shift, &opp_mask);
+       return &opp->base;
+}
+
+#define optc_regs(id)\
+               [id] = { OPTC_COMMON_REG_LIST_DCN3_0(id) }
+
+static const struct dcn_optc_registers optc_regs[] = {
+               optc_regs(0),
+               optc_regs(1),
+               optc_regs(2),
+               optc_regs(3),
+               optc_regs(4)
+};
+
+static const struct dcn_optc_shift optc_shift = {
+               OPTC_COMMON_MASK_SH_LIST_DCN30(__SHIFT)
+};
+
+static const struct dcn_optc_mask optc_mask = {
+               OPTC_COMMON_MASK_SH_LIST_DCN30(_MASK)
+};
+
+static struct timing_generator *dcn302_timing_generator_create(struct dc_context *ctx, uint32_t instance)
+{
+       struct optc *tgn10 = kzalloc(sizeof(struct optc), GFP_KERNEL);
+
+       if (!tgn10)
+               return NULL;
+
+       tgn10->base.inst = instance;
+       tgn10->base.ctx = ctx;
+
+       tgn10->tg_regs = &optc_regs[instance];
+       tgn10->tg_shift = &optc_shift;
+       tgn10->tg_mask = &optc_mask;
+
+       dcn30_timing_generator_init(tgn10);
+
+       return &tgn10->base;
+}
+
+static const struct dcn30_mpc_registers mpc_regs = {
+               MPC_REG_LIST_DCN3_0(0),
+               MPC_REG_LIST_DCN3_0(1),
+               MPC_REG_LIST_DCN3_0(2),
+               MPC_REG_LIST_DCN3_0(3),
+               MPC_REG_LIST_DCN3_0(4),
+               MPC_OUT_MUX_REG_LIST_DCN3_0(0),
+               MPC_OUT_MUX_REG_LIST_DCN3_0(1),
+               MPC_OUT_MUX_REG_LIST_DCN3_0(2),
+               MPC_OUT_MUX_REG_LIST_DCN3_0(3),
+               MPC_OUT_MUX_REG_LIST_DCN3_0(4),
+               MPC_RMU_GLOBAL_REG_LIST_DCN3AG,
+               MPC_RMU_REG_LIST_DCN3AG(0),
+               MPC_RMU_REG_LIST_DCN3AG(1),
+               MPC_RMU_REG_LIST_DCN3AG(2),
+               MPC_DWB_MUX_REG_LIST_DCN3_0(0),
+};
+
+static const struct dcn30_mpc_shift mpc_shift = {
+               MPC_COMMON_MASK_SH_LIST_DCN30(__SHIFT)
+};
+
+static const struct dcn30_mpc_mask mpc_mask = {
+               MPC_COMMON_MASK_SH_LIST_DCN30(_MASK)
+};
+
+static struct mpc *dcn302_mpc_create(struct dc_context *ctx, int num_mpcc, int num_rmu)
+{
+       struct dcn30_mpc *mpc30 = kzalloc(sizeof(struct dcn30_mpc), GFP_KERNEL);
+
+       if (!mpc30)
+               return NULL;
+
+       dcn30_mpc_construct(mpc30, ctx, &mpc_regs, &mpc_shift, &mpc_mask, num_mpcc, num_rmu);
+
+       return &mpc30->base;
+}
+
+#define dsc_regsDCN20(id)\
+[id] = { DSC_REG_LIST_DCN20(id) }
+
+static const struct dcn20_dsc_registers dsc_regs[] = {
+               dsc_regsDCN20(0),
+               dsc_regsDCN20(1),
+               dsc_regsDCN20(2),
+               dsc_regsDCN20(3),
+               dsc_regsDCN20(4)
+};
+
+static const struct dcn20_dsc_shift dsc_shift = {
+               DSC_REG_LIST_SH_MASK_DCN20(__SHIFT)
+};
+
+static const struct dcn20_dsc_mask dsc_mask = {
+               DSC_REG_LIST_SH_MASK_DCN20(_MASK)
+};
+
+static struct display_stream_compressor *dcn302_dsc_create(struct dc_context *ctx, uint32_t inst)
+{
+       struct dcn20_dsc *dsc = kzalloc(sizeof(struct dcn20_dsc), GFP_KERNEL);
+
+       if (!dsc) {
+               BREAK_TO_DEBUGGER();
+               return NULL;
+       }
+
+       dsc2_construct(dsc, ctx, inst, &dsc_regs[inst], &dsc_shift, &dsc_mask);
+       return &dsc->base;
+}
+
+#define dwbc_regs_dcn3(id)\
+[id] = { DWBC_COMMON_REG_LIST_DCN30(id) }
+
+static const struct dcn30_dwbc_registers dwbc30_regs[] = {
+               dwbc_regs_dcn3(0)
+};
+
+static const struct dcn30_dwbc_shift dwbc30_shift = {
+               DWBC_COMMON_MASK_SH_LIST_DCN30(__SHIFT)
+};
+
+static const struct dcn30_dwbc_mask dwbc30_mask = {
+               DWBC_COMMON_MASK_SH_LIST_DCN30(_MASK)
+};
+
+static bool dcn302_dwbc_create(struct dc_context *ctx, struct resource_pool *pool)
+{
+       int i;
+       uint32_t pipe_count = pool->res_cap->num_dwb;
+
+       for (i = 0; i < pipe_count; i++) {
+               struct dcn30_dwbc *dwbc30 = kzalloc(sizeof(struct dcn30_dwbc), GFP_KERNEL);
+
+               if (!dwbc30) {
+                       dm_error("DC: failed to create dwbc30!\n");
+                       return false;
+               }
+
+               dcn30_dwbc_construct(dwbc30, ctx, &dwbc30_regs[i], &dwbc30_shift, &dwbc30_mask, i);
+
+               pool->dwbc[i] = &dwbc30->base;
+       }
+       return true;
+}
+
+#define mcif_wb_regs_dcn3(id)\
+[id] = { MCIF_WB_COMMON_REG_LIST_DCN30(id) }
+
+static const struct dcn30_mmhubbub_registers mcif_wb30_regs[] = {
+               mcif_wb_regs_dcn3(0)
+};
+
+static const struct dcn30_mmhubbub_shift mcif_wb30_shift = {
+               MCIF_WB_COMMON_MASK_SH_LIST_DCN30(__SHIFT)
+};
+
+static const struct dcn30_mmhubbub_mask mcif_wb30_mask = {
+               MCIF_WB_COMMON_MASK_SH_LIST_DCN30(_MASK)
+};
+
+static bool dcn302_mmhubbub_create(struct dc_context *ctx, struct resource_pool *pool)
+{
+       int i;
+       uint32_t pipe_count = pool->res_cap->num_dwb;
+
+       for (i = 0; i < pipe_count; i++) {
+               struct dcn30_mmhubbub *mcif_wb30 = kzalloc(sizeof(struct dcn30_mmhubbub), GFP_KERNEL);
+
+               if (!mcif_wb30) {
+                       dm_error("DC: failed to create mcif_wb30!\n");
+                       return false;
+               }
+
+               dcn30_mmhubbub_construct(mcif_wb30, ctx, &mcif_wb30_regs[i], &mcif_wb30_shift, &mcif_wb30_mask, i);
+
+               pool->mcif_wb[i] = &mcif_wb30->base;
+       }
+       return true;
+}
+
+#define aux_engine_regs(id)\
+[id] = {\
+               AUX_COMMON_REG_LIST0(id), \
+               .AUXN_IMPCAL = 0, \
+               .AUXP_IMPCAL = 0, \
+               .AUX_RESET_MASK = DP_AUX0_AUX_CONTROL__AUX_RESET_MASK, \
+}
+
+static const struct dce110_aux_registers aux_engine_regs[] = {
+               aux_engine_regs(0),
+               aux_engine_regs(1),
+               aux_engine_regs(2),
+               aux_engine_regs(3),
+               aux_engine_regs(4)
+};
+
+static const struct dce110_aux_registers_shift aux_shift = {
+               DCN_AUX_MASK_SH_LIST(__SHIFT)
+};
+
+static const struct dce110_aux_registers_mask aux_mask = {
+               DCN_AUX_MASK_SH_LIST(_MASK)
+};
+
+static struct dce_aux *dcn302_aux_engine_create(struct dc_context *ctx, uint32_t inst)
+{
+       struct aux_engine_dce110 *aux_engine = kzalloc(sizeof(struct aux_engine_dce110), GFP_KERNEL);
+
+       if (!aux_engine)
+               return NULL;
+
+       dce110_aux_engine_construct(aux_engine, ctx, inst, SW_AUX_TIMEOUT_PERIOD_MULTIPLIER * AUX_TIMEOUT_PERIOD,
+                       &aux_engine_regs[inst], &aux_mask, &aux_shift, ctx->dc->caps.extended_aux_timeout_support);
+
+       return &aux_engine->base;
+}
+
+#define i2c_inst_regs(id) { I2C_HW_ENGINE_COMMON_REG_LIST(id) }
+
+static const struct dce_i2c_registers i2c_hw_regs[] = {
+               i2c_inst_regs(1),
+               i2c_inst_regs(2),
+               i2c_inst_regs(3),
+               i2c_inst_regs(4),
+               i2c_inst_regs(5)
+};
+
+static const struct dce_i2c_shift i2c_shifts = {
+               I2C_COMMON_MASK_SH_LIST_DCN2(__SHIFT)
+};
+
+static const struct dce_i2c_mask i2c_masks = {
+               I2C_COMMON_MASK_SH_LIST_DCN2(_MASK)
+};
+
+static struct dce_i2c_hw *dcn302_i2c_hw_create(struct dc_context *ctx, uint32_t inst)
+{
+       struct dce_i2c_hw *dce_i2c_hw = kzalloc(sizeof(struct dce_i2c_hw), GFP_KERNEL);
+
+       if (!dce_i2c_hw)
+               return NULL;
+
+       dcn2_i2c_hw_construct(dce_i2c_hw, ctx, inst, &i2c_hw_regs[inst], &i2c_shifts, &i2c_masks);
+
+       return dce_i2c_hw;
+}
+
+static const struct encoder_feature_support link_enc_feature = {
+               .max_hdmi_deep_color = COLOR_DEPTH_121212,
+               .max_hdmi_pixel_clock = 600000,
+               .hdmi_ycbcr420_supported = true,
+               .dp_ycbcr420_supported = true,
+               .fec_supported = true,
+               .flags.bits.IS_HBR2_CAPABLE = true,
+               .flags.bits.IS_HBR3_CAPABLE = true,
+               .flags.bits.IS_TPS3_CAPABLE = true,
+               .flags.bits.IS_TPS4_CAPABLE = true
+};
+
+#define link_regs(id, phyid)\
+               [id] = {\
+                               LE_DCN3_REG_LIST(id), \
+                               UNIPHY_DCN2_REG_LIST(phyid), \
+                               DPCS_DCN2_REG_LIST(id), \
+                               SRI(DP_DPHY_INTERNAL_CTRL, DP, id) \
+               }
+
+static const struct dcn10_link_enc_registers link_enc_regs[] = {
+               link_regs(0, A),
+               link_regs(1, B),
+               link_regs(2, C),
+               link_regs(3, D),
+               link_regs(4, E)
+};
+
+static const struct dcn10_link_enc_shift le_shift = {
+               LINK_ENCODER_MASK_SH_LIST_DCN30(__SHIFT),
+               DPCS_DCN2_MASK_SH_LIST(__SHIFT)
+};
+
+static const struct dcn10_link_enc_mask le_mask = {
+               LINK_ENCODER_MASK_SH_LIST_DCN30(_MASK),
+               DPCS_DCN2_MASK_SH_LIST(_MASK)
+};
+
+#define aux_regs(id)\
+               [id] = { DCN2_AUX_REG_LIST(id) }
+
+static const struct dcn10_link_enc_aux_registers link_enc_aux_regs[] = {
+               aux_regs(0),
+               aux_regs(1),
+               aux_regs(2),
+               aux_regs(3),
+               aux_regs(4)
+};
+
+#define hpd_regs(id)\
+               [id] = { HPD_REG_LIST(id) }
+
+static const struct dcn10_link_enc_hpd_registers link_enc_hpd_regs[] = {
+               hpd_regs(0),
+               hpd_regs(1),
+               hpd_regs(2),
+               hpd_regs(3),
+               hpd_regs(4)
+};
+
+static struct link_encoder *dcn302_link_encoder_create(
+       struct dc_context *ctx,
+       const struct encoder_init_data *enc_init_data)
+{
+       struct dcn20_link_encoder *enc20 = kzalloc(sizeof(struct dcn20_link_encoder), GFP_KERNEL);
+
+       if (!enc20)
+               return NULL;
+
+       dcn30_link_encoder_construct(enc20, enc_init_data, &link_enc_feature,
+                       &link_enc_regs[enc_init_data->transmitter], &link_enc_aux_regs[enc_init_data->channel - 1],
+                       &link_enc_hpd_regs[enc_init_data->hpd_source], &le_shift, &le_mask);
+
+       return &enc20->enc10.base;
+}
+
+static const struct dce_panel_cntl_registers panel_cntl_regs[] = {
+               { DCN_PANEL_CNTL_REG_LIST() }
+};
+
+static const struct dce_panel_cntl_shift panel_cntl_shift = {
+               DCE_PANEL_CNTL_MASK_SH_LIST(__SHIFT)
+};
+
+static const struct dce_panel_cntl_mask panel_cntl_mask = {
+               DCE_PANEL_CNTL_MASK_SH_LIST(_MASK)
+};
+
+static struct panel_cntl *dcn302_panel_cntl_create(const struct panel_cntl_init_data *init_data)
+{
+       struct dce_panel_cntl *panel_cntl = kzalloc(sizeof(struct dce_panel_cntl), GFP_KERNEL);
+
+       if (!panel_cntl)
+               return NULL;
+
+       dce_panel_cntl_construct(panel_cntl, init_data, &panel_cntl_regs[init_data->inst],
+                       &panel_cntl_shift, &panel_cntl_mask);
+
+       return &panel_cntl->base;
+}
+
+static void read_dce_straps(struct dc_context *ctx, struct resource_straps *straps)
+{
+       generic_reg_get(ctx, mmDC_PINSTRAPS + BASE(mmDC_PINSTRAPS_BASE_IDX),
+                       FN(DC_PINSTRAPS, DC_PINSTRAPS_AUDIO), &straps->dc_pinstraps_audio);
+}
+
+static const struct resource_create_funcs res_create_funcs = {
+               .read_dce_straps = read_dce_straps,
+               .create_audio = dcn302_create_audio,
+               .create_stream_encoder = dcn302_stream_encoder_create,
+               .create_hwseq = dcn302_hwseq_create,
+};
+
+static bool is_soc_bounding_box_valid(struct dc *dc)
+{
+       uint32_t hw_internal_rev = dc->ctx->asic_id.hw_internal_rev;
+
+       if (ASICREV_IS_DIMGREY_CAVEFISH_P(hw_internal_rev))
+               return true;
+
+       return false;
+}
+
+static bool init_soc_bounding_box(struct dc *dc,  struct resource_pool *pool)
+{
+       struct _vcs_dpi_soc_bounding_box_st *loaded_bb = &dcn3_02_soc;
+       struct _vcs_dpi_ip_params_st *loaded_ip = &dcn3_02_ip;
+
+       DC_LOGGER_INIT(dc->ctx->logger);
+
+       if (!is_soc_bounding_box_valid(dc)) {
+               DC_LOG_ERROR("%s: not valid soc bounding box\n", __func__);
+               return false;
+       }
+
+       loaded_ip->max_num_otg = pool->pipe_count;
+       loaded_ip->max_num_dpp = pool->pipe_count;
+       loaded_ip->clamp_min_dcfclk = dc->config.clamp_min_dcfclk;
+       DC_FP_START();
+       dcn20_patch_bounding_box(dc, loaded_bb);
+       DC_FP_END();
+
+       if (dc->ctx->dc_bios->funcs->get_soc_bb_info) {
+               struct bp_soc_bb_info bb_info = { 0 };
+
+               if (dc->ctx->dc_bios->funcs->get_soc_bb_info(
+                           dc->ctx->dc_bios, &bb_info) == BP_RESULT_OK) {
+
+                               DC_FP_START();
+                               dcn302_fpu_init_soc_bounding_box(bb_info);
+                               DC_FP_END();
+               }
+       }
+
+       return true;
+}
+
+static void dcn302_resource_destruct(struct resource_pool *pool)
+{
+       unsigned int i;
+
+       for (i = 0; i < pool->stream_enc_count; i++) {
+               if (pool->stream_enc[i] != NULL) {
+                       if (pool->stream_enc[i]->vpg != NULL) {
+                               kfree(DCN30_VPG_FROM_VPG(pool->stream_enc[i]->vpg));
+                               pool->stream_enc[i]->vpg = NULL;
+                       }
+                       if (pool->stream_enc[i]->afmt != NULL) {
+                               kfree(DCN30_AFMT_FROM_AFMT(pool->stream_enc[i]->afmt));
+                               pool->stream_enc[i]->afmt = NULL;
+                       }
+                       kfree(DCN10STRENC_FROM_STRENC(pool->stream_enc[i]));
+                       pool->stream_enc[i] = NULL;
+               }
+       }
+
+       for (i = 0; i < pool->res_cap->num_dsc; i++) {
+               if (pool->dscs[i] != NULL)
+                       dcn20_dsc_destroy(&pool->dscs[i]);
+       }
+
+       if (pool->mpc != NULL) {
+               kfree(TO_DCN20_MPC(pool->mpc));
+               pool->mpc = NULL;
+       }
+
+       if (pool->hubbub != NULL) {
+               kfree(pool->hubbub);
+               pool->hubbub = NULL;
+       }
+
+       for (i = 0; i < pool->pipe_count; i++) {
+               if (pool->dpps[i] != NULL) {
+                       kfree(TO_DCN20_DPP(pool->dpps[i]));
+                       pool->dpps[i] = NULL;
+               }
+
+               if (pool->hubps[i] != NULL) {
+                       kfree(TO_DCN20_HUBP(pool->hubps[i]));
+                       pool->hubps[i] = NULL;
+               }
+
+               if (pool->irqs != NULL)
+                       dal_irq_service_destroy(&pool->irqs);
+       }
+
+       for (i = 0; i < pool->res_cap->num_ddc; i++) {
+               if (pool->engines[i] != NULL)
+                       dce110_engine_destroy(&pool->engines[i]);
+               if (pool->hw_i2cs[i] != NULL) {
+                       kfree(pool->hw_i2cs[i]);
+                       pool->hw_i2cs[i] = NULL;
+               }
+               if (pool->sw_i2cs[i] != NULL) {
+                       kfree(pool->sw_i2cs[i]);
+                       pool->sw_i2cs[i] = NULL;
+               }
+       }
+
+       for (i = 0; i < pool->res_cap->num_opp; i++) {
+               if (pool->opps[i] != NULL)
+                       pool->opps[i]->funcs->opp_destroy(&pool->opps[i]);
+       }
+
+       for (i = 0; i < pool->res_cap->num_timing_generator; i++) {
+               if (pool->timing_generators[i] != NULL) {
+                       kfree(DCN10TG_FROM_TG(pool->timing_generators[i]));
+                       pool->timing_generators[i] = NULL;
+               }
+       }
+
+       for (i = 0; i < pool->res_cap->num_dwb; i++) {
+               if (pool->dwbc[i] != NULL) {
+                       kfree(TO_DCN30_DWBC(pool->dwbc[i]));
+                       pool->dwbc[i] = NULL;
+               }
+               if (pool->mcif_wb[i] != NULL) {
+                       kfree(TO_DCN30_MMHUBBUB(pool->mcif_wb[i]));
+                       pool->mcif_wb[i] = NULL;
+               }
+       }
+
+       for (i = 0; i < pool->audio_count; i++) {
+               if (pool->audios[i])
+                       dce_aud_destroy(&pool->audios[i]);
+       }
+
+       for (i = 0; i < pool->clk_src_count; i++) {
+               if (pool->clock_sources[i] != NULL)
+                       dcn20_clock_source_destroy(&pool->clock_sources[i]);
+       }
+
+       if (pool->dp_clock_source != NULL)
+               dcn20_clock_source_destroy(&pool->dp_clock_source);
+
+       for (i = 0; i < pool->res_cap->num_mpc_3dlut; i++) {
+               if (pool->mpc_lut[i] != NULL) {
+                       dc_3dlut_func_release(pool->mpc_lut[i]);
+                       pool->mpc_lut[i] = NULL;
+               }
+               if (pool->mpc_shaper[i] != NULL) {
+                       dc_transfer_func_release(pool->mpc_shaper[i]);
+                       pool->mpc_shaper[i] = NULL;
+               }
+       }
+
+       for (i = 0; i < pool->pipe_count; i++) {
+               if (pool->multiple_abms[i] != NULL)
+                       dce_abm_destroy(&pool->multiple_abms[i]);
+       }
+
+       if (pool->psr != NULL)
+               dmub_psr_destroy(&pool->psr);
+
+       if (pool->dccg != NULL)
+               dcn_dccg_destroy(&pool->dccg);
+
+       if (pool->oem_device != NULL) {
+               struct dc *dc = pool->oem_device->ctx->dc;
+
+               dc->link_srv->destroy_ddc_service(&pool->oem_device);
+       }
+}
+
+static void dcn302_destroy_resource_pool(struct resource_pool **pool)
+{
+       dcn302_resource_destruct(*pool);
+       kfree(*pool);
+       *pool = NULL;
+}
+
+void dcn302_update_bw_bounding_box(struct dc *dc, struct clk_bw_params *bw_params)
+{
+       DC_FP_START();
+       dcn302_fpu_update_bw_bounding_box(dc, bw_params);
+       DC_FP_END();
+}
+
+static void dcn302_get_panel_config_defaults(struct dc_panel_config *panel_config)
+{
+       *panel_config = panel_config_defaults;
+}
+
+static struct resource_funcs dcn302_res_pool_funcs = {
+               .destroy = dcn302_destroy_resource_pool,
+               .link_enc_create = dcn302_link_encoder_create,
+               .panel_cntl_create = dcn302_panel_cntl_create,
+               .validate_bandwidth = dcn30_validate_bandwidth,
+               .calculate_wm_and_dlg = dcn30_calculate_wm_and_dlg,
+               .update_soc_for_wm_a = dcn30_update_soc_for_wm_a,
+               .populate_dml_pipes = dcn30_populate_dml_pipes_from_context,
+               .acquire_free_pipe_as_secondary_dpp_pipe = dcn20_acquire_free_pipe_for_layer,
+               .release_pipe = dcn20_release_pipe,
+               .add_stream_to_ctx = dcn30_add_stream_to_ctx,
+               .add_dsc_to_stream_resource = dcn20_add_dsc_to_stream_resource,
+               .remove_stream_from_ctx = dcn20_remove_stream_from_ctx,
+               .populate_dml_writeback_from_context = dcn30_populate_dml_writeback_from_context,
+               .set_mcif_arb_params = dcn30_set_mcif_arb_params,
+               .find_first_free_match_stream_enc_for_link = dcn10_find_first_free_match_stream_enc_for_link,
+               .acquire_post_bldn_3dlut = dcn30_acquire_post_bldn_3dlut,
+               .release_post_bldn_3dlut = dcn30_release_post_bldn_3dlut,
+               .update_bw_bounding_box = dcn302_update_bw_bounding_box,
+               .patch_unknown_plane_state = dcn20_patch_unknown_plane_state,
+               .get_panel_config_defaults = dcn302_get_panel_config_defaults,
+};
+
+static struct dc_cap_funcs cap_funcs = {
+               .get_dcc_compression_cap = dcn20_get_dcc_compression_cap
+};
+
+static const struct bios_registers bios_regs = {
+               NBIO_SR(BIOS_SCRATCH_3),
+               NBIO_SR(BIOS_SCRATCH_6)
+};
+
+static const struct dccg_registers dccg_regs = {
+               DCCG_REG_LIST_DCN3_02()
+};
+
+static const struct dccg_shift dccg_shift = {
+               DCCG_MASK_SH_LIST_DCN3_02(__SHIFT)
+};
+
+static const struct dccg_mask dccg_mask = {
+               DCCG_MASK_SH_LIST_DCN3_02(_MASK)
+};
+
+#define abm_regs(id)\
+               [id] = { ABM_DCN302_REG_LIST(id) }
+
+static const struct dce_abm_registers abm_regs[] = {
+               abm_regs(0),
+               abm_regs(1),
+               abm_regs(2),
+               abm_regs(3),
+               abm_regs(4)
+};
+
+static const struct dce_abm_shift abm_shift = {
+               ABM_MASK_SH_LIST_DCN30(__SHIFT)
+};
+
+static const struct dce_abm_mask abm_mask = {
+               ABM_MASK_SH_LIST_DCN30(_MASK)
+};
+
+static bool dcn302_resource_construct(
+               uint8_t num_virtual_links,
+               struct dc *dc,
+               struct resource_pool *pool)
+{
+       int i;
+       struct dc_context *ctx = dc->ctx;
+       struct irq_service_init_data init_data;
+       struct ddc_service_init_data ddc_init_data = {0};
+
+       ctx->dc_bios->regs = &bios_regs;
+
+       pool->res_cap = &res_cap_dcn302;
+
+       pool->funcs = &dcn302_res_pool_funcs;
+
+       /*************************************************
+        *  Resource + asic cap harcoding                *
+        *************************************************/
+       pool->underlay_pipe_index = NO_UNDERLAY_PIPE;
+       pool->pipe_count = pool->res_cap->num_timing_generator;
+       pool->mpcc_count = pool->res_cap->num_timing_generator;
+       dc->caps.max_downscale_ratio = 600;
+       dc->caps.i2c_speed_in_khz = 100;
+       dc->caps.i2c_speed_in_khz_hdcp = 5; /*1.4 w/a applied by derfault*/
+       dc->caps.max_cursor_size = 256;
+       dc->caps.min_horizontal_blanking_period = 80;
+       dc->caps.dmdata_alloc_size = 2048;
+       dc->caps.mall_size_per_mem_channel = 4;
+       /* total size = mall per channel * num channels * 1024 * 1024 */
+       dc->caps.mall_size_total = dc->caps.mall_size_per_mem_channel * dc->ctx->dc_bios->vram_info.num_chans * 1048576;
+       dc->caps.cursor_cache_size = dc->caps.max_cursor_size * dc->caps.max_cursor_size * 8;
+       dc->caps.max_slave_planes = 2;
+       dc->caps.max_slave_yuv_planes = 2;
+       dc->caps.max_slave_rgb_planes = 2;
+       dc->caps.post_blend_color_processing = true;
+       dc->caps.force_dp_tps4_for_cp2520 = true;
+       dc->caps.extended_aux_timeout_support = true;
+       dc->caps.dmcub_support = true;
+       dc->caps.max_v_total = (1 << 15) - 1;
+
+       /* Color pipeline capabilities */
+       dc->caps.color.dpp.dcn_arch = 1;
+       dc->caps.color.dpp.input_lut_shared = 0;
+       dc->caps.color.dpp.icsc = 1;
+       dc->caps.color.dpp.dgam_ram = 0; // must use gamma_corr
+       dc->caps.color.dpp.dgam_rom_caps.srgb = 1;
+       dc->caps.color.dpp.dgam_rom_caps.bt2020 = 1;
+       dc->caps.color.dpp.dgam_rom_caps.gamma2_2 = 1;
+       dc->caps.color.dpp.dgam_rom_caps.pq = 1;
+       dc->caps.color.dpp.dgam_rom_caps.hlg = 1;
+       dc->caps.color.dpp.post_csc = 1;
+       dc->caps.color.dpp.gamma_corr = 1;
+       dc->caps.color.dpp.dgam_rom_for_yuv = 0;
+
+       dc->caps.color.dpp.hw_3d_lut = 1;
+       dc->caps.color.dpp.ogam_ram = 1;
+       // no OGAM ROM on DCN3
+       dc->caps.color.dpp.ogam_rom_caps.srgb = 0;
+       dc->caps.color.dpp.ogam_rom_caps.bt2020 = 0;
+       dc->caps.color.dpp.ogam_rom_caps.gamma2_2 = 0;
+       dc->caps.color.dpp.ogam_rom_caps.pq = 0;
+       dc->caps.color.dpp.ogam_rom_caps.hlg = 0;
+       dc->caps.color.dpp.ocsc = 0;
+
+       dc->caps.color.mpc.gamut_remap = 1;
+       dc->caps.color.mpc.num_3dluts = pool->res_cap->num_mpc_3dlut; //3
+       dc->caps.color.mpc.ogam_ram = 1;
+       dc->caps.color.mpc.ogam_rom_caps.srgb = 0;
+       dc->caps.color.mpc.ogam_rom_caps.bt2020 = 0;
+       dc->caps.color.mpc.ogam_rom_caps.gamma2_2 = 0;
+       dc->caps.color.mpc.ogam_rom_caps.pq = 0;
+       dc->caps.color.mpc.ogam_rom_caps.hlg = 0;
+       dc->caps.color.mpc.ocsc = 1;
+
+       dc->caps.dp_hdmi21_pcon_support = true;
+
+       /* read VBIOS LTTPR caps */
+       if (ctx->dc_bios->funcs->get_lttpr_caps) {
+               enum bp_result bp_query_result;
+               uint8_t is_vbios_lttpr_enable = 0;
+
+               bp_query_result = ctx->dc_bios->funcs->get_lttpr_caps(ctx->dc_bios, &is_vbios_lttpr_enable);
+               dc->caps.vbios_lttpr_enable = (bp_query_result == BP_RESULT_OK) && !!is_vbios_lttpr_enable;
+       }
+
+       if (ctx->dc_bios->funcs->get_lttpr_interop) {
+               enum bp_result bp_query_result;
+               uint8_t is_vbios_interop_enabled = 0;
+
+               bp_query_result = ctx->dc_bios->funcs->get_lttpr_interop(ctx->dc_bios,
+                               &is_vbios_interop_enabled);
+               dc->caps.vbios_lttpr_aware = (bp_query_result == BP_RESULT_OK) && !!is_vbios_interop_enabled;
+       }
+
+       if (dc->ctx->dce_environment == DCE_ENV_PRODUCTION_DRV)
+               dc->debug = debug_defaults_drv;
+
+       // Init the vm_helper
+       if (dc->vm_helper)
+               vm_helper_init(dc->vm_helper, 16);
+
+       /*************************************************
+        *  Create resources                             *
+        *************************************************/
+
+       /* Clock Sources for Pixel Clock*/
+       pool->clock_sources[DCN302_CLK_SRC_PLL0] =
+                       dcn302_clock_source_create(ctx, ctx->dc_bios,
+                                       CLOCK_SOURCE_COMBO_PHY_PLL0,
+                                       &clk_src_regs[0], false);
+       pool->clock_sources[DCN302_CLK_SRC_PLL1] =
+                       dcn302_clock_source_create(ctx, ctx->dc_bios,
+                                       CLOCK_SOURCE_COMBO_PHY_PLL1,
+                                       &clk_src_regs[1], false);
+       pool->clock_sources[DCN302_CLK_SRC_PLL2] =
+                       dcn302_clock_source_create(ctx, ctx->dc_bios,
+                                       CLOCK_SOURCE_COMBO_PHY_PLL2,
+                                       &clk_src_regs[2], false);
+       pool->clock_sources[DCN302_CLK_SRC_PLL3] =
+                       dcn302_clock_source_create(ctx, ctx->dc_bios,
+                                       CLOCK_SOURCE_COMBO_PHY_PLL3,
+                                       &clk_src_regs[3], false);
+       pool->clock_sources[DCN302_CLK_SRC_PLL4] =
+                       dcn302_clock_source_create(ctx, ctx->dc_bios,
+                                       CLOCK_SOURCE_COMBO_PHY_PLL4,
+                                       &clk_src_regs[4], false);
+
+       pool->clk_src_count = DCN302_CLK_SRC_TOTAL;
+
+       /* todo: not reuse phy_pll registers */
+       pool->dp_clock_source =
+                       dcn302_clock_source_create(ctx, ctx->dc_bios,
+                                       CLOCK_SOURCE_ID_DP_DTO,
+                                       &clk_src_regs[0], true);
+
+       for (i = 0; i < pool->clk_src_count; i++) {
+               if (pool->clock_sources[i] == NULL) {
+                       dm_error("DC: failed to create clock sources!\n");
+                       BREAK_TO_DEBUGGER();
+                       goto create_fail;
+               }
+       }
+
+       /* DCCG */
+       pool->dccg = dccg30_create(ctx, &dccg_regs, &dccg_shift, &dccg_mask);
+       if (pool->dccg == NULL) {
+               dm_error("DC: failed to create dccg!\n");
+               BREAK_TO_DEBUGGER();
+               goto create_fail;
+       }
+
+       /* PP Lib and SMU interfaces */
+       init_soc_bounding_box(dc, pool);
+
+       /* DML */
+       dml_init_instance(&dc->dml, &dcn3_02_soc, &dcn3_02_ip, DML_PROJECT_DCN30);
+
+       /* IRQ */
+       init_data.ctx = dc->ctx;
+       pool->irqs = dal_irq_service_dcn302_create(&init_data);
+       if (!pool->irqs)
+               goto create_fail;
+
+       /* HUBBUB */
+       pool->hubbub = dcn302_hubbub_create(ctx);
+       if (pool->hubbub == NULL) {
+               BREAK_TO_DEBUGGER();
+               dm_error("DC: failed to create hubbub!\n");
+               goto create_fail;
+       }
+
+       /* HUBPs, DPPs, OPPs and TGs */
+       for (i = 0; i < pool->pipe_count; i++) {
+               pool->hubps[i] = dcn302_hubp_create(ctx, i);
+               if (pool->hubps[i] == NULL) {
+                       BREAK_TO_DEBUGGER();
+                       dm_error("DC: failed to create hubps!\n");
+                       goto create_fail;
+               }
+
+               pool->dpps[i] = dcn302_dpp_create(ctx, i);
+               if (pool->dpps[i] == NULL) {
+                       BREAK_TO_DEBUGGER();
+                       dm_error("DC: failed to create dpps!\n");
+                       goto create_fail;
+               }
+       }
+
+       for (i = 0; i < pool->res_cap->num_opp; i++) {
+               pool->opps[i] = dcn302_opp_create(ctx, i);
+               if (pool->opps[i] == NULL) {
+                       BREAK_TO_DEBUGGER();
+                       dm_error("DC: failed to create output pixel processor!\n");
+                       goto create_fail;
+               }
+       }
+
+       for (i = 0; i < pool->res_cap->num_timing_generator; i++) {
+               pool->timing_generators[i] = dcn302_timing_generator_create(ctx, i);
+               if (pool->timing_generators[i] == NULL) {
+                       BREAK_TO_DEBUGGER();
+                       dm_error("DC: failed to create tg!\n");
+                       goto create_fail;
+               }
+       }
+       pool->timing_generator_count = i;
+
+       /* PSR */
+       pool->psr = dmub_psr_create(ctx);
+       if (pool->psr == NULL) {
+               dm_error("DC: failed to create psr!\n");
+               BREAK_TO_DEBUGGER();
+               goto create_fail;
+       }
+
+       /* ABMs */
+       for (i = 0; i < pool->res_cap->num_timing_generator; i++) {
+               pool->multiple_abms[i] = dmub_abm_create(ctx, &abm_regs[i], &abm_shift, &abm_mask);
+               if (pool->multiple_abms[i] == NULL) {
+                       dm_error("DC: failed to create abm for pipe %d!\n", i);
+                       BREAK_TO_DEBUGGER();
+                       goto create_fail;
+               }
+       }
+
+       /* MPC and DSC */
+       pool->mpc = dcn302_mpc_create(ctx, pool->mpcc_count, pool->res_cap->num_mpc_3dlut);
+       if (pool->mpc == NULL) {
+               BREAK_TO_DEBUGGER();
+               dm_error("DC: failed to create mpc!\n");
+               goto create_fail;
+       }
+
+       for (i = 0; i < pool->res_cap->num_dsc; i++) {
+               pool->dscs[i] = dcn302_dsc_create(ctx, i);
+               if (pool->dscs[i] == NULL) {
+                       BREAK_TO_DEBUGGER();
+                       dm_error("DC: failed to create display stream compressor %d!\n", i);
+                       goto create_fail;
+               }
+       }
+
+       /* DWB and MMHUBBUB */
+       if (!dcn302_dwbc_create(ctx, pool)) {
+               BREAK_TO_DEBUGGER();
+               dm_error("DC: failed to create dwbc!\n");
+               goto create_fail;
+       }
+
+       if (!dcn302_mmhubbub_create(ctx, pool)) {
+               BREAK_TO_DEBUGGER();
+               dm_error("DC: failed to create mcif_wb!\n");
+               goto create_fail;
+       }
+
+       /* AUX and I2C */
+       for (i = 0; i < pool->res_cap->num_ddc; i++) {
+               pool->engines[i] = dcn302_aux_engine_create(ctx, i);
+               if (pool->engines[i] == NULL) {
+                       BREAK_TO_DEBUGGER();
+                       dm_error("DC:failed to create aux engine!!\n");
+                       goto create_fail;
+               }
+               pool->hw_i2cs[i] = dcn302_i2c_hw_create(ctx, i);
+               if (pool->hw_i2cs[i] == NULL) {
+                       BREAK_TO_DEBUGGER();
+                       dm_error("DC:failed to create hw i2c!!\n");
+                       goto create_fail;
+               }
+               pool->sw_i2cs[i] = NULL;
+       }
+
+       /* Audio, Stream Encoders including HPO and virtual, MPC 3D LUTs */
+       if (!resource_construct(num_virtual_links, dc, pool,
+                       &res_create_funcs))
+               goto create_fail;
+
+       /* HW Sequencer and Plane caps */
+       dcn302_hw_sequencer_construct(dc);
+
+       dc->caps.max_planes =  pool->pipe_count;
+
+       for (i = 0; i < dc->caps.max_planes; ++i)
+               dc->caps.planes[i] = plane_cap;
+
+       dc->cap_funcs = cap_funcs;
+
+       if (dc->ctx->dc_bios->fw_info.oem_i2c_present) {
+               ddc_init_data.ctx = dc->ctx;
+               ddc_init_data.link = NULL;
+               ddc_init_data.id.id = dc->ctx->dc_bios->fw_info.oem_i2c_obj_id;
+               ddc_init_data.id.enum_id = 0;
+               ddc_init_data.id.type = OBJECT_TYPE_GENERIC;
+               pool->oem_device = dc->link_srv->create_ddc_service(&ddc_init_data);
+       } else {
+               pool->oem_device = NULL;
+       }
+
+       return true;
+
+create_fail:
+
+       dcn302_resource_destruct(pool);
+
+       return false;
+}
+
+struct resource_pool *dcn302_create_resource_pool(const struct dc_init_data *init_data, struct dc *dc)
+{
+       struct resource_pool *pool = kzalloc(sizeof(struct resource_pool), GFP_KERNEL);
+
+       if (!pool)
+               return NULL;
+
+       if (dcn302_resource_construct(init_data->num_virtual_links, dc, pool))
+               return pool;
+
+       BREAK_TO_DEBUGGER();
+       kfree(pool);
+       return NULL;
+}
diff --git a/drivers/gpu/drm/amd/display/dc/resource/dcn302/dcn302_resource.h b/drivers/gpu/drm/amd/display/dc/resource/dcn302/dcn302_resource.h
new file mode 100644 (file)
index 0000000..9f24e73
--- /dev/null
@@ -0,0 +1,38 @@
+/*
+ * 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
+ *
+ */
+
+#ifndef _DCN302_RESOURCE_H_
+#define _DCN302_RESOURCE_H_
+
+#include "core_types.h"
+
+extern struct _vcs_dpi_ip_params_st dcn3_02_ip;
+extern struct _vcs_dpi_soc_bounding_box_st dcn3_02_soc;
+
+struct resource_pool *dcn302_create_resource_pool(const struct dc_init_data *init_data, struct dc *dc);
+
+void dcn302_update_bw_bounding_box(struct dc *dc, struct clk_bw_params *bw_params);
+
+#endif /* _DCN302_RESOURCE_H_ */
diff --git a/drivers/gpu/drm/amd/display/dc/resource/dcn303/dcn303_resource.c b/drivers/gpu/drm/amd/display/dc/resource/dcn303/dcn303_resource.c
new file mode 100644 (file)
index 0000000..25cd623
--- /dev/null
@@ -0,0 +1,1448 @@
+// SPDX-License-Identifier: MIT
+/*
+ * Copyright (C) 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 "dcn303/dcn303_init.h"
+#include "dcn303_resource.h"
+#include "dcn303/dcn303_dccg.h"
+#include "irq/dcn303/irq_service_dcn303.h"
+
+#include "dcn30/dcn30_dio_link_encoder.h"
+#include "dcn30/dcn30_dio_stream_encoder.h"
+#include "dcn30/dcn30_dpp.h"
+#include "dcn30/dcn30_dwb.h"
+#include "dcn30/dcn30_hubbub.h"
+#include "dcn30/dcn30_hubp.h"
+#include "dcn30/dcn30_mmhubbub.h"
+#include "dcn30/dcn30_mpc.h"
+#include "dcn30/dcn30_opp.h"
+#include "dcn30/dcn30_optc.h"
+#include "dcn30/dcn30_resource.h"
+
+#include "dcn20/dcn20_dsc.h"
+#include "dcn20/dcn20_resource.h"
+
+#include "dml/dcn30/dcn30_fpu.h"
+
+#include "dcn10/dcn10_resource.h"
+
+#include "link.h"
+
+#include "dce/dce_abm.h"
+#include "dce/dce_audio.h"
+#include "dce/dce_aux.h"
+#include "dce/dce_clock_source.h"
+#include "dce/dce_hwseq.h"
+#include "dce/dce_i2c_hw.h"
+#include "dce/dce_panel_cntl.h"
+#include "dce/dmub_abm.h"
+#include "dce/dmub_psr.h"
+#include "clk_mgr.h"
+
+#include "hw_sequencer_private.h"
+#include "reg_helper.h"
+#include "resource.h"
+#include "vm_helper.h"
+
+#include "sienna_cichlid_ip_offset.h"
+#include "dcn/dcn_3_0_3_offset.h"
+#include "dcn/dcn_3_0_3_sh_mask.h"
+#include "dpcs/dpcs_3_0_3_offset.h"
+#include "dpcs/dpcs_3_0_3_sh_mask.h"
+#include "nbio/nbio_2_3_offset.h"
+
+#include "dml/dcn303/dcn303_fpu.h"
+
+#define DC_LOGGER \
+       dc->ctx->logger
+#define DC_LOGGER_INIT(logger)
+
+
+static const struct dc_debug_options debug_defaults_drv = {
+               .disable_dmcu = true,
+               .force_abm_enable = false,
+               .timing_trace = false,
+               .clock_trace = true,
+               .disable_pplib_clock_request = true,
+               .pipe_split_policy = MPC_SPLIT_AVOID,
+               .force_single_disp_pipe_split = false,
+               .disable_dcc = DCC_ENABLE,
+               .vsr_support = true,
+               .performance_trace = false,
+               .max_downscale_src_width = 7680,/*upto 8K*/
+               .disable_pplib_wm_range = false,
+               .scl_reset_length10 = true,
+               .sanity_checks = false,
+               .underflow_assert_delay_us = 0xFFFFFFFF,
+               .dwb_fi_phase = -1, // -1 = disable,
+               .dmub_command_table = true,
+               .exit_idle_opt_for_cursor_updates = true,
+               .disable_idle_power_optimizations = false,
+               .using_dml2 = false,
+};
+
+static const struct dc_panel_config panel_config_defaults = {
+               .psr = {
+                       .disable_psr = false,
+                       .disallow_psrsu = false,
+                       .disallow_replay = false,
+               },
+};
+
+enum dcn303_clk_src_array_id {
+       DCN303_CLK_SRC_PLL0,
+       DCN303_CLK_SRC_PLL1,
+       DCN303_CLK_SRC_TOTAL
+};
+
+static const struct resource_caps res_cap_dcn303 = {
+               .num_timing_generator = 2,
+               .num_opp = 2,
+               .num_video_plane = 2,
+               .num_audio = 2,
+               .num_stream_encoder = 2,
+               .num_dwb = 1,
+               .num_ddc = 2,
+               .num_vmid = 16,
+               .num_mpc_3dlut = 1,
+               .num_dsc = 2,
+};
+
+static const struct dc_plane_cap plane_cap = {
+               .type = DC_PLANE_TYPE_DCN_UNIVERSAL,
+               .per_pixel_alpha = true,
+               .pixel_format_support = {
+                               .argb8888 = true,
+                               .nv12 = true,
+                               .fp16 = true,
+                               .p010 = true,
+                               .ayuv = false,
+               },
+               .max_upscale_factor = {
+                               .argb8888 = 16000,
+                               .nv12 = 16000,
+                               .fp16 = 16000
+               },
+               .max_downscale_factor = {
+                               .argb8888 = 600,
+                               .nv12 = 600,
+                               .fp16 = 600
+               },
+               16,
+               16
+};
+
+/* NBIO */
+#define NBIO_BASE_INNER(seg) \
+               NBIO_BASE__INST0_SEG ## seg
+
+#define NBIO_BASE(seg) \
+               NBIO_BASE_INNER(seg)
+
+#define NBIO_SR(reg_name)\
+               .reg_name = NBIO_BASE(mm ## reg_name ## _BASE_IDX) + \
+               mm ## reg_name
+
+/* DCN */
+#define BASE_INNER(seg) DCN_BASE__INST0_SEG ## seg
+
+#define BASE(seg) BASE_INNER(seg)
+
+#define SR(reg_name)\
+               .reg_name = BASE(mm ## reg_name ## _BASE_IDX) + mm ## reg_name
+
+#define SF(reg_name, field_name, post_fix)\
+               .field_name = reg_name ## __ ## field_name ## post_fix
+
+#define SRI(reg_name, block, id)\
+               .reg_name = BASE(mm ## block ## id ## _ ## reg_name ## _BASE_IDX) + mm ## block ## id ## _ ## reg_name
+
+#define SRI2(reg_name, block, id)\
+               .reg_name = BASE(mm ## reg_name ## _BASE_IDX) + mm ## reg_name
+
+#define SRII(reg_name, block, id)\
+               .reg_name[id] = BASE(mm ## block ## id ## _ ## reg_name ## _BASE_IDX) + \
+               mm ## block ## id ## _ ## reg_name
+
+#define DCCG_SRII(reg_name, block, id)\
+               .block ## _ ## reg_name[id] = BASE(mm ## block ## id ## _ ## reg_name ## _BASE_IDX) + \
+               mm ## block ## id ## _ ## reg_name
+
+#define VUPDATE_SRII(reg_name, block, id)\
+               .reg_name[id] = BASE(mm ## reg_name ## _ ## block ## id ## _BASE_IDX) + \
+               mm ## reg_name ## _ ## block ## id
+
+#define SRII_DWB(reg_name, temp_name, block, id)\
+               .reg_name[id] = BASE(mm ## block ## id ## _ ## temp_name ## _BASE_IDX) + \
+               mm ## block ## id ## _ ## temp_name
+
+#define SF_DWB2(reg_name, block, id, field_name, post_fix)     \
+       .field_name = reg_name ## __ ## field_name ## post_fix
+
+#define SRII_MPC_RMU(reg_name, block, id)\
+               .RMU##_##reg_name[id] = BASE(mm ## block ## id ## _ ## reg_name ## _BASE_IDX) + \
+               mm ## block ## id ## _ ## reg_name
+
+static const struct dcn_hubbub_registers hubbub_reg = {
+               HUBBUB_REG_LIST_DCN30(0)
+};
+
+static const struct dcn_hubbub_shift hubbub_shift = {
+               HUBBUB_MASK_SH_LIST_DCN30(__SHIFT)
+};
+
+static const struct dcn_hubbub_mask hubbub_mask = {
+               HUBBUB_MASK_SH_LIST_DCN30(_MASK)
+};
+
+#define vmid_regs(id)\
+               [id] = { DCN20_VMID_REG_LIST(id) }
+
+static const struct dcn_vmid_registers vmid_regs[] = {
+               vmid_regs(0),
+               vmid_regs(1),
+               vmid_regs(2),
+               vmid_regs(3),
+               vmid_regs(4),
+               vmid_regs(5),
+               vmid_regs(6),
+               vmid_regs(7),
+               vmid_regs(8),
+               vmid_regs(9),
+               vmid_regs(10),
+               vmid_regs(11),
+               vmid_regs(12),
+               vmid_regs(13),
+               vmid_regs(14),
+               vmid_regs(15)
+};
+
+static const struct dcn20_vmid_shift vmid_shifts = {
+               DCN20_VMID_MASK_SH_LIST(__SHIFT)
+};
+
+static const struct dcn20_vmid_mask vmid_masks = {
+               DCN20_VMID_MASK_SH_LIST(_MASK)
+};
+
+static struct hubbub *dcn303_hubbub_create(struct dc_context *ctx)
+{
+       int i;
+
+       struct dcn20_hubbub *hubbub3 = kzalloc(sizeof(struct dcn20_hubbub), GFP_KERNEL);
+
+       if (!hubbub3)
+               return NULL;
+
+       hubbub3_construct(hubbub3, ctx, &hubbub_reg, &hubbub_shift, &hubbub_mask);
+
+       for (i = 0; i < res_cap_dcn303.num_vmid; i++) {
+               struct dcn20_vmid *vmid = &hubbub3->vmid[i];
+
+               vmid->ctx = ctx;
+
+               vmid->regs = &vmid_regs[i];
+               vmid->shifts = &vmid_shifts;
+               vmid->masks = &vmid_masks;
+       }
+
+       return &hubbub3->base;
+}
+
+#define vpg_regs(id)\
+               [id] = { VPG_DCN3_REG_LIST(id) }
+
+static const struct dcn30_vpg_registers vpg_regs[] = {
+               vpg_regs(0),
+               vpg_regs(1),
+               vpg_regs(2)
+};
+
+static const struct dcn30_vpg_shift vpg_shift = {
+               DCN3_VPG_MASK_SH_LIST(__SHIFT)
+};
+
+static const struct dcn30_vpg_mask vpg_mask = {
+               DCN3_VPG_MASK_SH_LIST(_MASK)
+};
+
+static struct vpg *dcn303_vpg_create(struct dc_context *ctx, uint32_t inst)
+{
+       struct dcn30_vpg *vpg3 = kzalloc(sizeof(struct dcn30_vpg), GFP_KERNEL);
+
+       if (!vpg3)
+               return NULL;
+
+       vpg3_construct(vpg3, ctx, inst, &vpg_regs[inst], &vpg_shift, &vpg_mask);
+
+       return &vpg3->base;
+}
+
+#define afmt_regs(id)\
+               [id] = { AFMT_DCN3_REG_LIST(id) }
+
+static const struct dcn30_afmt_registers afmt_regs[] = {
+               afmt_regs(0),
+               afmt_regs(1),
+               afmt_regs(2)
+};
+
+static const struct dcn30_afmt_shift afmt_shift = {
+               DCN3_AFMT_MASK_SH_LIST(__SHIFT)
+};
+
+static const struct dcn30_afmt_mask afmt_mask = {
+               DCN3_AFMT_MASK_SH_LIST(_MASK)
+};
+
+static struct afmt *dcn303_afmt_create(struct dc_context *ctx, uint32_t inst)
+{
+       struct dcn30_afmt *afmt3 = kzalloc(sizeof(struct dcn30_afmt), GFP_KERNEL);
+
+       if (!afmt3)
+               return NULL;
+
+       afmt3_construct(afmt3, ctx, inst, &afmt_regs[inst], &afmt_shift, &afmt_mask);
+
+       return &afmt3->base;
+}
+
+#define audio_regs(id)\
+               [id] = { AUD_COMMON_REG_LIST(id) }
+
+static const struct dce_audio_registers audio_regs[] = {
+               audio_regs(0),
+               audio_regs(1),
+               audio_regs(2),
+               audio_regs(3),
+               audio_regs(4),
+               audio_regs(5),
+               audio_regs(6)
+};
+
+#define DCE120_AUD_COMMON_MASK_SH_LIST(mask_sh)\
+               SF(AZF0ENDPOINT0_AZALIA_F0_CODEC_ENDPOINT_INDEX, AZALIA_ENDPOINT_REG_INDEX, mask_sh),\
+               SF(AZF0ENDPOINT0_AZALIA_F0_CODEC_ENDPOINT_DATA, AZALIA_ENDPOINT_REG_DATA, mask_sh),\
+               AUD_COMMON_MASK_SH_LIST_BASE(mask_sh)
+
+static const struct dce_audio_shift audio_shift = {
+               DCE120_AUD_COMMON_MASK_SH_LIST(__SHIFT)
+};
+
+static const struct dce_audio_mask audio_mask = {
+               DCE120_AUD_COMMON_MASK_SH_LIST(_MASK)
+};
+
+static struct audio *dcn303_create_audio(struct dc_context *ctx, unsigned int inst)
+{
+       return dce_audio_create(ctx, inst, &audio_regs[inst], &audio_shift, &audio_mask);
+}
+
+#define stream_enc_regs(id)\
+               [id] = { SE_DCN3_REG_LIST(id) }
+
+static const struct dcn10_stream_enc_registers stream_enc_regs[] = {
+               stream_enc_regs(0),
+               stream_enc_regs(1)
+};
+
+static const struct dcn10_stream_encoder_shift se_shift = {
+               SE_COMMON_MASK_SH_LIST_DCN30(__SHIFT)
+};
+
+static const struct dcn10_stream_encoder_mask se_mask = {
+               SE_COMMON_MASK_SH_LIST_DCN30(_MASK)
+};
+
+static struct stream_encoder *dcn303_stream_encoder_create(enum engine_id eng_id, struct dc_context *ctx)
+{
+       struct dcn10_stream_encoder *enc1;
+       struct vpg *vpg;
+       struct afmt *afmt;
+       int vpg_inst;
+       int afmt_inst;
+
+       /* Mapping of VPG, AFMT, DME register blocks to DIO block instance */
+       if (eng_id <= ENGINE_ID_DIGB) {
+               vpg_inst = eng_id;
+               afmt_inst = eng_id;
+       } else
+               return NULL;
+
+       enc1 = kzalloc(sizeof(struct dcn10_stream_encoder), GFP_KERNEL);
+       vpg = dcn303_vpg_create(ctx, vpg_inst);
+       afmt = dcn303_afmt_create(ctx, afmt_inst);
+
+       if (!enc1 || !vpg || !afmt) {
+               kfree(enc1);
+               kfree(vpg);
+               kfree(afmt);
+               return NULL;
+       }
+
+       dcn30_dio_stream_encoder_construct(enc1, ctx, ctx->dc_bios, eng_id, vpg, afmt, &stream_enc_regs[eng_id],
+                       &se_shift, &se_mask);
+
+       return &enc1->base;
+}
+
+#define clk_src_regs(index, pllid)\
+               [index] = { CS_COMMON_REG_LIST_DCN3_03(index, pllid) }
+
+static const struct dce110_clk_src_regs clk_src_regs[] = {
+               clk_src_regs(0, A),
+               clk_src_regs(1, B)
+};
+
+static const struct dce110_clk_src_shift cs_shift = {
+               CS_COMMON_MASK_SH_LIST_DCN2_0(__SHIFT)
+};
+
+static const struct dce110_clk_src_mask cs_mask = {
+               CS_COMMON_MASK_SH_LIST_DCN2_0(_MASK)
+};
+
+static struct clock_source *dcn303_clock_source_create(struct dc_context *ctx, struct dc_bios *bios,
+               enum clock_source_id id, const struct dce110_clk_src_regs *regs, bool dp_clk_src)
+{
+       struct dce110_clk_src *clk_src = kzalloc(sizeof(struct dce110_clk_src), GFP_KERNEL);
+
+       if (!clk_src)
+               return NULL;
+
+       if (dcn3_clk_src_construct(clk_src, ctx, bios, id, regs, &cs_shift, &cs_mask)) {
+               clk_src->base.dp_clk_src = dp_clk_src;
+               return &clk_src->base;
+       }
+
+       kfree(clk_src);
+       BREAK_TO_DEBUGGER();
+       return NULL;
+}
+
+static const struct dce_hwseq_registers hwseq_reg = {
+               HWSEQ_DCN303_REG_LIST()
+};
+
+static const struct dce_hwseq_shift hwseq_shift = {
+               HWSEQ_DCN303_MASK_SH_LIST(__SHIFT)
+};
+
+static const struct dce_hwseq_mask hwseq_mask = {
+               HWSEQ_DCN303_MASK_SH_LIST(_MASK)
+};
+
+static struct dce_hwseq *dcn303_hwseq_create(struct dc_context *ctx)
+{
+       struct dce_hwseq *hws = kzalloc(sizeof(struct dce_hwseq), GFP_KERNEL);
+
+       if (hws) {
+               hws->ctx = ctx;
+               hws->regs = &hwseq_reg;
+               hws->shifts = &hwseq_shift;
+               hws->masks = &hwseq_mask;
+       }
+       return hws;
+}
+
+#define hubp_regs(id)\
+               [id] = { HUBP_REG_LIST_DCN30(id) }
+
+static const struct dcn_hubp2_registers hubp_regs[] = {
+               hubp_regs(0),
+               hubp_regs(1)
+};
+
+static const struct dcn_hubp2_shift hubp_shift = {
+               HUBP_MASK_SH_LIST_DCN30(__SHIFT)
+};
+
+static const struct dcn_hubp2_mask hubp_mask = {
+               HUBP_MASK_SH_LIST_DCN30(_MASK)
+};
+
+static struct hubp *dcn303_hubp_create(struct dc_context *ctx, uint32_t inst)
+{
+       struct dcn20_hubp *hubp2 = kzalloc(sizeof(struct dcn20_hubp), GFP_KERNEL);
+
+       if (!hubp2)
+               return NULL;
+
+       if (hubp3_construct(hubp2, ctx, inst, &hubp_regs[inst], &hubp_shift, &hubp_mask))
+               return &hubp2->base;
+
+       BREAK_TO_DEBUGGER();
+       kfree(hubp2);
+       return NULL;
+}
+
+#define dpp_regs(id)\
+               [id] = { DPP_REG_LIST_DCN30(id) }
+
+static const struct dcn3_dpp_registers dpp_regs[] = {
+               dpp_regs(0),
+               dpp_regs(1)
+};
+
+static const struct dcn3_dpp_shift tf_shift = {
+               DPP_REG_LIST_SH_MASK_DCN30(__SHIFT)
+};
+
+static const struct dcn3_dpp_mask tf_mask = {
+               DPP_REG_LIST_SH_MASK_DCN30(_MASK)
+};
+
+static struct dpp *dcn303_dpp_create(struct dc_context *ctx, uint32_t inst)
+{
+       struct dcn3_dpp *dpp = kzalloc(sizeof(struct dcn3_dpp), GFP_KERNEL);
+
+       if (!dpp)
+               return NULL;
+
+       if (dpp3_construct(dpp, ctx, inst, &dpp_regs[inst], &tf_shift, &tf_mask))
+               return &dpp->base;
+
+       BREAK_TO_DEBUGGER();
+       kfree(dpp);
+       return NULL;
+}
+
+#define opp_regs(id)\
+               [id] = { OPP_REG_LIST_DCN30(id) }
+
+static const struct dcn20_opp_registers opp_regs[] = {
+               opp_regs(0),
+               opp_regs(1)
+};
+
+static const struct dcn20_opp_shift opp_shift = {
+               OPP_MASK_SH_LIST_DCN20(__SHIFT)
+};
+
+static const struct dcn20_opp_mask opp_mask = {
+               OPP_MASK_SH_LIST_DCN20(_MASK)
+};
+
+static struct output_pixel_processor *dcn303_opp_create(struct dc_context *ctx, uint32_t inst)
+{
+       struct dcn20_opp *opp = kzalloc(sizeof(struct dcn20_opp), GFP_KERNEL);
+
+       if (!opp) {
+               BREAK_TO_DEBUGGER();
+               return NULL;
+       }
+
+       dcn20_opp_construct(opp, ctx, inst, &opp_regs[inst], &opp_shift, &opp_mask);
+       return &opp->base;
+}
+
+#define optc_regs(id)\
+               [id] = { OPTC_COMMON_REG_LIST_DCN3_0(id) }
+
+static const struct dcn_optc_registers optc_regs[] = {
+               optc_regs(0),
+               optc_regs(1)
+};
+
+static const struct dcn_optc_shift optc_shift = {
+               OPTC_COMMON_MASK_SH_LIST_DCN30(__SHIFT)
+};
+
+static const struct dcn_optc_mask optc_mask = {
+               OPTC_COMMON_MASK_SH_LIST_DCN30(_MASK)
+};
+
+static struct timing_generator *dcn303_timing_generator_create(struct dc_context *ctx, uint32_t instance)
+{
+       struct optc *tgn10 = kzalloc(sizeof(struct optc), GFP_KERNEL);
+
+       if (!tgn10)
+               return NULL;
+
+       tgn10->base.inst = instance;
+       tgn10->base.ctx = ctx;
+
+       tgn10->tg_regs = &optc_regs[instance];
+       tgn10->tg_shift = &optc_shift;
+       tgn10->tg_mask = &optc_mask;
+
+       dcn30_timing_generator_init(tgn10);
+
+       return &tgn10->base;
+}
+
+static const struct dcn30_mpc_registers mpc_regs = {
+               MPC_REG_LIST_DCN3_0(0),
+               MPC_REG_LIST_DCN3_0(1),
+               MPC_OUT_MUX_REG_LIST_DCN3_0(0),
+               MPC_OUT_MUX_REG_LIST_DCN3_0(1),
+               MPC_RMU_GLOBAL_REG_LIST_DCN3AG,
+               MPC_RMU_REG_LIST_DCN3AG(0),
+               MPC_DWB_MUX_REG_LIST_DCN3_0(0),
+};
+
+static const struct dcn30_mpc_shift mpc_shift = {
+               MPC_COMMON_MASK_SH_LIST_DCN303(__SHIFT)
+};
+
+static const struct dcn30_mpc_mask mpc_mask = {
+               MPC_COMMON_MASK_SH_LIST_DCN303(_MASK)
+};
+
+static struct mpc *dcn303_mpc_create(struct dc_context *ctx, int num_mpcc, int num_rmu)
+{
+       struct dcn30_mpc *mpc30 = kzalloc(sizeof(struct dcn30_mpc), GFP_KERNEL);
+
+       if (!mpc30)
+               return NULL;
+
+       dcn30_mpc_construct(mpc30, ctx, &mpc_regs, &mpc_shift, &mpc_mask, num_mpcc, num_rmu);
+
+       return &mpc30->base;
+}
+
+#define dsc_regsDCN20(id)\
+[id] = { DSC_REG_LIST_DCN20(id) }
+
+static const struct dcn20_dsc_registers dsc_regs[] = {
+               dsc_regsDCN20(0),
+               dsc_regsDCN20(1)
+};
+
+static const struct dcn20_dsc_shift dsc_shift = {
+               DSC_REG_LIST_SH_MASK_DCN20(__SHIFT)
+};
+
+static const struct dcn20_dsc_mask dsc_mask = {
+               DSC_REG_LIST_SH_MASK_DCN20(_MASK)
+};
+
+static struct display_stream_compressor *dcn303_dsc_create(struct dc_context *ctx, uint32_t inst)
+{
+       struct dcn20_dsc *dsc = kzalloc(sizeof(struct dcn20_dsc), GFP_KERNEL);
+
+       if (!dsc) {
+               BREAK_TO_DEBUGGER();
+               return NULL;
+       }
+
+       dsc2_construct(dsc, ctx, inst, &dsc_regs[inst], &dsc_shift, &dsc_mask);
+       return &dsc->base;
+}
+
+#define dwbc_regs_dcn3(id)\
+[id] = { DWBC_COMMON_REG_LIST_DCN30(id) }
+
+static const struct dcn30_dwbc_registers dwbc30_regs[] = {
+               dwbc_regs_dcn3(0)
+};
+
+static const struct dcn30_dwbc_shift dwbc30_shift = {
+               DWBC_COMMON_MASK_SH_LIST_DCN30(__SHIFT)
+};
+
+static const struct dcn30_dwbc_mask dwbc30_mask = {
+               DWBC_COMMON_MASK_SH_LIST_DCN30(_MASK)
+};
+
+static bool dcn303_dwbc_create(struct dc_context *ctx, struct resource_pool *pool)
+{
+       int i;
+       uint32_t pipe_count = pool->res_cap->num_dwb;
+
+       for (i = 0; i < pipe_count; i++) {
+               struct dcn30_dwbc *dwbc30 = kzalloc(sizeof(struct dcn30_dwbc), GFP_KERNEL);
+
+               if (!dwbc30) {
+                       dm_error("DC: failed to create dwbc30!\n");
+                       return false;
+               }
+
+               dcn30_dwbc_construct(dwbc30, ctx, &dwbc30_regs[i], &dwbc30_shift, &dwbc30_mask, i);
+
+               pool->dwbc[i] = &dwbc30->base;
+       }
+       return true;
+}
+
+#define mcif_wb_regs_dcn3(id)\
+[id] = { MCIF_WB_COMMON_REG_LIST_DCN30(id) }
+
+static const struct dcn30_mmhubbub_registers mcif_wb30_regs[] = {
+               mcif_wb_regs_dcn3(0)
+};
+
+static const struct dcn30_mmhubbub_shift mcif_wb30_shift = {
+               MCIF_WB_COMMON_MASK_SH_LIST_DCN30(__SHIFT)
+};
+
+static const struct dcn30_mmhubbub_mask mcif_wb30_mask = {
+               MCIF_WB_COMMON_MASK_SH_LIST_DCN30(_MASK)
+};
+
+static bool dcn303_mmhubbub_create(struct dc_context *ctx, struct resource_pool *pool)
+{
+       int i;
+       uint32_t pipe_count = pool->res_cap->num_dwb;
+
+       for (i = 0; i < pipe_count; i++) {
+               struct dcn30_mmhubbub *mcif_wb30 = kzalloc(sizeof(struct dcn30_mmhubbub), GFP_KERNEL);
+
+               if (!mcif_wb30) {
+                       dm_error("DC: failed to create mcif_wb30!\n");
+                       return false;
+               }
+
+               dcn30_mmhubbub_construct(mcif_wb30, ctx, &mcif_wb30_regs[i], &mcif_wb30_shift, &mcif_wb30_mask, i);
+
+               pool->mcif_wb[i] = &mcif_wb30->base;
+       }
+       return true;
+}
+
+#define aux_engine_regs(id)\
+[id] = {\
+               AUX_COMMON_REG_LIST0(id), \
+               .AUXN_IMPCAL = 0, \
+               .AUXP_IMPCAL = 0, \
+               .AUX_RESET_MASK = DP_AUX0_AUX_CONTROL__AUX_RESET_MASK, \
+}
+
+static const struct dce110_aux_registers aux_engine_regs[] = {
+               aux_engine_regs(0),
+               aux_engine_regs(1)
+};
+
+static const struct dce110_aux_registers_shift aux_shift = {
+               DCN_AUX_MASK_SH_LIST(__SHIFT)
+};
+
+static const struct dce110_aux_registers_mask aux_mask = {
+               DCN_AUX_MASK_SH_LIST(_MASK)
+};
+
+static struct dce_aux *dcn303_aux_engine_create(struct dc_context *ctx, uint32_t inst)
+{
+       struct aux_engine_dce110 *aux_engine = kzalloc(sizeof(struct aux_engine_dce110), GFP_KERNEL);
+
+       if (!aux_engine)
+               return NULL;
+
+       dce110_aux_engine_construct(aux_engine, ctx, inst, SW_AUX_TIMEOUT_PERIOD_MULTIPLIER * AUX_TIMEOUT_PERIOD,
+                       &aux_engine_regs[inst], &aux_mask, &aux_shift, ctx->dc->caps.extended_aux_timeout_support);
+
+       return &aux_engine->base;
+}
+
+#define i2c_inst_regs(id) { I2C_HW_ENGINE_COMMON_REG_LIST(id) }
+
+static const struct dce_i2c_registers i2c_hw_regs[] = {
+               i2c_inst_regs(1),
+               i2c_inst_regs(2)
+};
+
+static const struct dce_i2c_shift i2c_shifts = {
+               I2C_COMMON_MASK_SH_LIST_DCN2(__SHIFT)
+};
+
+static const struct dce_i2c_mask i2c_masks = {
+               I2C_COMMON_MASK_SH_LIST_DCN2(_MASK)
+};
+
+static struct dce_i2c_hw *dcn303_i2c_hw_create(struct dc_context *ctx, uint32_t inst)
+{
+       struct dce_i2c_hw *dce_i2c_hw = kzalloc(sizeof(struct dce_i2c_hw), GFP_KERNEL);
+
+       if (!dce_i2c_hw)
+               return NULL;
+
+       dcn2_i2c_hw_construct(dce_i2c_hw, ctx, inst, &i2c_hw_regs[inst], &i2c_shifts, &i2c_masks);
+
+       return dce_i2c_hw;
+}
+
+static const struct encoder_feature_support link_enc_feature = {
+               .max_hdmi_deep_color = COLOR_DEPTH_121212,
+               .max_hdmi_pixel_clock = 600000,
+               .hdmi_ycbcr420_supported = true,
+               .dp_ycbcr420_supported = true,
+               .fec_supported = true,
+               .flags.bits.IS_HBR2_CAPABLE = true,
+               .flags.bits.IS_HBR3_CAPABLE = true,
+               .flags.bits.IS_TPS3_CAPABLE = true,
+               .flags.bits.IS_TPS4_CAPABLE = true
+};
+
+#define link_regs(id, phyid)\
+               [id] = {\
+                               LE_DCN3_REG_LIST(id), \
+                               UNIPHY_DCN2_REG_LIST(phyid), \
+                               SRI(DP_DPHY_INTERNAL_CTRL, DP, id) \
+               }
+
+static const struct dcn10_link_enc_registers link_enc_regs[] = {
+               link_regs(0, A),
+               link_regs(1, B)
+};
+
+static const struct dcn10_link_enc_shift le_shift = {
+               LINK_ENCODER_MASK_SH_LIST_DCN30(__SHIFT),
+               DPCS_DCN2_MASK_SH_LIST(__SHIFT)
+};
+
+static const struct dcn10_link_enc_mask le_mask = {
+               LINK_ENCODER_MASK_SH_LIST_DCN30(_MASK),
+               DPCS_DCN2_MASK_SH_LIST(_MASK)
+};
+
+#define aux_regs(id)\
+               [id] = { DCN2_AUX_REG_LIST(id) }
+
+static const struct dcn10_link_enc_aux_registers link_enc_aux_regs[] = {
+               aux_regs(0),
+               aux_regs(1)
+};
+
+#define hpd_regs(id)\
+               [id] = { HPD_REG_LIST(id) }
+
+static const struct dcn10_link_enc_hpd_registers link_enc_hpd_regs[] = {
+               hpd_regs(0),
+               hpd_regs(1)
+};
+
+static struct link_encoder *dcn303_link_encoder_create(
+       struct dc_context *ctx,
+       const struct encoder_init_data *enc_init_data)
+{
+       struct dcn20_link_encoder *enc20 = kzalloc(sizeof(struct dcn20_link_encoder), GFP_KERNEL);
+
+       if (!enc20)
+               return NULL;
+
+       dcn30_link_encoder_construct(enc20, enc_init_data, &link_enc_feature,
+                       &link_enc_regs[enc_init_data->transmitter], &link_enc_aux_regs[enc_init_data->channel - 1],
+                       &link_enc_hpd_regs[enc_init_data->hpd_source], &le_shift, &le_mask);
+
+       return &enc20->enc10.base;
+}
+
+static const struct dce_panel_cntl_registers panel_cntl_regs[] = {
+               { DCN_PANEL_CNTL_REG_LIST() }
+};
+
+static const struct dce_panel_cntl_shift panel_cntl_shift = {
+               DCE_PANEL_CNTL_MASK_SH_LIST(__SHIFT)
+};
+
+static const struct dce_panel_cntl_mask panel_cntl_mask = {
+               DCE_PANEL_CNTL_MASK_SH_LIST(_MASK)
+};
+
+static struct panel_cntl *dcn303_panel_cntl_create(const struct panel_cntl_init_data *init_data)
+{
+       struct dce_panel_cntl *panel_cntl = kzalloc(sizeof(struct dce_panel_cntl), GFP_KERNEL);
+
+       if (!panel_cntl)
+               return NULL;
+
+       dce_panel_cntl_construct(panel_cntl, init_data, &panel_cntl_regs[init_data->inst],
+                       &panel_cntl_shift, &panel_cntl_mask);
+
+       return &panel_cntl->base;
+}
+
+static void read_dce_straps(struct dc_context *ctx, struct resource_straps *straps)
+{
+       generic_reg_get(ctx, mmDC_PINSTRAPS + BASE(mmDC_PINSTRAPS_BASE_IDX),
+                       FN(DC_PINSTRAPS, DC_PINSTRAPS_AUDIO), &straps->dc_pinstraps_audio);
+}
+
+static const struct resource_create_funcs res_create_funcs = {
+               .read_dce_straps = read_dce_straps,
+               .create_audio = dcn303_create_audio,
+               .create_stream_encoder = dcn303_stream_encoder_create,
+               .create_hwseq = dcn303_hwseq_create,
+};
+
+static bool is_soc_bounding_box_valid(struct dc *dc)
+{
+       uint32_t hw_internal_rev = dc->ctx->asic_id.hw_internal_rev;
+
+       if (ASICREV_IS_BEIGE_GOBY_P(hw_internal_rev))
+               return true;
+
+       return false;
+}
+
+static bool init_soc_bounding_box(struct dc *dc,  struct resource_pool *pool)
+{
+       struct _vcs_dpi_soc_bounding_box_st *loaded_bb = &dcn3_03_soc;
+       struct _vcs_dpi_ip_params_st *loaded_ip = &dcn3_03_ip;
+
+       DC_LOGGER_INIT(dc->ctx->logger);
+
+       if (!is_soc_bounding_box_valid(dc)) {
+               DC_LOG_ERROR("%s: not valid soc bounding box/n", __func__);
+               return false;
+       }
+
+       loaded_ip->max_num_otg = pool->pipe_count;
+       loaded_ip->max_num_dpp = pool->pipe_count;
+       loaded_ip->clamp_min_dcfclk = dc->config.clamp_min_dcfclk;
+       DC_FP_START();
+       dcn20_patch_bounding_box(dc, loaded_bb);
+       DC_FP_END();
+
+       if (dc->ctx->dc_bios->funcs->get_soc_bb_info) {
+               struct bp_soc_bb_info bb_info = { 0 };
+
+               if (dc->ctx->dc_bios->funcs->get_soc_bb_info(
+                           dc->ctx->dc_bios, &bb_info) == BP_RESULT_OK) {
+                                       DC_FP_START();
+                                       dcn303_fpu_init_soc_bounding_box(bb_info);
+                                       DC_FP_END();
+               }
+       }
+
+       return true;
+}
+
+static void dcn303_resource_destruct(struct resource_pool *pool)
+{
+       unsigned int i;
+
+       for (i = 0; i < pool->stream_enc_count; i++) {
+               if (pool->stream_enc[i] != NULL) {
+                       if (pool->stream_enc[i]->vpg != NULL) {
+                               kfree(DCN30_VPG_FROM_VPG(pool->stream_enc[i]->vpg));
+                               pool->stream_enc[i]->vpg = NULL;
+                       }
+                       if (pool->stream_enc[i]->afmt != NULL) {
+                               kfree(DCN30_AFMT_FROM_AFMT(pool->stream_enc[i]->afmt));
+                               pool->stream_enc[i]->afmt = NULL;
+                       }
+                       kfree(DCN10STRENC_FROM_STRENC(pool->stream_enc[i]));
+                       pool->stream_enc[i] = NULL;
+               }
+       }
+
+       for (i = 0; i < pool->res_cap->num_dsc; i++) {
+               if (pool->dscs[i] != NULL)
+                       dcn20_dsc_destroy(&pool->dscs[i]);
+       }
+
+       if (pool->mpc != NULL) {
+               kfree(TO_DCN20_MPC(pool->mpc));
+               pool->mpc = NULL;
+       }
+
+       if (pool->hubbub != NULL) {
+               kfree(pool->hubbub);
+               pool->hubbub = NULL;
+       }
+
+       for (i = 0; i < pool->pipe_count; i++) {
+               if (pool->dpps[i] != NULL) {
+                       kfree(TO_DCN20_DPP(pool->dpps[i]));
+                       pool->dpps[i] = NULL;
+               }
+
+               if (pool->hubps[i] != NULL) {
+                       kfree(TO_DCN20_HUBP(pool->hubps[i]));
+                       pool->hubps[i] = NULL;
+               }
+
+               if (pool->irqs != NULL)
+                       dal_irq_service_destroy(&pool->irqs);
+       }
+
+       for (i = 0; i < pool->res_cap->num_ddc; i++) {
+               if (pool->engines[i] != NULL)
+                       dce110_engine_destroy(&pool->engines[i]);
+               if (pool->hw_i2cs[i] != NULL) {
+                       kfree(pool->hw_i2cs[i]);
+                       pool->hw_i2cs[i] = NULL;
+               }
+               if (pool->sw_i2cs[i] != NULL) {
+                       kfree(pool->sw_i2cs[i]);
+                       pool->sw_i2cs[i] = NULL;
+               }
+       }
+
+       for (i = 0; i < pool->res_cap->num_opp; i++) {
+               if (pool->opps[i] != NULL)
+                       pool->opps[i]->funcs->opp_destroy(&pool->opps[i]);
+       }
+
+       for (i = 0; i < pool->res_cap->num_timing_generator; i++) {
+               if (pool->timing_generators[i] != NULL) {
+                       kfree(DCN10TG_FROM_TG(pool->timing_generators[i]));
+                       pool->timing_generators[i] = NULL;
+               }
+       }
+
+       for (i = 0; i < pool->res_cap->num_dwb; i++) {
+               if (pool->dwbc[i] != NULL) {
+                       kfree(TO_DCN30_DWBC(pool->dwbc[i]));
+                       pool->dwbc[i] = NULL;
+               }
+               if (pool->mcif_wb[i] != NULL) {
+                       kfree(TO_DCN30_MMHUBBUB(pool->mcif_wb[i]));
+                       pool->mcif_wb[i] = NULL;
+               }
+       }
+
+       for (i = 0; i < pool->audio_count; i++) {
+               if (pool->audios[i])
+                       dce_aud_destroy(&pool->audios[i]);
+       }
+
+       for (i = 0; i < pool->clk_src_count; i++) {
+               if (pool->clock_sources[i] != NULL)
+                       dcn20_clock_source_destroy(&pool->clock_sources[i]);
+       }
+
+       if (pool->dp_clock_source != NULL)
+               dcn20_clock_source_destroy(&pool->dp_clock_source);
+
+       for (i = 0; i < pool->res_cap->num_mpc_3dlut; i++) {
+               if (pool->mpc_lut[i] != NULL) {
+                       dc_3dlut_func_release(pool->mpc_lut[i]);
+                       pool->mpc_lut[i] = NULL;
+               }
+               if (pool->mpc_shaper[i] != NULL) {
+                       dc_transfer_func_release(pool->mpc_shaper[i]);
+                       pool->mpc_shaper[i] = NULL;
+               }
+       }
+
+       for (i = 0; i < pool->pipe_count; i++) {
+               if (pool->multiple_abms[i] != NULL)
+                       dce_abm_destroy(&pool->multiple_abms[i]);
+       }
+
+       if (pool->psr != NULL)
+               dmub_psr_destroy(&pool->psr);
+
+       if (pool->dccg != NULL)
+               dcn_dccg_destroy(&pool->dccg);
+
+       if (pool->oem_device != NULL) {
+               struct dc *dc = pool->oem_device->ctx->dc;
+
+               dc->link_srv->destroy_ddc_service(&pool->oem_device);
+       }
+}
+
+static void dcn303_destroy_resource_pool(struct resource_pool **pool)
+{
+       dcn303_resource_destruct(*pool);
+       kfree(*pool);
+       *pool = NULL;
+}
+
+static void dcn303_get_panel_config_defaults(struct dc_panel_config *panel_config)
+{
+       *panel_config = panel_config_defaults;
+}
+
+void dcn303_update_bw_bounding_box(struct dc *dc, struct clk_bw_params *bw_params)
+{
+       DC_FP_START();
+       dcn303_fpu_update_bw_bounding_box(dc, bw_params);
+       DC_FP_END();
+}
+
+static struct resource_funcs dcn303_res_pool_funcs = {
+               .destroy = dcn303_destroy_resource_pool,
+               .link_enc_create = dcn303_link_encoder_create,
+               .panel_cntl_create = dcn303_panel_cntl_create,
+               .validate_bandwidth = dcn30_validate_bandwidth,
+               .calculate_wm_and_dlg = dcn30_calculate_wm_and_dlg,
+               .update_soc_for_wm_a = dcn30_update_soc_for_wm_a,
+               .populate_dml_pipes = dcn30_populate_dml_pipes_from_context,
+               .acquire_free_pipe_as_secondary_dpp_pipe = dcn20_acquire_free_pipe_for_layer,
+               .release_pipe = dcn20_release_pipe,
+               .add_stream_to_ctx = dcn30_add_stream_to_ctx,
+               .add_dsc_to_stream_resource = dcn20_add_dsc_to_stream_resource,
+               .remove_stream_from_ctx = dcn20_remove_stream_from_ctx,
+               .populate_dml_writeback_from_context = dcn30_populate_dml_writeback_from_context,
+               .set_mcif_arb_params = dcn30_set_mcif_arb_params,
+               .find_first_free_match_stream_enc_for_link = dcn10_find_first_free_match_stream_enc_for_link,
+               .acquire_post_bldn_3dlut = dcn30_acquire_post_bldn_3dlut,
+               .release_post_bldn_3dlut = dcn30_release_post_bldn_3dlut,
+               .update_bw_bounding_box = dcn303_update_bw_bounding_box,
+               .patch_unknown_plane_state = dcn20_patch_unknown_plane_state,
+               .get_panel_config_defaults = dcn303_get_panel_config_defaults,
+};
+
+static struct dc_cap_funcs cap_funcs = {
+               .get_dcc_compression_cap = dcn20_get_dcc_compression_cap
+};
+
+static const struct bios_registers bios_regs = {
+               NBIO_SR(BIOS_SCRATCH_3),
+               NBIO_SR(BIOS_SCRATCH_6)
+};
+
+static const struct dccg_registers dccg_regs = {
+               DCCG_REG_LIST_DCN3_03()
+};
+
+static const struct dccg_shift dccg_shift = {
+               DCCG_MASK_SH_LIST_DCN3_03(__SHIFT)
+};
+
+static const struct dccg_mask dccg_mask = {
+               DCCG_MASK_SH_LIST_DCN3_03(_MASK)
+};
+
+#define abm_regs(id)\
+               [id] = { ABM_DCN302_REG_LIST(id) }
+
+static const struct dce_abm_registers abm_regs[] = {
+               abm_regs(0),
+               abm_regs(1)
+};
+
+static const struct dce_abm_shift abm_shift = {
+               ABM_MASK_SH_LIST_DCN30(__SHIFT)
+};
+
+static const struct dce_abm_mask abm_mask = {
+               ABM_MASK_SH_LIST_DCN30(_MASK)
+};
+
+static bool dcn303_resource_construct(
+               uint8_t num_virtual_links,
+               struct dc *dc,
+               struct resource_pool *pool)
+{
+       int i;
+       struct dc_context *ctx = dc->ctx;
+       struct irq_service_init_data init_data;
+       struct ddc_service_init_data ddc_init_data;
+
+       ctx->dc_bios->regs = &bios_regs;
+
+       pool->res_cap = &res_cap_dcn303;
+
+       pool->funcs = &dcn303_res_pool_funcs;
+
+       /*************************************************
+        *  Resource + asic cap harcoding                *
+        *************************************************/
+       pool->underlay_pipe_index = NO_UNDERLAY_PIPE;
+       pool->pipe_count = pool->res_cap->num_timing_generator;
+       pool->mpcc_count = pool->res_cap->num_timing_generator;
+       dc->caps.max_downscale_ratio = 600;
+       dc->caps.i2c_speed_in_khz = 100;
+       dc->caps.i2c_speed_in_khz_hdcp = 5; /*1.4 w/a applied by derfault*/
+       dc->caps.max_cursor_size = 256;
+       dc->caps.min_horizontal_blanking_period = 80;
+       dc->caps.dmdata_alloc_size = 2048;
+       dc->caps.mall_size_per_mem_channel = 4;
+       /* total size = mall per channel * num channels * 1024 * 1024 */
+       dc->caps.mall_size_total = dc->caps.mall_size_per_mem_channel *
+                                  dc->ctx->dc_bios->vram_info.num_chans *
+                                  1024 * 1024;
+       dc->caps.cursor_cache_size =
+               dc->caps.max_cursor_size * dc->caps.max_cursor_size * 8;
+       dc->caps.max_slave_planes = 1;
+       dc->caps.post_blend_color_processing = true;
+       dc->caps.force_dp_tps4_for_cp2520 = true;
+       dc->caps.extended_aux_timeout_support = true;
+       dc->caps.dmcub_support = true;
+       dc->caps.max_v_total = (1 << 15) - 1;
+
+       /* Color pipeline capabilities */
+       dc->caps.color.dpp.dcn_arch = 1;
+       dc->caps.color.dpp.input_lut_shared = 0;
+       dc->caps.color.dpp.icsc = 1;
+       dc->caps.color.dpp.dgam_ram = 0; // must use gamma_corr
+       dc->caps.color.dpp.dgam_rom_caps.srgb = 1;
+       dc->caps.color.dpp.dgam_rom_caps.bt2020 = 1;
+       dc->caps.color.dpp.dgam_rom_caps.gamma2_2 = 1;
+       dc->caps.color.dpp.dgam_rom_caps.pq = 1;
+       dc->caps.color.dpp.dgam_rom_caps.hlg = 1;
+       dc->caps.color.dpp.post_csc = 1;
+       dc->caps.color.dpp.gamma_corr = 1;
+       dc->caps.color.dpp.dgam_rom_for_yuv = 0;
+
+       dc->caps.color.dpp.hw_3d_lut = 1;
+       dc->caps.color.dpp.ogam_ram = 1;
+       // no OGAM ROM on DCN3
+       dc->caps.color.dpp.ogam_rom_caps.srgb = 0;
+       dc->caps.color.dpp.ogam_rom_caps.bt2020 = 0;
+       dc->caps.color.dpp.ogam_rom_caps.gamma2_2 = 0;
+       dc->caps.color.dpp.ogam_rom_caps.pq = 0;
+       dc->caps.color.dpp.ogam_rom_caps.hlg = 0;
+       dc->caps.color.dpp.ocsc = 0;
+
+       dc->caps.color.mpc.gamut_remap = 1;
+       dc->caps.color.mpc.num_3dluts = pool->res_cap->num_mpc_3dlut; //3
+       dc->caps.color.mpc.ogam_ram = 1;
+       dc->caps.color.mpc.ogam_rom_caps.srgb = 0;
+       dc->caps.color.mpc.ogam_rom_caps.bt2020 = 0;
+       dc->caps.color.mpc.ogam_rom_caps.gamma2_2 = 0;
+       dc->caps.color.mpc.ogam_rom_caps.pq = 0;
+       dc->caps.color.mpc.ogam_rom_caps.hlg = 0;
+       dc->caps.color.mpc.ocsc = 1;
+
+       dc->caps.dp_hdmi21_pcon_support = true;
+
+       dc->config.dc_mode_clk_limit_support = true;
+       /* read VBIOS LTTPR caps */
+       if (ctx->dc_bios->funcs->get_lttpr_caps) {
+               enum bp_result bp_query_result;
+               uint8_t is_vbios_lttpr_enable = 0;
+
+               bp_query_result = ctx->dc_bios->funcs->get_lttpr_caps(ctx->dc_bios, &is_vbios_lttpr_enable);
+               dc->caps.vbios_lttpr_enable = (bp_query_result == BP_RESULT_OK) && !!is_vbios_lttpr_enable;
+       }
+
+       if (ctx->dc_bios->funcs->get_lttpr_interop) {
+               enum bp_result bp_query_result;
+               uint8_t is_vbios_interop_enabled = 0;
+
+               bp_query_result = ctx->dc_bios->funcs->get_lttpr_interop(ctx->dc_bios, &is_vbios_interop_enabled);
+               dc->caps.vbios_lttpr_aware = (bp_query_result == BP_RESULT_OK) && !!is_vbios_interop_enabled;
+       }
+
+       if (dc->ctx->dce_environment == DCE_ENV_PRODUCTION_DRV)
+               dc->debug = debug_defaults_drv;
+
+       // Init the vm_helper
+       if (dc->vm_helper)
+               vm_helper_init(dc->vm_helper, 16);
+
+       /*************************************************
+        *  Create resources                             *
+        *************************************************/
+
+       /* Clock Sources for Pixel Clock*/
+       pool->clock_sources[DCN303_CLK_SRC_PLL0] =
+                       dcn303_clock_source_create(ctx, ctx->dc_bios,
+                                       CLOCK_SOURCE_COMBO_PHY_PLL0,
+                                       &clk_src_regs[0], false);
+       pool->clock_sources[DCN303_CLK_SRC_PLL1] =
+                       dcn303_clock_source_create(ctx, ctx->dc_bios,
+                                       CLOCK_SOURCE_COMBO_PHY_PLL1,
+                                       &clk_src_regs[1], false);
+
+       pool->clk_src_count = DCN303_CLK_SRC_TOTAL;
+
+       /* todo: not reuse phy_pll registers */
+       pool->dp_clock_source =
+                       dcn303_clock_source_create(ctx, ctx->dc_bios,
+                                       CLOCK_SOURCE_ID_DP_DTO,
+                                       &clk_src_regs[0], true);
+
+       for (i = 0; i < pool->clk_src_count; i++) {
+               if (pool->clock_sources[i] == NULL) {
+                       dm_error("DC: failed to create clock sources!\n");
+                       BREAK_TO_DEBUGGER();
+                       goto create_fail;
+               }
+       }
+
+       /* DCCG */
+       pool->dccg = dccg30_create(ctx, &dccg_regs, &dccg_shift, &dccg_mask);
+       if (pool->dccg == NULL) {
+               dm_error("DC: failed to create dccg!\n");
+               BREAK_TO_DEBUGGER();
+               goto create_fail;
+       }
+
+       /* PP Lib and SMU interfaces */
+       init_soc_bounding_box(dc, pool);
+
+       /* DML */
+       dml_init_instance(&dc->dml, &dcn3_03_soc, &dcn3_03_ip, DML_PROJECT_DCN30);
+
+       /* IRQ */
+       init_data.ctx = dc->ctx;
+       pool->irqs = dal_irq_service_dcn303_create(&init_data);
+       if (!pool->irqs)
+               goto create_fail;
+
+       /* HUBBUB */
+       pool->hubbub = dcn303_hubbub_create(ctx);
+       if (pool->hubbub == NULL) {
+               BREAK_TO_DEBUGGER();
+               dm_error("DC: failed to create hubbub!\n");
+               goto create_fail;
+       }
+
+       /* HUBPs, DPPs, OPPs and TGs */
+       for (i = 0; i < pool->pipe_count; i++) {
+               pool->hubps[i] = dcn303_hubp_create(ctx, i);
+               if (pool->hubps[i] == NULL) {
+                       BREAK_TO_DEBUGGER();
+                       dm_error("DC: failed to create hubps!\n");
+                       goto create_fail;
+               }
+
+               pool->dpps[i] = dcn303_dpp_create(ctx, i);
+               if (pool->dpps[i] == NULL) {
+                       BREAK_TO_DEBUGGER();
+                       dm_error("DC: failed to create dpps!\n");
+                       goto create_fail;
+               }
+       }
+
+       for (i = 0; i < pool->res_cap->num_opp; i++) {
+               pool->opps[i] = dcn303_opp_create(ctx, i);
+               if (pool->opps[i] == NULL) {
+                       BREAK_TO_DEBUGGER();
+                       dm_error("DC: failed to create output pixel processor!\n");
+                       goto create_fail;
+               }
+       }
+
+       for (i = 0; i < pool->res_cap->num_timing_generator; i++) {
+               pool->timing_generators[i] = dcn303_timing_generator_create(ctx, i);
+               if (pool->timing_generators[i] == NULL) {
+                       BREAK_TO_DEBUGGER();
+                       dm_error("DC: failed to create tg!\n");
+                       goto create_fail;
+               }
+       }
+       pool->timing_generator_count = i;
+
+       /* PSR */
+       pool->psr = dmub_psr_create(ctx);
+       if (pool->psr == NULL) {
+               dm_error("DC: failed to create psr!\n");
+               BREAK_TO_DEBUGGER();
+               goto create_fail;
+       }
+
+       /* ABM */
+       for (i = 0; i < pool->res_cap->num_timing_generator; i++) {
+               pool->multiple_abms[i] = dmub_abm_create(ctx, &abm_regs[i], &abm_shift, &abm_mask);
+               if (pool->multiple_abms[i] == NULL) {
+                       dm_error("DC: failed to create abm for pipe %d!\n", i);
+                       BREAK_TO_DEBUGGER();
+                       goto create_fail;
+               }
+       }
+
+       /* MPC and DSC */
+       pool->mpc = dcn303_mpc_create(ctx, pool->mpcc_count, pool->res_cap->num_mpc_3dlut);
+       if (pool->mpc == NULL) {
+               BREAK_TO_DEBUGGER();
+               dm_error("DC: failed to create mpc!\n");
+               goto create_fail;
+       }
+
+       for (i = 0; i < pool->res_cap->num_dsc; i++) {
+               pool->dscs[i] = dcn303_dsc_create(ctx, i);
+               if (pool->dscs[i] == NULL) {
+                       BREAK_TO_DEBUGGER();
+                       dm_error("DC: failed to create display stream compressor %d!\n", i);
+                       goto create_fail;
+               }
+       }
+
+       /* DWB and MMHUBBUB */
+       if (!dcn303_dwbc_create(ctx, pool)) {
+               BREAK_TO_DEBUGGER();
+               dm_error("DC: failed to create dwbc!\n");
+               goto create_fail;
+       }
+
+       if (!dcn303_mmhubbub_create(ctx, pool)) {
+               BREAK_TO_DEBUGGER();
+               dm_error("DC: failed to create mcif_wb!\n");
+               goto create_fail;
+       }
+
+       /* AUX and I2C */
+       for (i = 0; i < pool->res_cap->num_ddc; i++) {
+               pool->engines[i] = dcn303_aux_engine_create(ctx, i);
+               if (pool->engines[i] == NULL) {
+                       BREAK_TO_DEBUGGER();
+                       dm_error("DC:failed to create aux engine!!\n");
+                       goto create_fail;
+               }
+               pool->hw_i2cs[i] = dcn303_i2c_hw_create(ctx, i);
+               if (pool->hw_i2cs[i] == NULL) {
+                       BREAK_TO_DEBUGGER();
+                       dm_error("DC:failed to create hw i2c!!\n");
+                       goto create_fail;
+               }
+               pool->sw_i2cs[i] = NULL;
+       }
+
+       /* Audio, Stream Encoders including HPO and virtual, MPC 3D LUTs */
+       if (!resource_construct(num_virtual_links, dc, pool,
+                       &res_create_funcs))
+               goto create_fail;
+
+       /* HW Sequencer and Plane caps */
+       dcn303_hw_sequencer_construct(dc);
+
+       dc->caps.max_planes =  pool->pipe_count;
+
+       for (i = 0; i < dc->caps.max_planes; ++i)
+               dc->caps.planes[i] = plane_cap;
+
+       dc->cap_funcs = cap_funcs;
+
+       if (dc->ctx->dc_bios->fw_info.oem_i2c_present) {
+               ddc_init_data.ctx = dc->ctx;
+               ddc_init_data.link = NULL;
+               ddc_init_data.id.id = dc->ctx->dc_bios->fw_info.oem_i2c_obj_id;
+               ddc_init_data.id.enum_id = 0;
+               ddc_init_data.id.type = OBJECT_TYPE_GENERIC;
+               pool->oem_device = dc->link_srv->create_ddc_service(&ddc_init_data);
+       } else {
+               pool->oem_device = NULL;
+       }
+
+       return true;
+
+create_fail:
+
+       dcn303_resource_destruct(pool);
+
+       return false;
+}
+
+struct resource_pool *dcn303_create_resource_pool(const struct dc_init_data *init_data, struct dc *dc)
+{
+       struct resource_pool *pool = kzalloc(sizeof(struct resource_pool), GFP_KERNEL);
+
+       if (!pool)
+               return NULL;
+
+       if (dcn303_resource_construct(init_data->num_virtual_links, dc, pool))
+               return pool;
+
+       BREAK_TO_DEBUGGER();
+       kfree(pool);
+       return NULL;
+}
diff --git a/drivers/gpu/drm/amd/display/dc/resource/dcn303/dcn303_resource.h b/drivers/gpu/drm/amd/display/dc/resource/dcn303/dcn303_resource.h
new file mode 100644 (file)
index 0000000..37cf152
--- /dev/null
@@ -0,0 +1,38 @@
+// SPDX-License-Identifier: MIT
+/*
+ * Copyright (C) 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 _DCN303_RESOURCE_H_
+#define _DCN303_RESOURCE_H_
+
+#include "core_types.h"
+
+extern struct _vcs_dpi_ip_params_st dcn3_03_ip;
+extern struct _vcs_dpi_soc_bounding_box_st dcn3_03_soc;
+
+struct resource_pool *dcn303_create_resource_pool(const struct dc_init_data *init_data, struct dc *dc);
+
+void dcn303_update_bw_bounding_box(struct dc *dc, struct clk_bw_params *bw_params);
+
+#endif /* _DCN303_RESOURCE_H_ */
diff --git a/drivers/gpu/drm/amd/display/dc/resource/dcn31/dcn31_resource.c b/drivers/gpu/drm/amd/display/dc/resource/dcn31/dcn31_resource.c
new file mode 100644 (file)
index 0000000..31035fc
--- /dev/null
@@ -0,0 +1,2218 @@
+/*
+ * 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 "dm_services.h"
+#include "dc.h"
+
+#include "dcn31/dcn31_init.h"
+
+#include "resource.h"
+#include "include/irq_service_interface.h"
+#include "dcn31_resource.h"
+
+#include "dcn20/dcn20_resource.h"
+#include "dcn30/dcn30_resource.h"
+
+#include "dml/dcn30/dcn30_fpu.h"
+
+#include "dcn10/dcn10_ipp.h"
+#include "dcn30/dcn30_hubbub.h"
+#include "dcn31/dcn31_hubbub.h"
+#include "dcn30/dcn30_mpc.h"
+#include "dcn31/dcn31_hubp.h"
+#include "irq/dcn31/irq_service_dcn31.h"
+#include "dcn30/dcn30_dpp.h"
+#include "dcn31/dcn31_optc.h"
+#include "dcn20/dcn20_hwseq.h"
+#include "dcn30/dcn30_hwseq.h"
+#include "dce110/dce110_hwseq.h"
+#include "dcn30/dcn30_opp.h"
+#include "dcn20/dcn20_dsc.h"
+#include "dcn30/dcn30_vpg.h"
+#include "dcn30/dcn30_afmt.h"
+#include "dcn30/dcn30_dio_stream_encoder.h"
+#include "dcn31/dcn31_hpo_dp_stream_encoder.h"
+#include "dcn31/dcn31_hpo_dp_link_encoder.h"
+#include "dcn31/dcn31_apg.h"
+#include "dcn31/dcn31_dio_link_encoder.h"
+#include "dcn31/dcn31_vpg.h"
+#include "dcn31/dcn31_afmt.h"
+#include "dce/dce_clock_source.h"
+#include "dce/dce_audio.h"
+#include "dce/dce_hwseq.h"
+#include "clk_mgr.h"
+#include "virtual/virtual_stream_encoder.h"
+#include "dce110/dce110_resource.h"
+#include "dml/display_mode_vba.h"
+#include "dml/dcn31/dcn31_fpu.h"
+#include "dcn31/dcn31_dccg.h"
+#include "dcn10/dcn10_resource.h"
+#include "dcn31/dcn31_panel_cntl.h"
+
+#include "dcn30/dcn30_dwb.h"
+#include "dcn30/dcn30_mmhubbub.h"
+
+// TODO: change include headers /amd/include/asic_reg after upstream
+#include "yellow_carp_offset.h"
+#include "dcn/dcn_3_1_2_offset.h"
+#include "dcn/dcn_3_1_2_sh_mask.h"
+#include "nbio/nbio_7_2_0_offset.h"
+#include "dpcs/dpcs_4_2_0_offset.h"
+#include "dpcs/dpcs_4_2_0_sh_mask.h"
+#include "mmhub/mmhub_2_3_0_offset.h"
+#include "mmhub/mmhub_2_3_0_sh_mask.h"
+
+
+#define regDCHUBBUB_DEBUG_CTRL_0                                              0x04d6
+#define regDCHUBBUB_DEBUG_CTRL_0_BASE_IDX                                     2
+#define DCHUBBUB_DEBUG_CTRL_0__DET_DEPTH__SHIFT                               0x10
+#define DCHUBBUB_DEBUG_CTRL_0__DET_DEPTH_MASK                                 0x01FF0000L
+
+#include "reg_helper.h"
+#include "dce/dmub_abm.h"
+#include "dce/dmub_psr.h"
+#include "dce/dce_aux.h"
+#include "dce/dce_i2c.h"
+#include "dce/dmub_replay.h"
+
+#include "dml/dcn30/display_mode_vba_30.h"
+#include "vm_helper.h"
+#include "dcn20/dcn20_vmid.h"
+
+#include "link_enc_cfg.h"
+
+#define DC_LOGGER \
+       dc->ctx->logger
+#define DC_LOGGER_INIT(logger)
+
+enum dcn31_clk_src_array_id {
+       DCN31_CLK_SRC_PLL0,
+       DCN31_CLK_SRC_PLL1,
+       DCN31_CLK_SRC_PLL2,
+       DCN31_CLK_SRC_PLL3,
+       DCN31_CLK_SRC_PLL4,
+       DCN30_CLK_SRC_TOTAL
+};
+
+/* begin *********************
+ * macros to expend register list macro defined in HW object header file
+ */
+
+/* DCN */
+#define BASE_INNER(seg) DCN_BASE__INST0_SEG ## seg
+
+#define BASE(seg) BASE_INNER(seg)
+
+#define SR(reg_name)\
+               .reg_name = BASE(reg ## reg_name ## _BASE_IDX) +  \
+                                       reg ## reg_name
+
+#define SRI(reg_name, block, id)\
+       .reg_name = BASE(reg ## block ## id ## _ ## reg_name ## _BASE_IDX) + \
+                                       reg ## block ## id ## _ ## reg_name
+
+#define SRI2(reg_name, block, id)\
+       .reg_name = BASE(reg ## reg_name ## _BASE_IDX) + \
+                                       reg ## reg_name
+
+#define SRIR(var_name, reg_name, block, id)\
+       .var_name = BASE(reg ## block ## id ## _ ## reg_name ## _BASE_IDX) + \
+                                       reg ## block ## id ## _ ## reg_name
+
+#define SRII(reg_name, block, id)\
+       .reg_name[id] = BASE(reg ## block ## id ## _ ## reg_name ## _BASE_IDX) + \
+                                       reg ## block ## id ## _ ## reg_name
+
+#define SRII_MPC_RMU(reg_name, block, id)\
+       .RMU##_##reg_name[id] = BASE(reg ## block ## id ## _ ## reg_name ## _BASE_IDX) + \
+                                       reg ## block ## id ## _ ## reg_name
+
+#define SRII_DWB(reg_name, temp_name, block, id)\
+       .reg_name[id] = BASE(reg ## block ## id ## _ ## temp_name ## _BASE_IDX) + \
+                                       reg ## block ## id ## _ ## temp_name
+
+#define SF_DWB2(reg_name, block, id, field_name, post_fix)     \
+       .field_name = reg_name ## __ ## field_name ## post_fix
+
+#define DCCG_SRII(reg_name, block, id)\
+       .block ## _ ## reg_name[id] = BASE(reg ## block ## id ## _ ## reg_name ## _BASE_IDX) + \
+                                       reg ## block ## id ## _ ## reg_name
+
+#define VUPDATE_SRII(reg_name, block, id)\
+       .reg_name[id] = BASE(reg ## reg_name ## _ ## block ## id ## _BASE_IDX) + \
+                                       reg ## reg_name ## _ ## block ## id
+
+/* NBIO */
+#define NBIO_BASE_INNER(seg) \
+       NBIO_BASE__INST0_SEG ## seg
+
+#define NBIO_BASE(seg) \
+       NBIO_BASE_INNER(seg)
+
+#define NBIO_SR(reg_name)\
+               .reg_name = NBIO_BASE(regBIF_BX1_ ## reg_name ## _BASE_IDX) + \
+                                       regBIF_BX1_ ## reg_name
+
+/* MMHUB */
+#define MMHUB_BASE_INNER(seg) \
+       MMHUB_BASE__INST0_SEG ## seg
+
+#define MMHUB_BASE(seg) \
+       MMHUB_BASE_INNER(seg)
+
+#define MMHUB_SR(reg_name)\
+               .reg_name = MMHUB_BASE(mm ## reg_name ## _BASE_IDX) + \
+                                       mm ## reg_name
+
+/* CLOCK */
+#define CLK_BASE_INNER(seg) \
+       CLK_BASE__INST0_SEG ## seg
+
+#define CLK_BASE(seg) \
+       CLK_BASE_INNER(seg)
+
+#define CLK_SRI(reg_name, block, inst)\
+       .reg_name = CLK_BASE(reg ## block ## _ ## inst ## _ ## reg_name ## _BASE_IDX) + \
+                                       reg ## block ## _ ## inst ## _ ## reg_name
+
+
+static const struct bios_registers bios_regs = {
+               NBIO_SR(BIOS_SCRATCH_3),
+               NBIO_SR(BIOS_SCRATCH_6)
+};
+
+#define clk_src_regs(index, pllid)\
+[index] = {\
+       CS_COMMON_REG_LIST_DCN3_0(index, pllid),\
+}
+
+static const struct dce110_clk_src_regs clk_src_regs[] = {
+       clk_src_regs(0, A),
+       clk_src_regs(1, B),
+       clk_src_regs(2, C),
+       clk_src_regs(3, D),
+       clk_src_regs(4, E)
+};
+/*pll_id being rempped in dmub, in driver it is logical instance*/
+static const struct dce110_clk_src_regs clk_src_regs_b0[] = {
+       clk_src_regs(0, A),
+       clk_src_regs(1, B),
+       clk_src_regs(2, F),
+       clk_src_regs(3, G),
+       clk_src_regs(4, E)
+};
+
+static const struct dce110_clk_src_shift cs_shift = {
+               CS_COMMON_MASK_SH_LIST_DCN2_0(__SHIFT)
+};
+
+static const struct dce110_clk_src_mask cs_mask = {
+               CS_COMMON_MASK_SH_LIST_DCN2_0(_MASK)
+};
+
+#define abm_regs(id)\
+[id] = {\
+               ABM_DCN302_REG_LIST(id)\
+}
+
+static const struct dce_abm_registers abm_regs[] = {
+               abm_regs(0),
+               abm_regs(1),
+               abm_regs(2),
+               abm_regs(3),
+};
+
+static const struct dce_abm_shift abm_shift = {
+               ABM_MASK_SH_LIST_DCN30(__SHIFT)
+};
+
+static const struct dce_abm_mask abm_mask = {
+               ABM_MASK_SH_LIST_DCN30(_MASK)
+};
+
+#define audio_regs(id)\
+[id] = {\
+               AUD_COMMON_REG_LIST(id)\
+}
+
+static const struct dce_audio_registers audio_regs[] = {
+       audio_regs(0),
+       audio_regs(1),
+       audio_regs(2),
+       audio_regs(3),
+       audio_regs(4),
+       audio_regs(5),
+       audio_regs(6)
+};
+
+#define DCE120_AUD_COMMON_MASK_SH_LIST(mask_sh)\
+               SF(AZF0ENDPOINT0_AZALIA_F0_CODEC_ENDPOINT_INDEX, AZALIA_ENDPOINT_REG_INDEX, mask_sh),\
+               SF(AZF0ENDPOINT0_AZALIA_F0_CODEC_ENDPOINT_DATA, AZALIA_ENDPOINT_REG_DATA, mask_sh),\
+               AUD_COMMON_MASK_SH_LIST_BASE(mask_sh)
+
+static const struct dce_audio_shift audio_shift = {
+               DCE120_AUD_COMMON_MASK_SH_LIST(__SHIFT)
+};
+
+static const struct dce_audio_mask audio_mask = {
+               DCE120_AUD_COMMON_MASK_SH_LIST(_MASK)
+};
+
+#define vpg_regs(id)\
+[id] = {\
+       VPG_DCN31_REG_LIST(id)\
+}
+
+static const struct dcn31_vpg_registers vpg_regs[] = {
+       vpg_regs(0),
+       vpg_regs(1),
+       vpg_regs(2),
+       vpg_regs(3),
+       vpg_regs(4),
+       vpg_regs(5),
+       vpg_regs(6),
+       vpg_regs(7),
+       vpg_regs(8),
+       vpg_regs(9),
+};
+
+static const struct dcn31_vpg_shift vpg_shift = {
+       DCN31_VPG_MASK_SH_LIST(__SHIFT)
+};
+
+static const struct dcn31_vpg_mask vpg_mask = {
+       DCN31_VPG_MASK_SH_LIST(_MASK)
+};
+
+#define afmt_regs(id)\
+[id] = {\
+       AFMT_DCN31_REG_LIST(id)\
+}
+
+static const struct dcn31_afmt_registers afmt_regs[] = {
+       afmt_regs(0),
+       afmt_regs(1),
+       afmt_regs(2),
+       afmt_regs(3),
+       afmt_regs(4),
+       afmt_regs(5)
+};
+
+static const struct dcn31_afmt_shift afmt_shift = {
+       DCN31_AFMT_MASK_SH_LIST(__SHIFT)
+};
+
+static const struct dcn31_afmt_mask afmt_mask = {
+       DCN31_AFMT_MASK_SH_LIST(_MASK)
+};
+
+#define apg_regs(id)\
+[id] = {\
+       APG_DCN31_REG_LIST(id)\
+}
+
+static const struct dcn31_apg_registers apg_regs[] = {
+       apg_regs(0),
+       apg_regs(1),
+       apg_regs(2),
+       apg_regs(3)
+};
+
+static const struct dcn31_apg_shift apg_shift = {
+       DCN31_APG_MASK_SH_LIST(__SHIFT)
+};
+
+static const struct dcn31_apg_mask apg_mask = {
+               DCN31_APG_MASK_SH_LIST(_MASK)
+};
+
+#define stream_enc_regs(id)\
+[id] = {\
+       SE_DCN3_REG_LIST(id)\
+}
+
+/* Some encoders won't be initialized here - but they're logical, not physical. */
+static const struct dcn10_stream_enc_registers stream_enc_regs[ENGINE_ID_COUNT] = {
+       stream_enc_regs(0),
+       stream_enc_regs(1),
+       stream_enc_regs(2),
+       stream_enc_regs(3),
+       stream_enc_regs(4)
+};
+
+static const struct dcn10_stream_encoder_shift se_shift = {
+               SE_COMMON_MASK_SH_LIST_DCN30(__SHIFT)
+};
+
+static const struct dcn10_stream_encoder_mask se_mask = {
+               SE_COMMON_MASK_SH_LIST_DCN30(_MASK)
+};
+
+
+#define aux_regs(id)\
+[id] = {\
+       DCN2_AUX_REG_LIST(id)\
+}
+
+static const struct dcn10_link_enc_aux_registers link_enc_aux_regs[] = {
+               aux_regs(0),
+               aux_regs(1),
+               aux_regs(2),
+               aux_regs(3),
+               aux_regs(4)
+};
+
+#define hpd_regs(id)\
+[id] = {\
+       HPD_REG_LIST(id)\
+}
+
+static const struct dcn10_link_enc_hpd_registers link_enc_hpd_regs[] = {
+               hpd_regs(0),
+               hpd_regs(1),
+               hpd_regs(2),
+               hpd_regs(3),
+               hpd_regs(4)
+};
+
+#define link_regs(id, phyid)\
+[id] = {\
+       LE_DCN31_REG_LIST(id), \
+       UNIPHY_DCN2_REG_LIST(phyid), \
+       DPCS_DCN31_REG_LIST(id), \
+}
+
+static const struct dce110_aux_registers_shift aux_shift = {
+       DCN_AUX_MASK_SH_LIST(__SHIFT)
+};
+
+static const struct dce110_aux_registers_mask aux_mask = {
+       DCN_AUX_MASK_SH_LIST(_MASK)
+};
+
+static const struct dcn10_link_enc_registers link_enc_regs[] = {
+       link_regs(0, A),
+       link_regs(1, B),
+       link_regs(2, C),
+       link_regs(3, D),
+       link_regs(4, E)
+};
+
+static const struct dcn10_link_enc_shift le_shift = {
+       LINK_ENCODER_MASK_SH_LIST_DCN31(__SHIFT), \
+       DPCS_DCN31_MASK_SH_LIST(__SHIFT)
+};
+
+static const struct dcn10_link_enc_mask le_mask = {
+       LINK_ENCODER_MASK_SH_LIST_DCN31(_MASK), \
+       DPCS_DCN31_MASK_SH_LIST(_MASK)
+};
+
+#define hpo_dp_stream_encoder_reg_list(id)\
+[id] = {\
+       DCN3_1_HPO_DP_STREAM_ENC_REG_LIST(id)\
+}
+
+static const struct dcn31_hpo_dp_stream_encoder_registers hpo_dp_stream_enc_regs[] = {
+       hpo_dp_stream_encoder_reg_list(0),
+       hpo_dp_stream_encoder_reg_list(1),
+       hpo_dp_stream_encoder_reg_list(2),
+       hpo_dp_stream_encoder_reg_list(3),
+};
+
+static const struct dcn31_hpo_dp_stream_encoder_shift hpo_dp_se_shift = {
+       DCN3_1_HPO_DP_STREAM_ENC_MASK_SH_LIST(__SHIFT)
+};
+
+static const struct dcn31_hpo_dp_stream_encoder_mask hpo_dp_se_mask = {
+       DCN3_1_HPO_DP_STREAM_ENC_MASK_SH_LIST(_MASK)
+};
+
+#define hpo_dp_link_encoder_reg_list(id)\
+[id] = {\
+       DCN3_1_HPO_DP_LINK_ENC_REG_LIST(id),\
+       DCN3_1_RDPCSTX_REG_LIST(0),\
+       DCN3_1_RDPCSTX_REG_LIST(1),\
+       DCN3_1_RDPCSTX_REG_LIST(2),\
+       DCN3_1_RDPCSTX_REG_LIST(3),\
+       DCN3_1_RDPCSTX_REG_LIST(4)\
+}
+
+static const struct dcn31_hpo_dp_link_encoder_registers hpo_dp_link_enc_regs[] = {
+       hpo_dp_link_encoder_reg_list(0),
+       hpo_dp_link_encoder_reg_list(1),
+};
+
+static const struct dcn31_hpo_dp_link_encoder_shift hpo_dp_le_shift = {
+       DCN3_1_HPO_DP_LINK_ENC_MASK_SH_LIST(__SHIFT)
+};
+
+static const struct dcn31_hpo_dp_link_encoder_mask hpo_dp_le_mask = {
+       DCN3_1_HPO_DP_LINK_ENC_MASK_SH_LIST(_MASK)
+};
+
+#define dpp_regs(id)\
+[id] = {\
+       DPP_REG_LIST_DCN30(id),\
+}
+
+static const struct dcn3_dpp_registers dpp_regs[] = {
+       dpp_regs(0),
+       dpp_regs(1),
+       dpp_regs(2),
+       dpp_regs(3)
+};
+
+static const struct dcn3_dpp_shift tf_shift = {
+               DPP_REG_LIST_SH_MASK_DCN30(__SHIFT)
+};
+
+static const struct dcn3_dpp_mask tf_mask = {
+               DPP_REG_LIST_SH_MASK_DCN30(_MASK)
+};
+
+#define opp_regs(id)\
+[id] = {\
+       OPP_REG_LIST_DCN30(id),\
+}
+
+static const struct dcn20_opp_registers opp_regs[] = {
+       opp_regs(0),
+       opp_regs(1),
+       opp_regs(2),
+       opp_regs(3)
+};
+
+static const struct dcn20_opp_shift opp_shift = {
+       OPP_MASK_SH_LIST_DCN20(__SHIFT)
+};
+
+static const struct dcn20_opp_mask opp_mask = {
+       OPP_MASK_SH_LIST_DCN20(_MASK)
+};
+
+#define aux_engine_regs(id)\
+[id] = {\
+       AUX_COMMON_REG_LIST0(id), \
+       .AUXN_IMPCAL = 0, \
+       .AUXP_IMPCAL = 0, \
+       .AUX_RESET_MASK = DP_AUX0_AUX_CONTROL__AUX_RESET_MASK, \
+}
+
+static const struct dce110_aux_registers aux_engine_regs[] = {
+               aux_engine_regs(0),
+               aux_engine_regs(1),
+               aux_engine_regs(2),
+               aux_engine_regs(3),
+               aux_engine_regs(4)
+};
+
+#define dwbc_regs_dcn3(id)\
+[id] = {\
+       DWBC_COMMON_REG_LIST_DCN30(id),\
+}
+
+static const struct dcn30_dwbc_registers dwbc30_regs[] = {
+       dwbc_regs_dcn3(0),
+};
+
+static const struct dcn30_dwbc_shift dwbc30_shift = {
+       DWBC_COMMON_MASK_SH_LIST_DCN30(__SHIFT)
+};
+
+static const struct dcn30_dwbc_mask dwbc30_mask = {
+       DWBC_COMMON_MASK_SH_LIST_DCN30(_MASK)
+};
+
+#define mcif_wb_regs_dcn3(id)\
+[id] = {\
+       MCIF_WB_COMMON_REG_LIST_DCN30(id),\
+}
+
+static const struct dcn30_mmhubbub_registers mcif_wb30_regs[] = {
+       mcif_wb_regs_dcn3(0)
+};
+
+static const struct dcn30_mmhubbub_shift mcif_wb30_shift = {
+       MCIF_WB_COMMON_MASK_SH_LIST_DCN30(__SHIFT)
+};
+
+static const struct dcn30_mmhubbub_mask mcif_wb30_mask = {
+       MCIF_WB_COMMON_MASK_SH_LIST_DCN30(_MASK)
+};
+
+#define dsc_regsDCN20(id)\
+[id] = {\
+       DSC_REG_LIST_DCN20(id)\
+}
+
+static const struct dcn20_dsc_registers dsc_regs[] = {
+       dsc_regsDCN20(0),
+       dsc_regsDCN20(1),
+       dsc_regsDCN20(2)
+};
+
+static const struct dcn20_dsc_shift dsc_shift = {
+       DSC_REG_LIST_SH_MASK_DCN20(__SHIFT)
+};
+
+static const struct dcn20_dsc_mask dsc_mask = {
+       DSC_REG_LIST_SH_MASK_DCN20(_MASK)
+};
+
+static const struct dcn30_mpc_registers mpc_regs = {
+               MPC_REG_LIST_DCN3_0(0),
+               MPC_REG_LIST_DCN3_0(1),
+               MPC_REG_LIST_DCN3_0(2),
+               MPC_REG_LIST_DCN3_0(3),
+               MPC_OUT_MUX_REG_LIST_DCN3_0(0),
+               MPC_OUT_MUX_REG_LIST_DCN3_0(1),
+               MPC_OUT_MUX_REG_LIST_DCN3_0(2),
+               MPC_OUT_MUX_REG_LIST_DCN3_0(3),
+               MPC_RMU_GLOBAL_REG_LIST_DCN3AG,
+               MPC_RMU_REG_LIST_DCN3AG(0),
+               MPC_RMU_REG_LIST_DCN3AG(1),
+               //MPC_RMU_REG_LIST_DCN3AG(2),
+               MPC_DWB_MUX_REG_LIST_DCN3_0(0),
+};
+
+static const struct dcn30_mpc_shift mpc_shift = {
+       MPC_COMMON_MASK_SH_LIST_DCN30(__SHIFT)
+};
+
+static const struct dcn30_mpc_mask mpc_mask = {
+       MPC_COMMON_MASK_SH_LIST_DCN30(_MASK)
+};
+
+#define optc_regs(id)\
+[id] = {OPTC_COMMON_REG_LIST_DCN3_1(id)}
+
+static const struct dcn_optc_registers optc_regs[] = {
+       optc_regs(0),
+       optc_regs(1),
+       optc_regs(2),
+       optc_regs(3)
+};
+
+static const struct dcn_optc_shift optc_shift = {
+       OPTC_COMMON_MASK_SH_LIST_DCN3_1(__SHIFT)
+};
+
+static const struct dcn_optc_mask optc_mask = {
+       OPTC_COMMON_MASK_SH_LIST_DCN3_1(_MASK)
+};
+
+#define hubp_regs(id)\
+[id] = {\
+       HUBP_REG_LIST_DCN30(id)\
+}
+
+static const struct dcn_hubp2_registers hubp_regs[] = {
+               hubp_regs(0),
+               hubp_regs(1),
+               hubp_regs(2),
+               hubp_regs(3)
+};
+
+
+static const struct dcn_hubp2_shift hubp_shift = {
+               HUBP_MASK_SH_LIST_DCN31(__SHIFT)
+};
+
+static const struct dcn_hubp2_mask hubp_mask = {
+               HUBP_MASK_SH_LIST_DCN31(_MASK)
+};
+static const struct dcn_hubbub_registers hubbub_reg = {
+               HUBBUB_REG_LIST_DCN31(0)
+};
+
+static const struct dcn_hubbub_shift hubbub_shift = {
+               HUBBUB_MASK_SH_LIST_DCN31(__SHIFT)
+};
+
+static const struct dcn_hubbub_mask hubbub_mask = {
+               HUBBUB_MASK_SH_LIST_DCN31(_MASK)
+};
+
+static const struct dccg_registers dccg_regs = {
+               DCCG_REG_LIST_DCN31()
+};
+
+static const struct dccg_shift dccg_shift = {
+               DCCG_MASK_SH_LIST_DCN31(__SHIFT)
+};
+
+static const struct dccg_mask dccg_mask = {
+               DCCG_MASK_SH_LIST_DCN31(_MASK)
+};
+
+
+#define SRII2(reg_name_pre, reg_name_post, id)\
+       .reg_name_pre ## _ ##  reg_name_post[id] = BASE(reg ## reg_name_pre \
+                       ## id ## _ ## reg_name_post ## _BASE_IDX) + \
+                       reg ## reg_name_pre ## id ## _ ## reg_name_post
+
+
+#define HWSEQ_DCN31_REG_LIST()\
+       SR(DCHUBBUB_GLOBAL_TIMER_CNTL), \
+       SR(DCHUBBUB_ARB_HOSTVM_CNTL), \
+       SR(DIO_MEM_PWR_CTRL), \
+       SR(ODM_MEM_PWR_CTRL3), \
+       SR(DMU_MEM_PWR_CNTL), \
+       SR(MMHUBBUB_MEM_PWR_CNTL), \
+       SR(DCCG_GATE_DISABLE_CNTL), \
+       SR(DCCG_GATE_DISABLE_CNTL2), \
+       SR(DCFCLK_CNTL),\
+       SR(DC_MEM_GLOBAL_PWR_REQ_CNTL), \
+       SRII(PIXEL_RATE_CNTL, OTG, 0), \
+       SRII(PIXEL_RATE_CNTL, OTG, 1),\
+       SRII(PIXEL_RATE_CNTL, OTG, 2),\
+       SRII(PIXEL_RATE_CNTL, OTG, 3),\
+       SRII(PHYPLL_PIXEL_RATE_CNTL, OTG, 0),\
+       SRII(PHYPLL_PIXEL_RATE_CNTL, OTG, 1),\
+       SRII(PHYPLL_PIXEL_RATE_CNTL, OTG, 2),\
+       SRII(PHYPLL_PIXEL_RATE_CNTL, OTG, 3),\
+       SR(MICROSECOND_TIME_BASE_DIV), \
+       SR(MILLISECOND_TIME_BASE_DIV), \
+       SR(DISPCLK_FREQ_CHANGE_CNTL), \
+       SR(RBBMIF_TIMEOUT_DIS), \
+       SR(RBBMIF_TIMEOUT_DIS_2), \
+       SR(DCHUBBUB_CRC_CTRL), \
+       SR(DPP_TOP0_DPP_CRC_CTRL), \
+       SR(DPP_TOP0_DPP_CRC_VAL_B_A), \
+       SR(DPP_TOP0_DPP_CRC_VAL_R_G), \
+       SR(MPC_CRC_CTRL), \
+       SR(MPC_CRC_RESULT_GB), \
+       SR(MPC_CRC_RESULT_C), \
+       SR(MPC_CRC_RESULT_AR), \
+       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(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(D1VGA_CONTROL), \
+       SR(D2VGA_CONTROL), \
+       SR(D3VGA_CONTROL), \
+       SR(D4VGA_CONTROL), \
+       SR(D5VGA_CONTROL), \
+       SR(D6VGA_CONTROL), \
+       SR(DC_IP_REQUEST_CNTL), \
+       SR(AZALIA_AUDIO_DTO), \
+       SR(AZALIA_CONTROLLER_CLOCK_GATING), \
+       SR(HPO_TOP_HW_CONTROL)
+
+static const struct dce_hwseq_registers hwseq_reg = {
+               HWSEQ_DCN31_REG_LIST()
+};
+
+#define HWSEQ_DCN31_MASK_SH_LIST(mask_sh)\
+       HWSEQ_DCN_MASK_SH_LIST(mask_sh), \
+       HWS_SF(, DCHUBBUB_GLOBAL_TIMER_CNTL, DCHUBBUB_GLOBAL_TIMER_REFDIV, mask_sh), \
+       HWS_SF(, DCHUBBUB_ARB_HOSTVM_CNTL, DISABLE_HOSTVM_FORCE_ALLOW_PSTATE, mask_sh), \
+       HWS_SF(, DOMAIN0_PG_CONFIG, DOMAIN_POWER_FORCEON, mask_sh), \
+       HWS_SF(, DOMAIN0_PG_CONFIG, DOMAIN_POWER_GATE, mask_sh), \
+       HWS_SF(, DOMAIN1_PG_CONFIG, DOMAIN_POWER_FORCEON, mask_sh), \
+       HWS_SF(, DOMAIN1_PG_CONFIG, DOMAIN_POWER_GATE, mask_sh), \
+       HWS_SF(, DOMAIN2_PG_CONFIG, DOMAIN_POWER_FORCEON, mask_sh), \
+       HWS_SF(, DOMAIN2_PG_CONFIG, DOMAIN_POWER_GATE, mask_sh), \
+       HWS_SF(, DOMAIN3_PG_CONFIG, DOMAIN_POWER_FORCEON, mask_sh), \
+       HWS_SF(, DOMAIN3_PG_CONFIG, DOMAIN_POWER_GATE, mask_sh), \
+       HWS_SF(, DOMAIN16_PG_CONFIG, DOMAIN_POWER_FORCEON, mask_sh), \
+       HWS_SF(, DOMAIN16_PG_CONFIG, DOMAIN_POWER_GATE, mask_sh), \
+       HWS_SF(, DOMAIN17_PG_CONFIG, DOMAIN_POWER_FORCEON, mask_sh), \
+       HWS_SF(, DOMAIN17_PG_CONFIG, DOMAIN_POWER_GATE, mask_sh), \
+       HWS_SF(, DOMAIN18_PG_CONFIG, DOMAIN_POWER_FORCEON, mask_sh), \
+       HWS_SF(, DOMAIN18_PG_CONFIG, DOMAIN_POWER_GATE, mask_sh), \
+       HWS_SF(, DOMAIN0_PG_STATUS, DOMAIN_PGFSM_PWR_STATUS, mask_sh), \
+       HWS_SF(, DOMAIN1_PG_STATUS, DOMAIN_PGFSM_PWR_STATUS, mask_sh), \
+       HWS_SF(, DOMAIN2_PG_STATUS, DOMAIN_PGFSM_PWR_STATUS, mask_sh), \
+       HWS_SF(, DOMAIN3_PG_STATUS, DOMAIN_PGFSM_PWR_STATUS, mask_sh), \
+       HWS_SF(, DOMAIN16_PG_STATUS, DOMAIN_PGFSM_PWR_STATUS, mask_sh), \
+       HWS_SF(, DOMAIN17_PG_STATUS, DOMAIN_PGFSM_PWR_STATUS, mask_sh), \
+       HWS_SF(, DOMAIN18_PG_STATUS, DOMAIN_PGFSM_PWR_STATUS, mask_sh), \
+       HWS_SF(, DC_IP_REQUEST_CNTL, IP_REQUEST_EN, mask_sh), \
+       HWS_SF(, AZALIA_AUDIO_DTO, AZALIA_AUDIO_DTO_MODULE, mask_sh), \
+       HWS_SF(, HPO_TOP_CLOCK_CONTROL, HPO_HDMISTREAMCLK_G_GATE_DIS, mask_sh), \
+       HWS_SF(, DMU_MEM_PWR_CNTL, DMCU_ERAM_MEM_PWR_FORCE, mask_sh), \
+       HWS_SF(, ODM_MEM_PWR_CTRL3, ODM_MEM_UNASSIGNED_PWR_MODE, mask_sh), \
+       HWS_SF(, ODM_MEM_PWR_CTRL3, ODM_MEM_VBLANK_PWR_MODE, mask_sh), \
+       HWS_SF(, MMHUBBUB_MEM_PWR_CNTL, VGA_MEM_PWR_FORCE, mask_sh), \
+       HWS_SF(, DIO_MEM_PWR_CTRL, I2C_LIGHT_SLEEP_FORCE, mask_sh), \
+       HWS_SF(, HPO_TOP_HW_CONTROL, HPO_IO_EN, mask_sh)
+
+static const struct dce_hwseq_shift hwseq_shift = {
+               HWSEQ_DCN31_MASK_SH_LIST(__SHIFT)
+};
+
+static const struct dce_hwseq_mask hwseq_mask = {
+               HWSEQ_DCN31_MASK_SH_LIST(_MASK)
+};
+#define vmid_regs(id)\
+[id] = {\
+               DCN20_VMID_REG_LIST(id)\
+}
+
+static const struct dcn_vmid_registers vmid_regs[] = {
+       vmid_regs(0),
+       vmid_regs(1),
+       vmid_regs(2),
+       vmid_regs(3),
+       vmid_regs(4),
+       vmid_regs(5),
+       vmid_regs(6),
+       vmid_regs(7),
+       vmid_regs(8),
+       vmid_regs(9),
+       vmid_regs(10),
+       vmid_regs(11),
+       vmid_regs(12),
+       vmid_regs(13),
+       vmid_regs(14),
+       vmid_regs(15)
+};
+
+static const struct dcn20_vmid_shift vmid_shifts = {
+               DCN20_VMID_MASK_SH_LIST(__SHIFT)
+};
+
+static const struct dcn20_vmid_mask vmid_masks = {
+               DCN20_VMID_MASK_SH_LIST(_MASK)
+};
+
+static const struct resource_caps res_cap_dcn31 = {
+       .num_timing_generator = 4,
+       .num_opp = 4,
+       .num_video_plane = 4,
+       .num_audio = 5,
+       .num_stream_encoder = 5,
+       .num_dig_link_enc = 5,
+       .num_hpo_dp_stream_encoder = 4,
+       .num_hpo_dp_link_encoder = 2,
+       .num_pll = 5,
+       .num_dwb = 1,
+       .num_ddc = 5,
+       .num_vmid = 16,
+       .num_mpc_3dlut = 2,
+       .num_dsc = 3,
+};
+
+static const struct dc_plane_cap plane_cap = {
+       .type = DC_PLANE_TYPE_DCN_UNIVERSAL,
+       .per_pixel_alpha = true,
+
+       .pixel_format_support = {
+                       .argb8888 = true,
+                       .nv12 = true,
+                       .fp16 = true,
+                       .p010 = true,
+                       .ayuv = false,
+       },
+
+       .max_upscale_factor = {
+                       .argb8888 = 16000,
+                       .nv12 = 16000,
+                       .fp16 = 16000
+       },
+
+       // 6:1 downscaling ratio: 1000/6 = 166.666
+       .max_downscale_factor = {
+                       .argb8888 = 167,
+                       .nv12 = 167,
+                       .fp16 = 167
+       },
+       64,
+       64
+};
+
+static const struct dc_debug_options debug_defaults_drv = {
+       .disable_dmcu = true,
+       .force_abm_enable = false,
+       .timing_trace = false,
+       .clock_trace = true,
+       .disable_pplib_clock_request = false,
+       .pipe_split_policy = MPC_SPLIT_DYNAMIC,
+       .force_single_disp_pipe_split = false,
+       .disable_dcc = DCC_ENABLE,
+       .vsr_support = true,
+       .performance_trace = false,
+       .max_downscale_src_width = 4096,/*upto true 4K*/
+       .disable_pplib_wm_range = false,
+       .scl_reset_length10 = true,
+       .sanity_checks = true,
+       .underflow_assert_delay_us = 0xFFFFFFFF,
+       .dwb_fi_phase = -1, // -1 = disable,
+       .dmub_command_table = true,
+       .pstate_enabled = true,
+       .use_max_lb = true,
+       .enable_mem_low_power = {
+               .bits = {
+                       .vga = true,
+                       .i2c = true,
+                       .dmcu = false, // This is previously known to cause hang on S3 cycles if enabled
+                       .dscl = true,
+                       .cm = true,
+                       .mpc = true,
+                       .optc = true,
+                       .vpg = true,
+                       .afmt = true,
+               }
+       },
+       .disable_z10 = true,
+       .enable_legacy_fast_update = true,
+       .enable_z9_disable_interface = true, /* Allow support for the PMFW interface for disable Z9*/
+       .dml_hostvm_override = DML_HOSTVM_OVERRIDE_FALSE,
+       .using_dml2 = false,
+};
+
+static const struct dc_panel_config panel_config_defaults = {
+       .psr = {
+               .disable_psr = false,
+               .disallow_psrsu = false,
+               .disallow_replay = false,
+       },
+       .ilr = {
+               .optimize_edp_link_rate = true,
+       },
+};
+
+static void dcn31_dpp_destroy(struct dpp **dpp)
+{
+       kfree(TO_DCN20_DPP(*dpp));
+       *dpp = NULL;
+}
+
+static struct dpp *dcn31_dpp_create(
+       struct dc_context *ctx,
+       uint32_t inst)
+{
+       struct dcn3_dpp *dpp =
+               kzalloc(sizeof(struct dcn3_dpp), GFP_KERNEL);
+
+       if (!dpp)
+               return NULL;
+
+       if (dpp3_construct(dpp, ctx, inst,
+                       &dpp_regs[inst], &tf_shift, &tf_mask))
+               return &dpp->base;
+
+       BREAK_TO_DEBUGGER();
+       kfree(dpp);
+       return NULL;
+}
+
+static struct output_pixel_processor *dcn31_opp_create(
+       struct dc_context *ctx, uint32_t inst)
+{
+       struct dcn20_opp *opp =
+               kzalloc(sizeof(struct dcn20_opp), GFP_KERNEL);
+
+       if (!opp) {
+               BREAK_TO_DEBUGGER();
+               return NULL;
+       }
+
+       dcn20_opp_construct(opp, ctx, inst,
+                       &opp_regs[inst], &opp_shift, &opp_mask);
+       return &opp->base;
+}
+
+static struct dce_aux *dcn31_aux_engine_create(
+       struct dc_context *ctx,
+       uint32_t inst)
+{
+       struct aux_engine_dce110 *aux_engine =
+               kzalloc(sizeof(struct aux_engine_dce110), GFP_KERNEL);
+
+       if (!aux_engine)
+               return NULL;
+
+       dce110_aux_engine_construct(aux_engine, ctx, inst,
+                                   SW_AUX_TIMEOUT_PERIOD_MULTIPLIER * AUX_TIMEOUT_PERIOD,
+                                   &aux_engine_regs[inst],
+                                       &aux_mask,
+                                       &aux_shift,
+                                       ctx->dc->caps.extended_aux_timeout_support);
+
+       return &aux_engine->base;
+}
+#define i2c_inst_regs(id) { I2C_HW_ENGINE_COMMON_REG_LIST_DCN30(id) }
+
+static const struct dce_i2c_registers i2c_hw_regs[] = {
+               i2c_inst_regs(1),
+               i2c_inst_regs(2),
+               i2c_inst_regs(3),
+               i2c_inst_regs(4),
+               i2c_inst_regs(5),
+};
+
+static const struct dce_i2c_shift i2c_shifts = {
+               I2C_COMMON_MASK_SH_LIST_DCN30(__SHIFT)
+};
+
+static const struct dce_i2c_mask i2c_masks = {
+               I2C_COMMON_MASK_SH_LIST_DCN30(_MASK)
+};
+
+static struct dce_i2c_hw *dcn31_i2c_hw_create(
+       struct dc_context *ctx,
+       uint32_t inst)
+{
+       struct dce_i2c_hw *dce_i2c_hw =
+               kzalloc(sizeof(struct dce_i2c_hw), GFP_KERNEL);
+
+       if (!dce_i2c_hw)
+               return NULL;
+
+       dcn2_i2c_hw_construct(dce_i2c_hw, ctx, inst,
+                                   &i2c_hw_regs[inst], &i2c_shifts, &i2c_masks);
+
+       return dce_i2c_hw;
+}
+static struct mpc *dcn31_mpc_create(
+               struct dc_context *ctx,
+               int num_mpcc,
+               int num_rmu)
+{
+       struct dcn30_mpc *mpc30 = kzalloc(sizeof(struct dcn30_mpc),
+                                         GFP_KERNEL);
+
+       if (!mpc30)
+               return NULL;
+
+       dcn30_mpc_construct(mpc30, ctx,
+                       &mpc_regs,
+                       &mpc_shift,
+                       &mpc_mask,
+                       num_mpcc,
+                       num_rmu);
+
+       return &mpc30->base;
+}
+
+static struct hubbub *dcn31_hubbub_create(struct dc_context *ctx)
+{
+       int i;
+
+       struct dcn20_hubbub *hubbub3 = kzalloc(sizeof(struct dcn20_hubbub),
+                                         GFP_KERNEL);
+
+       if (!hubbub3)
+               return NULL;
+
+       hubbub31_construct(hubbub3, ctx,
+                       &hubbub_reg,
+                       &hubbub_shift,
+                       &hubbub_mask,
+                       dcn3_1_ip.det_buffer_size_kbytes,
+                       dcn3_1_ip.pixel_chunk_size_kbytes,
+                       dcn3_1_ip.config_return_buffer_size_in_kbytes);
+
+
+       for (i = 0; i < res_cap_dcn31.num_vmid; i++) {
+               struct dcn20_vmid *vmid = &hubbub3->vmid[i];
+
+               vmid->ctx = ctx;
+
+               vmid->regs = &vmid_regs[i];
+               vmid->shifts = &vmid_shifts;
+               vmid->masks = &vmid_masks;
+       }
+
+       return &hubbub3->base;
+}
+
+static struct timing_generator *dcn31_timing_generator_create(
+               struct dc_context *ctx,
+               uint32_t instance)
+{
+       struct optc *tgn10 =
+               kzalloc(sizeof(struct optc), GFP_KERNEL);
+
+       if (!tgn10)
+               return NULL;
+
+       tgn10->base.inst = instance;
+       tgn10->base.ctx = ctx;
+
+       tgn10->tg_regs = &optc_regs[instance];
+       tgn10->tg_shift = &optc_shift;
+       tgn10->tg_mask = &optc_mask;
+
+       dcn31_timing_generator_init(tgn10);
+
+       return &tgn10->base;
+}
+
+static const struct encoder_feature_support link_enc_feature = {
+               .max_hdmi_deep_color = COLOR_DEPTH_121212,
+               .max_hdmi_pixel_clock = 600000,
+               .hdmi_ycbcr420_supported = true,
+               .dp_ycbcr420_supported = true,
+               .fec_supported = true,
+               .flags.bits.IS_HBR2_CAPABLE = true,
+               .flags.bits.IS_HBR3_CAPABLE = true,
+               .flags.bits.IS_TPS3_CAPABLE = true,
+               .flags.bits.IS_TPS4_CAPABLE = true
+};
+
+static struct link_encoder *dcn31_link_encoder_create(
+       struct dc_context *ctx,
+       const struct encoder_init_data *enc_init_data)
+{
+       struct dcn20_link_encoder *enc20 =
+               kzalloc(sizeof(struct dcn20_link_encoder), GFP_KERNEL);
+
+       if (!enc20)
+               return NULL;
+
+       dcn31_link_encoder_construct(enc20,
+                       enc_init_data,
+                       &link_enc_feature,
+                       &link_enc_regs[enc_init_data->transmitter],
+                       &link_enc_aux_regs[enc_init_data->channel - 1],
+                       &link_enc_hpd_regs[enc_init_data->hpd_source],
+                       &le_shift,
+                       &le_mask);
+
+       return &enc20->enc10.base;
+}
+
+/* Create a minimal link encoder object not associated with a particular
+ * physical connector.
+ * resource_funcs.link_enc_create_minimal
+ */
+static struct link_encoder *dcn31_link_enc_create_minimal(
+               struct dc_context *ctx, enum engine_id eng_id)
+{
+       struct dcn20_link_encoder *enc20;
+
+       if ((eng_id - ENGINE_ID_DIGA) > ctx->dc->res_pool->res_cap->num_dig_link_enc)
+               return NULL;
+
+       enc20 = kzalloc(sizeof(struct dcn20_link_encoder), GFP_KERNEL);
+       if (!enc20)
+               return NULL;
+
+       dcn31_link_encoder_construct_minimal(
+                       enc20,
+                       ctx,
+                       &link_enc_feature,
+                       &link_enc_regs[eng_id - ENGINE_ID_DIGA],
+                       eng_id);
+
+       return &enc20->enc10.base;
+}
+
+static struct panel_cntl *dcn31_panel_cntl_create(const struct panel_cntl_init_data *init_data)
+{
+       struct dcn31_panel_cntl *panel_cntl =
+               kzalloc(sizeof(struct dcn31_panel_cntl), GFP_KERNEL);
+
+       if (!panel_cntl)
+               return NULL;
+
+       dcn31_panel_cntl_construct(panel_cntl, init_data);
+
+       return &panel_cntl->base;
+}
+
+static void read_dce_straps(
+       struct dc_context *ctx,
+       struct resource_straps *straps)
+{
+       generic_reg_get(ctx, regDC_PINSTRAPS + BASE(regDC_PINSTRAPS_BASE_IDX),
+               FN(DC_PINSTRAPS, DC_PINSTRAPS_AUDIO), &straps->dc_pinstraps_audio);
+
+}
+
+static struct audio *dcn31_create_audio(
+               struct dc_context *ctx, unsigned int inst)
+{
+       return dce_audio_create(ctx, inst,
+                       &audio_regs[inst], &audio_shift, &audio_mask);
+}
+
+static struct vpg *dcn31_vpg_create(
+       struct dc_context *ctx,
+       uint32_t inst)
+{
+       struct dcn31_vpg *vpg31 = kzalloc(sizeof(struct dcn31_vpg), GFP_KERNEL);
+
+       if (!vpg31)
+               return NULL;
+
+       vpg31_construct(vpg31, ctx, inst,
+                       &vpg_regs[inst],
+                       &vpg_shift,
+                       &vpg_mask);
+
+       return &vpg31->base;
+}
+
+static struct afmt *dcn31_afmt_create(
+       struct dc_context *ctx,
+       uint32_t inst)
+{
+       struct dcn31_afmt *afmt31 = kzalloc(sizeof(struct dcn31_afmt), GFP_KERNEL);
+
+       if (!afmt31)
+               return NULL;
+
+       afmt31_construct(afmt31, ctx, inst,
+                       &afmt_regs[inst],
+                       &afmt_shift,
+                       &afmt_mask);
+
+       // Light sleep by default, no need to power down here
+
+       return &afmt31->base;
+}
+
+static struct apg *dcn31_apg_create(
+       struct dc_context *ctx,
+       uint32_t inst)
+{
+       struct dcn31_apg *apg31 = kzalloc(sizeof(struct dcn31_apg), GFP_KERNEL);
+
+       if (!apg31)
+               return NULL;
+
+       apg31_construct(apg31, ctx, inst,
+                       &apg_regs[inst],
+                       &apg_shift,
+                       &apg_mask);
+
+       return &apg31->base;
+}
+
+static struct stream_encoder *dcn31_stream_encoder_create(
+       enum engine_id eng_id,
+       struct dc_context *ctx)
+{
+       struct dcn10_stream_encoder *enc1;
+       struct vpg *vpg;
+       struct afmt *afmt;
+       int vpg_inst;
+       int afmt_inst;
+
+       /* Mapping of VPG, AFMT, DME register blocks to DIO block instance */
+       if (eng_id <= ENGINE_ID_DIGF) {
+               vpg_inst = eng_id;
+               afmt_inst = eng_id;
+       } else
+               return NULL;
+
+       enc1 = kzalloc(sizeof(struct dcn10_stream_encoder), GFP_KERNEL);
+       vpg = dcn31_vpg_create(ctx, vpg_inst);
+       afmt = dcn31_afmt_create(ctx, afmt_inst);
+
+       if (!enc1 || !vpg || !afmt) {
+               kfree(enc1);
+               kfree(vpg);
+               kfree(afmt);
+               return NULL;
+       }
+
+       dcn30_dio_stream_encoder_construct(enc1, ctx, ctx->dc_bios,
+                                       eng_id, vpg, afmt,
+                                       &stream_enc_regs[eng_id],
+                                       &se_shift, &se_mask);
+
+       return &enc1->base;
+}
+
+static struct hpo_dp_stream_encoder *dcn31_hpo_dp_stream_encoder_create(
+       enum engine_id eng_id,
+       struct dc_context *ctx)
+{
+       struct dcn31_hpo_dp_stream_encoder *hpo_dp_enc31;
+       struct vpg *vpg;
+       struct apg *apg;
+       uint32_t hpo_dp_inst;
+       uint32_t vpg_inst;
+       uint32_t apg_inst;
+
+       ASSERT((eng_id >= ENGINE_ID_HPO_DP_0) && (eng_id <= ENGINE_ID_HPO_DP_3));
+       hpo_dp_inst = eng_id - ENGINE_ID_HPO_DP_0;
+
+       /* Mapping of VPG register blocks to HPO DP block instance:
+        * VPG[6] -> HPO_DP[0]
+        * VPG[7] -> HPO_DP[1]
+        * VPG[8] -> HPO_DP[2]
+        * VPG[9] -> HPO_DP[3]
+        */
+       vpg_inst = hpo_dp_inst + 6;
+
+       /* Mapping of APG register blocks to HPO DP block instance:
+        * APG[0] -> HPO_DP[0]
+        * APG[1] -> HPO_DP[1]
+        * APG[2] -> HPO_DP[2]
+        * APG[3] -> HPO_DP[3]
+        */
+       apg_inst = hpo_dp_inst;
+
+       /* allocate HPO stream encoder and create VPG sub-block */
+       hpo_dp_enc31 = kzalloc(sizeof(struct dcn31_hpo_dp_stream_encoder), GFP_KERNEL);
+       vpg = dcn31_vpg_create(ctx, vpg_inst);
+       apg = dcn31_apg_create(ctx, apg_inst);
+
+       if (!hpo_dp_enc31 || !vpg || !apg) {
+               kfree(hpo_dp_enc31);
+               kfree(vpg);
+               kfree(apg);
+               return NULL;
+       }
+
+       dcn31_hpo_dp_stream_encoder_construct(hpo_dp_enc31, ctx, ctx->dc_bios,
+                                       hpo_dp_inst, eng_id, vpg, apg,
+                                       &hpo_dp_stream_enc_regs[hpo_dp_inst],
+                                       &hpo_dp_se_shift, &hpo_dp_se_mask);
+
+       return &hpo_dp_enc31->base;
+}
+
+static struct hpo_dp_link_encoder *dcn31_hpo_dp_link_encoder_create(
+       uint8_t inst,
+       struct dc_context *ctx)
+{
+       struct dcn31_hpo_dp_link_encoder *hpo_dp_enc31;
+
+       /* allocate HPO link encoder */
+       hpo_dp_enc31 = kzalloc(sizeof(struct dcn31_hpo_dp_link_encoder), GFP_KERNEL);
+
+       hpo_dp_link_encoder31_construct(hpo_dp_enc31, ctx, inst,
+                                       &hpo_dp_link_enc_regs[inst],
+                                       &hpo_dp_le_shift, &hpo_dp_le_mask);
+
+       return &hpo_dp_enc31->base;
+}
+
+static struct dce_hwseq *dcn31_hwseq_create(
+       struct dc_context *ctx)
+{
+       struct dce_hwseq *hws = kzalloc(sizeof(struct dce_hwseq), GFP_KERNEL);
+
+       if (hws) {
+               hws->ctx = ctx;
+               hws->regs = &hwseq_reg;
+               hws->shifts = &hwseq_shift;
+               hws->masks = &hwseq_mask;
+       }
+       return hws;
+}
+static const struct resource_create_funcs res_create_funcs = {
+       .read_dce_straps = read_dce_straps,
+       .create_audio = dcn31_create_audio,
+       .create_stream_encoder = dcn31_stream_encoder_create,
+       .create_hpo_dp_stream_encoder = dcn31_hpo_dp_stream_encoder_create,
+       .create_hpo_dp_link_encoder = dcn31_hpo_dp_link_encoder_create,
+       .create_hwseq = dcn31_hwseq_create,
+};
+
+static void dcn31_resource_destruct(struct dcn31_resource_pool *pool)
+{
+       unsigned int i;
+
+       for (i = 0; i < pool->base.stream_enc_count; i++) {
+               if (pool->base.stream_enc[i] != NULL) {
+                       if (pool->base.stream_enc[i]->vpg != NULL) {
+                               kfree(DCN30_VPG_FROM_VPG(pool->base.stream_enc[i]->vpg));
+                               pool->base.stream_enc[i]->vpg = NULL;
+                       }
+                       if (pool->base.stream_enc[i]->afmt != NULL) {
+                               kfree(DCN30_AFMT_FROM_AFMT(pool->base.stream_enc[i]->afmt));
+                               pool->base.stream_enc[i]->afmt = NULL;
+                       }
+                       kfree(DCN10STRENC_FROM_STRENC(pool->base.stream_enc[i]));
+                       pool->base.stream_enc[i] = NULL;
+               }
+       }
+
+       for (i = 0; i < pool->base.hpo_dp_stream_enc_count; i++) {
+               if (pool->base.hpo_dp_stream_enc[i] != NULL) {
+                       if (pool->base.hpo_dp_stream_enc[i]->vpg != NULL) {
+                               kfree(DCN30_VPG_FROM_VPG(pool->base.hpo_dp_stream_enc[i]->vpg));
+                               pool->base.hpo_dp_stream_enc[i]->vpg = NULL;
+                       }
+                       if (pool->base.hpo_dp_stream_enc[i]->apg != NULL) {
+                               kfree(DCN31_APG_FROM_APG(pool->base.hpo_dp_stream_enc[i]->apg));
+                               pool->base.hpo_dp_stream_enc[i]->apg = NULL;
+                       }
+                       kfree(DCN3_1_HPO_DP_STREAM_ENC_FROM_HPO_STREAM_ENC(pool->base.hpo_dp_stream_enc[i]));
+                       pool->base.hpo_dp_stream_enc[i] = NULL;
+               }
+       }
+
+       for (i = 0; i < pool->base.hpo_dp_link_enc_count; i++) {
+               if (pool->base.hpo_dp_link_enc[i] != NULL) {
+                       kfree(DCN3_1_HPO_DP_LINK_ENC_FROM_HPO_LINK_ENC(pool->base.hpo_dp_link_enc[i]));
+                       pool->base.hpo_dp_link_enc[i] = NULL;
+               }
+       }
+
+       for (i = 0; i < pool->base.res_cap->num_dsc; i++) {
+               if (pool->base.dscs[i] != NULL)
+                       dcn20_dsc_destroy(&pool->base.dscs[i]);
+       }
+
+       if (pool->base.mpc != NULL) {
+               kfree(TO_DCN20_MPC(pool->base.mpc));
+               pool->base.mpc = NULL;
+       }
+       if (pool->base.hubbub != NULL) {
+               kfree(pool->base.hubbub);
+               pool->base.hubbub = NULL;
+       }
+       for (i = 0; i < pool->base.pipe_count; i++) {
+               if (pool->base.dpps[i] != NULL)
+                       dcn31_dpp_destroy(&pool->base.dpps[i]);
+
+               if (pool->base.ipps[i] != NULL)
+                       pool->base.ipps[i]->funcs->ipp_destroy(&pool->base.ipps[i]);
+
+               if (pool->base.hubps[i] != NULL) {
+                       kfree(TO_DCN20_HUBP(pool->base.hubps[i]));
+                       pool->base.hubps[i] = NULL;
+               }
+
+               if (pool->base.irqs != NULL) {
+                       dal_irq_service_destroy(&pool->base.irqs);
+               }
+       }
+
+       for (i = 0; i < pool->base.res_cap->num_ddc; i++) {
+               if (pool->base.engines[i] != NULL)
+                       dce110_engine_destroy(&pool->base.engines[i]);
+               if (pool->base.hw_i2cs[i] != NULL) {
+                       kfree(pool->base.hw_i2cs[i]);
+                       pool->base.hw_i2cs[i] = NULL;
+               }
+               if (pool->base.sw_i2cs[i] != NULL) {
+                       kfree(pool->base.sw_i2cs[i]);
+                       pool->base.sw_i2cs[i] = NULL;
+               }
+       }
+
+       for (i = 0; i < pool->base.res_cap->num_opp; i++) {
+               if (pool->base.opps[i] != NULL)
+                       pool->base.opps[i]->funcs->opp_destroy(&pool->base.opps[i]);
+       }
+
+       for (i = 0; i < pool->base.res_cap->num_timing_generator; i++) {
+               if (pool->base.timing_generators[i] != NULL)    {
+                       kfree(DCN10TG_FROM_TG(pool->base.timing_generators[i]));
+                       pool->base.timing_generators[i] = NULL;
+               }
+       }
+
+       for (i = 0; i < pool->base.res_cap->num_dwb; i++) {
+               if (pool->base.dwbc[i] != NULL) {
+                       kfree(TO_DCN30_DWBC(pool->base.dwbc[i]));
+                       pool->base.dwbc[i] = NULL;
+               }
+               if (pool->base.mcif_wb[i] != NULL) {
+                       kfree(TO_DCN30_MMHUBBUB(pool->base.mcif_wb[i]));
+                       pool->base.mcif_wb[i] = NULL;
+               }
+       }
+
+       for (i = 0; i < pool->base.audio_count; i++) {
+               if (pool->base.audios[i])
+                       dce_aud_destroy(&pool->base.audios[i]);
+       }
+
+       for (i = 0; i < pool->base.clk_src_count; i++) {
+               if (pool->base.clock_sources[i] != NULL) {
+                       dcn20_clock_source_destroy(&pool->base.clock_sources[i]);
+                       pool->base.clock_sources[i] = NULL;
+               }
+       }
+
+       for (i = 0; i < pool->base.res_cap->num_mpc_3dlut; i++) {
+               if (pool->base.mpc_lut[i] != NULL) {
+                       dc_3dlut_func_release(pool->base.mpc_lut[i]);
+                       pool->base.mpc_lut[i] = NULL;
+               }
+               if (pool->base.mpc_shaper[i] != NULL) {
+                       dc_transfer_func_release(pool->base.mpc_shaper[i]);
+                       pool->base.mpc_shaper[i] = NULL;
+               }
+       }
+
+       if (pool->base.dp_clock_source != NULL) {
+               dcn20_clock_source_destroy(&pool->base.dp_clock_source);
+               pool->base.dp_clock_source = NULL;
+       }
+
+       for (i = 0; i < pool->base.res_cap->num_timing_generator; i++) {
+               if (pool->base.multiple_abms[i] != NULL)
+                       dce_abm_destroy(&pool->base.multiple_abms[i]);
+       }
+
+       if (pool->base.psr != NULL)
+               dmub_psr_destroy(&pool->base.psr);
+
+       if (pool->base.replay != NULL)
+               dmub_replay_destroy(&pool->base.replay);
+
+       if (pool->base.dccg != NULL)
+               dcn_dccg_destroy(&pool->base.dccg);
+}
+
+static struct hubp *dcn31_hubp_create(
+       struct dc_context *ctx,
+       uint32_t inst)
+{
+       struct dcn20_hubp *hubp2 =
+               kzalloc(sizeof(struct dcn20_hubp), GFP_KERNEL);
+
+       if (!hubp2)
+               return NULL;
+
+       if (hubp31_construct(hubp2, ctx, inst,
+                       &hubp_regs[inst], &hubp_shift, &hubp_mask))
+               return &hubp2->base;
+
+       BREAK_TO_DEBUGGER();
+       kfree(hubp2);
+       return NULL;
+}
+
+static bool dcn31_dwbc_create(struct dc_context *ctx, struct resource_pool *pool)
+{
+       int i;
+       uint32_t pipe_count = pool->res_cap->num_dwb;
+
+       for (i = 0; i < pipe_count; i++) {
+               struct dcn30_dwbc *dwbc30 = kzalloc(sizeof(struct dcn30_dwbc),
+                                                   GFP_KERNEL);
+
+               if (!dwbc30) {
+                       dm_error("DC: failed to create dwbc30!\n");
+                       return false;
+               }
+
+               dcn30_dwbc_construct(dwbc30, ctx,
+                               &dwbc30_regs[i],
+                               &dwbc30_shift,
+                               &dwbc30_mask,
+                               i);
+
+               pool->dwbc[i] = &dwbc30->base;
+       }
+       return true;
+}
+
+static bool dcn31_mmhubbub_create(struct dc_context *ctx, struct resource_pool *pool)
+{
+       int i;
+       uint32_t pipe_count = pool->res_cap->num_dwb;
+
+       for (i = 0; i < pipe_count; i++) {
+               struct dcn30_mmhubbub *mcif_wb30 = kzalloc(sizeof(struct dcn30_mmhubbub),
+                                                   GFP_KERNEL);
+
+               if (!mcif_wb30) {
+                       dm_error("DC: failed to create mcif_wb30!\n");
+                       return false;
+               }
+
+               dcn30_mmhubbub_construct(mcif_wb30, ctx,
+                               &mcif_wb30_regs[i],
+                               &mcif_wb30_shift,
+                               &mcif_wb30_mask,
+                               i);
+
+               pool->mcif_wb[i] = &mcif_wb30->base;
+       }
+       return true;
+}
+
+static struct display_stream_compressor *dcn31_dsc_create(
+       struct dc_context *ctx, uint32_t inst)
+{
+       struct dcn20_dsc *dsc =
+               kzalloc(sizeof(struct dcn20_dsc), GFP_KERNEL);
+
+       if (!dsc) {
+               BREAK_TO_DEBUGGER();
+               return NULL;
+       }
+
+       dsc2_construct(dsc, ctx, inst, &dsc_regs[inst], &dsc_shift, &dsc_mask);
+       return &dsc->base;
+}
+
+static void dcn31_destroy_resource_pool(struct resource_pool **pool)
+{
+       struct dcn31_resource_pool *dcn31_pool = TO_DCN31_RES_POOL(*pool);
+
+       dcn31_resource_destruct(dcn31_pool);
+       kfree(dcn31_pool);
+       *pool = NULL;
+}
+
+static struct clock_source *dcn31_clock_source_create(
+               struct dc_context *ctx,
+               struct dc_bios *bios,
+               enum clock_source_id id,
+               const struct dce110_clk_src_regs *regs,
+               bool dp_clk_src)
+{
+       struct dce110_clk_src *clk_src =
+               kzalloc(sizeof(struct dce110_clk_src), GFP_KERNEL);
+
+       if (!clk_src)
+               return NULL;
+
+       if (dcn3_clk_src_construct(clk_src, ctx, bios, id,
+                       regs, &cs_shift, &cs_mask)) {
+               clk_src->base.dp_clk_src = dp_clk_src;
+               return &clk_src->base;
+       }
+
+       kfree(clk_src);
+       BREAK_TO_DEBUGGER();
+       return NULL;
+}
+
+static bool is_dual_plane(enum surface_pixel_format format)
+{
+       return format >= SURFACE_PIXEL_FORMAT_VIDEO_BEGIN || format == SURFACE_PIXEL_FORMAT_GRPH_RGBE_ALPHA;
+}
+
+int dcn31x_populate_dml_pipes_from_context(struct dc *dc,
+                                         struct dc_state *context,
+                                         display_e2e_pipe_params_st *pipes,
+                                         bool fast_validate)
+{
+       uint32_t pipe_cnt;
+       int i;
+
+       dc_assert_fp_enabled();
+
+       pipe_cnt = dcn20_populate_dml_pipes_from_context(dc, context, pipes, fast_validate);
+
+       for (i = 0; i < pipe_cnt; i++) {
+               pipes[i].pipe.src.gpuvm = 1;
+               if (dc->debug.dml_hostvm_override == DML_HOSTVM_NO_OVERRIDE) {
+                       //pipes[pipe_cnt].pipe.src.hostvm = dc->res_pool->hubbub->riommu_active;
+                       pipes[i].pipe.src.hostvm = dc->vm_pa_config.is_hvm_enabled;
+               } else if (dc->debug.dml_hostvm_override == DML_HOSTVM_OVERRIDE_FALSE)
+                       pipes[i].pipe.src.hostvm = false;
+               else if (dc->debug.dml_hostvm_override == DML_HOSTVM_OVERRIDE_TRUE)
+                       pipes[i].pipe.src.hostvm = true;
+       }
+       return pipe_cnt;
+}
+
+int dcn31_populate_dml_pipes_from_context(
+       struct dc *dc, struct dc_state *context,
+       display_e2e_pipe_params_st *pipes,
+       bool fast_validate)
+{
+       int i, pipe_cnt;
+       struct resource_context *res_ctx = &context->res_ctx;
+       struct pipe_ctx *pipe;
+       bool upscaled = false;
+
+       DC_FP_START();
+       dcn31x_populate_dml_pipes_from_context(dc, context, pipes, fast_validate);
+       DC_FP_END();
+
+       for (i = 0, pipe_cnt = 0; i < dc->res_pool->pipe_count; i++) {
+               struct dc_crtc_timing *timing;
+
+               if (!res_ctx->pipe_ctx[i].stream)
+                       continue;
+               pipe = &res_ctx->pipe_ctx[i];
+               timing = &pipe->stream->timing;
+               if (pipe->plane_state &&
+                               (pipe->plane_state->src_rect.height < pipe->plane_state->dst_rect.height ||
+                               pipe->plane_state->src_rect.width < pipe->plane_state->dst_rect.width))
+                       upscaled = true;
+
+               /*
+                * Immediate flip can be set dynamically after enabling the plane.
+                * We need to require support for immediate flip or underflow can be
+                * intermittently experienced depending on peak b/w requirements.
+                */
+               pipes[pipe_cnt].pipe.src.immediate_flip = true;
+               pipes[pipe_cnt].pipe.src.unbounded_req_mode = false;
+               pipes[pipe_cnt].pipe.src.gpuvm = true;
+               pipes[pipe_cnt].pipe.dest.vfront_porch = timing->v_front_porch;
+               pipes[pipe_cnt].pipe.src.dcc_rate = 3;
+               pipes[pipe_cnt].dout.dsc_input_bpc = 0;
+               DC_FP_START();
+               dcn31_zero_pipe_dcc_fraction(pipes, pipe_cnt);
+               DC_FP_END();
+
+
+               if (pipes[pipe_cnt].dout.dsc_enable) {
+                       switch (timing->display_color_depth) {
+                       case COLOR_DEPTH_888:
+                               pipes[pipe_cnt].dout.dsc_input_bpc = 8;
+                               break;
+                       case COLOR_DEPTH_101010:
+                               pipes[pipe_cnt].dout.dsc_input_bpc = 10;
+                               break;
+                       case COLOR_DEPTH_121212:
+                               pipes[pipe_cnt].dout.dsc_input_bpc = 12;
+                               break;
+                       default:
+                               ASSERT(0);
+                               break;
+                       }
+               }
+
+               pipe_cnt++;
+       }
+       context->bw_ctx.dml.ip.det_buffer_size_kbytes = DCN3_1_DEFAULT_DET_SIZE;
+       dc->config.enable_4to1MPC = false;
+       if (pipe_cnt == 1 && pipe->plane_state && !dc->debug.disable_z9_mpc) {
+               if (is_dual_plane(pipe->plane_state->format)
+                               && pipe->plane_state->src_rect.width <= 1920 && pipe->plane_state->src_rect.height <= 1080) {
+                       dc->config.enable_4to1MPC = true;
+               } else if (!is_dual_plane(pipe->plane_state->format) && pipe->plane_state->src_rect.width <= 5120) {
+                       /* Limit to 5k max to avoid forced pipe split when there is not enough detile for swath */
+                       context->bw_ctx.dml.ip.det_buffer_size_kbytes = 192;
+                       pipes[0].pipe.src.unbounded_req_mode = true;
+               }
+       } else if (context->stream_count >= dc->debug.crb_alloc_policy_min_disp_count
+                       && dc->debug.crb_alloc_policy > DET_SIZE_DEFAULT) {
+               context->bw_ctx.dml.ip.det_buffer_size_kbytes = dc->debug.crb_alloc_policy * 64;
+       } else if (context->stream_count >= 3 && upscaled) {
+               context->bw_ctx.dml.ip.det_buffer_size_kbytes = 192;
+       }
+
+       return pipe_cnt;
+}
+
+void dcn31_calculate_wm_and_dlg(
+               struct dc *dc, struct dc_state *context,
+               display_e2e_pipe_params_st *pipes,
+               int pipe_cnt,
+               int vlevel)
+{
+       DC_FP_START();
+       dcn31_calculate_wm_and_dlg_fp(dc, context, pipes, pipe_cnt, vlevel);
+       DC_FP_END();
+}
+
+void
+dcn31_populate_dml_writeback_from_context(struct dc *dc,
+                                         struct resource_context *res_ctx,
+                                         display_e2e_pipe_params_st *pipes)
+{
+       DC_FP_START();
+       dcn30_populate_dml_writeback_from_context(dc, res_ctx, pipes);
+       DC_FP_END();
+}
+
+void
+dcn31_set_mcif_arb_params(struct dc *dc,
+                         struct dc_state *context,
+                         display_e2e_pipe_params_st *pipes,
+                         int pipe_cnt)
+{
+       DC_FP_START();
+       dcn30_set_mcif_arb_params(dc, context, pipes, pipe_cnt);
+       DC_FP_END();
+}
+
+bool dcn31_validate_bandwidth(struct dc *dc,
+               struct dc_state *context,
+               bool fast_validate)
+{
+       bool out = false;
+
+       BW_VAL_TRACE_SETUP();
+
+       int vlevel = 0;
+       int pipe_cnt = 0;
+       display_e2e_pipe_params_st *pipes = kzalloc(dc->res_pool->pipe_count * sizeof(display_e2e_pipe_params_st), GFP_KERNEL);
+       DC_LOGGER_INIT(dc->ctx->logger);
+
+       BW_VAL_TRACE_COUNT();
+
+       DC_FP_START();
+       out = dcn30_internal_validate_bw(dc, context, pipes, &pipe_cnt, &vlevel, fast_validate, true);
+       DC_FP_END();
+
+       // Disable fast_validate to set min dcfclk in alculate_wm_and_dlg
+       if (pipe_cnt == 0)
+               fast_validate = false;
+
+       if (!out)
+               goto validate_fail;
+
+       BW_VAL_TRACE_END_VOLTAGE_LEVEL();
+
+       if (fast_validate) {
+               BW_VAL_TRACE_SKIP(fast);
+               goto validate_out;
+       }
+       if (dc->res_pool->funcs->calculate_wm_and_dlg)
+               dc->res_pool->funcs->calculate_wm_and_dlg(dc, context, pipes, pipe_cnt, vlevel);
+
+       BW_VAL_TRACE_END_WATERMARKS();
+
+       goto validate_out;
+
+validate_fail:
+       DC_LOG_WARNING("Mode Validation Warning: %s failed validation.\n",
+               dml_get_status_message(context->bw_ctx.dml.vba.ValidationStatus[context->bw_ctx.dml.vba.soc.num_states]));
+
+       BW_VAL_TRACE_SKIP(fail);
+       out = false;
+
+validate_out:
+       kfree(pipes);
+
+       BW_VAL_TRACE_FINISH();
+
+       return out;
+}
+
+static void dcn31_get_panel_config_defaults(struct dc_panel_config *panel_config)
+{
+       *panel_config = panel_config_defaults;
+}
+
+static struct dc_cap_funcs cap_funcs = {
+       .get_dcc_compression_cap = dcn20_get_dcc_compression_cap
+};
+
+static struct resource_funcs dcn31_res_pool_funcs = {
+       .destroy = dcn31_destroy_resource_pool,
+       .link_enc_create = dcn31_link_encoder_create,
+       .link_enc_create_minimal = dcn31_link_enc_create_minimal,
+       .link_encs_assign = link_enc_cfg_link_encs_assign,
+       .link_enc_unassign = link_enc_cfg_link_enc_unassign,
+       .panel_cntl_create = dcn31_panel_cntl_create,
+       .validate_bandwidth = dcn31_validate_bandwidth,
+       .calculate_wm_and_dlg = dcn31_calculate_wm_and_dlg,
+       .update_soc_for_wm_a = dcn31_update_soc_for_wm_a,
+       .populate_dml_pipes = dcn31_populate_dml_pipes_from_context,
+       .acquire_free_pipe_as_secondary_dpp_pipe = dcn20_acquire_free_pipe_for_layer,
+       .release_pipe = dcn20_release_pipe,
+       .add_stream_to_ctx = dcn30_add_stream_to_ctx,
+       .add_dsc_to_stream_resource = dcn20_add_dsc_to_stream_resource,
+       .remove_stream_from_ctx = dcn20_remove_stream_from_ctx,
+       .populate_dml_writeback_from_context = dcn31_populate_dml_writeback_from_context,
+       .set_mcif_arb_params = dcn31_set_mcif_arb_params,
+       .find_first_free_match_stream_enc_for_link = dcn10_find_first_free_match_stream_enc_for_link,
+       .acquire_post_bldn_3dlut = dcn30_acquire_post_bldn_3dlut,
+       .release_post_bldn_3dlut = dcn30_release_post_bldn_3dlut,
+       .update_bw_bounding_box = dcn31_update_bw_bounding_box,
+       .patch_unknown_plane_state = dcn20_patch_unknown_plane_state,
+       .get_panel_config_defaults = dcn31_get_panel_config_defaults,
+};
+
+static struct clock_source *dcn30_clock_source_create(
+               struct dc_context *ctx,
+               struct dc_bios *bios,
+               enum clock_source_id id,
+               const struct dce110_clk_src_regs *regs,
+               bool dp_clk_src)
+{
+       struct dce110_clk_src *clk_src =
+               kzalloc(sizeof(struct dce110_clk_src), GFP_KERNEL);
+
+       if (!clk_src)
+               return NULL;
+
+       if (dcn31_clk_src_construct(clk_src, ctx, bios, id,
+                       regs, &cs_shift, &cs_mask)) {
+               clk_src->base.dp_clk_src = dp_clk_src;
+               return &clk_src->base;
+       }
+
+       BREAK_TO_DEBUGGER();
+       return NULL;
+}
+
+static bool dcn31_resource_construct(
+       uint8_t num_virtual_links,
+       struct dc *dc,
+       struct dcn31_resource_pool *pool)
+{
+       int i;
+       struct dc_context *ctx = dc->ctx;
+       struct irq_service_init_data init_data;
+
+       ctx->dc_bios->regs = &bios_regs;
+
+       pool->base.res_cap = &res_cap_dcn31;
+
+       pool->base.funcs = &dcn31_res_pool_funcs;
+
+       /*************************************************
+        *  Resource + asic cap harcoding                *
+        *************************************************/
+       pool->base.underlay_pipe_index = NO_UNDERLAY_PIPE;
+       pool->base.pipe_count = pool->base.res_cap->num_timing_generator;
+       pool->base.mpcc_count = pool->base.res_cap->num_timing_generator;
+       dc->caps.max_downscale_ratio = 600;
+       dc->caps.i2c_speed_in_khz = 100;
+       dc->caps.i2c_speed_in_khz_hdcp = 5; /*1.4 w/a applied by default*/
+       dc->caps.max_cursor_size = 256;
+       dc->caps.min_horizontal_blanking_period = 80;
+       dc->caps.dmdata_alloc_size = 2048;
+
+       dc->caps.max_slave_planes = 2;
+       dc->caps.max_slave_yuv_planes = 2;
+       dc->caps.max_slave_rgb_planes = 2;
+       dc->caps.post_blend_color_processing = true;
+       dc->caps.force_dp_tps4_for_cp2520 = true;
+       if (dc->config.forceHBR2CP2520)
+               dc->caps.force_dp_tps4_for_cp2520 = false;
+       dc->caps.dp_hpo = true;
+       dc->caps.dp_hdmi21_pcon_support = true;
+       dc->caps.edp_dsc_support = true;
+       dc->caps.extended_aux_timeout_support = true;
+       dc->caps.dmcub_support = true;
+       dc->caps.is_apu = true;
+       dc->caps.zstate_support = true;
+
+       /* Color pipeline capabilities */
+       dc->caps.color.dpp.dcn_arch = 1;
+       dc->caps.color.dpp.input_lut_shared = 0;
+       dc->caps.color.dpp.icsc = 1;
+       dc->caps.color.dpp.dgam_ram = 0; // must use gamma_corr
+       dc->caps.color.dpp.dgam_rom_caps.srgb = 1;
+       dc->caps.color.dpp.dgam_rom_caps.bt2020 = 1;
+       dc->caps.color.dpp.dgam_rom_caps.gamma2_2 = 1;
+       dc->caps.color.dpp.dgam_rom_caps.pq = 1;
+       dc->caps.color.dpp.dgam_rom_caps.hlg = 1;
+       dc->caps.color.dpp.post_csc = 1;
+       dc->caps.color.dpp.gamma_corr = 1;
+       dc->caps.color.dpp.dgam_rom_for_yuv = 0;
+
+       dc->caps.color.dpp.hw_3d_lut = 1;
+       dc->caps.color.dpp.ogam_ram = 1;
+       // no OGAM ROM on DCN301
+       dc->caps.color.dpp.ogam_rom_caps.srgb = 0;
+       dc->caps.color.dpp.ogam_rom_caps.bt2020 = 0;
+       dc->caps.color.dpp.ogam_rom_caps.gamma2_2 = 0;
+       dc->caps.color.dpp.ogam_rom_caps.pq = 0;
+       dc->caps.color.dpp.ogam_rom_caps.hlg = 0;
+       dc->caps.color.dpp.ocsc = 0;
+
+       dc->caps.color.mpc.gamut_remap = 1;
+       dc->caps.color.mpc.num_3dluts = pool->base.res_cap->num_mpc_3dlut; //2
+       dc->caps.color.mpc.ogam_ram = 1;
+       dc->caps.color.mpc.ogam_rom_caps.srgb = 0;
+       dc->caps.color.mpc.ogam_rom_caps.bt2020 = 0;
+       dc->caps.color.mpc.ogam_rom_caps.gamma2_2 = 0;
+       dc->caps.color.mpc.ogam_rom_caps.pq = 0;
+       dc->caps.color.mpc.ogam_rom_caps.hlg = 0;
+       dc->caps.color.mpc.ocsc = 1;
+
+       dc->config.use_old_fixed_vs_sequence = true;
+
+       /* Use pipe context based otg sync logic */
+       dc->config.use_pipe_ctx_sync_logic = true;
+
+       /* read VBIOS LTTPR caps */
+       {
+               if (ctx->dc_bios->funcs->get_lttpr_caps) {
+                       enum bp_result bp_query_result;
+                       uint8_t is_vbios_lttpr_enable = 0;
+
+                       bp_query_result = ctx->dc_bios->funcs->get_lttpr_caps(ctx->dc_bios, &is_vbios_lttpr_enable);
+                       dc->caps.vbios_lttpr_enable = (bp_query_result == BP_RESULT_OK) && !!is_vbios_lttpr_enable;
+               }
+
+               /* interop bit is implicit */
+               {
+                       dc->caps.vbios_lttpr_aware = true;
+               }
+       }
+
+       if (dc->ctx->dce_environment == DCE_ENV_PRODUCTION_DRV)
+               dc->debug = debug_defaults_drv;
+
+       // Init the vm_helper
+       if (dc->vm_helper)
+               vm_helper_init(dc->vm_helper, 16);
+
+       /*************************************************
+        *  Create resources                             *
+        *************************************************/
+
+       /* Clock Sources for Pixel Clock*/
+       pool->base.clock_sources[DCN31_CLK_SRC_PLL0] =
+                       dcn30_clock_source_create(ctx, ctx->dc_bios,
+                               CLOCK_SOURCE_COMBO_PHY_PLL0,
+                               &clk_src_regs[0], false);
+       pool->base.clock_sources[DCN31_CLK_SRC_PLL1] =
+                       dcn30_clock_source_create(ctx, ctx->dc_bios,
+                               CLOCK_SOURCE_COMBO_PHY_PLL1,
+                               &clk_src_regs[1], false);
+       /*move phypllx_pixclk_resync to dmub next*/
+       if (dc->ctx->asic_id.hw_internal_rev == YELLOW_CARP_B0) {
+               pool->base.clock_sources[DCN31_CLK_SRC_PLL2] =
+                       dcn30_clock_source_create(ctx, ctx->dc_bios,
+                               CLOCK_SOURCE_COMBO_PHY_PLL2,
+                               &clk_src_regs_b0[2], false);
+               pool->base.clock_sources[DCN31_CLK_SRC_PLL3] =
+                       dcn30_clock_source_create(ctx, ctx->dc_bios,
+                               CLOCK_SOURCE_COMBO_PHY_PLL3,
+                               &clk_src_regs_b0[3], false);
+       } else {
+               pool->base.clock_sources[DCN31_CLK_SRC_PLL2] =
+                       dcn30_clock_source_create(ctx, ctx->dc_bios,
+                               CLOCK_SOURCE_COMBO_PHY_PLL2,
+                               &clk_src_regs[2], false);
+               pool->base.clock_sources[DCN31_CLK_SRC_PLL3] =
+                       dcn30_clock_source_create(ctx, ctx->dc_bios,
+                               CLOCK_SOURCE_COMBO_PHY_PLL3,
+                               &clk_src_regs[3], false);
+       }
+
+       pool->base.clock_sources[DCN31_CLK_SRC_PLL4] =
+                       dcn30_clock_source_create(ctx, ctx->dc_bios,
+                               CLOCK_SOURCE_COMBO_PHY_PLL4,
+                               &clk_src_regs[4], false);
+
+       pool->base.clk_src_count = DCN30_CLK_SRC_TOTAL;
+
+       /* todo: not reuse phy_pll registers */
+       pool->base.dp_clock_source =
+                       dcn31_clock_source_create(ctx, ctx->dc_bios,
+                               CLOCK_SOURCE_ID_DP_DTO,
+                               &clk_src_regs[0], true);
+
+       for (i = 0; i < pool->base.clk_src_count; i++) {
+               if (pool->base.clock_sources[i] == NULL) {
+                       dm_error("DC: failed to create clock sources!\n");
+                       BREAK_TO_DEBUGGER();
+                       goto create_fail;
+               }
+       }
+
+       /* TODO: DCCG */
+       pool->base.dccg = dccg31_create(ctx, &dccg_regs, &dccg_shift, &dccg_mask);
+       if (pool->base.dccg == NULL) {
+               dm_error("DC: failed to create dccg!\n");
+               BREAK_TO_DEBUGGER();
+               goto create_fail;
+       }
+
+       /* TODO: IRQ */
+       init_data.ctx = dc->ctx;
+       pool->base.irqs = dal_irq_service_dcn31_create(&init_data);
+       if (!pool->base.irqs)
+               goto create_fail;
+
+       /* HUBBUB */
+       pool->base.hubbub = dcn31_hubbub_create(ctx);
+       if (pool->base.hubbub == NULL) {
+               BREAK_TO_DEBUGGER();
+               dm_error("DC: failed to create hubbub!\n");
+               goto create_fail;
+       }
+
+       /* HUBPs, DPPs, OPPs and TGs */
+       for (i = 0; i < pool->base.pipe_count; i++) {
+               pool->base.hubps[i] = dcn31_hubp_create(ctx, i);
+               if (pool->base.hubps[i] == NULL) {
+                       BREAK_TO_DEBUGGER();
+                       dm_error(
+                               "DC: failed to create hubps!\n");
+                       goto create_fail;
+               }
+
+               pool->base.dpps[i] = dcn31_dpp_create(ctx, i);
+               if (pool->base.dpps[i] == NULL) {
+                       BREAK_TO_DEBUGGER();
+                       dm_error(
+                               "DC: failed to create dpps!\n");
+                       goto create_fail;
+               }
+       }
+
+       for (i = 0; i < pool->base.res_cap->num_opp; i++) {
+               pool->base.opps[i] = dcn31_opp_create(ctx, i);
+               if (pool->base.opps[i] == NULL) {
+                       BREAK_TO_DEBUGGER();
+                       dm_error(
+                               "DC: failed to create output pixel processor!\n");
+                       goto create_fail;
+               }
+       }
+
+       for (i = 0; i < pool->base.res_cap->num_timing_generator; i++) {
+               pool->base.timing_generators[i] = dcn31_timing_generator_create(
+                               ctx, i);
+               if (pool->base.timing_generators[i] == NULL) {
+                       BREAK_TO_DEBUGGER();
+                       dm_error("DC: failed to create tg!\n");
+                       goto create_fail;
+               }
+       }
+       pool->base.timing_generator_count = i;
+
+       /* PSR */
+       pool->base.psr = dmub_psr_create(ctx);
+       if (pool->base.psr == NULL) {
+               dm_error("DC: failed to create psr obj!\n");
+               BREAK_TO_DEBUGGER();
+               goto create_fail;
+       }
+
+       /* Replay */
+       pool->base.replay = dmub_replay_create(ctx);
+       if (pool->base.replay == NULL) {
+               dm_error("DC: failed to create replay obj!\n");
+               BREAK_TO_DEBUGGER();
+               goto create_fail;
+       }
+
+       /* ABM */
+       for (i = 0; i < pool->base.res_cap->num_timing_generator; i++) {
+               pool->base.multiple_abms[i] = dmub_abm_create(ctx,
+                               &abm_regs[i],
+                               &abm_shift,
+                               &abm_mask);
+               if (pool->base.multiple_abms[i] == NULL) {
+                       dm_error("DC: failed to create abm for pipe %d!\n", i);
+                       BREAK_TO_DEBUGGER();
+                       goto create_fail;
+               }
+       }
+
+       /* MPC and DSC */
+       pool->base.mpc = dcn31_mpc_create(ctx, pool->base.mpcc_count, pool->base.res_cap->num_mpc_3dlut);
+       if (pool->base.mpc == NULL) {
+               BREAK_TO_DEBUGGER();
+               dm_error("DC: failed to create mpc!\n");
+               goto create_fail;
+       }
+
+       for (i = 0; i < pool->base.res_cap->num_dsc; i++) {
+               pool->base.dscs[i] = dcn31_dsc_create(ctx, i);
+               if (pool->base.dscs[i] == NULL) {
+                       BREAK_TO_DEBUGGER();
+                       dm_error("DC: failed to create display stream compressor %d!\n", i);
+                       goto create_fail;
+               }
+       }
+
+       /* DWB and MMHUBBUB */
+       if (!dcn31_dwbc_create(ctx, &pool->base)) {
+               BREAK_TO_DEBUGGER();
+               dm_error("DC: failed to create dwbc!\n");
+               goto create_fail;
+       }
+
+       if (!dcn31_mmhubbub_create(ctx, &pool->base)) {
+               BREAK_TO_DEBUGGER();
+               dm_error("DC: failed to create mcif_wb!\n");
+               goto create_fail;
+       }
+
+       /* AUX and I2C */
+       for (i = 0; i < pool->base.res_cap->num_ddc; i++) {
+               pool->base.engines[i] = dcn31_aux_engine_create(ctx, i);
+               if (pool->base.engines[i] == NULL) {
+                       BREAK_TO_DEBUGGER();
+                       dm_error(
+                               "DC:failed to create aux engine!!\n");
+                       goto create_fail;
+               }
+               pool->base.hw_i2cs[i] = dcn31_i2c_hw_create(ctx, i);
+               if (pool->base.hw_i2cs[i] == NULL) {
+                       BREAK_TO_DEBUGGER();
+                       dm_error(
+                               "DC:failed to create hw i2c!!\n");
+                       goto create_fail;
+               }
+               pool->base.sw_i2cs[i] = NULL;
+       }
+
+       if (dc->ctx->asic_id.chip_family == FAMILY_YELLOW_CARP &&
+           dc->ctx->asic_id.hw_internal_rev == YELLOW_CARP_B0 &&
+           !dc->debug.dpia_debug.bits.disable_dpia) {
+               /* YELLOW CARP B0 has 4 DPIA's */
+               pool->base.usb4_dpia_count = 4;
+       }
+
+       if (dc->ctx->asic_id.chip_family == AMDGPU_FAMILY_GC_11_0_1)
+               pool->base.usb4_dpia_count = 4;
+
+       /* Audio, Stream Encoders including HPO and virtual, MPC 3D LUTs */
+       if (!resource_construct(num_virtual_links, dc, &pool->base,
+                       &res_create_funcs))
+               goto create_fail;
+
+       /* HW Sequencer and Plane caps */
+       dcn31_hw_sequencer_construct(dc);
+
+       dc->caps.max_planes =  pool->base.pipe_count;
+
+       for (i = 0; i < dc->caps.max_planes; ++i)
+               dc->caps.planes[i] = plane_cap;
+
+       dc->cap_funcs = cap_funcs;
+
+       dc->dcn_ip->max_num_dpp = dcn3_1_ip.max_num_dpp;
+
+       return true;
+
+create_fail:
+       dcn31_resource_destruct(pool);
+
+       return false;
+}
+
+struct resource_pool *dcn31_create_resource_pool(
+               const struct dc_init_data *init_data,
+               struct dc *dc)
+{
+       struct dcn31_resource_pool *pool =
+               kzalloc(sizeof(struct dcn31_resource_pool), GFP_KERNEL);
+
+       if (!pool)
+               return NULL;
+
+       if (dcn31_resource_construct(init_data->num_virtual_links, dc, pool))
+               return &pool->base;
+
+       BREAK_TO_DEBUGGER();
+       kfree(pool);
+       return NULL;
+}
diff --git a/drivers/gpu/drm/amd/display/dc/resource/dcn31/dcn31_resource.h b/drivers/gpu/drm/amd/display/dc/resource/dcn31/dcn31_resource.h
new file mode 100644 (file)
index 0000000..9014365
--- /dev/null
@@ -0,0 +1,97 @@
+/*
+ * 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
+ *
+ */
+
+#ifndef _DCN31_RESOURCE_H_
+#define _DCN31_RESOURCE_H_
+
+#include "core_types.h"
+
+#define TO_DCN31_RES_POOL(pool)\
+       container_of(pool, struct dcn31_resource_pool, base)
+
+extern struct _vcs_dpi_ip_params_st dcn3_1_ip;
+
+struct dcn31_resource_pool {
+       struct resource_pool base;
+};
+
+bool dcn31_validate_bandwidth(struct dc *dc,
+               struct dc_state *context,
+               bool fast_validate);
+void dcn31_calculate_wm_and_dlg(
+               struct dc *dc, struct dc_state *context,
+               display_e2e_pipe_params_st *pipes,
+               int pipe_cnt,
+               int vlevel);
+int dcn31_populate_dml_pipes_from_context(
+       struct dc *dc, struct dc_state *context,
+       display_e2e_pipe_params_st *pipes,
+       bool fast_validate);
+void
+dcn31_populate_dml_writeback_from_context(struct dc *dc,
+                                         struct resource_context *res_ctx,
+                                         display_e2e_pipe_params_st *pipes);
+void
+dcn31_set_mcif_arb_params(struct dc *dc,
+                         struct dc_state *context,
+                         display_e2e_pipe_params_st *pipes,
+                         int pipe_cnt);
+
+struct resource_pool *dcn31_create_resource_pool(
+               const struct dc_init_data *init_data,
+               struct dc *dc);
+
+/*temp: B0 specific before switch to dcn313 headers*/
+#ifndef regPHYPLLF_PIXCLK_RESYNC_CNTL
+#define regPHYPLLF_PIXCLK_RESYNC_CNTL 0x007e
+#define regPHYPLLF_PIXCLK_RESYNC_CNTL_BASE_IDX 1
+#define regPHYPLLG_PIXCLK_RESYNC_CNTL 0x005f
+#define regPHYPLLG_PIXCLK_RESYNC_CNTL_BASE_IDX 1
+
+//PHYPLLF_PIXCLK_RESYNC_CNTL
+#define PHYPLLF_PIXCLK_RESYNC_CNTL__PHYPLLF_PIXCLK_RESYNC_ENABLE__SHIFT 0x0
+#define PHYPLLF_PIXCLK_RESYNC_CNTL__PHYPLLF_DEEP_COLOR_DTO_ENABLE_STATUS__SHIFT 0x1
+#define PHYPLLF_PIXCLK_RESYNC_CNTL__PHYPLLF_DCCG_DEEP_COLOR_CNTL__SHIFT 0x4
+#define PHYPLLF_PIXCLK_RESYNC_CNTL__PHYPLLF_PIXCLK_ENABLE__SHIFT 0x8
+#define PHYPLLF_PIXCLK_RESYNC_CNTL__PHYPLLF_PIXCLK_DOUBLE_RATE_ENABLE__SHIFT 0x9
+#define PHYPLLF_PIXCLK_RESYNC_CNTL__PHYPLLF_PIXCLK_RESYNC_ENABLE_MASK 0x00000001L
+#define PHYPLLF_PIXCLK_RESYNC_CNTL__PHYPLLF_DEEP_COLOR_DTO_ENABLE_STATUS_MASK 0x00000002L
+#define PHYPLLF_PIXCLK_RESYNC_CNTL__PHYPLLF_DCCG_DEEP_COLOR_CNTL_MASK 0x00000030L
+#define PHYPLLF_PIXCLK_RESYNC_CNTL__PHYPLLF_PIXCLK_ENABLE_MASK 0x00000100L
+#define PHYPLLF_PIXCLK_RESYNC_CNTL__PHYPLLF_PIXCLK_DOUBLE_RATE_ENABLE_MASK 0x00000200L
+
+//PHYPLLG_PIXCLK_RESYNC_CNTL
+#define PHYPLLG_PIXCLK_RESYNC_CNTL__PHYPLLG_PIXCLK_RESYNC_ENABLE__SHIFT 0x0
+#define PHYPLLG_PIXCLK_RESYNC_CNTL__PHYPLLG_DEEP_COLOR_DTO_ENABLE_STATUS__SHIFT 0x1
+#define PHYPLLG_PIXCLK_RESYNC_CNTL__PHYPLLG_DCCG_DEEP_COLOR_CNTL__SHIFT 0x4
+#define PHYPLLG_PIXCLK_RESYNC_CNTL__PHYPLLG_PIXCLK_ENABLE__SHIFT 0x8
+#define PHYPLLG_PIXCLK_RESYNC_CNTL__PHYPLLG_PIXCLK_DOUBLE_RATE_ENABLE__SHIFT 0x9
+#define PHYPLLG_PIXCLK_RESYNC_CNTL__PHYPLLG_PIXCLK_RESYNC_ENABLE_MASK 0x00000001L
+#define PHYPLLG_PIXCLK_RESYNC_CNTL__PHYPLLG_DEEP_COLOR_DTO_ENABLE_STATUS_MASK 0x00000002L
+#define PHYPLLG_PIXCLK_RESYNC_CNTL__PHYPLLG_DCCG_DEEP_COLOR_CNTL_MASK 0x00000030L
+#define PHYPLLG_PIXCLK_RESYNC_CNTL__PHYPLLG_PIXCLK_ENABLE_MASK 0x00000100L
+#define PHYPLLG_PIXCLK_RESYNC_CNTL__PHYPLLG_PIXCLK_DOUBLE_RATE_ENABLE_MASK 0x00000200L
+#endif
+#endif /* _DCN31_RESOURCE_H_ */
diff --git a/drivers/gpu/drm/amd/display/dc/resource/dcn314/dcn314_resource.c b/drivers/gpu/drm/amd/display/dc/resource/dcn314/dcn314_resource.c
new file mode 100644 (file)
index 0000000..677361d
--- /dev/null
@@ -0,0 +1,2180 @@
+// SPDX-License-Identifier: MIT
+/*
+ * 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 "dm_services.h"
+#include "dc.h"
+
+#include "dcn31/dcn31_init.h"
+#include "dcn314/dcn314_init.h"
+
+#include "resource.h"
+#include "include/irq_service_interface.h"
+#include "dcn314_resource.h"
+
+#include "dcn20/dcn20_resource.h"
+#include "dcn30/dcn30_resource.h"
+#include "dcn31/dcn31_resource.h"
+
+#include "dcn10/dcn10_ipp.h"
+#include "dcn30/dcn30_hubbub.h"
+#include "dcn31/dcn31_hubbub.h"
+#include "dcn30/dcn30_mpc.h"
+#include "dcn31/dcn31_hubp.h"
+#include "irq/dcn31/irq_service_dcn31.h"
+#include "irq/dcn314/irq_service_dcn314.h"
+#include "dcn30/dcn30_dpp.h"
+#include "dcn314/dcn314_optc.h"
+#include "dcn20/dcn20_hwseq.h"
+#include "dcn30/dcn30_hwseq.h"
+#include "dce110/dce110_hwseq.h"
+#include "dcn30/dcn30_opp.h"
+#include "dcn20/dcn20_dsc.h"
+#include "dcn30/dcn30_vpg.h"
+#include "dcn30/dcn30_afmt.h"
+#include "dcn31/dcn31_dio_link_encoder.h"
+#include "dcn314/dcn314_dio_stream_encoder.h"
+#include "dcn31/dcn31_hpo_dp_stream_encoder.h"
+#include "dcn31/dcn31_hpo_dp_link_encoder.h"
+#include "dcn31/dcn31_apg.h"
+#include "dcn31/dcn31_vpg.h"
+#include "dcn31/dcn31_afmt.h"
+#include "dce/dce_clock_source.h"
+#include "dce/dce_audio.h"
+#include "dce/dce_hwseq.h"
+#include "clk_mgr.h"
+#include "virtual/virtual_stream_encoder.h"
+#include "dce110/dce110_resource.h"
+#include "dml/display_mode_vba.h"
+#include "dml/dcn31/dcn31_fpu.h"
+#include "dml/dcn314/dcn314_fpu.h"
+#include "dcn314/dcn314_dccg.h"
+#include "dcn10/dcn10_resource.h"
+#include "dcn31/dcn31_panel_cntl.h"
+#include "dcn314/dcn314_hwseq.h"
+
+#include "dcn30/dcn30_dwb.h"
+#include "dcn30/dcn30_mmhubbub.h"
+
+#include "dcn/dcn_3_1_4_offset.h"
+#include "dcn/dcn_3_1_4_sh_mask.h"
+#include "dpcs/dpcs_3_1_4_offset.h"
+#include "dpcs/dpcs_3_1_4_sh_mask.h"
+
+#define DCHUBBUB_DEBUG_CTRL_0__DET_DEPTH__SHIFT                0x10
+#define DCHUBBUB_DEBUG_CTRL_0__DET_DEPTH_MASK          0x01FF0000L
+
+#define DSCC0_DSCC_CONFIG0__ICH_RESET_AT_END_OF_LINE__SHIFT                   0x0
+#define DSCC0_DSCC_CONFIG0__ICH_RESET_AT_END_OF_LINE_MASK                     0x0000000FL
+
+#include "reg_helper.h"
+#include "dce/dmub_abm.h"
+#include "dce/dmub_psr.h"
+#include "dce/dmub_replay.h"
+#include "dce/dce_aux.h"
+#include "dce/dce_i2c.h"
+#include "dml/dcn314/display_mode_vba_314.h"
+#include "vm_helper.h"
+#include "dcn20/dcn20_vmid.h"
+
+#include "link_enc_cfg.h"
+
+#define DCN_BASE__INST0_SEG1                           0x000000C0
+#define DCN_BASE__INST0_SEG2                           0x000034C0
+#define DCN_BASE__INST0_SEG3                           0x00009000
+
+#define NBIO_BASE__INST0_SEG1                          0x00000014
+
+#define MAX_INSTANCE                                   7
+#define MAX_SEGMENT                                    8
+
+#define regBIF_BX2_BIOS_SCRATCH_2                      0x003a
+#define regBIF_BX2_BIOS_SCRATCH_2_BASE_IDX             1
+#define regBIF_BX2_BIOS_SCRATCH_3                      0x003b
+#define regBIF_BX2_BIOS_SCRATCH_3_BASE_IDX             1
+#define regBIF_BX2_BIOS_SCRATCH_6                      0x003e
+#define regBIF_BX2_BIOS_SCRATCH_6_BASE_IDX             1
+
+#define DC_LOGGER \
+       dc->ctx->logger
+#define DC_LOGGER_INIT(logger)
+
+enum dcn31_clk_src_array_id {
+       DCN31_CLK_SRC_PLL0,
+       DCN31_CLK_SRC_PLL1,
+       DCN31_CLK_SRC_PLL2,
+       DCN31_CLK_SRC_PLL3,
+       DCN31_CLK_SRC_PLL4,
+       DCN30_CLK_SRC_TOTAL
+};
+
+/* begin *********************
+ * macros to expend register list macro defined in HW object header file
+ */
+
+/* DCN */
+/* TODO awful hack. fixup dcn20_dwb.h */
+#undef BASE_INNER
+#define BASE_INNER(seg) DCN_BASE__INST0_SEG ## seg
+
+#define BASE(seg) BASE_INNER(seg)
+
+#define SR(reg_name)\
+               .reg_name = BASE(reg ## reg_name ## _BASE_IDX) +  \
+                                       reg ## reg_name
+
+#define SRI(reg_name, block, id)\
+       .reg_name = BASE(reg ## block ## id ## _ ## reg_name ## _BASE_IDX) + \
+                                       reg ## block ## id ## _ ## reg_name
+
+#define SRI2(reg_name, block, id)\
+       .reg_name = BASE(reg ## reg_name ## _BASE_IDX) + \
+                                       reg ## reg_name
+
+#define SRIR(var_name, reg_name, block, id)\
+       .var_name = BASE(reg ## block ## id ## _ ## reg_name ## _BASE_IDX) + \
+                                       reg ## block ## id ## _ ## reg_name
+
+#define SRII(reg_name, block, id)\
+       .reg_name[id] = BASE(reg ## block ## id ## _ ## reg_name ## _BASE_IDX) + \
+                                       reg ## block ## id ## _ ## reg_name
+
+#define SRII_MPC_RMU(reg_name, block, id)\
+       .RMU##_##reg_name[id] = BASE(reg ## block ## id ## _ ## reg_name ## _BASE_IDX) + \
+                                       reg ## block ## id ## _ ## reg_name
+
+#define SRII_DWB(reg_name, temp_name, block, id)\
+       .reg_name[id] = BASE(reg ## block ## id ## _ ## temp_name ## _BASE_IDX) + \
+                                       reg ## block ## id ## _ ## temp_name
+
+#define SF_DWB2(reg_name, block, id, field_name, post_fix)     \
+       .field_name = reg_name ## __ ## field_name ## post_fix
+
+#define DCCG_SRII(reg_name, block, id)\
+       .block ## _ ## reg_name[id] = BASE(reg ## block ## id ## _ ## reg_name ## _BASE_IDX) + \
+                                       reg ## block ## id ## _ ## reg_name
+
+#define VUPDATE_SRII(reg_name, block, id)\
+       .reg_name[id] = BASE(reg ## reg_name ## _ ## block ## id ## _BASE_IDX) + \
+                                       reg ## reg_name ## _ ## block ## id
+
+/* NBIO */
+#define NBIO_BASE_INNER(seg) \
+       NBIO_BASE__INST0_SEG ## seg
+
+#define NBIO_BASE(seg) \
+       NBIO_BASE_INNER(seg)
+
+#define NBIO_SR(reg_name)\
+               .reg_name = NBIO_BASE(regBIF_BX2_ ## reg_name ## _BASE_IDX) + \
+                                       regBIF_BX2_ ## reg_name
+
+/* MMHUB */
+#define MMHUB_BASE_INNER(seg) \
+       MMHUB_BASE__INST0_SEG ## seg
+
+#define MMHUB_BASE(seg) \
+       MMHUB_BASE_INNER(seg)
+
+#define MMHUB_SR(reg_name)\
+               .reg_name = MMHUB_BASE(reg ## reg_name ## _BASE_IDX) + \
+                                       reg ## reg_name
+
+/* CLOCK */
+#define CLK_BASE_INNER(seg) \
+       CLK_BASE__INST0_SEG ## seg
+
+#define CLK_BASE(seg) \
+       CLK_BASE_INNER(seg)
+
+#define CLK_SRI(reg_name, block, inst)\
+       .reg_name = CLK_BASE(reg ## block ## _ ## inst ## _ ## reg_name ## _BASE_IDX) + \
+                                       reg ## block ## _ ## inst ## _ ## reg_name
+
+
+static const struct bios_registers bios_regs = {
+               NBIO_SR(BIOS_SCRATCH_3),
+               NBIO_SR(BIOS_SCRATCH_6)
+};
+
+#define clk_src_regs(index, pllid)\
+[index] = {\
+       CS_COMMON_REG_LIST_DCN3_0(index, pllid),\
+}
+
+static const struct dce110_clk_src_regs clk_src_regs[] = {
+       clk_src_regs(0, A),
+       clk_src_regs(1, B),
+       clk_src_regs(2, C),
+       clk_src_regs(3, D),
+       clk_src_regs(4, E)
+};
+
+static const struct dce110_clk_src_shift cs_shift = {
+               CS_COMMON_MASK_SH_LIST_DCN3_1_4(__SHIFT)
+};
+
+static const struct dce110_clk_src_mask cs_mask = {
+               CS_COMMON_MASK_SH_LIST_DCN3_1_4(_MASK)
+};
+
+#define abm_regs(id)\
+[id] = {\
+               ABM_DCN302_REG_LIST(id)\
+}
+
+static const struct dce_abm_registers abm_regs[] = {
+               abm_regs(0),
+               abm_regs(1),
+               abm_regs(2),
+               abm_regs(3),
+};
+
+static const struct dce_abm_shift abm_shift = {
+               ABM_MASK_SH_LIST_DCN30(__SHIFT)
+};
+
+static const struct dce_abm_mask abm_mask = {
+               ABM_MASK_SH_LIST_DCN30(_MASK)
+};
+
+#define audio_regs(id)\
+[id] = {\
+               AUD_COMMON_REG_LIST(id)\
+}
+
+static const struct dce_audio_registers audio_regs[] = {
+       audio_regs(0),
+       audio_regs(1),
+       audio_regs(2),
+       audio_regs(3),
+       audio_regs(4),
+       audio_regs(5),
+       audio_regs(6)
+};
+
+#define DCE120_AUD_COMMON_MASK_SH_LIST(mask_sh)\
+               SF(AZF0ENDPOINT0_AZALIA_F0_CODEC_ENDPOINT_INDEX, AZALIA_ENDPOINT_REG_INDEX, mask_sh),\
+               SF(AZF0ENDPOINT0_AZALIA_F0_CODEC_ENDPOINT_DATA, AZALIA_ENDPOINT_REG_DATA, mask_sh),\
+               AUD_COMMON_MASK_SH_LIST_BASE(mask_sh)
+
+static const struct dce_audio_shift audio_shift = {
+               DCE120_AUD_COMMON_MASK_SH_LIST(__SHIFT)
+};
+
+static const struct dce_audio_mask audio_mask = {
+               DCE120_AUD_COMMON_MASK_SH_LIST(_MASK)
+};
+
+#define vpg_regs(id)\
+[id] = {\
+       VPG_DCN31_REG_LIST(id)\
+}
+
+static const struct dcn31_vpg_registers vpg_regs[] = {
+       vpg_regs(0),
+       vpg_regs(1),
+       vpg_regs(2),
+       vpg_regs(3),
+       vpg_regs(4),
+       vpg_regs(5),
+       vpg_regs(6),
+       vpg_regs(7),
+       vpg_regs(8),
+       vpg_regs(9),
+};
+
+static const struct dcn31_vpg_shift vpg_shift = {
+       DCN31_VPG_MASK_SH_LIST(__SHIFT)
+};
+
+static const struct dcn31_vpg_mask vpg_mask = {
+       DCN31_VPG_MASK_SH_LIST(_MASK)
+};
+
+#define afmt_regs(id)\
+[id] = {\
+       AFMT_DCN31_REG_LIST(id)\
+}
+
+static const struct dcn31_afmt_registers afmt_regs[] = {
+       afmt_regs(0),
+       afmt_regs(1),
+       afmt_regs(2),
+       afmt_regs(3),
+       afmt_regs(4),
+       afmt_regs(5)
+};
+
+static const struct dcn31_afmt_shift afmt_shift = {
+       DCN31_AFMT_MASK_SH_LIST(__SHIFT)
+};
+
+static const struct dcn31_afmt_mask afmt_mask = {
+       DCN31_AFMT_MASK_SH_LIST(_MASK)
+};
+
+#define apg_regs(id)\
+[id] = {\
+       APG_DCN31_REG_LIST(id)\
+}
+
+static const struct dcn31_apg_registers apg_regs[] = {
+       apg_regs(0),
+       apg_regs(1),
+       apg_regs(2),
+       apg_regs(3)
+};
+
+static const struct dcn31_apg_shift apg_shift = {
+       DCN31_APG_MASK_SH_LIST(__SHIFT)
+};
+
+static const struct dcn31_apg_mask apg_mask = {
+               DCN31_APG_MASK_SH_LIST(_MASK)
+};
+
+#define stream_enc_regs(id)\
+[id] = {\
+               SE_DCN314_REG_LIST(id)\
+}
+
+static const struct dcn10_stream_enc_registers stream_enc_regs[] = {
+       stream_enc_regs(0),
+       stream_enc_regs(1),
+       stream_enc_regs(2),
+       stream_enc_regs(3),
+       stream_enc_regs(4)
+};
+
+static const struct dcn10_stream_encoder_shift se_shift = {
+               SE_COMMON_MASK_SH_LIST_DCN314(__SHIFT)
+};
+
+static const struct dcn10_stream_encoder_mask se_mask = {
+               SE_COMMON_MASK_SH_LIST_DCN314(_MASK)
+};
+
+
+#define aux_regs(id)\
+[id] = {\
+       DCN2_AUX_REG_LIST(id)\
+}
+
+static const struct dcn10_link_enc_aux_registers link_enc_aux_regs[] = {
+               aux_regs(0),
+               aux_regs(1),
+               aux_regs(2),
+               aux_regs(3),
+               aux_regs(4)
+};
+
+#define hpd_regs(id)\
+[id] = {\
+       HPD_REG_LIST(id)\
+}
+
+static const struct dcn10_link_enc_hpd_registers link_enc_hpd_regs[] = {
+               hpd_regs(0),
+               hpd_regs(1),
+               hpd_regs(2),
+               hpd_regs(3),
+               hpd_regs(4)
+};
+
+#define link_regs(id, phyid)\
+[id] = {\
+       LE_DCN31_REG_LIST(id), \
+       UNIPHY_DCN2_REG_LIST(phyid), \
+}
+
+static const struct dce110_aux_registers_shift aux_shift = {
+       DCN_AUX_MASK_SH_LIST(__SHIFT)
+};
+
+static const struct dce110_aux_registers_mask aux_mask = {
+       DCN_AUX_MASK_SH_LIST(_MASK)
+};
+
+static const struct dcn10_link_enc_registers link_enc_regs[] = {
+       link_regs(0, A),
+       link_regs(1, B),
+       link_regs(2, C),
+       link_regs(3, D),
+       link_regs(4, E)
+};
+
+static const struct dcn10_link_enc_shift le_shift = {
+       LINK_ENCODER_MASK_SH_LIST_DCN31(__SHIFT),
+       DPCS_DCN31_MASK_SH_LIST(__SHIFT)
+};
+
+static const struct dcn10_link_enc_mask le_mask = {
+       LINK_ENCODER_MASK_SH_LIST_DCN31(_MASK),
+       DPCS_DCN31_MASK_SH_LIST(_MASK)
+};
+
+#define hpo_dp_stream_encoder_reg_list(id)\
+[id] = {\
+       DCN3_1_HPO_DP_STREAM_ENC_REG_LIST(id)\
+}
+
+static const struct dcn31_hpo_dp_stream_encoder_registers hpo_dp_stream_enc_regs[] = {
+       hpo_dp_stream_encoder_reg_list(0),
+       hpo_dp_stream_encoder_reg_list(1),
+       hpo_dp_stream_encoder_reg_list(2),
+       hpo_dp_stream_encoder_reg_list(3)
+};
+
+static const struct dcn31_hpo_dp_stream_encoder_shift hpo_dp_se_shift = {
+       DCN3_1_HPO_DP_STREAM_ENC_MASK_SH_LIST(__SHIFT)
+};
+
+static const struct dcn31_hpo_dp_stream_encoder_mask hpo_dp_se_mask = {
+       DCN3_1_HPO_DP_STREAM_ENC_MASK_SH_LIST(_MASK)
+};
+
+
+#define hpo_dp_link_encoder_reg_list(id)\
+[id] = {\
+       DCN3_1_HPO_DP_LINK_ENC_REG_LIST(id),\
+       DCN3_1_RDPCSTX_REG_LIST(0),\
+       DCN3_1_RDPCSTX_REG_LIST(1),\
+       DCN3_1_RDPCSTX_REG_LIST(2),\
+}
+
+static const struct dcn31_hpo_dp_link_encoder_registers hpo_dp_link_enc_regs[] = {
+       hpo_dp_link_encoder_reg_list(0),
+       hpo_dp_link_encoder_reg_list(1),
+};
+
+static const struct dcn31_hpo_dp_link_encoder_shift hpo_dp_le_shift = {
+       DCN3_1_HPO_DP_LINK_ENC_MASK_SH_LIST(__SHIFT)
+};
+
+static const struct dcn31_hpo_dp_link_encoder_mask hpo_dp_le_mask = {
+       DCN3_1_HPO_DP_LINK_ENC_MASK_SH_LIST(_MASK)
+};
+
+#define dpp_regs(id)\
+[id] = {\
+       DPP_REG_LIST_DCN30(id),\
+}
+
+static const struct dcn3_dpp_registers dpp_regs[] = {
+       dpp_regs(0),
+       dpp_regs(1),
+       dpp_regs(2),
+       dpp_regs(3)
+};
+
+static const struct dcn3_dpp_shift tf_shift = {
+               DPP_REG_LIST_SH_MASK_DCN30(__SHIFT)
+};
+
+static const struct dcn3_dpp_mask tf_mask = {
+               DPP_REG_LIST_SH_MASK_DCN30(_MASK)
+};
+
+#define opp_regs(id)\
+[id] = {\
+       OPP_REG_LIST_DCN30(id),\
+}
+
+static const struct dcn20_opp_registers opp_regs[] = {
+       opp_regs(0),
+       opp_regs(1),
+       opp_regs(2),
+       opp_regs(3)
+};
+
+static const struct dcn20_opp_shift opp_shift = {
+       OPP_MASK_SH_LIST_DCN20(__SHIFT)
+};
+
+static const struct dcn20_opp_mask opp_mask = {
+       OPP_MASK_SH_LIST_DCN20(_MASK)
+};
+
+#define aux_engine_regs(id)\
+[id] = {\
+       AUX_COMMON_REG_LIST0(id), \
+       .AUXN_IMPCAL = 0, \
+       .AUXP_IMPCAL = 0, \
+       .AUX_RESET_MASK = DP_AUX0_AUX_CONTROL__AUX_RESET_MASK, \
+}
+
+static const struct dce110_aux_registers aux_engine_regs[] = {
+               aux_engine_regs(0),
+               aux_engine_regs(1),
+               aux_engine_regs(2),
+               aux_engine_regs(3),
+               aux_engine_regs(4)
+};
+
+#define dwbc_regs_dcn3(id)\
+[id] = {\
+       DWBC_COMMON_REG_LIST_DCN30(id),\
+}
+
+static const struct dcn30_dwbc_registers dwbc30_regs[] = {
+       dwbc_regs_dcn3(0),
+};
+
+static const struct dcn30_dwbc_shift dwbc30_shift = {
+       DWBC_COMMON_MASK_SH_LIST_DCN30(__SHIFT)
+};
+
+static const struct dcn30_dwbc_mask dwbc30_mask = {
+       DWBC_COMMON_MASK_SH_LIST_DCN30(_MASK)
+};
+
+#define mcif_wb_regs_dcn3(id)\
+[id] = {\
+       MCIF_WB_COMMON_REG_LIST_DCN30(id),\
+}
+
+static const struct dcn30_mmhubbub_registers mcif_wb30_regs[] = {
+       mcif_wb_regs_dcn3(0)
+};
+
+static const struct dcn30_mmhubbub_shift mcif_wb30_shift = {
+       MCIF_WB_COMMON_MASK_SH_LIST_DCN30(__SHIFT)
+};
+
+static const struct dcn30_mmhubbub_mask mcif_wb30_mask = {
+       MCIF_WB_COMMON_MASK_SH_LIST_DCN30(_MASK)
+};
+
+#define dsc_regsDCN314(id)\
+[id] = {\
+       DSC_REG_LIST_DCN20(id)\
+}
+
+static const struct dcn20_dsc_registers dsc_regs[] = {
+       dsc_regsDCN314(0),
+       dsc_regsDCN314(1),
+       dsc_regsDCN314(2),
+       dsc_regsDCN314(3)
+};
+
+static const struct dcn20_dsc_shift dsc_shift = {
+       DSC_REG_LIST_SH_MASK_DCN20(__SHIFT)
+};
+
+static const struct dcn20_dsc_mask dsc_mask = {
+       DSC_REG_LIST_SH_MASK_DCN20(_MASK)
+};
+
+static const struct dcn30_mpc_registers mpc_regs = {
+               MPC_REG_LIST_DCN3_0(0),
+               MPC_REG_LIST_DCN3_0(1),
+               MPC_REG_LIST_DCN3_0(2),
+               MPC_REG_LIST_DCN3_0(3),
+               MPC_OUT_MUX_REG_LIST_DCN3_0(0),
+               MPC_OUT_MUX_REG_LIST_DCN3_0(1),
+               MPC_OUT_MUX_REG_LIST_DCN3_0(2),
+               MPC_OUT_MUX_REG_LIST_DCN3_0(3),
+               MPC_RMU_GLOBAL_REG_LIST_DCN3AG,
+               MPC_RMU_REG_LIST_DCN3AG(0),
+               MPC_RMU_REG_LIST_DCN3AG(1),
+               //MPC_RMU_REG_LIST_DCN3AG(2),
+               MPC_DWB_MUX_REG_LIST_DCN3_0(0),
+};
+
+static const struct dcn30_mpc_shift mpc_shift = {
+       MPC_COMMON_MASK_SH_LIST_DCN30(__SHIFT)
+};
+
+static const struct dcn30_mpc_mask mpc_mask = {
+       MPC_COMMON_MASK_SH_LIST_DCN30(_MASK)
+};
+
+#define optc_regs(id)\
+[id] = {OPTC_COMMON_REG_LIST_DCN3_14(id)}
+
+static const struct dcn_optc_registers optc_regs[] = {
+       optc_regs(0),
+       optc_regs(1),
+       optc_regs(2),
+       optc_regs(3)
+};
+
+static const struct dcn_optc_shift optc_shift = {
+       OPTC_COMMON_MASK_SH_LIST_DCN3_14(__SHIFT)
+};
+
+static const struct dcn_optc_mask optc_mask = {
+       OPTC_COMMON_MASK_SH_LIST_DCN3_14(_MASK)
+};
+
+#define hubp_regs(id)\
+[id] = {\
+       HUBP_REG_LIST_DCN30(id)\
+}
+
+static const struct dcn_hubp2_registers hubp_regs[] = {
+               hubp_regs(0),
+               hubp_regs(1),
+               hubp_regs(2),
+               hubp_regs(3)
+};
+
+
+static const struct dcn_hubp2_shift hubp_shift = {
+               HUBP_MASK_SH_LIST_DCN31(__SHIFT)
+};
+
+static const struct dcn_hubp2_mask hubp_mask = {
+               HUBP_MASK_SH_LIST_DCN31(_MASK)
+};
+static const struct dcn_hubbub_registers hubbub_reg = {
+               HUBBUB_REG_LIST_DCN31(0)
+};
+
+static const struct dcn_hubbub_shift hubbub_shift = {
+               HUBBUB_MASK_SH_LIST_DCN31(__SHIFT)
+};
+
+static const struct dcn_hubbub_mask hubbub_mask = {
+               HUBBUB_MASK_SH_LIST_DCN31(_MASK)
+};
+
+static const struct dccg_registers dccg_regs = {
+               DCCG_REG_LIST_DCN314()
+};
+
+static const struct dccg_shift dccg_shift = {
+               DCCG_MASK_SH_LIST_DCN314(__SHIFT)
+};
+
+static const struct dccg_mask dccg_mask = {
+               DCCG_MASK_SH_LIST_DCN314(_MASK)
+};
+
+
+#define SRII2(reg_name_pre, reg_name_post, id)\
+       .reg_name_pre ## _ ##  reg_name_post[id] = BASE(reg ## reg_name_pre \
+                       ## id ## _ ## reg_name_post ## _BASE_IDX) + \
+                       reg ## reg_name_pre ## id ## _ ## reg_name_post
+
+
+#define HWSEQ_DCN31_REG_LIST()\
+       SR(DCHUBBUB_GLOBAL_TIMER_CNTL), \
+       SR(DCHUBBUB_ARB_HOSTVM_CNTL), \
+       SR(DIO_MEM_PWR_CTRL), \
+       SR(ODM_MEM_PWR_CTRL3), \
+       SR(DMU_MEM_PWR_CNTL), \
+       SR(MMHUBBUB_MEM_PWR_CNTL), \
+       SR(DCCG_GATE_DISABLE_CNTL), \
+       SR(DCCG_GATE_DISABLE_CNTL2), \
+       SR(DCFCLK_CNTL),\
+       SR(DC_MEM_GLOBAL_PWR_REQ_CNTL), \
+       SRII(PIXEL_RATE_CNTL, OTG, 0), \
+       SRII(PIXEL_RATE_CNTL, OTG, 1),\
+       SRII(PIXEL_RATE_CNTL, OTG, 2),\
+       SRII(PIXEL_RATE_CNTL, OTG, 3),\
+       SRII(PHYPLL_PIXEL_RATE_CNTL, OTG, 0),\
+       SRII(PHYPLL_PIXEL_RATE_CNTL, OTG, 1),\
+       SRII(PHYPLL_PIXEL_RATE_CNTL, OTG, 2),\
+       SRII(PHYPLL_PIXEL_RATE_CNTL, OTG, 3),\
+       SR(MICROSECOND_TIME_BASE_DIV), \
+       SR(MILLISECOND_TIME_BASE_DIV), \
+       SR(DISPCLK_FREQ_CHANGE_CNTL), \
+       SR(RBBMIF_TIMEOUT_DIS), \
+       SR(RBBMIF_TIMEOUT_DIS_2), \
+       SR(DCHUBBUB_CRC_CTRL), \
+       SR(DPP_TOP0_DPP_CRC_CTRL), \
+       SR(DPP_TOP0_DPP_CRC_VAL_B_A), \
+       SR(DPP_TOP0_DPP_CRC_VAL_R_G), \
+       SR(MPC_CRC_CTRL), \
+       SR(MPC_CRC_RESULT_GB), \
+       SR(MPC_CRC_RESULT_C), \
+       SR(MPC_CRC_RESULT_AR), \
+       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(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(D1VGA_CONTROL), \
+       SR(D2VGA_CONTROL), \
+       SR(D3VGA_CONTROL), \
+       SR(D4VGA_CONTROL), \
+       SR(D5VGA_CONTROL), \
+       SR(D6VGA_CONTROL), \
+       SR(DC_IP_REQUEST_CNTL), \
+       SR(AZALIA_AUDIO_DTO), \
+       SR(AZALIA_CONTROLLER_CLOCK_GATING), \
+       SR(HPO_TOP_HW_CONTROL)
+
+static const struct dce_hwseq_registers hwseq_reg = {
+               HWSEQ_DCN31_REG_LIST()
+};
+
+#define HWSEQ_DCN31_MASK_SH_LIST(mask_sh)\
+       HWSEQ_DCN_MASK_SH_LIST(mask_sh), \
+       HWS_SF(, DCHUBBUB_GLOBAL_TIMER_CNTL, DCHUBBUB_GLOBAL_TIMER_REFDIV, mask_sh), \
+       HWS_SF(, DCHUBBUB_ARB_HOSTVM_CNTL, DISABLE_HOSTVM_FORCE_ALLOW_PSTATE, mask_sh), \
+       HWS_SF(, DOMAIN0_PG_CONFIG, DOMAIN_POWER_FORCEON, mask_sh), \
+       HWS_SF(, DOMAIN0_PG_CONFIG, DOMAIN_POWER_GATE, mask_sh), \
+       HWS_SF(, DOMAIN1_PG_CONFIG, DOMAIN_POWER_FORCEON, mask_sh), \
+       HWS_SF(, DOMAIN1_PG_CONFIG, DOMAIN_POWER_GATE, mask_sh), \
+       HWS_SF(, DOMAIN2_PG_CONFIG, DOMAIN_POWER_FORCEON, mask_sh), \
+       HWS_SF(, DOMAIN2_PG_CONFIG, DOMAIN_POWER_GATE, mask_sh), \
+       HWS_SF(, DOMAIN3_PG_CONFIG, DOMAIN_POWER_FORCEON, mask_sh), \
+       HWS_SF(, DOMAIN3_PG_CONFIG, DOMAIN_POWER_GATE, mask_sh), \
+       HWS_SF(, DOMAIN16_PG_CONFIG, DOMAIN_POWER_FORCEON, mask_sh), \
+       HWS_SF(, DOMAIN16_PG_CONFIG, DOMAIN_POWER_GATE, mask_sh), \
+       HWS_SF(, DOMAIN17_PG_CONFIG, DOMAIN_POWER_FORCEON, mask_sh), \
+       HWS_SF(, DOMAIN17_PG_CONFIG, DOMAIN_POWER_GATE, mask_sh), \
+       HWS_SF(, DOMAIN18_PG_CONFIG, DOMAIN_POWER_FORCEON, mask_sh), \
+       HWS_SF(, DOMAIN18_PG_CONFIG, DOMAIN_POWER_GATE, mask_sh), \
+       HWS_SF(, DOMAIN19_PG_CONFIG, DOMAIN_POWER_FORCEON, mask_sh), \
+       HWS_SF(, DOMAIN19_PG_CONFIG, DOMAIN_POWER_GATE, mask_sh), \
+       HWS_SF(, DOMAIN0_PG_STATUS, DOMAIN_PGFSM_PWR_STATUS, mask_sh), \
+       HWS_SF(, DOMAIN1_PG_STATUS, DOMAIN_PGFSM_PWR_STATUS, mask_sh), \
+       HWS_SF(, DOMAIN2_PG_STATUS, DOMAIN_PGFSM_PWR_STATUS, mask_sh), \
+       HWS_SF(, DOMAIN3_PG_STATUS, DOMAIN_PGFSM_PWR_STATUS, mask_sh), \
+       HWS_SF(, DOMAIN16_PG_STATUS, DOMAIN_PGFSM_PWR_STATUS, mask_sh), \
+       HWS_SF(, DOMAIN17_PG_STATUS, DOMAIN_PGFSM_PWR_STATUS, mask_sh), \
+       HWS_SF(, DOMAIN18_PG_STATUS, DOMAIN_PGFSM_PWR_STATUS, mask_sh), \
+       HWS_SF(, DOMAIN19_PG_STATUS, DOMAIN_PGFSM_PWR_STATUS, mask_sh), \
+       HWS_SF(, DC_IP_REQUEST_CNTL, IP_REQUEST_EN, mask_sh), \
+       HWS_SF(, AZALIA_AUDIO_DTO, AZALIA_AUDIO_DTO_MODULE, mask_sh), \
+       HWS_SF(, HPO_TOP_CLOCK_CONTROL, HPO_HDMISTREAMCLK_G_GATE_DIS, mask_sh), \
+       HWS_SF(, DMU_MEM_PWR_CNTL, DMCU_ERAM_MEM_PWR_FORCE, mask_sh), \
+       HWS_SF(, ODM_MEM_PWR_CTRL3, ODM_MEM_UNASSIGNED_PWR_MODE, mask_sh), \
+       HWS_SF(, ODM_MEM_PWR_CTRL3, ODM_MEM_VBLANK_PWR_MODE, mask_sh), \
+       HWS_SF(, MMHUBBUB_MEM_PWR_CNTL, VGA_MEM_PWR_FORCE, mask_sh), \
+       HWS_SF(, DIO_MEM_PWR_CTRL, I2C_LIGHT_SLEEP_FORCE, mask_sh), \
+       HWS_SF(, HPO_TOP_HW_CONTROL, HPO_IO_EN, mask_sh)
+
+static const struct dce_hwseq_shift hwseq_shift = {
+               HWSEQ_DCN31_MASK_SH_LIST(__SHIFT)
+};
+
+static const struct dce_hwseq_mask hwseq_mask = {
+               HWSEQ_DCN31_MASK_SH_LIST(_MASK)
+};
+#define vmid_regs(id)\
+[id] = {\
+               DCN20_VMID_REG_LIST(id)\
+}
+
+static const struct dcn_vmid_registers vmid_regs[] = {
+       vmid_regs(0),
+       vmid_regs(1),
+       vmid_regs(2),
+       vmid_regs(3),
+       vmid_regs(4),
+       vmid_regs(5),
+       vmid_regs(6),
+       vmid_regs(7),
+       vmid_regs(8),
+       vmid_regs(9),
+       vmid_regs(10),
+       vmid_regs(11),
+       vmid_regs(12),
+       vmid_regs(13),
+       vmid_regs(14),
+       vmid_regs(15)
+};
+
+static const struct dcn20_vmid_shift vmid_shifts = {
+               DCN20_VMID_MASK_SH_LIST(__SHIFT)
+};
+
+static const struct dcn20_vmid_mask vmid_masks = {
+               DCN20_VMID_MASK_SH_LIST(_MASK)
+};
+
+static const struct resource_caps res_cap_dcn314 = {
+       .num_timing_generator = 4,
+       .num_opp = 4,
+       .num_video_plane = 4,
+       .num_audio = 5,
+       .num_stream_encoder = 5,
+       .num_dig_link_enc = 5,
+       .num_hpo_dp_stream_encoder = 4,
+       .num_hpo_dp_link_encoder = 2,
+       .num_pll = 5,
+       .num_dwb = 1,
+       .num_ddc = 5,
+       .num_vmid = 16,
+       .num_mpc_3dlut = 2,
+       .num_dsc = 4,
+};
+
+static const struct dc_plane_cap plane_cap = {
+       .type = DC_PLANE_TYPE_DCN_UNIVERSAL,
+       .per_pixel_alpha = true,
+
+       .pixel_format_support = {
+                       .argb8888 = true,
+                       .nv12 = true,
+                       .fp16 = true,
+                       .p010 = true,
+                       .ayuv = false,
+       },
+
+       .max_upscale_factor = {
+                       .argb8888 = 16000,
+                       .nv12 = 16000,
+                       .fp16 = 16000
+       },
+
+       // 6:1 downscaling ratio: 1000/6 = 166.666
+       // 4:1 downscaling ratio for ARGB888 to prevent underflow during P010 playback: 1000/4 = 250
+       .max_downscale_factor = {
+                       .argb8888 = 250,
+                       .nv12 = 167,
+                       .fp16 = 167
+       },
+       64,
+       64
+};
+
+static const struct dc_debug_options debug_defaults_drv = {
+       .disable_z10 = false,
+       .enable_z9_disable_interface = true,
+       .minimum_z8_residency_time = 2000,
+       .psr_skip_crtc_disable = true,
+       .replay_skip_crtc_disabled = true,
+       .disable_dmcu = true,
+       .force_abm_enable = false,
+       .timing_trace = false,
+       .clock_trace = true,
+       .disable_dpp_power_gate = false,
+       .disable_hubp_power_gate = false,
+       .disable_pplib_clock_request = false,
+       .pipe_split_policy = MPC_SPLIT_DYNAMIC,
+       .force_single_disp_pipe_split = false,
+       .disable_dcc = DCC_ENABLE,
+       .vsr_support = true,
+       .performance_trace = false,
+       .max_downscale_src_width = 4096,/*upto true 4k*/
+       .disable_pplib_wm_range = false,
+       .scl_reset_length10 = true,
+       .sanity_checks = true,
+       .underflow_assert_delay_us = 0xFFFFFFFF,
+       .dwb_fi_phase = -1, // -1 = disable,
+       .dmub_command_table = true,
+       .pstate_enabled = true,
+       .use_max_lb = true,
+       .enable_mem_low_power = {
+               .bits = {
+                       .vga = true,
+                       .i2c = true,
+                       .dmcu = false, // This is previously known to cause hang on S3 cycles if enabled
+                       .dscl = true,
+                       .cm = true,
+                       .mpc = true,
+                       .optc = true,
+                       .vpg = true,
+                       .afmt = true,
+               }
+       },
+
+       .root_clock_optimization = {
+                       .bits = {
+                                       .dpp = true,
+                                       .dsc = true,
+                                       .hdmistream = true,
+                                       .hdmichar = true,
+                                       .dpstream = true,
+                                       .symclk32_se = false,
+                                       .symclk32_le = true,
+                                       .symclk_fe = true,
+                                       .physymclk = true,
+                                       .dpiasymclk = true,
+                       }
+       },
+
+       .seamless_boot_odm_combine = true,
+       .using_dml2 = false,
+};
+
+static const struct dc_debug_options debug_defaults_diags = {
+       .disable_dmcu = true,
+       .force_abm_enable = false,
+       .timing_trace = true,
+       .clock_trace = true,
+       .disable_dpp_power_gate = true,
+       .disable_hubp_power_gate = true,
+       .disable_clock_gate = true,
+       .disable_pplib_clock_request = true,
+       .disable_pplib_wm_range = true,
+       .disable_stutter = false,
+       .scl_reset_length10 = true,
+       .dwb_fi_phase = -1, // -1 = disable
+       .dmub_command_table = true,
+       .enable_tri_buf = true,
+       .use_max_lb = true
+};
+
+static const struct dc_panel_config panel_config_defaults = {
+       .psr = {
+               .disable_psr = false,
+               .disallow_psrsu = false,
+               .disallow_replay = false,
+       },
+       .ilr = {
+               .optimize_edp_link_rate = true,
+       },
+};
+
+static void dcn31_dpp_destroy(struct dpp **dpp)
+{
+       kfree(TO_DCN20_DPP(*dpp));
+       *dpp = NULL;
+}
+
+static struct dpp *dcn31_dpp_create(
+       struct dc_context *ctx,
+       uint32_t inst)
+{
+       struct dcn3_dpp *dpp =
+               kzalloc(sizeof(struct dcn3_dpp), GFP_KERNEL);
+
+       if (!dpp)
+               return NULL;
+
+       if (dpp3_construct(dpp, ctx, inst,
+                       &dpp_regs[inst], &tf_shift, &tf_mask))
+               return &dpp->base;
+
+       BREAK_TO_DEBUGGER();
+       kfree(dpp);
+       return NULL;
+}
+
+static struct output_pixel_processor *dcn31_opp_create(
+       struct dc_context *ctx, uint32_t inst)
+{
+       struct dcn20_opp *opp =
+               kzalloc(sizeof(struct dcn20_opp), GFP_KERNEL);
+
+       if (!opp) {
+               BREAK_TO_DEBUGGER();
+               return NULL;
+       }
+
+       dcn20_opp_construct(opp, ctx, inst,
+                       &opp_regs[inst], &opp_shift, &opp_mask);
+       return &opp->base;
+}
+
+static struct dce_aux *dcn31_aux_engine_create(
+       struct dc_context *ctx,
+       uint32_t inst)
+{
+       struct aux_engine_dce110 *aux_engine =
+               kzalloc(sizeof(struct aux_engine_dce110), GFP_KERNEL);
+
+       if (!aux_engine)
+               return NULL;
+
+       dce110_aux_engine_construct(aux_engine, ctx, inst,
+                                   SW_AUX_TIMEOUT_PERIOD_MULTIPLIER * AUX_TIMEOUT_PERIOD,
+                                   &aux_engine_regs[inst],
+                                       &aux_mask,
+                                       &aux_shift,
+                                       ctx->dc->caps.extended_aux_timeout_support);
+
+       return &aux_engine->base;
+}
+#define i2c_inst_regs(id) { I2C_HW_ENGINE_COMMON_REG_LIST_DCN30(id) }
+
+static const struct dce_i2c_registers i2c_hw_regs[] = {
+               i2c_inst_regs(1),
+               i2c_inst_regs(2),
+               i2c_inst_regs(3),
+               i2c_inst_regs(4),
+               i2c_inst_regs(5),
+};
+
+static const struct dce_i2c_shift i2c_shifts = {
+               I2C_COMMON_MASK_SH_LIST_DCN30(__SHIFT)
+};
+
+static const struct dce_i2c_mask i2c_masks = {
+               I2C_COMMON_MASK_SH_LIST_DCN30(_MASK)
+};
+
+/* ========================================================== */
+
+/*
+ * DPIA index | Preferred Encoder     |    Host Router
+ *   0        |      C                |       0
+ *   1        |      First Available  |       0
+ *   2        |      D                |       1
+ *   3        |      First Available  |       1
+ */
+/* ========================================================== */
+static const enum engine_id dpia_to_preferred_enc_id_table[] = {
+               ENGINE_ID_DIGC,
+               ENGINE_ID_DIGC,
+               ENGINE_ID_DIGD,
+               ENGINE_ID_DIGD
+};
+
+static enum engine_id dcn314_get_preferred_eng_id_dpia(unsigned int dpia_index)
+{
+       return dpia_to_preferred_enc_id_table[dpia_index];
+}
+
+static struct dce_i2c_hw *dcn31_i2c_hw_create(
+       struct dc_context *ctx,
+       uint32_t inst)
+{
+       struct dce_i2c_hw *dce_i2c_hw =
+               kzalloc(sizeof(struct dce_i2c_hw), GFP_KERNEL);
+
+       if (!dce_i2c_hw)
+               return NULL;
+
+       dcn2_i2c_hw_construct(dce_i2c_hw, ctx, inst,
+                                   &i2c_hw_regs[inst], &i2c_shifts, &i2c_masks);
+
+       return dce_i2c_hw;
+}
+static struct mpc *dcn31_mpc_create(
+               struct dc_context *ctx,
+               int num_mpcc,
+               int num_rmu)
+{
+       struct dcn30_mpc *mpc30 = kzalloc(sizeof(struct dcn30_mpc),
+                                         GFP_KERNEL);
+
+       if (!mpc30)
+               return NULL;
+
+       dcn30_mpc_construct(mpc30, ctx,
+                       &mpc_regs,
+                       &mpc_shift,
+                       &mpc_mask,
+                       num_mpcc,
+                       num_rmu);
+
+       return &mpc30->base;
+}
+
+static struct hubbub *dcn31_hubbub_create(struct dc_context *ctx)
+{
+       int i;
+
+       struct dcn20_hubbub *hubbub3 = kzalloc(sizeof(struct dcn20_hubbub),
+                                         GFP_KERNEL);
+
+       if (!hubbub3)
+               return NULL;
+
+       hubbub31_construct(hubbub3, ctx,
+                       &hubbub_reg,
+                       &hubbub_shift,
+                       &hubbub_mask,
+                       dcn3_14_ip.det_buffer_size_kbytes,
+                       dcn3_14_ip.pixel_chunk_size_kbytes,
+                       dcn3_14_ip.config_return_buffer_size_in_kbytes);
+
+
+       for (i = 0; i < res_cap_dcn314.num_vmid; i++) {
+               struct dcn20_vmid *vmid = &hubbub3->vmid[i];
+
+               vmid->ctx = ctx;
+
+               vmid->regs = &vmid_regs[i];
+               vmid->shifts = &vmid_shifts;
+               vmid->masks = &vmid_masks;
+       }
+
+       return &hubbub3->base;
+}
+
+static struct timing_generator *dcn31_timing_generator_create(
+               struct dc_context *ctx,
+               uint32_t instance)
+{
+       struct optc *tgn10 =
+               kzalloc(sizeof(struct optc), GFP_KERNEL);
+
+       if (!tgn10)
+               return NULL;
+
+       tgn10->base.inst = instance;
+       tgn10->base.ctx = ctx;
+
+       tgn10->tg_regs = &optc_regs[instance];
+       tgn10->tg_shift = &optc_shift;
+       tgn10->tg_mask = &optc_mask;
+
+       dcn314_timing_generator_init(tgn10);
+
+       return &tgn10->base;
+}
+
+static const struct encoder_feature_support link_enc_feature = {
+               .max_hdmi_deep_color = COLOR_DEPTH_121212,
+               .max_hdmi_pixel_clock = 600000,
+               .hdmi_ycbcr420_supported = true,
+               .dp_ycbcr420_supported = true,
+               .fec_supported = true,
+               .flags.bits.IS_HBR2_CAPABLE = true,
+               .flags.bits.IS_HBR3_CAPABLE = true,
+               .flags.bits.IS_TPS3_CAPABLE = true,
+               .flags.bits.IS_TPS4_CAPABLE = true
+};
+
+static struct link_encoder *dcn31_link_encoder_create(
+       struct dc_context *ctx,
+       const struct encoder_init_data *enc_init_data)
+{
+       struct dcn20_link_encoder *enc20 =
+               kzalloc(sizeof(struct dcn20_link_encoder), GFP_KERNEL);
+
+       if (!enc20)
+               return NULL;
+
+       dcn31_link_encoder_construct(enc20,
+                       enc_init_data,
+                       &link_enc_feature,
+                       &link_enc_regs[enc_init_data->transmitter],
+                       &link_enc_aux_regs[enc_init_data->channel - 1],
+                       &link_enc_hpd_regs[enc_init_data->hpd_source],
+                       &le_shift,
+                       &le_mask);
+
+       return &enc20->enc10.base;
+}
+
+/* Create a minimal link encoder object not associated with a particular
+ * physical connector.
+ * resource_funcs.link_enc_create_minimal
+ */
+static struct link_encoder *dcn31_link_enc_create_minimal(
+               struct dc_context *ctx, enum engine_id eng_id)
+{
+       struct dcn20_link_encoder *enc20;
+
+       if ((eng_id - ENGINE_ID_DIGA) > ctx->dc->res_pool->res_cap->num_dig_link_enc)
+               return NULL;
+
+       enc20 = kzalloc(sizeof(struct dcn20_link_encoder), GFP_KERNEL);
+       if (!enc20)
+               return NULL;
+
+       dcn31_link_encoder_construct_minimal(
+                       enc20,
+                       ctx,
+                       &link_enc_feature,
+                       &link_enc_regs[eng_id - ENGINE_ID_DIGA],
+                       eng_id);
+
+       return &enc20->enc10.base;
+}
+
+static struct panel_cntl *dcn31_panel_cntl_create(const struct panel_cntl_init_data *init_data)
+{
+       struct dcn31_panel_cntl *panel_cntl =
+               kzalloc(sizeof(struct dcn31_panel_cntl), GFP_KERNEL);
+
+       if (!panel_cntl)
+               return NULL;
+
+       dcn31_panel_cntl_construct(panel_cntl, init_data);
+
+       return &panel_cntl->base;
+}
+
+static void read_dce_straps(
+       struct dc_context *ctx,
+       struct resource_straps *straps)
+{
+       generic_reg_get(ctx, regDC_PINSTRAPS + BASE(regDC_PINSTRAPS_BASE_IDX),
+               FN(DC_PINSTRAPS, DC_PINSTRAPS_AUDIO), &straps->dc_pinstraps_audio);
+
+}
+
+static struct audio *dcn31_create_audio(
+               struct dc_context *ctx, unsigned int inst)
+{
+       return dce_audio_create(ctx, inst,
+                       &audio_regs[inst], &audio_shift, &audio_mask);
+}
+
+static struct vpg *dcn31_vpg_create(
+       struct dc_context *ctx,
+       uint32_t inst)
+{
+       struct dcn31_vpg *vpg31 = kzalloc(sizeof(struct dcn31_vpg), GFP_KERNEL);
+
+       if (!vpg31)
+               return NULL;
+
+       vpg31_construct(vpg31, ctx, inst,
+                       &vpg_regs[inst],
+                       &vpg_shift,
+                       &vpg_mask);
+
+       return &vpg31->base;
+}
+
+static struct afmt *dcn31_afmt_create(
+       struct dc_context *ctx,
+       uint32_t inst)
+{
+       struct dcn31_afmt *afmt31 = kzalloc(sizeof(struct dcn31_afmt), GFP_KERNEL);
+
+       if (!afmt31)
+               return NULL;
+
+       afmt31_construct(afmt31, ctx, inst,
+                       &afmt_regs[inst],
+                       &afmt_shift,
+                       &afmt_mask);
+
+       // Light sleep by default, no need to power down here
+
+       return &afmt31->base;
+}
+
+static struct apg *dcn31_apg_create(
+       struct dc_context *ctx,
+       uint32_t inst)
+{
+       struct dcn31_apg *apg31 = kzalloc(sizeof(struct dcn31_apg), GFP_KERNEL);
+
+       if (!apg31)
+               return NULL;
+
+       apg31_construct(apg31, ctx, inst,
+                       &apg_regs[inst],
+                       &apg_shift,
+                       &apg_mask);
+
+       return &apg31->base;
+}
+
+static struct stream_encoder *dcn314_stream_encoder_create(
+       enum engine_id eng_id,
+       struct dc_context *ctx)
+{
+       struct dcn10_stream_encoder *enc1;
+       struct vpg *vpg;
+       struct afmt *afmt;
+       int vpg_inst;
+       int afmt_inst;
+
+       /* Mapping of VPG, AFMT, DME register blocks to DIO block instance */
+       if (eng_id < ENGINE_ID_DIGF) {
+               vpg_inst = eng_id;
+               afmt_inst = eng_id;
+       } else
+               return NULL;
+
+       enc1 = kzalloc(sizeof(struct dcn10_stream_encoder), GFP_KERNEL);
+       vpg = dcn31_vpg_create(ctx, vpg_inst);
+       afmt = dcn31_afmt_create(ctx, afmt_inst);
+
+       if (!enc1 || !vpg || !afmt) {
+               kfree(enc1);
+               kfree(vpg);
+               kfree(afmt);
+               return NULL;
+       }
+
+       dcn314_dio_stream_encoder_construct(enc1, ctx, ctx->dc_bios,
+                                       eng_id, vpg, afmt,
+                                       &stream_enc_regs[eng_id],
+                                       &se_shift, &se_mask);
+
+       return &enc1->base;
+}
+
+static struct hpo_dp_stream_encoder *dcn31_hpo_dp_stream_encoder_create(
+       enum engine_id eng_id,
+       struct dc_context *ctx)
+{
+       struct dcn31_hpo_dp_stream_encoder *hpo_dp_enc31;
+       struct vpg *vpg;
+       struct apg *apg;
+       uint32_t hpo_dp_inst;
+       uint32_t vpg_inst;
+       uint32_t apg_inst;
+
+       ASSERT((eng_id >= ENGINE_ID_HPO_DP_0) && (eng_id <= ENGINE_ID_HPO_DP_3));
+       hpo_dp_inst = eng_id - ENGINE_ID_HPO_DP_0;
+
+       /* Mapping of VPG register blocks to HPO DP block instance:
+        * VPG[6] -> HPO_DP[0]
+        * VPG[7] -> HPO_DP[1]
+        * VPG[8] -> HPO_DP[2]
+        * VPG[9] -> HPO_DP[3]
+        */
+       //Uses offset index 5-8, but actually maps to vpg_inst 6-9
+       vpg_inst = hpo_dp_inst + 5;
+
+       /* Mapping of APG register blocks to HPO DP block instance:
+        * APG[0] -> HPO_DP[0]
+        * APG[1] -> HPO_DP[1]
+        * APG[2] -> HPO_DP[2]
+        * APG[3] -> HPO_DP[3]
+        */
+       apg_inst = hpo_dp_inst;
+
+       /* allocate HPO stream encoder and create VPG sub-block */
+       hpo_dp_enc31 = kzalloc(sizeof(struct dcn31_hpo_dp_stream_encoder), GFP_KERNEL);
+       vpg = dcn31_vpg_create(ctx, vpg_inst);
+       apg = dcn31_apg_create(ctx, apg_inst);
+
+       if (!hpo_dp_enc31 || !vpg || !apg) {
+               kfree(hpo_dp_enc31);
+               kfree(vpg);
+               kfree(apg);
+               return NULL;
+       }
+
+       dcn31_hpo_dp_stream_encoder_construct(hpo_dp_enc31, ctx, ctx->dc_bios,
+                                       hpo_dp_inst, eng_id, vpg, apg,
+                                       &hpo_dp_stream_enc_regs[hpo_dp_inst],
+                                       &hpo_dp_se_shift, &hpo_dp_se_mask);
+
+       return &hpo_dp_enc31->base;
+}
+
+static struct hpo_dp_link_encoder *dcn31_hpo_dp_link_encoder_create(
+       uint8_t inst,
+       struct dc_context *ctx)
+{
+       struct dcn31_hpo_dp_link_encoder *hpo_dp_enc31;
+
+       /* allocate HPO link encoder */
+       hpo_dp_enc31 = kzalloc(sizeof(struct dcn31_hpo_dp_link_encoder), GFP_KERNEL);
+
+       hpo_dp_link_encoder31_construct(hpo_dp_enc31, ctx, inst,
+                                       &hpo_dp_link_enc_regs[inst],
+                                       &hpo_dp_le_shift, &hpo_dp_le_mask);
+
+       return &hpo_dp_enc31->base;
+}
+
+static struct dce_hwseq *dcn314_hwseq_create(
+       struct dc_context *ctx)
+{
+       struct dce_hwseq *hws = kzalloc(sizeof(struct dce_hwseq), GFP_KERNEL);
+
+       if (hws) {
+               hws->ctx = ctx;
+               hws->regs = &hwseq_reg;
+               hws->shifts = &hwseq_shift;
+               hws->masks = &hwseq_mask;
+       }
+       return hws;
+}
+static const struct resource_create_funcs res_create_funcs = {
+       .read_dce_straps = read_dce_straps,
+       .create_audio = dcn31_create_audio,
+       .create_stream_encoder = dcn314_stream_encoder_create,
+       .create_hpo_dp_stream_encoder = dcn31_hpo_dp_stream_encoder_create,
+       .create_hpo_dp_link_encoder = dcn31_hpo_dp_link_encoder_create,
+       .create_hwseq = dcn314_hwseq_create,
+};
+
+static void dcn314_resource_destruct(struct dcn314_resource_pool *pool)
+{
+       unsigned int i;
+
+       for (i = 0; i < pool->base.stream_enc_count; i++) {
+               if (pool->base.stream_enc[i] != NULL) {
+                       if (pool->base.stream_enc[i]->vpg != NULL) {
+                               kfree(DCN30_VPG_FROM_VPG(pool->base.stream_enc[i]->vpg));
+                               pool->base.stream_enc[i]->vpg = NULL;
+                       }
+                       if (pool->base.stream_enc[i]->afmt != NULL) {
+                               kfree(DCN30_AFMT_FROM_AFMT(pool->base.stream_enc[i]->afmt));
+                               pool->base.stream_enc[i]->afmt = NULL;
+                       }
+                       kfree(DCN10STRENC_FROM_STRENC(pool->base.stream_enc[i]));
+                       pool->base.stream_enc[i] = NULL;
+               }
+       }
+
+       for (i = 0; i < pool->base.hpo_dp_stream_enc_count; i++) {
+               if (pool->base.hpo_dp_stream_enc[i] != NULL) {
+                       if (pool->base.hpo_dp_stream_enc[i]->vpg != NULL) {
+                               kfree(DCN30_VPG_FROM_VPG(pool->base.hpo_dp_stream_enc[i]->vpg));
+                               pool->base.hpo_dp_stream_enc[i]->vpg = NULL;
+                       }
+                       if (pool->base.hpo_dp_stream_enc[i]->apg != NULL) {
+                               kfree(DCN31_APG_FROM_APG(pool->base.hpo_dp_stream_enc[i]->apg));
+                               pool->base.hpo_dp_stream_enc[i]->apg = NULL;
+                       }
+                       kfree(DCN3_1_HPO_DP_STREAM_ENC_FROM_HPO_STREAM_ENC(pool->base.hpo_dp_stream_enc[i]));
+                       pool->base.hpo_dp_stream_enc[i] = NULL;
+               }
+       }
+
+       for (i = 0; i < pool->base.hpo_dp_link_enc_count; i++) {
+               if (pool->base.hpo_dp_link_enc[i] != NULL) {
+                       kfree(DCN3_1_HPO_DP_LINK_ENC_FROM_HPO_LINK_ENC(pool->base.hpo_dp_link_enc[i]));
+                       pool->base.hpo_dp_link_enc[i] = NULL;
+               }
+       }
+
+       for (i = 0; i < pool->base.res_cap->num_dsc; i++) {
+               if (pool->base.dscs[i] != NULL)
+                       dcn20_dsc_destroy(&pool->base.dscs[i]);
+       }
+
+       if (pool->base.mpc != NULL) {
+               kfree(TO_DCN20_MPC(pool->base.mpc));
+               pool->base.mpc = NULL;
+       }
+       if (pool->base.hubbub != NULL) {
+               kfree(pool->base.hubbub);
+               pool->base.hubbub = NULL;
+       }
+       for (i = 0; i < pool->base.pipe_count; i++) {
+               if (pool->base.dpps[i] != NULL)
+                       dcn31_dpp_destroy(&pool->base.dpps[i]);
+
+               if (pool->base.ipps[i] != NULL)
+                       pool->base.ipps[i]->funcs->ipp_destroy(&pool->base.ipps[i]);
+
+               if (pool->base.hubps[i] != NULL) {
+                       kfree(TO_DCN20_HUBP(pool->base.hubps[i]));
+                       pool->base.hubps[i] = NULL;
+               }
+
+               if (pool->base.irqs != NULL)
+                       dal_irq_service_destroy(&pool->base.irqs);
+       }
+
+       for (i = 0; i < pool->base.res_cap->num_ddc; i++) {
+               if (pool->base.engines[i] != NULL)
+                       dce110_engine_destroy(&pool->base.engines[i]);
+               if (pool->base.hw_i2cs[i] != NULL) {
+                       kfree(pool->base.hw_i2cs[i]);
+                       pool->base.hw_i2cs[i] = NULL;
+               }
+               if (pool->base.sw_i2cs[i] != NULL) {
+                       kfree(pool->base.sw_i2cs[i]);
+                       pool->base.sw_i2cs[i] = NULL;
+               }
+       }
+
+       for (i = 0; i < pool->base.res_cap->num_opp; i++) {
+               if (pool->base.opps[i] != NULL)
+                       pool->base.opps[i]->funcs->opp_destroy(&pool->base.opps[i]);
+       }
+
+       for (i = 0; i < pool->base.res_cap->num_timing_generator; i++) {
+               if (pool->base.timing_generators[i] != NULL)    {
+                       kfree(DCN10TG_FROM_TG(pool->base.timing_generators[i]));
+                       pool->base.timing_generators[i] = NULL;
+               }
+       }
+
+       for (i = 0; i < pool->base.res_cap->num_dwb; i++) {
+               if (pool->base.dwbc[i] != NULL) {
+                       kfree(TO_DCN30_DWBC(pool->base.dwbc[i]));
+                       pool->base.dwbc[i] = NULL;
+               }
+               if (pool->base.mcif_wb[i] != NULL) {
+                       kfree(TO_DCN30_MMHUBBUB(pool->base.mcif_wb[i]));
+                       pool->base.mcif_wb[i] = NULL;
+               }
+       }
+
+       for (i = 0; i < pool->base.audio_count; i++) {
+               if (pool->base.audios[i])
+                       dce_aud_destroy(&pool->base.audios[i]);
+       }
+
+       for (i = 0; i < pool->base.clk_src_count; i++) {
+               if (pool->base.clock_sources[i] != NULL) {
+                       dcn20_clock_source_destroy(&pool->base.clock_sources[i]);
+                       pool->base.clock_sources[i] = NULL;
+               }
+       }
+
+       for (i = 0; i < pool->base.res_cap->num_mpc_3dlut; i++) {
+               if (pool->base.mpc_lut[i] != NULL) {
+                       dc_3dlut_func_release(pool->base.mpc_lut[i]);
+                       pool->base.mpc_lut[i] = NULL;
+               }
+               if (pool->base.mpc_shaper[i] != NULL) {
+                       dc_transfer_func_release(pool->base.mpc_shaper[i]);
+                       pool->base.mpc_shaper[i] = NULL;
+               }
+       }
+
+       if (pool->base.dp_clock_source != NULL) {
+               dcn20_clock_source_destroy(&pool->base.dp_clock_source);
+               pool->base.dp_clock_source = NULL;
+       }
+
+       for (i = 0; i < pool->base.res_cap->num_timing_generator; i++) {
+               if (pool->base.multiple_abms[i] != NULL)
+                       dce_abm_destroy(&pool->base.multiple_abms[i]);
+       }
+
+       if (pool->base.psr != NULL)
+               dmub_psr_destroy(&pool->base.psr);
+
+       if (pool->base.replay != NULL)
+               dmub_replay_destroy(&pool->base.replay);
+
+       if (pool->base.dccg != NULL)
+               dcn_dccg_destroy(&pool->base.dccg);
+}
+
+static struct hubp *dcn31_hubp_create(
+       struct dc_context *ctx,
+       uint32_t inst)
+{
+       struct dcn20_hubp *hubp2 =
+               kzalloc(sizeof(struct dcn20_hubp), GFP_KERNEL);
+
+       if (!hubp2)
+               return NULL;
+
+       if (hubp31_construct(hubp2, ctx, inst,
+                       &hubp_regs[inst], &hubp_shift, &hubp_mask))
+               return &hubp2->base;
+
+       BREAK_TO_DEBUGGER();
+       kfree(hubp2);
+       return NULL;
+}
+
+static bool dcn31_dwbc_create(struct dc_context *ctx, struct resource_pool *pool)
+{
+       int i;
+       uint32_t pipe_count = pool->res_cap->num_dwb;
+
+       for (i = 0; i < pipe_count; i++) {
+               struct dcn30_dwbc *dwbc30 = kzalloc(sizeof(struct dcn30_dwbc),
+                                                   GFP_KERNEL);
+
+               if (!dwbc30) {
+                       dm_error("DC: failed to create dwbc30!\n");
+                       return false;
+               }
+
+               dcn30_dwbc_construct(dwbc30, ctx,
+                               &dwbc30_regs[i],
+                               &dwbc30_shift,
+                               &dwbc30_mask,
+                               i);
+
+               pool->dwbc[i] = &dwbc30->base;
+       }
+       return true;
+}
+
+static bool dcn31_mmhubbub_create(struct dc_context *ctx, struct resource_pool *pool)
+{
+       int i;
+       uint32_t pipe_count = pool->res_cap->num_dwb;
+
+       for (i = 0; i < pipe_count; i++) {
+               struct dcn30_mmhubbub *mcif_wb30 = kzalloc(sizeof(struct dcn30_mmhubbub),
+                                                   GFP_KERNEL);
+
+               if (!mcif_wb30) {
+                       dm_error("DC: failed to create mcif_wb30!\n");
+                       return false;
+               }
+
+               dcn30_mmhubbub_construct(mcif_wb30, ctx,
+                               &mcif_wb30_regs[i],
+                               &mcif_wb30_shift,
+                               &mcif_wb30_mask,
+                               i);
+
+               pool->mcif_wb[i] = &mcif_wb30->base;
+       }
+       return true;
+}
+
+static struct display_stream_compressor *dcn314_dsc_create(
+       struct dc_context *ctx, uint32_t inst)
+{
+       struct dcn20_dsc *dsc =
+               kzalloc(sizeof(struct dcn20_dsc), GFP_KERNEL);
+
+       if (!dsc) {
+               BREAK_TO_DEBUGGER();
+               return NULL;
+       }
+
+       dsc2_construct(dsc, ctx, inst, &dsc_regs[inst], &dsc_shift, &dsc_mask);
+       return &dsc->base;
+}
+
+static void dcn314_destroy_resource_pool(struct resource_pool **pool)
+{
+       struct dcn314_resource_pool *dcn314_pool = TO_DCN314_RES_POOL(*pool);
+
+       dcn314_resource_destruct(dcn314_pool);
+       kfree(dcn314_pool);
+       *pool = NULL;
+}
+
+static struct clock_source *dcn31_clock_source_create(
+               struct dc_context *ctx,
+               struct dc_bios *bios,
+               enum clock_source_id id,
+               const struct dce110_clk_src_regs *regs,
+               bool dp_clk_src)
+{
+       struct dce110_clk_src *clk_src =
+               kzalloc(sizeof(struct dce110_clk_src), GFP_KERNEL);
+
+       if (!clk_src)
+               return NULL;
+
+       if (dcn31_clk_src_construct(clk_src, ctx, bios, id,
+                       regs, &cs_shift, &cs_mask)) {
+               clk_src->base.dp_clk_src = dp_clk_src;
+               return &clk_src->base;
+       }
+
+       BREAK_TO_DEBUGGER();
+       kfree(clk_src);
+       return NULL;
+}
+
+static int dcn314_populate_dml_pipes_from_context(
+       struct dc *dc, struct dc_state *context,
+       display_e2e_pipe_params_st *pipes,
+       bool fast_validate)
+{
+       int pipe_cnt;
+
+       DC_FP_START();
+       pipe_cnt = dcn314_populate_dml_pipes_from_context_fpu(dc, context, pipes, fast_validate);
+       DC_FP_END();
+
+       return pipe_cnt;
+}
+
+static struct dc_cap_funcs cap_funcs = {
+       .get_dcc_compression_cap = dcn20_get_dcc_compression_cap
+};
+
+static void dcn314_update_bw_bounding_box(struct dc *dc, struct clk_bw_params *bw_params)
+{
+       DC_FP_START();
+       dcn314_update_bw_bounding_box_fpu(dc, bw_params);
+       DC_FP_END();
+}
+
+static void dcn314_get_panel_config_defaults(struct dc_panel_config *panel_config)
+{
+       *panel_config = panel_config_defaults;
+}
+
+static bool filter_modes_for_single_channel_workaround(struct dc *dc,
+               struct dc_state *context)
+{
+       // Filter 2K@240Hz+8K@24fps above combination timing if memory only has single dimm LPDDR
+       if (dc->clk_mgr->bw_params->vram_type == 34 &&
+           dc->clk_mgr->bw_params->num_channels < 2 &&
+           context->stream_count > 1) {
+               int total_phy_pix_clk = 0;
+
+               for (int i = 0; i < context->stream_count; i++)
+                       if (context->res_ctx.pipe_ctx[i].stream)
+                               total_phy_pix_clk += context->res_ctx.pipe_ctx[i].stream->phy_pix_clk;
+
+               if (total_phy_pix_clk >= (1148928+826260)) //2K@240Hz+8K@24fps
+                       return true;
+       }
+       return false;
+}
+
+bool dcn314_validate_bandwidth(struct dc *dc,
+               struct dc_state *context,
+               bool fast_validate)
+{
+       bool out = false;
+
+       BW_VAL_TRACE_SETUP();
+
+       int vlevel = 0;
+       int pipe_cnt = 0;
+       display_e2e_pipe_params_st *pipes = kzalloc(dc->res_pool->pipe_count * sizeof(display_e2e_pipe_params_st), GFP_KERNEL);
+       DC_LOGGER_INIT(dc->ctx->logger);
+
+       BW_VAL_TRACE_COUNT();
+
+       if (filter_modes_for_single_channel_workaround(dc, context))
+               goto validate_fail;
+
+       DC_FP_START();
+       // do not support self refresh only
+       out = dcn30_internal_validate_bw(dc, context, pipes, &pipe_cnt, &vlevel, fast_validate, false);
+       DC_FP_END();
+
+       // Disable fast_validate to set min dcfclk in calculate_wm_and_dlg
+       if (pipe_cnt == 0)
+               fast_validate = false;
+
+       if (!out)
+               goto validate_fail;
+
+       BW_VAL_TRACE_END_VOLTAGE_LEVEL();
+
+       if (fast_validate) {
+               BW_VAL_TRACE_SKIP(fast);
+               goto validate_out;
+       }
+       if (dc->res_pool->funcs->calculate_wm_and_dlg)
+               dc->res_pool->funcs->calculate_wm_and_dlg(dc, context, pipes, pipe_cnt, vlevel);
+
+       BW_VAL_TRACE_END_WATERMARKS();
+
+       goto validate_out;
+
+validate_fail:
+       DC_LOG_WARNING("Mode Validation Warning: %s failed validation.\n",
+               dml_get_status_message(context->bw_ctx.dml.vba.ValidationStatus[context->bw_ctx.dml.vba.soc.num_states]));
+
+       BW_VAL_TRACE_SKIP(fail);
+       out = false;
+
+validate_out:
+       kfree(pipes);
+
+       BW_VAL_TRACE_FINISH();
+
+       return out;
+}
+
+static struct resource_funcs dcn314_res_pool_funcs = {
+       .destroy = dcn314_destroy_resource_pool,
+       .link_enc_create = dcn31_link_encoder_create,
+       .link_enc_create_minimal = dcn31_link_enc_create_minimal,
+       .link_encs_assign = link_enc_cfg_link_encs_assign,
+       .link_enc_unassign = link_enc_cfg_link_enc_unassign,
+       .panel_cntl_create = dcn31_panel_cntl_create,
+       .validate_bandwidth = dcn314_validate_bandwidth,
+       .calculate_wm_and_dlg = dcn31_calculate_wm_and_dlg,
+       .update_soc_for_wm_a = dcn31_update_soc_for_wm_a,
+       .populate_dml_pipes = dcn314_populate_dml_pipes_from_context,
+       .acquire_free_pipe_as_secondary_dpp_pipe = dcn20_acquire_free_pipe_for_layer,
+       .release_pipe = dcn20_release_pipe,
+       .add_stream_to_ctx = dcn30_add_stream_to_ctx,
+       .add_dsc_to_stream_resource = dcn20_add_dsc_to_stream_resource,
+       .remove_stream_from_ctx = dcn20_remove_stream_from_ctx,
+       .populate_dml_writeback_from_context = dcn30_populate_dml_writeback_from_context,
+       .set_mcif_arb_params = dcn30_set_mcif_arb_params,
+       .find_first_free_match_stream_enc_for_link = dcn10_find_first_free_match_stream_enc_for_link,
+       .acquire_post_bldn_3dlut = dcn30_acquire_post_bldn_3dlut,
+       .release_post_bldn_3dlut = dcn30_release_post_bldn_3dlut,
+       .update_bw_bounding_box = dcn314_update_bw_bounding_box,
+       .patch_unknown_plane_state = dcn20_patch_unknown_plane_state,
+       .get_panel_config_defaults = dcn314_get_panel_config_defaults,
+       .get_preferred_eng_id_dpia = dcn314_get_preferred_eng_id_dpia,
+};
+
+static struct clock_source *dcn30_clock_source_create(
+               struct dc_context *ctx,
+               struct dc_bios *bios,
+               enum clock_source_id id,
+               const struct dce110_clk_src_regs *regs,
+               bool dp_clk_src)
+{
+       struct dce110_clk_src *clk_src =
+               kzalloc(sizeof(struct dce110_clk_src), GFP_KERNEL);
+
+       if (!clk_src)
+               return NULL;
+
+       if (dcn31_clk_src_construct(clk_src, ctx, bios, id,
+                       regs, &cs_shift, &cs_mask)) {
+               clk_src->base.dp_clk_src = dp_clk_src;
+               return &clk_src->base;
+       }
+
+       BREAK_TO_DEBUGGER();
+       kfree(clk_src);
+       return NULL;
+}
+
+static bool dcn314_resource_construct(
+       uint8_t num_virtual_links,
+       struct dc *dc,
+       struct dcn314_resource_pool *pool)
+{
+       int i;
+       struct dc_context *ctx = dc->ctx;
+       struct irq_service_init_data init_data;
+
+       ctx->dc_bios->regs = &bios_regs;
+
+       pool->base.res_cap = &res_cap_dcn314;
+       pool->base.funcs = &dcn314_res_pool_funcs;
+
+       /*************************************************
+        *  Resource + asic cap harcoding                *
+        *************************************************/
+       pool->base.underlay_pipe_index = NO_UNDERLAY_PIPE;
+       pool->base.pipe_count = pool->base.res_cap->num_timing_generator;
+       pool->base.mpcc_count = pool->base.res_cap->num_timing_generator;
+       dc->caps.max_downscale_ratio = 400;
+       dc->caps.i2c_speed_in_khz = 100;
+       dc->caps.i2c_speed_in_khz_hdcp = 100;
+       dc->caps.max_cursor_size = 256;
+       dc->caps.min_horizontal_blanking_period = 80;
+       dc->caps.dmdata_alloc_size = 2048;
+       dc->caps.max_slave_planes = 2;
+       dc->caps.max_slave_yuv_planes = 2;
+       dc->caps.max_slave_rgb_planes = 2;
+       dc->caps.post_blend_color_processing = true;
+       dc->caps.force_dp_tps4_for_cp2520 = true;
+       if (dc->config.forceHBR2CP2520)
+               dc->caps.force_dp_tps4_for_cp2520 = false;
+       dc->caps.dp_hpo = true;
+       dc->caps.dp_hdmi21_pcon_support = true;
+       dc->caps.edp_dsc_support = true;
+       dc->caps.extended_aux_timeout_support = true;
+       dc->caps.dmcub_support = true;
+       dc->caps.is_apu = true;
+       dc->caps.seamless_odm = true;
+
+       dc->caps.zstate_support = true;
+
+       /* Color pipeline capabilities */
+       dc->caps.color.dpp.dcn_arch = 1;
+       dc->caps.color.dpp.input_lut_shared = 0;
+       dc->caps.color.dpp.icsc = 1;
+       dc->caps.color.dpp.dgam_ram = 0; // must use gamma_corr
+       dc->caps.color.dpp.dgam_rom_caps.srgb = 1;
+       dc->caps.color.dpp.dgam_rom_caps.bt2020 = 1;
+       dc->caps.color.dpp.dgam_rom_caps.gamma2_2 = 1;
+       dc->caps.color.dpp.dgam_rom_caps.pq = 1;
+       dc->caps.color.dpp.dgam_rom_caps.hlg = 1;
+       dc->caps.color.dpp.post_csc = 1;
+       dc->caps.color.dpp.gamma_corr = 1;
+       dc->caps.color.dpp.dgam_rom_for_yuv = 0;
+
+       dc->caps.color.dpp.hw_3d_lut = 1;
+       dc->caps.color.dpp.ogam_ram = 1;
+       // no OGAM ROM on DCN301
+       dc->caps.color.dpp.ogam_rom_caps.srgb = 0;
+       dc->caps.color.dpp.ogam_rom_caps.bt2020 = 0;
+       dc->caps.color.dpp.ogam_rom_caps.gamma2_2 = 0;
+       dc->caps.color.dpp.ogam_rom_caps.pq = 0;
+       dc->caps.color.dpp.ogam_rom_caps.hlg = 0;
+       dc->caps.color.dpp.ocsc = 0;
+
+       dc->caps.color.mpc.gamut_remap = 1;
+       dc->caps.color.mpc.num_3dluts = pool->base.res_cap->num_mpc_3dlut; //2
+       dc->caps.color.mpc.ogam_ram = 1;
+       dc->caps.color.mpc.ogam_rom_caps.srgb = 0;
+       dc->caps.color.mpc.ogam_rom_caps.bt2020 = 0;
+       dc->caps.color.mpc.ogam_rom_caps.gamma2_2 = 0;
+       dc->caps.color.mpc.ogam_rom_caps.pq = 0;
+       dc->caps.color.mpc.ogam_rom_caps.hlg = 0;
+       dc->caps.color.mpc.ocsc = 1;
+
+       dc->caps.max_disp_clock_khz_at_vmin = 650000;
+
+       /* Use pipe context based otg sync logic */
+       dc->config.use_pipe_ctx_sync_logic = true;
+
+       /* read VBIOS LTTPR caps */
+       {
+               if (ctx->dc_bios->funcs->get_lttpr_caps) {
+                       enum bp_result bp_query_result;
+                       uint8_t is_vbios_lttpr_enable = 0;
+
+                       bp_query_result = ctx->dc_bios->funcs->get_lttpr_caps(ctx->dc_bios, &is_vbios_lttpr_enable);
+                       dc->caps.vbios_lttpr_enable = (bp_query_result == BP_RESULT_OK) && !!is_vbios_lttpr_enable;
+               }
+
+               /* interop bit is implicit */
+               {
+                       dc->caps.vbios_lttpr_aware = true;
+               }
+       }
+
+       if (dc->ctx->dce_environment == DCE_ENV_PRODUCTION_DRV)
+               dc->debug = debug_defaults_drv;
+       else
+               dc->debug = debug_defaults_diags;
+
+       /* Disable pipe power gating */
+       dc->debug.disable_dpp_power_gate = true;
+       dc->debug.disable_hubp_power_gate = true;
+
+       /* Disable root clock optimization */
+       dc->debug.root_clock_optimization.u32All = 0;
+
+       // Init the vm_helper
+       if (dc->vm_helper)
+               vm_helper_init(dc->vm_helper, 16);
+
+       /*************************************************
+        *  Create resources                             *
+        *************************************************/
+
+       /* Clock Sources for Pixel Clock*/
+       pool->base.clock_sources[DCN31_CLK_SRC_PLL0] =
+                       dcn30_clock_source_create(ctx, ctx->dc_bios,
+                               CLOCK_SOURCE_COMBO_PHY_PLL0,
+                               &clk_src_regs[0], false);
+       pool->base.clock_sources[DCN31_CLK_SRC_PLL1] =
+                       dcn30_clock_source_create(ctx, ctx->dc_bios,
+                               CLOCK_SOURCE_COMBO_PHY_PLL1,
+                               &clk_src_regs[1], false);
+       pool->base.clock_sources[DCN31_CLK_SRC_PLL2] =
+                       dcn30_clock_source_create(ctx, ctx->dc_bios,
+                               CLOCK_SOURCE_COMBO_PHY_PLL2,
+                               &clk_src_regs[2], false);
+       pool->base.clock_sources[DCN31_CLK_SRC_PLL3] =
+                       dcn30_clock_source_create(ctx, ctx->dc_bios,
+                               CLOCK_SOURCE_COMBO_PHY_PLL3,
+                               &clk_src_regs[3], false);
+       pool->base.clock_sources[DCN31_CLK_SRC_PLL4] =
+                       dcn30_clock_source_create(ctx, ctx->dc_bios,
+                               CLOCK_SOURCE_COMBO_PHY_PLL4,
+                               &clk_src_regs[4], false);
+
+       pool->base.clk_src_count = DCN30_CLK_SRC_TOTAL;
+
+       /* todo: not reuse phy_pll registers */
+       pool->base.dp_clock_source =
+                       dcn31_clock_source_create(ctx, ctx->dc_bios,
+                               CLOCK_SOURCE_ID_DP_DTO,
+                               &clk_src_regs[0], true);
+
+       for (i = 0; i < pool->base.clk_src_count; i++) {
+               if (pool->base.clock_sources[i] == NULL) {
+                       dm_error("DC: failed to create clock sources!\n");
+                       BREAK_TO_DEBUGGER();
+                       goto create_fail;
+               }
+       }
+
+       pool->base.dccg = dccg314_create(ctx, &dccg_regs, &dccg_shift, &dccg_mask);
+       if (pool->base.dccg == NULL) {
+               dm_error("DC: failed to create dccg!\n");
+               BREAK_TO_DEBUGGER();
+               goto create_fail;
+       }
+
+       init_data.ctx = dc->ctx;
+       pool->base.irqs = dal_irq_service_dcn314_create(&init_data);
+       if (!pool->base.irqs)
+               goto create_fail;
+
+       /* HUBBUB */
+       pool->base.hubbub = dcn31_hubbub_create(ctx);
+       if (pool->base.hubbub == NULL) {
+               BREAK_TO_DEBUGGER();
+               dm_error("DC: failed to create hubbub!\n");
+               goto create_fail;
+       }
+
+       /* HUBPs, DPPs, OPPs and TGs */
+       for (i = 0; i < pool->base.pipe_count; i++) {
+               pool->base.hubps[i] = dcn31_hubp_create(ctx, i);
+               if (pool->base.hubps[i] == NULL) {
+                       BREAK_TO_DEBUGGER();
+                       dm_error(
+                               "DC: failed to create hubps!\n");
+                       goto create_fail;
+               }
+
+               pool->base.dpps[i] = dcn31_dpp_create(ctx, i);
+               if (pool->base.dpps[i] == NULL) {
+                       BREAK_TO_DEBUGGER();
+                       dm_error(
+                               "DC: failed to create dpps!\n");
+                       goto create_fail;
+               }
+       }
+
+       for (i = 0; i < pool->base.res_cap->num_opp; i++) {
+               pool->base.opps[i] = dcn31_opp_create(ctx, i);
+               if (pool->base.opps[i] == NULL) {
+                       BREAK_TO_DEBUGGER();
+                       dm_error(
+                               "DC: failed to create output pixel processor!\n");
+                       goto create_fail;
+               }
+       }
+
+       for (i = 0; i < pool->base.res_cap->num_timing_generator; i++) {
+               pool->base.timing_generators[i] = dcn31_timing_generator_create(
+                               ctx, i);
+               if (pool->base.timing_generators[i] == NULL) {
+                       BREAK_TO_DEBUGGER();
+                       dm_error("DC: failed to create tg!\n");
+                       goto create_fail;
+               }
+       }
+       pool->base.timing_generator_count = i;
+
+       /* PSR */
+       pool->base.psr = dmub_psr_create(ctx);
+       if (pool->base.psr == NULL) {
+               dm_error("DC: failed to create psr obj!\n");
+               BREAK_TO_DEBUGGER();
+               goto create_fail;
+       }
+
+       /* Replay */
+       pool->base.replay = dmub_replay_create(ctx);
+       if (pool->base.replay == NULL) {
+               dm_error("DC: failed to create replay obj!\n");
+               BREAK_TO_DEBUGGER();
+               goto create_fail;
+       }
+
+       /* ABM */
+       for (i = 0; i < pool->base.res_cap->num_timing_generator; i++) {
+               pool->base.multiple_abms[i] = dmub_abm_create(ctx,
+                               &abm_regs[i],
+                               &abm_shift,
+                               &abm_mask);
+               if (pool->base.multiple_abms[i] == NULL) {
+                       dm_error("DC: failed to create abm for pipe %d!\n", i);
+                       BREAK_TO_DEBUGGER();
+                       goto create_fail;
+               }
+       }
+
+       /* MPC and DSC */
+       pool->base.mpc = dcn31_mpc_create(ctx, pool->base.mpcc_count, pool->base.res_cap->num_mpc_3dlut);
+       if (pool->base.mpc == NULL) {
+               BREAK_TO_DEBUGGER();
+               dm_error("DC: failed to create mpc!\n");
+               goto create_fail;
+       }
+
+       for (i = 0; i < pool->base.res_cap->num_dsc; i++) {
+               pool->base.dscs[i] = dcn314_dsc_create(ctx, i);
+               if (pool->base.dscs[i] == NULL) {
+                       BREAK_TO_DEBUGGER();
+                       dm_error("DC: failed to create display stream compressor %d!\n", i);
+                       goto create_fail;
+               }
+       }
+
+       /* DWB and MMHUBBUB */
+       if (!dcn31_dwbc_create(ctx, &pool->base)) {
+               BREAK_TO_DEBUGGER();
+               dm_error("DC: failed to create dwbc!\n");
+               goto create_fail;
+       }
+
+       if (!dcn31_mmhubbub_create(ctx, &pool->base)) {
+               BREAK_TO_DEBUGGER();
+               dm_error("DC: failed to create mcif_wb!\n");
+               goto create_fail;
+       }
+
+       /* AUX and I2C */
+       for (i = 0; i < pool->base.res_cap->num_ddc; i++) {
+               pool->base.engines[i] = dcn31_aux_engine_create(ctx, i);
+               if (pool->base.engines[i] == NULL) {
+                       BREAK_TO_DEBUGGER();
+                       dm_error(
+                               "DC:failed to create aux engine!!\n");
+                       goto create_fail;
+               }
+               pool->base.hw_i2cs[i] = dcn31_i2c_hw_create(ctx, i);
+               if (pool->base.hw_i2cs[i] == NULL) {
+                       BREAK_TO_DEBUGGER();
+                       dm_error(
+                               "DC:failed to create hw i2c!!\n");
+                       goto create_fail;
+               }
+               pool->base.sw_i2cs[i] = NULL;
+       }
+
+       /* DCN314 has 4 DPIA */
+       pool->base.usb4_dpia_count = 4;
+
+       /* Audio, Stream Encoders including HPO and virtual, MPC 3D LUTs */
+       if (!resource_construct(num_virtual_links, dc, &pool->base,
+                       &res_create_funcs))
+               goto create_fail;
+
+       /* HW Sequencer and Plane caps */
+       dcn314_hw_sequencer_construct(dc);
+
+       dc->caps.max_planes =  pool->base.pipe_count;
+
+       for (i = 0; i < dc->caps.max_planes; ++i)
+               dc->caps.planes[i] = plane_cap;
+
+       dc->cap_funcs = cap_funcs;
+
+       dc->dcn_ip->max_num_dpp = dcn3_14_ip.max_num_dpp;
+
+       return true;
+
+create_fail:
+
+       dcn314_resource_destruct(pool);
+
+       return false;
+}
+
+struct resource_pool *dcn314_create_resource_pool(
+               const struct dc_init_data *init_data,
+               struct dc *dc)
+{
+       struct dcn314_resource_pool *pool =
+               kzalloc(sizeof(struct dcn314_resource_pool), GFP_KERNEL);
+
+       if (!pool)
+               return NULL;
+
+       if (dcn314_resource_construct(init_data->num_virtual_links, dc, pool))
+               return &pool->base;
+
+       BREAK_TO_DEBUGGER();
+       kfree(pool);
+       return NULL;
+}
diff --git a/drivers/gpu/drm/amd/display/dc/resource/dcn314/dcn314_resource.h b/drivers/gpu/drm/amd/display/dc/resource/dcn314/dcn314_resource.h
new file mode 100644 (file)
index 0000000..49ffe71
--- /dev/null
@@ -0,0 +1,50 @@
+/* SPDX-License-Identifier: MIT */
+/*
+ * 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 _DCN314_RESOURCE_H_
+#define _DCN314_RESOURCE_H_
+
+#include "core_types.h"
+
+extern struct _vcs_dpi_ip_params_st dcn3_14_ip;
+extern struct _vcs_dpi_soc_bounding_box_st dcn3_14_soc;
+
+#define TO_DCN314_RES_POOL(pool)\
+       container_of(pool, struct dcn314_resource_pool, base)
+
+struct dcn314_resource_pool {
+       struct resource_pool base;
+};
+
+bool dcn314_validate_bandwidth(struct dc *dc,
+               struct dc_state *context,
+               bool fast_validate);
+
+struct resource_pool *dcn314_create_resource_pool(
+               const struct dc_init_data *init_data,
+               struct dc *dc);
+
+#endif /* _DCN314_RESOURCE_H_ */
diff --git a/drivers/gpu/drm/amd/display/dc/resource/dcn315/dcn315_resource.c b/drivers/gpu/drm/amd/display/dc/resource/dcn315/dcn315_resource.c
new file mode 100644 (file)
index 0000000..cb8024e
--- /dev/null
@@ -0,0 +1,2151 @@
+/*
+ * 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 "dm_services.h"
+#include "dc.h"
+
+#include "dcn31/dcn31_init.h"
+
+#include "resource.h"
+#include "include/irq_service_interface.h"
+#include "dcn315_resource.h"
+
+#include "dcn20/dcn20_resource.h"
+#include "dcn30/dcn30_resource.h"
+#include "dcn31/dcn31_resource.h"
+
+#include "dcn10/dcn10_ipp.h"
+#include "dcn30/dcn30_hubbub.h"
+#include "dcn31/dcn31_hubbub.h"
+#include "dcn30/dcn30_mpc.h"
+#include "dcn31/dcn31_hubp.h"
+#include "irq/dcn315/irq_service_dcn315.h"
+#include "dcn30/dcn30_dpp.h"
+#include "dcn31/dcn31_optc.h"
+#include "dcn20/dcn20_hwseq.h"
+#include "dcn30/dcn30_hwseq.h"
+#include "dce110/dce110_hwseq.h"
+#include "dcn30/dcn30_opp.h"
+#include "dcn20/dcn20_dsc.h"
+#include "dcn30/dcn30_vpg.h"
+#include "dcn30/dcn30_afmt.h"
+#include "dcn30/dcn30_dio_stream_encoder.h"
+#include "dcn31/dcn31_hpo_dp_stream_encoder.h"
+#include "dcn31/dcn31_hpo_dp_link_encoder.h"
+#include "dcn31/dcn31_apg.h"
+#include "dcn31/dcn31_dio_link_encoder.h"
+#include "dcn31/dcn31_vpg.h"
+#include "dcn31/dcn31_afmt.h"
+#include "dce/dce_clock_source.h"
+#include "dce/dce_audio.h"
+#include "dce/dce_hwseq.h"
+#include "clk_mgr.h"
+#include "virtual/virtual_stream_encoder.h"
+#include "dce110/dce110_resource.h"
+#include "dml/display_mode_vba.h"
+#include "dml/dcn31/dcn31_fpu.h"
+#include "dcn31/dcn31_dccg.h"
+#include "dcn10/dcn10_resource.h"
+#include "dcn31/dcn31_panel_cntl.h"
+
+#include "dcn30/dcn30_dwb.h"
+#include "dcn30/dcn30_mmhubbub.h"
+
+#include "dcn/dcn_3_1_5_offset.h"
+#include "dcn/dcn_3_1_5_sh_mask.h"
+#include "dpcs/dpcs_4_2_2_offset.h"
+#include "dpcs/dpcs_4_2_2_sh_mask.h"
+
+#define NBIO_BASE__INST0_SEG0                      0x00000000
+#define NBIO_BASE__INST0_SEG1                      0x00000014
+#define NBIO_BASE__INST0_SEG2                      0x00000D20
+#define NBIO_BASE__INST0_SEG3                      0x00010400
+#define NBIO_BASE__INST0_SEG4                      0x0241B000
+#define NBIO_BASE__INST0_SEG5                      0x04040000
+
+#define DPCS_BASE__INST0_SEG0                      0x00000012
+#define DPCS_BASE__INST0_SEG1                      0x000000C0
+#define DPCS_BASE__INST0_SEG2                      0x000034C0
+#define DPCS_BASE__INST0_SEG3                      0x00009000
+#define DPCS_BASE__INST0_SEG4                      0x02403C00
+#define DPCS_BASE__INST0_SEG5                      0
+
+#define DCN_BASE__INST0_SEG0                       0x00000012
+#define DCN_BASE__INST0_SEG1                       0x000000C0
+#define DCN_BASE__INST0_SEG2                       0x000034C0
+#define DCN_BASE__INST0_SEG3                       0x00009000
+#define DCN_BASE__INST0_SEG4                       0x02403C00
+#define DCN_BASE__INST0_SEG5                       0
+
+#define regBIF_BX_PF2_RSMU_INDEX                                                                        0x0000
+#define regBIF_BX_PF2_RSMU_INDEX_BASE_IDX                                                               1
+#define regBIF_BX_PF2_RSMU_DATA                                                                         0x0001
+#define regBIF_BX_PF2_RSMU_DATA_BASE_IDX                                                                1
+#define regBIF_BX2_BIOS_SCRATCH_6                                                                       0x003e
+#define regBIF_BX2_BIOS_SCRATCH_6_BASE_IDX                                                              1
+#define BIF_BX2_BIOS_SCRATCH_6__BIOS_SCRATCH_6__SHIFT                                                         0x0
+#define BIF_BX2_BIOS_SCRATCH_6__BIOS_SCRATCH_6_MASK                                                           0xFFFFFFFFL
+#define regBIF_BX2_BIOS_SCRATCH_2                                                                       0x003a
+#define regBIF_BX2_BIOS_SCRATCH_2_BASE_IDX                                                              1
+#define BIF_BX2_BIOS_SCRATCH_2__BIOS_SCRATCH_2__SHIFT                                                         0x0
+#define BIF_BX2_BIOS_SCRATCH_2__BIOS_SCRATCH_2_MASK                                                           0xFFFFFFFFL
+#define regBIF_BX2_BIOS_SCRATCH_3                                                                       0x003b
+#define regBIF_BX2_BIOS_SCRATCH_3_BASE_IDX                                                              1
+#define BIF_BX2_BIOS_SCRATCH_3__BIOS_SCRATCH_3__SHIFT                                                         0x0
+#define BIF_BX2_BIOS_SCRATCH_3__BIOS_SCRATCH_3_MASK                                                           0xFFFFFFFFL
+
+#define regDCHUBBUB_DEBUG_CTRL_0                                              0x04d6
+#define regDCHUBBUB_DEBUG_CTRL_0_BASE_IDX                                     2
+#define DCHUBBUB_DEBUG_CTRL_0__DET_DEPTH__SHIFT                               0x10
+#define DCHUBBUB_DEBUG_CTRL_0__DET_DEPTH_MASK                                 0x01FF0000L
+
+#include "reg_helper.h"
+#include "dce/dmub_abm.h"
+#include "dce/dmub_psr.h"
+#include "dce/dce_aux.h"
+#include "dce/dce_i2c.h"
+
+#include "dml/dcn30/display_mode_vba_30.h"
+#include "vm_helper.h"
+#include "dcn20/dcn20_vmid.h"
+
+#include "link_enc_cfg.h"
+
+#define DCN3_15_MAX_DET_SIZE 384
+#define DCN3_15_CRB_SEGMENT_SIZE_KB 64
+#define DCN3_15_MAX_DET_SEGS (DCN3_15_MAX_DET_SIZE / DCN3_15_CRB_SEGMENT_SIZE_KB)
+/* Minimum 3 extra segments need to be in compbuf and claimable to guarantee seamless mpo transitions */
+#define MIN_RESERVED_DET_SEGS 3
+
+enum dcn31_clk_src_array_id {
+       DCN31_CLK_SRC_PLL0,
+       DCN31_CLK_SRC_PLL1,
+       DCN31_CLK_SRC_PLL2,
+       DCN31_CLK_SRC_PLL3,
+       DCN31_CLK_SRC_PLL4,
+       DCN30_CLK_SRC_TOTAL
+};
+
+/* begin *********************
+ * macros to expend register list macro defined in HW object header file
+ */
+
+/* DCN */
+#define BASE_INNER(seg) DCN_BASE__INST0_SEG ## seg
+
+#define BASE(seg) BASE_INNER(seg)
+
+#define SR(reg_name)\
+               .reg_name = BASE(reg ## reg_name ## _BASE_IDX) +  \
+                                       reg ## reg_name
+
+#define SRI(reg_name, block, id)\
+       .reg_name = BASE(reg ## block ## id ## _ ## reg_name ## _BASE_IDX) + \
+                                       reg ## block ## id ## _ ## reg_name
+
+#define SRI2(reg_name, block, id)\
+       .reg_name = BASE(reg ## reg_name ## _BASE_IDX) + \
+                                       reg ## reg_name
+
+#define SRIR(var_name, reg_name, block, id)\
+       .var_name = BASE(reg ## block ## id ## _ ## reg_name ## _BASE_IDX) + \
+                                       reg ## block ## id ## _ ## reg_name
+
+#define SRII(reg_name, block, id)\
+       .reg_name[id] = BASE(reg ## block ## id ## _ ## reg_name ## _BASE_IDX) + \
+                                       reg ## block ## id ## _ ## reg_name
+
+#define SRII_MPC_RMU(reg_name, block, id)\
+       .RMU##_##reg_name[id] = BASE(reg ## block ## id ## _ ## reg_name ## _BASE_IDX) + \
+                                       reg ## block ## id ## _ ## reg_name
+
+#define SRII_DWB(reg_name, temp_name, block, id)\
+       .reg_name[id] = BASE(reg ## block ## id ## _ ## temp_name ## _BASE_IDX) + \
+                                       reg ## block ## id ## _ ## temp_name
+
+#define SF_DWB2(reg_name, block, id, field_name, post_fix)     \
+       .field_name = reg_name ## __ ## field_name ## post_fix
+
+#define DCCG_SRII(reg_name, block, id)\
+       .block ## _ ## reg_name[id] = BASE(reg ## block ## id ## _ ## reg_name ## _BASE_IDX) + \
+                                       reg ## block ## id ## _ ## reg_name
+
+#define VUPDATE_SRII(reg_name, block, id)\
+       .reg_name[id] = BASE(reg ## reg_name ## _ ## block ## id ## _BASE_IDX) + \
+                                       reg ## reg_name ## _ ## block ## id
+
+/* NBIO */
+#define NBIO_BASE_INNER(seg) \
+       NBIO_BASE__INST0_SEG ## seg
+
+#define NBIO_BASE(seg) \
+       NBIO_BASE_INNER(seg)
+
+#define NBIO_SR(reg_name)\
+               .reg_name = NBIO_BASE(regBIF_BX2_ ## reg_name ## _BASE_IDX) + \
+                                       regBIF_BX2_ ## reg_name
+
+static const struct bios_registers bios_regs = {
+               NBIO_SR(BIOS_SCRATCH_3),
+               NBIO_SR(BIOS_SCRATCH_6)
+};
+
+#define clk_src_regs(index, pllid)\
+[index] = {\
+       CS_COMMON_REG_LIST_DCN3_0(index, pllid),\
+}
+
+static const struct dce110_clk_src_regs clk_src_regs[] = {
+       clk_src_regs(0, A),
+       clk_src_regs(1, B),
+       clk_src_regs(2, C),
+       clk_src_regs(3, D),
+       clk_src_regs(4, E)
+};
+
+static const struct dce110_clk_src_shift cs_shift = {
+               CS_COMMON_MASK_SH_LIST_DCN2_0(__SHIFT)
+};
+
+static const struct dce110_clk_src_mask cs_mask = {
+               CS_COMMON_MASK_SH_LIST_DCN2_0(_MASK)
+};
+
+#define abm_regs(id)\
+[id] = {\
+               ABM_DCN302_REG_LIST(id)\
+}
+
+static const struct dce_abm_registers abm_regs[] = {
+               abm_regs(0),
+               abm_regs(1),
+               abm_regs(2),
+               abm_regs(3),
+};
+
+static const struct dce_abm_shift abm_shift = {
+               ABM_MASK_SH_LIST_DCN30(__SHIFT)
+};
+
+static const struct dce_abm_mask abm_mask = {
+               ABM_MASK_SH_LIST_DCN30(_MASK)
+};
+
+#define audio_regs(id)\
+[id] = {\
+               AUD_COMMON_REG_LIST(id)\
+}
+
+static const struct dce_audio_registers audio_regs[] = {
+       audio_regs(0),
+       audio_regs(1),
+       audio_regs(2),
+       audio_regs(3),
+       audio_regs(4),
+       audio_regs(5),
+       audio_regs(6)
+};
+
+#define DCE120_AUD_COMMON_MASK_SH_LIST(mask_sh)\
+               SF(AZF0ENDPOINT0_AZALIA_F0_CODEC_ENDPOINT_INDEX, AZALIA_ENDPOINT_REG_INDEX, mask_sh),\
+               SF(AZF0ENDPOINT0_AZALIA_F0_CODEC_ENDPOINT_DATA, AZALIA_ENDPOINT_REG_DATA, mask_sh),\
+               AUD_COMMON_MASK_SH_LIST_BASE(mask_sh)
+
+static const struct dce_audio_shift audio_shift = {
+               DCE120_AUD_COMMON_MASK_SH_LIST(__SHIFT)
+};
+
+static const struct dce_audio_mask audio_mask = {
+               DCE120_AUD_COMMON_MASK_SH_LIST(_MASK)
+};
+
+#define vpg_regs(id)\
+[id] = {\
+       VPG_DCN31_REG_LIST(id)\
+}
+
+static const struct dcn31_vpg_registers vpg_regs[] = {
+       vpg_regs(0),
+       vpg_regs(1),
+       vpg_regs(2),
+       vpg_regs(3),
+       vpg_regs(4),
+       vpg_regs(5),
+       vpg_regs(6),
+       vpg_regs(7),
+       vpg_regs(8),
+       vpg_regs(9),
+};
+
+static const struct dcn31_vpg_shift vpg_shift = {
+       DCN31_VPG_MASK_SH_LIST(__SHIFT)
+};
+
+static const struct dcn31_vpg_mask vpg_mask = {
+       DCN31_VPG_MASK_SH_LIST(_MASK)
+};
+
+#define afmt_regs(id)\
+[id] = {\
+       AFMT_DCN31_REG_LIST(id)\
+}
+
+static const struct dcn31_afmt_registers afmt_regs[] = {
+       afmt_regs(0),
+       afmt_regs(1),
+       afmt_regs(2),
+       afmt_regs(3),
+       afmt_regs(4),
+       afmt_regs(5)
+};
+
+static const struct dcn31_afmt_shift afmt_shift = {
+       DCN31_AFMT_MASK_SH_LIST(__SHIFT)
+};
+
+static const struct dcn31_afmt_mask afmt_mask = {
+       DCN31_AFMT_MASK_SH_LIST(_MASK)
+};
+
+#define apg_regs(id)\
+[id] = {\
+       APG_DCN31_REG_LIST(id)\
+}
+
+static const struct dcn31_apg_registers apg_regs[] = {
+       apg_regs(0),
+       apg_regs(1),
+       apg_regs(2),
+       apg_regs(3)
+};
+
+static const struct dcn31_apg_shift apg_shift = {
+       DCN31_APG_MASK_SH_LIST(__SHIFT)
+};
+
+static const struct dcn31_apg_mask apg_mask = {
+               DCN31_APG_MASK_SH_LIST(_MASK)
+};
+
+#define stream_enc_regs(id)\
+[id] = {\
+       SE_DCN3_REG_LIST(id)\
+}
+
+static const struct dcn10_stream_enc_registers stream_enc_regs[] = {
+       stream_enc_regs(0),
+       stream_enc_regs(1),
+       stream_enc_regs(2),
+       stream_enc_regs(3),
+       stream_enc_regs(4)
+};
+
+static const struct dcn10_stream_encoder_shift se_shift = {
+               SE_COMMON_MASK_SH_LIST_DCN30(__SHIFT)
+};
+
+static const struct dcn10_stream_encoder_mask se_mask = {
+               SE_COMMON_MASK_SH_LIST_DCN30(_MASK)
+};
+
+
+#define aux_regs(id)\
+[id] = {\
+       DCN2_AUX_REG_LIST(id)\
+}
+
+static const struct dcn10_link_enc_aux_registers link_enc_aux_regs[] = {
+               aux_regs(0),
+               aux_regs(1),
+               aux_regs(2),
+               aux_regs(3),
+               aux_regs(4)
+};
+
+#define hpd_regs(id)\
+[id] = {\
+       HPD_REG_LIST(id)\
+}
+
+static const struct dcn10_link_enc_hpd_registers link_enc_hpd_regs[] = {
+               hpd_regs(0),
+               hpd_regs(1),
+               hpd_regs(2),
+               hpd_regs(3),
+               hpd_regs(4)
+};
+
+#define link_regs(id, phyid)\
+[id] = {\
+       LE_DCN31_REG_LIST(id), \
+       UNIPHY_DCN2_REG_LIST(phyid), \
+       DPCS_DCN31_REG_LIST(id), \
+}
+
+static const struct dce110_aux_registers_shift aux_shift = {
+       DCN_AUX_MASK_SH_LIST(__SHIFT)
+};
+
+static const struct dce110_aux_registers_mask aux_mask = {
+       DCN_AUX_MASK_SH_LIST(_MASK)
+};
+
+static const struct dcn10_link_enc_registers link_enc_regs[] = {
+       link_regs(0, A),
+       link_regs(1, B),
+       link_regs(2, C),
+       link_regs(3, D),
+       link_regs(4, E)
+};
+
+static const struct dcn10_link_enc_shift le_shift = {
+       LINK_ENCODER_MASK_SH_LIST_DCN31(__SHIFT), \
+       DPCS_DCN31_MASK_SH_LIST(__SHIFT)
+};
+
+static const struct dcn10_link_enc_mask le_mask = {
+       LINK_ENCODER_MASK_SH_LIST_DCN31(_MASK), \
+       DPCS_DCN31_MASK_SH_LIST(_MASK)
+};
+
+#define hpo_dp_stream_encoder_reg_list(id)\
+[id] = {\
+       DCN3_1_HPO_DP_STREAM_ENC_REG_LIST(id)\
+}
+
+static const struct dcn31_hpo_dp_stream_encoder_registers hpo_dp_stream_enc_regs[] = {
+       hpo_dp_stream_encoder_reg_list(0),
+       hpo_dp_stream_encoder_reg_list(1),
+       hpo_dp_stream_encoder_reg_list(2),
+       hpo_dp_stream_encoder_reg_list(3),
+};
+
+static const struct dcn31_hpo_dp_stream_encoder_shift hpo_dp_se_shift = {
+       DCN3_1_HPO_DP_STREAM_ENC_MASK_SH_LIST(__SHIFT)
+};
+
+static const struct dcn31_hpo_dp_stream_encoder_mask hpo_dp_se_mask = {
+       DCN3_1_HPO_DP_STREAM_ENC_MASK_SH_LIST(_MASK)
+};
+
+
+#define hpo_dp_link_encoder_reg_list(id)\
+[id] = {\
+       DCN3_1_HPO_DP_LINK_ENC_REG_LIST(id),\
+       DCN3_1_RDPCSTX_REG_LIST(0),\
+       DCN3_1_RDPCSTX_REG_LIST(1),\
+       DCN3_1_RDPCSTX_REG_LIST(2),\
+       DCN3_1_RDPCSTX_REG_LIST(3),\
+       DCN3_1_RDPCSTX_REG_LIST(4)\
+}
+
+static const struct dcn31_hpo_dp_link_encoder_registers hpo_dp_link_enc_regs[] = {
+       hpo_dp_link_encoder_reg_list(0),
+       hpo_dp_link_encoder_reg_list(1),
+};
+
+static const struct dcn31_hpo_dp_link_encoder_shift hpo_dp_le_shift = {
+       DCN3_1_HPO_DP_LINK_ENC_MASK_SH_LIST(__SHIFT)
+};
+
+static const struct dcn31_hpo_dp_link_encoder_mask hpo_dp_le_mask = {
+       DCN3_1_HPO_DP_LINK_ENC_MASK_SH_LIST(_MASK)
+};
+
+#define dpp_regs(id)\
+[id] = {\
+       DPP_REG_LIST_DCN30(id),\
+}
+
+static const struct dcn3_dpp_registers dpp_regs[] = {
+       dpp_regs(0),
+       dpp_regs(1),
+       dpp_regs(2),
+       dpp_regs(3)
+};
+
+static const struct dcn3_dpp_shift tf_shift = {
+               DPP_REG_LIST_SH_MASK_DCN30(__SHIFT)
+};
+
+static const struct dcn3_dpp_mask tf_mask = {
+               DPP_REG_LIST_SH_MASK_DCN30(_MASK)
+};
+
+#define opp_regs(id)\
+[id] = {\
+       OPP_REG_LIST_DCN30(id),\
+}
+
+static const struct dcn20_opp_registers opp_regs[] = {
+       opp_regs(0),
+       opp_regs(1),
+       opp_regs(2),
+       opp_regs(3)
+};
+
+static const struct dcn20_opp_shift opp_shift = {
+       OPP_MASK_SH_LIST_DCN20(__SHIFT)
+};
+
+static const struct dcn20_opp_mask opp_mask = {
+       OPP_MASK_SH_LIST_DCN20(_MASK)
+};
+
+#define aux_engine_regs(id)\
+[id] = {\
+       AUX_COMMON_REG_LIST0(id), \
+       .AUXN_IMPCAL = 0, \
+       .AUXP_IMPCAL = 0, \
+       .AUX_RESET_MASK = DP_AUX0_AUX_CONTROL__AUX_RESET_MASK, \
+}
+
+static const struct dce110_aux_registers aux_engine_regs[] = {
+               aux_engine_regs(0),
+               aux_engine_regs(1),
+               aux_engine_regs(2),
+               aux_engine_regs(3),
+               aux_engine_regs(4)
+};
+
+#define dwbc_regs_dcn3(id)\
+[id] = {\
+       DWBC_COMMON_REG_LIST_DCN30(id),\
+}
+
+static const struct dcn30_dwbc_registers dwbc30_regs[] = {
+       dwbc_regs_dcn3(0),
+};
+
+static const struct dcn30_dwbc_shift dwbc30_shift = {
+       DWBC_COMMON_MASK_SH_LIST_DCN30(__SHIFT)
+};
+
+static const struct dcn30_dwbc_mask dwbc30_mask = {
+       DWBC_COMMON_MASK_SH_LIST_DCN30(_MASK)
+};
+
+#define mcif_wb_regs_dcn3(id)\
+[id] = {\
+       MCIF_WB_COMMON_REG_LIST_DCN30(id),\
+}
+
+static const struct dcn30_mmhubbub_registers mcif_wb30_regs[] = {
+       mcif_wb_regs_dcn3(0)
+};
+
+static const struct dcn30_mmhubbub_shift mcif_wb30_shift = {
+       MCIF_WB_COMMON_MASK_SH_LIST_DCN30(__SHIFT)
+};
+
+static const struct dcn30_mmhubbub_mask mcif_wb30_mask = {
+       MCIF_WB_COMMON_MASK_SH_LIST_DCN30(_MASK)
+};
+
+#define dsc_regsDCN20(id)\
+[id] = {\
+       DSC_REG_LIST_DCN20(id)\
+}
+
+static const struct dcn20_dsc_registers dsc_regs[] = {
+       dsc_regsDCN20(0),
+       dsc_regsDCN20(1),
+       dsc_regsDCN20(2)
+};
+
+static const struct dcn20_dsc_shift dsc_shift = {
+       DSC_REG_LIST_SH_MASK_DCN20(__SHIFT)
+};
+
+static const struct dcn20_dsc_mask dsc_mask = {
+       DSC_REG_LIST_SH_MASK_DCN20(_MASK)
+};
+
+static const struct dcn30_mpc_registers mpc_regs = {
+               MPC_REG_LIST_DCN3_0(0),
+               MPC_REG_LIST_DCN3_0(1),
+               MPC_REG_LIST_DCN3_0(2),
+               MPC_REG_LIST_DCN3_0(3),
+               MPC_OUT_MUX_REG_LIST_DCN3_0(0),
+               MPC_OUT_MUX_REG_LIST_DCN3_0(1),
+               MPC_OUT_MUX_REG_LIST_DCN3_0(2),
+               MPC_OUT_MUX_REG_LIST_DCN3_0(3),
+               MPC_DWB_MUX_REG_LIST_DCN3_0(0),
+};
+
+static const struct dcn30_mpc_shift mpc_shift = {
+       MPC_COMMON_MASK_SH_LIST_DCN30(__SHIFT)
+};
+
+static const struct dcn30_mpc_mask mpc_mask = {
+       MPC_COMMON_MASK_SH_LIST_DCN30(_MASK)
+};
+
+#define optc_regs(id)\
+[id] = {OPTC_COMMON_REG_LIST_DCN3_1(id)}
+
+static const struct dcn_optc_registers optc_regs[] = {
+       optc_regs(0),
+       optc_regs(1),
+       optc_regs(2),
+       optc_regs(3)
+};
+
+static const struct dcn_optc_shift optc_shift = {
+       OPTC_COMMON_MASK_SH_LIST_DCN3_1(__SHIFT)
+};
+
+static const struct dcn_optc_mask optc_mask = {
+       OPTC_COMMON_MASK_SH_LIST_DCN3_1(_MASK)
+};
+
+#define hubp_regs(id)\
+[id] = {\
+       HUBP_REG_LIST_DCN30(id)\
+}
+
+static const struct dcn_hubp2_registers hubp_regs[] = {
+               hubp_regs(0),
+               hubp_regs(1),
+               hubp_regs(2),
+               hubp_regs(3)
+};
+
+
+static const struct dcn_hubp2_shift hubp_shift = {
+               HUBP_MASK_SH_LIST_DCN31(__SHIFT)
+};
+
+static const struct dcn_hubp2_mask hubp_mask = {
+               HUBP_MASK_SH_LIST_DCN31(_MASK)
+};
+static const struct dcn_hubbub_registers hubbub_reg = {
+               HUBBUB_REG_LIST_DCN31(0)
+};
+
+static const struct dcn_hubbub_shift hubbub_shift = {
+               HUBBUB_MASK_SH_LIST_DCN31(__SHIFT)
+};
+
+static const struct dcn_hubbub_mask hubbub_mask = {
+               HUBBUB_MASK_SH_LIST_DCN31(_MASK)
+};
+
+static const struct dccg_registers dccg_regs = {
+               DCCG_REG_LIST_DCN31()
+};
+
+static const struct dccg_shift dccg_shift = {
+               DCCG_MASK_SH_LIST_DCN31(__SHIFT)
+};
+
+static const struct dccg_mask dccg_mask = {
+               DCCG_MASK_SH_LIST_DCN31(_MASK)
+};
+
+
+#define SRII2(reg_name_pre, reg_name_post, id)\
+       .reg_name_pre ## _ ##  reg_name_post[id] = BASE(reg ## reg_name_pre \
+                       ## id ## _ ## reg_name_post ## _BASE_IDX) + \
+                       reg ## reg_name_pre ## id ## _ ## reg_name_post
+
+
+#define HWSEQ_DCN31_REG_LIST()\
+       SR(DCHUBBUB_GLOBAL_TIMER_CNTL), \
+       SR(DCHUBBUB_ARB_HOSTVM_CNTL), \
+       SR(DIO_MEM_PWR_CTRL), \
+       SR(ODM_MEM_PWR_CTRL3), \
+       SR(DMU_MEM_PWR_CNTL), \
+       SR(MMHUBBUB_MEM_PWR_CNTL), \
+       SR(DCCG_GATE_DISABLE_CNTL), \
+       SR(DCCG_GATE_DISABLE_CNTL2), \
+       SR(DCFCLK_CNTL),\
+       SR(DC_MEM_GLOBAL_PWR_REQ_CNTL), \
+       SRII(PIXEL_RATE_CNTL, OTG, 0), \
+       SRII(PIXEL_RATE_CNTL, OTG, 1),\
+       SRII(PIXEL_RATE_CNTL, OTG, 2),\
+       SRII(PIXEL_RATE_CNTL, OTG, 3),\
+       SRII(PHYPLL_PIXEL_RATE_CNTL, OTG, 0),\
+       SRII(PHYPLL_PIXEL_RATE_CNTL, OTG, 1),\
+       SRII(PHYPLL_PIXEL_RATE_CNTL, OTG, 2),\
+       SRII(PHYPLL_PIXEL_RATE_CNTL, OTG, 3),\
+       SR(MICROSECOND_TIME_BASE_DIV), \
+       SR(MILLISECOND_TIME_BASE_DIV), \
+       SR(DISPCLK_FREQ_CHANGE_CNTL), \
+       SR(RBBMIF_TIMEOUT_DIS), \
+       SR(RBBMIF_TIMEOUT_DIS_2), \
+       SR(DCHUBBUB_CRC_CTRL), \
+       SR(DPP_TOP0_DPP_CRC_CTRL), \
+       SR(DPP_TOP0_DPP_CRC_VAL_B_A), \
+       SR(DPP_TOP0_DPP_CRC_VAL_R_G), \
+       SR(MPC_CRC_CTRL), \
+       SR(MPC_CRC_RESULT_GB), \
+       SR(MPC_CRC_RESULT_C), \
+       SR(MPC_CRC_RESULT_AR), \
+       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(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(D1VGA_CONTROL), \
+       SR(D2VGA_CONTROL), \
+       SR(D3VGA_CONTROL), \
+       SR(D4VGA_CONTROL), \
+       SR(D5VGA_CONTROL), \
+       SR(D6VGA_CONTROL), \
+       SR(DC_IP_REQUEST_CNTL), \
+       SR(AZALIA_AUDIO_DTO), \
+       SR(AZALIA_CONTROLLER_CLOCK_GATING), \
+       SR(HPO_TOP_HW_CONTROL)
+
+static const struct dce_hwseq_registers hwseq_reg = {
+               HWSEQ_DCN31_REG_LIST()
+};
+
+#define HWSEQ_DCN31_MASK_SH_LIST(mask_sh)\
+       HWSEQ_DCN_MASK_SH_LIST(mask_sh), \
+       HWS_SF(, DCHUBBUB_GLOBAL_TIMER_CNTL, DCHUBBUB_GLOBAL_TIMER_REFDIV, mask_sh), \
+       HWS_SF(, DCHUBBUB_ARB_HOSTVM_CNTL, DISABLE_HOSTVM_FORCE_ALLOW_PSTATE, mask_sh), \
+       HWS_SF(, DOMAIN0_PG_CONFIG, DOMAIN_POWER_FORCEON, mask_sh), \
+       HWS_SF(, DOMAIN0_PG_CONFIG, DOMAIN_POWER_GATE, mask_sh), \
+       HWS_SF(, DOMAIN1_PG_CONFIG, DOMAIN_POWER_FORCEON, mask_sh), \
+       HWS_SF(, DOMAIN1_PG_CONFIG, DOMAIN_POWER_GATE, mask_sh), \
+       HWS_SF(, DOMAIN2_PG_CONFIG, DOMAIN_POWER_FORCEON, mask_sh), \
+       HWS_SF(, DOMAIN2_PG_CONFIG, DOMAIN_POWER_GATE, mask_sh), \
+       HWS_SF(, DOMAIN3_PG_CONFIG, DOMAIN_POWER_FORCEON, mask_sh), \
+       HWS_SF(, DOMAIN3_PG_CONFIG, DOMAIN_POWER_GATE, mask_sh), \
+       HWS_SF(, DOMAIN16_PG_CONFIG, DOMAIN_POWER_FORCEON, mask_sh), \
+       HWS_SF(, DOMAIN16_PG_CONFIG, DOMAIN_POWER_GATE, mask_sh), \
+       HWS_SF(, DOMAIN17_PG_CONFIG, DOMAIN_POWER_FORCEON, mask_sh), \
+       HWS_SF(, DOMAIN17_PG_CONFIG, DOMAIN_POWER_GATE, mask_sh), \
+       HWS_SF(, DOMAIN18_PG_CONFIG, DOMAIN_POWER_FORCEON, mask_sh), \
+       HWS_SF(, DOMAIN18_PG_CONFIG, DOMAIN_POWER_GATE, mask_sh), \
+       HWS_SF(, DOMAIN0_PG_STATUS, DOMAIN_PGFSM_PWR_STATUS, mask_sh), \
+       HWS_SF(, DOMAIN1_PG_STATUS, DOMAIN_PGFSM_PWR_STATUS, mask_sh), \
+       HWS_SF(, DOMAIN2_PG_STATUS, DOMAIN_PGFSM_PWR_STATUS, mask_sh), \
+       HWS_SF(, DOMAIN3_PG_STATUS, DOMAIN_PGFSM_PWR_STATUS, mask_sh), \
+       HWS_SF(, DOMAIN16_PG_STATUS, DOMAIN_PGFSM_PWR_STATUS, mask_sh), \
+       HWS_SF(, DOMAIN17_PG_STATUS, DOMAIN_PGFSM_PWR_STATUS, mask_sh), \
+       HWS_SF(, DOMAIN18_PG_STATUS, DOMAIN_PGFSM_PWR_STATUS, mask_sh), \
+       HWS_SF(, DC_IP_REQUEST_CNTL, IP_REQUEST_EN, mask_sh), \
+       HWS_SF(, AZALIA_AUDIO_DTO, AZALIA_AUDIO_DTO_MODULE, mask_sh), \
+       HWS_SF(, HPO_TOP_CLOCK_CONTROL, HPO_HDMISTREAMCLK_G_GATE_DIS, mask_sh), \
+       HWS_SF(, DMU_MEM_PWR_CNTL, DMCU_ERAM_MEM_PWR_FORCE, mask_sh), \
+       HWS_SF(, ODM_MEM_PWR_CTRL3, ODM_MEM_UNASSIGNED_PWR_MODE, mask_sh), \
+       HWS_SF(, ODM_MEM_PWR_CTRL3, ODM_MEM_VBLANK_PWR_MODE, mask_sh), \
+       HWS_SF(, MMHUBBUB_MEM_PWR_CNTL, VGA_MEM_PWR_FORCE, mask_sh), \
+       HWS_SF(, DIO_MEM_PWR_CTRL, I2C_LIGHT_SLEEP_FORCE, mask_sh), \
+       HWS_SF(, HPO_TOP_HW_CONTROL, HPO_IO_EN, mask_sh)
+
+static const struct dce_hwseq_shift hwseq_shift = {
+               HWSEQ_DCN31_MASK_SH_LIST(__SHIFT)
+};
+
+static const struct dce_hwseq_mask hwseq_mask = {
+               HWSEQ_DCN31_MASK_SH_LIST(_MASK)
+};
+#define vmid_regs(id)\
+[id] = {\
+               DCN20_VMID_REG_LIST(id)\
+}
+
+static const struct dcn_vmid_registers vmid_regs[] = {
+       vmid_regs(0),
+       vmid_regs(1),
+       vmid_regs(2),
+       vmid_regs(3),
+       vmid_regs(4),
+       vmid_regs(5),
+       vmid_regs(6),
+       vmid_regs(7),
+       vmid_regs(8),
+       vmid_regs(9),
+       vmid_regs(10),
+       vmid_regs(11),
+       vmid_regs(12),
+       vmid_regs(13),
+       vmid_regs(14),
+       vmid_regs(15)
+};
+
+static const struct dcn20_vmid_shift vmid_shifts = {
+               DCN20_VMID_MASK_SH_LIST(__SHIFT)
+};
+
+static const struct dcn20_vmid_mask vmid_masks = {
+               DCN20_VMID_MASK_SH_LIST(_MASK)
+};
+
+static const struct resource_caps res_cap_dcn31 = {
+       .num_timing_generator = 4,
+       .num_opp = 4,
+       .num_video_plane = 4,
+       .num_audio = 5,
+       .num_stream_encoder = 5,
+       .num_dig_link_enc = 5,
+       .num_hpo_dp_stream_encoder = 4,
+       .num_hpo_dp_link_encoder = 2,
+       .num_pll = 5,
+       .num_dwb = 1,
+       .num_ddc = 5,
+       .num_vmid = 16,
+       .num_mpc_3dlut = 2,
+       .num_dsc = 3,
+};
+
+static const struct dc_plane_cap plane_cap = {
+       .type = DC_PLANE_TYPE_DCN_UNIVERSAL,
+       .per_pixel_alpha = true,
+
+       .pixel_format_support = {
+                       .argb8888 = true,
+                       .nv12 = true,
+                       .fp16 = true,
+                       .p010 = true,
+                       .ayuv = false,
+       },
+
+       .max_upscale_factor = {
+                       .argb8888 = 16000,
+                       .nv12 = 16000,
+                       .fp16 = 16000
+       },
+
+       // 6:1 downscaling ratio: 1000/6 = 166.666
+       .max_downscale_factor = {
+                       .argb8888 = 167,
+                       .nv12 = 167,
+                       .fp16 = 167
+       },
+       64,
+       64
+};
+
+static const struct dc_debug_options debug_defaults_drv = {
+       .disable_z10 = true, /*hw not support it*/
+       .disable_dmcu = true,
+       .force_abm_enable = false,
+       .timing_trace = false,
+       .clock_trace = true,
+       .disable_pplib_clock_request = false,
+       .pipe_split_policy = MPC_SPLIT_DYNAMIC,
+       .force_single_disp_pipe_split = false,
+       .disable_dcc = DCC_ENABLE,
+       .vsr_support = true,
+       .performance_trace = false,
+       .max_downscale_src_width = 4096,/*upto true 4k*/
+       .disable_pplib_wm_range = false,
+       .scl_reset_length10 = true,
+       .sanity_checks = false,
+       .underflow_assert_delay_us = 0xFFFFFFFF,
+       .dwb_fi_phase = -1, // -1 = disable,
+       .dmub_command_table = true,
+       .pstate_enabled = true,
+       .use_max_lb = true,
+       .enable_mem_low_power = {
+               .bits = {
+                       .vga = true,
+                       .i2c = true,
+                       .dmcu = false, // This is previously known to cause hang on S3 cycles if enabled
+                       .dscl = true,
+                       .cm = true,
+                       .mpc = true,
+                       .optc = true,
+                       .vpg = true,
+                       .afmt = true,
+               }
+       },
+       .enable_legacy_fast_update = true,
+       .psr_power_use_phy_fsm = 0,
+       .using_dml2 = false,
+};
+
+static const struct dc_panel_config panel_config_defaults = {
+       .psr = {
+               .disable_psr = false,
+               .disallow_psrsu = false,
+               .disallow_replay = false,
+       },
+       .ilr = {
+               .optimize_edp_link_rate = true,
+       },
+};
+
+static void dcn31_dpp_destroy(struct dpp **dpp)
+{
+       kfree(TO_DCN20_DPP(*dpp));
+       *dpp = NULL;
+}
+
+static struct dpp *dcn31_dpp_create(
+       struct dc_context *ctx,
+       uint32_t inst)
+{
+       struct dcn3_dpp *dpp =
+               kzalloc(sizeof(struct dcn3_dpp), GFP_KERNEL);
+
+       if (!dpp)
+               return NULL;
+
+       if (dpp3_construct(dpp, ctx, inst,
+                       &dpp_regs[inst], &tf_shift, &tf_mask))
+               return &dpp->base;
+
+       BREAK_TO_DEBUGGER();
+       kfree(dpp);
+       return NULL;
+}
+
+static struct output_pixel_processor *dcn31_opp_create(
+       struct dc_context *ctx, uint32_t inst)
+{
+       struct dcn20_opp *opp =
+               kzalloc(sizeof(struct dcn20_opp), GFP_KERNEL);
+
+       if (!opp) {
+               BREAK_TO_DEBUGGER();
+               return NULL;
+       }
+
+       dcn20_opp_construct(opp, ctx, inst,
+                       &opp_regs[inst], &opp_shift, &opp_mask);
+       return &opp->base;
+}
+
+static struct dce_aux *dcn31_aux_engine_create(
+       struct dc_context *ctx,
+       uint32_t inst)
+{
+       struct aux_engine_dce110 *aux_engine =
+               kzalloc(sizeof(struct aux_engine_dce110), GFP_KERNEL);
+
+       if (!aux_engine)
+               return NULL;
+
+       dce110_aux_engine_construct(aux_engine, ctx, inst,
+                                   SW_AUX_TIMEOUT_PERIOD_MULTIPLIER * AUX_TIMEOUT_PERIOD,
+                                   &aux_engine_regs[inst],
+                                       &aux_mask,
+                                       &aux_shift,
+                                       ctx->dc->caps.extended_aux_timeout_support);
+
+       return &aux_engine->base;
+}
+#define i2c_inst_regs(id) { I2C_HW_ENGINE_COMMON_REG_LIST_DCN30(id) }
+
+static const struct dce_i2c_registers i2c_hw_regs[] = {
+               i2c_inst_regs(1),
+               i2c_inst_regs(2),
+               i2c_inst_regs(3),
+               i2c_inst_regs(4),
+               i2c_inst_regs(5),
+};
+
+static const struct dce_i2c_shift i2c_shifts = {
+               I2C_COMMON_MASK_SH_LIST_DCN30(__SHIFT)
+};
+
+static const struct dce_i2c_mask i2c_masks = {
+               I2C_COMMON_MASK_SH_LIST_DCN30(_MASK)
+};
+
+static struct dce_i2c_hw *dcn31_i2c_hw_create(
+       struct dc_context *ctx,
+       uint32_t inst)
+{
+       struct dce_i2c_hw *dce_i2c_hw =
+               kzalloc(sizeof(struct dce_i2c_hw), GFP_KERNEL);
+
+       if (!dce_i2c_hw)
+               return NULL;
+
+       dcn2_i2c_hw_construct(dce_i2c_hw, ctx, inst,
+                                   &i2c_hw_regs[inst], &i2c_shifts, &i2c_masks);
+
+       return dce_i2c_hw;
+}
+static struct mpc *dcn31_mpc_create(
+               struct dc_context *ctx,
+               int num_mpcc,
+               int num_rmu)
+{
+       struct dcn30_mpc *mpc30 = kzalloc(sizeof(struct dcn30_mpc),
+                                         GFP_KERNEL);
+
+       if (!mpc30)
+               return NULL;
+
+       dcn30_mpc_construct(mpc30, ctx,
+                       &mpc_regs,
+                       &mpc_shift,
+                       &mpc_mask,
+                       num_mpcc,
+                       num_rmu);
+
+       return &mpc30->base;
+}
+
+static struct hubbub *dcn31_hubbub_create(struct dc_context *ctx)
+{
+       int i;
+
+       struct dcn20_hubbub *hubbub3 = kzalloc(sizeof(struct dcn20_hubbub),
+                                         GFP_KERNEL);
+
+       if (!hubbub3)
+               return NULL;
+
+       hubbub31_construct(hubbub3, ctx,
+                       &hubbub_reg,
+                       &hubbub_shift,
+                       &hubbub_mask,
+                       dcn3_15_ip.det_buffer_size_kbytes,
+                       dcn3_15_ip.pixel_chunk_size_kbytes,
+                       dcn3_15_ip.config_return_buffer_size_in_kbytes);
+
+
+       for (i = 0; i < res_cap_dcn31.num_vmid; i++) {
+               struct dcn20_vmid *vmid = &hubbub3->vmid[i];
+
+               vmid->ctx = ctx;
+
+               vmid->regs = &vmid_regs[i];
+               vmid->shifts = &vmid_shifts;
+               vmid->masks = &vmid_masks;
+       }
+
+       return &hubbub3->base;
+}
+
+static struct timing_generator *dcn31_timing_generator_create(
+               struct dc_context *ctx,
+               uint32_t instance)
+{
+       struct optc *tgn10 =
+               kzalloc(sizeof(struct optc), GFP_KERNEL);
+
+       if (!tgn10)
+               return NULL;
+
+       tgn10->base.inst = instance;
+       tgn10->base.ctx = ctx;
+
+       tgn10->tg_regs = &optc_regs[instance];
+       tgn10->tg_shift = &optc_shift;
+       tgn10->tg_mask = &optc_mask;
+
+       dcn31_timing_generator_init(tgn10);
+
+       return &tgn10->base;
+}
+
+static const struct encoder_feature_support link_enc_feature = {
+               .max_hdmi_deep_color = COLOR_DEPTH_121212,
+               .max_hdmi_pixel_clock = 600000,
+               .hdmi_ycbcr420_supported = true,
+               .dp_ycbcr420_supported = true,
+               .fec_supported = true,
+               .flags.bits.IS_HBR2_CAPABLE = true,
+               .flags.bits.IS_HBR3_CAPABLE = true,
+               .flags.bits.IS_TPS3_CAPABLE = true,
+               .flags.bits.IS_TPS4_CAPABLE = true
+};
+
+static struct link_encoder *dcn31_link_encoder_create(
+       struct dc_context *ctx,
+       const struct encoder_init_data *enc_init_data)
+{
+       struct dcn20_link_encoder *enc20 =
+               kzalloc(sizeof(struct dcn20_link_encoder), GFP_KERNEL);
+
+       if (!enc20)
+               return NULL;
+
+       dcn31_link_encoder_construct(enc20,
+                       enc_init_data,
+                       &link_enc_feature,
+                       &link_enc_regs[enc_init_data->transmitter],
+                       &link_enc_aux_regs[enc_init_data->channel - 1],
+                       &link_enc_hpd_regs[enc_init_data->hpd_source],
+                       &le_shift,
+                       &le_mask);
+
+       return &enc20->enc10.base;
+}
+
+/* Create a minimal link encoder object not associated with a particular
+ * physical connector.
+ * resource_funcs.link_enc_create_minimal
+ */
+static struct link_encoder *dcn31_link_enc_create_minimal(
+               struct dc_context *ctx, enum engine_id eng_id)
+{
+       struct dcn20_link_encoder *enc20;
+
+       if ((eng_id - ENGINE_ID_DIGA) > ctx->dc->res_pool->res_cap->num_dig_link_enc)
+               return NULL;
+
+       enc20 = kzalloc(sizeof(struct dcn20_link_encoder), GFP_KERNEL);
+       if (!enc20)
+               return NULL;
+
+       dcn31_link_encoder_construct_minimal(
+                       enc20,
+                       ctx,
+                       &link_enc_feature,
+                       &link_enc_regs[eng_id - ENGINE_ID_DIGA],
+                       eng_id);
+
+       return &enc20->enc10.base;
+}
+
+static struct panel_cntl *dcn31_panel_cntl_create(const struct panel_cntl_init_data *init_data)
+{
+       struct dcn31_panel_cntl *panel_cntl =
+               kzalloc(sizeof(struct dcn31_panel_cntl), GFP_KERNEL);
+
+       if (!panel_cntl)
+               return NULL;
+
+       dcn31_panel_cntl_construct(panel_cntl, init_data);
+
+       return &panel_cntl->base;
+}
+
+static void read_dce_straps(
+       struct dc_context *ctx,
+       struct resource_straps *straps)
+{
+       generic_reg_get(ctx, regDC_PINSTRAPS + BASE(regDC_PINSTRAPS_BASE_IDX),
+               FN(DC_PINSTRAPS, DC_PINSTRAPS_AUDIO), &straps->dc_pinstraps_audio);
+
+}
+
+static struct audio *dcn31_create_audio(
+               struct dc_context *ctx, unsigned int inst)
+{
+       return dce_audio_create(ctx, inst,
+                       &audio_regs[inst], &audio_shift, &audio_mask);
+}
+
+static struct vpg *dcn31_vpg_create(
+       struct dc_context *ctx,
+       uint32_t inst)
+{
+       struct dcn31_vpg *vpg31 = kzalloc(sizeof(struct dcn31_vpg), GFP_KERNEL);
+
+       if (!vpg31)
+               return NULL;
+
+       vpg31_construct(vpg31, ctx, inst,
+                       &vpg_regs[inst],
+                       &vpg_shift,
+                       &vpg_mask);
+
+       return &vpg31->base;
+}
+
+static struct afmt *dcn31_afmt_create(
+       struct dc_context *ctx,
+       uint32_t inst)
+{
+       struct dcn31_afmt *afmt31 = kzalloc(sizeof(struct dcn31_afmt), GFP_KERNEL);
+
+       if (!afmt31)
+               return NULL;
+
+       afmt31_construct(afmt31, ctx, inst,
+                       &afmt_regs[inst],
+                       &afmt_shift,
+                       &afmt_mask);
+
+       // Light sleep by default, no need to power down here
+
+       return &afmt31->base;
+}
+
+static struct apg *dcn31_apg_create(
+       struct dc_context *ctx,
+       uint32_t inst)
+{
+       struct dcn31_apg *apg31 = kzalloc(sizeof(struct dcn31_apg), GFP_KERNEL);
+
+       if (!apg31)
+               return NULL;
+
+       apg31_construct(apg31, ctx, inst,
+                       &apg_regs[inst],
+                       &apg_shift,
+                       &apg_mask);
+
+       return &apg31->base;
+}
+
+static struct stream_encoder *dcn315_stream_encoder_create(
+       enum engine_id eng_id,
+       struct dc_context *ctx)
+{
+       struct dcn10_stream_encoder *enc1;
+       struct vpg *vpg;
+       struct afmt *afmt;
+       int vpg_inst;
+       int afmt_inst;
+
+       /*PHYB is wired off in HW, allow front end to remapping, otherwise needs more changes*/
+
+       /* Mapping of VPG, AFMT, DME register blocks to DIO block instance */
+       if (eng_id <= ENGINE_ID_DIGF) {
+               vpg_inst = eng_id;
+               afmt_inst = eng_id;
+       } else
+               return NULL;
+
+       enc1 = kzalloc(sizeof(struct dcn10_stream_encoder), GFP_KERNEL);
+       vpg = dcn31_vpg_create(ctx, vpg_inst);
+       afmt = dcn31_afmt_create(ctx, afmt_inst);
+
+       if (!enc1 || !vpg || !afmt) {
+               kfree(enc1);
+               kfree(vpg);
+               kfree(afmt);
+               return NULL;
+       }
+
+       dcn30_dio_stream_encoder_construct(enc1, ctx, ctx->dc_bios,
+                                       eng_id, vpg, afmt,
+                                       &stream_enc_regs[eng_id],
+                                       &se_shift, &se_mask);
+
+       return &enc1->base;
+}
+
+static struct hpo_dp_stream_encoder *dcn31_hpo_dp_stream_encoder_create(
+       enum engine_id eng_id,
+       struct dc_context *ctx)
+{
+       struct dcn31_hpo_dp_stream_encoder *hpo_dp_enc31;
+       struct vpg *vpg;
+       struct apg *apg;
+       uint32_t hpo_dp_inst;
+       uint32_t vpg_inst;
+       uint32_t apg_inst;
+
+       ASSERT((eng_id >= ENGINE_ID_HPO_DP_0) && (eng_id <= ENGINE_ID_HPO_DP_3));
+       hpo_dp_inst = eng_id - ENGINE_ID_HPO_DP_0;
+
+       /* Mapping of VPG register blocks to HPO DP block instance:
+        * VPG[6] -> HPO_DP[0]
+        * VPG[7] -> HPO_DP[1]
+        * VPG[8] -> HPO_DP[2]
+        * VPG[9] -> HPO_DP[3]
+        */
+       vpg_inst = hpo_dp_inst + 6;
+
+       /* Mapping of APG register blocks to HPO DP block instance:
+        * APG[0] -> HPO_DP[0]
+        * APG[1] -> HPO_DP[1]
+        * APG[2] -> HPO_DP[2]
+        * APG[3] -> HPO_DP[3]
+        */
+       apg_inst = hpo_dp_inst;
+
+       /* allocate HPO stream encoder and create VPG sub-block */
+       hpo_dp_enc31 = kzalloc(sizeof(struct dcn31_hpo_dp_stream_encoder), GFP_KERNEL);
+       vpg = dcn31_vpg_create(ctx, vpg_inst);
+       apg = dcn31_apg_create(ctx, apg_inst);
+
+       if (!hpo_dp_enc31 || !vpg || !apg) {
+               kfree(hpo_dp_enc31);
+               kfree(vpg);
+               kfree(apg);
+               return NULL;
+       }
+
+       dcn31_hpo_dp_stream_encoder_construct(hpo_dp_enc31, ctx, ctx->dc_bios,
+                                       hpo_dp_inst, eng_id, vpg, apg,
+                                       &hpo_dp_stream_enc_regs[hpo_dp_inst],
+                                       &hpo_dp_se_shift, &hpo_dp_se_mask);
+
+       return &hpo_dp_enc31->base;
+}
+
+static struct hpo_dp_link_encoder *dcn31_hpo_dp_link_encoder_create(
+       uint8_t inst,
+       struct dc_context *ctx)
+{
+       struct dcn31_hpo_dp_link_encoder *hpo_dp_enc31;
+
+       /* allocate HPO link encoder */
+       hpo_dp_enc31 = kzalloc(sizeof(struct dcn31_hpo_dp_link_encoder), GFP_KERNEL);
+
+       hpo_dp_link_encoder31_construct(hpo_dp_enc31, ctx, inst,
+                                       &hpo_dp_link_enc_regs[inst],
+                                       &hpo_dp_le_shift, &hpo_dp_le_mask);
+
+       return &hpo_dp_enc31->base;
+}
+
+static struct dce_hwseq *dcn31_hwseq_create(
+       struct dc_context *ctx)
+{
+       struct dce_hwseq *hws = kzalloc(sizeof(struct dce_hwseq), GFP_KERNEL);
+
+       if (hws) {
+               hws->ctx = ctx;
+               hws->regs = &hwseq_reg;
+               hws->shifts = &hwseq_shift;
+               hws->masks = &hwseq_mask;
+       }
+       return hws;
+}
+static const struct resource_create_funcs res_create_funcs = {
+       .read_dce_straps = read_dce_straps,
+       .create_audio = dcn31_create_audio,
+       .create_stream_encoder = dcn315_stream_encoder_create,
+       .create_hpo_dp_stream_encoder = dcn31_hpo_dp_stream_encoder_create,
+       .create_hpo_dp_link_encoder = dcn31_hpo_dp_link_encoder_create,
+       .create_hwseq = dcn31_hwseq_create,
+};
+
+static void dcn315_resource_destruct(struct dcn315_resource_pool *pool)
+{
+       unsigned int i;
+
+       for (i = 0; i < pool->base.stream_enc_count; i++) {
+               if (pool->base.stream_enc[i] != NULL) {
+                       if (pool->base.stream_enc[i]->vpg != NULL) {
+                               kfree(DCN30_VPG_FROM_VPG(pool->base.stream_enc[i]->vpg));
+                               pool->base.stream_enc[i]->vpg = NULL;
+                       }
+                       if (pool->base.stream_enc[i]->afmt != NULL) {
+                               kfree(DCN30_AFMT_FROM_AFMT(pool->base.stream_enc[i]->afmt));
+                               pool->base.stream_enc[i]->afmt = NULL;
+                       }
+                       kfree(DCN10STRENC_FROM_STRENC(pool->base.stream_enc[i]));
+                       pool->base.stream_enc[i] = NULL;
+               }
+       }
+
+       for (i = 0; i < pool->base.hpo_dp_stream_enc_count; i++) {
+               if (pool->base.hpo_dp_stream_enc[i] != NULL) {
+                       if (pool->base.hpo_dp_stream_enc[i]->vpg != NULL) {
+                               kfree(DCN30_VPG_FROM_VPG(pool->base.hpo_dp_stream_enc[i]->vpg));
+                               pool->base.hpo_dp_stream_enc[i]->vpg = NULL;
+                       }
+                       if (pool->base.hpo_dp_stream_enc[i]->apg != NULL) {
+                               kfree(DCN31_APG_FROM_APG(pool->base.hpo_dp_stream_enc[i]->apg));
+                               pool->base.hpo_dp_stream_enc[i]->apg = NULL;
+                       }
+                       kfree(DCN3_1_HPO_DP_STREAM_ENC_FROM_HPO_STREAM_ENC(pool->base.hpo_dp_stream_enc[i]));
+                       pool->base.hpo_dp_stream_enc[i] = NULL;
+               }
+       }
+
+       for (i = 0; i < pool->base.hpo_dp_link_enc_count; i++) {
+               if (pool->base.hpo_dp_link_enc[i] != NULL) {
+                       kfree(DCN3_1_HPO_DP_LINK_ENC_FROM_HPO_LINK_ENC(pool->base.hpo_dp_link_enc[i]));
+                       pool->base.hpo_dp_link_enc[i] = NULL;
+               }
+       }
+
+       for (i = 0; i < pool->base.res_cap->num_dsc; i++) {
+               if (pool->base.dscs[i] != NULL)
+                       dcn20_dsc_destroy(&pool->base.dscs[i]);
+       }
+
+       if (pool->base.mpc != NULL) {
+               kfree(TO_DCN20_MPC(pool->base.mpc));
+               pool->base.mpc = NULL;
+       }
+       if (pool->base.hubbub != NULL) {
+               kfree(pool->base.hubbub);
+               pool->base.hubbub = NULL;
+       }
+       for (i = 0; i < pool->base.pipe_count; i++) {
+               if (pool->base.dpps[i] != NULL)
+                       dcn31_dpp_destroy(&pool->base.dpps[i]);
+
+               if (pool->base.ipps[i] != NULL)
+                       pool->base.ipps[i]->funcs->ipp_destroy(&pool->base.ipps[i]);
+
+               if (pool->base.hubps[i] != NULL) {
+                       kfree(TO_DCN20_HUBP(pool->base.hubps[i]));
+                       pool->base.hubps[i] = NULL;
+               }
+
+               if (pool->base.irqs != NULL) {
+                       dal_irq_service_destroy(&pool->base.irqs);
+               }
+       }
+
+       for (i = 0; i < pool->base.res_cap->num_ddc; i++) {
+               if (pool->base.engines[i] != NULL)
+                       dce110_engine_destroy(&pool->base.engines[i]);
+               if (pool->base.hw_i2cs[i] != NULL) {
+                       kfree(pool->base.hw_i2cs[i]);
+                       pool->base.hw_i2cs[i] = NULL;
+               }
+               if (pool->base.sw_i2cs[i] != NULL) {
+                       kfree(pool->base.sw_i2cs[i]);
+                       pool->base.sw_i2cs[i] = NULL;
+               }
+       }
+
+       for (i = 0; i < pool->base.res_cap->num_opp; i++) {
+               if (pool->base.opps[i] != NULL)
+                       pool->base.opps[i]->funcs->opp_destroy(&pool->base.opps[i]);
+       }
+
+       for (i = 0; i < pool->base.res_cap->num_timing_generator; i++) {
+               if (pool->base.timing_generators[i] != NULL)    {
+                       kfree(DCN10TG_FROM_TG(pool->base.timing_generators[i]));
+                       pool->base.timing_generators[i] = NULL;
+               }
+       }
+
+       for (i = 0; i < pool->base.res_cap->num_dwb; i++) {
+               if (pool->base.dwbc[i] != NULL) {
+                       kfree(TO_DCN30_DWBC(pool->base.dwbc[i]));
+                       pool->base.dwbc[i] = NULL;
+               }
+               if (pool->base.mcif_wb[i] != NULL) {
+                       kfree(TO_DCN30_MMHUBBUB(pool->base.mcif_wb[i]));
+                       pool->base.mcif_wb[i] = NULL;
+               }
+       }
+
+       for (i = 0; i < pool->base.audio_count; i++) {
+               if (pool->base.audios[i])
+                       dce_aud_destroy(&pool->base.audios[i]);
+       }
+
+       for (i = 0; i < pool->base.clk_src_count; i++) {
+               if (pool->base.clock_sources[i] != NULL) {
+                       dcn20_clock_source_destroy(&pool->base.clock_sources[i]);
+                       pool->base.clock_sources[i] = NULL;
+               }
+       }
+
+       for (i = 0; i < pool->base.res_cap->num_mpc_3dlut; i++) {
+               if (pool->base.mpc_lut[i] != NULL) {
+                       dc_3dlut_func_release(pool->base.mpc_lut[i]);
+                       pool->base.mpc_lut[i] = NULL;
+               }
+               if (pool->base.mpc_shaper[i] != NULL) {
+                       dc_transfer_func_release(pool->base.mpc_shaper[i]);
+                       pool->base.mpc_shaper[i] = NULL;
+               }
+       }
+
+       if (pool->base.dp_clock_source != NULL) {
+               dcn20_clock_source_destroy(&pool->base.dp_clock_source);
+               pool->base.dp_clock_source = NULL;
+       }
+
+       for (i = 0; i < pool->base.res_cap->num_timing_generator; i++) {
+               if (pool->base.multiple_abms[i] != NULL)
+                       dce_abm_destroy(&pool->base.multiple_abms[i]);
+       }
+
+       if (pool->base.psr != NULL)
+               dmub_psr_destroy(&pool->base.psr);
+
+       if (pool->base.dccg != NULL)
+               dcn_dccg_destroy(&pool->base.dccg);
+}
+
+static struct hubp *dcn31_hubp_create(
+       struct dc_context *ctx,
+       uint32_t inst)
+{
+       struct dcn20_hubp *hubp2 =
+               kzalloc(sizeof(struct dcn20_hubp), GFP_KERNEL);
+
+       if (!hubp2)
+               return NULL;
+
+       if (hubp31_construct(hubp2, ctx, inst,
+                       &hubp_regs[inst], &hubp_shift, &hubp_mask))
+               return &hubp2->base;
+
+       BREAK_TO_DEBUGGER();
+       kfree(hubp2);
+       return NULL;
+}
+
+static bool dcn31_dwbc_create(struct dc_context *ctx, struct resource_pool *pool)
+{
+       int i;
+       uint32_t pipe_count = pool->res_cap->num_dwb;
+
+       for (i = 0; i < pipe_count; i++) {
+               struct dcn30_dwbc *dwbc30 = kzalloc(sizeof(struct dcn30_dwbc),
+                                                   GFP_KERNEL);
+
+               if (!dwbc30) {
+                       dm_error("DC: failed to create dwbc30!\n");
+                       return false;
+               }
+
+               dcn30_dwbc_construct(dwbc30, ctx,
+                               &dwbc30_regs[i],
+                               &dwbc30_shift,
+                               &dwbc30_mask,
+                               i);
+
+               pool->dwbc[i] = &dwbc30->base;
+       }
+       return true;
+}
+
+static bool dcn31_mmhubbub_create(struct dc_context *ctx, struct resource_pool *pool)
+{
+       int i;
+       uint32_t pipe_count = pool->res_cap->num_dwb;
+
+       for (i = 0; i < pipe_count; i++) {
+               struct dcn30_mmhubbub *mcif_wb30 = kzalloc(sizeof(struct dcn30_mmhubbub),
+                                                   GFP_KERNEL);
+
+               if (!mcif_wb30) {
+                       dm_error("DC: failed to create mcif_wb30!\n");
+                       return false;
+               }
+
+               dcn30_mmhubbub_construct(mcif_wb30, ctx,
+                               &mcif_wb30_regs[i],
+                               &mcif_wb30_shift,
+                               &mcif_wb30_mask,
+                               i);
+
+               pool->mcif_wb[i] = &mcif_wb30->base;
+       }
+       return true;
+}
+
+static struct display_stream_compressor *dcn31_dsc_create(
+       struct dc_context *ctx, uint32_t inst)
+{
+       struct dcn20_dsc *dsc =
+               kzalloc(sizeof(struct dcn20_dsc), GFP_KERNEL);
+
+       if (!dsc) {
+               BREAK_TO_DEBUGGER();
+               return NULL;
+       }
+
+       dsc2_construct(dsc, ctx, inst, &dsc_regs[inst], &dsc_shift, &dsc_mask);
+       return &dsc->base;
+}
+
+static void dcn315_destroy_resource_pool(struct resource_pool **pool)
+{
+       struct dcn315_resource_pool *dcn31_pool = TO_DCN315_RES_POOL(*pool);
+
+       dcn315_resource_destruct(dcn31_pool);
+       kfree(dcn31_pool);
+       *pool = NULL;
+}
+
+static struct clock_source *dcn31_clock_source_create(
+               struct dc_context *ctx,
+               struct dc_bios *bios,
+               enum clock_source_id id,
+               const struct dce110_clk_src_regs *regs,
+               bool dp_clk_src)
+{
+       struct dce110_clk_src *clk_src =
+               kzalloc(sizeof(struct dce110_clk_src), GFP_KERNEL);
+
+       if (!clk_src)
+               return NULL;
+
+       if (dcn31_clk_src_construct(clk_src, ctx, bios, id,
+                       regs, &cs_shift, &cs_mask)) {
+               clk_src->base.dp_clk_src = dp_clk_src;
+               return &clk_src->base;
+       }
+
+       kfree(clk_src);
+       BREAK_TO_DEBUGGER();
+       return NULL;
+}
+
+static bool is_dual_plane(enum surface_pixel_format format)
+{
+       return format >= SURFACE_PIXEL_FORMAT_VIDEO_BEGIN || format == SURFACE_PIXEL_FORMAT_GRPH_RGBE_ALPHA;
+}
+
+static int source_format_to_bpp (enum source_format_class SourcePixelFormat)
+{
+       if (SourcePixelFormat == dm_444_64)
+               return 8;
+       else if (SourcePixelFormat == dm_444_16)
+               return 2;
+       else if (SourcePixelFormat == dm_444_8)
+               return 1;
+       else if (SourcePixelFormat == dm_rgbe_alpha)
+               return 5;
+       else if (SourcePixelFormat == dm_420_8)
+               return 3;
+       else if (SourcePixelFormat == dm_420_12)
+               return 6;
+       else
+               return 4;
+}
+
+static bool allow_pixel_rate_crb(struct dc *dc, struct dc_state *context)
+{
+       int i;
+       struct resource_context *res_ctx = &context->res_ctx;
+
+       /*Don't apply for single stream*/
+       if (context->stream_count < 2)
+               return false;
+
+       for (i = 0; i < dc->res_pool->pipe_count; i++) {
+               if (!res_ctx->pipe_ctx[i].stream)
+                       continue;
+
+               /*Don't apply if scaling*/
+               if (res_ctx->pipe_ctx[i].stream->src.width != res_ctx->pipe_ctx[i].stream->dst.width ||
+                               res_ctx->pipe_ctx[i].stream->src.height != res_ctx->pipe_ctx[i].stream->dst.height ||
+                               (res_ctx->pipe_ctx[i].plane_state && (res_ctx->pipe_ctx[i].plane_state->src_rect.width
+                                                                                                               != res_ctx->pipe_ctx[i].plane_state->dst_rect.width ||
+                                       res_ctx->pipe_ctx[i].plane_state->src_rect.height
+                                                                                                               != res_ctx->pipe_ctx[i].plane_state->dst_rect.height)))
+                       return false;
+               /*Don't apply if MPO to avoid transition issues*/
+               if (res_ctx->pipe_ctx[i].top_pipe && res_ctx->pipe_ctx[i].top_pipe->plane_state != res_ctx->pipe_ctx[i].plane_state)
+                       return false;
+       }
+       return true;
+}
+
+static int dcn315_populate_dml_pipes_from_context(
+       struct dc *dc, struct dc_state *context,
+       display_e2e_pipe_params_st *pipes,
+       bool fast_validate)
+{
+       int i, pipe_cnt, crb_idx, crb_pipes;
+       struct resource_context *res_ctx = &context->res_ctx;
+       struct pipe_ctx *pipe = NULL;
+       const int max_usable_det = context->bw_ctx.dml.ip.config_return_buffer_size_in_kbytes - DCN3_15_MIN_COMPBUF_SIZE_KB;
+       int remaining_det_segs = max_usable_det / DCN3_15_CRB_SEGMENT_SIZE_KB;
+       bool pixel_rate_crb = allow_pixel_rate_crb(dc, context);
+
+       DC_FP_START();
+       dcn31x_populate_dml_pipes_from_context(dc, context, pipes, fast_validate);
+       DC_FP_END();
+
+       for (i = 0, pipe_cnt = 0, crb_pipes = 0; i < dc->res_pool->pipe_count; i++) {
+               struct dc_crtc_timing *timing;
+
+               if (!res_ctx->pipe_ctx[i].stream)
+                       continue;
+               pipe = &res_ctx->pipe_ctx[i];
+               timing = &pipe->stream->timing;
+
+               /*
+                * Immediate flip can be set dynamically after enabling the plane.
+                * We need to require support for immediate flip or underflow can be
+                * intermittently experienced depending on peak b/w requirements.
+                */
+               pipes[pipe_cnt].pipe.src.immediate_flip = true;
+
+               pipes[pipe_cnt].pipe.src.unbounded_req_mode = false;
+               pipes[pipe_cnt].pipe.dest.vfront_porch = timing->v_front_porch;
+               pipes[pipe_cnt].pipe.src.dcc_rate = 3;
+               pipes[pipe_cnt].dout.dsc_input_bpc = 0;
+               DC_FP_START();
+               dcn31_zero_pipe_dcc_fraction(pipes, pipe_cnt);
+               if (pixel_rate_crb && !pipe->top_pipe && !pipe->prev_odm_pipe) {
+                       int bpp = source_format_to_bpp(pipes[pipe_cnt].pipe.src.source_format);
+                       /* Ceil to crb segment size */
+                       int approx_det_segs_required_for_pstate = dcn_get_approx_det_segs_required_for_pstate(
+                                       &context->bw_ctx.dml.soc, timing->pix_clk_100hz, bpp, DCN3_15_CRB_SEGMENT_SIZE_KB);
+
+                       if (approx_det_segs_required_for_pstate <= 2 * DCN3_15_MAX_DET_SEGS) {
+                               bool split_required = approx_det_segs_required_for_pstate > DCN3_15_MAX_DET_SEGS;
+                               split_required = split_required || timing->pix_clk_100hz >= dcn_get_max_non_odm_pix_rate_100hz(&dc->dml.soc);
+                               split_required = split_required || (pipe->plane_state && pipe->plane_state->src_rect.width > 5120);
+
+                               /* Minimum 2 segments to allow mpc/odm combine if its used later */
+                               if (approx_det_segs_required_for_pstate < 2)
+                                       approx_det_segs_required_for_pstate = 2;
+                               if (split_required)
+                                       approx_det_segs_required_for_pstate += approx_det_segs_required_for_pstate % 2;
+                               pipes[pipe_cnt].pipe.src.det_size_override = approx_det_segs_required_for_pstate;
+                               remaining_det_segs -= approx_det_segs_required_for_pstate;
+                       } else
+                               remaining_det_segs = -1;
+                       crb_pipes++;
+               }
+               DC_FP_END();
+
+               if (pipes[pipe_cnt].dout.dsc_enable) {
+                       switch (timing->display_color_depth) {
+                       case COLOR_DEPTH_888:
+                               pipes[pipe_cnt].dout.dsc_input_bpc = 8;
+                               break;
+                       case COLOR_DEPTH_101010:
+                               pipes[pipe_cnt].dout.dsc_input_bpc = 10;
+                               break;
+                       case COLOR_DEPTH_121212:
+                               pipes[pipe_cnt].dout.dsc_input_bpc = 12;
+                               break;
+                       default:
+                               ASSERT(0);
+                               break;
+                       }
+               }
+               pipe_cnt++;
+       }
+
+       /* Spread remaining unreserved crb evenly among all pipes*/
+       if (pixel_rate_crb) {
+               for (i = 0, pipe_cnt = 0, crb_idx = 0; i < dc->res_pool->pipe_count; i++) {
+                       pipe = &res_ctx->pipe_ctx[i];
+                       if (!pipe->stream)
+                               continue;
+
+                       /* Do not use asymetric crb if not enough for pstate support */
+                       if (remaining_det_segs < 0) {
+                               pipes[pipe_cnt].pipe.src.det_size_override = 0;
+                               pipe_cnt++;
+                               continue;
+                       }
+
+                       if (!pipe->top_pipe && !pipe->prev_odm_pipe) {
+                               bool split_required = pipe->stream->timing.pix_clk_100hz >= dcn_get_max_non_odm_pix_rate_100hz(&dc->dml.soc)
+                                               || (pipe->plane_state && pipe->plane_state->src_rect.width > 5120);
+
+                               if (remaining_det_segs > MIN_RESERVED_DET_SEGS)
+                                       pipes[pipe_cnt].pipe.src.det_size_override += (remaining_det_segs - MIN_RESERVED_DET_SEGS) / crb_pipes +
+                                                       (crb_idx < (remaining_det_segs - MIN_RESERVED_DET_SEGS) % crb_pipes ? 1 : 0);
+                               if (pipes[pipe_cnt].pipe.src.det_size_override > 2 * DCN3_15_MAX_DET_SEGS) {
+                                       /* Clamp to 2 pipe split max det segments */
+                                       remaining_det_segs += pipes[pipe_cnt].pipe.src.det_size_override - 2 * (DCN3_15_MAX_DET_SEGS);
+                                       pipes[pipe_cnt].pipe.src.det_size_override = 2 * DCN3_15_MAX_DET_SEGS;
+                               }
+                               if (pipes[pipe_cnt].pipe.src.det_size_override > DCN3_15_MAX_DET_SEGS || split_required) {
+                                       /* If we are splitting we must have an even number of segments */
+                                       remaining_det_segs += pipes[pipe_cnt].pipe.src.det_size_override % 2;
+                                       pipes[pipe_cnt].pipe.src.det_size_override -= pipes[pipe_cnt].pipe.src.det_size_override % 2;
+                               }
+                               /* Convert segments into size for DML use */
+                               pipes[pipe_cnt].pipe.src.det_size_override *= DCN3_15_CRB_SEGMENT_SIZE_KB;
+
+                               crb_idx++;
+                       }
+                       pipe_cnt++;
+               }
+       }
+
+       if (pipe_cnt)
+               context->bw_ctx.dml.ip.det_buffer_size_kbytes =
+                               (max_usable_det / DCN3_15_CRB_SEGMENT_SIZE_KB / pipe_cnt) * DCN3_15_CRB_SEGMENT_SIZE_KB;
+       if (context->bw_ctx.dml.ip.det_buffer_size_kbytes > DCN3_15_MAX_DET_SIZE)
+               context->bw_ctx.dml.ip.det_buffer_size_kbytes = DCN3_15_MAX_DET_SIZE;
+
+       dc->config.enable_4to1MPC = false;
+       if (pipe_cnt == 1 && pipe->plane_state && !dc->debug.disable_z9_mpc) {
+               if (is_dual_plane(pipe->plane_state->format)
+                               && pipe->plane_state->src_rect.width <= 1920 && pipe->plane_state->src_rect.height <= 1080) {
+                       dc->config.enable_4to1MPC = true;
+                       context->bw_ctx.dml.ip.det_buffer_size_kbytes =
+                                       (max_usable_det / DCN3_15_CRB_SEGMENT_SIZE_KB / 4) * DCN3_15_CRB_SEGMENT_SIZE_KB;
+               } else if (!is_dual_plane(pipe->plane_state->format)
+                               && pipe->plane_state->src_rect.width <= 5120
+                               && pipe->stream->timing.pix_clk_100hz < dcn_get_max_non_odm_pix_rate_100hz(&dc->dml.soc)) {
+                       /* Limit to 5k max to avoid forced pipe split when there is not enough detile for swath */
+                       context->bw_ctx.dml.ip.det_buffer_size_kbytes = 192;
+                       pipes[0].pipe.src.unbounded_req_mode = true;
+               }
+       }
+
+       return pipe_cnt;
+}
+
+static void dcn315_get_panel_config_defaults(struct dc_panel_config *panel_config)
+{
+       *panel_config = panel_config_defaults;
+}
+
+static struct dc_cap_funcs cap_funcs = {
+       .get_dcc_compression_cap = dcn20_get_dcc_compression_cap
+};
+
+static struct resource_funcs dcn315_res_pool_funcs = {
+       .destroy = dcn315_destroy_resource_pool,
+       .link_enc_create = dcn31_link_encoder_create,
+       .link_enc_create_minimal = dcn31_link_enc_create_minimal,
+       .link_encs_assign = link_enc_cfg_link_encs_assign,
+       .link_enc_unassign = link_enc_cfg_link_enc_unassign,
+       .panel_cntl_create = dcn31_panel_cntl_create,
+       .validate_bandwidth = dcn31_validate_bandwidth,
+       .calculate_wm_and_dlg = dcn31_calculate_wm_and_dlg,
+       .update_soc_for_wm_a = dcn315_update_soc_for_wm_a,
+       .populate_dml_pipes = dcn315_populate_dml_pipes_from_context,
+       .acquire_free_pipe_as_secondary_dpp_pipe = dcn20_acquire_free_pipe_for_layer,
+       .release_pipe = dcn20_release_pipe,
+       .add_stream_to_ctx = dcn30_add_stream_to_ctx,
+       .add_dsc_to_stream_resource = dcn20_add_dsc_to_stream_resource,
+       .remove_stream_from_ctx = dcn20_remove_stream_from_ctx,
+       .populate_dml_writeback_from_context = dcn31_populate_dml_writeback_from_context,
+       .set_mcif_arb_params = dcn31_set_mcif_arb_params,
+       .find_first_free_match_stream_enc_for_link = dcn10_find_first_free_match_stream_enc_for_link,
+       .acquire_post_bldn_3dlut = dcn30_acquire_post_bldn_3dlut,
+       .release_post_bldn_3dlut = dcn30_release_post_bldn_3dlut,
+       .update_bw_bounding_box = dcn315_update_bw_bounding_box,
+       .patch_unknown_plane_state = dcn20_patch_unknown_plane_state,
+       .get_panel_config_defaults = dcn315_get_panel_config_defaults,
+};
+
+static bool dcn315_resource_construct(
+       uint8_t num_virtual_links,
+       struct dc *dc,
+       struct dcn315_resource_pool *pool)
+{
+       int i;
+       struct dc_context *ctx = dc->ctx;
+       struct irq_service_init_data init_data;
+
+       ctx->dc_bios->regs = &bios_regs;
+
+       pool->base.res_cap = &res_cap_dcn31;
+
+       pool->base.funcs = &dcn315_res_pool_funcs;
+
+       /*************************************************
+        *  Resource + asic cap harcoding                *
+        *************************************************/
+       pool->base.underlay_pipe_index = NO_UNDERLAY_PIPE;
+       pool->base.pipe_count = pool->base.res_cap->num_timing_generator;
+       pool->base.mpcc_count = pool->base.res_cap->num_timing_generator;
+       dc->caps.max_downscale_ratio = 600;
+       dc->caps.i2c_speed_in_khz = 100;
+       dc->caps.i2c_speed_in_khz_hdcp = 100;
+       dc->caps.max_cursor_size = 256;
+       dc->caps.min_horizontal_blanking_period = 80;
+       dc->caps.dmdata_alloc_size = 2048;
+       dc->caps.max_slave_planes = 2;
+       dc->caps.max_slave_yuv_planes = 2;
+       dc->caps.max_slave_rgb_planes = 2;
+       dc->caps.post_blend_color_processing = true;
+       dc->caps.force_dp_tps4_for_cp2520 = true;
+       if (dc->config.forceHBR2CP2520)
+               dc->caps.force_dp_tps4_for_cp2520 = false;
+       dc->caps.dp_hpo = true;
+       dc->caps.dp_hdmi21_pcon_support = true;
+       dc->caps.edp_dsc_support = true;
+       dc->caps.extended_aux_timeout_support = true;
+       dc->caps.dmcub_support = true;
+       dc->caps.is_apu = true;
+
+       /* Color pipeline capabilities */
+       dc->caps.color.dpp.dcn_arch = 1;
+       dc->caps.color.dpp.input_lut_shared = 0;
+       dc->caps.color.dpp.icsc = 1;
+       dc->caps.color.dpp.dgam_ram = 0; // must use gamma_corr
+       dc->caps.color.dpp.dgam_rom_caps.srgb = 1;
+       dc->caps.color.dpp.dgam_rom_caps.bt2020 = 1;
+       dc->caps.color.dpp.dgam_rom_caps.gamma2_2 = 1;
+       dc->caps.color.dpp.dgam_rom_caps.pq = 1;
+       dc->caps.color.dpp.dgam_rom_caps.hlg = 1;
+       dc->caps.color.dpp.post_csc = 1;
+       dc->caps.color.dpp.gamma_corr = 1;
+       dc->caps.color.dpp.dgam_rom_for_yuv = 0;
+
+       dc->caps.color.dpp.hw_3d_lut = 1;
+       dc->caps.color.dpp.ogam_ram = 1;
+       // no OGAM ROM on DCN301
+       dc->caps.color.dpp.ogam_rom_caps.srgb = 0;
+       dc->caps.color.dpp.ogam_rom_caps.bt2020 = 0;
+       dc->caps.color.dpp.ogam_rom_caps.gamma2_2 = 0;
+       dc->caps.color.dpp.ogam_rom_caps.pq = 0;
+       dc->caps.color.dpp.ogam_rom_caps.hlg = 0;
+       dc->caps.color.dpp.ocsc = 0;
+
+       dc->caps.color.mpc.gamut_remap = 1;
+       dc->caps.color.mpc.num_3dluts = pool->base.res_cap->num_mpc_3dlut; //2
+       dc->caps.color.mpc.ogam_ram = 1;
+       dc->caps.color.mpc.ogam_rom_caps.srgb = 0;
+       dc->caps.color.mpc.ogam_rom_caps.bt2020 = 0;
+       dc->caps.color.mpc.ogam_rom_caps.gamma2_2 = 0;
+       dc->caps.color.mpc.ogam_rom_caps.pq = 0;
+       dc->caps.color.mpc.ogam_rom_caps.hlg = 0;
+       dc->caps.color.mpc.ocsc = 1;
+
+       /* read VBIOS LTTPR caps */
+       {
+               if (ctx->dc_bios->funcs->get_lttpr_caps) {
+                       enum bp_result bp_query_result;
+                       uint8_t is_vbios_lttpr_enable = 0;
+
+                       bp_query_result = ctx->dc_bios->funcs->get_lttpr_caps(ctx->dc_bios, &is_vbios_lttpr_enable);
+                       dc->caps.vbios_lttpr_enable = (bp_query_result == BP_RESULT_OK) && !!is_vbios_lttpr_enable;
+               }
+
+               /* interop bit is implicit */
+               {
+                       dc->caps.vbios_lttpr_aware = true;
+               }
+       }
+
+       if (dc->ctx->dce_environment == DCE_ENV_PRODUCTION_DRV)
+               dc->debug = debug_defaults_drv;
+
+       // Init the vm_helper
+       if (dc->vm_helper)
+               vm_helper_init(dc->vm_helper, 16);
+
+       /*************************************************
+        *  Create resources                             *
+        *************************************************/
+
+       /* Clock Sources for Pixel Clock*/
+       pool->base.clock_sources[DCN31_CLK_SRC_PLL0] =
+                       dcn31_clock_source_create(ctx, ctx->dc_bios,
+                               CLOCK_SOURCE_COMBO_PHY_PLL0,
+                               &clk_src_regs[0], false);
+       pool->base.clock_sources[DCN31_CLK_SRC_PLL1] =
+                       dcn31_clock_source_create(ctx, ctx->dc_bios,
+                               CLOCK_SOURCE_COMBO_PHY_PLL1,
+                               &clk_src_regs[1], false);
+       pool->base.clock_sources[DCN31_CLK_SRC_PLL2] =
+                       dcn31_clock_source_create(ctx, ctx->dc_bios,
+                               CLOCK_SOURCE_COMBO_PHY_PLL2,
+                               &clk_src_regs[2], false);
+       pool->base.clock_sources[DCN31_CLK_SRC_PLL3] =
+                       dcn31_clock_source_create(ctx, ctx->dc_bios,
+                               CLOCK_SOURCE_COMBO_PHY_PLL3,
+                               &clk_src_regs[3], false);
+       pool->base.clock_sources[DCN31_CLK_SRC_PLL4] =
+                       dcn31_clock_source_create(ctx, ctx->dc_bios,
+                               CLOCK_SOURCE_COMBO_PHY_PLL4,
+                               &clk_src_regs[4], false);
+
+       pool->base.clk_src_count = DCN30_CLK_SRC_TOTAL;
+
+       /* todo: not reuse phy_pll registers */
+       pool->base.dp_clock_source =
+                       dcn31_clock_source_create(ctx, ctx->dc_bios,
+                               CLOCK_SOURCE_ID_DP_DTO,
+                               &clk_src_regs[0], true);
+
+       for (i = 0; i < pool->base.clk_src_count; i++) {
+               if (pool->base.clock_sources[i] == NULL) {
+                       dm_error("DC: failed to create clock sources!\n");
+                       BREAK_TO_DEBUGGER();
+                       goto create_fail;
+               }
+       }
+
+       /* TODO: DCCG */
+       pool->base.dccg = dccg31_create(ctx, &dccg_regs, &dccg_shift, &dccg_mask);
+       if (pool->base.dccg == NULL) {
+               dm_error("DC: failed to create dccg!\n");
+               BREAK_TO_DEBUGGER();
+               goto create_fail;
+       }
+
+       /* TODO: IRQ */
+       init_data.ctx = dc->ctx;
+       pool->base.irqs = dal_irq_service_dcn315_create(&init_data);
+       if (!pool->base.irqs)
+               goto create_fail;
+
+       /* HUBBUB */
+       pool->base.hubbub = dcn31_hubbub_create(ctx);
+       if (pool->base.hubbub == NULL) {
+               BREAK_TO_DEBUGGER();
+               dm_error("DC: failed to create hubbub!\n");
+               goto create_fail;
+       }
+
+       /* HUBPs, DPPs, OPPs and TGs */
+       for (i = 0; i < pool->base.pipe_count; i++) {
+               pool->base.hubps[i] = dcn31_hubp_create(ctx, i);
+               if (pool->base.hubps[i] == NULL) {
+                       BREAK_TO_DEBUGGER();
+                       dm_error(
+                               "DC: failed to create hubps!\n");
+                       goto create_fail;
+               }
+
+               pool->base.dpps[i] = dcn31_dpp_create(ctx, i);
+               if (pool->base.dpps[i] == NULL) {
+                       BREAK_TO_DEBUGGER();
+                       dm_error(
+                               "DC: failed to create dpps!\n");
+                       goto create_fail;
+               }
+       }
+
+       for (i = 0; i < pool->base.res_cap->num_opp; i++) {
+               pool->base.opps[i] = dcn31_opp_create(ctx, i);
+               if (pool->base.opps[i] == NULL) {
+                       BREAK_TO_DEBUGGER();
+                       dm_error(
+                               "DC: failed to create output pixel processor!\n");
+                       goto create_fail;
+               }
+       }
+
+       for (i = 0; i < pool->base.res_cap->num_timing_generator; i++) {
+               pool->base.timing_generators[i] = dcn31_timing_generator_create(
+                               ctx, i);
+               if (pool->base.timing_generators[i] == NULL) {
+                       BREAK_TO_DEBUGGER();
+                       dm_error("DC: failed to create tg!\n");
+                       goto create_fail;
+               }
+       }
+       pool->base.timing_generator_count = i;
+
+       /* PSR */
+       pool->base.psr = dmub_psr_create(ctx);
+       if (pool->base.psr == NULL) {
+               dm_error("DC: failed to create psr obj!\n");
+               BREAK_TO_DEBUGGER();
+               goto create_fail;
+       }
+
+       /* ABM */
+       for (i = 0; i < pool->base.res_cap->num_timing_generator; i++) {
+               pool->base.multiple_abms[i] = dmub_abm_create(ctx,
+                               &abm_regs[i],
+                               &abm_shift,
+                               &abm_mask);
+               if (pool->base.multiple_abms[i] == NULL) {
+                       dm_error("DC: failed to create abm for pipe %d!\n", i);
+                       BREAK_TO_DEBUGGER();
+                       goto create_fail;
+               }
+       }
+
+       /* MPC and DSC */
+       pool->base.mpc = dcn31_mpc_create(ctx, pool->base.mpcc_count, pool->base.res_cap->num_mpc_3dlut);
+       if (pool->base.mpc == NULL) {
+               BREAK_TO_DEBUGGER();
+               dm_error("DC: failed to create mpc!\n");
+               goto create_fail;
+       }
+
+       for (i = 0; i < pool->base.res_cap->num_dsc; i++) {
+               pool->base.dscs[i] = dcn31_dsc_create(ctx, i);
+               if (pool->base.dscs[i] == NULL) {
+                       BREAK_TO_DEBUGGER();
+                       dm_error("DC: failed to create display stream compressor %d!\n", i);
+                       goto create_fail;
+               }
+       }
+
+       /* DWB and MMHUBBUB */
+       if (!dcn31_dwbc_create(ctx, &pool->base)) {
+               BREAK_TO_DEBUGGER();
+               dm_error("DC: failed to create dwbc!\n");
+               goto create_fail;
+       }
+
+       if (!dcn31_mmhubbub_create(ctx, &pool->base)) {
+               BREAK_TO_DEBUGGER();
+               dm_error("DC: failed to create mcif_wb!\n");
+               goto create_fail;
+       }
+
+       /* AUX and I2C */
+       for (i = 0; i < pool->base.res_cap->num_ddc; i++) {
+               pool->base.engines[i] = dcn31_aux_engine_create(ctx, i);
+               if (pool->base.engines[i] == NULL) {
+                       BREAK_TO_DEBUGGER();
+                       dm_error(
+                               "DC:failed to create aux engine!!\n");
+                       goto create_fail;
+               }
+               pool->base.hw_i2cs[i] = dcn31_i2c_hw_create(ctx, i);
+               if (pool->base.hw_i2cs[i] == NULL) {
+                       BREAK_TO_DEBUGGER();
+                       dm_error(
+                               "DC:failed to create hw i2c!!\n");
+                       goto create_fail;
+               }
+               pool->base.sw_i2cs[i] = NULL;
+       }
+
+       /* Audio, Stream Encoders including HPO and virtual, MPC 3D LUTs */
+       if (!resource_construct(num_virtual_links, dc, &pool->base,
+                       &res_create_funcs))
+               goto create_fail;
+
+       /* HW Sequencer and Plane caps */
+       dcn31_hw_sequencer_construct(dc);
+
+       dc->caps.max_planes =  pool->base.pipe_count;
+
+       for (i = 0; i < dc->caps.max_planes; ++i)
+               dc->caps.planes[i] = plane_cap;
+
+       dc->cap_funcs = cap_funcs;
+
+       dc->dcn_ip->max_num_dpp = dcn3_15_ip.max_num_dpp;
+
+       return true;
+
+create_fail:
+
+       dcn315_resource_destruct(pool);
+
+       return false;
+}
+
+struct resource_pool *dcn315_create_resource_pool(
+               const struct dc_init_data *init_data,
+               struct dc *dc)
+{
+       struct dcn315_resource_pool *pool =
+               kzalloc(sizeof(struct dcn315_resource_pool), GFP_KERNEL);
+
+       if (!pool)
+               return NULL;
+
+       if (dcn315_resource_construct(init_data->num_virtual_links, dc, pool))
+               return &pool->base;
+
+       BREAK_TO_DEBUGGER();
+       kfree(pool);
+       return NULL;
+}
diff --git a/drivers/gpu/drm/amd/display/dc/resource/dcn315/dcn315_resource.h b/drivers/gpu/drm/amd/display/dc/resource/dcn315/dcn315_resource.h
new file mode 100644 (file)
index 0000000..22849ea
--- /dev/null
@@ -0,0 +1,44 @@
+/*
+ * 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 _DCN315_RESOURCE_H_
+#define _DCN315_RESOURCE_H_
+
+#include "core_types.h"
+
+#define TO_DCN315_RES_POOL(pool)\
+       container_of(pool, struct dcn315_resource_pool, base)
+
+extern struct _vcs_dpi_ip_params_st dcn3_15_ip;
+
+struct dcn315_resource_pool {
+       struct resource_pool base;
+};
+
+struct resource_pool *dcn315_create_resource_pool(
+               const struct dc_init_data *init_data,
+               struct dc *dc);
+
+#endif /* _DCN315_RESOURCE_H_ */
diff --git a/drivers/gpu/drm/amd/display/dc/resource/dcn316/dcn316_resource.c b/drivers/gpu/drm/amd/display/dc/resource/dcn316/dcn316_resource.c
new file mode 100644 (file)
index 0000000..b9753d4
--- /dev/null
@@ -0,0 +1,2038 @@
+/*
+ * 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 "dm_services.h"
+#include "dc.h"
+
+#include "dcn31/dcn31_init.h"
+
+#include "resource.h"
+#include "include/irq_service_interface.h"
+#include "dcn316_resource.h"
+
+#include "dcn20/dcn20_resource.h"
+#include "dcn30/dcn30_resource.h"
+#include "dcn31/dcn31_resource.h"
+
+#include "dcn10/dcn10_ipp.h"
+#include "dcn30/dcn30_hubbub.h"
+#include "dcn31/dcn31_hubbub.h"
+#include "dcn30/dcn30_mpc.h"
+#include "dcn31/dcn31_hubp.h"
+#include "irq/dcn31/irq_service_dcn31.h"
+#include "dcn30/dcn30_dpp.h"
+#include "dcn31/dcn31_optc.h"
+#include "dcn20/dcn20_hwseq.h"
+#include "dcn30/dcn30_hwseq.h"
+#include "dce110/dce110_hwseq.h"
+#include "dcn30/dcn30_opp.h"
+#include "dcn20/dcn20_dsc.h"
+#include "dcn30/dcn30_vpg.h"
+#include "dcn30/dcn30_afmt.h"
+#include "dcn30/dcn30_dio_stream_encoder.h"
+#include "dcn31/dcn31_hpo_dp_stream_encoder.h"
+#include "dcn31/dcn31_hpo_dp_link_encoder.h"
+#include "dcn31/dcn31_apg.h"
+#include "dcn31/dcn31_dio_link_encoder.h"
+#include "dcn31/dcn31_vpg.h"
+#include "dcn31/dcn31_afmt.h"
+#include "dce/dce_clock_source.h"
+#include "dce/dce_audio.h"
+#include "dce/dce_hwseq.h"
+#include "clk_mgr.h"
+#include "virtual/virtual_stream_encoder.h"
+#include "dce110/dce110_resource.h"
+#include "dml/display_mode_vba.h"
+#include "dml/dcn31/dcn31_fpu.h"
+#include "dcn31/dcn31_dccg.h"
+#include "dcn10/dcn10_resource.h"
+#include "dcn31/dcn31_panel_cntl.h"
+
+#include "dcn30/dcn30_dwb.h"
+#include "dcn30/dcn30_mmhubbub.h"
+
+#include "dcn/dcn_3_1_6_offset.h"
+#include "dcn/dcn_3_1_6_sh_mask.h"
+#include "dpcs/dpcs_4_2_3_offset.h"
+#include "dpcs/dpcs_4_2_3_sh_mask.h"
+
+#define regBIF_BX1_BIOS_SCRATCH_2                                                                       0x003a
+#define regBIF_BX1_BIOS_SCRATCH_2_BASE_IDX                                                              1
+#define regBIF_BX1_BIOS_SCRATCH_3                                                                       0x003b
+#define regBIF_BX1_BIOS_SCRATCH_3_BASE_IDX                                                              1
+#define regBIF_BX1_BIOS_SCRATCH_6                                                                       0x003e
+#define regBIF_BX1_BIOS_SCRATCH_6_BASE_IDX                                                              1
+
+#define regDCHUBBUB_DEBUG_CTRL_0                                              0x04d6
+#define regDCHUBBUB_DEBUG_CTRL_0_BASE_IDX                                     2
+#define DCHUBBUB_DEBUG_CTRL_0__DET_DEPTH__SHIFT                               0x10
+#define DCHUBBUB_DEBUG_CTRL_0__DET_DEPTH_MASK                                 0x01FF0000L
+
+#define DCN_BASE__INST0_SEG0                       0x00000012
+#define DCN_BASE__INST0_SEG1                       0x000000C0
+#define DCN_BASE__INST0_SEG2                       0x000034C0
+#define DCN_BASE__INST0_SEG3                       0x00009000
+#define DCN_BASE__INST0_SEG4                       0x02403C00
+#define DCN_BASE__INST0_SEG5                       0
+
+#define DPCS_BASE__INST0_SEG0                      0x00000012
+#define DPCS_BASE__INST0_SEG1                      0x000000C0
+#define DPCS_BASE__INST0_SEG2                      0x000034C0
+#define DPCS_BASE__INST0_SEG3                      0x00009000
+#define DPCS_BASE__INST0_SEG4                      0x02403C00
+#define DPCS_BASE__INST0_SEG5                      0
+
+#define NBIO_BASE__INST0_SEG0                      0x00000000
+#define NBIO_BASE__INST0_SEG1                      0x00000014
+#define NBIO_BASE__INST0_SEG2                      0x00000D20
+#define NBIO_BASE__INST0_SEG3                      0x00010400
+#define NBIO_BASE__INST0_SEG4                      0x0241B000
+#define NBIO_BASE__INST0_SEG5                      0x04040000
+
+#include "reg_helper.h"
+#include "dce/dmub_abm.h"
+#include "dce/dmub_psr.h"
+#include "dce/dce_aux.h"
+#include "dce/dce_i2c.h"
+
+#include "dml/dcn30/display_mode_vba_30.h"
+#include "vm_helper.h"
+#include "dcn20/dcn20_vmid.h"
+
+#include "link_enc_cfg.h"
+
+#define DCN3_16_MAX_DET_SIZE 384
+#define DCN3_16_MIN_COMPBUF_SIZE_KB 128
+#define DCN3_16_CRB_SEGMENT_SIZE_KB 64
+
+enum dcn31_clk_src_array_id {
+       DCN31_CLK_SRC_PLL0,
+       DCN31_CLK_SRC_PLL1,
+       DCN31_CLK_SRC_PLL2,
+       DCN31_CLK_SRC_PLL3,
+       DCN31_CLK_SRC_PLL4,
+       DCN30_CLK_SRC_TOTAL
+};
+
+/* begin *********************
+ * macros to expend register list macro defined in HW object header file
+ */
+
+/* DCN */
+#define BASE_INNER(seg) DCN_BASE__INST0_SEG ## seg
+
+#define BASE(seg) BASE_INNER(seg)
+
+#define SR(reg_name)\
+               .reg_name = BASE(reg ## reg_name ## _BASE_IDX) +  \
+                                       reg ## reg_name
+
+#define SRI(reg_name, block, id)\
+       .reg_name = BASE(reg ## block ## id ## _ ## reg_name ## _BASE_IDX) + \
+                                       reg ## block ## id ## _ ## reg_name
+
+#define SRI2(reg_name, block, id)\
+       .reg_name = BASE(reg ## reg_name ## _BASE_IDX) + \
+                                       reg ## reg_name
+
+#define SRIR(var_name, reg_name, block, id)\
+       .var_name = BASE(reg ## block ## id ## _ ## reg_name ## _BASE_IDX) + \
+                                       reg ## block ## id ## _ ## reg_name
+
+#define SRII(reg_name, block, id)\
+       .reg_name[id] = BASE(reg ## block ## id ## _ ## reg_name ## _BASE_IDX) + \
+                                       reg ## block ## id ## _ ## reg_name
+
+#define SRII_MPC_RMU(reg_name, block, id)\
+       .RMU##_##reg_name[id] = BASE(reg ## block ## id ## _ ## reg_name ## _BASE_IDX) + \
+                                       reg ## block ## id ## _ ## reg_name
+
+#define SRII_DWB(reg_name, temp_name, block, id)\
+       .reg_name[id] = BASE(reg ## block ## id ## _ ## temp_name ## _BASE_IDX) + \
+                                       reg ## block ## id ## _ ## temp_name
+
+#define SF_DWB2(reg_name, block, id, field_name, post_fix)     \
+       .field_name = reg_name ## __ ## field_name ## post_fix
+
+#define DCCG_SRII(reg_name, block, id)\
+       .block ## _ ## reg_name[id] = BASE(reg ## block ## id ## _ ## reg_name ## _BASE_IDX) + \
+                                       reg ## block ## id ## _ ## reg_name
+
+#define VUPDATE_SRII(reg_name, block, id)\
+       .reg_name[id] = BASE(reg ## reg_name ## _ ## block ## id ## _BASE_IDX) + \
+                                       reg ## reg_name ## _ ## block ## id
+
+/* NBIO */
+#define NBIO_BASE_INNER(seg) \
+       NBIO_BASE__INST0_SEG ## seg
+
+#define NBIO_BASE(seg) \
+       NBIO_BASE_INNER(seg)
+
+#define NBIO_SR(reg_name)\
+               .reg_name = NBIO_BASE(regBIF_BX1_ ## reg_name ## _BASE_IDX) + \
+                                       regBIF_BX1_ ## reg_name
+
+static const struct bios_registers bios_regs = {
+               NBIO_SR(BIOS_SCRATCH_3),
+               NBIO_SR(BIOS_SCRATCH_6)
+};
+
+#define clk_src_regs(index, pllid)\
+[index] = {\
+       CS_COMMON_REG_LIST_DCN3_0(index, pllid),\
+}
+
+static const struct dce110_clk_src_regs clk_src_regs[] = {
+       clk_src_regs(0, A),
+       clk_src_regs(1, B),
+       clk_src_regs(2, C),
+       clk_src_regs(3, D),
+       clk_src_regs(4, E)
+};
+
+static const struct dce110_clk_src_shift cs_shift = {
+               CS_COMMON_MASK_SH_LIST_DCN2_0(__SHIFT)
+};
+
+static const struct dce110_clk_src_mask cs_mask = {
+               CS_COMMON_MASK_SH_LIST_DCN2_0(_MASK)
+};
+
+#define abm_regs(id)\
+[id] = {\
+               ABM_DCN302_REG_LIST(id)\
+}
+
+static const struct dce_abm_registers abm_regs[] = {
+               abm_regs(0),
+               abm_regs(1),
+               abm_regs(2),
+               abm_regs(3),
+};
+
+static const struct dce_abm_shift abm_shift = {
+               ABM_MASK_SH_LIST_DCN30(__SHIFT)
+};
+
+static const struct dce_abm_mask abm_mask = {
+               ABM_MASK_SH_LIST_DCN30(_MASK)
+};
+
+#define audio_regs(id)\
+[id] = {\
+               AUD_COMMON_REG_LIST(id)\
+}
+
+static const struct dce_audio_registers audio_regs[] = {
+       audio_regs(0),
+       audio_regs(1),
+       audio_regs(2),
+       audio_regs(3),
+       audio_regs(4),
+       audio_regs(5),
+       audio_regs(6)
+};
+
+#define DCE120_AUD_COMMON_MASK_SH_LIST(mask_sh)\
+               SF(AZF0ENDPOINT0_AZALIA_F0_CODEC_ENDPOINT_INDEX, AZALIA_ENDPOINT_REG_INDEX, mask_sh),\
+               SF(AZF0ENDPOINT0_AZALIA_F0_CODEC_ENDPOINT_DATA, AZALIA_ENDPOINT_REG_DATA, mask_sh),\
+               AUD_COMMON_MASK_SH_LIST_BASE(mask_sh)
+
+static const struct dce_audio_shift audio_shift = {
+               DCE120_AUD_COMMON_MASK_SH_LIST(__SHIFT)
+};
+
+static const struct dce_audio_mask audio_mask = {
+               DCE120_AUD_COMMON_MASK_SH_LIST(_MASK)
+};
+
+#define vpg_regs(id)\
+[id] = {\
+       VPG_DCN31_REG_LIST(id)\
+}
+
+static const struct dcn31_vpg_registers vpg_regs[] = {
+       vpg_regs(0),
+       vpg_regs(1),
+       vpg_regs(2),
+       vpg_regs(3),
+       vpg_regs(4),
+       vpg_regs(5),
+       vpg_regs(6),
+       vpg_regs(7),
+       vpg_regs(8),
+       vpg_regs(9),
+};
+
+static const struct dcn31_vpg_shift vpg_shift = {
+       DCN31_VPG_MASK_SH_LIST(__SHIFT)
+};
+
+static const struct dcn31_vpg_mask vpg_mask = {
+       DCN31_VPG_MASK_SH_LIST(_MASK)
+};
+
+#define afmt_regs(id)\
+[id] = {\
+       AFMT_DCN31_REG_LIST(id)\
+}
+
+static const struct dcn31_afmt_registers afmt_regs[] = {
+       afmt_regs(0),
+       afmt_regs(1),
+       afmt_regs(2),
+       afmt_regs(3),
+       afmt_regs(4),
+       afmt_regs(5)
+};
+
+static const struct dcn31_afmt_shift afmt_shift = {
+       DCN31_AFMT_MASK_SH_LIST(__SHIFT)
+};
+
+static const struct dcn31_afmt_mask afmt_mask = {
+       DCN31_AFMT_MASK_SH_LIST(_MASK)
+};
+
+
+#define apg_regs(id)\
+[id] = {\
+       APG_DCN31_REG_LIST(id)\
+}
+
+static const struct dcn31_apg_registers apg_regs[] = {
+       apg_regs(0),
+       apg_regs(1),
+       apg_regs(2),
+       apg_regs(3)
+};
+
+static const struct dcn31_apg_shift apg_shift = {
+       DCN31_APG_MASK_SH_LIST(__SHIFT)
+};
+
+static const struct dcn31_apg_mask apg_mask = {
+               DCN31_APG_MASK_SH_LIST(_MASK)
+};
+
+
+#define stream_enc_regs(id)\
+[id] = {\
+       SE_DCN3_REG_LIST(id)\
+}
+
+static const struct dcn10_stream_enc_registers stream_enc_regs[] = {
+       stream_enc_regs(0),
+       stream_enc_regs(1),
+       stream_enc_regs(2),
+       stream_enc_regs(3),
+       stream_enc_regs(4)
+};
+
+static const struct dcn10_stream_encoder_shift se_shift = {
+               SE_COMMON_MASK_SH_LIST_DCN30(__SHIFT)
+};
+
+static const struct dcn10_stream_encoder_mask se_mask = {
+               SE_COMMON_MASK_SH_LIST_DCN30(_MASK)
+};
+
+
+#define aux_regs(id)\
+[id] = {\
+       DCN2_AUX_REG_LIST(id)\
+}
+
+static const struct dcn10_link_enc_aux_registers link_enc_aux_regs[] = {
+               aux_regs(0),
+               aux_regs(1),
+               aux_regs(2),
+               aux_regs(3),
+               aux_regs(4)
+};
+
+#define hpd_regs(id)\
+[id] = {\
+       HPD_REG_LIST(id)\
+}
+
+static const struct dcn10_link_enc_hpd_registers link_enc_hpd_regs[] = {
+               hpd_regs(0),
+               hpd_regs(1),
+               hpd_regs(2),
+               hpd_regs(3),
+               hpd_regs(4)
+};
+
+#define link_regs(id, phyid)\
+[id] = {\
+       LE_DCN31_REG_LIST(id), \
+       UNIPHY_DCN2_REG_LIST(phyid), \
+       DPCS_DCN31_REG_LIST(id), \
+}
+
+static const struct dce110_aux_registers_shift aux_shift = {
+       DCN_AUX_MASK_SH_LIST(__SHIFT)
+};
+
+static const struct dce110_aux_registers_mask aux_mask = {
+       DCN_AUX_MASK_SH_LIST(_MASK)
+};
+
+static const struct dcn10_link_enc_registers link_enc_regs[] = {
+       link_regs(0, A),
+       link_regs(1, B),
+       link_regs(2, C),
+       link_regs(3, D),
+       link_regs(4, E)
+};
+
+static const struct dcn10_link_enc_shift le_shift = {
+       LINK_ENCODER_MASK_SH_LIST_DCN31(__SHIFT), \
+       DPCS_DCN31_MASK_SH_LIST(__SHIFT)
+};
+
+static const struct dcn10_link_enc_mask le_mask = {
+       LINK_ENCODER_MASK_SH_LIST_DCN31(_MASK), \
+       DPCS_DCN31_MASK_SH_LIST(_MASK)
+};
+
+
+
+#define hpo_dp_stream_encoder_reg_list(id)\
+[id] = {\
+       DCN3_1_HPO_DP_STREAM_ENC_REG_LIST(id)\
+}
+
+static const struct dcn31_hpo_dp_stream_encoder_registers hpo_dp_stream_enc_regs[] = {
+       hpo_dp_stream_encoder_reg_list(0),
+       hpo_dp_stream_encoder_reg_list(1),
+       hpo_dp_stream_encoder_reg_list(2),
+       hpo_dp_stream_encoder_reg_list(3),
+};
+
+static const struct dcn31_hpo_dp_stream_encoder_shift hpo_dp_se_shift = {
+       DCN3_1_HPO_DP_STREAM_ENC_MASK_SH_LIST(__SHIFT)
+};
+
+static const struct dcn31_hpo_dp_stream_encoder_mask hpo_dp_se_mask = {
+       DCN3_1_HPO_DP_STREAM_ENC_MASK_SH_LIST(_MASK)
+};
+
+
+#define hpo_dp_link_encoder_reg_list(id)\
+[id] = {\
+       DCN3_1_HPO_DP_LINK_ENC_REG_LIST(id),\
+       DCN3_1_RDPCSTX_REG_LIST(0),\
+       DCN3_1_RDPCSTX_REG_LIST(1),\
+       DCN3_1_RDPCSTX_REG_LIST(2),\
+       DCN3_1_RDPCSTX_REG_LIST(3),\
+       DCN3_1_RDPCSTX_REG_LIST(4)\
+}
+
+static const struct dcn31_hpo_dp_link_encoder_registers hpo_dp_link_enc_regs[] = {
+       hpo_dp_link_encoder_reg_list(0),
+       hpo_dp_link_encoder_reg_list(1),
+};
+
+static const struct dcn31_hpo_dp_link_encoder_shift hpo_dp_le_shift = {
+       DCN3_1_HPO_DP_LINK_ENC_MASK_SH_LIST(__SHIFT)
+};
+
+static const struct dcn31_hpo_dp_link_encoder_mask hpo_dp_le_mask = {
+       DCN3_1_HPO_DP_LINK_ENC_MASK_SH_LIST(_MASK)
+};
+
+
+#define dpp_regs(id)\
+[id] = {\
+       DPP_REG_LIST_DCN30(id),\
+}
+
+static const struct dcn3_dpp_registers dpp_regs[] = {
+       dpp_regs(0),
+       dpp_regs(1),
+       dpp_regs(2),
+       dpp_regs(3)
+};
+
+static const struct dcn3_dpp_shift tf_shift = {
+               DPP_REG_LIST_SH_MASK_DCN30(__SHIFT)
+};
+
+static const struct dcn3_dpp_mask tf_mask = {
+               DPP_REG_LIST_SH_MASK_DCN30(_MASK)
+};
+
+#define opp_regs(id)\
+[id] = {\
+       OPP_REG_LIST_DCN30(id),\
+}
+
+static const struct dcn20_opp_registers opp_regs[] = {
+       opp_regs(0),
+       opp_regs(1),
+       opp_regs(2),
+       opp_regs(3)
+};
+
+static const struct dcn20_opp_shift opp_shift = {
+       OPP_MASK_SH_LIST_DCN20(__SHIFT)
+};
+
+static const struct dcn20_opp_mask opp_mask = {
+       OPP_MASK_SH_LIST_DCN20(_MASK)
+};
+
+#define aux_engine_regs(id)\
+[id] = {\
+       AUX_COMMON_REG_LIST0(id), \
+       .AUXN_IMPCAL = 0, \
+       .AUXP_IMPCAL = 0, \
+       .AUX_RESET_MASK = DP_AUX0_AUX_CONTROL__AUX_RESET_MASK, \
+}
+
+static const struct dce110_aux_registers aux_engine_regs[] = {
+               aux_engine_regs(0),
+               aux_engine_regs(1),
+               aux_engine_regs(2),
+               aux_engine_regs(3),
+               aux_engine_regs(4)
+};
+
+#define dwbc_regs_dcn3(id)\
+[id] = {\
+       DWBC_COMMON_REG_LIST_DCN30(id),\
+}
+
+static const struct dcn30_dwbc_registers dwbc30_regs[] = {
+       dwbc_regs_dcn3(0),
+};
+
+static const struct dcn30_dwbc_shift dwbc30_shift = {
+       DWBC_COMMON_MASK_SH_LIST_DCN30(__SHIFT)
+};
+
+static const struct dcn30_dwbc_mask dwbc30_mask = {
+       DWBC_COMMON_MASK_SH_LIST_DCN30(_MASK)
+};
+
+#define mcif_wb_regs_dcn3(id)\
+[id] = {\
+       MCIF_WB_COMMON_REG_LIST_DCN30(id),\
+}
+
+static const struct dcn30_mmhubbub_registers mcif_wb30_regs[] = {
+       mcif_wb_regs_dcn3(0)
+};
+
+static const struct dcn30_mmhubbub_shift mcif_wb30_shift = {
+       MCIF_WB_COMMON_MASK_SH_LIST_DCN30(__SHIFT)
+};
+
+static const struct dcn30_mmhubbub_mask mcif_wb30_mask = {
+       MCIF_WB_COMMON_MASK_SH_LIST_DCN30(_MASK)
+};
+
+#define dsc_regsDCN20(id)\
+[id] = {\
+       DSC_REG_LIST_DCN20(id)\
+}
+
+static const struct dcn20_dsc_registers dsc_regs[] = {
+       dsc_regsDCN20(0),
+       dsc_regsDCN20(1),
+       dsc_regsDCN20(2)
+};
+
+static const struct dcn20_dsc_shift dsc_shift = {
+       DSC_REG_LIST_SH_MASK_DCN20(__SHIFT)
+};
+
+static const struct dcn20_dsc_mask dsc_mask = {
+       DSC_REG_LIST_SH_MASK_DCN20(_MASK)
+};
+
+static const struct dcn30_mpc_registers mpc_regs = {
+               MPC_REG_LIST_DCN3_0(0),
+               MPC_REG_LIST_DCN3_0(1),
+               MPC_REG_LIST_DCN3_0(2),
+               MPC_REG_LIST_DCN3_0(3),
+               MPC_OUT_MUX_REG_LIST_DCN3_0(0),
+               MPC_OUT_MUX_REG_LIST_DCN3_0(1),
+               MPC_OUT_MUX_REG_LIST_DCN3_0(2),
+               MPC_OUT_MUX_REG_LIST_DCN3_0(3),
+               MPC_RMU_GLOBAL_REG_LIST_DCN3AG,
+               MPC_RMU_REG_LIST_DCN3AG(0),
+               MPC_RMU_REG_LIST_DCN3AG(1),
+               //MPC_RMU_REG_LIST_DCN3AG(2),
+               MPC_DWB_MUX_REG_LIST_DCN3_0(0),
+};
+
+static const struct dcn30_mpc_shift mpc_shift = {
+       MPC_COMMON_MASK_SH_LIST_DCN30(__SHIFT)
+};
+
+static const struct dcn30_mpc_mask mpc_mask = {
+       MPC_COMMON_MASK_SH_LIST_DCN30(_MASK)
+};
+
+#define optc_regs(id)\
+[id] = {OPTC_COMMON_REG_LIST_DCN3_1(id)}
+
+static const struct dcn_optc_registers optc_regs[] = {
+       optc_regs(0),
+       optc_regs(1),
+       optc_regs(2),
+       optc_regs(3)
+};
+
+static const struct dcn_optc_shift optc_shift = {
+       OPTC_COMMON_MASK_SH_LIST_DCN3_1(__SHIFT)
+};
+
+static const struct dcn_optc_mask optc_mask = {
+       OPTC_COMMON_MASK_SH_LIST_DCN3_1(_MASK)
+};
+
+#define hubp_regs(id)\
+[id] = {\
+       HUBP_REG_LIST_DCN30(id)\
+}
+
+static const struct dcn_hubp2_registers hubp_regs[] = {
+               hubp_regs(0),
+               hubp_regs(1),
+               hubp_regs(2),
+               hubp_regs(3)
+};
+
+
+static const struct dcn_hubp2_shift hubp_shift = {
+               HUBP_MASK_SH_LIST_DCN31(__SHIFT)
+};
+
+static const struct dcn_hubp2_mask hubp_mask = {
+               HUBP_MASK_SH_LIST_DCN31(_MASK)
+};
+static const struct dcn_hubbub_registers hubbub_reg = {
+               HUBBUB_REG_LIST_DCN31(0)
+};
+
+static const struct dcn_hubbub_shift hubbub_shift = {
+               HUBBUB_MASK_SH_LIST_DCN31(__SHIFT)
+};
+
+static const struct dcn_hubbub_mask hubbub_mask = {
+               HUBBUB_MASK_SH_LIST_DCN31(_MASK)
+};
+
+static const struct dccg_registers dccg_regs = {
+               DCCG_REG_LIST_DCN31()
+};
+
+static const struct dccg_shift dccg_shift = {
+               DCCG_MASK_SH_LIST_DCN31(__SHIFT)
+};
+
+static const struct dccg_mask dccg_mask = {
+               DCCG_MASK_SH_LIST_DCN31(_MASK)
+};
+
+
+#define SRII2(reg_name_pre, reg_name_post, id)\
+       .reg_name_pre ## _ ##  reg_name_post[id] = BASE(reg ## reg_name_pre \
+                       ## id ## _ ## reg_name_post ## _BASE_IDX) + \
+                       reg ## reg_name_pre ## id ## _ ## reg_name_post
+
+
+#define HWSEQ_DCN31_REG_LIST()\
+       SR(DCHUBBUB_GLOBAL_TIMER_CNTL), \
+       SR(DCHUBBUB_ARB_HOSTVM_CNTL), \
+       SR(DIO_MEM_PWR_CTRL), \
+       SR(ODM_MEM_PWR_CTRL3), \
+       SR(DMU_MEM_PWR_CNTL), \
+       SR(MMHUBBUB_MEM_PWR_CNTL), \
+       SR(DCCG_GATE_DISABLE_CNTL), \
+       SR(DCCG_GATE_DISABLE_CNTL2), \
+       SR(DCFCLK_CNTL),\
+       SR(DC_MEM_GLOBAL_PWR_REQ_CNTL), \
+       SRII(PIXEL_RATE_CNTL, OTG, 0), \
+       SRII(PIXEL_RATE_CNTL, OTG, 1),\
+       SRII(PIXEL_RATE_CNTL, OTG, 2),\
+       SRII(PIXEL_RATE_CNTL, OTG, 3),\
+       SRII(PHYPLL_PIXEL_RATE_CNTL, OTG, 0),\
+       SRII(PHYPLL_PIXEL_RATE_CNTL, OTG, 1),\
+       SRII(PHYPLL_PIXEL_RATE_CNTL, OTG, 2),\
+       SRII(PHYPLL_PIXEL_RATE_CNTL, OTG, 3),\
+       SR(MICROSECOND_TIME_BASE_DIV), \
+       SR(MILLISECOND_TIME_BASE_DIV), \
+       SR(DISPCLK_FREQ_CHANGE_CNTL), \
+       SR(RBBMIF_TIMEOUT_DIS), \
+       SR(RBBMIF_TIMEOUT_DIS_2), \
+       SR(DCHUBBUB_CRC_CTRL), \
+       SR(DPP_TOP0_DPP_CRC_CTRL), \
+       SR(DPP_TOP0_DPP_CRC_VAL_B_A), \
+       SR(DPP_TOP0_DPP_CRC_VAL_R_G), \
+       SR(MPC_CRC_CTRL), \
+       SR(MPC_CRC_RESULT_GB), \
+       SR(MPC_CRC_RESULT_C), \
+       SR(MPC_CRC_RESULT_AR), \
+       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(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(D1VGA_CONTROL), \
+       SR(D2VGA_CONTROL), \
+       SR(D3VGA_CONTROL), \
+       SR(D4VGA_CONTROL), \
+       SR(D5VGA_CONTROL), \
+       SR(D6VGA_CONTROL), \
+       SR(DC_IP_REQUEST_CNTL), \
+       SR(AZALIA_AUDIO_DTO), \
+       SR(AZALIA_CONTROLLER_CLOCK_GATING), \
+       SR(HPO_TOP_HW_CONTROL)
+
+static const struct dce_hwseq_registers hwseq_reg = {
+               HWSEQ_DCN31_REG_LIST()
+};
+
+#define HWSEQ_DCN31_MASK_SH_LIST(mask_sh)\
+       HWSEQ_DCN_MASK_SH_LIST(mask_sh), \
+       HWS_SF(, DCHUBBUB_GLOBAL_TIMER_CNTL, DCHUBBUB_GLOBAL_TIMER_REFDIV, mask_sh), \
+       HWS_SF(, DCHUBBUB_ARB_HOSTVM_CNTL, DISABLE_HOSTVM_FORCE_ALLOW_PSTATE, mask_sh), \
+       HWS_SF(, DOMAIN0_PG_CONFIG, DOMAIN_POWER_FORCEON, mask_sh), \
+       HWS_SF(, DOMAIN0_PG_CONFIG, DOMAIN_POWER_GATE, mask_sh), \
+       HWS_SF(, DOMAIN1_PG_CONFIG, DOMAIN_POWER_FORCEON, mask_sh), \
+       HWS_SF(, DOMAIN1_PG_CONFIG, DOMAIN_POWER_GATE, mask_sh), \
+       HWS_SF(, DOMAIN2_PG_CONFIG, DOMAIN_POWER_FORCEON, mask_sh), \
+       HWS_SF(, DOMAIN2_PG_CONFIG, DOMAIN_POWER_GATE, mask_sh), \
+       HWS_SF(, DOMAIN3_PG_CONFIG, DOMAIN_POWER_FORCEON, mask_sh), \
+       HWS_SF(, DOMAIN3_PG_CONFIG, DOMAIN_POWER_GATE, mask_sh), \
+       HWS_SF(, DOMAIN16_PG_CONFIG, DOMAIN_POWER_FORCEON, mask_sh), \
+       HWS_SF(, DOMAIN16_PG_CONFIG, DOMAIN_POWER_GATE, mask_sh), \
+       HWS_SF(, DOMAIN17_PG_CONFIG, DOMAIN_POWER_FORCEON, mask_sh), \
+       HWS_SF(, DOMAIN17_PG_CONFIG, DOMAIN_POWER_GATE, mask_sh), \
+       HWS_SF(, DOMAIN18_PG_CONFIG, DOMAIN_POWER_FORCEON, mask_sh), \
+       HWS_SF(, DOMAIN18_PG_CONFIG, DOMAIN_POWER_GATE, mask_sh), \
+       HWS_SF(, DOMAIN0_PG_STATUS, DOMAIN_PGFSM_PWR_STATUS, mask_sh), \
+       HWS_SF(, DOMAIN1_PG_STATUS, DOMAIN_PGFSM_PWR_STATUS, mask_sh), \
+       HWS_SF(, DOMAIN2_PG_STATUS, DOMAIN_PGFSM_PWR_STATUS, mask_sh), \
+       HWS_SF(, DOMAIN3_PG_STATUS, DOMAIN_PGFSM_PWR_STATUS, mask_sh), \
+       HWS_SF(, DOMAIN16_PG_STATUS, DOMAIN_PGFSM_PWR_STATUS, mask_sh), \
+       HWS_SF(, DOMAIN17_PG_STATUS, DOMAIN_PGFSM_PWR_STATUS, mask_sh), \
+       HWS_SF(, DOMAIN18_PG_STATUS, DOMAIN_PGFSM_PWR_STATUS, mask_sh), \
+       HWS_SF(, DC_IP_REQUEST_CNTL, IP_REQUEST_EN, mask_sh), \
+       HWS_SF(, AZALIA_AUDIO_DTO, AZALIA_AUDIO_DTO_MODULE, mask_sh), \
+       HWS_SF(, HPO_TOP_CLOCK_CONTROL, HPO_HDMISTREAMCLK_G_GATE_DIS, mask_sh), \
+       HWS_SF(, DMU_MEM_PWR_CNTL, DMCU_ERAM_MEM_PWR_FORCE, mask_sh), \
+       HWS_SF(, ODM_MEM_PWR_CTRL3, ODM_MEM_UNASSIGNED_PWR_MODE, mask_sh), \
+       HWS_SF(, ODM_MEM_PWR_CTRL3, ODM_MEM_VBLANK_PWR_MODE, mask_sh), \
+       HWS_SF(, MMHUBBUB_MEM_PWR_CNTL, VGA_MEM_PWR_FORCE, mask_sh), \
+       HWS_SF(, DIO_MEM_PWR_CTRL, I2C_LIGHT_SLEEP_FORCE, mask_sh), \
+       HWS_SF(, HPO_TOP_HW_CONTROL, HPO_IO_EN, mask_sh)
+
+static const struct dce_hwseq_shift hwseq_shift = {
+               HWSEQ_DCN31_MASK_SH_LIST(__SHIFT)
+};
+
+static const struct dce_hwseq_mask hwseq_mask = {
+               HWSEQ_DCN31_MASK_SH_LIST(_MASK)
+};
+#define vmid_regs(id)\
+[id] = {\
+               DCN20_VMID_REG_LIST(id)\
+}
+
+static const struct dcn_vmid_registers vmid_regs[] = {
+       vmid_regs(0),
+       vmid_regs(1),
+       vmid_regs(2),
+       vmid_regs(3),
+       vmid_regs(4),
+       vmid_regs(5),
+       vmid_regs(6),
+       vmid_regs(7),
+       vmid_regs(8),
+       vmid_regs(9),
+       vmid_regs(10),
+       vmid_regs(11),
+       vmid_regs(12),
+       vmid_regs(13),
+       vmid_regs(14),
+       vmid_regs(15)
+};
+
+static const struct dcn20_vmid_shift vmid_shifts = {
+               DCN20_VMID_MASK_SH_LIST(__SHIFT)
+};
+
+static const struct dcn20_vmid_mask vmid_masks = {
+               DCN20_VMID_MASK_SH_LIST(_MASK)
+};
+
+static const struct resource_caps res_cap_dcn31 = {
+       .num_timing_generator = 4,
+       .num_opp = 4,
+       .num_video_plane = 4,
+       .num_audio = 5,
+       .num_stream_encoder = 5,
+       .num_dig_link_enc = 5,
+       .num_hpo_dp_stream_encoder = 4,
+       .num_hpo_dp_link_encoder = 2,
+       .num_pll = 5,
+       .num_dwb = 1,
+       .num_ddc = 5,
+       .num_vmid = 16,
+       .num_mpc_3dlut = 2,
+       .num_dsc = 3,
+};
+
+static const struct dc_plane_cap plane_cap = {
+       .type = DC_PLANE_TYPE_DCN_UNIVERSAL,
+       .per_pixel_alpha = true,
+
+       .pixel_format_support = {
+                       .argb8888 = true,
+                       .nv12 = true,
+                       .fp16 = true,
+                       .p010 = true,
+                       .ayuv = false,
+       },
+
+       .max_upscale_factor = {
+                       .argb8888 = 16000,
+                       .nv12 = 16000,
+                       .fp16 = 16000
+       },
+
+       // 6:1 downscaling ratio: 1000/6 = 166.666
+       .max_downscale_factor = {
+                       .argb8888 = 167,
+                       .nv12 = 167,
+                       .fp16 = 167
+       },
+       64,
+       64
+};
+
+static const struct dc_debug_options debug_defaults_drv = {
+       .disable_z10 = true, /*hw not support it*/
+       .disable_dmcu = true,
+       .force_abm_enable = false,
+       .timing_trace = false,
+       .clock_trace = true,
+       .disable_pplib_clock_request = false,
+       .pipe_split_policy = MPC_SPLIT_DYNAMIC,
+       .force_single_disp_pipe_split = false,
+       .disable_dcc = DCC_ENABLE,
+       .vsr_support = true,
+       .performance_trace = false,
+       .max_downscale_src_width = 4096,/*upto true 4k*/
+       .disable_pplib_wm_range = false,
+       .scl_reset_length10 = true,
+       .sanity_checks = false,
+       .underflow_assert_delay_us = 0xFFFFFFFF,
+       .dwb_fi_phase = -1, // -1 = disable,
+       .dmub_command_table = true,
+       .pstate_enabled = true,
+       .use_max_lb = true,
+       .enable_mem_low_power = {
+               .bits = {
+                       .vga = true,
+                       .i2c = true,
+                       .dmcu = false, // This is previously known to cause hang on S3 cycles if enabled
+                       .dscl = true,
+                       .cm = true,
+                       .mpc = true,
+                       .optc = true,
+                       .vpg = true,
+                       .afmt = true,
+               }
+       },
+       .enable_legacy_fast_update = true,
+       .using_dml2 = false,
+};
+
+static const struct dc_panel_config panel_config_defaults = {
+       .psr = {
+               .disable_psr = false,
+               .disallow_psrsu = false,
+               .disallow_replay = false,
+       },
+       .ilr = {
+               .optimize_edp_link_rate = true,
+       },
+};
+
+static void dcn31_dpp_destroy(struct dpp **dpp)
+{
+       kfree(TO_DCN20_DPP(*dpp));
+       *dpp = NULL;
+}
+
+static struct dpp *dcn31_dpp_create(
+       struct dc_context *ctx,
+       uint32_t inst)
+{
+       struct dcn3_dpp *dpp =
+               kzalloc(sizeof(struct dcn3_dpp), GFP_KERNEL);
+
+       if (!dpp)
+               return NULL;
+
+       if (dpp3_construct(dpp, ctx, inst,
+                       &dpp_regs[inst], &tf_shift, &tf_mask))
+               return &dpp->base;
+
+       BREAK_TO_DEBUGGER();
+       kfree(dpp);
+       return NULL;
+}
+
+static struct output_pixel_processor *dcn31_opp_create(
+       struct dc_context *ctx, uint32_t inst)
+{
+       struct dcn20_opp *opp =
+               kzalloc(sizeof(struct dcn20_opp), GFP_KERNEL);
+
+       if (!opp) {
+               BREAK_TO_DEBUGGER();
+               return NULL;
+       }
+
+       dcn20_opp_construct(opp, ctx, inst,
+                       &opp_regs[inst], &opp_shift, &opp_mask);
+       return &opp->base;
+}
+
+static struct dce_aux *dcn31_aux_engine_create(
+       struct dc_context *ctx,
+       uint32_t inst)
+{
+       struct aux_engine_dce110 *aux_engine =
+               kzalloc(sizeof(struct aux_engine_dce110), GFP_KERNEL);
+
+       if (!aux_engine)
+               return NULL;
+
+       dce110_aux_engine_construct(aux_engine, ctx, inst,
+                                   SW_AUX_TIMEOUT_PERIOD_MULTIPLIER * AUX_TIMEOUT_PERIOD,
+                                   &aux_engine_regs[inst],
+                                       &aux_mask,
+                                       &aux_shift,
+                                       ctx->dc->caps.extended_aux_timeout_support);
+
+       return &aux_engine->base;
+}
+#define i2c_inst_regs(id) { I2C_HW_ENGINE_COMMON_REG_LIST_DCN30(id) }
+
+static const struct dce_i2c_registers i2c_hw_regs[] = {
+               i2c_inst_regs(1),
+               i2c_inst_regs(2),
+               i2c_inst_regs(3),
+               i2c_inst_regs(4),
+               i2c_inst_regs(5),
+};
+
+static const struct dce_i2c_shift i2c_shifts = {
+               I2C_COMMON_MASK_SH_LIST_DCN30(__SHIFT)
+};
+
+static const struct dce_i2c_mask i2c_masks = {
+               I2C_COMMON_MASK_SH_LIST_DCN30(_MASK)
+};
+
+static struct dce_i2c_hw *dcn31_i2c_hw_create(
+       struct dc_context *ctx,
+       uint32_t inst)
+{
+       struct dce_i2c_hw *dce_i2c_hw =
+               kzalloc(sizeof(struct dce_i2c_hw), GFP_KERNEL);
+
+       if (!dce_i2c_hw)
+               return NULL;
+
+       dcn2_i2c_hw_construct(dce_i2c_hw, ctx, inst,
+                                   &i2c_hw_regs[inst], &i2c_shifts, &i2c_masks);
+
+       return dce_i2c_hw;
+}
+static struct mpc *dcn31_mpc_create(
+               struct dc_context *ctx,
+               int num_mpcc,
+               int num_rmu)
+{
+       struct dcn30_mpc *mpc30 = kzalloc(sizeof(struct dcn30_mpc),
+                                         GFP_KERNEL);
+
+       if (!mpc30)
+               return NULL;
+
+       dcn30_mpc_construct(mpc30, ctx,
+                       &mpc_regs,
+                       &mpc_shift,
+                       &mpc_mask,
+                       num_mpcc,
+                       num_rmu);
+
+       return &mpc30->base;
+}
+
+static struct hubbub *dcn31_hubbub_create(struct dc_context *ctx)
+{
+       int i;
+
+       struct dcn20_hubbub *hubbub3 = kzalloc(sizeof(struct dcn20_hubbub),
+                                         GFP_KERNEL);
+
+       if (!hubbub3)
+               return NULL;
+
+       hubbub31_construct(hubbub3, ctx,
+                       &hubbub_reg,
+                       &hubbub_shift,
+                       &hubbub_mask,
+                       dcn3_16_ip.det_buffer_size_kbytes,
+                       dcn3_16_ip.pixel_chunk_size_kbytes,
+                       dcn3_16_ip.config_return_buffer_size_in_kbytes);
+
+
+       for (i = 0; i < res_cap_dcn31.num_vmid; i++) {
+               struct dcn20_vmid *vmid = &hubbub3->vmid[i];
+
+               vmid->ctx = ctx;
+
+               vmid->regs = &vmid_regs[i];
+               vmid->shifts = &vmid_shifts;
+               vmid->masks = &vmid_masks;
+       }
+
+       return &hubbub3->base;
+}
+
+static struct timing_generator *dcn31_timing_generator_create(
+               struct dc_context *ctx,
+               uint32_t instance)
+{
+       struct optc *tgn10 =
+               kzalloc(sizeof(struct optc), GFP_KERNEL);
+
+       if (!tgn10)
+               return NULL;
+
+       tgn10->base.inst = instance;
+       tgn10->base.ctx = ctx;
+
+       tgn10->tg_regs = &optc_regs[instance];
+       tgn10->tg_shift = &optc_shift;
+       tgn10->tg_mask = &optc_mask;
+
+       dcn31_timing_generator_init(tgn10);
+
+       return &tgn10->base;
+}
+
+static const struct encoder_feature_support link_enc_feature = {
+               .max_hdmi_deep_color = COLOR_DEPTH_121212,
+               .max_hdmi_pixel_clock = 600000,
+               .hdmi_ycbcr420_supported = true,
+               .dp_ycbcr420_supported = true,
+               .fec_supported = true,
+               .flags.bits.IS_HBR2_CAPABLE = true,
+               .flags.bits.IS_HBR3_CAPABLE = true,
+               .flags.bits.IS_TPS3_CAPABLE = true,
+               .flags.bits.IS_TPS4_CAPABLE = true
+};
+
+static struct link_encoder *dcn31_link_encoder_create(
+       struct dc_context *ctx,
+       const struct encoder_init_data *enc_init_data)
+{
+       struct dcn20_link_encoder *enc20 =
+               kzalloc(sizeof(struct dcn20_link_encoder), GFP_KERNEL);
+
+       if (!enc20)
+               return NULL;
+
+       dcn31_link_encoder_construct(enc20,
+                       enc_init_data,
+                       &link_enc_feature,
+                       &link_enc_regs[enc_init_data->transmitter],
+                       &link_enc_aux_regs[enc_init_data->channel - 1],
+                       &link_enc_hpd_regs[enc_init_data->hpd_source],
+                       &le_shift,
+                       &le_mask);
+
+       return &enc20->enc10.base;
+}
+
+/* Create a minimal link encoder object not associated with a particular
+ * physical connector.
+ * resource_funcs.link_enc_create_minimal
+ */
+static struct link_encoder *dcn31_link_enc_create_minimal(
+               struct dc_context *ctx, enum engine_id eng_id)
+{
+       struct dcn20_link_encoder *enc20;
+
+       if ((eng_id - ENGINE_ID_DIGA) > ctx->dc->res_pool->res_cap->num_dig_link_enc)
+               return NULL;
+
+       enc20 = kzalloc(sizeof(struct dcn20_link_encoder), GFP_KERNEL);
+       if (!enc20)
+               return NULL;
+
+       dcn31_link_encoder_construct_minimal(
+                       enc20,
+                       ctx,
+                       &link_enc_feature,
+                       &link_enc_regs[eng_id - ENGINE_ID_DIGA],
+                       eng_id);
+
+       return &enc20->enc10.base;
+}
+
+static struct panel_cntl *dcn31_panel_cntl_create(const struct panel_cntl_init_data *init_data)
+{
+       struct dcn31_panel_cntl *panel_cntl =
+               kzalloc(sizeof(struct dcn31_panel_cntl), GFP_KERNEL);
+
+       if (!panel_cntl)
+               return NULL;
+
+       dcn31_panel_cntl_construct(panel_cntl, init_data);
+
+       return &panel_cntl->base;
+}
+
+static void read_dce_straps(
+       struct dc_context *ctx,
+       struct resource_straps *straps)
+{
+       generic_reg_get(ctx, regDC_PINSTRAPS + BASE(regDC_PINSTRAPS_BASE_IDX),
+               FN(DC_PINSTRAPS, DC_PINSTRAPS_AUDIO), &straps->dc_pinstraps_audio);
+
+}
+
+static struct audio *dcn31_create_audio(
+               struct dc_context *ctx, unsigned int inst)
+{
+       return dce_audio_create(ctx, inst,
+                       &audio_regs[inst], &audio_shift, &audio_mask);
+}
+
+static struct vpg *dcn31_vpg_create(
+       struct dc_context *ctx,
+       uint32_t inst)
+{
+       struct dcn31_vpg *vpg31 = kzalloc(sizeof(struct dcn31_vpg), GFP_KERNEL);
+
+       if (!vpg31)
+               return NULL;
+
+       vpg31_construct(vpg31, ctx, inst,
+                       &vpg_regs[inst],
+                       &vpg_shift,
+                       &vpg_mask);
+
+       return &vpg31->base;
+}
+
+static struct afmt *dcn31_afmt_create(
+       struct dc_context *ctx,
+       uint32_t inst)
+{
+       struct dcn31_afmt *afmt31 = kzalloc(sizeof(struct dcn31_afmt), GFP_KERNEL);
+
+       if (!afmt31)
+               return NULL;
+
+       afmt31_construct(afmt31, ctx, inst,
+                       &afmt_regs[inst],
+                       &afmt_shift,
+                       &afmt_mask);
+
+       // Light sleep by default, no need to power down here
+
+       return &afmt31->base;
+}
+
+
+static struct apg *dcn31_apg_create(
+       struct dc_context *ctx,
+       uint32_t inst)
+{
+       struct dcn31_apg *apg31 = kzalloc(sizeof(struct dcn31_apg), GFP_KERNEL);
+
+       if (!apg31)
+               return NULL;
+
+       apg31_construct(apg31, ctx, inst,
+                       &apg_regs[inst],
+                       &apg_shift,
+                       &apg_mask);
+
+       return &apg31->base;
+}
+
+
+static struct stream_encoder *dcn316_stream_encoder_create(
+       enum engine_id eng_id,
+       struct dc_context *ctx)
+{
+       struct dcn10_stream_encoder *enc1;
+       struct vpg *vpg;
+       struct afmt *afmt;
+       int vpg_inst;
+       int afmt_inst;
+
+       /* Mapping of VPG, AFMT, DME register blocks to DIO block instance */
+       if (eng_id <= ENGINE_ID_DIGF) {
+               vpg_inst = eng_id;
+               afmt_inst = eng_id;
+       } else
+               return NULL;
+
+       enc1 = kzalloc(sizeof(struct dcn10_stream_encoder), GFP_KERNEL);
+       vpg = dcn31_vpg_create(ctx, vpg_inst);
+       afmt = dcn31_afmt_create(ctx, afmt_inst);
+
+       if (!enc1 || !vpg || !afmt) {
+               kfree(enc1);
+               kfree(vpg);
+               kfree(afmt);
+               return NULL;
+       }
+
+       dcn30_dio_stream_encoder_construct(enc1, ctx, ctx->dc_bios,
+                                       eng_id, vpg, afmt,
+                                       &stream_enc_regs[eng_id],
+                                       &se_shift, &se_mask);
+
+       return &enc1->base;
+}
+
+
+static struct hpo_dp_stream_encoder *dcn31_hpo_dp_stream_encoder_create(
+       enum engine_id eng_id,
+       struct dc_context *ctx)
+{
+       struct dcn31_hpo_dp_stream_encoder *hpo_dp_enc31;
+       struct vpg *vpg;
+       struct apg *apg;
+       uint32_t hpo_dp_inst;
+       uint32_t vpg_inst;
+       uint32_t apg_inst;
+
+       ASSERT((eng_id >= ENGINE_ID_HPO_DP_0) && (eng_id <= ENGINE_ID_HPO_DP_3));
+       hpo_dp_inst = eng_id - ENGINE_ID_HPO_DP_0;
+
+       /* Mapping of VPG register blocks to HPO DP block instance:
+        * VPG[6] -> HPO_DP[0]
+        * VPG[7] -> HPO_DP[1]
+        * VPG[8] -> HPO_DP[2]
+        * VPG[9] -> HPO_DP[3]
+        */
+       vpg_inst = hpo_dp_inst + 6;
+
+       /* Mapping of APG register blocks to HPO DP block instance:
+        * APG[0] -> HPO_DP[0]
+        * APG[1] -> HPO_DP[1]
+        * APG[2] -> HPO_DP[2]
+        * APG[3] -> HPO_DP[3]
+        */
+       apg_inst = hpo_dp_inst;
+
+       /* allocate HPO stream encoder and create VPG sub-block */
+       hpo_dp_enc31 = kzalloc(sizeof(struct dcn31_hpo_dp_stream_encoder), GFP_KERNEL);
+       vpg = dcn31_vpg_create(ctx, vpg_inst);
+       apg = dcn31_apg_create(ctx, apg_inst);
+
+       if (!hpo_dp_enc31 || !vpg || !apg) {
+               kfree(hpo_dp_enc31);
+               kfree(vpg);
+               kfree(apg);
+               return NULL;
+       }
+
+       dcn31_hpo_dp_stream_encoder_construct(hpo_dp_enc31, ctx, ctx->dc_bios,
+                                       hpo_dp_inst, eng_id, vpg, apg,
+                                       &hpo_dp_stream_enc_regs[hpo_dp_inst],
+                                       &hpo_dp_se_shift, &hpo_dp_se_mask);
+
+       return &hpo_dp_enc31->base;
+}
+
+static struct hpo_dp_link_encoder *dcn31_hpo_dp_link_encoder_create(
+       uint8_t inst,
+       struct dc_context *ctx)
+{
+       struct dcn31_hpo_dp_link_encoder *hpo_dp_enc31;
+
+       /* allocate HPO link encoder */
+       hpo_dp_enc31 = kzalloc(sizeof(struct dcn31_hpo_dp_link_encoder), GFP_KERNEL);
+
+       hpo_dp_link_encoder31_construct(hpo_dp_enc31, ctx, inst,
+                                       &hpo_dp_link_enc_regs[inst],
+                                       &hpo_dp_le_shift, &hpo_dp_le_mask);
+
+       return &hpo_dp_enc31->base;
+}
+
+
+static struct dce_hwseq *dcn31_hwseq_create(
+       struct dc_context *ctx)
+{
+       struct dce_hwseq *hws = kzalloc(sizeof(struct dce_hwseq), GFP_KERNEL);
+
+       if (hws) {
+               hws->ctx = ctx;
+               hws->regs = &hwseq_reg;
+               hws->shifts = &hwseq_shift;
+               hws->masks = &hwseq_mask;
+       }
+       return hws;
+}
+static const struct resource_create_funcs res_create_funcs = {
+       .read_dce_straps = read_dce_straps,
+       .create_audio = dcn31_create_audio,
+       .create_stream_encoder = dcn316_stream_encoder_create,
+       .create_hpo_dp_stream_encoder = dcn31_hpo_dp_stream_encoder_create,
+       .create_hpo_dp_link_encoder = dcn31_hpo_dp_link_encoder_create,
+       .create_hwseq = dcn31_hwseq_create,
+};
+
+static void dcn316_resource_destruct(struct dcn316_resource_pool *pool)
+{
+       unsigned int i;
+
+       for (i = 0; i < pool->base.stream_enc_count; i++) {
+               if (pool->base.stream_enc[i] != NULL) {
+                       if (pool->base.stream_enc[i]->vpg != NULL) {
+                               kfree(DCN30_VPG_FROM_VPG(pool->base.stream_enc[i]->vpg));
+                               pool->base.stream_enc[i]->vpg = NULL;
+                       }
+                       if (pool->base.stream_enc[i]->afmt != NULL) {
+                               kfree(DCN30_AFMT_FROM_AFMT(pool->base.stream_enc[i]->afmt));
+                               pool->base.stream_enc[i]->afmt = NULL;
+                       }
+                       kfree(DCN10STRENC_FROM_STRENC(pool->base.stream_enc[i]));
+                       pool->base.stream_enc[i] = NULL;
+               }
+       }
+
+       for (i = 0; i < pool->base.hpo_dp_stream_enc_count; i++) {
+               if (pool->base.hpo_dp_stream_enc[i] != NULL) {
+                       if (pool->base.hpo_dp_stream_enc[i]->vpg != NULL) {
+                               kfree(DCN30_VPG_FROM_VPG(pool->base.hpo_dp_stream_enc[i]->vpg));
+                               pool->base.hpo_dp_stream_enc[i]->vpg = NULL;
+                       }
+                       if (pool->base.hpo_dp_stream_enc[i]->apg != NULL) {
+                               kfree(DCN31_APG_FROM_APG(pool->base.hpo_dp_stream_enc[i]->apg));
+                               pool->base.hpo_dp_stream_enc[i]->apg = NULL;
+                       }
+                       kfree(DCN3_1_HPO_DP_STREAM_ENC_FROM_HPO_STREAM_ENC(pool->base.hpo_dp_stream_enc[i]));
+                       pool->base.hpo_dp_stream_enc[i] = NULL;
+               }
+       }
+
+       for (i = 0; i < pool->base.hpo_dp_link_enc_count; i++) {
+               if (pool->base.hpo_dp_link_enc[i] != NULL) {
+                       kfree(DCN3_1_HPO_DP_LINK_ENC_FROM_HPO_LINK_ENC(pool->base.hpo_dp_link_enc[i]));
+                       pool->base.hpo_dp_link_enc[i] = NULL;
+               }
+       }
+
+       for (i = 0; i < pool->base.res_cap->num_dsc; i++) {
+               if (pool->base.dscs[i] != NULL)
+                       dcn20_dsc_destroy(&pool->base.dscs[i]);
+       }
+
+       if (pool->base.mpc != NULL) {
+               kfree(TO_DCN20_MPC(pool->base.mpc));
+               pool->base.mpc = NULL;
+       }
+       if (pool->base.hubbub != NULL) {
+               kfree(pool->base.hubbub);
+               pool->base.hubbub = NULL;
+       }
+       for (i = 0; i < pool->base.pipe_count; i++) {
+               if (pool->base.dpps[i] != NULL)
+                       dcn31_dpp_destroy(&pool->base.dpps[i]);
+
+               if (pool->base.ipps[i] != NULL)
+                       pool->base.ipps[i]->funcs->ipp_destroy(&pool->base.ipps[i]);
+
+               if (pool->base.hubps[i] != NULL) {
+                       kfree(TO_DCN20_HUBP(pool->base.hubps[i]));
+                       pool->base.hubps[i] = NULL;
+               }
+
+               if (pool->base.irqs != NULL) {
+                       dal_irq_service_destroy(&pool->base.irqs);
+               }
+       }
+
+       for (i = 0; i < pool->base.res_cap->num_ddc; i++) {
+               if (pool->base.engines[i] != NULL)
+                       dce110_engine_destroy(&pool->base.engines[i]);
+               if (pool->base.hw_i2cs[i] != NULL) {
+                       kfree(pool->base.hw_i2cs[i]);
+                       pool->base.hw_i2cs[i] = NULL;
+               }
+               if (pool->base.sw_i2cs[i] != NULL) {
+                       kfree(pool->base.sw_i2cs[i]);
+                       pool->base.sw_i2cs[i] = NULL;
+               }
+       }
+
+       for (i = 0; i < pool->base.res_cap->num_opp; i++) {
+               if (pool->base.opps[i] != NULL)
+                       pool->base.opps[i]->funcs->opp_destroy(&pool->base.opps[i]);
+       }
+
+       for (i = 0; i < pool->base.res_cap->num_timing_generator; i++) {
+               if (pool->base.timing_generators[i] != NULL)    {
+                       kfree(DCN10TG_FROM_TG(pool->base.timing_generators[i]));
+                       pool->base.timing_generators[i] = NULL;
+               }
+       }
+
+       for (i = 0; i < pool->base.res_cap->num_dwb; i++) {
+               if (pool->base.dwbc[i] != NULL) {
+                       kfree(TO_DCN30_DWBC(pool->base.dwbc[i]));
+                       pool->base.dwbc[i] = NULL;
+               }
+               if (pool->base.mcif_wb[i] != NULL) {
+                       kfree(TO_DCN30_MMHUBBUB(pool->base.mcif_wb[i]));
+                       pool->base.mcif_wb[i] = NULL;
+               }
+       }
+
+       for (i = 0; i < pool->base.audio_count; i++) {
+               if (pool->base.audios[i])
+                       dce_aud_destroy(&pool->base.audios[i]);
+       }
+
+       for (i = 0; i < pool->base.clk_src_count; i++) {
+               if (pool->base.clock_sources[i] != NULL) {
+                       dcn20_clock_source_destroy(&pool->base.clock_sources[i]);
+                       pool->base.clock_sources[i] = NULL;
+               }
+       }
+
+       for (i = 0; i < pool->base.res_cap->num_mpc_3dlut; i++) {
+               if (pool->base.mpc_lut[i] != NULL) {
+                       dc_3dlut_func_release(pool->base.mpc_lut[i]);
+                       pool->base.mpc_lut[i] = NULL;
+               }
+               if (pool->base.mpc_shaper[i] != NULL) {
+                       dc_transfer_func_release(pool->base.mpc_shaper[i]);
+                       pool->base.mpc_shaper[i] = NULL;
+               }
+       }
+
+       if (pool->base.dp_clock_source != NULL) {
+               dcn20_clock_source_destroy(&pool->base.dp_clock_source);
+               pool->base.dp_clock_source = NULL;
+       }
+
+       for (i = 0; i < pool->base.res_cap->num_timing_generator; i++) {
+               if (pool->base.multiple_abms[i] != NULL)
+                       dce_abm_destroy(&pool->base.multiple_abms[i]);
+       }
+
+       if (pool->base.psr != NULL)
+               dmub_psr_destroy(&pool->base.psr);
+
+       if (pool->base.dccg != NULL)
+               dcn_dccg_destroy(&pool->base.dccg);
+}
+
+static struct hubp *dcn31_hubp_create(
+       struct dc_context *ctx,
+       uint32_t inst)
+{
+       struct dcn20_hubp *hubp2 =
+               kzalloc(sizeof(struct dcn20_hubp), GFP_KERNEL);
+
+       if (!hubp2)
+               return NULL;
+
+       if (hubp31_construct(hubp2, ctx, inst,
+                       &hubp_regs[inst], &hubp_shift, &hubp_mask))
+               return &hubp2->base;
+
+       BREAK_TO_DEBUGGER();
+       kfree(hubp2);
+       return NULL;
+}
+
+static bool dcn31_dwbc_create(struct dc_context *ctx, struct resource_pool *pool)
+{
+       int i;
+       uint32_t pipe_count = pool->res_cap->num_dwb;
+
+       for (i = 0; i < pipe_count; i++) {
+               struct dcn30_dwbc *dwbc30 = kzalloc(sizeof(struct dcn30_dwbc),
+                                                   GFP_KERNEL);
+
+               if (!dwbc30) {
+                       dm_error("DC: failed to create dwbc30!\n");
+                       return false;
+               }
+
+               dcn30_dwbc_construct(dwbc30, ctx,
+                               &dwbc30_regs[i],
+                               &dwbc30_shift,
+                               &dwbc30_mask,
+                               i);
+
+               pool->dwbc[i] = &dwbc30->base;
+       }
+       return true;
+}
+
+static bool dcn31_mmhubbub_create(struct dc_context *ctx, struct resource_pool *pool)
+{
+       int i;
+       uint32_t pipe_count = pool->res_cap->num_dwb;
+
+       for (i = 0; i < pipe_count; i++) {
+               struct dcn30_mmhubbub *mcif_wb30 = kzalloc(sizeof(struct dcn30_mmhubbub),
+                                                   GFP_KERNEL);
+
+               if (!mcif_wb30) {
+                       dm_error("DC: failed to create mcif_wb30!\n");
+                       return false;
+               }
+
+               dcn30_mmhubbub_construct(mcif_wb30, ctx,
+                               &mcif_wb30_regs[i],
+                               &mcif_wb30_shift,
+                               &mcif_wb30_mask,
+                               i);
+
+               pool->mcif_wb[i] = &mcif_wb30->base;
+       }
+       return true;
+}
+
+static struct display_stream_compressor *dcn31_dsc_create(
+       struct dc_context *ctx, uint32_t inst)
+{
+       struct dcn20_dsc *dsc =
+               kzalloc(sizeof(struct dcn20_dsc), GFP_KERNEL);
+
+       if (!dsc) {
+               BREAK_TO_DEBUGGER();
+               return NULL;
+       }
+
+       dsc2_construct(dsc, ctx, inst, &dsc_regs[inst], &dsc_shift, &dsc_mask);
+       return &dsc->base;
+}
+
+static void dcn316_destroy_resource_pool(struct resource_pool **pool)
+{
+       struct dcn316_resource_pool *dcn31_pool = TO_DCN316_RES_POOL(*pool);
+
+       dcn316_resource_destruct(dcn31_pool);
+       kfree(dcn31_pool);
+       *pool = NULL;
+}
+
+static struct clock_source *dcn31_clock_source_create(
+               struct dc_context *ctx,
+               struct dc_bios *bios,
+               enum clock_source_id id,
+               const struct dce110_clk_src_regs *regs,
+               bool dp_clk_src)
+{
+       struct dce110_clk_src *clk_src =
+               kzalloc(sizeof(struct dce110_clk_src), GFP_KERNEL);
+
+       if (!clk_src)
+               return NULL;
+
+       if (dcn31_clk_src_construct(clk_src, ctx, bios, id,
+                       regs, &cs_shift, &cs_mask)) {
+               clk_src->base.dp_clk_src = dp_clk_src;
+               return &clk_src->base;
+       }
+
+       kfree(clk_src);
+
+       BREAK_TO_DEBUGGER();
+       return NULL;
+}
+
+static bool is_dual_plane(enum surface_pixel_format format)
+{
+       return format >= SURFACE_PIXEL_FORMAT_VIDEO_BEGIN || format == SURFACE_PIXEL_FORMAT_GRPH_RGBE_ALPHA;
+}
+
+static int dcn316_populate_dml_pipes_from_context(
+       struct dc *dc, struct dc_state *context,
+       display_e2e_pipe_params_st *pipes,
+       bool fast_validate)
+{
+       int i, pipe_cnt;
+       struct resource_context *res_ctx = &context->res_ctx;
+       struct pipe_ctx *pipe;
+       const int max_usable_det = context->bw_ctx.dml.ip.config_return_buffer_size_in_kbytes - DCN3_16_MIN_COMPBUF_SIZE_KB;
+
+       DC_FP_START();
+       dcn31x_populate_dml_pipes_from_context(dc, context, pipes, fast_validate);
+       DC_FP_END();
+
+       for (i = 0, pipe_cnt = 0; i < dc->res_pool->pipe_count; i++) {
+               struct dc_crtc_timing *timing;
+
+               if (!res_ctx->pipe_ctx[i].stream)
+                       continue;
+               pipe = &res_ctx->pipe_ctx[i];
+               timing = &pipe->stream->timing;
+
+               /*
+                * Immediate flip can be set dynamically after enabling the plane.
+                * We need to require support for immediate flip or underflow can be
+                * intermittently experienced depending on peak b/w requirements.
+                */
+               pipes[pipe_cnt].pipe.src.immediate_flip = true;
+
+               pipes[pipe_cnt].pipe.src.unbounded_req_mode = false;
+               pipes[pipe_cnt].pipe.dest.vfront_porch = timing->v_front_porch;
+               pipes[pipe_cnt].pipe.src.dcc_rate = 3;
+               pipes[pipe_cnt].dout.dsc_input_bpc = 0;
+               DC_FP_START();
+               dcn31_zero_pipe_dcc_fraction(pipes, pipe_cnt);
+               DC_FP_END();
+
+               if (pipes[pipe_cnt].dout.dsc_enable) {
+                       switch (timing->display_color_depth) {
+                       case COLOR_DEPTH_888:
+                               pipes[pipe_cnt].dout.dsc_input_bpc = 8;
+                               break;
+                       case COLOR_DEPTH_101010:
+                               pipes[pipe_cnt].dout.dsc_input_bpc = 10;
+                               break;
+                       case COLOR_DEPTH_121212:
+                               pipes[pipe_cnt].dout.dsc_input_bpc = 12;
+                               break;
+                       default:
+                               ASSERT(0);
+                               break;
+                       }
+               }
+
+               pipe_cnt++;
+       }
+
+       if (pipe_cnt)
+               context->bw_ctx.dml.ip.det_buffer_size_kbytes =
+                               (max_usable_det / DCN3_16_CRB_SEGMENT_SIZE_KB / pipe_cnt) * DCN3_16_CRB_SEGMENT_SIZE_KB;
+       if (context->bw_ctx.dml.ip.det_buffer_size_kbytes > DCN3_16_MAX_DET_SIZE)
+               context->bw_ctx.dml.ip.det_buffer_size_kbytes = DCN3_16_MAX_DET_SIZE;
+       ASSERT(context->bw_ctx.dml.ip.det_buffer_size_kbytes >= DCN3_16_DEFAULT_DET_SIZE);
+       dc->config.enable_4to1MPC = false;
+       if (pipe_cnt == 1 && pipe->plane_state && !dc->debug.disable_z9_mpc) {
+               if (is_dual_plane(pipe->plane_state->format)
+                               && pipe->plane_state->src_rect.width <= 1920 && pipe->plane_state->src_rect.height <= 1080) {
+                       dc->config.enable_4to1MPC = true;
+                       context->bw_ctx.dml.ip.det_buffer_size_kbytes =
+                                       (max_usable_det / DCN3_16_CRB_SEGMENT_SIZE_KB / 4) * DCN3_16_CRB_SEGMENT_SIZE_KB;
+               } else if (!is_dual_plane(pipe->plane_state->format)) {
+                       context->bw_ctx.dml.ip.det_buffer_size_kbytes = 192;
+                       pipes[0].pipe.src.unbounded_req_mode = true;
+               }
+       }
+
+       return pipe_cnt;
+}
+
+static void dcn316_get_panel_config_defaults(struct dc_panel_config *panel_config)
+{
+       *panel_config = panel_config_defaults;
+}
+
+static struct dc_cap_funcs cap_funcs = {
+       .get_dcc_compression_cap = dcn20_get_dcc_compression_cap
+};
+
+static struct resource_funcs dcn316_res_pool_funcs = {
+       .destroy = dcn316_destroy_resource_pool,
+       .link_enc_create = dcn31_link_encoder_create,
+       .link_enc_create_minimal = dcn31_link_enc_create_minimal,
+       .link_encs_assign = link_enc_cfg_link_encs_assign,
+       .link_enc_unassign = link_enc_cfg_link_enc_unassign,
+       .panel_cntl_create = dcn31_panel_cntl_create,
+       .validate_bandwidth = dcn31_validate_bandwidth,
+       .calculate_wm_and_dlg = dcn31_calculate_wm_and_dlg,
+       .update_soc_for_wm_a = dcn31_update_soc_for_wm_a,
+       .populate_dml_pipes = dcn316_populate_dml_pipes_from_context,
+       .acquire_free_pipe_as_secondary_dpp_pipe = dcn20_acquire_free_pipe_for_layer,
+       .release_pipe = dcn20_release_pipe,
+       .add_stream_to_ctx = dcn30_add_stream_to_ctx,
+       .add_dsc_to_stream_resource = dcn20_add_dsc_to_stream_resource,
+       .remove_stream_from_ctx = dcn20_remove_stream_from_ctx,
+       .populate_dml_writeback_from_context = dcn31_populate_dml_writeback_from_context,
+       .set_mcif_arb_params = dcn31_set_mcif_arb_params,
+       .find_first_free_match_stream_enc_for_link = dcn10_find_first_free_match_stream_enc_for_link,
+       .acquire_post_bldn_3dlut = dcn30_acquire_post_bldn_3dlut,
+       .release_post_bldn_3dlut = dcn30_release_post_bldn_3dlut,
+       .update_bw_bounding_box = dcn316_update_bw_bounding_box,
+       .patch_unknown_plane_state = dcn20_patch_unknown_plane_state,
+       .get_panel_config_defaults = dcn316_get_panel_config_defaults,
+};
+
+static bool dcn316_resource_construct(
+       uint8_t num_virtual_links,
+       struct dc *dc,
+       struct dcn316_resource_pool *pool)
+{
+       int i;
+       struct dc_context *ctx = dc->ctx;
+       struct irq_service_init_data init_data;
+
+       ctx->dc_bios->regs = &bios_regs;
+
+       pool->base.res_cap = &res_cap_dcn31;
+
+       pool->base.funcs = &dcn316_res_pool_funcs;
+
+       /*************************************************
+        *  Resource + asic cap harcoding                *
+        *************************************************/
+       pool->base.underlay_pipe_index = NO_UNDERLAY_PIPE;
+       pool->base.pipe_count = pool->base.res_cap->num_timing_generator;
+       pool->base.mpcc_count = pool->base.res_cap->num_timing_generator;
+       dc->caps.max_downscale_ratio = 600;
+       dc->caps.i2c_speed_in_khz = 100;
+       dc->caps.i2c_speed_in_khz_hdcp = 5; /*1.5 w/a applied by default*/
+       dc->caps.max_cursor_size = 256;
+       dc->caps.min_horizontal_blanking_period = 80;
+       dc->caps.dmdata_alloc_size = 2048;
+       dc->caps.max_slave_planes = 2;
+       dc->caps.max_slave_yuv_planes = 2;
+       dc->caps.max_slave_rgb_planes = 2;
+       dc->caps.post_blend_color_processing = true;
+       dc->caps.force_dp_tps4_for_cp2520 = true;
+       if (dc->config.forceHBR2CP2520)
+               dc->caps.force_dp_tps4_for_cp2520 = false;
+       dc->caps.dp_hpo = true;
+       dc->caps.dp_hdmi21_pcon_support = true;
+       dc->caps.edp_dsc_support = true;
+       dc->caps.extended_aux_timeout_support = true;
+       dc->caps.dmcub_support = true;
+       dc->caps.is_apu = true;
+
+       /* Color pipeline capabilities */
+       dc->caps.color.dpp.dcn_arch = 1;
+       dc->caps.color.dpp.input_lut_shared = 0;
+       dc->caps.color.dpp.icsc = 1;
+       dc->caps.color.dpp.dgam_ram = 0; // must use gamma_corr
+       dc->caps.color.dpp.dgam_rom_caps.srgb = 1;
+       dc->caps.color.dpp.dgam_rom_caps.bt2020 = 1;
+       dc->caps.color.dpp.dgam_rom_caps.gamma2_2 = 1;
+       dc->caps.color.dpp.dgam_rom_caps.pq = 1;
+       dc->caps.color.dpp.dgam_rom_caps.hlg = 1;
+       dc->caps.color.dpp.post_csc = 1;
+       dc->caps.color.dpp.gamma_corr = 1;
+       dc->caps.color.dpp.dgam_rom_for_yuv = 0;
+
+       dc->caps.color.dpp.hw_3d_lut = 1;
+       dc->caps.color.dpp.ogam_ram = 1;
+       // no OGAM ROM on DCN301
+       dc->caps.color.dpp.ogam_rom_caps.srgb = 0;
+       dc->caps.color.dpp.ogam_rom_caps.bt2020 = 0;
+       dc->caps.color.dpp.ogam_rom_caps.gamma2_2 = 0;
+       dc->caps.color.dpp.ogam_rom_caps.pq = 0;
+       dc->caps.color.dpp.ogam_rom_caps.hlg = 0;
+       dc->caps.color.dpp.ocsc = 0;
+
+       dc->caps.color.mpc.gamut_remap = 1;
+       dc->caps.color.mpc.num_3dluts = pool->base.res_cap->num_mpc_3dlut; //2
+       dc->caps.color.mpc.ogam_ram = 1;
+       dc->caps.color.mpc.ogam_rom_caps.srgb = 0;
+       dc->caps.color.mpc.ogam_rom_caps.bt2020 = 0;
+       dc->caps.color.mpc.ogam_rom_caps.gamma2_2 = 0;
+       dc->caps.color.mpc.ogam_rom_caps.pq = 0;
+       dc->caps.color.mpc.ogam_rom_caps.hlg = 0;
+       dc->caps.color.mpc.ocsc = 1;
+
+       /* read VBIOS LTTPR caps */
+       {
+               if (ctx->dc_bios->funcs->get_lttpr_caps) {
+                       enum bp_result bp_query_result;
+                       uint8_t is_vbios_lttpr_enable = 0;
+
+                       bp_query_result = ctx->dc_bios->funcs->get_lttpr_caps(ctx->dc_bios, &is_vbios_lttpr_enable);
+                       dc->caps.vbios_lttpr_enable = (bp_query_result == BP_RESULT_OK) && !!is_vbios_lttpr_enable;
+               }
+
+               /* interop bit is implicit */
+               {
+                       dc->caps.vbios_lttpr_aware = true;
+               }
+       }
+
+       if (dc->ctx->dce_environment == DCE_ENV_PRODUCTION_DRV)
+               dc->debug = debug_defaults_drv;
+
+       // Init the vm_helper
+       if (dc->vm_helper)
+               vm_helper_init(dc->vm_helper, 16);
+
+       /*************************************************
+        *  Create resources                             *
+        *************************************************/
+
+       /* Clock Sources for Pixel Clock*/
+       pool->base.clock_sources[DCN31_CLK_SRC_PLL0] =
+                       dcn31_clock_source_create(ctx, ctx->dc_bios,
+                               CLOCK_SOURCE_COMBO_PHY_PLL0,
+                               &clk_src_regs[0], false);
+       pool->base.clock_sources[DCN31_CLK_SRC_PLL1] =
+                       dcn31_clock_source_create(ctx, ctx->dc_bios,
+                               CLOCK_SOURCE_COMBO_PHY_PLL1,
+                               &clk_src_regs[1], false);
+       pool->base.clock_sources[DCN31_CLK_SRC_PLL2] =
+                       dcn31_clock_source_create(ctx, ctx->dc_bios,
+                               CLOCK_SOURCE_COMBO_PHY_PLL2,
+                               &clk_src_regs[2], false);
+       pool->base.clock_sources[DCN31_CLK_SRC_PLL3] =
+                       dcn31_clock_source_create(ctx, ctx->dc_bios,
+                               CLOCK_SOURCE_COMBO_PHY_PLL3,
+                               &clk_src_regs[3], false);
+       pool->base.clock_sources[DCN31_CLK_SRC_PLL4] =
+                       dcn31_clock_source_create(ctx, ctx->dc_bios,
+                               CLOCK_SOURCE_COMBO_PHY_PLL4,
+                               &clk_src_regs[4], false);
+
+       pool->base.clk_src_count = DCN30_CLK_SRC_TOTAL;
+
+       /* todo: not reuse phy_pll registers */
+       pool->base.dp_clock_source =
+                       dcn31_clock_source_create(ctx, ctx->dc_bios,
+                               CLOCK_SOURCE_ID_DP_DTO,
+                               &clk_src_regs[0], true);
+
+       for (i = 0; i < pool->base.clk_src_count; i++) {
+               if (pool->base.clock_sources[i] == NULL) {
+                       dm_error("DC: failed to create clock sources!\n");
+                       BREAK_TO_DEBUGGER();
+                       goto create_fail;
+               }
+       }
+
+       /* TODO: DCCG */
+       pool->base.dccg = dccg31_create(ctx, &dccg_regs, &dccg_shift, &dccg_mask);
+       if (pool->base.dccg == NULL) {
+               dm_error("DC: failed to create dccg!\n");
+               BREAK_TO_DEBUGGER();
+               goto create_fail;
+       }
+
+       /* TODO: IRQ */
+       init_data.ctx = dc->ctx;
+       pool->base.irqs = dal_irq_service_dcn31_create(&init_data);
+       if (!pool->base.irqs)
+               goto create_fail;
+
+       /* HUBBUB */
+       pool->base.hubbub = dcn31_hubbub_create(ctx);
+       if (pool->base.hubbub == NULL) {
+               BREAK_TO_DEBUGGER();
+               dm_error("DC: failed to create hubbub!\n");
+               goto create_fail;
+       }
+
+       /* HUBPs, DPPs, OPPs and TGs */
+       for (i = 0; i < pool->base.pipe_count; i++) {
+               pool->base.hubps[i] = dcn31_hubp_create(ctx, i);
+               if (pool->base.hubps[i] == NULL) {
+                       BREAK_TO_DEBUGGER();
+                       dm_error(
+                               "DC: failed to create hubps!\n");
+                       goto create_fail;
+               }
+
+               pool->base.dpps[i] = dcn31_dpp_create(ctx, i);
+               if (pool->base.dpps[i] == NULL) {
+                       BREAK_TO_DEBUGGER();
+                       dm_error(
+                               "DC: failed to create dpps!\n");
+                       goto create_fail;
+               }
+       }
+
+       for (i = 0; i < pool->base.res_cap->num_opp; i++) {
+               pool->base.opps[i] = dcn31_opp_create(ctx, i);
+               if (pool->base.opps[i] == NULL) {
+                       BREAK_TO_DEBUGGER();
+                       dm_error(
+                               "DC: failed to create output pixel processor!\n");
+                       goto create_fail;
+               }
+       }
+
+       for (i = 0; i < pool->base.res_cap->num_timing_generator; i++) {
+               pool->base.timing_generators[i] = dcn31_timing_generator_create(
+                               ctx, i);
+               if (pool->base.timing_generators[i] == NULL) {
+                       BREAK_TO_DEBUGGER();
+                       dm_error("DC: failed to create tg!\n");
+                       goto create_fail;
+               }
+       }
+       pool->base.timing_generator_count = i;
+
+       /* PSR */
+       pool->base.psr = dmub_psr_create(ctx);
+       if (pool->base.psr == NULL) {
+               dm_error("DC: failed to create psr obj!\n");
+               BREAK_TO_DEBUGGER();
+               goto create_fail;
+       }
+
+       /* ABM */
+       for (i = 0; i < pool->base.res_cap->num_timing_generator; i++) {
+               pool->base.multiple_abms[i] = dmub_abm_create(ctx,
+                               &abm_regs[i],
+                               &abm_shift,
+                               &abm_mask);
+               if (pool->base.multiple_abms[i] == NULL) {
+                       dm_error("DC: failed to create abm for pipe %d!\n", i);
+                       BREAK_TO_DEBUGGER();
+                       goto create_fail;
+               }
+       }
+
+       /* MPC and DSC */
+       pool->base.mpc = dcn31_mpc_create(ctx, pool->base.mpcc_count, pool->base.res_cap->num_mpc_3dlut);
+       if (pool->base.mpc == NULL) {
+               BREAK_TO_DEBUGGER();
+               dm_error("DC: failed to create mpc!\n");
+               goto create_fail;
+       }
+
+       for (i = 0; i < pool->base.res_cap->num_dsc; i++) {
+               pool->base.dscs[i] = dcn31_dsc_create(ctx, i);
+               if (pool->base.dscs[i] == NULL) {
+                       BREAK_TO_DEBUGGER();
+                       dm_error("DC: failed to create display stream compressor %d!\n", i);
+                       goto create_fail;
+               }
+       }
+
+       /* DWB and MMHUBBUB */
+       if (!dcn31_dwbc_create(ctx, &pool->base)) {
+               BREAK_TO_DEBUGGER();
+               dm_error("DC: failed to create dwbc!\n");
+               goto create_fail;
+       }
+
+       if (!dcn31_mmhubbub_create(ctx, &pool->base)) {
+               BREAK_TO_DEBUGGER();
+               dm_error("DC: failed to create mcif_wb!\n");
+               goto create_fail;
+       }
+
+       /* AUX and I2C */
+       for (i = 0; i < pool->base.res_cap->num_ddc; i++) {
+               pool->base.engines[i] = dcn31_aux_engine_create(ctx, i);
+               if (pool->base.engines[i] == NULL) {
+                       BREAK_TO_DEBUGGER();
+                       dm_error(
+                               "DC:failed to create aux engine!!\n");
+                       goto create_fail;
+               }
+               pool->base.hw_i2cs[i] = dcn31_i2c_hw_create(ctx, i);
+               if (pool->base.hw_i2cs[i] == NULL) {
+                       BREAK_TO_DEBUGGER();
+                       dm_error(
+                               "DC:failed to create hw i2c!!\n");
+                       goto create_fail;
+               }
+               pool->base.sw_i2cs[i] = NULL;
+       }
+
+       /* Audio, Stream Encoders including HPO and virtual, MPC 3D LUTs */
+       if (!resource_construct(num_virtual_links, dc, &pool->base,
+                       &res_create_funcs))
+               goto create_fail;
+
+       /* HW Sequencer and Plane caps */
+       dcn31_hw_sequencer_construct(dc);
+
+       dc->caps.max_planes =  pool->base.pipe_count;
+
+       for (i = 0; i < dc->caps.max_planes; ++i)
+               dc->caps.planes[i] = plane_cap;
+
+       dc->cap_funcs = cap_funcs;
+
+       dc->dcn_ip->max_num_dpp = dcn3_16_ip.max_num_dpp;
+
+       return true;
+
+create_fail:
+
+       dcn316_resource_destruct(pool);
+
+       return false;
+}
+
+struct resource_pool *dcn316_create_resource_pool(
+               const struct dc_init_data *init_data,
+               struct dc *dc)
+{
+       struct dcn316_resource_pool *pool =
+               kzalloc(sizeof(struct dcn316_resource_pool), GFP_KERNEL);
+
+       if (!pool)
+               return NULL;
+
+       if (dcn316_resource_construct(init_data->num_virtual_links, dc, pool))
+               return &pool->base;
+
+       BREAK_TO_DEBUGGER();
+       kfree(pool);
+       return NULL;
+}
diff --git a/drivers/gpu/drm/amd/display/dc/resource/dcn316/dcn316_resource.h b/drivers/gpu/drm/amd/display/dc/resource/dcn316/dcn316_resource.h
new file mode 100644 (file)
index 0000000..aba6d63
--- /dev/null
@@ -0,0 +1,44 @@
+/*
+ * 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 _DCN316_RESOURCE_H_
+#define _DCN316_RESOURCE_H_
+
+#include "core_types.h"
+
+#define TO_DCN316_RES_POOL(pool)\
+       container_of(pool, struct dcn316_resource_pool, base)
+
+extern struct _vcs_dpi_ip_params_st dcn3_16_ip;
+
+struct dcn316_resource_pool {
+       struct resource_pool base;
+};
+
+struct resource_pool *dcn316_create_resource_pool(
+               const struct dc_init_data *init_data,
+               struct dc *dc);
+
+#endif /* _DCN316_RESOURCE_H_ */
diff --git a/drivers/gpu/drm/amd/display/dc/resource/dcn32/dcn32_resource.c b/drivers/gpu/drm/amd/display/dc/resource/dcn32/dcn32_resource.c
new file mode 100644 (file)
index 0000000..36e4c7b
--- /dev/null
@@ -0,0 +1,2862 @@
+// SPDX-License-Identifier: MIT
+/*
+ * 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 "dm_services.h"
+#include "dc.h"
+
+#include "dcn32/dcn32_init.h"
+
+#include "resource.h"
+#include "include/irq_service_interface.h"
+#include "dcn32_resource.h"
+
+#include "dcn20/dcn20_resource.h"
+#include "dcn30/dcn30_resource.h"
+
+#include "dcn10/dcn10_ipp.h"
+#include "dcn30/dcn30_hubbub.h"
+#include "dcn31/dcn31_hubbub.h"
+#include "dcn32/dcn32_hubbub.h"
+#include "dcn32/dcn32_mpc.h"
+#include "dcn32/dcn32_hubp.h"
+#include "irq/dcn32/irq_service_dcn32.h"
+#include "dcn32/dcn32_dpp.h"
+#include "dcn32/dcn32_optc.h"
+#include "dcn20/dcn20_hwseq.h"
+#include "dcn30/dcn30_hwseq.h"
+#include "dce110/dce110_hwseq.h"
+#include "dcn30/dcn30_opp.h"
+#include "dcn20/dcn20_dsc.h"
+#include "dcn30/dcn30_vpg.h"
+#include "dcn30/dcn30_afmt.h"
+#include "dcn30/dcn30_dio_stream_encoder.h"
+#include "dcn32/dcn32_dio_stream_encoder.h"
+#include "dcn31/dcn31_hpo_dp_stream_encoder.h"
+#include "dcn31/dcn31_hpo_dp_link_encoder.h"
+#include "dcn32/dcn32_hpo_dp_link_encoder.h"
+#include "dcn31/dcn31_apg.h"
+#include "dcn31/dcn31_dio_link_encoder.h"
+#include "dcn32/dcn32_dio_link_encoder.h"
+#include "dce/dce_clock_source.h"
+#include "dce/dce_audio.h"
+#include "dce/dce_hwseq.h"
+#include "clk_mgr.h"
+#include "virtual/virtual_stream_encoder.h"
+#include "dml/display_mode_vba.h"
+#include "dcn32/dcn32_dccg.h"
+#include "dcn10/dcn10_resource.h"
+#include "link.h"
+#include "dcn31/dcn31_panel_cntl.h"
+
+#include "dcn30/dcn30_dwb.h"
+#include "dcn32/dcn32_mmhubbub.h"
+
+#include "dcn/dcn_3_2_0_offset.h"
+#include "dcn/dcn_3_2_0_sh_mask.h"
+#include "nbio/nbio_4_3_0_offset.h"
+
+#include "reg_helper.h"
+#include "dce/dmub_abm.h"
+#include "dce/dmub_psr.h"
+#include "dce/dce_aux.h"
+#include "dce/dce_i2c.h"
+
+#include "dml/dcn30/display_mode_vba_30.h"
+#include "vm_helper.h"
+#include "dcn20/dcn20_vmid.h"
+#include "dml/dcn32/dcn32_fpu.h"
+
+#include "dml2/dml2_wrapper.h"
+
+#define DC_LOGGER_INIT(logger)
+
+enum dcn32_clk_src_array_id {
+       DCN32_CLK_SRC_PLL0,
+       DCN32_CLK_SRC_PLL1,
+       DCN32_CLK_SRC_PLL2,
+       DCN32_CLK_SRC_PLL3,
+       DCN32_CLK_SRC_PLL4,
+       DCN32_CLK_SRC_TOTAL
+};
+
+/* begin *********************
+ * macros to expend register list macro defined in HW object header file
+ */
+
+/* DCN */
+#define BASE_INNER(seg) ctx->dcn_reg_offsets[seg]
+
+#define BASE(seg) BASE_INNER(seg)
+
+#define SR(reg_name)\
+               REG_STRUCT.reg_name = BASE(reg ## reg_name ## _BASE_IDX) +  \
+                                       reg ## reg_name
+#define SR_ARR(reg_name, id) \
+       REG_STRUCT[id].reg_name = BASE(reg##reg_name##_BASE_IDX) + reg##reg_name
+
+#define SR_ARR_INIT(reg_name, id, value) \
+       REG_STRUCT[id].reg_name = value
+
+#define SRI(reg_name, block, id)\
+       REG_STRUCT.reg_name = BASE(reg ## block ## id ## _ ## reg_name ## _BASE_IDX) + \
+               reg ## block ## id ## _ ## reg_name
+
+#define SRI_ARR(reg_name, block, id)\
+       REG_STRUCT[id].reg_name = BASE(reg ## block ## id ## _ ## reg_name ## _BASE_IDX) + \
+               reg ## block ## id ## _ ## reg_name
+
+#define SR_ARR_I2C(reg_name, id) \
+       REG_STRUCT[id-1].reg_name = BASE(reg##reg_name##_BASE_IDX) + reg##reg_name
+
+#define SRI_ARR_I2C(reg_name, block, id)\
+       REG_STRUCT[id-1].reg_name = BASE(reg ## block ## id ## _ ## reg_name ## _BASE_IDX) + \
+               reg ## block ## id ## _ ## reg_name
+
+#define SRI_ARR_ALPHABET(reg_name, block, index, id)\
+       REG_STRUCT[index].reg_name = BASE(reg ## block ## id ## _ ## reg_name ## _BASE_IDX) + \
+               reg ## block ## id ## _ ## reg_name
+
+#define SRI2(reg_name, block, id)\
+       .reg_name = BASE(reg ## reg_name ## _BASE_IDX) +        \
+               reg ## reg_name
+#define SRI2_ARR(reg_name, block, id)\
+       REG_STRUCT[id].reg_name = BASE(reg ## reg_name ## _BASE_IDX) +  \
+               reg ## reg_name
+
+#define SRIR(var_name, reg_name, block, id)\
+       .var_name = BASE(reg ## block ## id ## _ ## reg_name ## _BASE_IDX) + \
+               reg ## block ## id ## _ ## reg_name
+
+#define SRII(reg_name, block, id)\
+       REG_STRUCT.reg_name[id] = BASE(reg ## block ## id ## _ ## reg_name ## _BASE_IDX) + \
+                                       reg ## block ## id ## _ ## reg_name
+
+#define SRII_ARR_2(reg_name, block, id, inst)\
+       REG_STRUCT[inst].reg_name[id] = BASE(reg ## block ## id ## _ ## reg_name ## _BASE_IDX) + \
+               reg ## block ## id ## _ ## reg_name
+
+#define SRII_MPC_RMU(reg_name, block, id)\
+       .RMU##_##reg_name[id] = BASE(reg ## block ## id ## _ ## reg_name ## _BASE_IDX) + \
+               reg ## block ## id ## _ ## reg_name
+
+#define SRII_DWB(reg_name, temp_name, block, id)\
+       REG_STRUCT.reg_name[id] = BASE(reg ## block ## id ## _ ## temp_name ## _BASE_IDX) + \
+               reg ## block ## id ## _ ## temp_name
+
+#define SF_DWB2(reg_name, block, id, field_name, post_fix)     \
+       .field_name = reg_name ## __ ## field_name ## post_fix
+
+#define DCCG_SRII(reg_name, block, id)\
+       REG_STRUCT.block ## _ ## reg_name[id] = BASE(reg ## block ## id ## _ ## reg_name ## _BASE_IDX) + \
+               reg ## block ## id ## _ ## reg_name
+
+#define VUPDATE_SRII(reg_name, block, id)\
+       REG_STRUCT.reg_name[id] = BASE(reg ## reg_name ## _ ## block ## id ## _BASE_IDX) + \
+               reg ## reg_name ## _ ## block ## id
+
+/* NBIO */
+#define NBIO_BASE_INNER(seg) ctx->nbio_reg_offsets[seg]
+
+#define NBIO_BASE(seg) \
+       NBIO_BASE_INNER(seg)
+
+#define NBIO_SR(reg_name)\
+       REG_STRUCT.reg_name = NBIO_BASE(regBIF_BX0_ ## reg_name ## _BASE_IDX) + \
+                       regBIF_BX0_ ## reg_name
+#define NBIO_SR_ARR(reg_name, id)\
+       REG_STRUCT[id].reg_name = NBIO_BASE(regBIF_BX0_ ## reg_name ## _BASE_IDX) + \
+               regBIF_BX0_ ## reg_name
+
+#undef CTX
+#define CTX ctx
+#define REG(reg_name) \
+       (ctx->dcn_reg_offsets[reg ## reg_name ## _BASE_IDX] + reg ## reg_name)
+
+static struct bios_registers bios_regs;
+
+#define bios_regs_init() \
+               ( \
+               NBIO_SR(BIOS_SCRATCH_3),\
+               NBIO_SR(BIOS_SCRATCH_6)\
+               )
+
+#define clk_src_regs_init(index, pllid)\
+       CS_COMMON_REG_LIST_DCN3_0_RI(index, pllid)
+
+static struct dce110_clk_src_regs clk_src_regs[5];
+
+static const struct dce110_clk_src_shift cs_shift = {
+               CS_COMMON_MASK_SH_LIST_DCN3_2(__SHIFT)
+};
+
+static const struct dce110_clk_src_mask cs_mask = {
+               CS_COMMON_MASK_SH_LIST_DCN3_2(_MASK)
+};
+
+#define abm_regs_init(id)\
+               ABM_DCN32_REG_LIST_RI(id)
+
+static struct dce_abm_registers abm_regs[4];
+
+static const struct dce_abm_shift abm_shift = {
+               ABM_MASK_SH_LIST_DCN32(__SHIFT)
+};
+
+static const struct dce_abm_mask abm_mask = {
+               ABM_MASK_SH_LIST_DCN32(_MASK)
+};
+
+#define audio_regs_init(id)\
+               AUD_COMMON_REG_LIST_RI(id)
+
+static struct dce_audio_registers audio_regs[5];
+
+#define DCE120_AUD_COMMON_MASK_SH_LIST(mask_sh)\
+               SF(AZF0ENDPOINT0_AZALIA_F0_CODEC_ENDPOINT_INDEX, AZALIA_ENDPOINT_REG_INDEX, mask_sh),\
+               SF(AZF0ENDPOINT0_AZALIA_F0_CODEC_ENDPOINT_DATA, AZALIA_ENDPOINT_REG_DATA, mask_sh),\
+               AUD_COMMON_MASK_SH_LIST_BASE(mask_sh)
+
+static const struct dce_audio_shift audio_shift = {
+               DCE120_AUD_COMMON_MASK_SH_LIST(__SHIFT)
+};
+
+static const struct dce_audio_mask audio_mask = {
+               DCE120_AUD_COMMON_MASK_SH_LIST(_MASK)
+};
+
+#define vpg_regs_init(id)\
+       VPG_DCN3_REG_LIST_RI(id)
+
+static struct dcn30_vpg_registers vpg_regs[10];
+
+static const struct dcn30_vpg_shift vpg_shift = {
+       DCN3_VPG_MASK_SH_LIST(__SHIFT)
+};
+
+static const struct dcn30_vpg_mask vpg_mask = {
+       DCN3_VPG_MASK_SH_LIST(_MASK)
+};
+
+#define afmt_regs_init(id)\
+       AFMT_DCN3_REG_LIST_RI(id)
+
+static struct dcn30_afmt_registers afmt_regs[6];
+
+static const struct dcn30_afmt_shift afmt_shift = {
+       DCN3_AFMT_MASK_SH_LIST(__SHIFT)
+};
+
+static const struct dcn30_afmt_mask afmt_mask = {
+       DCN3_AFMT_MASK_SH_LIST(_MASK)
+};
+
+#define apg_regs_init(id)\
+       APG_DCN31_REG_LIST_RI(id)
+
+static struct dcn31_apg_registers apg_regs[4];
+
+static const struct dcn31_apg_shift apg_shift = {
+       DCN31_APG_MASK_SH_LIST(__SHIFT)
+};
+
+static const struct dcn31_apg_mask apg_mask = {
+               DCN31_APG_MASK_SH_LIST(_MASK)
+};
+
+#define stream_enc_regs_init(id)\
+       SE_DCN32_REG_LIST_RI(id)
+
+static struct dcn10_stream_enc_registers stream_enc_regs[5];
+
+static const struct dcn10_stream_encoder_shift se_shift = {
+               SE_COMMON_MASK_SH_LIST_DCN32(__SHIFT)
+};
+
+static const struct dcn10_stream_encoder_mask se_mask = {
+               SE_COMMON_MASK_SH_LIST_DCN32(_MASK)
+};
+
+
+#define aux_regs_init(id)\
+       DCN2_AUX_REG_LIST_RI(id)
+
+static struct dcn10_link_enc_aux_registers link_enc_aux_regs[5];
+
+#define hpd_regs_init(id)\
+       HPD_REG_LIST_RI(id)
+
+static struct dcn10_link_enc_hpd_registers link_enc_hpd_regs[5];
+
+#define link_regs_init(id, phyid)\
+       ( \
+       LE_DCN31_REG_LIST_RI(id), \
+       UNIPHY_DCN2_REG_LIST_RI(id, phyid)\
+       )
+       /*DPCS_DCN31_REG_LIST(id),*/ \
+
+static struct dcn10_link_enc_registers link_enc_regs[5];
+
+static const struct dcn10_link_enc_shift le_shift = {
+       LINK_ENCODER_MASK_SH_LIST_DCN31(__SHIFT), \
+       //DPCS_DCN31_MASK_SH_LIST(__SHIFT)
+};
+
+static const struct dcn10_link_enc_mask le_mask = {
+       LINK_ENCODER_MASK_SH_LIST_DCN31(_MASK), \
+       //DPCS_DCN31_MASK_SH_LIST(_MASK)
+};
+
+#define hpo_dp_stream_encoder_reg_init(id)\
+       DCN3_1_HPO_DP_STREAM_ENC_REG_LIST_RI(id)
+
+static struct dcn31_hpo_dp_stream_encoder_registers hpo_dp_stream_enc_regs[4];
+
+static const struct dcn31_hpo_dp_stream_encoder_shift hpo_dp_se_shift = {
+       DCN3_1_HPO_DP_STREAM_ENC_MASK_SH_LIST(__SHIFT)
+};
+
+static const struct dcn31_hpo_dp_stream_encoder_mask hpo_dp_se_mask = {
+       DCN3_1_HPO_DP_STREAM_ENC_MASK_SH_LIST(_MASK)
+};
+
+
+#define hpo_dp_link_encoder_reg_init(id)\
+       DCN3_1_HPO_DP_LINK_ENC_REG_LIST_RI(id)
+       /*DCN3_1_RDPCSTX_REG_LIST(0),*/
+       /*DCN3_1_RDPCSTX_REG_LIST(1),*/
+       /*DCN3_1_RDPCSTX_REG_LIST(2),*/
+       /*DCN3_1_RDPCSTX_REG_LIST(3),*/
+
+static struct dcn31_hpo_dp_link_encoder_registers hpo_dp_link_enc_regs[2];
+
+static const struct dcn31_hpo_dp_link_encoder_shift hpo_dp_le_shift = {
+       DCN3_2_HPO_DP_LINK_ENC_MASK_SH_LIST(__SHIFT)
+};
+
+static const struct dcn31_hpo_dp_link_encoder_mask hpo_dp_le_mask = {
+       DCN3_2_HPO_DP_LINK_ENC_MASK_SH_LIST(_MASK)
+};
+
+#define dpp_regs_init(id)\
+       DPP_REG_LIST_DCN30_COMMON_RI(id)
+
+static struct dcn3_dpp_registers dpp_regs[4];
+
+static const struct dcn3_dpp_shift tf_shift = {
+               DPP_REG_LIST_SH_MASK_DCN30_COMMON(__SHIFT)
+};
+
+static const struct dcn3_dpp_mask tf_mask = {
+               DPP_REG_LIST_SH_MASK_DCN30_COMMON(_MASK)
+};
+
+
+#define opp_regs_init(id)\
+       OPP_REG_LIST_DCN30_RI(id)
+
+static struct dcn20_opp_registers opp_regs[4];
+
+static const struct dcn20_opp_shift opp_shift = {
+       OPP_MASK_SH_LIST_DCN20(__SHIFT)
+};
+
+static const struct dcn20_opp_mask opp_mask = {
+       OPP_MASK_SH_LIST_DCN20(_MASK)
+};
+
+#define aux_engine_regs_init(id)\
+       ( \
+       AUX_COMMON_REG_LIST0_RI(id), \
+       SR_ARR_INIT(AUXN_IMPCAL, id, 0), \
+       SR_ARR_INIT(AUXP_IMPCAL, id, 0), \
+       SR_ARR_INIT(AUX_RESET_MASK, id, DP_AUX0_AUX_CONTROL__AUX_RESET_MASK), \
+       SR_ARR_INIT(AUX_RESET_MASK, id, DP_AUX0_AUX_CONTROL__AUX_RESET_MASK)\
+       )
+
+static struct dce110_aux_registers aux_engine_regs[5];
+
+static const struct dce110_aux_registers_shift aux_shift = {
+       DCN_AUX_MASK_SH_LIST(__SHIFT)
+};
+
+static const struct dce110_aux_registers_mask aux_mask = {
+       DCN_AUX_MASK_SH_LIST(_MASK)
+};
+
+#define dwbc_regs_dcn3_init(id)\
+       DWBC_COMMON_REG_LIST_DCN30_RI(id)
+
+static struct dcn30_dwbc_registers dwbc30_regs[1];
+
+static const struct dcn30_dwbc_shift dwbc30_shift = {
+       DWBC_COMMON_MASK_SH_LIST_DCN30(__SHIFT)
+};
+
+static const struct dcn30_dwbc_mask dwbc30_mask = {
+       DWBC_COMMON_MASK_SH_LIST_DCN30(_MASK)
+};
+
+#define mcif_wb_regs_dcn3_init(id)\
+       MCIF_WB_COMMON_REG_LIST_DCN32_RI(id)
+
+static struct dcn30_mmhubbub_registers mcif_wb30_regs[1];
+
+static const struct dcn30_mmhubbub_shift mcif_wb30_shift = {
+       MCIF_WB_COMMON_MASK_SH_LIST_DCN32(__SHIFT)
+};
+
+static const struct dcn30_mmhubbub_mask mcif_wb30_mask = {
+       MCIF_WB_COMMON_MASK_SH_LIST_DCN32(_MASK)
+};
+
+#define dsc_regsDCN20_init(id)\
+       DSC_REG_LIST_DCN20_RI(id)
+
+static struct dcn20_dsc_registers dsc_regs[4];
+
+static const struct dcn20_dsc_shift dsc_shift = {
+       DSC_REG_LIST_SH_MASK_DCN20(__SHIFT)
+};
+
+static const struct dcn20_dsc_mask dsc_mask = {
+       DSC_REG_LIST_SH_MASK_DCN20(_MASK)
+};
+
+static struct dcn30_mpc_registers mpc_regs;
+
+#define dcn_mpc_regs_init() \
+       MPC_REG_LIST_DCN3_2_RI(0),\
+       MPC_REG_LIST_DCN3_2_RI(1),\
+       MPC_REG_LIST_DCN3_2_RI(2),\
+       MPC_REG_LIST_DCN3_2_RI(3),\
+       MPC_OUT_MUX_REG_LIST_DCN3_0_RI(0),\
+       MPC_OUT_MUX_REG_LIST_DCN3_0_RI(1),\
+       MPC_OUT_MUX_REG_LIST_DCN3_0_RI(2),\
+       MPC_OUT_MUX_REG_LIST_DCN3_0_RI(3),\
+       MPC_DWB_MUX_REG_LIST_DCN3_0_RI(0)
+
+static const struct dcn30_mpc_shift mpc_shift = {
+       MPC_COMMON_MASK_SH_LIST_DCN32(__SHIFT)
+};
+
+static const struct dcn30_mpc_mask mpc_mask = {
+       MPC_COMMON_MASK_SH_LIST_DCN32(_MASK)
+};
+
+#define optc_regs_init(id)\
+       OPTC_COMMON_REG_LIST_DCN3_2_RI(id)
+
+static struct dcn_optc_registers optc_regs[4];
+
+static const struct dcn_optc_shift optc_shift = {
+       OPTC_COMMON_MASK_SH_LIST_DCN3_2(__SHIFT)
+};
+
+static const struct dcn_optc_mask optc_mask = {
+       OPTC_COMMON_MASK_SH_LIST_DCN3_2(_MASK)
+};
+
+#define hubp_regs_init(id)\
+       HUBP_REG_LIST_DCN32_RI(id)
+
+static struct dcn_hubp2_registers hubp_regs[4];
+
+
+static const struct dcn_hubp2_shift hubp_shift = {
+               HUBP_MASK_SH_LIST_DCN32(__SHIFT)
+};
+
+static const struct dcn_hubp2_mask hubp_mask = {
+               HUBP_MASK_SH_LIST_DCN32(_MASK)
+};
+
+static struct dcn_hubbub_registers hubbub_reg;
+#define hubbub_reg_init()\
+               HUBBUB_REG_LIST_DCN32_RI(0)
+
+static const struct dcn_hubbub_shift hubbub_shift = {
+               HUBBUB_MASK_SH_LIST_DCN32(__SHIFT)
+};
+
+static const struct dcn_hubbub_mask hubbub_mask = {
+               HUBBUB_MASK_SH_LIST_DCN32(_MASK)
+};
+
+static struct dccg_registers dccg_regs;
+
+#define dccg_regs_init()\
+       DCCG_REG_LIST_DCN32_RI()
+
+static const struct dccg_shift dccg_shift = {
+               DCCG_MASK_SH_LIST_DCN32(__SHIFT)
+};
+
+static const struct dccg_mask dccg_mask = {
+               DCCG_MASK_SH_LIST_DCN32(_MASK)
+};
+
+
+#define SRII2(reg_name_pre, reg_name_post, id)\
+       .reg_name_pre ## _ ##  reg_name_post[id] = BASE(reg ## reg_name_pre \
+                       ## id ## _ ## reg_name_post ## _BASE_IDX) + \
+                       reg ## reg_name_pre ## id ## _ ## reg_name_post
+
+
+#define HWSEQ_DCN32_REG_LIST()\
+       SR(DCHUBBUB_GLOBAL_TIMER_CNTL), \
+       SR(DIO_MEM_PWR_CTRL), \
+       SR(ODM_MEM_PWR_CTRL3), \
+       SR(MMHUBBUB_MEM_PWR_CNTL), \
+       SR(DCCG_GATE_DISABLE_CNTL), \
+       SR(DCCG_GATE_DISABLE_CNTL2), \
+       SR(DCFCLK_CNTL),\
+       SR(DC_MEM_GLOBAL_PWR_REQ_CNTL), \
+       SRII(PIXEL_RATE_CNTL, OTG, 0), \
+       SRII(PIXEL_RATE_CNTL, OTG, 1),\
+       SRII(PIXEL_RATE_CNTL, OTG, 2),\
+       SRII(PIXEL_RATE_CNTL, OTG, 3),\
+       SRII(PHYPLL_PIXEL_RATE_CNTL, OTG, 0),\
+       SRII(PHYPLL_PIXEL_RATE_CNTL, OTG, 1),\
+       SRII(PHYPLL_PIXEL_RATE_CNTL, OTG, 2),\
+       SRII(PHYPLL_PIXEL_RATE_CNTL, OTG, 3),\
+       SR(MICROSECOND_TIME_BASE_DIV), \
+       SR(MILLISECOND_TIME_BASE_DIV), \
+       SR(DISPCLK_FREQ_CHANGE_CNTL), \
+       SR(RBBMIF_TIMEOUT_DIS), \
+       SR(RBBMIF_TIMEOUT_DIS_2), \
+       SR(DCHUBBUB_CRC_CTRL), \
+       SR(DPP_TOP0_DPP_CRC_CTRL), \
+       SR(DPP_TOP0_DPP_CRC_VAL_B_A), \
+       SR(DPP_TOP0_DPP_CRC_VAL_R_G), \
+       SR(MPC_CRC_CTRL), \
+       SR(MPC_CRC_RESULT_GB), \
+       SR(MPC_CRC_RESULT_C), \
+       SR(MPC_CRC_RESULT_AR), \
+       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(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(D1VGA_CONTROL), \
+       SR(D2VGA_CONTROL), \
+       SR(D3VGA_CONTROL), \
+       SR(D4VGA_CONTROL), \
+       SR(D5VGA_CONTROL), \
+       SR(D6VGA_CONTROL), \
+       SR(DC_IP_REQUEST_CNTL), \
+       SR(AZALIA_AUDIO_DTO), \
+       SR(AZALIA_CONTROLLER_CLOCK_GATING)
+
+static struct dce_hwseq_registers hwseq_reg;
+
+#define hwseq_reg_init()\
+       HWSEQ_DCN32_REG_LIST()
+
+#define HWSEQ_DCN32_MASK_SH_LIST(mask_sh)\
+       HWSEQ_DCN_MASK_SH_LIST(mask_sh), \
+       HWS_SF(, DCHUBBUB_GLOBAL_TIMER_CNTL, DCHUBBUB_GLOBAL_TIMER_REFDIV, mask_sh), \
+       HWS_SF(, DOMAIN0_PG_CONFIG, DOMAIN_POWER_FORCEON, mask_sh), \
+       HWS_SF(, DOMAIN0_PG_CONFIG, DOMAIN_POWER_GATE, mask_sh), \
+       HWS_SF(, DOMAIN1_PG_CONFIG, DOMAIN_POWER_FORCEON, mask_sh), \
+       HWS_SF(, DOMAIN1_PG_CONFIG, DOMAIN_POWER_GATE, mask_sh), \
+       HWS_SF(, DOMAIN2_PG_CONFIG, DOMAIN_POWER_FORCEON, mask_sh), \
+       HWS_SF(, DOMAIN2_PG_CONFIG, DOMAIN_POWER_GATE, mask_sh), \
+       HWS_SF(, DOMAIN3_PG_CONFIG, DOMAIN_POWER_FORCEON, mask_sh), \
+       HWS_SF(, DOMAIN3_PG_CONFIG, DOMAIN_POWER_GATE, mask_sh), \
+       HWS_SF(, DOMAIN16_PG_CONFIG, DOMAIN_POWER_FORCEON, mask_sh), \
+       HWS_SF(, DOMAIN16_PG_CONFIG, DOMAIN_POWER_GATE, mask_sh), \
+       HWS_SF(, DOMAIN17_PG_CONFIG, DOMAIN_POWER_FORCEON, mask_sh), \
+       HWS_SF(, DOMAIN17_PG_CONFIG, DOMAIN_POWER_GATE, mask_sh), \
+       HWS_SF(, DOMAIN18_PG_CONFIG, DOMAIN_POWER_FORCEON, mask_sh), \
+       HWS_SF(, DOMAIN18_PG_CONFIG, DOMAIN_POWER_GATE, mask_sh), \
+       HWS_SF(, DOMAIN19_PG_CONFIG, DOMAIN_POWER_FORCEON, mask_sh), \
+       HWS_SF(, DOMAIN19_PG_CONFIG, DOMAIN_POWER_GATE, mask_sh), \
+       HWS_SF(, DOMAIN0_PG_STATUS, DOMAIN_PGFSM_PWR_STATUS, mask_sh), \
+       HWS_SF(, DOMAIN1_PG_STATUS, DOMAIN_PGFSM_PWR_STATUS, mask_sh), \
+       HWS_SF(, DOMAIN2_PG_STATUS, DOMAIN_PGFSM_PWR_STATUS, mask_sh), \
+       HWS_SF(, DOMAIN3_PG_STATUS, DOMAIN_PGFSM_PWR_STATUS, mask_sh), \
+       HWS_SF(, DOMAIN16_PG_STATUS, DOMAIN_PGFSM_PWR_STATUS, mask_sh), \
+       HWS_SF(, DOMAIN17_PG_STATUS, DOMAIN_PGFSM_PWR_STATUS, mask_sh), \
+       HWS_SF(, DOMAIN18_PG_STATUS, DOMAIN_PGFSM_PWR_STATUS, mask_sh), \
+       HWS_SF(, DOMAIN19_PG_STATUS, DOMAIN_PGFSM_PWR_STATUS, mask_sh), \
+       HWS_SF(, DC_IP_REQUEST_CNTL, IP_REQUEST_EN, mask_sh), \
+       HWS_SF(, AZALIA_AUDIO_DTO, AZALIA_AUDIO_DTO_MODULE, mask_sh), \
+       HWS_SF(, HPO_TOP_CLOCK_CONTROL, HPO_HDMISTREAMCLK_G_GATE_DIS, mask_sh), \
+       HWS_SF(, ODM_MEM_PWR_CTRL3, ODM_MEM_UNASSIGNED_PWR_MODE, mask_sh), \
+       HWS_SF(, ODM_MEM_PWR_CTRL3, ODM_MEM_VBLANK_PWR_MODE, mask_sh), \
+       HWS_SF(, MMHUBBUB_MEM_PWR_CNTL, VGA_MEM_PWR_FORCE, mask_sh)
+
+static const struct dce_hwseq_shift hwseq_shift = {
+               HWSEQ_DCN32_MASK_SH_LIST(__SHIFT)
+};
+
+static const struct dce_hwseq_mask hwseq_mask = {
+               HWSEQ_DCN32_MASK_SH_LIST(_MASK)
+};
+#define vmid_regs_init(id)\
+               DCN20_VMID_REG_LIST_RI(id)
+
+static struct dcn_vmid_registers vmid_regs[16];
+
+static const struct dcn20_vmid_shift vmid_shifts = {
+               DCN20_VMID_MASK_SH_LIST(__SHIFT)
+};
+
+static const struct dcn20_vmid_mask vmid_masks = {
+               DCN20_VMID_MASK_SH_LIST(_MASK)
+};
+
+static const struct resource_caps res_cap_dcn32 = {
+       .num_timing_generator = 4,
+       .num_opp = 4,
+       .num_video_plane = 4,
+       .num_audio = 5,
+       .num_stream_encoder = 5,
+       .num_hpo_dp_stream_encoder = 4,
+       .num_hpo_dp_link_encoder = 2,
+       .num_pll = 5,
+       .num_dwb = 1,
+       .num_ddc = 5,
+       .num_vmid = 16,
+       .num_mpc_3dlut = 4,
+       .num_dsc = 4,
+};
+
+static const struct dc_plane_cap plane_cap = {
+       .type = DC_PLANE_TYPE_DCN_UNIVERSAL,
+       .per_pixel_alpha = true,
+
+       .pixel_format_support = {
+                       .argb8888 = true,
+                       .nv12 = true,
+                       .fp16 = true,
+                       .p010 = true,
+                       .ayuv = false,
+       },
+
+       .max_upscale_factor = {
+                       .argb8888 = 16000,
+                       .nv12 = 16000,
+                       .fp16 = 16000
+       },
+
+       // 6:1 downscaling ratio: 1000/6 = 166.666
+       .max_downscale_factor = {
+                       .argb8888 = 167,
+                       .nv12 = 167,
+                       .fp16 = 167
+       },
+       64,
+       64
+};
+
+static const struct dc_debug_options debug_defaults_drv = {
+       .disable_dmcu = true,
+       .force_abm_enable = false,
+       .timing_trace = false,
+       .clock_trace = true,
+       .disable_pplib_clock_request = false,
+       .pipe_split_policy = MPC_SPLIT_AVOID, // Due to CRB, no need to MPC split anymore
+       .force_single_disp_pipe_split = false,
+       .disable_dcc = DCC_ENABLE,
+       .vsr_support = true,
+       .performance_trace = false,
+       .max_downscale_src_width = 7680,/*upto 8K*/
+       .disable_pplib_wm_range = false,
+       .scl_reset_length10 = true,
+       .sanity_checks = false,
+       .underflow_assert_delay_us = 0xFFFFFFFF,
+       .dwb_fi_phase = -1, // -1 = disable,
+       .dmub_command_table = true,
+       .enable_mem_low_power = {
+               .bits = {
+                       .vga = false,
+                       .i2c = false,
+                       .dmcu = false, // This is previously known to cause hang on S3 cycles if enabled
+                       .dscl = false,
+                       .cm = false,
+                       .mpc = false,
+                       .optc = true,
+               }
+       },
+       .use_max_lb = true,
+       .force_disable_subvp = false,
+       .exit_idle_opt_for_cursor_updates = true,
+       .using_dml2 = false,
+       .enable_single_display_2to1_odm_policy = true,
+
+       /* Must match enable_single_display_2to1_odm_policy to support dynamic ODM transitions*/
+       .enable_double_buffered_dsc_pg_support = true,
+       .enable_dp_dig_pixel_rate_div_policy = 1,
+       .allow_sw_cursor_fallback = false, // Linux can't do SW cursor "fallback"
+       .alloc_extra_way_for_cursor = true,
+       .min_prefetch_in_strobe_ns = 60000, // 60us
+       .disable_unbounded_requesting = false,
+       .override_dispclk_programming = true,
+       .disable_fpo_optimizations = false,
+       .fpo_vactive_margin_us = 2000, // 2000us
+       .disable_fpo_vactive = false,
+       .disable_boot_optimizations = false,
+       .disable_subvp_high_refresh = false,
+       .disable_dp_plus_plus_wa = true,
+       .fpo_vactive_min_active_margin_us = 200,
+       .fpo_vactive_max_blank_us = 1000,
+       .enable_legacy_fast_update = false,
+};
+
+static struct dce_aux *dcn32_aux_engine_create(
+       struct dc_context *ctx,
+       uint32_t inst)
+{
+       struct aux_engine_dce110 *aux_engine =
+               kzalloc(sizeof(struct aux_engine_dce110), GFP_KERNEL);
+
+       if (!aux_engine)
+               return NULL;
+
+#undef REG_STRUCT
+#define REG_STRUCT aux_engine_regs
+       aux_engine_regs_init(0),
+       aux_engine_regs_init(1),
+       aux_engine_regs_init(2),
+       aux_engine_regs_init(3),
+       aux_engine_regs_init(4);
+
+       dce110_aux_engine_construct(aux_engine, ctx, inst,
+                                   SW_AUX_TIMEOUT_PERIOD_MULTIPLIER * AUX_TIMEOUT_PERIOD,
+                                   &aux_engine_regs[inst],
+                                       &aux_mask,
+                                       &aux_shift,
+                                       ctx->dc->caps.extended_aux_timeout_support);
+
+       return &aux_engine->base;
+}
+#define i2c_inst_regs_init(id)\
+       I2C_HW_ENGINE_COMMON_REG_LIST_DCN30_RI(id)
+
+static struct dce_i2c_registers i2c_hw_regs[5];
+
+static const struct dce_i2c_shift i2c_shifts = {
+               I2C_COMMON_MASK_SH_LIST_DCN30(__SHIFT)
+};
+
+static const struct dce_i2c_mask i2c_masks = {
+               I2C_COMMON_MASK_SH_LIST_DCN30(_MASK)
+};
+
+static struct dce_i2c_hw *dcn32_i2c_hw_create(
+       struct dc_context *ctx,
+       uint32_t inst)
+{
+       struct dce_i2c_hw *dce_i2c_hw =
+               kzalloc(sizeof(struct dce_i2c_hw), GFP_KERNEL);
+
+       if (!dce_i2c_hw)
+               return NULL;
+
+#undef REG_STRUCT
+#define REG_STRUCT i2c_hw_regs
+       i2c_inst_regs_init(1),
+       i2c_inst_regs_init(2),
+       i2c_inst_regs_init(3),
+       i2c_inst_regs_init(4),
+       i2c_inst_regs_init(5);
+
+       dcn2_i2c_hw_construct(dce_i2c_hw, ctx, inst,
+                                   &i2c_hw_regs[inst], &i2c_shifts, &i2c_masks);
+
+       return dce_i2c_hw;
+}
+
+static struct clock_source *dcn32_clock_source_create(
+               struct dc_context *ctx,
+               struct dc_bios *bios,
+               enum clock_source_id id,
+               const struct dce110_clk_src_regs *regs,
+               bool dp_clk_src)
+{
+       struct dce110_clk_src *clk_src =
+               kzalloc(sizeof(struct dce110_clk_src), GFP_KERNEL);
+
+       if (!clk_src)
+               return NULL;
+
+       if (dcn31_clk_src_construct(clk_src, ctx, bios, id,
+                       regs, &cs_shift, &cs_mask)) {
+               clk_src->base.dp_clk_src = dp_clk_src;
+               return &clk_src->base;
+       }
+
+       kfree(clk_src);
+       BREAK_TO_DEBUGGER();
+       return NULL;
+}
+
+static struct hubbub *dcn32_hubbub_create(struct dc_context *ctx)
+{
+       int i;
+
+       struct dcn20_hubbub *hubbub2 = kzalloc(sizeof(struct dcn20_hubbub),
+                                         GFP_KERNEL);
+
+       if (!hubbub2)
+               return NULL;
+
+#undef REG_STRUCT
+#define REG_STRUCT hubbub_reg
+       hubbub_reg_init();
+
+#undef REG_STRUCT
+#define REG_STRUCT vmid_regs
+       vmid_regs_init(0),
+       vmid_regs_init(1),
+       vmid_regs_init(2),
+       vmid_regs_init(3),
+       vmid_regs_init(4),
+       vmid_regs_init(5),
+       vmid_regs_init(6),
+       vmid_regs_init(7),
+       vmid_regs_init(8),
+       vmid_regs_init(9),
+       vmid_regs_init(10),
+       vmid_regs_init(11),
+       vmid_regs_init(12),
+       vmid_regs_init(13),
+       vmid_regs_init(14),
+       vmid_regs_init(15);
+
+       hubbub32_construct(hubbub2, ctx,
+                       &hubbub_reg,
+                       &hubbub_shift,
+                       &hubbub_mask,
+                       ctx->dc->dml.ip.det_buffer_size_kbytes,
+                       ctx->dc->dml.ip.pixel_chunk_size_kbytes,
+                       ctx->dc->dml.ip.config_return_buffer_size_in_kbytes);
+
+
+       for (i = 0; i < res_cap_dcn32.num_vmid; i++) {
+               struct dcn20_vmid *vmid = &hubbub2->vmid[i];
+
+               vmid->ctx = ctx;
+
+               vmid->regs = &vmid_regs[i];
+               vmid->shifts = &vmid_shifts;
+               vmid->masks = &vmid_masks;
+       }
+
+       return &hubbub2->base;
+}
+
+static struct hubp *dcn32_hubp_create(
+       struct dc_context *ctx,
+       uint32_t inst)
+{
+       struct dcn20_hubp *hubp2 =
+               kzalloc(sizeof(struct dcn20_hubp), GFP_KERNEL);
+
+       if (!hubp2)
+               return NULL;
+
+#undef REG_STRUCT
+#define REG_STRUCT hubp_regs
+       hubp_regs_init(0),
+       hubp_regs_init(1),
+       hubp_regs_init(2),
+       hubp_regs_init(3);
+
+       if (hubp32_construct(hubp2, ctx, inst,
+                       &hubp_regs[inst], &hubp_shift, &hubp_mask))
+               return &hubp2->base;
+
+       BREAK_TO_DEBUGGER();
+       kfree(hubp2);
+       return NULL;
+}
+
+static void dcn32_dpp_destroy(struct dpp **dpp)
+{
+       kfree(TO_DCN30_DPP(*dpp));
+       *dpp = NULL;
+}
+
+static struct dpp *dcn32_dpp_create(
+       struct dc_context *ctx,
+       uint32_t inst)
+{
+       struct dcn3_dpp *dpp3 =
+               kzalloc(sizeof(struct dcn3_dpp), GFP_KERNEL);
+
+       if (!dpp3)
+               return NULL;
+
+#undef REG_STRUCT
+#define REG_STRUCT dpp_regs
+       dpp_regs_init(0),
+       dpp_regs_init(1),
+       dpp_regs_init(2),
+       dpp_regs_init(3);
+
+       if (dpp32_construct(dpp3, ctx, inst,
+                       &dpp_regs[inst], &tf_shift, &tf_mask))
+               return &dpp3->base;
+
+       BREAK_TO_DEBUGGER();
+       kfree(dpp3);
+       return NULL;
+}
+
+static struct mpc *dcn32_mpc_create(
+               struct dc_context *ctx,
+               int num_mpcc,
+               int num_rmu)
+{
+       struct dcn30_mpc *mpc30 = kzalloc(sizeof(struct dcn30_mpc),
+                                         GFP_KERNEL);
+
+       if (!mpc30)
+               return NULL;
+
+#undef REG_STRUCT
+#define REG_STRUCT mpc_regs
+       dcn_mpc_regs_init();
+
+       dcn32_mpc_construct(mpc30, ctx,
+                       &mpc_regs,
+                       &mpc_shift,
+                       &mpc_mask,
+                       num_mpcc,
+                       num_rmu);
+
+       return &mpc30->base;
+}
+
+static struct output_pixel_processor *dcn32_opp_create(
+       struct dc_context *ctx, uint32_t inst)
+{
+       struct dcn20_opp *opp2 =
+               kzalloc(sizeof(struct dcn20_opp), GFP_KERNEL);
+
+       if (!opp2) {
+               BREAK_TO_DEBUGGER();
+               return NULL;
+       }
+
+#undef REG_STRUCT
+#define REG_STRUCT opp_regs
+       opp_regs_init(0),
+       opp_regs_init(1),
+       opp_regs_init(2),
+       opp_regs_init(3);
+
+       dcn20_opp_construct(opp2, ctx, inst,
+                       &opp_regs[inst], &opp_shift, &opp_mask);
+       return &opp2->base;
+}
+
+
+static struct timing_generator *dcn32_timing_generator_create(
+               struct dc_context *ctx,
+               uint32_t instance)
+{
+       struct optc *tgn10 =
+               kzalloc(sizeof(struct optc), GFP_KERNEL);
+
+       if (!tgn10)
+               return NULL;
+
+#undef REG_STRUCT
+#define REG_STRUCT optc_regs
+       optc_regs_init(0),
+       optc_regs_init(1),
+       optc_regs_init(2),
+       optc_regs_init(3);
+
+       tgn10->base.inst = instance;
+       tgn10->base.ctx = ctx;
+
+       tgn10->tg_regs = &optc_regs[instance];
+       tgn10->tg_shift = &optc_shift;
+       tgn10->tg_mask = &optc_mask;
+
+       dcn32_timing_generator_init(tgn10);
+
+       return &tgn10->base;
+}
+
+static const struct encoder_feature_support link_enc_feature = {
+               .max_hdmi_deep_color = COLOR_DEPTH_121212,
+               .max_hdmi_pixel_clock = 600000,
+               .hdmi_ycbcr420_supported = true,
+               .dp_ycbcr420_supported = true,
+               .fec_supported = true,
+               .flags.bits.IS_HBR2_CAPABLE = true,
+               .flags.bits.IS_HBR3_CAPABLE = true,
+               .flags.bits.IS_TPS3_CAPABLE = true,
+               .flags.bits.IS_TPS4_CAPABLE = true
+};
+
+static struct link_encoder *dcn32_link_encoder_create(
+       struct dc_context *ctx,
+       const struct encoder_init_data *enc_init_data)
+{
+       struct dcn20_link_encoder *enc20 =
+               kzalloc(sizeof(struct dcn20_link_encoder), GFP_KERNEL);
+
+       if (!enc20)
+               return NULL;
+
+#undef REG_STRUCT
+#define REG_STRUCT link_enc_aux_regs
+       aux_regs_init(0),
+       aux_regs_init(1),
+       aux_regs_init(2),
+       aux_regs_init(3),
+       aux_regs_init(4);
+
+#undef REG_STRUCT
+#define REG_STRUCT link_enc_hpd_regs
+       hpd_regs_init(0),
+       hpd_regs_init(1),
+       hpd_regs_init(2),
+       hpd_regs_init(3),
+       hpd_regs_init(4);
+
+#undef REG_STRUCT
+#define REG_STRUCT link_enc_regs
+       link_regs_init(0, A),
+       link_regs_init(1, B),
+       link_regs_init(2, C),
+       link_regs_init(3, D),
+       link_regs_init(4, E);
+
+       dcn32_link_encoder_construct(enc20,
+                       enc_init_data,
+                       &link_enc_feature,
+                       &link_enc_regs[enc_init_data->transmitter],
+                       &link_enc_aux_regs[enc_init_data->channel - 1],
+                       &link_enc_hpd_regs[enc_init_data->hpd_source],
+                       &le_shift,
+                       &le_mask);
+
+       return &enc20->enc10.base;
+}
+
+struct panel_cntl *dcn32_panel_cntl_create(const struct panel_cntl_init_data *init_data)
+{
+       struct dcn31_panel_cntl *panel_cntl =
+               kzalloc(sizeof(struct dcn31_panel_cntl), GFP_KERNEL);
+
+       if (!panel_cntl)
+               return NULL;
+
+       dcn31_panel_cntl_construct(panel_cntl, init_data);
+
+       return &panel_cntl->base;
+}
+
+static void read_dce_straps(
+       struct dc_context *ctx,
+       struct resource_straps *straps)
+{
+       generic_reg_get(ctx, ctx->dcn_reg_offsets[regDC_PINSTRAPS_BASE_IDX] + regDC_PINSTRAPS,
+               FN(DC_PINSTRAPS, DC_PINSTRAPS_AUDIO), &straps->dc_pinstraps_audio);
+
+}
+
+static struct audio *dcn32_create_audio(
+               struct dc_context *ctx, unsigned int inst)
+{
+
+#undef REG_STRUCT
+#define REG_STRUCT audio_regs
+       audio_regs_init(0),
+       audio_regs_init(1),
+       audio_regs_init(2),
+       audio_regs_init(3),
+       audio_regs_init(4);
+
+       return dce_audio_create(ctx, inst,
+                       &audio_regs[inst], &audio_shift, &audio_mask);
+}
+
+static struct vpg *dcn32_vpg_create(
+       struct dc_context *ctx,
+       uint32_t inst)
+{
+       struct dcn30_vpg *vpg3 = kzalloc(sizeof(struct dcn30_vpg), GFP_KERNEL);
+
+       if (!vpg3)
+               return NULL;
+
+#undef REG_STRUCT
+#define REG_STRUCT vpg_regs
+       vpg_regs_init(0),
+       vpg_regs_init(1),
+       vpg_regs_init(2),
+       vpg_regs_init(3),
+       vpg_regs_init(4),
+       vpg_regs_init(5),
+       vpg_regs_init(6),
+       vpg_regs_init(7),
+       vpg_regs_init(8),
+       vpg_regs_init(9);
+
+       vpg3_construct(vpg3, ctx, inst,
+                       &vpg_regs[inst],
+                       &vpg_shift,
+                       &vpg_mask);
+
+       return &vpg3->base;
+}
+
+static struct afmt *dcn32_afmt_create(
+       struct dc_context *ctx,
+       uint32_t inst)
+{
+       struct dcn30_afmt *afmt3 = kzalloc(sizeof(struct dcn30_afmt), GFP_KERNEL);
+
+       if (!afmt3)
+               return NULL;
+
+#undef REG_STRUCT
+#define REG_STRUCT afmt_regs
+       afmt_regs_init(0),
+       afmt_regs_init(1),
+       afmt_regs_init(2),
+       afmt_regs_init(3),
+       afmt_regs_init(4),
+       afmt_regs_init(5);
+
+       afmt3_construct(afmt3, ctx, inst,
+                       &afmt_regs[inst],
+                       &afmt_shift,
+                       &afmt_mask);
+
+       return &afmt3->base;
+}
+
+static struct apg *dcn31_apg_create(
+       struct dc_context *ctx,
+       uint32_t inst)
+{
+       struct dcn31_apg *apg31 = kzalloc(sizeof(struct dcn31_apg), GFP_KERNEL);
+
+       if (!apg31)
+               return NULL;
+
+#undef REG_STRUCT
+#define REG_STRUCT apg_regs
+       apg_regs_init(0),
+       apg_regs_init(1),
+       apg_regs_init(2),
+       apg_regs_init(3);
+
+       apg31_construct(apg31, ctx, inst,
+                       &apg_regs[inst],
+                       &apg_shift,
+                       &apg_mask);
+
+       return &apg31->base;
+}
+
+static struct stream_encoder *dcn32_stream_encoder_create(
+       enum engine_id eng_id,
+       struct dc_context *ctx)
+{
+       struct dcn10_stream_encoder *enc1;
+       struct vpg *vpg;
+       struct afmt *afmt;
+       int vpg_inst;
+       int afmt_inst;
+
+       /* Mapping of VPG, AFMT, DME register blocks to DIO block instance */
+       if (eng_id <= ENGINE_ID_DIGF) {
+               vpg_inst = eng_id;
+               afmt_inst = eng_id;
+       } else
+               return NULL;
+
+       enc1 = kzalloc(sizeof(struct dcn10_stream_encoder), GFP_KERNEL);
+       vpg = dcn32_vpg_create(ctx, vpg_inst);
+       afmt = dcn32_afmt_create(ctx, afmt_inst);
+
+       if (!enc1 || !vpg || !afmt) {
+               kfree(enc1);
+               kfree(vpg);
+               kfree(afmt);
+               return NULL;
+       }
+
+#undef REG_STRUCT
+#define REG_STRUCT stream_enc_regs
+       stream_enc_regs_init(0),
+       stream_enc_regs_init(1),
+       stream_enc_regs_init(2),
+       stream_enc_regs_init(3),
+       stream_enc_regs_init(4);
+
+       dcn32_dio_stream_encoder_construct(enc1, ctx, ctx->dc_bios,
+                                       eng_id, vpg, afmt,
+                                       &stream_enc_regs[eng_id],
+                                       &se_shift, &se_mask);
+
+       return &enc1->base;
+}
+
+static struct hpo_dp_stream_encoder *dcn32_hpo_dp_stream_encoder_create(
+       enum engine_id eng_id,
+       struct dc_context *ctx)
+{
+       struct dcn31_hpo_dp_stream_encoder *hpo_dp_enc31;
+       struct vpg *vpg;
+       struct apg *apg;
+       uint32_t hpo_dp_inst;
+       uint32_t vpg_inst;
+       uint32_t apg_inst;
+
+       ASSERT((eng_id >= ENGINE_ID_HPO_DP_0) && (eng_id <= ENGINE_ID_HPO_DP_3));
+       hpo_dp_inst = eng_id - ENGINE_ID_HPO_DP_0;
+
+       /* Mapping of VPG register blocks to HPO DP block instance:
+        * VPG[6] -> HPO_DP[0]
+        * VPG[7] -> HPO_DP[1]
+        * VPG[8] -> HPO_DP[2]
+        * VPG[9] -> HPO_DP[3]
+        */
+       vpg_inst = hpo_dp_inst + 6;
+
+       /* Mapping of APG register blocks to HPO DP block instance:
+        * APG[0] -> HPO_DP[0]
+        * APG[1] -> HPO_DP[1]
+        * APG[2] -> HPO_DP[2]
+        * APG[3] -> HPO_DP[3]
+        */
+       apg_inst = hpo_dp_inst;
+
+       /* allocate HPO stream encoder and create VPG sub-block */
+       hpo_dp_enc31 = kzalloc(sizeof(struct dcn31_hpo_dp_stream_encoder), GFP_KERNEL);
+       vpg = dcn32_vpg_create(ctx, vpg_inst);
+       apg = dcn31_apg_create(ctx, apg_inst);
+
+       if (!hpo_dp_enc31 || !vpg || !apg) {
+               kfree(hpo_dp_enc31);
+               kfree(vpg);
+               kfree(apg);
+               return NULL;
+       }
+
+#undef REG_STRUCT
+#define REG_STRUCT hpo_dp_stream_enc_regs
+       hpo_dp_stream_encoder_reg_init(0),
+       hpo_dp_stream_encoder_reg_init(1),
+       hpo_dp_stream_encoder_reg_init(2),
+       hpo_dp_stream_encoder_reg_init(3);
+
+       dcn31_hpo_dp_stream_encoder_construct(hpo_dp_enc31, ctx, ctx->dc_bios,
+                                       hpo_dp_inst, eng_id, vpg, apg,
+                                       &hpo_dp_stream_enc_regs[hpo_dp_inst],
+                                       &hpo_dp_se_shift, &hpo_dp_se_mask);
+
+       return &hpo_dp_enc31->base;
+}
+
+static struct hpo_dp_link_encoder *dcn32_hpo_dp_link_encoder_create(
+       uint8_t inst,
+       struct dc_context *ctx)
+{
+       struct dcn31_hpo_dp_link_encoder *hpo_dp_enc31;
+
+       /* allocate HPO link encoder */
+       hpo_dp_enc31 = kzalloc(sizeof(struct dcn31_hpo_dp_link_encoder), GFP_KERNEL);
+
+#undef REG_STRUCT
+#define REG_STRUCT hpo_dp_link_enc_regs
+       hpo_dp_link_encoder_reg_init(0),
+       hpo_dp_link_encoder_reg_init(1);
+
+       hpo_dp_link_encoder32_construct(hpo_dp_enc31, ctx, inst,
+                                       &hpo_dp_link_enc_regs[inst],
+                                       &hpo_dp_le_shift, &hpo_dp_le_mask);
+
+       return &hpo_dp_enc31->base;
+}
+
+static struct dce_hwseq *dcn32_hwseq_create(
+       struct dc_context *ctx)
+{
+       struct dce_hwseq *hws = kzalloc(sizeof(struct dce_hwseq), GFP_KERNEL);
+
+#undef REG_STRUCT
+#define REG_STRUCT hwseq_reg
+       hwseq_reg_init();
+
+       if (hws) {
+               hws->ctx = ctx;
+               hws->regs = &hwseq_reg;
+               hws->shifts = &hwseq_shift;
+               hws->masks = &hwseq_mask;
+       }
+       return hws;
+}
+static const struct resource_create_funcs res_create_funcs = {
+       .read_dce_straps = read_dce_straps,
+       .create_audio = dcn32_create_audio,
+       .create_stream_encoder = dcn32_stream_encoder_create,
+       .create_hpo_dp_stream_encoder = dcn32_hpo_dp_stream_encoder_create,
+       .create_hpo_dp_link_encoder = dcn32_hpo_dp_link_encoder_create,
+       .create_hwseq = dcn32_hwseq_create,
+};
+
+static void dcn32_resource_destruct(struct dcn32_resource_pool *pool)
+{
+       unsigned int i;
+
+       for (i = 0; i < pool->base.stream_enc_count; i++) {
+               if (pool->base.stream_enc[i] != NULL) {
+                       if (pool->base.stream_enc[i]->vpg != NULL) {
+                               kfree(DCN30_VPG_FROM_VPG(pool->base.stream_enc[i]->vpg));
+                               pool->base.stream_enc[i]->vpg = NULL;
+                       }
+                       if (pool->base.stream_enc[i]->afmt != NULL) {
+                               kfree(DCN30_AFMT_FROM_AFMT(pool->base.stream_enc[i]->afmt));
+                               pool->base.stream_enc[i]->afmt = NULL;
+                       }
+                       kfree(DCN10STRENC_FROM_STRENC(pool->base.stream_enc[i]));
+                       pool->base.stream_enc[i] = NULL;
+               }
+       }
+
+       for (i = 0; i < pool->base.hpo_dp_stream_enc_count; i++) {
+               if (pool->base.hpo_dp_stream_enc[i] != NULL) {
+                       if (pool->base.hpo_dp_stream_enc[i]->vpg != NULL) {
+                               kfree(DCN30_VPG_FROM_VPG(pool->base.hpo_dp_stream_enc[i]->vpg));
+                               pool->base.hpo_dp_stream_enc[i]->vpg = NULL;
+                       }
+                       if (pool->base.hpo_dp_stream_enc[i]->apg != NULL) {
+                               kfree(DCN31_APG_FROM_APG(pool->base.hpo_dp_stream_enc[i]->apg));
+                               pool->base.hpo_dp_stream_enc[i]->apg = NULL;
+                       }
+                       kfree(DCN3_1_HPO_DP_STREAM_ENC_FROM_HPO_STREAM_ENC(pool->base.hpo_dp_stream_enc[i]));
+                       pool->base.hpo_dp_stream_enc[i] = NULL;
+               }
+       }
+
+       for (i = 0; i < pool->base.hpo_dp_link_enc_count; i++) {
+               if (pool->base.hpo_dp_link_enc[i] != NULL) {
+                       kfree(DCN3_1_HPO_DP_LINK_ENC_FROM_HPO_LINK_ENC(pool->base.hpo_dp_link_enc[i]));
+                       pool->base.hpo_dp_link_enc[i] = NULL;
+               }
+       }
+
+       for (i = 0; i < pool->base.res_cap->num_dsc; i++) {
+               if (pool->base.dscs[i] != NULL)
+                       dcn20_dsc_destroy(&pool->base.dscs[i]);
+       }
+
+       if (pool->base.mpc != NULL) {
+               kfree(TO_DCN20_MPC(pool->base.mpc));
+               pool->base.mpc = NULL;
+       }
+       if (pool->base.hubbub != NULL) {
+               kfree(TO_DCN20_HUBBUB(pool->base.hubbub));
+               pool->base.hubbub = NULL;
+       }
+       for (i = 0; i < pool->base.pipe_count; i++) {
+               if (pool->base.dpps[i] != NULL)
+                       dcn32_dpp_destroy(&pool->base.dpps[i]);
+
+               if (pool->base.ipps[i] != NULL)
+                       pool->base.ipps[i]->funcs->ipp_destroy(&pool->base.ipps[i]);
+
+               if (pool->base.hubps[i] != NULL) {
+                       kfree(TO_DCN20_HUBP(pool->base.hubps[i]));
+                       pool->base.hubps[i] = NULL;
+               }
+
+               if (pool->base.irqs != NULL) {
+                       dal_irq_service_destroy(&pool->base.irqs);
+               }
+       }
+
+       for (i = 0; i < pool->base.res_cap->num_ddc; i++) {
+               if (pool->base.engines[i] != NULL)
+                       dce110_engine_destroy(&pool->base.engines[i]);
+               if (pool->base.hw_i2cs[i] != NULL) {
+                       kfree(pool->base.hw_i2cs[i]);
+                       pool->base.hw_i2cs[i] = NULL;
+               }
+               if (pool->base.sw_i2cs[i] != NULL) {
+                       kfree(pool->base.sw_i2cs[i]);
+                       pool->base.sw_i2cs[i] = NULL;
+               }
+       }
+
+       for (i = 0; i < pool->base.res_cap->num_opp; i++) {
+               if (pool->base.opps[i] != NULL)
+                       pool->base.opps[i]->funcs->opp_destroy(&pool->base.opps[i]);
+       }
+
+       for (i = 0; i < pool->base.res_cap->num_timing_generator; i++) {
+               if (pool->base.timing_generators[i] != NULL)    {
+                       kfree(DCN10TG_FROM_TG(pool->base.timing_generators[i]));
+                       pool->base.timing_generators[i] = NULL;
+               }
+       }
+
+       for (i = 0; i < pool->base.res_cap->num_dwb; i++) {
+               if (pool->base.dwbc[i] != NULL) {
+                       kfree(TO_DCN30_DWBC(pool->base.dwbc[i]));
+                       pool->base.dwbc[i] = NULL;
+               }
+               if (pool->base.mcif_wb[i] != NULL) {
+                       kfree(TO_DCN30_MMHUBBUB(pool->base.mcif_wb[i]));
+                       pool->base.mcif_wb[i] = NULL;
+               }
+       }
+
+       for (i = 0; i < pool->base.audio_count; i++) {
+               if (pool->base.audios[i])
+                       dce_aud_destroy(&pool->base.audios[i]);
+       }
+
+       for (i = 0; i < pool->base.clk_src_count; i++) {
+               if (pool->base.clock_sources[i] != NULL) {
+                       dcn20_clock_source_destroy(&pool->base.clock_sources[i]);
+                       pool->base.clock_sources[i] = NULL;
+               }
+       }
+
+       for (i = 0; i < pool->base.res_cap->num_mpc_3dlut; i++) {
+               if (pool->base.mpc_lut[i] != NULL) {
+                       dc_3dlut_func_release(pool->base.mpc_lut[i]);
+                       pool->base.mpc_lut[i] = NULL;
+               }
+               if (pool->base.mpc_shaper[i] != NULL) {
+                       dc_transfer_func_release(pool->base.mpc_shaper[i]);
+                       pool->base.mpc_shaper[i] = NULL;
+               }
+       }
+
+       if (pool->base.dp_clock_source != NULL) {
+               dcn20_clock_source_destroy(&pool->base.dp_clock_source);
+               pool->base.dp_clock_source = NULL;
+       }
+
+       for (i = 0; i < pool->base.res_cap->num_timing_generator; i++) {
+               if (pool->base.multiple_abms[i] != NULL)
+                       dce_abm_destroy(&pool->base.multiple_abms[i]);
+       }
+
+       if (pool->base.psr != NULL)
+               dmub_psr_destroy(&pool->base.psr);
+
+       if (pool->base.dccg != NULL)
+               dcn_dccg_destroy(&pool->base.dccg);
+
+       if (pool->base.oem_device != NULL) {
+               struct dc *dc = pool->base.oem_device->ctx->dc;
+
+               dc->link_srv->destroy_ddc_service(&pool->base.oem_device);
+       }
+}
+
+
+static bool dcn32_dwbc_create(struct dc_context *ctx, struct resource_pool *pool)
+{
+       int i;
+       uint32_t dwb_count = pool->res_cap->num_dwb;
+
+       for (i = 0; i < dwb_count; i++) {
+               struct dcn30_dwbc *dwbc30 = kzalloc(sizeof(struct dcn30_dwbc),
+                                                   GFP_KERNEL);
+
+               if (!dwbc30) {
+                       dm_error("DC: failed to create dwbc30!\n");
+                       return false;
+               }
+
+#undef REG_STRUCT
+#define REG_STRUCT dwbc30_regs
+               dwbc_regs_dcn3_init(0);
+
+               dcn30_dwbc_construct(dwbc30, ctx,
+                               &dwbc30_regs[i],
+                               &dwbc30_shift,
+                               &dwbc30_mask,
+                               i);
+
+               pool->dwbc[i] = &dwbc30->base;
+       }
+       return true;
+}
+
+static bool dcn32_mmhubbub_create(struct dc_context *ctx, struct resource_pool *pool)
+{
+       int i;
+       uint32_t dwb_count = pool->res_cap->num_dwb;
+
+       for (i = 0; i < dwb_count; i++) {
+               struct dcn30_mmhubbub *mcif_wb30 = kzalloc(sizeof(struct dcn30_mmhubbub),
+                                                   GFP_KERNEL);
+
+               if (!mcif_wb30) {
+                       dm_error("DC: failed to create mcif_wb30!\n");
+                       return false;
+               }
+
+#undef REG_STRUCT
+#define REG_STRUCT mcif_wb30_regs
+               mcif_wb_regs_dcn3_init(0);
+
+               dcn32_mmhubbub_construct(mcif_wb30, ctx,
+                               &mcif_wb30_regs[i],
+                               &mcif_wb30_shift,
+                               &mcif_wb30_mask,
+                               i);
+
+               pool->mcif_wb[i] = &mcif_wb30->base;
+       }
+       return true;
+}
+
+static struct display_stream_compressor *dcn32_dsc_create(
+       struct dc_context *ctx, uint32_t inst)
+{
+       struct dcn20_dsc *dsc =
+               kzalloc(sizeof(struct dcn20_dsc), GFP_KERNEL);
+
+       if (!dsc) {
+               BREAK_TO_DEBUGGER();
+               return NULL;
+       }
+
+#undef REG_STRUCT
+#define REG_STRUCT dsc_regs
+       dsc_regsDCN20_init(0),
+       dsc_regsDCN20_init(1),
+       dsc_regsDCN20_init(2),
+       dsc_regsDCN20_init(3);
+
+       dsc2_construct(dsc, ctx, inst, &dsc_regs[inst], &dsc_shift, &dsc_mask);
+
+       dsc->max_image_width = 6016;
+
+       return &dsc->base;
+}
+
+static void dcn32_destroy_resource_pool(struct resource_pool **pool)
+{
+       struct dcn32_resource_pool *dcn32_pool = TO_DCN32_RES_POOL(*pool);
+
+       dcn32_resource_destruct(dcn32_pool);
+       kfree(dcn32_pool);
+       *pool = NULL;
+}
+
+bool dcn32_acquire_post_bldn_3dlut(
+               struct resource_context *res_ctx,
+               const struct resource_pool *pool,
+               int mpcc_id,
+               struct dc_3dlut **lut,
+               struct dc_transfer_func **shaper)
+{
+       bool ret = false;
+
+       ASSERT(*lut == NULL && *shaper == NULL);
+       *lut = NULL;
+       *shaper = NULL;
+
+       if (!res_ctx->is_mpc_3dlut_acquired[mpcc_id]) {
+               *lut = pool->mpc_lut[mpcc_id];
+               *shaper = pool->mpc_shaper[mpcc_id];
+               res_ctx->is_mpc_3dlut_acquired[mpcc_id] = true;
+               ret = true;
+       }
+       return ret;
+}
+
+bool dcn32_release_post_bldn_3dlut(
+               struct resource_context *res_ctx,
+               const struct resource_pool *pool,
+               struct dc_3dlut **lut,
+               struct dc_transfer_func **shaper)
+{
+       int i;
+       bool ret = false;
+
+       for (i = 0; i < pool->res_cap->num_mpc_3dlut; i++) {
+               if (pool->mpc_lut[i] == *lut && pool->mpc_shaper[i] == *shaper) {
+                       res_ctx->is_mpc_3dlut_acquired[i] = false;
+                       pool->mpc_lut[i]->state.raw = 0;
+                       *lut = NULL;
+                       *shaper = NULL;
+                       ret = true;
+                       break;
+               }
+       }
+       return ret;
+}
+
+static void dcn32_enable_phantom_plane(struct dc *dc,
+               struct dc_state *context,
+               struct dc_stream_state *phantom_stream,
+               unsigned int dc_pipe_idx)
+{
+       struct dc_plane_state *phantom_plane = NULL;
+       struct dc_plane_state *prev_phantom_plane = NULL;
+       struct pipe_ctx *curr_pipe = &context->res_ctx.pipe_ctx[dc_pipe_idx];
+
+       while (curr_pipe) {
+               if (curr_pipe->top_pipe && curr_pipe->top_pipe->plane_state == curr_pipe->plane_state)
+                       phantom_plane = prev_phantom_plane;
+               else
+                       phantom_plane = dc_create_plane_state(dc);
+
+               memcpy(&phantom_plane->address, &curr_pipe->plane_state->address, sizeof(phantom_plane->address));
+               memcpy(&phantom_plane->scaling_quality, &curr_pipe->plane_state->scaling_quality,
+                               sizeof(phantom_plane->scaling_quality));
+               memcpy(&phantom_plane->src_rect, &curr_pipe->plane_state->src_rect, sizeof(phantom_plane->src_rect));
+               memcpy(&phantom_plane->dst_rect, &curr_pipe->plane_state->dst_rect, sizeof(phantom_plane->dst_rect));
+               memcpy(&phantom_plane->clip_rect, &curr_pipe->plane_state->clip_rect, sizeof(phantom_plane->clip_rect));
+               memcpy(&phantom_plane->plane_size, &curr_pipe->plane_state->plane_size,
+                               sizeof(phantom_plane->plane_size));
+               memcpy(&phantom_plane->tiling_info, &curr_pipe->plane_state->tiling_info,
+                               sizeof(phantom_plane->tiling_info));
+               memcpy(&phantom_plane->dcc, &curr_pipe->plane_state->dcc, sizeof(phantom_plane->dcc));
+               phantom_plane->format = curr_pipe->plane_state->format;
+               phantom_plane->rotation = curr_pipe->plane_state->rotation;
+               phantom_plane->visible = curr_pipe->plane_state->visible;
+
+               /* Shadow pipe has small viewport. */
+               phantom_plane->clip_rect.y = 0;
+               phantom_plane->clip_rect.height = phantom_stream->src.height;
+
+               phantom_plane->is_phantom = true;
+
+               dc_add_plane_to_context(dc, phantom_stream, phantom_plane, context);
+
+               curr_pipe = curr_pipe->bottom_pipe;
+               prev_phantom_plane = phantom_plane;
+       }
+}
+
+static struct dc_stream_state *dcn32_enable_phantom_stream(struct dc *dc,
+               struct dc_state *context,
+               display_e2e_pipe_params_st *pipes,
+               unsigned int pipe_cnt,
+               unsigned int dc_pipe_idx)
+{
+       struct dc_stream_state *phantom_stream = NULL;
+       struct pipe_ctx *ref_pipe = &context->res_ctx.pipe_ctx[dc_pipe_idx];
+
+       phantom_stream = dc_create_stream_for_sink(ref_pipe->stream->sink);
+       phantom_stream->signal = SIGNAL_TYPE_VIRTUAL;
+       phantom_stream->dpms_off = true;
+       phantom_stream->mall_stream_config.type = SUBVP_PHANTOM;
+       phantom_stream->mall_stream_config.paired_stream = ref_pipe->stream;
+       ref_pipe->stream->mall_stream_config.type = SUBVP_MAIN;
+       ref_pipe->stream->mall_stream_config.paired_stream = phantom_stream;
+
+       /* stream has limited viewport and small timing */
+       memcpy(&phantom_stream->timing, &ref_pipe->stream->timing, sizeof(phantom_stream->timing));
+       memcpy(&phantom_stream->src, &ref_pipe->stream->src, sizeof(phantom_stream->src));
+       memcpy(&phantom_stream->dst, &ref_pipe->stream->dst, sizeof(phantom_stream->dst));
+       DC_FP_START();
+       dcn32_set_phantom_stream_timing(dc, context, ref_pipe, phantom_stream, pipes, pipe_cnt, dc_pipe_idx);
+       DC_FP_END();
+
+       dc_add_stream_to_ctx(dc, context, phantom_stream);
+       return phantom_stream;
+}
+
+void dcn32_retain_phantom_pipes(struct dc *dc, struct dc_state *context)
+{
+       int i;
+       struct dc_plane_state *phantom_plane = NULL;
+       struct dc_stream_state *phantom_stream = NULL;
+
+       for (i = 0; i < dc->res_pool->pipe_count; i++) {
+               struct pipe_ctx *pipe = &context->res_ctx.pipe_ctx[i];
+
+               if (resource_is_pipe_type(pipe, OTG_MASTER) &&
+                               resource_is_pipe_type(pipe, DPP_PIPE) &&
+                               pipe->stream->mall_stream_config.type == SUBVP_PHANTOM) {
+                       phantom_plane = pipe->plane_state;
+                       phantom_stream = pipe->stream;
+
+                       dc_plane_state_retain(phantom_plane);
+                       dc_stream_retain(phantom_stream);
+               }
+       }
+}
+
+// return true if removed piped from ctx, false otherwise
+bool dcn32_remove_phantom_pipes(struct dc *dc, struct dc_state *context, bool fast_update)
+{
+       int i;
+       bool removed_pipe = false;
+       struct dc_plane_state *phantom_plane = NULL;
+       struct dc_stream_state *phantom_stream = NULL;
+
+       for (i = 0; i < dc->res_pool->pipe_count; i++) {
+               struct pipe_ctx *pipe = &context->res_ctx.pipe_ctx[i];
+               // build scaling params for phantom pipes
+               if (pipe->plane_state && pipe->stream && pipe->stream->mall_stream_config.type == SUBVP_PHANTOM) {
+                       phantom_plane = pipe->plane_state;
+                       phantom_stream = pipe->stream;
+
+                       dc_rem_all_planes_for_stream(dc, pipe->stream, context);
+                       dc_remove_stream_from_ctx(dc, context, pipe->stream);
+
+                       /* Ref count is incremented on allocation and also when added to the context.
+                        * Therefore we must call release for the the phantom plane and stream once
+                        * they are removed from the ctx to finally decrement the refcount to 0 to free.
+                        */
+                       dc_plane_state_release(phantom_plane);
+                       dc_stream_release(phantom_stream);
+
+                       removed_pipe = true;
+               }
+
+               /* For non-full updates, a shallow copy of the current state
+                * is created. In this case we don't want to erase the current
+                * state (there can be 2 HIRQL threads, one in flip, and one in
+                * checkMPO) that can cause a race condition.
+                *
+                * This is just a workaround, needs a proper fix.
+                */
+               if (!fast_update) {
+                       // Clear all phantom stream info
+                       if (pipe->stream) {
+                               pipe->stream->mall_stream_config.type = SUBVP_NONE;
+                               pipe->stream->mall_stream_config.paired_stream = NULL;
+                       }
+
+                       if (pipe->plane_state) {
+                               pipe->plane_state->is_phantom = false;
+                       }
+               }
+       }
+       return removed_pipe;
+}
+
+/* TODO: Input to this function should indicate which pipe indexes (or streams)
+ * require a phantom pipe / stream
+ */
+void dcn32_add_phantom_pipes(struct dc *dc, struct dc_state *context,
+               display_e2e_pipe_params_st *pipes,
+               unsigned int pipe_cnt,
+               unsigned int index)
+{
+       struct dc_stream_state *phantom_stream = NULL;
+       unsigned int i;
+
+       // The index of the DC pipe passed into this function is guarenteed to
+       // be a valid candidate for SubVP (i.e. has a plane, stream, doesn't
+       // already have phantom pipe assigned, etc.) by previous checks.
+       phantom_stream = dcn32_enable_phantom_stream(dc, context, pipes, pipe_cnt, index);
+       dcn32_enable_phantom_plane(dc, context, phantom_stream, index);
+
+       for (i = 0; i < dc->res_pool->pipe_count; i++) {
+               struct pipe_ctx *pipe = &context->res_ctx.pipe_ctx[i];
+
+               // Build scaling params for phantom pipes which were newly added.
+               // We determine which phantom pipes were added by comparing with
+               // the phantom stream.
+               if (pipe->plane_state && pipe->stream && pipe->stream == phantom_stream &&
+                               pipe->stream->mall_stream_config.type == SUBVP_PHANTOM) {
+                       pipe->stream->use_dynamic_meta = false;
+                       pipe->plane_state->flip_immediate = false;
+                       if (!resource_build_scaling_params(pipe)) {
+                               // Log / remove phantom pipes since failed to build scaling params
+                       }
+               }
+       }
+}
+
+static bool dml1_validate(struct dc *dc, struct dc_state *context, bool fast_validate)
+{
+       bool out = false;
+
+       BW_VAL_TRACE_SETUP();
+
+       int vlevel = 0;
+       int pipe_cnt = 0;
+       display_e2e_pipe_params_st *pipes = kzalloc(dc->res_pool->pipe_count * sizeof(display_e2e_pipe_params_st), GFP_KERNEL);
+       struct mall_temp_config mall_temp_config;
+
+       /* To handle Freesync properly, setting FreeSync DML parameters
+        * to its default state for the first stage of validation
+        */
+       context->bw_ctx.bw.dcn.clk.fw_based_mclk_switching = false;
+       context->bw_ctx.dml.soc.dram_clock_change_requirement_final = true;
+
+       DC_LOGGER_INIT(dc->ctx->logger);
+
+       /* For fast validation, there are situations where a shallow copy of
+        * of the dc->current_state is created for the validation. In this case
+        * we want to save and restore the mall config because we always
+        * teardown subvp at the beginning of validation (and don't attempt
+        * to add it back if it's fast validation). If we don't restore the
+        * subvp config in cases of fast validation + shallow copy of the
+        * dc->current_state, the dc->current_state will have a partially
+        * removed subvp state when we did not intend to remove it.
+        */
+       if (fast_validate) {
+               memset(&mall_temp_config, 0, sizeof(mall_temp_config));
+               dcn32_save_mall_state(dc, context, &mall_temp_config);
+       }
+
+       BW_VAL_TRACE_COUNT();
+
+       DC_FP_START();
+       out = dcn32_internal_validate_bw(dc, context, pipes, &pipe_cnt, &vlevel, fast_validate);
+       DC_FP_END();
+
+       if (fast_validate)
+               dcn32_restore_mall_state(dc, context, &mall_temp_config);
+
+       if (pipe_cnt == 0)
+               goto validate_out;
+
+       if (!out)
+               goto validate_fail;
+
+       BW_VAL_TRACE_END_VOLTAGE_LEVEL();
+
+       if (fast_validate) {
+               BW_VAL_TRACE_SKIP(fast);
+               goto validate_out;
+       }
+
+       dc->res_pool->funcs->calculate_wm_and_dlg(dc, context, pipes, pipe_cnt, vlevel);
+
+       dcn32_override_min_req_memclk(dc, context);
+
+       BW_VAL_TRACE_END_WATERMARKS();
+
+       goto validate_out;
+
+validate_fail:
+       DC_LOG_WARNING("Mode Validation Warning: %s failed validation.\n",
+               dml_get_status_message(context->bw_ctx.dml.vba.ValidationStatus[context->bw_ctx.dml.vba.soc.num_states]));
+
+       BW_VAL_TRACE_SKIP(fail);
+       out = false;
+
+validate_out:
+       kfree(pipes);
+
+       BW_VAL_TRACE_FINISH();
+
+       return out;
+}
+
+bool dcn32_validate_bandwidth(struct dc *dc,
+               struct dc_state *context,
+               bool fast_validate)
+{
+       bool out = false;
+
+       if (dc->debug.using_dml2)
+               out = dml2_validate(dc, context, fast_validate);
+       else
+               out = dml1_validate(dc, context, fast_validate);
+       return out;
+}
+
+int dcn32_populate_dml_pipes_from_context(
+       struct dc *dc, struct dc_state *context,
+       display_e2e_pipe_params_st *pipes,
+       bool fast_validate)
+{
+       int i, pipe_cnt;
+       struct resource_context *res_ctx = &context->res_ctx;
+       struct pipe_ctx *pipe = NULL;
+       bool subvp_in_use = false;
+       struct dc_crtc_timing *timing;
+
+       dcn20_populate_dml_pipes_from_context(dc, context, pipes, fast_validate);
+
+       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];
+               timing = &pipe->stream->timing;
+
+               pipes[pipe_cnt].pipe.src.gpuvm = true;
+               DC_FP_START();
+               dcn32_zero_pipe_dcc_fraction(pipes, pipe_cnt);
+               DC_FP_END();
+               pipes[pipe_cnt].pipe.dest.vfront_porch = timing->v_front_porch;
+               pipes[pipe_cnt].pipe.dest.odm_combine_policy = dm_odm_combine_policy_dal;
+               pipes[pipe_cnt].pipe.src.gpuvm_min_page_size_kbytes = 256; // according to spreadsheet
+               pipes[pipe_cnt].pipe.src.unbounded_req_mode = false;
+               pipes[pipe_cnt].pipe.scale_ratio_depth.lb_depth = dm_lb_19;
+
+               /* Only populate DML input with subvp info for full updates.
+                * This is just a workaround -- needs a proper fix.
+                */
+               if (!fast_validate) {
+                       switch (pipe->stream->mall_stream_config.type) {
+                       case SUBVP_MAIN:
+                               pipes[pipe_cnt].pipe.src.use_mall_for_pstate_change = dm_use_mall_pstate_change_sub_viewport;
+                               subvp_in_use = true;
+                               break;
+                       case SUBVP_PHANTOM:
+                               pipes[pipe_cnt].pipe.src.use_mall_for_pstate_change = dm_use_mall_pstate_change_phantom_pipe;
+                               pipes[pipe_cnt].pipe.src.use_mall_for_static_screen = dm_use_mall_static_screen_disable;
+                               // Disallow unbounded req for SubVP according to DCHUB programming guide
+                               pipes[pipe_cnt].pipe.src.unbounded_req_mode = false;
+                               break;
+                       case SUBVP_NONE:
+                               pipes[pipe_cnt].pipe.src.use_mall_for_pstate_change = dm_use_mall_pstate_change_disable;
+                               pipes[pipe_cnt].pipe.src.use_mall_for_static_screen = dm_use_mall_static_screen_disable;
+                               break;
+                       default:
+                               break;
+                       }
+               }
+
+               pipes[pipe_cnt].dout.dsc_input_bpc = 0;
+               if (pipes[pipe_cnt].dout.dsc_enable) {
+                       switch (timing->display_color_depth) {
+                       case COLOR_DEPTH_888:
+                               pipes[pipe_cnt].dout.dsc_input_bpc = 8;
+                               break;
+                       case COLOR_DEPTH_101010:
+                               pipes[pipe_cnt].dout.dsc_input_bpc = 10;
+                               break;
+                       case COLOR_DEPTH_121212:
+                               pipes[pipe_cnt].dout.dsc_input_bpc = 12;
+                               break;
+                       default:
+                               ASSERT(0);
+                               break;
+                       }
+               }
+
+
+               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.
+        */
+       dcn32_set_det_allocations(dc, context, pipes);
+
+       // In general cases we want to keep the dram clock change requirement
+       // (prefer configs that support MCLK switch). Only override to false
+       // for SubVP
+       if (context->bw_ctx.bw.dcn.clk.fw_based_mclk_switching || subvp_in_use)
+               context->bw_ctx.dml.soc.dram_clock_change_requirement_final = false;
+       else
+               context->bw_ctx.dml.soc.dram_clock_change_requirement_final = true;
+
+       return pipe_cnt;
+}
+
+static struct dc_cap_funcs cap_funcs = {
+       .get_dcc_compression_cap = dcn20_get_dcc_compression_cap,
+       .get_subvp_en = dcn32_subvp_in_use,
+};
+
+void dcn32_calculate_wm_and_dlg(struct dc *dc, struct dc_state *context,
+                               display_e2e_pipe_params_st *pipes,
+                               int pipe_cnt,
+                               int vlevel)
+{
+    DC_FP_START();
+    dcn32_calculate_wm_and_dlg_fpu(dc, context, pipes, pipe_cnt, vlevel);
+    DC_FP_END();
+}
+
+static void dcn32_update_bw_bounding_box(struct dc *dc, struct clk_bw_params *bw_params)
+{
+       DC_FP_START();
+       dcn32_update_bw_bounding_box_fpu(dc, bw_params);
+       DC_FP_END();
+}
+
+static struct resource_funcs dcn32_res_pool_funcs = {
+       .destroy = dcn32_destroy_resource_pool,
+       .link_enc_create = dcn32_link_encoder_create,
+       .link_enc_create_minimal = NULL,
+       .panel_cntl_create = dcn32_panel_cntl_create,
+       .validate_bandwidth = dcn32_validate_bandwidth,
+       .calculate_wm_and_dlg = dcn32_calculate_wm_and_dlg,
+       .populate_dml_pipes = dcn32_populate_dml_pipes_from_context,
+       .acquire_free_pipe_as_secondary_dpp_pipe = dcn32_acquire_free_pipe_as_secondary_dpp_pipe,
+       .acquire_free_pipe_as_secondary_opp_head = dcn32_acquire_free_pipe_as_secondary_opp_head,
+       .release_pipe = dcn20_release_pipe,
+       .add_stream_to_ctx = dcn30_add_stream_to_ctx,
+       .add_dsc_to_stream_resource = dcn20_add_dsc_to_stream_resource,
+       .remove_stream_from_ctx = dcn20_remove_stream_from_ctx,
+       .populate_dml_writeback_from_context = dcn30_populate_dml_writeback_from_context,
+       .set_mcif_arb_params = dcn30_set_mcif_arb_params,
+       .find_first_free_match_stream_enc_for_link = dcn10_find_first_free_match_stream_enc_for_link,
+       .acquire_post_bldn_3dlut = dcn32_acquire_post_bldn_3dlut,
+       .release_post_bldn_3dlut = dcn32_release_post_bldn_3dlut,
+       .update_bw_bounding_box = dcn32_update_bw_bounding_box,
+       .patch_unknown_plane_state = dcn20_patch_unknown_plane_state,
+       .update_soc_for_wm_a = dcn30_update_soc_for_wm_a,
+       .add_phantom_pipes = dcn32_add_phantom_pipes,
+       .remove_phantom_pipes = dcn32_remove_phantom_pipes,
+       .retain_phantom_pipes = dcn32_retain_phantom_pipes,
+       .save_mall_state = dcn32_save_mall_state,
+       .restore_mall_state = dcn32_restore_mall_state,
+};
+
+static uint32_t read_pipe_fuses(struct dc_context *ctx)
+{
+       uint32_t value = REG_READ(CC_DC_PIPE_DIS);
+       /* DCN32 support max 4 pipes */
+       value = value & 0xf;
+       return value;
+}
+
+
+static bool dcn32_resource_construct(
+       uint8_t num_virtual_links,
+       struct dc *dc,
+       struct dcn32_resource_pool *pool)
+{
+       int i, j;
+       struct dc_context *ctx = dc->ctx;
+       struct irq_service_init_data init_data;
+       struct ddc_service_init_data ddc_init_data = {0};
+       uint32_t pipe_fuses = 0;
+       uint32_t num_pipes  = 4;
+
+#undef REG_STRUCT
+#define REG_STRUCT bios_regs
+       bios_regs_init();
+
+#undef REG_STRUCT
+#define REG_STRUCT clk_src_regs
+       clk_src_regs_init(0, A),
+       clk_src_regs_init(1, B),
+       clk_src_regs_init(2, C),
+       clk_src_regs_init(3, D),
+       clk_src_regs_init(4, E);
+
+#undef REG_STRUCT
+#define REG_STRUCT abm_regs
+       abm_regs_init(0),
+       abm_regs_init(1),
+       abm_regs_init(2),
+       abm_regs_init(3);
+
+#undef REG_STRUCT
+#define REG_STRUCT dccg_regs
+       dccg_regs_init();
+
+       DC_FP_START();
+
+       ctx->dc_bios->regs = &bios_regs;
+
+       pool->base.res_cap = &res_cap_dcn32;
+       /* max number of pipes for ASIC before checking for pipe fuses */
+       num_pipes  = pool->base.res_cap->num_timing_generator;
+       pipe_fuses = read_pipe_fuses(ctx);
+
+       for (i = 0; i < pool->base.res_cap->num_timing_generator; i++)
+               if (pipe_fuses & 1 << i)
+                       num_pipes--;
+
+       if (pipe_fuses & 1)
+               ASSERT(0); //Unexpected - Pipe 0 should always be fully functional!
+
+       if (pipe_fuses & CC_DC_PIPE_DIS__DC_FULL_DIS_MASK)
+               ASSERT(0); //Entire DCN is harvested!
+
+       /* within dml lib, initial value is hard coded, if ASIC pipe is fused, the
+        * value will be changed, update max_num_dpp and max_num_otg for dml.
+        */
+       dcn3_2_ip.max_num_dpp = num_pipes;
+       dcn3_2_ip.max_num_otg = num_pipes;
+
+       pool->base.funcs = &dcn32_res_pool_funcs;
+
+       /*************************************************
+        *  Resource + asic cap harcoding                *
+        *************************************************/
+       pool->base.underlay_pipe_index = NO_UNDERLAY_PIPE;
+       pool->base.timing_generator_count = num_pipes;
+       pool->base.pipe_count = num_pipes;
+       pool->base.mpcc_count = num_pipes;
+       dc->caps.max_downscale_ratio = 600;
+       dc->caps.i2c_speed_in_khz = 100;
+       dc->caps.i2c_speed_in_khz_hdcp = 100; /*1.4 w/a applied by default*/
+       /* TODO: Bring max_cursor_size back to 256 after subvp cursor corruption is fixed*/
+       dc->caps.max_cursor_size = 64;
+       dc->caps.min_horizontal_blanking_period = 80;
+       dc->caps.dmdata_alloc_size = 2048;
+       dc->caps.mall_size_per_mem_channel = 4;
+       dc->caps.mall_size_total = 0;
+       dc->caps.cursor_cache_size = dc->caps.max_cursor_size * dc->caps.max_cursor_size * 8;
+
+       dc->caps.cache_line_size = 64;
+       dc->caps.cache_num_ways = 16;
+
+       /* Calculate the available MALL space */
+       dc->caps.max_cab_allocation_bytes = dcn32_calc_num_avail_chans_for_mall(
+               dc, dc->ctx->dc_bios->vram_info.num_chans) *
+               dc->caps.mall_size_per_mem_channel * 1024 * 1024;
+       dc->caps.mall_size_total = dc->caps.max_cab_allocation_bytes;
+
+       dc->caps.subvp_fw_processing_delay_us = 15;
+       dc->caps.subvp_drr_max_vblank_margin_us = 40;
+       dc->caps.subvp_prefetch_end_to_mall_start_us = 15;
+       dc->caps.subvp_swath_height_margin_lines = 16;
+       dc->caps.subvp_pstate_allow_width_us = 20;
+       dc->caps.subvp_vertical_int_margin_us = 30;
+       dc->caps.subvp_drr_vblank_start_margin_us = 100; // 100us margin
+
+       dc->caps.max_slave_planes = 2;
+       dc->caps.max_slave_yuv_planes = 2;
+       dc->caps.max_slave_rgb_planes = 2;
+       dc->caps.post_blend_color_processing = true;
+       dc->caps.force_dp_tps4_for_cp2520 = true;
+       if (dc->config.forceHBR2CP2520)
+               dc->caps.force_dp_tps4_for_cp2520 = false;
+       dc->caps.dp_hpo = true;
+       dc->caps.dp_hdmi21_pcon_support = true;
+       dc->caps.edp_dsc_support = true;
+       dc->caps.extended_aux_timeout_support = true;
+       dc->caps.dmcub_support = true;
+       dc->caps.seamless_odm = true;
+       dc->caps.max_v_total = (1 << 15) - 1;
+
+       /* Color pipeline capabilities */
+       dc->caps.color.dpp.dcn_arch = 1;
+       dc->caps.color.dpp.input_lut_shared = 0;
+       dc->caps.color.dpp.icsc = 1;
+       dc->caps.color.dpp.dgam_ram = 0; // must use gamma_corr
+       dc->caps.color.dpp.dgam_rom_caps.srgb = 1;
+       dc->caps.color.dpp.dgam_rom_caps.bt2020 = 1;
+       dc->caps.color.dpp.dgam_rom_caps.gamma2_2 = 1;
+       dc->caps.color.dpp.dgam_rom_caps.pq = 1;
+       dc->caps.color.dpp.dgam_rom_caps.hlg = 1;
+       dc->caps.color.dpp.post_csc = 1;
+       dc->caps.color.dpp.gamma_corr = 1;
+       dc->caps.color.dpp.dgam_rom_for_yuv = 0;
+
+       dc->caps.color.dpp.hw_3d_lut = 1;
+       dc->caps.color.dpp.ogam_ram = 0;  // no OGAM in DPP since DCN1
+       // no OGAM ROM on DCN2 and later ASICs
+       dc->caps.color.dpp.ogam_rom_caps.srgb = 0;
+       dc->caps.color.dpp.ogam_rom_caps.bt2020 = 0;
+       dc->caps.color.dpp.ogam_rom_caps.gamma2_2 = 0;
+       dc->caps.color.dpp.ogam_rom_caps.pq = 0;
+       dc->caps.color.dpp.ogam_rom_caps.hlg = 0;
+       dc->caps.color.dpp.ocsc = 0;
+
+       dc->caps.color.mpc.gamut_remap = 1;
+       dc->caps.color.mpc.num_3dluts = pool->base.res_cap->num_mpc_3dlut; //4, configurable to be before or after BLND in MPCC
+       dc->caps.color.mpc.ogam_ram = 1;
+       dc->caps.color.mpc.ogam_rom_caps.srgb = 0;
+       dc->caps.color.mpc.ogam_rom_caps.bt2020 = 0;
+       dc->caps.color.mpc.ogam_rom_caps.gamma2_2 = 0;
+       dc->caps.color.mpc.ogam_rom_caps.pq = 0;
+       dc->caps.color.mpc.ogam_rom_caps.hlg = 0;
+       dc->caps.color.mpc.ocsc = 1;
+
+       /* Use pipe context based otg sync logic */
+       dc->config.use_pipe_ctx_sync_logic = true;
+
+       dc->config.dc_mode_clk_limit_support = true;
+       /* read VBIOS LTTPR caps */
+       {
+               if (ctx->dc_bios->funcs->get_lttpr_caps) {
+                       enum bp_result bp_query_result;
+                       uint8_t is_vbios_lttpr_enable = 0;
+
+                       bp_query_result = ctx->dc_bios->funcs->get_lttpr_caps(ctx->dc_bios, &is_vbios_lttpr_enable);
+                       dc->caps.vbios_lttpr_enable = (bp_query_result == BP_RESULT_OK) && !!is_vbios_lttpr_enable;
+               }
+
+               /* interop bit is implicit */
+               {
+                       dc->caps.vbios_lttpr_aware = true;
+               }
+       }
+
+       if (dc->ctx->dce_environment == DCE_ENV_PRODUCTION_DRV)
+               dc->debug = debug_defaults_drv;
+
+       // Init the vm_helper
+       if (dc->vm_helper)
+               vm_helper_init(dc->vm_helper, 16);
+
+       /*************************************************
+        *  Create resources                             *
+        *************************************************/
+
+       /* Clock Sources for Pixel Clock*/
+       pool->base.clock_sources[DCN32_CLK_SRC_PLL0] =
+                       dcn32_clock_source_create(ctx, ctx->dc_bios,
+                               CLOCK_SOURCE_COMBO_PHY_PLL0,
+                               &clk_src_regs[0], false);
+       pool->base.clock_sources[DCN32_CLK_SRC_PLL1] =
+                       dcn32_clock_source_create(ctx, ctx->dc_bios,
+                               CLOCK_SOURCE_COMBO_PHY_PLL1,
+                               &clk_src_regs[1], false);
+       pool->base.clock_sources[DCN32_CLK_SRC_PLL2] =
+                       dcn32_clock_source_create(ctx, ctx->dc_bios,
+                               CLOCK_SOURCE_COMBO_PHY_PLL2,
+                               &clk_src_regs[2], false);
+       pool->base.clock_sources[DCN32_CLK_SRC_PLL3] =
+                       dcn32_clock_source_create(ctx, ctx->dc_bios,
+                               CLOCK_SOURCE_COMBO_PHY_PLL3,
+                               &clk_src_regs[3], false);
+       pool->base.clock_sources[DCN32_CLK_SRC_PLL4] =
+                       dcn32_clock_source_create(ctx, ctx->dc_bios,
+                               CLOCK_SOURCE_COMBO_PHY_PLL4,
+                               &clk_src_regs[4], false);
+
+       pool->base.clk_src_count = DCN32_CLK_SRC_TOTAL;
+
+       /* todo: not reuse phy_pll registers */
+       pool->base.dp_clock_source =
+                       dcn32_clock_source_create(ctx, ctx->dc_bios,
+                               CLOCK_SOURCE_ID_DP_DTO,
+                               &clk_src_regs[0], true);
+
+       for (i = 0; i < pool->base.clk_src_count; i++) {
+               if (pool->base.clock_sources[i] == NULL) {
+                       dm_error("DC: failed to create clock sources!\n");
+                       BREAK_TO_DEBUGGER();
+                       goto create_fail;
+               }
+       }
+
+       /* DCCG */
+       pool->base.dccg = dccg32_create(ctx, &dccg_regs, &dccg_shift, &dccg_mask);
+       if (pool->base.dccg == NULL) {
+               dm_error("DC: failed to create dccg!\n");
+               BREAK_TO_DEBUGGER();
+               goto create_fail;
+       }
+
+       /* DML */
+       dml_init_instance(&dc->dml, &dcn3_2_soc, &dcn3_2_ip, DML_PROJECT_DCN32);
+
+       /* IRQ Service */
+       init_data.ctx = dc->ctx;
+       pool->base.irqs = dal_irq_service_dcn32_create(&init_data);
+       if (!pool->base.irqs)
+               goto create_fail;
+
+       /* HUBBUB */
+       pool->base.hubbub = dcn32_hubbub_create(ctx);
+       if (pool->base.hubbub == NULL) {
+               BREAK_TO_DEBUGGER();
+               dm_error("DC: failed to create hubbub!\n");
+               goto create_fail;
+       }
+
+       /* HUBPs, DPPs, OPPs, TGs, ABMs */
+       for (i = 0, j = 0; i < pool->base.res_cap->num_timing_generator; i++) {
+
+               /* if pipe is disabled, skip instance of HW pipe,
+                * i.e, skip ASIC register instance
+                */
+               if (pipe_fuses & 1 << i)
+                       continue;
+
+               /* HUBPs */
+               pool->base.hubps[j] = dcn32_hubp_create(ctx, i);
+               if (pool->base.hubps[j] == NULL) {
+                       BREAK_TO_DEBUGGER();
+                       dm_error(
+                               "DC: failed to create hubps!\n");
+                       goto create_fail;
+               }
+
+               /* DPPs */
+               pool->base.dpps[j] = dcn32_dpp_create(ctx, i);
+               if (pool->base.dpps[j] == NULL) {
+                       BREAK_TO_DEBUGGER();
+                       dm_error(
+                               "DC: failed to create dpps!\n");
+                       goto create_fail;
+               }
+
+               /* OPPs */
+               pool->base.opps[j] = dcn32_opp_create(ctx, i);
+               if (pool->base.opps[j] == NULL) {
+                       BREAK_TO_DEBUGGER();
+                       dm_error(
+                               "DC: failed to create output pixel processor!\n");
+                       goto create_fail;
+               }
+
+               /* TGs */
+               pool->base.timing_generators[j] = dcn32_timing_generator_create(
+                               ctx, i);
+               if (pool->base.timing_generators[j] == NULL) {
+                       BREAK_TO_DEBUGGER();
+                       dm_error("DC: failed to create tg!\n");
+                       goto create_fail;
+               }
+
+               /* ABMs */
+               pool->base.multiple_abms[j] = dmub_abm_create(ctx,
+                               &abm_regs[i],
+                               &abm_shift,
+                               &abm_mask);
+               if (pool->base.multiple_abms[j] == NULL) {
+                       dm_error("DC: failed to create abm for pipe %d!\n", i);
+                       BREAK_TO_DEBUGGER();
+                       goto create_fail;
+               }
+
+               /* index for resource pool arrays for next valid pipe */
+               j++;
+       }
+
+       /* PSR */
+       pool->base.psr = dmub_psr_create(ctx);
+       if (pool->base.psr == NULL) {
+               dm_error("DC: failed to create psr obj!\n");
+               BREAK_TO_DEBUGGER();
+               goto create_fail;
+       }
+
+       /* MPCCs */
+       pool->base.mpc = dcn32_mpc_create(ctx, pool->base.res_cap->num_timing_generator, pool->base.res_cap->num_mpc_3dlut);
+       if (pool->base.mpc == NULL) {
+               BREAK_TO_DEBUGGER();
+               dm_error("DC: failed to create mpc!\n");
+               goto create_fail;
+       }
+
+       /* DSCs */
+       for (i = 0; i < pool->base.res_cap->num_dsc; i++) {
+               pool->base.dscs[i] = dcn32_dsc_create(ctx, i);
+               if (pool->base.dscs[i] == NULL) {
+                       BREAK_TO_DEBUGGER();
+                       dm_error("DC: failed to create display stream compressor %d!\n", i);
+                       goto create_fail;
+               }
+       }
+
+       /* DWB */
+       if (!dcn32_dwbc_create(ctx, &pool->base)) {
+               BREAK_TO_DEBUGGER();
+               dm_error("DC: failed to create dwbc!\n");
+               goto create_fail;
+       }
+
+       /* MMHUBBUB */
+       if (!dcn32_mmhubbub_create(ctx, &pool->base)) {
+               BREAK_TO_DEBUGGER();
+               dm_error("DC: failed to create mcif_wb!\n");
+               goto create_fail;
+       }
+
+       /* AUX and I2C */
+       for (i = 0; i < pool->base.res_cap->num_ddc; i++) {
+               pool->base.engines[i] = dcn32_aux_engine_create(ctx, i);
+               if (pool->base.engines[i] == NULL) {
+                       BREAK_TO_DEBUGGER();
+                       dm_error(
+                               "DC:failed to create aux engine!!\n");
+                       goto create_fail;
+               }
+               pool->base.hw_i2cs[i] = dcn32_i2c_hw_create(ctx, i);
+               if (pool->base.hw_i2cs[i] == NULL) {
+                       BREAK_TO_DEBUGGER();
+                       dm_error(
+                               "DC:failed to create hw i2c!!\n");
+                       goto create_fail;
+               }
+               pool->base.sw_i2cs[i] = NULL;
+       }
+
+       /* Audio, HWSeq, Stream Encoders including HPO and virtual, MPC 3D LUTs */
+       if (!resource_construct(num_virtual_links, dc, &pool->base,
+                       &res_create_funcs))
+               goto create_fail;
+
+       /* HW Sequencer init functions and Plane caps */
+       dcn32_hw_sequencer_init_functions(dc);
+
+       dc->caps.max_planes =  pool->base.pipe_count;
+
+       for (i = 0; i < dc->caps.max_planes; ++i)
+               dc->caps.planes[i] = plane_cap;
+
+       dc->cap_funcs = cap_funcs;
+
+       if (dc->ctx->dc_bios->fw_info.oem_i2c_present) {
+               ddc_init_data.ctx = dc->ctx;
+               ddc_init_data.link = NULL;
+               ddc_init_data.id.id = dc->ctx->dc_bios->fw_info.oem_i2c_obj_id;
+               ddc_init_data.id.enum_id = 0;
+               ddc_init_data.id.type = OBJECT_TYPE_GENERIC;
+               pool->base.oem_device = dc->link_srv->create_ddc_service(&ddc_init_data);
+       } else {
+               pool->base.oem_device = NULL;
+       }
+
+       dc->dml2_options.dcn_pipe_count = pool->base.pipe_count;
+       dc->dml2_options.use_native_pstate_optimization = false;
+       dc->dml2_options.use_native_soc_bb_construction = true;
+       dc->dml2_options.minimize_dispclk_using_odm = true;
+
+       dc->dml2_options.callbacks.dc = dc;
+       dc->dml2_options.callbacks.build_scaling_params = &resource_build_scaling_params;
+       dc->dml2_options.callbacks.can_support_mclk_switch_using_fw_based_vblank_stretch = &dcn30_can_support_mclk_switch_using_fw_based_vblank_stretch;
+       dc->dml2_options.callbacks.acquire_secondary_pipe_for_mpc_odm = &dc_resource_acquire_secondary_pipe_for_mpc_odm_legacy;
+       dc->dml2_options.callbacks.update_pipes_for_stream_with_slice_count = &resource_update_pipes_for_stream_with_slice_count;
+       dc->dml2_options.callbacks.update_pipes_for_plane_with_slice_count = &resource_update_pipes_for_plane_with_slice_count;
+       dc->dml2_options.callbacks.get_mpc_slice_index = &resource_get_mpc_slice_index;
+       dc->dml2_options.callbacks.get_odm_slice_index = &resource_get_odm_slice_index;
+       dc->dml2_options.callbacks.get_opp_head = &resource_get_opp_head;
+
+       dc->dml2_options.svp_pstate.callbacks.dc = dc;
+       dc->dml2_options.svp_pstate.callbacks.add_plane_to_context = &dc_add_plane_to_context;
+       dc->dml2_options.svp_pstate.callbacks.add_stream_to_ctx = &dc_add_stream_to_ctx;
+       dc->dml2_options.svp_pstate.callbacks.build_scaling_params = &resource_build_scaling_params;
+       dc->dml2_options.svp_pstate.callbacks.create_plane = &dc_create_plane_state;
+       dc->dml2_options.svp_pstate.callbacks.remove_plane_from_context = &dc_remove_plane_from_context;
+       dc->dml2_options.svp_pstate.callbacks.remove_stream_from_ctx = &dc_remove_stream_from_ctx;
+       dc->dml2_options.svp_pstate.callbacks.create_stream_for_sink = &dc_create_stream_for_sink;
+       dc->dml2_options.svp_pstate.callbacks.plane_state_release = &dc_plane_state_release;
+       dc->dml2_options.svp_pstate.callbacks.stream_release = &dc_stream_release;
+       dc->dml2_options.svp_pstate.callbacks.release_dsc = &dcn20_release_dsc;
+
+       dc->dml2_options.svp_pstate.subvp_fw_processing_delay_us = dc->caps.subvp_fw_processing_delay_us;
+       dc->dml2_options.svp_pstate.subvp_prefetch_end_to_mall_start_us = dc->caps.subvp_prefetch_end_to_mall_start_us;
+       dc->dml2_options.svp_pstate.subvp_pstate_allow_width_us = dc->caps.subvp_pstate_allow_width_us;
+       dc->dml2_options.svp_pstate.subvp_swath_height_margin_lines = dc->caps.subvp_swath_height_margin_lines;
+
+       dc->dml2_options.svp_pstate.force_disable_subvp = dc->debug.force_disable_subvp;
+       dc->dml2_options.svp_pstate.force_enable_subvp = dc->debug.force_subvp_mclk_switch;
+
+       dc->dml2_options.mall_cfg.cache_line_size_bytes = dc->caps.cache_line_size;
+       dc->dml2_options.mall_cfg.cache_num_ways = dc->caps.cache_num_ways;
+       dc->dml2_options.mall_cfg.max_cab_allocation_bytes = dc->caps.max_cab_allocation_bytes;
+       dc->dml2_options.mall_cfg.mblk_height_4bpe_pixels = DCN3_2_MBLK_HEIGHT_4BPE;
+       dc->dml2_options.mall_cfg.mblk_height_8bpe_pixels = DCN3_2_MBLK_HEIGHT_8BPE;
+       dc->dml2_options.mall_cfg.mblk_size_bytes = DCN3_2_MALL_MBLK_SIZE_BYTES;
+       dc->dml2_options.mall_cfg.mblk_width_pixels = DCN3_2_MBLK_WIDTH;
+
+       dc->dml2_options.max_segments_per_hubp = 18;
+       dc->dml2_options.det_segment_size = DCN3_2_DET_SEG_SIZE;
+       dc->dml2_options.map_dc_pipes_with_callbacks = true;
+
+       if (ASICREV_IS_GC_11_0_3(dc->ctx->asic_id.hw_internal_rev) && (dc->config.sdpif_request_limit_words_per_umc == 0))
+               dc->config.sdpif_request_limit_words_per_umc = 16;
+
+       DC_FP_END();
+
+       return true;
+
+create_fail:
+
+       DC_FP_END();
+
+       dcn32_resource_destruct(pool);
+
+       return false;
+}
+
+struct resource_pool *dcn32_create_resource_pool(
+               const struct dc_init_data *init_data,
+               struct dc *dc)
+{
+       struct dcn32_resource_pool *pool =
+               kzalloc(sizeof(struct dcn32_resource_pool), GFP_KERNEL);
+
+       if (!pool)
+               return NULL;
+
+       if (dcn32_resource_construct(init_data->num_virtual_links, dc, pool))
+               return &pool->base;
+
+       BREAK_TO_DEBUGGER();
+       kfree(pool);
+       return NULL;
+}
+
+/*
+ * Find the most optimal free pipe from res_ctx, which could be used as a
+ * secondary dpp pipe for input opp head pipe.
+ *
+ * a free pipe - a pipe in input res_ctx not yet used for any streams or
+ * planes.
+ * secondary dpp pipe - a pipe gets inserted to a head OPP pipe's MPC blending
+ * tree. This is typical used for rendering MPO planes or additional offset
+ * areas in MPCC combine.
+ *
+ * Hardware Transition Minimization Algorithm for Finding a Secondary DPP Pipe
+ * -------------------------------------------------------------------------
+ *
+ * PROBLEM:
+ *
+ * 1. There is a hardware limitation that a secondary DPP pipe cannot be
+ * transferred from one MPC blending tree to the other in a single frame.
+ * Otherwise it could cause glitches on the screen.
+ *
+ * For instance, we cannot transition from state 1 to state 2 in one frame. This
+ * is because PIPE1 is transferred from PIPE0's MPC blending tree over to
+ * PIPE2's MPC blending tree, which is not supported by hardware.
+ * To support this transition we need to first remove PIPE1 from PIPE0's MPC
+ * blending tree in one frame and then insert PIPE1 to PIPE2's MPC blending tree
+ * in the next frame. This is not optimal as it will delay the flip for two
+ * frames.
+ *
+ *     State 1:
+ *     PIPE0 -- secondary DPP pipe --> (PIPE1)
+ *     PIPE2 -- secondary DPP pipe --> NONE
+ *
+ *     State 2:
+ *     PIPE0 -- secondary DPP pipe --> NONE
+ *     PIPE2 -- secondary DPP pipe --> (PIPE1)
+ *
+ * 2. We want to in general minimize the unnecessary changes in pipe topology.
+ * If a pipe is already added in current blending tree and there are no changes
+ * to plane topology, we don't want to swap it with another free pipe
+ * unnecessarily in every update. Powering up and down a pipe would require a
+ * full update which delays the flip for 1 frame. If we use the original pipe
+ * we don't have to toggle its power. So we can flip faster.
+ */
+static int find_optimal_free_pipe_as_secondary_dpp_pipe(
+               const struct resource_context *cur_res_ctx,
+               struct resource_context *new_res_ctx,
+               const struct resource_pool *pool,
+               const struct pipe_ctx *new_opp_head)
+{
+       const struct pipe_ctx *cur_opp_head;
+       int free_pipe_idx;
+
+       cur_opp_head = &cur_res_ctx->pipe_ctx[new_opp_head->pipe_idx];
+       free_pipe_idx = resource_find_free_pipe_used_in_cur_mpc_blending_tree(
+                       cur_res_ctx, new_res_ctx, cur_opp_head);
+
+       /* Up until here if we have not found a free secondary pipe, we will
+        * need to wait for at least one frame to complete the transition
+        * sequence.
+        */
+       if (free_pipe_idx == FREE_PIPE_INDEX_NOT_FOUND)
+               free_pipe_idx = recource_find_free_pipe_not_used_in_cur_res_ctx(
+                               cur_res_ctx, new_res_ctx, pool);
+
+       /* Up until here if we have not found a free secondary pipe, we will
+        * need to wait for at least two frames to complete the transition
+        * sequence. It really doesn't matter which pipe we decide take from
+        * current enabled pipes. It won't save our frame time when we swap only
+        * one pipe or more pipes.
+        */
+       if (free_pipe_idx == FREE_PIPE_INDEX_NOT_FOUND)
+               free_pipe_idx = resource_find_free_pipe_used_as_cur_sec_dpp_in_mpcc_combine(
+                               cur_res_ctx, new_res_ctx, pool);
+
+       if (free_pipe_idx == FREE_PIPE_INDEX_NOT_FOUND)
+               free_pipe_idx = resource_find_any_free_pipe(new_res_ctx, pool);
+
+       return free_pipe_idx;
+}
+
+static struct pipe_ctx *find_idle_secondary_pipe_check_mpo(
+               struct resource_context *res_ctx,
+               const struct resource_pool *pool,
+               const struct pipe_ctx *primary_pipe)
+{
+       int i;
+       struct pipe_ctx *secondary_pipe = NULL;
+       struct pipe_ctx *next_odm_mpo_pipe = NULL;
+       int primary_index, preferred_pipe_idx;
+       struct pipe_ctx *old_primary_pipe = NULL;
+
+       /*
+        * Modified from find_idle_secondary_pipe
+        * With windowed MPO and ODM, we want to avoid the case where we want a
+        *  free pipe for the left side but the free pipe is being used on the
+        *  right side.
+        * Add check on current_state if the primary_pipe is the left side,
+        *  to check the right side ( primary_pipe->next_odm_pipe ) to see if
+        *  it is using a pipe for MPO ( primary_pipe->next_odm_pipe->bottom_pipe )
+        * - If so, then don't use this pipe
+        * EXCEPTION - 3 plane ( 2 MPO plane ) case
+        * - in this case, the primary pipe has already gotten a free pipe for the
+        *  MPO window in the left
+        * - when it tries to get a free pipe for the MPO window on the right,
+        *  it will see that it is already assigned to the right side
+        *  ( primary_pipe->next_odm_pipe ).  But in this case, we want this
+        *  free pipe, since it will be for the right side.  So add an
+        *  additional condition, that skipping the free pipe on the right only
+        *  applies if the primary pipe has no bottom pipe currently assigned
+        */
+       if (primary_pipe) {
+               primary_index = primary_pipe->pipe_idx;
+               old_primary_pipe = &primary_pipe->stream->ctx->dc->current_state->res_ctx.pipe_ctx[primary_index];
+               if ((old_primary_pipe->next_odm_pipe) && (old_primary_pipe->next_odm_pipe->bottom_pipe)
+                       && (!primary_pipe->bottom_pipe))
+                       next_odm_mpo_pipe = old_primary_pipe->next_odm_pipe->bottom_pipe;
+
+               preferred_pipe_idx = (pool->pipe_count - 1) - primary_pipe->pipe_idx;
+               if ((res_ctx->pipe_ctx[preferred_pipe_idx].stream == NULL) &&
+                       !(next_odm_mpo_pipe && next_odm_mpo_pipe->pipe_idx == preferred_pipe_idx)) {
+                       secondary_pipe = &res_ctx->pipe_ctx[preferred_pipe_idx];
+                       secondary_pipe->pipe_idx = preferred_pipe_idx;
+               }
+       }
+
+       /*
+        * search backwards for the second pipe to keep pipe
+        * assignment more consistent
+        */
+       if (!secondary_pipe)
+               for (i = pool->pipe_count - 1; i >= 0; i--) {
+                       if ((res_ctx->pipe_ctx[i].stream == NULL) &&
+                               !(next_odm_mpo_pipe && next_odm_mpo_pipe->pipe_idx == i)) {
+                               secondary_pipe = &res_ctx->pipe_ctx[i];
+                               secondary_pipe->pipe_idx = i;
+                               break;
+                       }
+               }
+
+       return secondary_pipe;
+}
+
+static struct pipe_ctx *dcn32_acquire_idle_pipe_for_head_pipe_in_layer(
+               struct dc_state *state,
+               const struct resource_pool *pool,
+               struct dc_stream_state *stream,
+               const struct pipe_ctx *head_pipe)
+{
+       struct resource_context *res_ctx = &state->res_ctx;
+       struct pipe_ctx *idle_pipe, *pipe;
+       struct resource_context *old_ctx = &stream->ctx->dc->current_state->res_ctx;
+       int head_index;
+
+       if (!head_pipe)
+               ASSERT(0);
+
+       /*
+        * Modified from dcn20_acquire_idle_pipe_for_layer
+        * Check if head_pipe in old_context already has bottom_pipe allocated.
+        * - If so, check if that pipe is available in the current context.
+        * --  If so, reuse pipe from old_context
+        */
+       head_index = head_pipe->pipe_idx;
+       pipe = &old_ctx->pipe_ctx[head_index];
+       if (pipe->bottom_pipe && res_ctx->pipe_ctx[pipe->bottom_pipe->pipe_idx].stream == NULL) {
+               idle_pipe = &res_ctx->pipe_ctx[pipe->bottom_pipe->pipe_idx];
+               idle_pipe->pipe_idx = pipe->bottom_pipe->pipe_idx;
+       } else {
+               idle_pipe = find_idle_secondary_pipe_check_mpo(res_ctx, pool, head_pipe);
+               if (!idle_pipe)
+                       return NULL;
+       }
+
+       idle_pipe->stream = head_pipe->stream;
+       idle_pipe->stream_res.tg = head_pipe->stream_res.tg;
+       idle_pipe->stream_res.opp = head_pipe->stream_res.opp;
+
+       idle_pipe->plane_res.hubp = pool->hubps[idle_pipe->pipe_idx];
+       idle_pipe->plane_res.ipp = pool->ipps[idle_pipe->pipe_idx];
+       idle_pipe->plane_res.dpp = pool->dpps[idle_pipe->pipe_idx];
+       idle_pipe->plane_res.mpcc_inst = pool->dpps[idle_pipe->pipe_idx]->inst;
+
+       return idle_pipe;
+}
+
+static int find_optimal_free_pipe_as_secondary_opp_head(
+               const struct resource_context *cur_res_ctx,
+               struct resource_context *new_res_ctx,
+               const struct resource_pool *pool,
+               const struct pipe_ctx *new_otg_master)
+{
+       const struct pipe_ctx *cur_otg_master;
+       int free_pipe_idx;
+
+       cur_otg_master =  &cur_res_ctx->pipe_ctx[new_otg_master->pipe_idx];
+       free_pipe_idx = resource_find_free_pipe_used_as_sec_opp_head_by_cur_otg_master(
+                       cur_res_ctx, new_res_ctx, cur_otg_master);
+
+       /* Up until here if we have not found a free secondary pipe, we will
+        * need to wait for at least one frame to complete the transition
+        * sequence.
+        */
+       if (free_pipe_idx == FREE_PIPE_INDEX_NOT_FOUND)
+               free_pipe_idx = recource_find_free_pipe_not_used_in_cur_res_ctx(
+                               cur_res_ctx, new_res_ctx, pool);
+
+       if (free_pipe_idx == FREE_PIPE_INDEX_NOT_FOUND)
+               free_pipe_idx = resource_find_any_free_pipe(new_res_ctx, pool);
+
+       return free_pipe_idx;
+}
+
+struct pipe_ctx *dcn32_acquire_free_pipe_as_secondary_dpp_pipe(
+               const struct dc_state *cur_ctx,
+               struct dc_state *new_ctx,
+               const struct resource_pool *pool,
+               const struct pipe_ctx *opp_head_pipe)
+{
+
+       int free_pipe_idx;
+       struct pipe_ctx *free_pipe;
+
+       if (!opp_head_pipe->stream->ctx->dc->config.enable_windowed_mpo_odm)
+               return dcn32_acquire_idle_pipe_for_head_pipe_in_layer(
+                               new_ctx, pool, opp_head_pipe->stream, opp_head_pipe);
+
+       free_pipe_idx = find_optimal_free_pipe_as_secondary_dpp_pipe(
+                                       &cur_ctx->res_ctx, &new_ctx->res_ctx,
+                                       pool, opp_head_pipe);
+       if (free_pipe_idx >= 0) {
+               free_pipe = &new_ctx->res_ctx.pipe_ctx[free_pipe_idx];
+               free_pipe->pipe_idx = free_pipe_idx;
+               free_pipe->stream = opp_head_pipe->stream;
+               free_pipe->stream_res.tg = opp_head_pipe->stream_res.tg;
+               free_pipe->stream_res.opp = opp_head_pipe->stream_res.opp;
+
+               free_pipe->plane_res.hubp = pool->hubps[free_pipe->pipe_idx];
+               free_pipe->plane_res.ipp = pool->ipps[free_pipe->pipe_idx];
+               free_pipe->plane_res.dpp = pool->dpps[free_pipe->pipe_idx];
+               free_pipe->plane_res.mpcc_inst =
+                               pool->dpps[free_pipe->pipe_idx]->inst;
+       } else {
+               ASSERT(opp_head_pipe);
+               free_pipe = NULL;
+       }
+
+       return free_pipe;
+}
+
+struct pipe_ctx *dcn32_acquire_free_pipe_as_secondary_opp_head(
+               const struct dc_state *cur_ctx,
+               struct dc_state *new_ctx,
+               const struct resource_pool *pool,
+               const struct pipe_ctx *otg_master)
+{
+       int free_pipe_idx = find_optimal_free_pipe_as_secondary_opp_head(
+                       &cur_ctx->res_ctx, &new_ctx->res_ctx,
+                       pool, otg_master);
+       struct pipe_ctx *free_pipe;
+
+       if (free_pipe_idx >= 0) {
+               free_pipe = &new_ctx->res_ctx.pipe_ctx[free_pipe_idx];
+               free_pipe->pipe_idx = free_pipe_idx;
+               free_pipe->stream = otg_master->stream;
+               free_pipe->stream_res.tg = otg_master->stream_res.tg;
+               free_pipe->stream_res.dsc = NULL;
+               free_pipe->stream_res.opp = pool->opps[free_pipe_idx];
+               free_pipe->plane_res.mi = pool->mis[free_pipe_idx];
+               free_pipe->plane_res.hubp = pool->hubps[free_pipe_idx];
+               free_pipe->plane_res.ipp = pool->ipps[free_pipe_idx];
+               free_pipe->plane_res.xfm = pool->transforms[free_pipe_idx];
+               free_pipe->plane_res.dpp = pool->dpps[free_pipe_idx];
+               free_pipe->plane_res.mpcc_inst = pool->dpps[free_pipe_idx]->inst;
+               if (free_pipe->stream->timing.flags.DSC == 1) {
+                       dcn20_acquire_dsc(free_pipe->stream->ctx->dc,
+                                       &new_ctx->res_ctx,
+                                       &free_pipe->stream_res.dsc,
+                                       free_pipe_idx);
+                       ASSERT(free_pipe->stream_res.dsc);
+                       if (free_pipe->stream_res.dsc == NULL) {
+                               memset(free_pipe, 0, sizeof(*free_pipe));
+                               free_pipe = NULL;
+                       }
+               }
+       } else {
+               ASSERT(otg_master);
+               free_pipe = NULL;
+       }
+
+       return free_pipe;
+}
+
+unsigned int dcn32_calc_num_avail_chans_for_mall(struct dc *dc, int num_chans)
+{
+       /*
+        * DCN32 and DCN321 SKUs may have different sizes for MALL
+        *  but we may not be able to access all the MALL space.
+        *  If the num_chans is power of 2, then we can access all
+        *  of the available MALL space.  Otherwise, we can only
+        *  access:
+        *
+        *  max_cab_size_in_bytes = total_cache_size_in_bytes *
+        *    ((2^floor(log2(num_chans)))/num_chans)
+        *
+        * Calculating the MALL sizes for all available SKUs, we
+        *  have come up with the follow simplified check.
+        * - we have max_chans which provides the max MALL size.
+        *  Each chans supports 4MB of MALL so:
+        *
+        *  total_cache_size_in_bytes = max_chans * 4 MB
+        *
+        * - we have avail_chans which shows the number of channels
+        *  we can use if we can't access the entire MALL space.
+        *  It is generally half of max_chans
+        * - so we use the following checks:
+        *
+        *   if (num_chans == max_chans), return max_chans
+        *   if (num_chans < max_chans), return avail_chans
+        *
+        * - exception is GC_11_0_0 where we can't access max_chans,
+        *  so we define max_avail_chans as the maximum available
+        *  MALL space
+        *
+        */
+       int gc_11_0_0_max_chans = 48;
+       int gc_11_0_0_max_avail_chans = 32;
+       int gc_11_0_0_avail_chans = 16;
+       int gc_11_0_3_max_chans = 16;
+       int gc_11_0_3_avail_chans = 8;
+       int gc_11_0_2_max_chans = 8;
+       int gc_11_0_2_avail_chans = 4;
+
+       if (ASICREV_IS_GC_11_0_0(dc->ctx->asic_id.hw_internal_rev)) {
+               return (num_chans == gc_11_0_0_max_chans) ?
+                       gc_11_0_0_max_avail_chans : gc_11_0_0_avail_chans;
+       } else if (ASICREV_IS_GC_11_0_2(dc->ctx->asic_id.hw_internal_rev)) {
+               return (num_chans == gc_11_0_2_max_chans) ?
+                       gc_11_0_2_max_chans : gc_11_0_2_avail_chans;
+       } else { // if (ASICREV_IS_GC_11_0_3(dc->ctx->asic_id.hw_internal_rev)) {
+               return (num_chans == gc_11_0_3_max_chans) ?
+                       gc_11_0_3_max_chans : gc_11_0_3_avail_chans;
+       }
+}
diff --git a/drivers/gpu/drm/amd/display/dc/resource/dcn32/dcn32_resource.h b/drivers/gpu/drm/amd/display/dc/resource/dcn32/dcn32_resource.h
new file mode 100644 (file)
index 0000000..b931008
--- /dev/null
@@ -0,0 +1,1263 @@
+/*
+ * 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
+ *
+ */
+
+#ifndef _DCN32_RESOURCE_H_
+#define _DCN32_RESOURCE_H_
+
+#include "core_types.h"
+
+#define DCN3_2_DEFAULT_DET_SIZE 256
+#define DCN3_2_MAX_DET_SIZE 1152
+#define DCN3_2_MIN_DET_SIZE 128
+#define DCN3_2_MIN_COMPBUF_SIZE_KB 128
+#define DCN3_2_DET_SEG_SIZE 64
+#define DCN3_2_MALL_MBLK_SIZE_BYTES 65536 // 64 * 1024
+#define DCN3_2_MBLK_WIDTH 128
+#define DCN3_2_MBLK_HEIGHT_4BPE 128
+#define DCN3_2_MBLK_HEIGHT_8BPE 64
+#define DCN3_2_DCFCLK_DS_INIT_KHZ 10000 // Choose 10Mhz for init DCFCLK DS freq
+#define SUBVP_HIGH_REFRESH_LIST_LEN 4
+#define DCN3_2_MAX_SUBVP_PIXEL_RATE_MHZ 1800
+#define DCN3_2_VMIN_DISPCLK_HZ 717000000
+
+#define TO_DCN32_RES_POOL(pool)\
+       container_of(pool, struct dcn32_resource_pool, base)
+
+extern struct _vcs_dpi_ip_params_st dcn3_2_ip;
+extern struct _vcs_dpi_soc_bounding_box_st dcn3_2_soc;
+
+struct subvp_high_refresh_list {
+       int min_refresh;
+       int max_refresh;
+       struct resolution {
+               int width;
+               int height;
+       } res[SUBVP_HIGH_REFRESH_LIST_LEN];
+};
+
+struct dcn32_resource_pool {
+       struct resource_pool base;
+};
+
+struct resource_pool *dcn32_create_resource_pool(
+               const struct dc_init_data *init_data,
+               struct dc *dc);
+
+struct panel_cntl *dcn32_panel_cntl_create(
+               const struct panel_cntl_init_data *init_data);
+
+bool dcn32_acquire_post_bldn_3dlut(
+               struct resource_context *res_ctx,
+               const struct resource_pool *pool,
+               int mpcc_id,
+               struct dc_3dlut **lut,
+               struct dc_transfer_func **shaper);
+
+bool dcn32_release_post_bldn_3dlut(
+               struct resource_context *res_ctx,
+               const struct resource_pool *pool,
+               struct dc_3dlut **lut,
+               struct dc_transfer_func **shaper);
+
+bool dcn32_remove_phantom_pipes(struct dc *dc,
+               struct dc_state *context, bool fast_update);
+
+void dcn32_retain_phantom_pipes(struct dc *dc,
+               struct dc_state *context);
+
+void dcn32_add_phantom_pipes(struct dc *dc,
+               struct dc_state *context,
+               display_e2e_pipe_params_st *pipes,
+               unsigned int pipe_cnt,
+               unsigned int index);
+
+bool dcn32_validate_bandwidth(struct dc *dc,
+               struct dc_state *context,
+               bool fast_validate);
+
+int dcn32_populate_dml_pipes_from_context(
+       struct dc *dc, struct dc_state *context,
+       display_e2e_pipe_params_st *pipes,
+       bool fast_validate);
+
+void dcn32_calculate_wm_and_dlg(
+               struct dc *dc, struct dc_state *context,
+               display_e2e_pipe_params_st *pipes,
+               int pipe_cnt,
+               int vlevel);
+
+uint32_t dcn32_helper_mall_bytes_to_ways(
+               struct dc *dc,
+               uint32_t total_size_in_mall_bytes);
+
+uint32_t dcn32_helper_calculate_mall_bytes_for_cursor(
+               struct dc *dc,
+               struct pipe_ctx *pipe_ctx,
+               bool ignore_cursor_buf);
+
+uint32_t dcn32_helper_calculate_num_ways_for_subvp(
+               struct dc *dc,
+               struct dc_state *context);
+
+void dcn32_merge_pipes_for_subvp(struct dc *dc,
+               struct dc_state *context);
+
+bool dcn32_all_pipes_have_stream_and_plane(struct dc *dc,
+               struct dc_state *context);
+
+bool dcn32_subvp_in_use(struct dc *dc,
+               struct dc_state *context);
+
+bool dcn32_mpo_in_use(struct dc_state *context);
+
+bool dcn32_any_surfaces_rotated(struct dc *dc, struct dc_state *context);
+bool dcn32_is_center_timing(struct pipe_ctx *pipe);
+bool dcn32_is_psr_capable(struct pipe_ctx *pipe);
+
+struct pipe_ctx *dcn32_acquire_free_pipe_as_secondary_dpp_pipe(
+               const struct dc_state *cur_ctx,
+               struct dc_state *new_ctx,
+               const struct resource_pool *pool,
+               const struct pipe_ctx *opp_head_pipe);
+
+struct pipe_ctx *dcn32_acquire_free_pipe_as_secondary_opp_head(
+               const struct dc_state *cur_ctx,
+               struct dc_state *new_ctx,
+               const struct resource_pool *pool,
+               const struct pipe_ctx *otg_master);
+
+void dcn32_release_pipe(struct dc_state *context,
+                       struct pipe_ctx *pipe,
+                       const struct resource_pool *pool);
+
+void dcn32_determine_det_override(struct dc *dc,
+               struct dc_state *context,
+               display_e2e_pipe_params_st *pipes);
+
+void dcn32_set_det_allocations(struct dc *dc, struct dc_state *context,
+       display_e2e_pipe_params_st *pipes);
+
+void dcn32_save_mall_state(struct dc *dc,
+               struct dc_state *context,
+               struct mall_temp_config *temp_config);
+
+void dcn32_restore_mall_state(struct dc *dc,
+               struct dc_state *context,
+               struct mall_temp_config *temp_config);
+
+struct dc_stream_state *dcn32_can_support_mclk_switch_using_fw_based_vblank_stretch(struct dc *dc, const struct dc_state *context);
+
+bool dcn32_allow_subvp_with_active_margin(struct pipe_ctx *pipe);
+
+bool dcn32_allow_subvp_high_refresh_rate(struct dc *dc, struct dc_state *context, struct pipe_ctx *pipe);
+
+unsigned int dcn32_calc_num_avail_chans_for_mall(struct dc *dc, int num_chans);
+
+double dcn32_determine_max_vratio_prefetch(struct dc *dc, struct dc_state *context);
+
+bool dcn32_check_native_scaling_for_res(struct pipe_ctx *pipe, unsigned int width, unsigned int height);
+
+bool dcn32_subvp_drr_admissable(struct dc *dc, struct dc_state *context);
+
+bool dcn32_subvp_vblank_admissable(struct dc *dc, struct dc_state *context, int vlevel);
+
+/* definitions for run time init of reg offsets */
+
+/* CLK SRC */
+#define CS_COMMON_REG_LIST_DCN3_0_RI(index, pllid)                             \
+  SRI_ARR_ALPHABET(PIXCLK_RESYNC_CNTL, PHYPLL, index, pllid),                  \
+      SRII_ARR_2(PHASE, DP_DTO, 0, index),                                     \
+      SRII_ARR_2(PHASE, DP_DTO, 1, index),                                     \
+      SRII_ARR_2(PHASE, DP_DTO, 2, index),                                     \
+      SRII_ARR_2(PHASE, DP_DTO, 3, index),                                     \
+      SRII_ARR_2(MODULO, DP_DTO, 0, index),                                    \
+      SRII_ARR_2(MODULO, DP_DTO, 1, index),                                    \
+      SRII_ARR_2(MODULO, DP_DTO, 2, index),                                    \
+      SRII_ARR_2(MODULO, DP_DTO, 3, index),                                    \
+      SRII_ARR_2(PIXEL_RATE_CNTL, OTG, 0, index),                              \
+      SRII_ARR_2(PIXEL_RATE_CNTL, OTG, 1, index),                              \
+      SRII_ARR_2(PIXEL_RATE_CNTL, OTG, 2, index),                              \
+      SRII_ARR_2(PIXEL_RATE_CNTL, OTG, 3, index)
+
+/* ABM */
+#define ABM_DCN32_REG_LIST_RI(id)                                              \
+  SRI_ARR(DC_ABM1_HG_SAMPLE_RATE, ABM, id),                                    \
+      SRI_ARR(DC_ABM1_LS_SAMPLE_RATE, ABM, id),                                \
+      SRI_ARR(BL1_PWM_BL_UPDATE_SAMPLE_RATE, ABM, id),                         \
+      SRI_ARR(DC_ABM1_HG_MISC_CTRL, ABM, id),                                  \
+      SRI_ARR(DC_ABM1_IPCSC_COEFF_SEL, ABM, id),                               \
+      SRI_ARR(BL1_PWM_CURRENT_ABM_LEVEL, ABM, id),                             \
+      SRI_ARR(BL1_PWM_TARGET_ABM_LEVEL, ABM, id),                              \
+      SRI_ARR(BL1_PWM_USER_LEVEL, ABM, id),                                    \
+      SRI_ARR(DC_ABM1_LS_MIN_MAX_PIXEL_VALUE_THRES, ABM, id),                  \
+      SRI_ARR(DC_ABM1_HGLS_REG_READ_PROGRESS, ABM, id),                        \
+      SRI_ARR(DC_ABM1_ACE_OFFSET_SLOPE_0, ABM, id),                            \
+      SRI_ARR(DC_ABM1_ACE_THRES_12, ABM, id), NBIO_SR_ARR(BIOS_SCRATCH_2, id)
+
+/* Audio */
+#define AUD_COMMON_REG_LIST_RI(id)                                             \
+  SRI_ARR(AZALIA_F0_CODEC_ENDPOINT_INDEX, AZF0ENDPOINT, id),                   \
+      SRI_ARR(AZALIA_F0_CODEC_ENDPOINT_DATA, AZF0ENDPOINT, id),                \
+      SR_ARR(AZALIA_F0_CODEC_FUNCTION_PARAMETER_STREAM_FORMATS, id),           \
+      SR_ARR(AZALIA_F0_CODEC_FUNCTION_PARAMETER_SUPPORTED_SIZE_RATES, id),     \
+      SR_ARR(AZALIA_F0_CODEC_FUNCTION_PARAMETER_POWER_STATES, id),             \
+      SR_ARR(DCCG_AUDIO_DTO_SOURCE, id), SR_ARR(DCCG_AUDIO_DTO0_MODULE, id),   \
+      SR_ARR(DCCG_AUDIO_DTO0_PHASE, id), SR_ARR(DCCG_AUDIO_DTO1_MODULE, id),   \
+      SR_ARR(DCCG_AUDIO_DTO1_PHASE, id)                                        \
+
+/* VPG */
+
+#define VPG_DCN3_REG_LIST_RI(id)                                               \
+  SRI_ARR(VPG_GENERIC_STATUS, VPG, id),                                        \
+      SRI_ARR(VPG_GENERIC_PACKET_ACCESS_CTRL, VPG, id),                        \
+      SRI_ARR(VPG_GENERIC_PACKET_DATA, VPG, id),                               \
+      SRI_ARR(VPG_GSP_FRAME_UPDATE_CTRL, VPG, id),                             \
+      SRI_ARR(VPG_GSP_IMMEDIATE_UPDATE_CTRL, VPG, id)
+
+/* AFMT */
+#define AFMT_DCN3_REG_LIST_RI(id)                                              \
+  SRI_ARR(AFMT_INFOFRAME_CONTROL0, AFMT, id),                                  \
+      SRI_ARR(AFMT_VBI_PACKET_CONTROL, AFMT, id),                              \
+      SRI_ARR(AFMT_AUDIO_PACKET_CONTROL, AFMT, id),                            \
+      SRI_ARR(AFMT_AUDIO_PACKET_CONTROL2, AFMT, id),                           \
+      SRI_ARR(AFMT_AUDIO_SRC_CONTROL, AFMT, id),                               \
+      SRI_ARR(AFMT_60958_0, AFMT, id), SRI_ARR(AFMT_60958_1, AFMT, id),        \
+      SRI_ARR(AFMT_60958_2, AFMT, id), SRI_ARR(AFMT_MEM_PWR, AFMT, id)
+
+/* APG */
+#define APG_DCN31_REG_LIST_RI(id)                                              \
+  SRI_ARR(APG_CONTROL, APG, id), SRI_ARR(APG_CONTROL2, APG, id),               \
+      SRI_ARR(APG_MEM_PWR, APG, id), SRI_ARR(APG_DBG_GEN_CONTROL, APG, id)
+
+/* Stream encoder */
+#define SE_DCN32_REG_LIST_RI(id)                                               \
+  SRI_ARR(AFMT_CNTL, DIG, id), SRI_ARR(DIG_FE_CNTL, DIG, id),                  \
+      SRI_ARR(HDMI_CONTROL, DIG, id), SRI_ARR(HDMI_DB_CONTROL, DIG, id),       \
+      SRI_ARR(HDMI_GC, DIG, id),                                               \
+      SRI_ARR(HDMI_GENERIC_PACKET_CONTROL0, DIG, id),                          \
+      SRI_ARR(HDMI_GENERIC_PACKET_CONTROL1, DIG, id),                          \
+      SRI_ARR(HDMI_GENERIC_PACKET_CONTROL2, DIG, id),                          \
+      SRI_ARR(HDMI_GENERIC_PACKET_CONTROL3, DIG, id),                          \
+      SRI_ARR(HDMI_GENERIC_PACKET_CONTROL4, DIG, id),                          \
+      SRI_ARR(HDMI_GENERIC_PACKET_CONTROL5, DIG, id),                          \
+      SRI_ARR(HDMI_GENERIC_PACKET_CONTROL6, DIG, id),                          \
+      SRI_ARR(HDMI_GENERIC_PACKET_CONTROL7, DIG, id),                          \
+      SRI_ARR(HDMI_GENERIC_PACKET_CONTROL8, DIG, id),                          \
+      SRI_ARR(HDMI_GENERIC_PACKET_CONTROL9, DIG, id),                          \
+      SRI_ARR(HDMI_GENERIC_PACKET_CONTROL10, DIG, id),                         \
+      SRI_ARR(HDMI_INFOFRAME_CONTROL0, DIG, id),                               \
+      SRI_ARR(HDMI_INFOFRAME_CONTROL1, DIG, id),                               \
+      SRI_ARR(HDMI_VBI_PACKET_CONTROL, DIG, id),                               \
+      SRI_ARR(HDMI_AUDIO_PACKET_CONTROL, DIG, id),                             \
+      SRI_ARR(HDMI_ACR_PACKET_CONTROL, DIG, id),                               \
+      SRI_ARR(HDMI_ACR_32_0, DIG, id), SRI_ARR(HDMI_ACR_32_1, DIG, id),        \
+      SRI_ARR(HDMI_ACR_44_0, DIG, id), SRI_ARR(HDMI_ACR_44_1, DIG, id),        \
+      SRI_ARR(HDMI_ACR_48_0, DIG, id), SRI_ARR(HDMI_ACR_48_1, DIG, id),        \
+      SRI_ARR(DP_DB_CNTL, DP, id), SRI_ARR(DP_MSA_MISC, DP, id),               \
+      SRI_ARR(DP_MSA_VBID_MISC, DP, id), SRI_ARR(DP_MSA_COLORIMETRY, DP, id),  \
+      SRI_ARR(DP_MSA_TIMING_PARAM1, DP, id),                                   \
+      SRI_ARR(DP_MSA_TIMING_PARAM2, DP, id),                                   \
+      SRI_ARR(DP_MSA_TIMING_PARAM3, DP, id),                                   \
+      SRI_ARR(DP_MSA_TIMING_PARAM4, DP, id),                                   \
+      SRI_ARR(DP_MSE_RATE_CNTL, DP, id), SRI_ARR(DP_MSE_RATE_UPDATE, DP, id),  \
+      SRI_ARR(DP_PIXEL_FORMAT, DP, id), SRI_ARR(DP_SEC_CNTL, DP, id),          \
+      SRI_ARR(DP_SEC_CNTL1, DP, id), SRI_ARR(DP_SEC_CNTL2, DP, id),            \
+      SRI_ARR(DP_SEC_CNTL5, DP, id), SRI_ARR(DP_SEC_CNTL6, DP, id),            \
+      SRI_ARR(DP_STEER_FIFO, DP, id), SRI_ARR(DP_VID_M, DP, id),               \
+      SRI_ARR(DP_VID_N, DP, id), SRI_ARR(DP_VID_STREAM_CNTL, DP, id),          \
+      SRI_ARR(DP_VID_TIMING, DP, id), SRI_ARR(DP_SEC_AUD_N, DP, id),           \
+      SRI_ARR(DP_SEC_TIMESTAMP, DP, id), SRI_ARR(DP_DSC_CNTL, DP, id),         \
+      SRI_ARR(DP_SEC_METADATA_TRANSMISSION, DP, id),                           \
+      SRI_ARR(HDMI_METADATA_PACKET_CONTROL, DIG, id),                          \
+      SRI_ARR(DP_SEC_FRAMING4, DP, id), SRI_ARR(DP_GSP11_CNTL, DP, id),        \
+      SRI_ARR(DME_CONTROL, DME, id),                                           \
+      SRI_ARR(DP_SEC_METADATA_TRANSMISSION, DP, id),                           \
+      SRI_ARR(HDMI_METADATA_PACKET_CONTROL, DIG, id),                          \
+      SRI_ARR(DIG_FE_CNTL, DIG, id), SRI_ARR(DIG_CLOCK_PATTERN, DIG, id),      \
+      SRI_ARR(DIG_FIFO_CTRL0, DIG, id)
+
+/* Aux regs */
+
+#define AUX_REG_LIST_RI(id)                                                    \
+  SRI_ARR(AUX_CONTROL, DP_AUX, id), SRI_ARR(AUX_DPHY_RX_CONTROL0, DP_AUX, id), \
+      SRI_ARR(AUX_DPHY_RX_CONTROL1, DP_AUX, id)
+
+#define DCN2_AUX_REG_LIST_RI(id)                                               \
+  AUX_REG_LIST_RI(id), SRI_ARR(AUX_DPHY_TX_CONTROL, DP_AUX, id)
+
+/* HDP */
+#define HPD_REG_LIST_RI(id) SRI_ARR(DC_HPD_CONTROL, HPD, id)
+
+/* Link encoder */
+#define LE_DCN3_REG_LIST_RI(id)                                                \
+  SRI_ARR(DIG_BE_CNTL, DIG, id), SRI_ARR(DIG_BE_EN_CNTL, DIG, id),             \
+      SRI_ARR(TMDS_CTL_BITS, DIG, id),                                         \
+      SRI_ARR(TMDS_DCBALANCER_CONTROL, DIG, id), SRI_ARR(DP_CONFIG, DP, id),   \
+      SRI_ARR(DP_DPHY_CNTL, DP, id), SRI_ARR(DP_DPHY_PRBS_CNTL, DP, id),       \
+      SRI_ARR(DP_DPHY_SCRAM_CNTL, DP, id), SRI_ARR(DP_DPHY_SYM0, DP, id),      \
+      SRI_ARR(DP_DPHY_SYM1, DP, id), SRI_ARR(DP_DPHY_SYM2, DP, id),            \
+      SRI_ARR(DP_DPHY_TRAINING_PATTERN_SEL, DP, id),                           \
+      SRI_ARR(DP_LINK_CNTL, DP, id), SRI_ARR(DP_LINK_FRAMING_CNTL, DP, id),    \
+      SRI_ARR(DP_MSE_SAT0, DP, id), SRI_ARR(DP_MSE_SAT1, DP, id),              \
+      SRI_ARR(DP_MSE_SAT2, DP, id), SRI_ARR(DP_MSE_SAT_UPDATE, DP, id),        \
+      SRI_ARR(DP_SEC_CNTL, DP, id), SRI_ARR(DP_VID_STREAM_CNTL, DP, id),       \
+      SRI_ARR(DP_DPHY_FAST_TRAINING, DP, id), SRI_ARR(DP_SEC_CNTL1, DP, id),   \
+      SRI_ARR(DP_DPHY_BS_SR_SWAP_CNTL, DP, id),                                \
+      SRI_ARR(DP_DPHY_HBR2_PATTERN_CONTROL, DP, id)
+
+#define LE_DCN31_REG_LIST_RI(id)                                               \
+  LE_DCN3_REG_LIST_RI(id), SRI_ARR(DP_DPHY_INTERNAL_CTRL, DP, id),             \
+      SR_ARR(DIO_LINKA_CNTL, id), SR_ARR(DIO_LINKB_CNTL, id),                  \
+      SR_ARR(DIO_LINKC_CNTL, id), SR_ARR(DIO_LINKD_CNTL, id),                  \
+      SR_ARR(DIO_LINKE_CNTL, id), SR_ARR(DIO_LINKF_CNTL, id)
+
+#define UNIPHY_DCN2_REG_LIST_RI(id, phyid)                                     \
+  SRI_ARR_ALPHABET(CLOCK_ENABLE, SYMCLK, id, phyid),                           \
+      SRI_ARR_ALPHABET(CHANNEL_XBAR_CNTL, UNIPHY, id, phyid)
+
+/* HPO DP stream encoder */
+#define DCN3_1_HPO_DP_STREAM_ENC_REG_LIST_RI(id)                               \
+  SR_ARR(DP_STREAM_MAPPER_CONTROL0, id),                                       \
+      SR_ARR(DP_STREAM_MAPPER_CONTROL1, id),                                   \
+      SR_ARR(DP_STREAM_MAPPER_CONTROL2, id),                                   \
+      SR_ARR(DP_STREAM_MAPPER_CONTROL3, id),                                   \
+      SRI_ARR(DP_STREAM_ENC_CLOCK_CONTROL, DP_STREAM_ENC, id),                 \
+      SRI_ARR(DP_STREAM_ENC_INPUT_MUX_CONTROL, DP_STREAM_ENC, id),             \
+      SRI_ARR(DP_STREAM_ENC_AUDIO_CONTROL, DP_STREAM_ENC, id),                 \
+      SRI_ARR(DP_STREAM_ENC_CLOCK_RAMP_ADJUSTER_FIFO_STATUS_CONTROL0, DP_STREAM_ENC, id), \
+      SRI_ARR(DP_SYM32_ENC_CONTROL, DP_SYM32_ENC, id),                         \
+      SRI_ARR(DP_SYM32_ENC_VID_PIXEL_FORMAT, DP_SYM32_ENC, id),                \
+      SRI_ARR(DP_SYM32_ENC_VID_PIXEL_FORMAT_DOUBLE_BUFFER_CONTROL, DP_SYM32_ENC, id), \
+      SRI_ARR(DP_SYM32_ENC_VID_MSA0, DP_SYM32_ENC, id),                        \
+      SRI_ARR(DP_SYM32_ENC_VID_MSA1, DP_SYM32_ENC, id),                        \
+      SRI_ARR(DP_SYM32_ENC_VID_MSA2, DP_SYM32_ENC, id),                        \
+      SRI_ARR(DP_SYM32_ENC_VID_MSA3, DP_SYM32_ENC, id),                        \
+      SRI_ARR(DP_SYM32_ENC_VID_MSA4, DP_SYM32_ENC, id),                        \
+      SRI_ARR(DP_SYM32_ENC_VID_MSA5, DP_SYM32_ENC, id),                        \
+      SRI_ARR(DP_SYM32_ENC_VID_MSA6, DP_SYM32_ENC, id),                        \
+      SRI_ARR(DP_SYM32_ENC_VID_MSA7, DP_SYM32_ENC, id),                        \
+      SRI_ARR(DP_SYM32_ENC_VID_MSA8, DP_SYM32_ENC, id),                        \
+      SRI_ARR(DP_SYM32_ENC_VID_MSA_CONTROL, DP_SYM32_ENC, id),                 \
+      SRI_ARR(DP_SYM32_ENC_VID_MSA_DOUBLE_BUFFER_CONTROL, DP_SYM32_ENC, id),   \
+      SRI_ARR(DP_SYM32_ENC_VID_FIFO_CONTROL, DP_SYM32_ENC, id),                \
+      SRI_ARR(DP_SYM32_ENC_VID_STREAM_CONTROL, DP_SYM32_ENC, id),              \
+      SRI_ARR(DP_SYM32_ENC_VID_VBID_CONTROL, DP_SYM32_ENC, id),                \
+      SRI_ARR(DP_SYM32_ENC_SDP_CONTROL, DP_SYM32_ENC, id),                     \
+      SRI_ARR(DP_SYM32_ENC_SDP_GSP_CONTROL0, DP_SYM32_ENC, id),                \
+      SRI_ARR(DP_SYM32_ENC_SDP_GSP_CONTROL2, DP_SYM32_ENC, id),                \
+      SRI_ARR(DP_SYM32_ENC_SDP_GSP_CONTROL3, DP_SYM32_ENC, id),                \
+      SRI_ARR(DP_SYM32_ENC_SDP_GSP_CONTROL5, DP_SYM32_ENC, id),                \
+      SRI_ARR(DP_SYM32_ENC_SDP_GSP_CONTROL11, DP_SYM32_ENC, id),               \
+      SRI_ARR(DP_SYM32_ENC_SDP_METADATA_PACKET_CONTROL, DP_SYM32_ENC, id),     \
+      SRI_ARR(DP_SYM32_ENC_SDP_AUDIO_CONTROL0, DP_SYM32_ENC, id),              \
+      SRI_ARR(DP_SYM32_ENC_VID_CRC_CONTROL, DP_SYM32_ENC, id),                 \
+      SRI_ARR(DP_SYM32_ENC_HBLANK_CONTROL, DP_SYM32_ENC, id)
+
+/* HPO DP link encoder regs */
+#define DCN3_1_HPO_DP_LINK_ENC_REG_LIST_RI(id)                                 \
+  SRI_ARR(DP_LINK_ENC_CLOCK_CONTROL, DP_LINK_ENC, id),                         \
+      SRI_ARR(DP_DPHY_SYM32_CONTROL, DP_DPHY_SYM32, id),                       \
+      SRI_ARR(DP_DPHY_SYM32_STATUS, DP_DPHY_SYM32, id),                        \
+      SRI_ARR(DP_DPHY_SYM32_TP_CONFIG, DP_DPHY_SYM32, id),                     \
+      SRI_ARR(DP_DPHY_SYM32_TP_PRBS_SEED0, DP_DPHY_SYM32, id),                 \
+      SRI_ARR(DP_DPHY_SYM32_TP_PRBS_SEED1, DP_DPHY_SYM32, id),                 \
+      SRI_ARR(DP_DPHY_SYM32_TP_PRBS_SEED2, DP_DPHY_SYM32, id),                 \
+      SRI_ARR(DP_DPHY_SYM32_TP_PRBS_SEED3, DP_DPHY_SYM32, id),                 \
+      SRI_ARR(DP_DPHY_SYM32_TP_SQ_PULSE, DP_DPHY_SYM32, id),                   \
+      SRI_ARR(DP_DPHY_SYM32_TP_CUSTOM0, DP_DPHY_SYM32, id),                    \
+      SRI_ARR(DP_DPHY_SYM32_TP_CUSTOM1, DP_DPHY_SYM32, id),                    \
+      SRI_ARR(DP_DPHY_SYM32_TP_CUSTOM2, DP_DPHY_SYM32, id),                    \
+      SRI_ARR(DP_DPHY_SYM32_TP_CUSTOM3, DP_DPHY_SYM32, id),                    \
+      SRI_ARR(DP_DPHY_SYM32_TP_CUSTOM4, DP_DPHY_SYM32, id),                    \
+      SRI_ARR(DP_DPHY_SYM32_TP_CUSTOM5, DP_DPHY_SYM32, id),                    \
+      SRI_ARR(DP_DPHY_SYM32_TP_CUSTOM6, DP_DPHY_SYM32, id),                    \
+      SRI_ARR(DP_DPHY_SYM32_TP_CUSTOM7, DP_DPHY_SYM32, id),                    \
+      SRI_ARR(DP_DPHY_SYM32_TP_CUSTOM8, DP_DPHY_SYM32, id),                    \
+      SRI_ARR(DP_DPHY_SYM32_TP_CUSTOM9, DP_DPHY_SYM32, id),                    \
+      SRI_ARR(DP_DPHY_SYM32_TP_CUSTOM10, DP_DPHY_SYM32, id),                   \
+      SRI_ARR(DP_DPHY_SYM32_SAT_VC0, DP_DPHY_SYM32, id),                       \
+      SRI_ARR(DP_DPHY_SYM32_SAT_VC1, DP_DPHY_SYM32, id),                       \
+      SRI_ARR(DP_DPHY_SYM32_SAT_VC2, DP_DPHY_SYM32, id),                       \
+      SRI_ARR(DP_DPHY_SYM32_SAT_VC3, DP_DPHY_SYM32, id),                       \
+      SRI_ARR(DP_DPHY_SYM32_VC_RATE_CNTL0, DP_DPHY_SYM32, id),                 \
+      SRI_ARR(DP_DPHY_SYM32_VC_RATE_CNTL1, DP_DPHY_SYM32, id),                 \
+      SRI_ARR(DP_DPHY_SYM32_VC_RATE_CNTL2, DP_DPHY_SYM32, id),                 \
+      SRI_ARR(DP_DPHY_SYM32_VC_RATE_CNTL3, DP_DPHY_SYM32, id),                 \
+      SRI_ARR(DP_DPHY_SYM32_SAT_UPDATE, DP_DPHY_SYM32, id)
+
+/* DPP */
+#define DPP_REG_LIST_DCN30_COMMON_RI(id)                                       \
+  SRI_ARR(CM_DEALPHA, CM, id), SRI_ARR(CM_MEM_PWR_STATUS, CM, id),             \
+      SRI_ARR(CM_BIAS_CR_R, CM, id), SRI_ARR(CM_BIAS_Y_G_CB_B, CM, id),        \
+      SRI_ARR(PRE_DEGAM, CNVC_CFG, id), SRI_ARR(CM_GAMCOR_CONTROL, CM, id),    \
+      SRI_ARR(CM_GAMCOR_LUT_CONTROL, CM, id),                                  \
+      SRI_ARR(CM_GAMCOR_LUT_INDEX, CM, id),                                    \
+      SRI_ARR(CM_GAMCOR_LUT_INDEX, CM, id),                                    \
+      SRI_ARR(CM_GAMCOR_LUT_DATA, CM, id),                                     \
+      SRI_ARR(CM_GAMCOR_RAMB_START_CNTL_B, CM, id),                            \
+      SRI_ARR(CM_GAMCOR_RAMB_START_CNTL_G, CM, id),                            \
+      SRI_ARR(CM_GAMCOR_RAMB_START_CNTL_R, CM, id),                            \
+      SRI_ARR(CM_GAMCOR_RAMB_START_SLOPE_CNTL_B, CM, id),                      \
+      SRI_ARR(CM_GAMCOR_RAMB_START_SLOPE_CNTL_G, CM, id),                      \
+      SRI_ARR(CM_GAMCOR_RAMB_START_SLOPE_CNTL_R, CM, id),                      \
+      SRI_ARR(CM_GAMCOR_RAMB_END_CNTL1_B, CM, id),                             \
+      SRI_ARR(CM_GAMCOR_RAMB_END_CNTL2_B, CM, id),                             \
+      SRI_ARR(CM_GAMCOR_RAMB_END_CNTL1_G, CM, id),                             \
+      SRI_ARR(CM_GAMCOR_RAMB_END_CNTL2_G, CM, id),                             \
+      SRI_ARR(CM_GAMCOR_RAMB_END_CNTL1_R, CM, id),                             \
+      SRI_ARR(CM_GAMCOR_RAMB_END_CNTL2_R, CM, id),                             \
+      SRI_ARR(CM_GAMCOR_RAMB_REGION_0_1, CM, id),                              \
+      SRI_ARR(CM_GAMCOR_RAMB_REGION_32_33, CM, id),                            \
+      SRI_ARR(CM_GAMCOR_RAMB_OFFSET_B, CM, id),                                \
+      SRI_ARR(CM_GAMCOR_RAMB_OFFSET_G, CM, id),                                \
+      SRI_ARR(CM_GAMCOR_RAMB_OFFSET_R, CM, id),                                \
+      SRI_ARR(CM_GAMCOR_RAMB_START_BASE_CNTL_B, CM, id),                       \
+      SRI_ARR(CM_GAMCOR_RAMB_START_BASE_CNTL_G, CM, id),                       \
+      SRI_ARR(CM_GAMCOR_RAMB_START_BASE_CNTL_R, CM, id),                       \
+      SRI_ARR(CM_GAMCOR_RAMA_START_CNTL_B, CM, id),                            \
+      SRI_ARR(CM_GAMCOR_RAMA_START_CNTL_G, CM, id),                            \
+      SRI_ARR(CM_GAMCOR_RAMA_START_CNTL_R, CM, id),                            \
+      SRI_ARR(CM_GAMCOR_RAMA_START_SLOPE_CNTL_B, CM, id),                      \
+      SRI_ARR(CM_GAMCOR_RAMA_START_SLOPE_CNTL_G, CM, id),                      \
+      SRI_ARR(CM_GAMCOR_RAMA_START_SLOPE_CNTL_R, CM, id),                      \
+      SRI_ARR(CM_GAMCOR_RAMA_END_CNTL1_B, CM, id),                             \
+      SRI_ARR(CM_GAMCOR_RAMA_END_CNTL2_B, CM, id),                             \
+      SRI_ARR(CM_GAMCOR_RAMA_END_CNTL1_G, CM, id),                             \
+      SRI_ARR(CM_GAMCOR_RAMA_END_CNTL2_G, CM, id),                             \
+      SRI_ARR(CM_GAMCOR_RAMA_END_CNTL1_R, CM, id),                             \
+      SRI_ARR(CM_GAMCOR_RAMA_END_CNTL2_R, CM, id),                             \
+      SRI_ARR(CM_GAMCOR_RAMA_REGION_0_1, CM, id),                              \
+      SRI_ARR(CM_GAMCOR_RAMA_REGION_32_33, CM, id),                            \
+      SRI_ARR(CM_GAMCOR_RAMA_OFFSET_B, CM, id),                                \
+      SRI_ARR(CM_GAMCOR_RAMA_OFFSET_G, CM, id),                                \
+      SRI_ARR(CM_GAMCOR_RAMA_OFFSET_R, CM, id),                                \
+      SRI_ARR(CM_GAMCOR_RAMA_START_BASE_CNTL_B, CM, id),                       \
+      SRI_ARR(CM_GAMCOR_RAMA_START_BASE_CNTL_G, CM, id),                       \
+      SRI_ARR(CM_GAMCOR_RAMA_START_BASE_CNTL_R, CM, id),                       \
+      SRI_ARR(CM_GAMUT_REMAP_CONTROL, CM, id),                                 \
+      SRI_ARR(CM_GAMUT_REMAP_C11_C12, CM, id),                                 \
+      SRI_ARR(CM_GAMUT_REMAP_C13_C14, CM, id),                                 \
+      SRI_ARR(CM_GAMUT_REMAP_C21_C22, CM, id),                                 \
+      SRI_ARR(CM_GAMUT_REMAP_C23_C24, CM, id),                                 \
+      SRI_ARR(CM_GAMUT_REMAP_C31_C32, CM, id),                                 \
+      SRI_ARR(CM_GAMUT_REMAP_C33_C34, CM, id),                                 \
+      SRI_ARR(CM_GAMUT_REMAP_B_C11_C12, CM, id),                               \
+      SRI_ARR(CM_GAMUT_REMAP_B_C13_C14, CM, id),                               \
+      SRI_ARR(CM_GAMUT_REMAP_B_C21_C22, CM, id),                               \
+      SRI_ARR(CM_GAMUT_REMAP_B_C23_C24, CM, id),                               \
+      SRI_ARR(CM_GAMUT_REMAP_B_C31_C32, CM, id),                               \
+      SRI_ARR(CM_GAMUT_REMAP_B_C33_C34, CM, id),                               \
+      SRI_ARR(DSCL_EXT_OVERSCAN_LEFT_RIGHT, DSCL, id),                         \
+      SRI_ARR(DSCL_EXT_OVERSCAN_TOP_BOTTOM, DSCL, id),                         \
+      SRI_ARR(OTG_H_BLANK, DSCL, id), SRI_ARR(OTG_V_BLANK, DSCL, id),          \
+      SRI_ARR(SCL_MODE, DSCL, id), SRI_ARR(LB_DATA_FORMAT, DSCL, id),          \
+      SRI_ARR(LB_MEMORY_CTRL, DSCL, id), SRI_ARR(DSCL_AUTOCAL, DSCL, id),      \
+      SRI_ARR(DSCL_CONTROL, DSCL, id),                                         \
+      SRI_ARR(SCL_TAP_CONTROL, DSCL, id),                                      \
+      SRI_ARR(SCL_COEF_RAM_TAP_SELECT, DSCL, id),                              \
+      SRI_ARR(SCL_COEF_RAM_TAP_DATA, DSCL, id),                                \
+      SRI_ARR(DSCL_2TAP_CONTROL, DSCL, id), SRI_ARR(MPC_SIZE, DSCL, id),       \
+      SRI_ARR(SCL_HORZ_FILTER_SCALE_RATIO, DSCL, id),                          \
+      SRI_ARR(SCL_VERT_FILTER_SCALE_RATIO, DSCL, id),                          \
+      SRI_ARR(SCL_HORZ_FILTER_SCALE_RATIO_C, DSCL, id),                        \
+      SRI_ARR(SCL_VERT_FILTER_SCALE_RATIO_C, DSCL, id),                        \
+      SRI_ARR(SCL_HORZ_FILTER_INIT, DSCL, id),                                 \
+      SRI_ARR(SCL_HORZ_FILTER_INIT_C, DSCL, id),                               \
+      SRI_ARR(SCL_VERT_FILTER_INIT, DSCL, id),                                 \
+      SRI_ARR(SCL_VERT_FILTER_INIT_C, DSCL, id),                               \
+      SRI_ARR(RECOUT_START, DSCL, id), SRI_ARR(RECOUT_SIZE, DSCL, id),         \
+      SRI_ARR(PRE_DEALPHA, CNVC_CFG, id), SRI_ARR(PRE_REALPHA, CNVC_CFG, id),  \
+      SRI_ARR(PRE_CSC_MODE, CNVC_CFG, id),                                     \
+      SRI_ARR(PRE_CSC_C11_C12, CNVC_CFG, id),                                  \
+      SRI_ARR(PRE_CSC_C33_C34, CNVC_CFG, id),                                  \
+      SRI_ARR(PRE_CSC_B_C11_C12, CNVC_CFG, id),                                \
+      SRI_ARR(PRE_CSC_B_C33_C34, CNVC_CFG, id),                                \
+      SRI_ARR(CM_POST_CSC_CONTROL, CM, id),                                    \
+      SRI_ARR(CM_POST_CSC_C11_C12, CM, id),                                    \
+      SRI_ARR(CM_POST_CSC_C33_C34, CM, id),                                    \
+      SRI_ARR(CM_POST_CSC_B_C11_C12, CM, id),                                  \
+      SRI_ARR(CM_POST_CSC_B_C33_C34, CM, id),                                  \
+      SRI_ARR(CM_MEM_PWR_CTRL, CM, id), SRI_ARR(CM_CONTROL, CM, id),           \
+      SRI_ARR(FORMAT_CONTROL, CNVC_CFG, id),                                   \
+      SRI_ARR(CNVC_SURFACE_PIXEL_FORMAT, CNVC_CFG, id),                        \
+      SRI_ARR(CURSOR0_CONTROL, CNVC_CUR, id),                                  \
+      SRI_ARR(CURSOR0_COLOR0, CNVC_CUR, id),                                   \
+      SRI_ARR(CURSOR0_COLOR1, CNVC_CUR, id),                                   \
+      SRI_ARR(CURSOR0_FP_SCALE_BIAS, CNVC_CUR, id),                            \
+      SRI_ARR(DPP_CONTROL, DPP_TOP, id), SRI_ARR(CM_HDR_MULT_COEF, CM, id),    \
+      SRI_ARR(CURSOR_CONTROL, CURSOR0_, id),                                   \
+      SRI_ARR(ALPHA_2BIT_LUT, CNVC_CFG, id),                                   \
+      SRI_ARR(FCNV_FP_BIAS_R, CNVC_CFG, id),                                   \
+      SRI_ARR(FCNV_FP_BIAS_G, CNVC_CFG, id),                                   \
+      SRI_ARR(FCNV_FP_BIAS_B, CNVC_CFG, id),                                   \
+      SRI_ARR(FCNV_FP_SCALE_R, CNVC_CFG, id),                                  \
+      SRI_ARR(FCNV_FP_SCALE_G, CNVC_CFG, id),                                  \
+      SRI_ARR(FCNV_FP_SCALE_B, CNVC_CFG, id),                                  \
+      SRI_ARR(COLOR_KEYER_CONTROL, CNVC_CFG, id),                              \
+      SRI_ARR(COLOR_KEYER_ALPHA, CNVC_CFG, id),                                \
+      SRI_ARR(COLOR_KEYER_RED, CNVC_CFG, id),                                  \
+      SRI_ARR(COLOR_KEYER_GREEN, CNVC_CFG, id),                                \
+      SRI_ARR(COLOR_KEYER_BLUE, CNVC_CFG, id),                                 \
+      SRI_ARR(CURSOR_CONTROL, CURSOR0_, id),                                   \
+      SRI_ARR(OBUF_MEM_PWR_CTRL, DSCL, id),                                    \
+      SRI_ARR(DSCL_MEM_PWR_STATUS, DSCL, id),                                  \
+      SRI_ARR(DSCL_MEM_PWR_CTRL, DSCL, id)
+
+/* OPP */
+#define OPP_REG_LIST_DCN_RI(id)                                                \
+  SRI_ARR(FMT_BIT_DEPTH_CONTROL, FMT, id), SRI_ARR(FMT_CONTROL, FMT, id),      \
+      SRI_ARR(FMT_DITHER_RAND_R_SEED, FMT, id),                                \
+      SRI_ARR(FMT_DITHER_RAND_G_SEED, FMT, id),                                \
+      SRI_ARR(FMT_DITHER_RAND_B_SEED, FMT, id),                                \
+      SRI_ARR(FMT_CLAMP_CNTL, FMT, id),                                        \
+      SRI_ARR(FMT_DYNAMIC_EXP_CNTL, FMT, id),                                  \
+      SRI_ARR(FMT_MAP420_MEMORY_CONTROL, FMT, id),                             \
+      SRI_ARR(OPPBUF_CONTROL, OPPBUF, id),                                     \
+      SRI_ARR(OPPBUF_3D_PARAMETERS_0, OPPBUF, id),                             \
+      SRI_ARR(OPPBUF_3D_PARAMETERS_1, OPPBUF, id),                             \
+      SRI_ARR(OPP_PIPE_CONTROL, OPP_PIPE, id)                                  \
+
+#define OPP_REG_LIST_DCN10_RI(id) OPP_REG_LIST_DCN_RI(id)
+
+#define OPP_DPG_REG_LIST_RI(id)                                                \
+  SRI_ARR(DPG_CONTROL, DPG, id), SRI_ARR(DPG_DIMENSIONS, DPG, id),             \
+      SRI_ARR(DPG_OFFSET_SEGMENT, DPG, id), SRI_ARR(DPG_COLOUR_B_CB, DPG, id), \
+      SRI_ARR(DPG_COLOUR_G_Y, DPG, id), SRI_ARR(DPG_COLOUR_R_CR, DPG, id),     \
+      SRI_ARR(DPG_RAMP_CONTROL, DPG, id), SRI_ARR(DPG_STATUS, DPG, id)
+
+#define OPP_REG_LIST_DCN30_RI(id)                                              \
+  OPP_REG_LIST_DCN10_RI(id), OPP_DPG_REG_LIST_RI(id),                          \
+      SRI_ARR(FMT_422_CONTROL, FMT, id)
+
+/* Aux engine regs */
+#define AUX_COMMON_REG_LIST0_RI(id)                                            \
+  SRI_ARR(AUX_CONTROL, DP_AUX, id), SRI_ARR(AUX_ARB_CONTROL, DP_AUX, id),      \
+      SRI_ARR(AUX_SW_DATA, DP_AUX, id), SRI_ARR(AUX_SW_CONTROL, DP_AUX, id),   \
+      SRI_ARR(AUX_INTERRUPT_CONTROL, DP_AUX, id),                              \
+      SRI_ARR(AUX_DPHY_RX_CONTROL1, DP_AUX, id),                               \
+      SRI_ARR(AUX_SW_STATUS, DP_AUX, id)
+
+/* DWBC */
+#define DWBC_COMMON_REG_LIST_DCN30_RI(id)                                      \
+  SR_ARR(DWB_ENABLE_CLK_CTRL, id), SR_ARR(DWB_MEM_PWR_CTRL, id),               \
+      SR_ARR(FC_MODE_CTRL, id), SR_ARR(FC_FLOW_CTRL, id),                      \
+      SR_ARR(FC_WINDOW_START, id), SR_ARR(FC_WINDOW_SIZE, id),                 \
+      SR_ARR(FC_SOURCE_SIZE, id), SR_ARR(DWB_UPDATE_CTRL, id),                 \
+      SR_ARR(DWB_CRC_CTRL, id), SR_ARR(DWB_CRC_MASK_R_G, id),                  \
+      SR_ARR(DWB_CRC_MASK_B_A, id), SR_ARR(DWB_CRC_VAL_R_G, id),               \
+      SR_ARR(DWB_CRC_VAL_B_A, id), SR_ARR(DWB_OUT_CTRL, id),                   \
+      SR_ARR(DWB_MMHUBBUB_BACKPRESSURE_CNT_EN, id),                            \
+      SR_ARR(DWB_MMHUBBUB_BACKPRESSURE_CNT, id),                               \
+      SR_ARR(DWB_HOST_READ_CONTROL, id), SR_ARR(DWB_SOFT_RESET, id),           \
+      SR_ARR(DWB_HDR_MULT_COEF, id), SR_ARR(DWB_GAMUT_REMAP_MODE, id),         \
+      SR_ARR(DWB_GAMUT_REMAP_COEF_FORMAT, id),                                 \
+      SR_ARR(DWB_GAMUT_REMAPA_C11_C12, id),                                    \
+      SR_ARR(DWB_GAMUT_REMAPA_C13_C14, id),                                    \
+      SR_ARR(DWB_GAMUT_REMAPA_C21_C22, id),                                    \
+      SR_ARR(DWB_GAMUT_REMAPA_C23_C24, id),                                    \
+      SR_ARR(DWB_GAMUT_REMAPA_C31_C32, id),                                    \
+      SR_ARR(DWB_GAMUT_REMAPA_C33_C34, id),                                    \
+      SR_ARR(DWB_GAMUT_REMAPB_C11_C12, id),                                    \
+      SR_ARR(DWB_GAMUT_REMAPB_C13_C14, id),                                    \
+      SR_ARR(DWB_GAMUT_REMAPB_C21_C22, id),                                    \
+      SR_ARR(DWB_GAMUT_REMAPB_C23_C24, id),                                    \
+      SR_ARR(DWB_GAMUT_REMAPB_C31_C32, id),                                    \
+      SR_ARR(DWB_GAMUT_REMAPB_C33_C34, id), SR_ARR(DWB_OGAM_CONTROL, id),      \
+      SR_ARR(DWB_OGAM_LUT_INDEX, id), SR_ARR(DWB_OGAM_LUT_DATA, id),           \
+      SR_ARR(DWB_OGAM_LUT_CONTROL, id),                                        \
+      SR_ARR(DWB_OGAM_RAMA_START_CNTL_B, id),                                  \
+      SR_ARR(DWB_OGAM_RAMA_START_CNTL_G, id),                                  \
+      SR_ARR(DWB_OGAM_RAMA_START_CNTL_R, id),                                  \
+      SR_ARR(DWB_OGAM_RAMA_START_BASE_CNTL_B, id),                             \
+      SR_ARR(DWB_OGAM_RAMA_START_SLOPE_CNTL_B, id),                            \
+      SR_ARR(DWB_OGAM_RAMA_START_BASE_CNTL_G, id),                             \
+      SR_ARR(DWB_OGAM_RAMA_START_SLOPE_CNTL_G, id),                            \
+      SR_ARR(DWB_OGAM_RAMA_START_BASE_CNTL_R, id),                             \
+      SR_ARR(DWB_OGAM_RAMA_START_SLOPE_CNTL_R, id),                            \
+      SR_ARR(DWB_OGAM_RAMA_END_CNTL1_B, id),                                   \
+      SR_ARR(DWB_OGAM_RAMA_END_CNTL2_B, id),                                   \
+      SR_ARR(DWB_OGAM_RAMA_END_CNTL1_G, id),                                   \
+      SR_ARR(DWB_OGAM_RAMA_END_CNTL2_G, id),                                   \
+      SR_ARR(DWB_OGAM_RAMA_END_CNTL1_R, id),                                   \
+      SR_ARR(DWB_OGAM_RAMA_END_CNTL2_R, id),                                   \
+      SR_ARR(DWB_OGAM_RAMA_OFFSET_B, id), SR_ARR(DWB_OGAM_RAMA_OFFSET_G, id),  \
+      SR_ARR(DWB_OGAM_RAMA_OFFSET_R, id),                                      \
+      SR_ARR(DWB_OGAM_RAMA_REGION_0_1, id),                                    \
+      SR_ARR(DWB_OGAM_RAMA_REGION_2_3, id),                                    \
+      SR_ARR(DWB_OGAM_RAMA_REGION_4_5, id),                                    \
+      SR_ARR(DWB_OGAM_RAMA_REGION_6_7, id),                                    \
+      SR_ARR(DWB_OGAM_RAMA_REGION_8_9, id),                                    \
+      SR_ARR(DWB_OGAM_RAMA_REGION_10_11, id),                                  \
+      SR_ARR(DWB_OGAM_RAMA_REGION_12_13, id),                                  \
+      SR_ARR(DWB_OGAM_RAMA_REGION_14_15, id),                                  \
+      SR_ARR(DWB_OGAM_RAMA_REGION_16_17, id),                                  \
+      SR_ARR(DWB_OGAM_RAMA_REGION_18_19, id),                                  \
+      SR_ARR(DWB_OGAM_RAMA_REGION_20_21, id),                                  \
+      SR_ARR(DWB_OGAM_RAMA_REGION_22_23, id),                                  \
+      SR_ARR(DWB_OGAM_RAMA_REGION_24_25, id),                                  \
+      SR_ARR(DWB_OGAM_RAMA_REGION_26_27, id),                                  \
+      SR_ARR(DWB_OGAM_RAMA_REGION_28_29, id),                                  \
+      SR_ARR(DWB_OGAM_RAMA_REGION_30_31, id),                                  \
+      SR_ARR(DWB_OGAM_RAMA_REGION_32_33, id),                                  \
+      SR_ARR(DWB_OGAM_RAMB_START_CNTL_B, id),                                  \
+      SR_ARR(DWB_OGAM_RAMB_START_CNTL_G, id),                                  \
+      SR_ARR(DWB_OGAM_RAMB_START_CNTL_R, id),                                  \
+      SR_ARR(DWB_OGAM_RAMB_START_BASE_CNTL_B, id),                             \
+      SR_ARR(DWB_OGAM_RAMB_START_SLOPE_CNTL_B, id),                            \
+      SR_ARR(DWB_OGAM_RAMB_START_BASE_CNTL_G, id),                             \
+      SR_ARR(DWB_OGAM_RAMB_START_SLOPE_CNTL_G, id),                            \
+      SR_ARR(DWB_OGAM_RAMB_START_BASE_CNTL_R, id),                             \
+      SR_ARR(DWB_OGAM_RAMB_START_SLOPE_CNTL_R, id),                            \
+      SR_ARR(DWB_OGAM_RAMB_END_CNTL1_B, id),                                   \
+      SR_ARR(DWB_OGAM_RAMB_END_CNTL2_B, id),                                   \
+      SR_ARR(DWB_OGAM_RAMB_END_CNTL1_G, id),                                   \
+      SR_ARR(DWB_OGAM_RAMB_END_CNTL2_G, id),                                   \
+      SR_ARR(DWB_OGAM_RAMB_END_CNTL1_R, id),                                   \
+      SR_ARR(DWB_OGAM_RAMB_END_CNTL2_R, id),                                   \
+      SR_ARR(DWB_OGAM_RAMB_OFFSET_B, id), SR_ARR(DWB_OGAM_RAMB_OFFSET_G, id),  \
+      SR_ARR(DWB_OGAM_RAMB_OFFSET_R, id),                                      \
+      SR_ARR(DWB_OGAM_RAMB_REGION_0_1, id),                                    \
+      SR_ARR(DWB_OGAM_RAMB_REGION_2_3, id),                                    \
+      SR_ARR(DWB_OGAM_RAMB_REGION_4_5, id),                                    \
+      SR_ARR(DWB_OGAM_RAMB_REGION_6_7, id),                                    \
+      SR_ARR(DWB_OGAM_RAMB_REGION_8_9, id),                                    \
+      SR_ARR(DWB_OGAM_RAMB_REGION_10_11, id),                                  \
+      SR_ARR(DWB_OGAM_RAMB_REGION_12_13, id),                                  \
+      SR_ARR(DWB_OGAM_RAMB_REGION_14_15, id),                                  \
+      SR_ARR(DWB_OGAM_RAMB_REGION_16_17, id),                                  \
+      SR_ARR(DWB_OGAM_RAMB_REGION_18_19, id),                                  \
+      SR_ARR(DWB_OGAM_RAMB_REGION_20_21, id),                                  \
+      SR_ARR(DWB_OGAM_RAMB_REGION_22_23, id),                                  \
+      SR_ARR(DWB_OGAM_RAMB_REGION_24_25, id),                                  \
+      SR_ARR(DWB_OGAM_RAMB_REGION_26_27, id),                                  \
+      SR_ARR(DWB_OGAM_RAMB_REGION_28_29, id),                                  \
+      SR_ARR(DWB_OGAM_RAMB_REGION_30_31, id),                                  \
+      SR_ARR(DWB_OGAM_RAMB_REGION_32_33, id)
+
+/* MCIF */
+
+#define MCIF_WB_COMMON_REG_LIST_DCN32_RI(inst)                                 \
+  SRI2_ARR(MCIF_WB_BUFMGR_SW_CONTROL, MCIF_WB, inst),                          \
+      SRI2_ARR(MCIF_WB_BUFMGR_STATUS, MCIF_WB, inst),                          \
+      SRI2_ARR(MCIF_WB_BUF_PITCH, MCIF_WB, inst),                              \
+      SRI2_ARR(MCIF_WB_BUF_1_STATUS, MCIF_WB, inst),                           \
+      SRI2_ARR(MCIF_WB_BUF_1_STATUS2, MCIF_WB, inst),                          \
+      SRI2_ARR(MCIF_WB_BUF_2_STATUS, MCIF_WB, inst),                           \
+      SRI2_ARR(MCIF_WB_BUF_2_STATUS2, MCIF_WB, inst),                          \
+      SRI2_ARR(MCIF_WB_BUF_3_STATUS, MCIF_WB, inst),                           \
+      SRI2_ARR(MCIF_WB_BUF_3_STATUS2, MCIF_WB, inst),                          \
+      SRI2_ARR(MCIF_WB_BUF_4_STATUS, MCIF_WB, inst),                           \
+      SRI2_ARR(MCIF_WB_BUF_4_STATUS2, MCIF_WB, inst),                          \
+      SRI2_ARR(MCIF_WB_ARBITRATION_CONTROL, MCIF_WB, inst),                    \
+      SRI2_ARR(MCIF_WB_SCLK_CHANGE, MCIF_WB, inst),                            \
+      SRI2_ARR(MCIF_WB_BUF_1_ADDR_Y, MCIF_WB, inst),                           \
+      SRI2_ARR(MCIF_WB_BUF_1_ADDR_C, MCIF_WB, inst),                           \
+      SRI2_ARR(MCIF_WB_BUF_2_ADDR_Y, MCIF_WB, inst),                           \
+      SRI2_ARR(MCIF_WB_BUF_2_ADDR_C, MCIF_WB, inst),                           \
+      SRI2_ARR(MCIF_WB_BUF_3_ADDR_Y, MCIF_WB, inst),                           \
+      SRI2_ARR(MCIF_WB_BUF_3_ADDR_C, MCIF_WB, inst),                           \
+      SRI2_ARR(MCIF_WB_BUF_4_ADDR_Y, MCIF_WB, inst),                           \
+      SRI2_ARR(MCIF_WB_BUF_4_ADDR_C, MCIF_WB, inst),                           \
+      SRI2_ARR(MCIF_WB_BUFMGR_VCE_CONTROL, MCIF_WB, inst),                     \
+      SRI2_ARR(MCIF_WB_NB_PSTATE_LATENCY_WATERMARK, MMHUBBUB, inst),           \
+      SRI2_ARR(MCIF_WB_NB_PSTATE_CONTROL, MCIF_WB, inst),                      \
+      SRI2_ARR(MCIF_WB_WATERMARK, MMHUBBUB, inst),                             \
+      SRI2_ARR(MCIF_WB_CLOCK_GATER_CONTROL, MCIF_WB, inst),                    \
+      SRI2_ARR(MCIF_WB_SELF_REFRESH_CONTROL, MCIF_WB, inst),                   \
+      SRI2_ARR(MULTI_LEVEL_QOS_CTRL, MCIF_WB, inst),                           \
+      SRI2_ARR(MCIF_WB_SECURITY_LEVEL, MCIF_WB, inst),                         \
+      SRI2_ARR(MCIF_WB_BUF_LUMA_SIZE, MCIF_WB, inst),                          \
+      SRI2_ARR(MCIF_WB_BUF_CHROMA_SIZE, MCIF_WB, inst),                        \
+      SRI2_ARR(MCIF_WB_BUF_1_ADDR_Y_HIGH, MCIF_WB, inst),                      \
+      SRI2_ARR(MCIF_WB_BUF_1_ADDR_C_HIGH, MCIF_WB, inst),                      \
+      SRI2_ARR(MCIF_WB_BUF_2_ADDR_Y_HIGH, MCIF_WB, inst),                      \
+      SRI2_ARR(MCIF_WB_BUF_2_ADDR_C_HIGH, MCIF_WB, inst),                      \
+      SRI2_ARR(MCIF_WB_BUF_3_ADDR_Y_HIGH, MCIF_WB, inst),                      \
+      SRI2_ARR(MCIF_WB_BUF_3_ADDR_C_HIGH, MCIF_WB, inst),                      \
+      SRI2_ARR(MCIF_WB_BUF_4_ADDR_Y_HIGH, MCIF_WB, inst),                      \
+      SRI2_ARR(MCIF_WB_BUF_4_ADDR_C_HIGH, MCIF_WB, inst),                      \
+      SRI2_ARR(MCIF_WB_BUF_1_RESOLUTION, MCIF_WB, inst),                       \
+      SRI2_ARR(MCIF_WB_BUF_2_RESOLUTION, MCIF_WB, inst),                       \
+      SRI2_ARR(MCIF_WB_BUF_3_RESOLUTION, MCIF_WB, inst),                       \
+      SRI2_ARR(MCIF_WB_BUF_4_RESOLUTION, MCIF_WB, inst),                       \
+      SRI2_ARR(MMHUBBUB_MEM_PWR_CNTL, MMHUBBUB, inst),                         \
+      SRI2_ARR(MMHUBBUB_WARMUP_ADDR_REGION, MMHUBBUB, inst),                   \
+      SRI2_ARR(MMHUBBUB_WARMUP_BASE_ADDR_HIGH, MMHUBBUB, inst),                \
+      SRI2_ARR(MMHUBBUB_WARMUP_BASE_ADDR_LOW, MMHUBBUB, inst),                 \
+      SRI2_ARR(MMHUBBUB_WARMUP_CONTROL_STATUS, MMHUBBUB, inst)
+
+/* DSC */
+
+#define DSC_REG_LIST_DCN20_RI(id)                                              \
+  SRI_ARR(DSC_TOP_CONTROL, DSC_TOP, id),                                       \
+      SRI_ARR(DSC_DEBUG_CONTROL, DSC_TOP, id),                                 \
+      SRI_ARR(DSCC_CONFIG0, DSCC, id), SRI_ARR(DSCC_CONFIG1, DSCC, id),        \
+      SRI_ARR(DSCC_STATUS, DSCC, id),                                          \
+      SRI_ARR(DSCC_INTERRUPT_CONTROL_STATUS, DSCC, id),                        \
+      SRI_ARR(DSCC_PPS_CONFIG0, DSCC, id),                                     \
+      SRI_ARR(DSCC_PPS_CONFIG1, DSCC, id),                                     \
+      SRI_ARR(DSCC_PPS_CONFIG2, DSCC, id),                                     \
+      SRI_ARR(DSCC_PPS_CONFIG3, DSCC, id),                                     \
+      SRI_ARR(DSCC_PPS_CONFIG4, DSCC, id),                                     \
+      SRI_ARR(DSCC_PPS_CONFIG5, DSCC, id),                                     \
+      SRI_ARR(DSCC_PPS_CONFIG6, DSCC, id),                                     \
+      SRI_ARR(DSCC_PPS_CONFIG7, DSCC, id),                                     \
+      SRI_ARR(DSCC_PPS_CONFIG8, DSCC, id),                                     \
+      SRI_ARR(DSCC_PPS_CONFIG9, DSCC, id),                                     \
+      SRI_ARR(DSCC_PPS_CONFIG10, DSCC, id),                                    \
+      SRI_ARR(DSCC_PPS_CONFIG11, DSCC, id),                                    \
+      SRI_ARR(DSCC_PPS_CONFIG12, DSCC, id),                                    \
+      SRI_ARR(DSCC_PPS_CONFIG13, DSCC, id),                                    \
+      SRI_ARR(DSCC_PPS_CONFIG14, DSCC, id),                                    \
+      SRI_ARR(DSCC_PPS_CONFIG15, DSCC, id),                                    \
+      SRI_ARR(DSCC_PPS_CONFIG16, DSCC, id),                                    \
+      SRI_ARR(DSCC_PPS_CONFIG17, DSCC, id),                                    \
+      SRI_ARR(DSCC_PPS_CONFIG18, DSCC, id),                                    \
+      SRI_ARR(DSCC_PPS_CONFIG19, DSCC, id),                                    \
+      SRI_ARR(DSCC_PPS_CONFIG20, DSCC, id),                                    \
+      SRI_ARR(DSCC_PPS_CONFIG21, DSCC, id),                                    \
+      SRI_ARR(DSCC_PPS_CONFIG22, DSCC, id),                                    \
+      SRI_ARR(DSCC_MEM_POWER_CONTROL, DSCC, id),                               \
+      SRI_ARR(DSCC_R_Y_SQUARED_ERROR_LOWER, DSCC, id),                         \
+      SRI_ARR(DSCC_R_Y_SQUARED_ERROR_UPPER, DSCC, id),                         \
+      SRI_ARR(DSCC_G_CB_SQUARED_ERROR_LOWER, DSCC, id),                        \
+      SRI_ARR(DSCC_G_CB_SQUARED_ERROR_UPPER, DSCC, id),                        \
+      SRI_ARR(DSCC_B_CR_SQUARED_ERROR_LOWER, DSCC, id),                        \
+      SRI_ARR(DSCC_B_CR_SQUARED_ERROR_UPPER, DSCC, id),                        \
+      SRI_ARR(DSCC_MAX_ABS_ERROR0, DSCC, id),                                  \
+      SRI_ARR(DSCC_MAX_ABS_ERROR1, DSCC, id),                                  \
+      SRI_ARR(DSCC_RATE_BUFFER0_MAX_FULLNESS_LEVEL, DSCC, id),                 \
+      SRI_ARR(DSCC_RATE_BUFFER1_MAX_FULLNESS_LEVEL, DSCC, id),                 \
+      SRI_ARR(DSCC_RATE_BUFFER2_MAX_FULLNESS_LEVEL, DSCC, id),                 \
+      SRI_ARR(DSCC_RATE_BUFFER3_MAX_FULLNESS_LEVEL, DSCC, id),                 \
+      SRI_ARR(DSCC_RATE_CONTROL_BUFFER0_MAX_FULLNESS_LEVEL, DSCC, id),         \
+      SRI_ARR(DSCC_RATE_CONTROL_BUFFER1_MAX_FULLNESS_LEVEL, DSCC, id),         \
+      SRI_ARR(DSCC_RATE_CONTROL_BUFFER2_MAX_FULLNESS_LEVEL, DSCC, id),         \
+      SRI_ARR(DSCC_RATE_CONTROL_BUFFER3_MAX_FULLNESS_LEVEL, DSCC, id),         \
+      SRI_ARR(DSCCIF_CONFIG0, DSCCIF, id),                                     \
+      SRI_ARR(DSCCIF_CONFIG1, DSCCIF, id),                                     \
+      SRI_ARR(DSCRM_DSC_FORWARD_CONFIG, DSCRM, id)
+
+/* MPC */
+
+#define MPC_DWB_MUX_REG_LIST_DCN3_0_RI(inst)                                   \
+  SRII_DWB(DWB_MUX, MUX, MPC_DWB, inst)
+
+#define MPC_OUT_MUX_COMMON_REG_LIST_DCN1_0_RI(inst)                            \
+  SRII(MUX, MPC_OUT, inst), VUPDATE_SRII(CUR, VUPDATE_LOCK_SET, inst)
+
+#define MPC_OUT_MUX_REG_LIST_DCN3_0_RI(inst)                                   \
+  MPC_OUT_MUX_COMMON_REG_LIST_DCN1_0_RI(inst), SRII(CSC_MODE, MPC_OUT, inst),  \
+      SRII(CSC_C11_C12_A, MPC_OUT, inst), SRII(CSC_C33_C34_A, MPC_OUT, inst),  \
+      SRII(CSC_C11_C12_B, MPC_OUT, inst), SRII(CSC_C33_C34_B, MPC_OUT, inst),  \
+      SRII(DENORM_CONTROL, MPC_OUT, inst),                                     \
+      SRII(DENORM_CLAMP_G_Y, MPC_OUT, inst),                                   \
+      SRII(DENORM_CLAMP_B_CB, MPC_OUT, inst), SR(MPC_OUT_CSC_COEF_FORMAT)
+
+#define MPC_COMMON_REG_LIST_DCN1_0_RI(inst)                                    \
+  SRII(MPCC_TOP_SEL, MPCC, inst), SRII(MPCC_BOT_SEL, MPCC, inst),              \
+      SRII(MPCC_CONTROL, MPCC, inst), SRII(MPCC_STATUS, MPCC, inst),           \
+      SRII(MPCC_OPP_ID, MPCC, inst), SRII(MPCC_BG_G_Y, MPCC, inst),            \
+      SRII(MPCC_BG_R_CR, MPCC, inst), SRII(MPCC_BG_B_CB, MPCC, inst),          \
+      SRII(MPCC_SM_CONTROL, MPCC, inst),                                       \
+      SRII(MPCC_UPDATE_LOCK_SEL, MPCC, inst)
+
+#define MPC_REG_LIST_DCN3_0_RI(inst)                                           \
+  MPC_COMMON_REG_LIST_DCN1_0_RI(inst), SRII(MPCC_TOP_GAIN, MPCC, inst),        \
+      SRII(MPCC_BOT_GAIN_INSIDE, MPCC, inst),                                  \
+      SRII(MPCC_BOT_GAIN_OUTSIDE, MPCC, inst),                                 \
+      SRII(MPCC_MEM_PWR_CTRL, MPCC, inst),                                     \
+      SRII(MPCC_OGAM_LUT_INDEX, MPCC_OGAM, inst),                              \
+      SRII(MPCC_OGAM_LUT_DATA, MPCC_OGAM, inst),                               \
+      SRII(MPCC_GAMUT_REMAP_COEF_FORMAT, MPCC_OGAM, inst),                     \
+      SRII(MPCC_GAMUT_REMAP_MODE, MPCC_OGAM, inst),                            \
+      SRII(MPC_GAMUT_REMAP_C11_C12_A, MPCC_OGAM, inst),                        \
+      SRII(MPC_GAMUT_REMAP_C33_C34_A, MPCC_OGAM, inst),                        \
+      SRII(MPC_GAMUT_REMAP_C11_C12_B, MPCC_OGAM, inst),                        \
+      SRII(MPC_GAMUT_REMAP_C33_C34_B, MPCC_OGAM, inst),                        \
+      SRII(MPCC_OGAM_RAMA_START_CNTL_B, MPCC_OGAM, inst),                      \
+      SRII(MPCC_OGAM_RAMA_START_CNTL_G, MPCC_OGAM, inst),                      \
+      SRII(MPCC_OGAM_RAMA_START_CNTL_R, MPCC_OGAM, inst),                      \
+      SRII(MPCC_OGAM_RAMA_START_SLOPE_CNTL_B, MPCC_OGAM, inst),                \
+      SRII(MPCC_OGAM_RAMA_START_SLOPE_CNTL_G, MPCC_OGAM, inst),                \
+      SRII(MPCC_OGAM_RAMA_START_SLOPE_CNTL_R, MPCC_OGAM, inst),                \
+      SRII(MPCC_OGAM_RAMA_END_CNTL1_B, MPCC_OGAM, inst),                       \
+      SRII(MPCC_OGAM_RAMA_END_CNTL2_B, MPCC_OGAM, inst),                       \
+      SRII(MPCC_OGAM_RAMA_END_CNTL1_G, MPCC_OGAM, inst),                       \
+      SRII(MPCC_OGAM_RAMA_END_CNTL2_G, MPCC_OGAM, inst),                       \
+      SRII(MPCC_OGAM_RAMA_END_CNTL1_R, MPCC_OGAM, inst),                       \
+      SRII(MPCC_OGAM_RAMA_END_CNTL2_R, MPCC_OGAM, inst),                       \
+      SRII(MPCC_OGAM_RAMA_REGION_0_1, MPCC_OGAM, inst),                        \
+      SRII(MPCC_OGAM_RAMA_REGION_32_33, MPCC_OGAM, inst),                      \
+      SRII(MPCC_OGAM_RAMA_OFFSET_B, MPCC_OGAM, inst),                          \
+      SRII(MPCC_OGAM_RAMA_OFFSET_G, MPCC_OGAM, inst),                          \
+      SRII(MPCC_OGAM_RAMA_OFFSET_R, MPCC_OGAM, inst),                          \
+      SRII(MPCC_OGAM_RAMA_START_BASE_CNTL_B, MPCC_OGAM, inst),                 \
+      SRII(MPCC_OGAM_RAMA_START_BASE_CNTL_G, MPCC_OGAM, inst),                 \
+      SRII(MPCC_OGAM_RAMA_START_BASE_CNTL_R, MPCC_OGAM, inst),                 \
+      SRII(MPCC_OGAM_RAMB_START_CNTL_B, MPCC_OGAM, inst),                      \
+      SRII(MPCC_OGAM_RAMB_START_CNTL_G, MPCC_OGAM, inst),                      \
+      SRII(MPCC_OGAM_RAMB_START_CNTL_R, MPCC_OGAM, inst),                      \
+      SRII(MPCC_OGAM_RAMB_START_SLOPE_CNTL_B, MPCC_OGAM, inst),                \
+      SRII(MPCC_OGAM_RAMB_START_SLOPE_CNTL_G, MPCC_OGAM, inst),                \
+      SRII(MPCC_OGAM_RAMB_START_SLOPE_CNTL_R, MPCC_OGAM, inst),                \
+      SRII(MPCC_OGAM_RAMB_END_CNTL1_B, MPCC_OGAM, inst),                       \
+      SRII(MPCC_OGAM_RAMB_END_CNTL2_B, MPCC_OGAM, inst),                       \
+      SRII(MPCC_OGAM_RAMB_END_CNTL1_G, MPCC_OGAM, inst),                       \
+      SRII(MPCC_OGAM_RAMB_END_CNTL2_G, MPCC_OGAM, inst),                       \
+      SRII(MPCC_OGAM_RAMB_END_CNTL1_R, MPCC_OGAM, inst),                       \
+      SRII(MPCC_OGAM_RAMB_END_CNTL2_R, MPCC_OGAM, inst),                       \
+      SRII(MPCC_OGAM_RAMB_REGION_0_1, MPCC_OGAM, inst),                        \
+      SRII(MPCC_OGAM_RAMB_REGION_32_33, MPCC_OGAM, inst),                      \
+      SRII(MPCC_OGAM_RAMB_OFFSET_B, MPCC_OGAM, inst),                          \
+      SRII(MPCC_OGAM_RAMB_OFFSET_G, MPCC_OGAM, inst),                          \
+      SRII(MPCC_OGAM_RAMB_OFFSET_R, MPCC_OGAM, inst),                          \
+      SRII(MPCC_OGAM_RAMB_START_BASE_CNTL_B, MPCC_OGAM, inst),                 \
+      SRII(MPCC_OGAM_RAMB_START_BASE_CNTL_G, MPCC_OGAM, inst),                 \
+      SRII(MPCC_OGAM_RAMB_START_BASE_CNTL_R, MPCC_OGAM, inst),                 \
+      SRII(MPCC_OGAM_CONTROL, MPCC_OGAM, inst),                                \
+      SRII(MPCC_OGAM_LUT_CONTROL, MPCC_OGAM, inst)
+
+#define MPC_REG_LIST_DCN3_2_RI(inst) \
+       MPC_REG_LIST_DCN3_0_RI(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)
+/* OPTC */
+
+#define OPTC_COMMON_REG_LIST_DCN3_2_RI(inst)                                   \
+  SRI_ARR(OTG_VSTARTUP_PARAM, OTG, inst),                                      \
+      SRI_ARR(OTG_VUPDATE_PARAM, OTG, inst),                                   \
+      SRI_ARR(OTG_VREADY_PARAM, OTG, inst),                                    \
+      SRI_ARR(OTG_MASTER_UPDATE_LOCK, OTG, inst),                              \
+      SRI_ARR(OTG_GLOBAL_CONTROL0, OTG, inst),                                 \
+      SRI_ARR(OTG_GLOBAL_CONTROL1, OTG, inst),                                 \
+      SRI_ARR(OTG_GLOBAL_CONTROL2, OTG, inst),                                 \
+      SRI_ARR(OTG_GLOBAL_CONTROL4, OTG, inst),                                 \
+      SRI_ARR(OTG_DOUBLE_BUFFER_CONTROL, OTG, inst),                           \
+      SRI_ARR(OTG_H_TOTAL, OTG, inst),                                         \
+      SRI_ARR(OTG_H_BLANK_START_END, OTG, inst),                               \
+      SRI_ARR(OTG_H_SYNC_A, OTG, inst), SRI_ARR(OTG_H_SYNC_A_CNTL, OTG, inst), \
+      SRI_ARR(OTG_H_TIMING_CNTL, OTG, inst), SRI_ARR(OTG_V_TOTAL, OTG, inst),  \
+      SRI_ARR(OTG_V_BLANK_START_END, OTG, inst),                               \
+      SRI_ARR(OTG_V_SYNC_A, OTG, inst), SRI_ARR(OTG_V_SYNC_A_CNTL, OTG, inst), \
+      SRI_ARR(OTG_CONTROL, OTG, inst), SRI_ARR(OTG_STEREO_CONTROL, OTG, inst), \
+      SRI_ARR(OTG_3D_STRUCTURE_CONTROL, OTG, inst),                            \
+      SRI_ARR(OTG_STEREO_STATUS, OTG, inst),                                   \
+      SRI_ARR(OTG_V_TOTAL_MAX, OTG, inst),                                     \
+      SRI_ARR(OTG_V_TOTAL_MIN, OTG, inst),                                     \
+      SRI_ARR(OTG_V_TOTAL_CONTROL, OTG, inst),                                 \
+      SRI_ARR(OTG_TRIGA_CNTL, OTG, inst),                                      \
+      SRI_ARR(OTG_FORCE_COUNT_NOW_CNTL, OTG, inst),                            \
+      SRI_ARR(OTG_STATIC_SCREEN_CONTROL, OTG, inst),                           \
+      SRI_ARR(OTG_STATUS_FRAME_COUNT, OTG, inst),                              \
+      SRI_ARR(OTG_STATUS, OTG, inst), SRI_ARR(OTG_STATUS_POSITION, OTG, inst), \
+      SRI_ARR(OTG_NOM_VERT_POSITION, OTG, inst),                               \
+      SRI_ARR(OTG_M_CONST_DTO0, OTG, inst),                                    \
+      SRI_ARR(OTG_M_CONST_DTO1, OTG, inst),                                    \
+      SRI_ARR(OTG_CLOCK_CONTROL, OTG, inst),                                   \
+      SRI_ARR(OTG_VERTICAL_INTERRUPT0_CONTROL, OTG, inst),                     \
+      SRI_ARR(OTG_VERTICAL_INTERRUPT0_POSITION, OTG, inst),                    \
+      SRI_ARR(OTG_VERTICAL_INTERRUPT1_CONTROL, OTG, inst),                     \
+      SRI_ARR(OTG_VERTICAL_INTERRUPT1_POSITION, OTG, inst),                    \
+      SRI_ARR(OTG_VERTICAL_INTERRUPT2_CONTROL, OTG, inst),                     \
+      SRI_ARR(OTG_VERTICAL_INTERRUPT2_POSITION, OTG, inst),                    \
+      SRI_ARR(OPTC_INPUT_CLOCK_CONTROL, ODM, inst),                            \
+      SRI_ARR(OPTC_DATA_SOURCE_SELECT, ODM, inst),                             \
+      SRI_ARR(OPTC_INPUT_GLOBAL_CONTROL, ODM, inst),                           \
+      SRI_ARR(CONTROL, VTG, inst), SRI_ARR(OTG_VERT_SYNC_CONTROL, OTG, inst),  \
+      SRI_ARR(OTG_GSL_CONTROL, OTG, inst), SRI_ARR(OTG_CRC_CNTL, OTG, inst),   \
+      SRI_ARR(OTG_CRC0_DATA_RG, OTG, inst),                                    \
+      SRI_ARR(OTG_CRC0_DATA_B, OTG, inst),                                     \
+      SRI_ARR(OTG_CRC0_WINDOWA_X_CONTROL, OTG, inst),                          \
+      SRI_ARR(OTG_CRC0_WINDOWA_Y_CONTROL, OTG, inst),                          \
+      SRI_ARR(OTG_CRC0_WINDOWB_X_CONTROL, OTG, inst),                          \
+      SRI_ARR(OTG_CRC0_WINDOWB_Y_CONTROL, OTG, inst),                          \
+      SR_ARR(GSL_SOURCE_SELECT, inst),                                         \
+      SRI_ARR(OTG_TRIGA_MANUAL_TRIG, OTG, inst),                               \
+      SRI_ARR(OTG_GLOBAL_CONTROL1, OTG, inst),                                 \
+      SRI_ARR(OTG_GLOBAL_CONTROL2, OTG, inst),                                 \
+      SRI_ARR(OTG_GSL_WINDOW_X, OTG, inst),                                    \
+      SRI_ARR(OTG_GSL_WINDOW_Y, OTG, inst),                                    \
+      SRI_ARR(OTG_VUPDATE_KEEPOUT, OTG, inst),                                 \
+      SRI_ARR(OTG_DSC_START_POSITION, OTG, inst),                              \
+      SRI_ARR(OTG_DRR_TRIGGER_WINDOW, OTG, inst),                              \
+      SRI_ARR(OTG_DRR_V_TOTAL_CHANGE, OTG, inst),                              \
+      SRI_ARR(OPTC_DATA_FORMAT_CONTROL, ODM, inst),                            \
+      SRI_ARR(OPTC_BYTES_PER_PIXEL, ODM, inst),                                \
+      SRI_ARR(OPTC_WIDTH_CONTROL, ODM, inst),                                  \
+      SRI_ARR(OPTC_MEMORY_CONFIG, ODM, inst),                                  \
+      SRI_ARR(OTG_DRR_CONTROL, OTG, inst)
+
+/* HUBP */
+
+#define HUBP_REG_LIST_DCN_VM_RI(id)                                            \
+  SRI_ARR(NOM_PARAMETERS_0, HUBPREQ, id),                                      \
+      SRI_ARR(NOM_PARAMETERS_1, HUBPREQ, id),                                  \
+      SRI_ARR(NOM_PARAMETERS_2, HUBPREQ, id),                                  \
+      SRI_ARR(NOM_PARAMETERS_3, HUBPREQ, id),                                  \
+      SRI_ARR(DCN_VM_MX_L1_TLB_CNTL, HUBPREQ, id)
+#define HUBP_REG_LIST_DCN_RI(id)                                               \
+  SRI_ARR(DCHUBP_CNTL, HUBP, id), SRI_ARR(HUBPREQ_DEBUG_DB, HUBP, id),         \
+      SRI_ARR(HUBPREQ_DEBUG, HUBP, id), SRI_ARR(DCSURF_ADDR_CONFIG, HUBP, id), \
+      SRI_ARR(DCSURF_TILING_CONFIG, HUBP, id),                                 \
+      SRI_ARR(DCSURF_SURFACE_PITCH, HUBPREQ, id),                              \
+      SRI_ARR(DCSURF_SURFACE_PITCH_C, HUBPREQ, id),                            \
+      SRI_ARR(DCSURF_SURFACE_CONFIG, HUBP, id),                                \
+      SRI_ARR(DCSURF_FLIP_CONTROL, HUBPREQ, id),                               \
+      SRI_ARR(DCSURF_PRI_VIEWPORT_DIMENSION, HUBP, id),                        \
+      SRI_ARR(DCSURF_PRI_VIEWPORT_START, HUBP, id),                            \
+      SRI_ARR(DCSURF_SEC_VIEWPORT_DIMENSION, HUBP, id),                        \
+      SRI_ARR(DCSURF_SEC_VIEWPORT_START, HUBP, id),                            \
+      SRI_ARR(DCSURF_PRI_VIEWPORT_DIMENSION_C, HUBP, id),                      \
+      SRI_ARR(DCSURF_PRI_VIEWPORT_START_C, HUBP, id),                          \
+      SRI_ARR(DCSURF_SEC_VIEWPORT_DIMENSION_C, HUBP, id),                      \
+      SRI_ARR(DCSURF_SEC_VIEWPORT_START_C, HUBP, id),                          \
+      SRI_ARR(DCSURF_PRIMARY_SURFACE_ADDRESS_HIGH, HUBPREQ, id),               \
+      SRI_ARR(DCSURF_PRIMARY_SURFACE_ADDRESS, HUBPREQ, id),                    \
+      SRI_ARR(DCSURF_SECONDARY_SURFACE_ADDRESS_HIGH, HUBPREQ, id),             \
+      SRI_ARR(DCSURF_SECONDARY_SURFACE_ADDRESS, HUBPREQ, id),                  \
+      SRI_ARR(DCSURF_PRIMARY_META_SURFACE_ADDRESS_HIGH, HUBPREQ, id),          \
+      SRI_ARR(DCSURF_PRIMARY_META_SURFACE_ADDRESS, HUBPREQ, id),               \
+      SRI_ARR(DCSURF_SECONDARY_META_SURFACE_ADDRESS_HIGH, HUBPREQ, id),        \
+      SRI_ARR(DCSURF_SECONDARY_META_SURFACE_ADDRESS, HUBPREQ, id),             \
+      SRI_ARR(DCSURF_PRIMARY_SURFACE_ADDRESS_HIGH_C, HUBPREQ, id),             \
+      SRI_ARR(DCSURF_PRIMARY_SURFACE_ADDRESS_C, HUBPREQ, id),                  \
+      SRI_ARR(DCSURF_SECONDARY_SURFACE_ADDRESS_HIGH_C, HUBPREQ, id),           \
+      SRI_ARR(DCSURF_SECONDARY_SURFACE_ADDRESS_C, HUBPREQ, id),                \
+      SRI_ARR(DCSURF_PRIMARY_META_SURFACE_ADDRESS_HIGH_C, HUBPREQ, id),        \
+      SRI_ARR(DCSURF_PRIMARY_META_SURFACE_ADDRESS_C, HUBPREQ, id),             \
+      SRI_ARR(DCSURF_SECONDARY_META_SURFACE_ADDRESS_HIGH_C, HUBPREQ, id),      \
+      SRI_ARR(DCSURF_SECONDARY_META_SURFACE_ADDRESS_C, HUBPREQ, id),           \
+      SRI_ARR(DCSURF_SURFACE_INUSE, HUBPREQ, id),                              \
+      SRI_ARR(DCSURF_SURFACE_INUSE_HIGH, HUBPREQ, id),                         \
+      SRI_ARR(DCSURF_SURFACE_INUSE_C, HUBPREQ, id),                            \
+      SRI_ARR(DCSURF_SURFACE_INUSE_HIGH_C, HUBPREQ, id),                       \
+      SRI_ARR(DCSURF_SURFACE_EARLIEST_INUSE, HUBPREQ, id),                     \
+      SRI_ARR(DCSURF_SURFACE_EARLIEST_INUSE_HIGH, HUBPREQ, id),                \
+      SRI_ARR(DCSURF_SURFACE_EARLIEST_INUSE_C, HUBPREQ, id),                   \
+      SRI_ARR(DCSURF_SURFACE_EARLIEST_INUSE_HIGH_C, HUBPREQ, id),              \
+      SRI_ARR(DCSURF_SURFACE_CONTROL, HUBPREQ, id),                            \
+      SRI_ARR(DCSURF_SURFACE_FLIP_INTERRUPT, HUBPREQ, id),                     \
+      SRI_ARR(HUBPRET_CONTROL, HUBPRET, id),                                   \
+      SRI_ARR(HUBPRET_READ_LINE_STATUS, HUBPRET, id),                          \
+      SRI_ARR(DCN_EXPANSION_MODE, HUBPREQ, id),                                \
+      SRI_ARR(DCHUBP_REQ_SIZE_CONFIG, HUBP, id),                               \
+      SRI_ARR(DCHUBP_REQ_SIZE_CONFIG_C, HUBP, id),                             \
+      SRI_ARR(BLANK_OFFSET_0, HUBPREQ, id),                                    \
+      SRI_ARR(BLANK_OFFSET_1, HUBPREQ, id),                                    \
+      SRI_ARR(DST_DIMENSIONS, HUBPREQ, id),                                    \
+      SRI_ARR(DST_AFTER_SCALER, HUBPREQ, id),                                  \
+      SRI_ARR(VBLANK_PARAMETERS_0, HUBPREQ, id),                               \
+      SRI_ARR(REF_FREQ_TO_PIX_FREQ, HUBPREQ, id),                              \
+      SRI_ARR(VBLANK_PARAMETERS_1, HUBPREQ, id),                               \
+      SRI_ARR(VBLANK_PARAMETERS_3, HUBPREQ, id),                               \
+      SRI_ARR(NOM_PARAMETERS_4, HUBPREQ, id),                                  \
+      SRI_ARR(NOM_PARAMETERS_5, HUBPREQ, id),                                  \
+      SRI_ARR(PER_LINE_DELIVERY_PRE, HUBPREQ, id),                             \
+      SRI_ARR(PER_LINE_DELIVERY, HUBPREQ, id),                                 \
+      SRI_ARR(VBLANK_PARAMETERS_2, HUBPREQ, id),                               \
+      SRI_ARR(VBLANK_PARAMETERS_4, HUBPREQ, id),                               \
+      SRI_ARR(NOM_PARAMETERS_6, HUBPREQ, id),                                  \
+      SRI_ARR(NOM_PARAMETERS_7, HUBPREQ, id),                                  \
+      SRI_ARR(DCN_TTU_QOS_WM, HUBPREQ, id),                                    \
+      SRI_ARR(DCN_GLOBAL_TTU_CNTL, HUBPREQ, id),                               \
+      SRI_ARR(DCN_SURF0_TTU_CNTL0, HUBPREQ, id),                               \
+      SRI_ARR(DCN_SURF0_TTU_CNTL1, HUBPREQ, id),                               \
+      SRI_ARR(DCN_SURF1_TTU_CNTL0, HUBPREQ, id),                               \
+      SRI_ARR(DCN_SURF1_TTU_CNTL1, HUBPREQ, id),                               \
+      SRI_ARR(DCN_CUR0_TTU_CNTL0, HUBPREQ, id),                                \
+      SRI_ARR(DCN_CUR0_TTU_CNTL1, HUBPREQ, id),                                \
+      SRI_ARR(HUBP_CLK_CNTL, HUBP, id)
+#define HUBP_REG_LIST_DCN2_COMMON_RI(id)                                       \
+  HUBP_REG_LIST_DCN_RI(id), HUBP_REG_LIST_DCN_VM_RI(id),                       \
+      SRI_ARR(PREFETCH_SETTINGS, HUBPREQ, id),                                 \
+      SRI_ARR(PREFETCH_SETTINGS_C, HUBPREQ, id),                               \
+      SRI_ARR(DCN_VM_SYSTEM_APERTURE_LOW_ADDR, HUBPREQ, id),                   \
+      SRI_ARR(DCN_VM_SYSTEM_APERTURE_HIGH_ADDR, HUBPREQ, id),                  \
+      SRI_ARR(CURSOR_SETTINGS, HUBPREQ, id),                                   \
+      SRI_ARR(CURSOR_SURFACE_ADDRESS_HIGH, CURSOR0_, id),                      \
+      SRI_ARR(CURSOR_SURFACE_ADDRESS, CURSOR0_, id),                           \
+      SRI_ARR(CURSOR_SIZE, CURSOR0_, id),                                      \
+      SRI_ARR(CURSOR_CONTROL, CURSOR0_, id),                                   \
+      SRI_ARR(CURSOR_POSITION, CURSOR0_, id),                                  \
+      SRI_ARR(CURSOR_HOT_SPOT, CURSOR0_, id),                                  \
+      SRI_ARR(CURSOR_DST_OFFSET, CURSOR0_, id),                                \
+      SRI_ARR(DMDATA_ADDRESS_HIGH, CURSOR0_, id),                              \
+      SRI_ARR(DMDATA_ADDRESS_LOW, CURSOR0_, id),                               \
+      SRI_ARR(DMDATA_CNTL, CURSOR0_, id),                                      \
+      SRI_ARR(DMDATA_SW_CNTL, CURSOR0_, id),                                   \
+      SRI_ARR(DMDATA_QOS_CNTL, CURSOR0_, id),                                  \
+      SRI_ARR(DMDATA_SW_DATA, CURSOR0_, id),                                   \
+      SRI_ARR(DMDATA_STATUS, CURSOR0_, id),                                    \
+      SRI_ARR(FLIP_PARAMETERS_0, HUBPREQ, id),                                 \
+      SRI_ARR(FLIP_PARAMETERS_1, HUBPREQ, id),                                 \
+      SRI_ARR(FLIP_PARAMETERS_2, HUBPREQ, id),                                 \
+      SRI_ARR(DCN_CUR1_TTU_CNTL0, HUBPREQ, id),                                \
+      SRI_ARR(DCN_CUR1_TTU_CNTL1, HUBPREQ, id),                                \
+      SRI_ARR(DCSURF_FLIP_CONTROL2, HUBPREQ, id),                              \
+      SRI_ARR(VMID_SETTINGS_0, HUBPREQ, id)
+#define HUBP_REG_LIST_DCN21_RI(id)                                             \
+  HUBP_REG_LIST_DCN2_COMMON_RI(id), SRI_ARR(FLIP_PARAMETERS_3, HUBPREQ, id),   \
+      SRI_ARR(FLIP_PARAMETERS_4, HUBPREQ, id),                                 \
+      SRI_ARR(FLIP_PARAMETERS_5, HUBPREQ, id),                                 \
+      SRI_ARR(FLIP_PARAMETERS_6, HUBPREQ, id),                                 \
+      SRI_ARR(VBLANK_PARAMETERS_5, HUBPREQ, id),                               \
+      SRI_ARR(VBLANK_PARAMETERS_6, HUBPREQ, id)
+#define HUBP_REG_LIST_DCN30_RI(id)                                             \
+  HUBP_REG_LIST_DCN21_RI(id), SRI_ARR(DCN_DMDATA_VM_CNTL, HUBPREQ, id)
+#define HUBP_REG_LIST_DCN32_RI(id)                                             \
+  HUBP_REG_LIST_DCN30_RI(id), SRI_ARR(DCHUBP_MALL_CONFIG, HUBP, id),           \
+      SRI_ARR(DCHUBP_VMPG_CONFIG, HUBP, id),                                   \
+      SRI_ARR(UCLK_PSTATE_FORCE, HUBPREQ, id)
+
+/* HUBBUB */
+
+#define HUBBUB_REG_LIST_DCN32_RI(id)                                           \
+  SR(DCHUBBUB_ARB_DATA_URGENCY_WATERMARK_A),                                   \
+      SR(DCHUBBUB_ARB_DATA_URGENCY_WATERMARK_B),                               \
+      SR(DCHUBBUB_ARB_DATA_URGENCY_WATERMARK_C),                               \
+      SR(DCHUBBUB_ARB_DATA_URGENCY_WATERMARK_D),                               \
+      SR(DCHUBBUB_ARB_WATERMARK_CHANGE_CNTL),                                  \
+      SR(DCHUBBUB_ARB_DRAM_STATE_CNTL), SR(DCHUBBUB_ARB_SAT_LEVEL),            \
+      SR(DCHUBBUB_ARB_DF_REQ_OUTSTAND), SR(DCHUBBUB_GLOBAL_TIMER_CNTL),        \
+      SR(DCHUBBUB_SOFT_RESET), SR(DCHUBBUB_CRC_CTRL),                          \
+      SR(DCN_VM_FB_LOCATION_BASE), SR(DCN_VM_FB_LOCATION_TOP),                 \
+      SR(DCN_VM_FB_OFFSET), SR(DCN_VM_AGP_BOT), SR(DCN_VM_AGP_TOP),            \
+      SR(DCN_VM_AGP_BASE), HUBBUB_SR_WATERMARK_REG_LIST(),                     \
+      SR(DCHUBBUB_ARB_FRAC_URG_BW_NOM_A), SR(DCHUBBUB_ARB_FRAC_URG_BW_NOM_B),  \
+      SR(DCHUBBUB_ARB_FRAC_URG_BW_NOM_C), SR(DCHUBBUB_ARB_FRAC_URG_BW_NOM_D),  \
+      SR(DCHUBBUB_ARB_FRAC_URG_BW_FLIP_A),                                     \
+      SR(DCHUBBUB_ARB_FRAC_URG_BW_FLIP_B),                                     \
+      SR(DCHUBBUB_ARB_FRAC_URG_BW_FLIP_C),                                     \
+      SR(DCHUBBUB_ARB_FRAC_URG_BW_FLIP_D),                                     \
+      SR(DCHUBBUB_ARB_REFCYC_PER_TRIP_TO_MEMORY_A),                            \
+      SR(DCHUBBUB_ARB_REFCYC_PER_TRIP_TO_MEMORY_B),                            \
+      SR(DCHUBBUB_ARB_REFCYC_PER_TRIP_TO_MEMORY_C),                            \
+      SR(DCHUBBUB_ARB_REFCYC_PER_TRIP_TO_MEMORY_D), SR(DCHUBBUB_DET0_CTRL),    \
+      SR(DCHUBBUB_DET1_CTRL), SR(DCHUBBUB_DET2_CTRL), SR(DCHUBBUB_DET3_CTRL),  \
+      SR(DCHUBBUB_COMPBUF_CTRL), SR(COMPBUF_RESERVED_SPACE),                   \
+      SR(DCHUBBUB_DEBUG_CTRL_0),                                               \
+      SR(DCHUBBUB_ARB_USR_RETRAINING_CNTL),                                    \
+      SR(DCHUBBUB_ARB_USR_RETRAINING_WATERMARK_A),                             \
+      SR(DCHUBBUB_ARB_USR_RETRAINING_WATERMARK_B),                             \
+      SR(DCHUBBUB_ARB_USR_RETRAINING_WATERMARK_C),                             \
+      SR(DCHUBBUB_ARB_USR_RETRAINING_WATERMARK_D),                             \
+      SR(DCHUBBUB_ARB_UCLK_PSTATE_CHANGE_WATERMARK_A),                         \
+      SR(DCHUBBUB_ARB_UCLK_PSTATE_CHANGE_WATERMARK_B),                         \
+      SR(DCHUBBUB_ARB_UCLK_PSTATE_CHANGE_WATERMARK_C),                         \
+      SR(DCHUBBUB_ARB_UCLK_PSTATE_CHANGE_WATERMARK_D),                         \
+      SR(DCHUBBUB_ARB_FCLK_PSTATE_CHANGE_WATERMARK_A),                         \
+      SR(DCHUBBUB_ARB_FCLK_PSTATE_CHANGE_WATERMARK_B),                         \
+      SR(DCHUBBUB_ARB_FCLK_PSTATE_CHANGE_WATERMARK_C),                         \
+      SR(DCHUBBUB_ARB_FCLK_PSTATE_CHANGE_WATERMARK_D),                         \
+      SR(DCHUBBUB_ARB_MALL_CNTL),                                              \
+      SR(DCN_VM_FAULT_ADDR_MSB), SR(DCN_VM_FAULT_ADDR_LSB),                    \
+      SR(DCN_VM_FAULT_CNTL), SR(DCN_VM_FAULT_STATUS),                          \
+      SR(SDPIF_REQUEST_RATE_LIMIT)
+
+/* DCCG */
+
+#define DCCG_REG_LIST_DCN32_RI()                                               \
+  SR(DPPCLK_DTO_CTRL), DCCG_SRII(DTO_PARAM, DPPCLK, 0),                        \
+      DCCG_SRII(DTO_PARAM, DPPCLK, 1), DCCG_SRII(DTO_PARAM, DPPCLK, 2),        \
+      DCCG_SRII(DTO_PARAM, DPPCLK, 3), DCCG_SRII(CLOCK_CNTL, HDMICHARCLK, 0),  \
+      SR(PHYASYMCLK_CLOCK_CNTL), SR(PHYBSYMCLK_CLOCK_CNTL),                    \
+      SR(PHYCSYMCLK_CLOCK_CNTL), SR(PHYDSYMCLK_CLOCK_CNTL),                    \
+      SR(PHYESYMCLK_CLOCK_CNTL), SR(DPSTREAMCLK_CNTL), SR(HDMISTREAMCLK_CNTL), \
+      SR(SYMCLK32_SE_CNTL), SR(SYMCLK32_LE_CNTL),                              \
+      DCCG_SRII(PIXEL_RATE_CNTL, OTG, 0), DCCG_SRII(PIXEL_RATE_CNTL, OTG, 1),  \
+      DCCG_SRII(PIXEL_RATE_CNTL, OTG, 2), DCCG_SRII(PIXEL_RATE_CNTL, OTG, 3),  \
+      DCCG_SRII(MODULO, DTBCLK_DTO, 0), DCCG_SRII(MODULO, DTBCLK_DTO, 1),      \
+      DCCG_SRII(MODULO, DTBCLK_DTO, 2), DCCG_SRII(MODULO, DTBCLK_DTO, 3),      \
+      DCCG_SRII(PHASE, DTBCLK_DTO, 0), DCCG_SRII(PHASE, DTBCLK_DTO, 1),        \
+      DCCG_SRII(PHASE, DTBCLK_DTO, 2), DCCG_SRII(PHASE, DTBCLK_DTO, 3),        \
+      SR(DCCG_AUDIO_DTBCLK_DTO_MODULO), SR(DCCG_AUDIO_DTBCLK_DTO_PHASE),       \
+      SR(OTG_PIXEL_RATE_DIV), SR(DTBCLK_P_CNTL),                               \
+      SR(DCCG_AUDIO_DTO_SOURCE), SR(DENTIST_DISPCLK_CNTL)
+
+/* VMID */
+#define DCN20_VMID_REG_LIST_RI(id)                                             \
+  SRI_ARR(CNTL, DCN_VM_CONTEXT, id),                                           \
+      SRI_ARR(PAGE_TABLE_BASE_ADDR_HI32, DCN_VM_CONTEXT, id),                  \
+      SRI_ARR(PAGE_TABLE_BASE_ADDR_LO32, DCN_VM_CONTEXT, id),                  \
+      SRI_ARR(PAGE_TABLE_START_ADDR_HI32, DCN_VM_CONTEXT, id),                 \
+      SRI_ARR(PAGE_TABLE_START_ADDR_LO32, DCN_VM_CONTEXT, id),                 \
+      SRI_ARR(PAGE_TABLE_END_ADDR_HI32, DCN_VM_CONTEXT, id),                   \
+      SRI_ARR(PAGE_TABLE_END_ADDR_LO32, DCN_VM_CONTEXT, id)
+
+/* I2C HW */
+
+#define I2C_HW_ENGINE_COMMON_REG_LIST_RI(id)                                   \
+      SRI_ARR_I2C(SETUP, DC_I2C_DDC, id), SRI_ARR_I2C(SPEED, DC_I2C_DDC, id),  \
+      SRI_ARR_I2C(HW_STATUS, DC_I2C_DDC, id),                                  \
+      SR_ARR_I2C(DC_I2C_ARBITRATION, id),                                      \
+      SR_ARR_I2C(DC_I2C_CONTROL, id), SR_ARR_I2C(DC_I2C_SW_STATUS, id),        \
+      SR_ARR_I2C(DC_I2C_TRANSACTION0, id), SR_ARR_I2C(DC_I2C_TRANSACTION1, id),\
+      SR_ARR_I2C(DC_I2C_TRANSACTION2, id), SR_ARR_I2C(DC_I2C_TRANSACTION3, id),\
+      SR_ARR_I2C(DC_I2C_DATA, id), SR_ARR_I2C(MICROSECOND_TIME_BASE_DIV, id)
+
+#define I2C_HW_ENGINE_COMMON_REG_LIST_DCN30_RI(id)                             \
+      I2C_HW_ENGINE_COMMON_REG_LIST_RI(id), SR_ARR_I2C(DIO_MEM_PWR_CTRL, id),  \
+      SR_ARR_I2C(DIO_MEM_PWR_STATUS, id)
+
+#endif /* _DCN32_RESOURCE_H_ */
diff --git a/drivers/gpu/drm/amd/display/dc/resource/dcn321/dcn321_resource.c b/drivers/gpu/drm/amd/display/dc/resource/dcn321/dcn321_resource.c
new file mode 100644 (file)
index 0000000..bedb70b
--- /dev/null
@@ -0,0 +1,2065 @@
+// SPDX-License-Identifier: MIT
+/*
+ * 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 "dm_services.h"
+#include "dc.h"
+
+#include "dcn32/dcn32_init.h"
+
+#include "resource.h"
+#include "include/irq_service_interface.h"
+#include "dcn32/dcn32_resource.h"
+#include "dcn321_resource.h"
+
+#include "dcn20/dcn20_resource.h"
+#include "dcn30/dcn30_resource.h"
+
+#include "dml/dcn321/dcn321_fpu.h"
+
+#include "dcn10/dcn10_ipp.h"
+#include "dcn30/dcn30_hubbub.h"
+#include "dcn31/dcn31_hubbub.h"
+#include "dcn32/dcn32_hubbub.h"
+#include "dcn32/dcn32_mpc.h"
+#include "dcn32/dcn32_hubp.h"
+#include "irq/dcn32/irq_service_dcn32.h"
+#include "dcn32/dcn32_dpp.h"
+#include "dcn32/dcn32_optc.h"
+#include "dcn20/dcn20_hwseq.h"
+#include "dcn30/dcn30_hwseq.h"
+#include "dce110/dce110_hwseq.h"
+#include "dcn30/dcn30_opp.h"
+#include "dcn20/dcn20_dsc.h"
+#include "dcn30/dcn30_vpg.h"
+#include "dcn30/dcn30_afmt.h"
+#include "dcn30/dcn30_dio_stream_encoder.h"
+#include "dcn32/dcn32_dio_stream_encoder.h"
+#include "dcn31/dcn31_hpo_dp_stream_encoder.h"
+#include "dcn31/dcn31_hpo_dp_link_encoder.h"
+#include "dcn32/dcn32_hpo_dp_link_encoder.h"
+#include "dcn31/dcn31_apg.h"
+#include "dcn31/dcn31_dio_link_encoder.h"
+#include "dcn32/dcn32_dio_link_encoder.h"
+#include "dcn321/dcn321_dio_link_encoder.h"
+#include "dce/dce_clock_source.h"
+#include "dce/dce_audio.h"
+#include "dce/dce_hwseq.h"
+#include "clk_mgr.h"
+#include "virtual/virtual_stream_encoder.h"
+#include "dml/display_mode_vba.h"
+#include "dcn32/dcn32_dccg.h"
+#include "dcn10/dcn10_resource.h"
+#include "link.h"
+#include "dcn31/dcn31_panel_cntl.h"
+
+#include "dcn30/dcn30_dwb.h"
+#include "dcn32/dcn32_mmhubbub.h"
+
+#include "dcn/dcn_3_2_1_offset.h"
+#include "dcn/dcn_3_2_1_sh_mask.h"
+#include "nbio/nbio_4_3_0_offset.h"
+
+#include "reg_helper.h"
+#include "dce/dmub_abm.h"
+#include "dce/dmub_psr.h"
+#include "dce/dce_aux.h"
+#include "dce/dce_i2c.h"
+
+#include "dml/dcn30/display_mode_vba_30.h"
+#include "vm_helper.h"
+#include "dcn20/dcn20_vmid.h"
+
+#define DC_LOGGER_INIT(logger)
+
+enum dcn321_clk_src_array_id {
+       DCN321_CLK_SRC_PLL0,
+       DCN321_CLK_SRC_PLL1,
+       DCN321_CLK_SRC_PLL2,
+       DCN321_CLK_SRC_PLL3,
+       DCN321_CLK_SRC_PLL4,
+       DCN321_CLK_SRC_TOTAL
+};
+
+/* begin *********************
+ * macros to expend register list macro defined in HW object header file
+ */
+
+/* DCN */
+#define BASE_INNER(seg) ctx->dcn_reg_offsets[seg]
+
+#define BASE(seg) BASE_INNER(seg)
+
+#define SR(reg_name)\
+       REG_STRUCT.reg_name = BASE(reg ## reg_name ## _BASE_IDX) +  \
+               reg ## reg_name
+#define SR_ARR(reg_name, id)\
+       REG_STRUCT[id].reg_name = BASE(reg ## reg_name ## _BASE_IDX) +  \
+               reg ## reg_name
+#define SR_ARR_INIT(reg_name, id, value)\
+       REG_STRUCT[id].reg_name =  value
+
+#define SRI(reg_name, block, id)\
+       REG_STRUCT.reg_name = BASE(reg ## block ## id ## _ ## reg_name ## _BASE_IDX) + \
+               reg ## block ## id ## _ ## reg_name
+
+#define SRI_ARR(reg_name, block, id)\
+       REG_STRUCT[id].reg_name = BASE(reg ## block ## id ## _ ## reg_name ## _BASE_IDX) + \
+               reg ## block ## id ## _ ## reg_name
+
+#define SR_ARR_I2C(reg_name, id) \
+       REG_STRUCT[id-1].reg_name = BASE(reg##reg_name##_BASE_IDX) + reg##reg_name
+
+#define SRI_ARR_I2C(reg_name, block, id)\
+       REG_STRUCT[id-1].reg_name = BASE(reg ## block ## id ## _ ## reg_name ## _BASE_IDX) + \
+               reg ## block ## id ## _ ## reg_name
+
+#define SRI_ARR_ALPHABET(reg_name, block, index, id)\
+       REG_STRUCT[index].reg_name = BASE(reg ## block ## id ## _ ## reg_name ## _BASE_IDX) + \
+               reg ## block ## id ## _ ## reg_name
+
+#define SRI2(reg_name, block, id)\
+       .reg_name = BASE(reg ## reg_name ## _BASE_IDX) + \
+               reg ## reg_name
+#define SRI2_ARR(reg_name, block, id)\
+       REG_STRUCT[id].reg_name = BASE(reg ## reg_name ## _BASE_IDX) + \
+               reg ## reg_name
+
+#define SRIR(var_name, reg_name, block, id)\
+       .var_name = BASE(reg ## block ## id ## _ ## reg_name ## _BASE_IDX) + \
+               reg ## block ## id ## _ ## reg_name
+
+#define SRII(reg_name, block, id)\
+       REG_STRUCT.reg_name[id] = BASE(reg ## block ## id ## _ ## reg_name ## _BASE_IDX) + \
+               reg ## block ## id ## _ ## reg_name
+
+#define SRII_ARR_2(reg_name, block, id, inst)\
+       REG_STRUCT[inst].reg_name[id] = BASE(reg ## block ## id ## _ ## reg_name ## _BASE_IDX) + \
+               reg ## block ## id ## _ ## reg_name
+
+#define SRII_MPC_RMU(reg_name, block, id)\
+       .RMU##_##reg_name[id] = BASE(reg ## block ## id ## _ ## reg_name ## _BASE_IDX) + \
+               reg ## block ## id ## _ ## reg_name
+
+#define SRII_DWB(reg_name, temp_name, block, id)\
+       REG_STRUCT.reg_name[id] = BASE(reg ## block ## id ## _ ## temp_name ## _BASE_IDX) + \
+               reg ## block ## id ## _ ## temp_name
+
+#define DCCG_SRII(reg_name, block, id)\
+       REG_STRUCT.block ## _ ## reg_name[id] = BASE(reg ## block ## id ## _ ## reg_name ## _BASE_IDX) + \
+               reg ## block ## id ## _ ## reg_name
+
+#define SF_DWB2(reg_name, block, id, field_name, post_fix) \
+       .field_name = reg_name ## __ ## field_name ## post_fix
+
+#define VUPDATE_SRII(reg_name, block, id)\
+       REG_STRUCT.reg_name[id] = BASE(reg ## reg_name ## _ ## block ## id ## _BASE_IDX) + \
+               reg ## reg_name ## _ ## block ## id
+
+/* NBIO */
+#define NBIO_BASE_INNER(seg) ctx->nbio_reg_offsets[seg]
+
+#define NBIO_BASE(seg) \
+       NBIO_BASE_INNER(seg)
+
+#define NBIO_SR(reg_name)\
+       REG_STRUCT.reg_name = NBIO_BASE(regBIF_BX0_ ## reg_name ## _BASE_IDX) + \
+               regBIF_BX0_ ## reg_name
+#define NBIO_SR_ARR(reg_name, id)\
+       REG_STRUCT[id].reg_name = NBIO_BASE(regBIF_BX0_ ## reg_name ## _BASE_IDX) + \
+               regBIF_BX0_ ## reg_name
+
+#define CTX ctx
+#define REG(reg_name) \
+       (ctx->dcn_reg_offsets[reg ## reg_name ## _BASE_IDX] + reg ## reg_name)
+
+static struct bios_registers bios_regs;
+
+#define bios_regs_init() \
+               ( \
+               NBIO_SR(BIOS_SCRATCH_3),\
+               NBIO_SR(BIOS_SCRATCH_6)\
+               )
+
+#define clk_src_regs_init(index, pllid)\
+       CS_COMMON_REG_LIST_DCN3_0_RI(index, pllid)
+
+static struct dce110_clk_src_regs clk_src_regs[5];
+
+static const struct dce110_clk_src_shift cs_shift = {
+               CS_COMMON_MASK_SH_LIST_DCN3_2(__SHIFT)
+};
+
+static const struct dce110_clk_src_mask cs_mask = {
+               CS_COMMON_MASK_SH_LIST_DCN3_2(_MASK)
+};
+
+#define abm_regs_init(id)\
+               ABM_DCN32_REG_LIST_RI(id)
+
+static struct dce_abm_registers abm_regs[4];
+
+static const struct dce_abm_shift abm_shift = {
+               ABM_MASK_SH_LIST_DCN32(__SHIFT)
+};
+
+static const struct dce_abm_mask abm_mask = {
+               ABM_MASK_SH_LIST_DCN32(_MASK)
+};
+
+#define audio_regs_init(id)\
+               AUD_COMMON_REG_LIST_RI(id)
+
+static struct dce_audio_registers audio_regs[5];
+
+#define DCE120_AUD_COMMON_MASK_SH_LIST(mask_sh)\
+               SF(AZF0ENDPOINT0_AZALIA_F0_CODEC_ENDPOINT_INDEX, AZALIA_ENDPOINT_REG_INDEX, mask_sh),\
+               SF(AZF0ENDPOINT0_AZALIA_F0_CODEC_ENDPOINT_DATA, AZALIA_ENDPOINT_REG_DATA, mask_sh),\
+               AUD_COMMON_MASK_SH_LIST_BASE(mask_sh)
+
+static const struct dce_audio_shift audio_shift = {
+               DCE120_AUD_COMMON_MASK_SH_LIST(__SHIFT)
+};
+
+static const struct dce_audio_mask audio_mask = {
+               DCE120_AUD_COMMON_MASK_SH_LIST(_MASK)
+};
+
+#define vpg_regs_init(id)\
+       VPG_DCN3_REG_LIST_RI(id)
+
+static struct dcn30_vpg_registers vpg_regs[10];
+
+static const struct dcn30_vpg_shift vpg_shift = {
+       DCN3_VPG_MASK_SH_LIST(__SHIFT)
+};
+
+static const struct dcn30_vpg_mask vpg_mask = {
+       DCN3_VPG_MASK_SH_LIST(_MASK)
+};
+
+#define afmt_regs_init(id)\
+       AFMT_DCN3_REG_LIST_RI(id)
+
+static struct dcn30_afmt_registers afmt_regs[6];
+
+static const struct dcn30_afmt_shift afmt_shift = {
+       DCN3_AFMT_MASK_SH_LIST(__SHIFT)
+};
+
+static const struct dcn30_afmt_mask afmt_mask = {
+       DCN3_AFMT_MASK_SH_LIST(_MASK)
+};
+
+#define apg_regs_init(id)\
+       APG_DCN31_REG_LIST_RI(id)
+
+static struct dcn31_apg_registers apg_regs[4];
+
+static const struct dcn31_apg_shift apg_shift = {
+       DCN31_APG_MASK_SH_LIST(__SHIFT)
+};
+
+static const struct dcn31_apg_mask apg_mask = {
+               DCN31_APG_MASK_SH_LIST(_MASK)
+};
+
+#define stream_enc_regs_init(id)\
+       SE_DCN32_REG_LIST_RI(id)
+
+static struct dcn10_stream_enc_registers stream_enc_regs[5];
+
+static const struct dcn10_stream_encoder_shift se_shift = {
+               SE_COMMON_MASK_SH_LIST_DCN32(__SHIFT)
+};
+
+static const struct dcn10_stream_encoder_mask se_mask = {
+               SE_COMMON_MASK_SH_LIST_DCN32(_MASK)
+};
+
+
+#define aux_regs_init(id)\
+       DCN2_AUX_REG_LIST_RI(id)
+
+static struct dcn10_link_enc_aux_registers link_enc_aux_regs[5];
+
+#define hpd_regs_init(id)\
+       HPD_REG_LIST_RI(id)
+
+static struct dcn10_link_enc_hpd_registers link_enc_hpd_regs[5];
+
+#define link_regs_init(id, phyid)\
+       ( \
+       LE_DCN31_REG_LIST_RI(id), \
+       UNIPHY_DCN2_REG_LIST_RI(id, phyid)\
+       )
+       /*DPCS_DCN31_REG_LIST(id),*/ \
+
+static struct dcn10_link_enc_registers link_enc_regs[5];
+
+static const struct dcn10_link_enc_shift le_shift = {
+       LINK_ENCODER_MASK_SH_LIST_DCN31(__SHIFT), \
+//     DPCS_DCN31_MASK_SH_LIST(__SHIFT)
+};
+
+static const struct dcn10_link_enc_mask le_mask = {
+       LINK_ENCODER_MASK_SH_LIST_DCN31(_MASK), \
+//     DPCS_DCN31_MASK_SH_LIST(_MASK)
+};
+
+#define hpo_dp_stream_encoder_reg_init(id)\
+       DCN3_1_HPO_DP_STREAM_ENC_REG_LIST_RI(id)
+
+static struct dcn31_hpo_dp_stream_encoder_registers hpo_dp_stream_enc_regs[4];
+
+static const struct dcn31_hpo_dp_stream_encoder_shift hpo_dp_se_shift = {
+       DCN3_1_HPO_DP_STREAM_ENC_MASK_SH_LIST(__SHIFT)
+};
+
+static const struct dcn31_hpo_dp_stream_encoder_mask hpo_dp_se_mask = {
+       DCN3_1_HPO_DP_STREAM_ENC_MASK_SH_LIST(_MASK)
+};
+
+
+#define hpo_dp_link_encoder_reg_init(id)\
+       DCN3_1_HPO_DP_LINK_ENC_REG_LIST_RI(id)
+       /*DCN3_1_RDPCSTX_REG_LIST(0),*/
+       /*DCN3_1_RDPCSTX_REG_LIST(1),*/
+       /*DCN3_1_RDPCSTX_REG_LIST(2),*/
+       /*DCN3_1_RDPCSTX_REG_LIST(3),*/
+
+static struct dcn31_hpo_dp_link_encoder_registers hpo_dp_link_enc_regs[2];
+
+static const struct dcn31_hpo_dp_link_encoder_shift hpo_dp_le_shift = {
+       DCN3_2_HPO_DP_LINK_ENC_MASK_SH_LIST(__SHIFT)
+};
+
+static const struct dcn31_hpo_dp_link_encoder_mask hpo_dp_le_mask = {
+       DCN3_2_HPO_DP_LINK_ENC_MASK_SH_LIST(_MASK)
+};
+
+#define dpp_regs_init(id)\
+       DPP_REG_LIST_DCN30_COMMON_RI(id)
+
+static struct dcn3_dpp_registers dpp_regs[4];
+
+static const struct dcn3_dpp_shift tf_shift = {
+               DPP_REG_LIST_SH_MASK_DCN30_COMMON(__SHIFT)
+};
+
+static const struct dcn3_dpp_mask tf_mask = {
+               DPP_REG_LIST_SH_MASK_DCN30_COMMON(_MASK)
+};
+
+
+#define opp_regs_init(id)\
+       OPP_REG_LIST_DCN30_RI(id)
+
+static struct dcn20_opp_registers opp_regs[4];
+
+static const struct dcn20_opp_shift opp_shift = {
+       OPP_MASK_SH_LIST_DCN20(__SHIFT)
+};
+
+static const struct dcn20_opp_mask opp_mask = {
+       OPP_MASK_SH_LIST_DCN20(_MASK)
+};
+
+#define aux_engine_regs_init(id) \
+       ( \
+       AUX_COMMON_REG_LIST0_RI(id), SR_ARR_INIT(AUXN_IMPCAL, id, 0), \
+       SR_ARR_INIT(AUXP_IMPCAL, id, 0), \
+       SR_ARR_INIT(AUX_RESET_MASK, id, DP_AUX0_AUX_CONTROL__AUX_RESET_MASK), \
+       SR_ARR_INIT(AUX_RESET_MASK, id, DP_AUX0_AUX_CONTROL__AUX_RESET_MASK)\
+       )
+
+static struct dce110_aux_registers aux_engine_regs[5];
+
+static const struct dce110_aux_registers_shift aux_shift = {
+       DCN_AUX_MASK_SH_LIST(__SHIFT)
+};
+
+static const struct dce110_aux_registers_mask aux_mask = {
+       DCN_AUX_MASK_SH_LIST(_MASK)
+};
+
+#define dwbc_regs_dcn3_init(id)\
+       DWBC_COMMON_REG_LIST_DCN30_RI(id)
+
+static struct dcn30_dwbc_registers dwbc30_regs[1];
+
+static const struct dcn30_dwbc_shift dwbc30_shift = {
+       DWBC_COMMON_MASK_SH_LIST_DCN30(__SHIFT)
+};
+
+static const struct dcn30_dwbc_mask dwbc30_mask = {
+       DWBC_COMMON_MASK_SH_LIST_DCN30(_MASK)
+};
+
+#define mcif_wb_regs_dcn3_init(id)\
+       MCIF_WB_COMMON_REG_LIST_DCN32_RI(id)
+
+static struct dcn30_mmhubbub_registers mcif_wb30_regs[1];
+
+static const struct dcn30_mmhubbub_shift mcif_wb30_shift = {
+       MCIF_WB_COMMON_MASK_SH_LIST_DCN32(__SHIFT)
+};
+
+static const struct dcn30_mmhubbub_mask mcif_wb30_mask = {
+       MCIF_WB_COMMON_MASK_SH_LIST_DCN32(_MASK)
+};
+
+#define dsc_regsDCN20_init(id)\
+       DSC_REG_LIST_DCN20_RI(id)
+
+static struct dcn20_dsc_registers dsc_regs[4];
+
+static const struct dcn20_dsc_shift dsc_shift = {
+       DSC_REG_LIST_SH_MASK_DCN20(__SHIFT)
+};
+
+static const struct dcn20_dsc_mask dsc_mask = {
+       DSC_REG_LIST_SH_MASK_DCN20(_MASK)
+};
+
+static struct dcn30_mpc_registers mpc_regs;
+#define dcn_mpc_regs_init()\
+       MPC_REG_LIST_DCN3_2_RI(0),\
+       MPC_REG_LIST_DCN3_2_RI(1),\
+       MPC_REG_LIST_DCN3_2_RI(2),\
+       MPC_REG_LIST_DCN3_2_RI(3),\
+       MPC_OUT_MUX_REG_LIST_DCN3_0_RI(0),\
+       MPC_OUT_MUX_REG_LIST_DCN3_0_RI(1),\
+       MPC_OUT_MUX_REG_LIST_DCN3_0_RI(2),\
+       MPC_OUT_MUX_REG_LIST_DCN3_0_RI(3),\
+       MPC_DWB_MUX_REG_LIST_DCN3_0_RI(0)
+
+static const struct dcn30_mpc_shift mpc_shift = {
+       MPC_COMMON_MASK_SH_LIST_DCN32(__SHIFT)
+};
+
+static const struct dcn30_mpc_mask mpc_mask = {
+       MPC_COMMON_MASK_SH_LIST_DCN32(_MASK)
+};
+
+#define optc_regs_init(id)\
+       OPTC_COMMON_REG_LIST_DCN3_2_RI(id)
+
+static struct dcn_optc_registers optc_regs[4];
+
+static const struct dcn_optc_shift optc_shift = {
+       OPTC_COMMON_MASK_SH_LIST_DCN3_2(__SHIFT)
+};
+
+static const struct dcn_optc_mask optc_mask = {
+       OPTC_COMMON_MASK_SH_LIST_DCN3_2(_MASK)
+};
+
+#define hubp_regs_init(id) \
+       HUBP_REG_LIST_DCN32_RI(id)
+
+static struct dcn_hubp2_registers hubp_regs[4];
+
+static const struct dcn_hubp2_shift hubp_shift = {
+               HUBP_MASK_SH_LIST_DCN32(__SHIFT)
+};
+
+static const struct dcn_hubp2_mask hubp_mask = {
+               HUBP_MASK_SH_LIST_DCN32(_MASK)
+};
+
+static struct dcn_hubbub_registers hubbub_reg;
+#define hubbub_reg_init()\
+               HUBBUB_REG_LIST_DCN32_RI(0)
+
+static const struct dcn_hubbub_shift hubbub_shift = {
+               HUBBUB_MASK_SH_LIST_DCN32(__SHIFT)
+};
+
+static const struct dcn_hubbub_mask hubbub_mask = {
+               HUBBUB_MASK_SH_LIST_DCN32(_MASK)
+};
+
+static struct dccg_registers dccg_regs;
+
+#define dccg_regs_init()\
+       DCCG_REG_LIST_DCN32_RI()
+
+static const struct dccg_shift dccg_shift = {
+               DCCG_MASK_SH_LIST_DCN32(__SHIFT)
+};
+
+static const struct dccg_mask dccg_mask = {
+               DCCG_MASK_SH_LIST_DCN32(_MASK)
+};
+
+
+#define SRII2(reg_name_pre, reg_name_post, id)\
+       .reg_name_pre ## _ ##  reg_name_post[id] = BASE(reg ## reg_name_pre \
+                       ## id ## _ ## reg_name_post ## _BASE_IDX) + \
+                       reg ## reg_name_pre ## id ## _ ## reg_name_post
+
+
+#define HWSEQ_DCN32_REG_LIST()\
+       SR(DCHUBBUB_GLOBAL_TIMER_CNTL), \
+       SR(DIO_MEM_PWR_CTRL), \
+       SR(ODM_MEM_PWR_CTRL3), \
+       SR(MMHUBBUB_MEM_PWR_CNTL), \
+       SR(DCCG_GATE_DISABLE_CNTL), \
+       SR(DCCG_GATE_DISABLE_CNTL2), \
+       SR(DCFCLK_CNTL),\
+       SR(DC_MEM_GLOBAL_PWR_REQ_CNTL), \
+       SRII(PIXEL_RATE_CNTL, OTG, 0), \
+       SRII(PIXEL_RATE_CNTL, OTG, 1),\
+       SRII(PIXEL_RATE_CNTL, OTG, 2),\
+       SRII(PIXEL_RATE_CNTL, OTG, 3),\
+       SRII(PHYPLL_PIXEL_RATE_CNTL, OTG, 0),\
+       SRII(PHYPLL_PIXEL_RATE_CNTL, OTG, 1),\
+       SRII(PHYPLL_PIXEL_RATE_CNTL, OTG, 2),\
+       SRII(PHYPLL_PIXEL_RATE_CNTL, OTG, 3),\
+       SR(MICROSECOND_TIME_BASE_DIV), \
+       SR(MILLISECOND_TIME_BASE_DIV), \
+       SR(DISPCLK_FREQ_CHANGE_CNTL), \
+       SR(RBBMIF_TIMEOUT_DIS), \
+       SR(RBBMIF_TIMEOUT_DIS_2), \
+       SR(DCHUBBUB_CRC_CTRL), \
+       SR(DPP_TOP0_DPP_CRC_CTRL), \
+       SR(DPP_TOP0_DPP_CRC_VAL_B_A), \
+       SR(DPP_TOP0_DPP_CRC_VAL_R_G), \
+       SR(MPC_CRC_CTRL), \
+       SR(MPC_CRC_RESULT_GB), \
+       SR(MPC_CRC_RESULT_C), \
+       SR(MPC_CRC_RESULT_AR), \
+       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(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(D1VGA_CONTROL), \
+       SR(D2VGA_CONTROL), \
+       SR(D3VGA_CONTROL), \
+       SR(D4VGA_CONTROL), \
+       SR(D5VGA_CONTROL), \
+       SR(D6VGA_CONTROL), \
+       SR(DC_IP_REQUEST_CNTL), \
+       SR(AZALIA_AUDIO_DTO), \
+       SR(AZALIA_CONTROLLER_CLOCK_GATING)
+
+static struct dce_hwseq_registers hwseq_reg;
+
+#define hwseq_reg_init()\
+       HWSEQ_DCN32_REG_LIST()
+
+#define HWSEQ_DCN32_MASK_SH_LIST(mask_sh)\
+       HWSEQ_DCN_MASK_SH_LIST(mask_sh), \
+       HWS_SF(, DCHUBBUB_GLOBAL_TIMER_CNTL, DCHUBBUB_GLOBAL_TIMER_REFDIV, mask_sh), \
+       HWS_SF(, DOMAIN0_PG_CONFIG, DOMAIN_POWER_FORCEON, mask_sh), \
+       HWS_SF(, DOMAIN0_PG_CONFIG, DOMAIN_POWER_GATE, mask_sh), \
+       HWS_SF(, DOMAIN1_PG_CONFIG, DOMAIN_POWER_FORCEON, mask_sh), \
+       HWS_SF(, DOMAIN1_PG_CONFIG, DOMAIN_POWER_GATE, mask_sh), \
+       HWS_SF(, DOMAIN2_PG_CONFIG, DOMAIN_POWER_FORCEON, mask_sh), \
+       HWS_SF(, DOMAIN2_PG_CONFIG, DOMAIN_POWER_GATE, mask_sh), \
+       HWS_SF(, DOMAIN3_PG_CONFIG, DOMAIN_POWER_FORCEON, mask_sh), \
+       HWS_SF(, DOMAIN3_PG_CONFIG, DOMAIN_POWER_GATE, mask_sh), \
+       HWS_SF(, DOMAIN16_PG_CONFIG, DOMAIN_POWER_FORCEON, mask_sh), \
+       HWS_SF(, DOMAIN16_PG_CONFIG, DOMAIN_POWER_GATE, mask_sh), \
+       HWS_SF(, DOMAIN17_PG_CONFIG, DOMAIN_POWER_FORCEON, mask_sh), \
+       HWS_SF(, DOMAIN17_PG_CONFIG, DOMAIN_POWER_GATE, mask_sh), \
+       HWS_SF(, DOMAIN18_PG_CONFIG, DOMAIN_POWER_FORCEON, mask_sh), \
+       HWS_SF(, DOMAIN18_PG_CONFIG, DOMAIN_POWER_GATE, mask_sh), \
+       HWS_SF(, DOMAIN19_PG_CONFIG, DOMAIN_POWER_FORCEON, mask_sh), \
+       HWS_SF(, DOMAIN19_PG_CONFIG, DOMAIN_POWER_GATE, mask_sh), \
+       HWS_SF(, DOMAIN0_PG_STATUS, DOMAIN_PGFSM_PWR_STATUS, mask_sh), \
+       HWS_SF(, DOMAIN1_PG_STATUS, DOMAIN_PGFSM_PWR_STATUS, mask_sh), \
+       HWS_SF(, DOMAIN2_PG_STATUS, DOMAIN_PGFSM_PWR_STATUS, mask_sh), \
+       HWS_SF(, DOMAIN3_PG_STATUS, DOMAIN_PGFSM_PWR_STATUS, mask_sh), \
+       HWS_SF(, DOMAIN16_PG_STATUS, DOMAIN_PGFSM_PWR_STATUS, mask_sh), \
+       HWS_SF(, DOMAIN17_PG_STATUS, DOMAIN_PGFSM_PWR_STATUS, mask_sh), \
+       HWS_SF(, DOMAIN18_PG_STATUS, DOMAIN_PGFSM_PWR_STATUS, mask_sh), \
+       HWS_SF(, DOMAIN19_PG_STATUS, DOMAIN_PGFSM_PWR_STATUS, mask_sh), \
+       HWS_SF(, DC_IP_REQUEST_CNTL, IP_REQUEST_EN, mask_sh), \
+       HWS_SF(, AZALIA_AUDIO_DTO, AZALIA_AUDIO_DTO_MODULE, mask_sh), \
+       HWS_SF(, HPO_TOP_CLOCK_CONTROL, HPO_HDMISTREAMCLK_G_GATE_DIS, mask_sh), \
+       HWS_SF(, ODM_MEM_PWR_CTRL3, ODM_MEM_UNASSIGNED_PWR_MODE, mask_sh), \
+       HWS_SF(, ODM_MEM_PWR_CTRL3, ODM_MEM_VBLANK_PWR_MODE, mask_sh), \
+       HWS_SF(, MMHUBBUB_MEM_PWR_CNTL, VGA_MEM_PWR_FORCE, mask_sh)
+
+static const struct dce_hwseq_shift hwseq_shift = {
+               HWSEQ_DCN32_MASK_SH_LIST(__SHIFT)
+};
+
+static const struct dce_hwseq_mask hwseq_mask = {
+               HWSEQ_DCN32_MASK_SH_LIST(_MASK)
+};
+#define vmid_regs_init(id)\
+               DCN20_VMID_REG_LIST_RI(id)
+
+static struct dcn_vmid_registers vmid_regs[16];
+
+static const struct dcn20_vmid_shift vmid_shifts = {
+               DCN20_VMID_MASK_SH_LIST(__SHIFT)
+};
+
+static const struct dcn20_vmid_mask vmid_masks = {
+               DCN20_VMID_MASK_SH_LIST(_MASK)
+};
+
+static const struct resource_caps res_cap_dcn321 = {
+       .num_timing_generator = 4,
+       .num_opp = 4,
+       .num_video_plane = 4,
+       .num_audio = 5,
+       .num_stream_encoder = 5,
+       .num_hpo_dp_stream_encoder = 4,
+       .num_hpo_dp_link_encoder = 2,
+       .num_pll = 5,
+       .num_dwb = 1,
+       .num_ddc = 5,
+       .num_vmid = 16,
+       .num_mpc_3dlut = 4,
+       .num_dsc = 4,
+};
+
+static const struct dc_plane_cap plane_cap = {
+       .type = DC_PLANE_TYPE_DCN_UNIVERSAL,
+       .per_pixel_alpha = true,
+
+       .pixel_format_support = {
+                       .argb8888 = true,
+                       .nv12 = true,
+                       .fp16 = true,
+                       .p010 = true,
+                       .ayuv = false,
+       },
+
+       .max_upscale_factor = {
+                       .argb8888 = 16000,
+                       .nv12 = 16000,
+                       .fp16 = 16000
+       },
+
+       // 6:1 downscaling ratio: 1000/6 = 166.666
+       .max_downscale_factor = {
+                       .argb8888 = 167,
+                       .nv12 = 167,
+                       .fp16 = 167
+       },
+       64,
+       64
+};
+
+static const struct dc_debug_options debug_defaults_drv = {
+       .disable_dmcu = true,
+       .force_abm_enable = false,
+       .timing_trace = false,
+       .clock_trace = true,
+       .disable_pplib_clock_request = false,
+       .pipe_split_policy = MPC_SPLIT_AVOID,
+       .force_single_disp_pipe_split = false,
+       .disable_dcc = DCC_ENABLE,
+       .vsr_support = true,
+       .performance_trace = false,
+       .max_downscale_src_width = 7680,/*upto 8K*/
+       .disable_pplib_wm_range = false,
+       .scl_reset_length10 = true,
+       .sanity_checks = false,
+       .underflow_assert_delay_us = 0xFFFFFFFF,
+       .dwb_fi_phase = -1, // -1 = disable,
+       .dmub_command_table = true,
+       .enable_mem_low_power = {
+               .bits = {
+                       .vga = false,
+                       .i2c = false,
+                       .dmcu = false, // This is previously known to cause hang on S3 cycles if enabled
+                       .dscl = false,
+                       .cm = false,
+                       .mpc = false,
+                       .optc = true,
+               }
+       },
+       .use_max_lb = true,
+       .force_disable_subvp = false,
+       .exit_idle_opt_for_cursor_updates = true,
+       .enable_single_display_2to1_odm_policy = true,
+
+       /*must match enable_single_display_2to1_odm_policy to support dynamic ODM transitions*/
+       .enable_double_buffered_dsc_pg_support = true,
+       .enable_dp_dig_pixel_rate_div_policy = 1,
+       .allow_sw_cursor_fallback = false, // Linux can't do SW cursor "fallback"
+       .alloc_extra_way_for_cursor = true,
+       .min_prefetch_in_strobe_ns = 60000, // 60us
+       .disable_unbounded_requesting = false,
+       .override_dispclk_programming = true,
+       .disable_fpo_optimizations = false,
+       .fpo_vactive_margin_us = 2000, // 2000us
+       .disable_fpo_vactive = false,
+       .disable_boot_optimizations = false,
+       .disable_subvp_high_refresh = false,
+       .fpo_vactive_min_active_margin_us = 200,
+       .fpo_vactive_max_blank_us = 1000,
+       .enable_legacy_fast_update = false,
+       .disable_dc_mode_overwrite = true,
+       .using_dml2 = false,
+};
+
+static struct dce_aux *dcn321_aux_engine_create(
+       struct dc_context *ctx,
+       uint32_t inst)
+{
+       struct aux_engine_dce110 *aux_engine =
+               kzalloc(sizeof(struct aux_engine_dce110), GFP_KERNEL);
+
+       if (!aux_engine)
+               return NULL;
+
+#undef REG_STRUCT
+#define REG_STRUCT aux_engine_regs
+       aux_engine_regs_init(0),
+       aux_engine_regs_init(1),
+       aux_engine_regs_init(2),
+       aux_engine_regs_init(3),
+       aux_engine_regs_init(4);
+
+       dce110_aux_engine_construct(aux_engine, ctx, inst,
+                                   SW_AUX_TIMEOUT_PERIOD_MULTIPLIER * AUX_TIMEOUT_PERIOD,
+                                   &aux_engine_regs[inst],
+                                       &aux_mask,
+                                       &aux_shift,
+                                       ctx->dc->caps.extended_aux_timeout_support);
+
+       return &aux_engine->base;
+}
+#define i2c_inst_regs_init(id)\
+       I2C_HW_ENGINE_COMMON_REG_LIST_DCN30_RI(id)
+
+static struct dce_i2c_registers i2c_hw_regs[5];
+
+static const struct dce_i2c_shift i2c_shifts = {
+               I2C_COMMON_MASK_SH_LIST_DCN30(__SHIFT)
+};
+
+static const struct dce_i2c_mask i2c_masks = {
+               I2C_COMMON_MASK_SH_LIST_DCN30(_MASK)
+};
+
+static struct dce_i2c_hw *dcn321_i2c_hw_create(
+       struct dc_context *ctx,
+       uint32_t inst)
+{
+       struct dce_i2c_hw *dce_i2c_hw =
+               kzalloc(sizeof(struct dce_i2c_hw), GFP_KERNEL);
+
+       if (!dce_i2c_hw)
+               return NULL;
+
+#undef REG_STRUCT
+#define REG_STRUCT i2c_hw_regs
+       i2c_inst_regs_init(1),
+       i2c_inst_regs_init(2),
+       i2c_inst_regs_init(3),
+       i2c_inst_regs_init(4),
+       i2c_inst_regs_init(5);
+
+       dcn2_i2c_hw_construct(dce_i2c_hw, ctx, inst,
+                                   &i2c_hw_regs[inst], &i2c_shifts, &i2c_masks);
+
+       return dce_i2c_hw;
+}
+
+static struct clock_source *dcn321_clock_source_create(
+               struct dc_context *ctx,
+               struct dc_bios *bios,
+               enum clock_source_id id,
+               const struct dce110_clk_src_regs *regs,
+               bool dp_clk_src)
+{
+       struct dce110_clk_src *clk_src =
+               kzalloc(sizeof(struct dce110_clk_src), GFP_KERNEL);
+
+       if (!clk_src)
+               return NULL;
+
+       if (dcn31_clk_src_construct(clk_src, ctx, bios, id,
+                       regs, &cs_shift, &cs_mask)) {
+               clk_src->base.dp_clk_src = dp_clk_src;
+               return &clk_src->base;
+       }
+
+       kfree(clk_src);
+       BREAK_TO_DEBUGGER();
+       return NULL;
+}
+
+static struct hubbub *dcn321_hubbub_create(struct dc_context *ctx)
+{
+       int i;
+
+       struct dcn20_hubbub *hubbub2 = kzalloc(sizeof(struct dcn20_hubbub),
+                                         GFP_KERNEL);
+
+       if (!hubbub2)
+               return NULL;
+
+#undef REG_STRUCT
+#define REG_STRUCT hubbub_reg
+       hubbub_reg_init();
+
+#undef REG_STRUCT
+#define REG_STRUCT vmid_regs
+       vmid_regs_init(0),
+       vmid_regs_init(1),
+       vmid_regs_init(2),
+       vmid_regs_init(3),
+       vmid_regs_init(4),
+       vmid_regs_init(5),
+       vmid_regs_init(6),
+       vmid_regs_init(7),
+       vmid_regs_init(8),
+       vmid_regs_init(9),
+       vmid_regs_init(10),
+       vmid_regs_init(11),
+       vmid_regs_init(12),
+       vmid_regs_init(13),
+       vmid_regs_init(14),
+       vmid_regs_init(15);
+
+       hubbub32_construct(hubbub2, ctx,
+                       &hubbub_reg,
+                       &hubbub_shift,
+                       &hubbub_mask,
+                       ctx->dc->dml.ip.det_buffer_size_kbytes,
+                       ctx->dc->dml.ip.pixel_chunk_size_kbytes,
+                       ctx->dc->dml.ip.config_return_buffer_size_in_kbytes);
+
+
+       for (i = 0; i < res_cap_dcn321.num_vmid; i++) {
+               struct dcn20_vmid *vmid = &hubbub2->vmid[i];
+
+               vmid->ctx = ctx;
+
+               vmid->regs = &vmid_regs[i];
+               vmid->shifts = &vmid_shifts;
+               vmid->masks = &vmid_masks;
+       }
+
+       return &hubbub2->base;
+}
+
+static struct hubp *dcn321_hubp_create(
+       struct dc_context *ctx,
+       uint32_t inst)
+{
+       struct dcn20_hubp *hubp2 =
+               kzalloc(sizeof(struct dcn20_hubp), GFP_KERNEL);
+
+       if (!hubp2)
+               return NULL;
+
+#undef REG_STRUCT
+#define REG_STRUCT hubp_regs
+       hubp_regs_init(0),
+       hubp_regs_init(1),
+       hubp_regs_init(2),
+       hubp_regs_init(3);
+
+       if (hubp32_construct(hubp2, ctx, inst,
+                       &hubp_regs[inst], &hubp_shift, &hubp_mask))
+               return &hubp2->base;
+
+       BREAK_TO_DEBUGGER();
+       kfree(hubp2);
+       return NULL;
+}
+
+static void dcn321_dpp_destroy(struct dpp **dpp)
+{
+       kfree(TO_DCN30_DPP(*dpp));
+       *dpp = NULL;
+}
+
+static struct dpp *dcn321_dpp_create(
+       struct dc_context *ctx,
+       uint32_t inst)
+{
+       struct dcn3_dpp *dpp3 =
+               kzalloc(sizeof(struct dcn3_dpp), GFP_KERNEL);
+
+       if (!dpp3)
+               return NULL;
+
+#undef REG_STRUCT
+#define REG_STRUCT dpp_regs
+       dpp_regs_init(0),
+       dpp_regs_init(1),
+       dpp_regs_init(2),
+       dpp_regs_init(3);
+
+       if (dpp32_construct(dpp3, ctx, inst,
+                       &dpp_regs[inst], &tf_shift, &tf_mask))
+               return &dpp3->base;
+
+       BREAK_TO_DEBUGGER();
+       kfree(dpp3);
+       return NULL;
+}
+
+static struct mpc *dcn321_mpc_create(
+               struct dc_context *ctx,
+               int num_mpcc,
+               int num_rmu)
+{
+       struct dcn30_mpc *mpc30 = kzalloc(sizeof(struct dcn30_mpc),
+                                         GFP_KERNEL);
+
+       if (!mpc30)
+               return NULL;
+
+#undef REG_STRUCT
+#define REG_STRUCT mpc_regs
+       dcn_mpc_regs_init();
+
+       dcn32_mpc_construct(mpc30, ctx,
+                       &mpc_regs,
+                       &mpc_shift,
+                       &mpc_mask,
+                       num_mpcc,
+                       num_rmu);
+
+       return &mpc30->base;
+}
+
+static struct output_pixel_processor *dcn321_opp_create(
+       struct dc_context *ctx, uint32_t inst)
+{
+       struct dcn20_opp *opp2 =
+               kzalloc(sizeof(struct dcn20_opp), GFP_KERNEL);
+
+       if (!opp2) {
+               BREAK_TO_DEBUGGER();
+               return NULL;
+       }
+
+#undef REG_STRUCT
+#define REG_STRUCT opp_regs
+       opp_regs_init(0),
+       opp_regs_init(1),
+       opp_regs_init(2),
+       opp_regs_init(3);
+
+       dcn20_opp_construct(opp2, ctx, inst,
+                       &opp_regs[inst], &opp_shift, &opp_mask);
+       return &opp2->base;
+}
+
+
+static struct timing_generator *dcn321_timing_generator_create(
+               struct dc_context *ctx,
+               uint32_t instance)
+{
+       struct optc *tgn10 =
+               kzalloc(sizeof(struct optc), GFP_KERNEL);
+
+       if (!tgn10)
+               return NULL;
+
+#undef REG_STRUCT
+#define REG_STRUCT optc_regs
+       optc_regs_init(0),
+       optc_regs_init(1),
+       optc_regs_init(2),
+       optc_regs_init(3);
+
+       tgn10->base.inst = instance;
+       tgn10->base.ctx = ctx;
+
+       tgn10->tg_regs = &optc_regs[instance];
+       tgn10->tg_shift = &optc_shift;
+       tgn10->tg_mask = &optc_mask;
+
+       dcn32_timing_generator_init(tgn10);
+
+       return &tgn10->base;
+}
+
+static const struct encoder_feature_support link_enc_feature = {
+               .max_hdmi_deep_color = COLOR_DEPTH_121212,
+               .max_hdmi_pixel_clock = 600000,
+               .hdmi_ycbcr420_supported = true,
+               .dp_ycbcr420_supported = true,
+               .fec_supported = true,
+               .flags.bits.IS_HBR2_CAPABLE = true,
+               .flags.bits.IS_HBR3_CAPABLE = true,
+               .flags.bits.IS_TPS3_CAPABLE = true,
+               .flags.bits.IS_TPS4_CAPABLE = true
+};
+
+static struct link_encoder *dcn321_link_encoder_create(
+       struct dc_context *ctx,
+       const struct encoder_init_data *enc_init_data)
+{
+       struct dcn20_link_encoder *enc20 =
+               kzalloc(sizeof(struct dcn20_link_encoder), GFP_KERNEL);
+
+       if (!enc20)
+               return NULL;
+
+#undef REG_STRUCT
+#define REG_STRUCT link_enc_aux_regs
+       aux_regs_init(0),
+       aux_regs_init(1),
+       aux_regs_init(2),
+       aux_regs_init(3),
+       aux_regs_init(4);
+
+#undef REG_STRUCT
+#define REG_STRUCT link_enc_hpd_regs
+       hpd_regs_init(0),
+       hpd_regs_init(1),
+       hpd_regs_init(2),
+       hpd_regs_init(3),
+       hpd_regs_init(4);
+
+#undef REG_STRUCT
+#define REG_STRUCT link_enc_regs
+       link_regs_init(0, A),
+       link_regs_init(1, B),
+       link_regs_init(2, C),
+       link_regs_init(3, D),
+       link_regs_init(4, E);
+
+       dcn321_link_encoder_construct(enc20,
+                       enc_init_data,
+                       &link_enc_feature,
+                       &link_enc_regs[enc_init_data->transmitter],
+                       &link_enc_aux_regs[enc_init_data->channel - 1],
+                       &link_enc_hpd_regs[enc_init_data->hpd_source],
+                       &le_shift,
+                       &le_mask);
+
+       return &enc20->enc10.base;
+}
+
+static void read_dce_straps(
+       struct dc_context *ctx,
+       struct resource_straps *straps)
+{
+       generic_reg_get(ctx, ctx->dcn_reg_offsets[regDC_PINSTRAPS_BASE_IDX] + regDC_PINSTRAPS,
+               FN(DC_PINSTRAPS, DC_PINSTRAPS_AUDIO), &straps->dc_pinstraps_audio);
+
+}
+
+static struct audio *dcn321_create_audio(
+               struct dc_context *ctx, unsigned int inst)
+{
+
+#undef REG_STRUCT
+#define REG_STRUCT audio_regs
+       audio_regs_init(0),
+       audio_regs_init(1),
+       audio_regs_init(2),
+       audio_regs_init(3),
+       audio_regs_init(4);
+
+       return dce_audio_create(ctx, inst,
+                       &audio_regs[inst], &audio_shift, &audio_mask);
+}
+
+static struct vpg *dcn321_vpg_create(
+       struct dc_context *ctx,
+       uint32_t inst)
+{
+       struct dcn30_vpg *vpg3 = kzalloc(sizeof(struct dcn30_vpg), GFP_KERNEL);
+
+       if (!vpg3)
+               return NULL;
+
+#undef REG_STRUCT
+#define REG_STRUCT vpg_regs
+       vpg_regs_init(0),
+       vpg_regs_init(1),
+       vpg_regs_init(2),
+       vpg_regs_init(3),
+       vpg_regs_init(4),
+       vpg_regs_init(5),
+       vpg_regs_init(6),
+       vpg_regs_init(7),
+       vpg_regs_init(8),
+       vpg_regs_init(9);
+
+       vpg3_construct(vpg3, ctx, inst,
+                       &vpg_regs[inst],
+                       &vpg_shift,
+                       &vpg_mask);
+
+       return &vpg3->base;
+}
+
+static struct afmt *dcn321_afmt_create(
+       struct dc_context *ctx,
+       uint32_t inst)
+{
+       struct dcn30_afmt *afmt3 = kzalloc(sizeof(struct dcn30_afmt), GFP_KERNEL);
+
+       if (!afmt3)
+               return NULL;
+
+#undef REG_STRUCT
+#define REG_STRUCT afmt_regs
+       afmt_regs_init(0),
+       afmt_regs_init(1),
+       afmt_regs_init(2),
+       afmt_regs_init(3),
+       afmt_regs_init(4),
+       afmt_regs_init(5);
+
+       afmt3_construct(afmt3, ctx, inst,
+                       &afmt_regs[inst],
+                       &afmt_shift,
+                       &afmt_mask);
+
+       return &afmt3->base;
+}
+
+static struct apg *dcn321_apg_create(
+       struct dc_context *ctx,
+       uint32_t inst)
+{
+       struct dcn31_apg *apg31 = kzalloc(sizeof(struct dcn31_apg), GFP_KERNEL);
+
+       if (!apg31)
+               return NULL;
+
+#undef REG_STRUCT
+#define REG_STRUCT apg_regs
+       apg_regs_init(0),
+       apg_regs_init(1),
+       apg_regs_init(2),
+       apg_regs_init(3);
+
+       apg31_construct(apg31, ctx, inst,
+                       &apg_regs[inst],
+                       &apg_shift,
+                       &apg_mask);
+
+       return &apg31->base;
+}
+
+static struct stream_encoder *dcn321_stream_encoder_create(
+       enum engine_id eng_id,
+       struct dc_context *ctx)
+{
+       struct dcn10_stream_encoder *enc1;
+       struct vpg *vpg;
+       struct afmt *afmt;
+       int vpg_inst;
+       int afmt_inst;
+
+       /* Mapping of VPG, AFMT, DME register blocks to DIO block instance */
+       if (eng_id <= ENGINE_ID_DIGF) {
+               vpg_inst = eng_id;
+               afmt_inst = eng_id;
+       } else
+               return NULL;
+
+       enc1 = kzalloc(sizeof(struct dcn10_stream_encoder), GFP_KERNEL);
+       vpg = dcn321_vpg_create(ctx, vpg_inst);
+       afmt = dcn321_afmt_create(ctx, afmt_inst);
+
+       if (!enc1 || !vpg || !afmt) {
+               kfree(enc1);
+               kfree(vpg);
+               kfree(afmt);
+               return NULL;
+       }
+
+#undef REG_STRUCT
+#define REG_STRUCT stream_enc_regs
+       stream_enc_regs_init(0),
+       stream_enc_regs_init(1),
+       stream_enc_regs_init(2),
+       stream_enc_regs_init(3),
+       stream_enc_regs_init(4);
+
+       dcn32_dio_stream_encoder_construct(enc1, ctx, ctx->dc_bios,
+                                       eng_id, vpg, afmt,
+                                       &stream_enc_regs[eng_id],
+                                       &se_shift, &se_mask);
+
+       return &enc1->base;
+}
+
+static struct hpo_dp_stream_encoder *dcn321_hpo_dp_stream_encoder_create(
+       enum engine_id eng_id,
+       struct dc_context *ctx)
+{
+       struct dcn31_hpo_dp_stream_encoder *hpo_dp_enc31;
+       struct vpg *vpg;
+       struct apg *apg;
+       uint32_t hpo_dp_inst;
+       uint32_t vpg_inst;
+       uint32_t apg_inst;
+
+       ASSERT((eng_id >= ENGINE_ID_HPO_DP_0) && (eng_id <= ENGINE_ID_HPO_DP_3));
+       hpo_dp_inst = eng_id - ENGINE_ID_HPO_DP_0;
+
+       /* Mapping of VPG register blocks to HPO DP block instance:
+        * VPG[6] -> HPO_DP[0]
+        * VPG[7] -> HPO_DP[1]
+        * VPG[8] -> HPO_DP[2]
+        * VPG[9] -> HPO_DP[3]
+        */
+       vpg_inst = hpo_dp_inst + 6;
+
+       /* Mapping of APG register blocks to HPO DP block instance:
+        * APG[0] -> HPO_DP[0]
+        * APG[1] -> HPO_DP[1]
+        * APG[2] -> HPO_DP[2]
+        * APG[3] -> HPO_DP[3]
+        */
+       apg_inst = hpo_dp_inst;
+
+       /* allocate HPO stream encoder and create VPG sub-block */
+       hpo_dp_enc31 = kzalloc(sizeof(struct dcn31_hpo_dp_stream_encoder), GFP_KERNEL);
+       vpg = dcn321_vpg_create(ctx, vpg_inst);
+       apg = dcn321_apg_create(ctx, apg_inst);
+
+       if (!hpo_dp_enc31 || !vpg || !apg) {
+               kfree(hpo_dp_enc31);
+               kfree(vpg);
+               kfree(apg);
+               return NULL;
+       }
+
+#undef REG_STRUCT
+#define REG_STRUCT hpo_dp_stream_enc_regs
+       hpo_dp_stream_encoder_reg_init(0),
+       hpo_dp_stream_encoder_reg_init(1),
+       hpo_dp_stream_encoder_reg_init(2),
+       hpo_dp_stream_encoder_reg_init(3);
+
+       dcn31_hpo_dp_stream_encoder_construct(hpo_dp_enc31, ctx, ctx->dc_bios,
+                                       hpo_dp_inst, eng_id, vpg, apg,
+                                       &hpo_dp_stream_enc_regs[hpo_dp_inst],
+                                       &hpo_dp_se_shift, &hpo_dp_se_mask);
+
+       return &hpo_dp_enc31->base;
+}
+
+static struct hpo_dp_link_encoder *dcn321_hpo_dp_link_encoder_create(
+       uint8_t inst,
+       struct dc_context *ctx)
+{
+       struct dcn31_hpo_dp_link_encoder *hpo_dp_enc31;
+
+       /* allocate HPO link encoder */
+       hpo_dp_enc31 = kzalloc(sizeof(struct dcn31_hpo_dp_link_encoder), GFP_KERNEL);
+
+#undef REG_STRUCT
+#define REG_STRUCT hpo_dp_link_enc_regs
+       hpo_dp_link_encoder_reg_init(0),
+       hpo_dp_link_encoder_reg_init(1);
+
+       hpo_dp_link_encoder32_construct(hpo_dp_enc31, ctx, inst,
+                                       &hpo_dp_link_enc_regs[inst],
+                                       &hpo_dp_le_shift, &hpo_dp_le_mask);
+
+       return &hpo_dp_enc31->base;
+}
+
+static struct dce_hwseq *dcn321_hwseq_create(
+       struct dc_context *ctx)
+{
+       struct dce_hwseq *hws = kzalloc(sizeof(struct dce_hwseq), GFP_KERNEL);
+
+#undef REG_STRUCT
+#define REG_STRUCT hwseq_reg
+       hwseq_reg_init();
+
+       if (hws) {
+               hws->ctx = ctx;
+               hws->regs = &hwseq_reg;
+               hws->shifts = &hwseq_shift;
+               hws->masks = &hwseq_mask;
+       }
+       return hws;
+}
+static const struct resource_create_funcs res_create_funcs = {
+       .read_dce_straps = read_dce_straps,
+       .create_audio = dcn321_create_audio,
+       .create_stream_encoder = dcn321_stream_encoder_create,
+       .create_hpo_dp_stream_encoder = dcn321_hpo_dp_stream_encoder_create,
+       .create_hpo_dp_link_encoder = dcn321_hpo_dp_link_encoder_create,
+       .create_hwseq = dcn321_hwseq_create,
+};
+
+static void dcn321_resource_destruct(struct dcn321_resource_pool *pool)
+{
+       unsigned int i;
+
+       for (i = 0; i < pool->base.stream_enc_count; i++) {
+               if (pool->base.stream_enc[i] != NULL) {
+                       if (pool->base.stream_enc[i]->vpg != NULL) {
+                               kfree(DCN30_VPG_FROM_VPG(pool->base.stream_enc[i]->vpg));
+                               pool->base.stream_enc[i]->vpg = NULL;
+                       }
+                       if (pool->base.stream_enc[i]->afmt != NULL) {
+                               kfree(DCN30_AFMT_FROM_AFMT(pool->base.stream_enc[i]->afmt));
+                               pool->base.stream_enc[i]->afmt = NULL;
+                       }
+                       kfree(DCN10STRENC_FROM_STRENC(pool->base.stream_enc[i]));
+                       pool->base.stream_enc[i] = NULL;
+               }
+       }
+
+       for (i = 0; i < pool->base.hpo_dp_stream_enc_count; i++) {
+               if (pool->base.hpo_dp_stream_enc[i] != NULL) {
+                       if (pool->base.hpo_dp_stream_enc[i]->vpg != NULL) {
+                               kfree(DCN30_VPG_FROM_VPG(pool->base.hpo_dp_stream_enc[i]->vpg));
+                               pool->base.hpo_dp_stream_enc[i]->vpg = NULL;
+                       }
+                       if (pool->base.hpo_dp_stream_enc[i]->apg != NULL) {
+                               kfree(DCN31_APG_FROM_APG(pool->base.hpo_dp_stream_enc[i]->apg));
+                               pool->base.hpo_dp_stream_enc[i]->apg = NULL;
+                       }
+                       kfree(DCN3_1_HPO_DP_STREAM_ENC_FROM_HPO_STREAM_ENC(pool->base.hpo_dp_stream_enc[i]));
+                       pool->base.hpo_dp_stream_enc[i] = NULL;
+               }
+       }
+
+       for (i = 0; i < pool->base.hpo_dp_link_enc_count; i++) {
+               if (pool->base.hpo_dp_link_enc[i] != NULL) {
+                       kfree(DCN3_1_HPO_DP_LINK_ENC_FROM_HPO_LINK_ENC(pool->base.hpo_dp_link_enc[i]));
+                       pool->base.hpo_dp_link_enc[i] = NULL;
+               }
+       }
+
+       for (i = 0; i < pool->base.res_cap->num_dsc; i++) {
+               if (pool->base.dscs[i] != NULL)
+                       dcn20_dsc_destroy(&pool->base.dscs[i]);
+       }
+
+       if (pool->base.mpc != NULL) {
+               kfree(TO_DCN20_MPC(pool->base.mpc));
+               pool->base.mpc = NULL;
+       }
+       if (pool->base.hubbub != NULL) {
+               kfree(TO_DCN20_HUBBUB(pool->base.hubbub));
+               pool->base.hubbub = NULL;
+       }
+       for (i = 0; i < pool->base.pipe_count; i++) {
+               if (pool->base.dpps[i] != NULL)
+                       dcn321_dpp_destroy(&pool->base.dpps[i]);
+
+               if (pool->base.ipps[i] != NULL)
+                       pool->base.ipps[i]->funcs->ipp_destroy(&pool->base.ipps[i]);
+
+               if (pool->base.hubps[i] != NULL) {
+                       kfree(TO_DCN20_HUBP(pool->base.hubps[i]));
+                       pool->base.hubps[i] = NULL;
+               }
+
+               if (pool->base.irqs != NULL)
+                       dal_irq_service_destroy(&pool->base.irqs);
+       }
+
+       for (i = 0; i < pool->base.res_cap->num_ddc; i++) {
+               if (pool->base.engines[i] != NULL)
+                       dce110_engine_destroy(&pool->base.engines[i]);
+               if (pool->base.hw_i2cs[i] != NULL) {
+                       kfree(pool->base.hw_i2cs[i]);
+                       pool->base.hw_i2cs[i] = NULL;
+               }
+               if (pool->base.sw_i2cs[i] != NULL) {
+                       kfree(pool->base.sw_i2cs[i]);
+                       pool->base.sw_i2cs[i] = NULL;
+               }
+       }
+
+       for (i = 0; i < pool->base.res_cap->num_opp; i++) {
+               if (pool->base.opps[i] != NULL)
+                       pool->base.opps[i]->funcs->opp_destroy(&pool->base.opps[i]);
+       }
+
+       for (i = 0; i < pool->base.res_cap->num_timing_generator; i++) {
+               if (pool->base.timing_generators[i] != NULL)    {
+                       kfree(DCN10TG_FROM_TG(pool->base.timing_generators[i]));
+                       pool->base.timing_generators[i] = NULL;
+               }
+       }
+
+       for (i = 0; i < pool->base.res_cap->num_dwb; i++) {
+               if (pool->base.dwbc[i] != NULL) {
+                       kfree(TO_DCN30_DWBC(pool->base.dwbc[i]));
+                       pool->base.dwbc[i] = NULL;
+               }
+               if (pool->base.mcif_wb[i] != NULL) {
+                       kfree(TO_DCN30_MMHUBBUB(pool->base.mcif_wb[i]));
+                       pool->base.mcif_wb[i] = NULL;
+               }
+       }
+
+       for (i = 0; i < pool->base.audio_count; i++) {
+               if (pool->base.audios[i])
+                       dce_aud_destroy(&pool->base.audios[i]);
+       }
+
+       for (i = 0; i < pool->base.clk_src_count; i++) {
+               if (pool->base.clock_sources[i] != NULL) {
+                       dcn20_clock_source_destroy(&pool->base.clock_sources[i]);
+                       pool->base.clock_sources[i] = NULL;
+               }
+       }
+
+       for (i = 0; i < pool->base.res_cap->num_mpc_3dlut; i++) {
+               if (pool->base.mpc_lut[i] != NULL) {
+                       dc_3dlut_func_release(pool->base.mpc_lut[i]);
+                       pool->base.mpc_lut[i] = NULL;
+               }
+               if (pool->base.mpc_shaper[i] != NULL) {
+                       dc_transfer_func_release(pool->base.mpc_shaper[i]);
+                       pool->base.mpc_shaper[i] = NULL;
+               }
+       }
+
+       if (pool->base.dp_clock_source != NULL) {
+               dcn20_clock_source_destroy(&pool->base.dp_clock_source);
+               pool->base.dp_clock_source = NULL;
+       }
+
+       for (i = 0; i < pool->base.res_cap->num_timing_generator; i++) {
+               if (pool->base.multiple_abms[i] != NULL)
+                       dce_abm_destroy(&pool->base.multiple_abms[i]);
+       }
+
+       if (pool->base.psr != NULL)
+               dmub_psr_destroy(&pool->base.psr);
+
+       if (pool->base.dccg != NULL)
+               dcn_dccg_destroy(&pool->base.dccg);
+
+       if (pool->base.oem_device != NULL) {
+               struct dc *dc = pool->base.oem_device->ctx->dc;
+
+               dc->link_srv->destroy_ddc_service(&pool->base.oem_device);
+       }
+}
+
+
+static bool dcn321_dwbc_create(struct dc_context *ctx, struct resource_pool *pool)
+{
+       int i;
+       uint32_t dwb_count = pool->res_cap->num_dwb;
+
+       for (i = 0; i < dwb_count; i++) {
+               struct dcn30_dwbc *dwbc30 = kzalloc(sizeof(struct dcn30_dwbc),
+                                                   GFP_KERNEL);
+
+               if (!dwbc30) {
+                       dm_error("DC: failed to create dwbc30!\n");
+                       return false;
+               }
+
+#undef REG_STRUCT
+#define REG_STRUCT dwbc30_regs
+               dwbc_regs_dcn3_init(0);
+
+               dcn30_dwbc_construct(dwbc30, ctx,
+                               &dwbc30_regs[i],
+                               &dwbc30_shift,
+                               &dwbc30_mask,
+                               i);
+
+               pool->dwbc[i] = &dwbc30->base;
+       }
+       return true;
+}
+
+static bool dcn321_mmhubbub_create(struct dc_context *ctx, struct resource_pool *pool)
+{
+       int i;
+       uint32_t dwb_count = pool->res_cap->num_dwb;
+
+       for (i = 0; i < dwb_count; i++) {
+               struct dcn30_mmhubbub *mcif_wb30 = kzalloc(sizeof(struct dcn30_mmhubbub),
+                                                   GFP_KERNEL);
+
+               if (!mcif_wb30) {
+                       dm_error("DC: failed to create mcif_wb30!\n");
+                       return false;
+               }
+
+#undef REG_STRUCT
+#define REG_STRUCT mcif_wb30_regs
+               mcif_wb_regs_dcn3_init(0);
+
+               dcn32_mmhubbub_construct(mcif_wb30, ctx,
+                               &mcif_wb30_regs[i],
+                               &mcif_wb30_shift,
+                               &mcif_wb30_mask,
+                               i);
+
+               pool->mcif_wb[i] = &mcif_wb30->base;
+       }
+       return true;
+}
+
+static struct display_stream_compressor *dcn321_dsc_create(
+       struct dc_context *ctx, uint32_t inst)
+{
+       struct dcn20_dsc *dsc =
+               kzalloc(sizeof(struct dcn20_dsc), GFP_KERNEL);
+
+       if (!dsc) {
+               BREAK_TO_DEBUGGER();
+               return NULL;
+       }
+
+#undef REG_STRUCT
+#define REG_STRUCT dsc_regs
+       dsc_regsDCN20_init(0),
+       dsc_regsDCN20_init(1),
+       dsc_regsDCN20_init(2),
+       dsc_regsDCN20_init(3);
+
+       dsc2_construct(dsc, ctx, inst, &dsc_regs[inst], &dsc_shift, &dsc_mask);
+
+       dsc->max_image_width = 6016;
+
+       return &dsc->base;
+}
+
+static void dcn321_destroy_resource_pool(struct resource_pool **pool)
+{
+       struct dcn321_resource_pool *dcn321_pool = TO_DCN321_RES_POOL(*pool);
+
+       dcn321_resource_destruct(dcn321_pool);
+       kfree(dcn321_pool);
+       *pool = NULL;
+}
+
+static struct dc_cap_funcs cap_funcs = {
+       .get_dcc_compression_cap = dcn20_get_dcc_compression_cap,
+       .get_subvp_en = dcn32_subvp_in_use,
+};
+
+static void dcn321_update_bw_bounding_box(struct dc *dc, struct clk_bw_params *bw_params)
+{
+       DC_FP_START();
+       dcn321_update_bw_bounding_box_fpu(dc, bw_params);
+       DC_FP_END();
+}
+
+static struct resource_funcs dcn321_res_pool_funcs = {
+       .destroy = dcn321_destroy_resource_pool,
+       .link_enc_create = dcn321_link_encoder_create,
+       .link_enc_create_minimal = NULL,
+       .panel_cntl_create = dcn32_panel_cntl_create,
+       .validate_bandwidth = dcn32_validate_bandwidth,
+       .calculate_wm_and_dlg = dcn32_calculate_wm_and_dlg,
+       .populate_dml_pipes = dcn32_populate_dml_pipes_from_context,
+       .acquire_free_pipe_as_secondary_dpp_pipe = dcn32_acquire_free_pipe_as_secondary_dpp_pipe,
+       .acquire_free_pipe_as_secondary_opp_head = dcn32_acquire_free_pipe_as_secondary_opp_head,
+       .release_pipe = dcn20_release_pipe,
+       .add_stream_to_ctx = dcn30_add_stream_to_ctx,
+       .add_dsc_to_stream_resource = dcn20_add_dsc_to_stream_resource,
+       .remove_stream_from_ctx = dcn20_remove_stream_from_ctx,
+       .populate_dml_writeback_from_context = dcn30_populate_dml_writeback_from_context,
+       .set_mcif_arb_params = dcn30_set_mcif_arb_params,
+       .find_first_free_match_stream_enc_for_link = dcn10_find_first_free_match_stream_enc_for_link,
+       .acquire_post_bldn_3dlut = dcn32_acquire_post_bldn_3dlut,
+       .release_post_bldn_3dlut = dcn32_release_post_bldn_3dlut,
+       .update_bw_bounding_box = dcn321_update_bw_bounding_box,
+       .patch_unknown_plane_state = dcn20_patch_unknown_plane_state,
+       .update_soc_for_wm_a = dcn30_update_soc_for_wm_a,
+       .add_phantom_pipes = dcn32_add_phantom_pipes,
+       .remove_phantom_pipes = dcn32_remove_phantom_pipes,
+       .retain_phantom_pipes = dcn32_retain_phantom_pipes,
+       .save_mall_state = dcn32_save_mall_state,
+       .restore_mall_state = dcn32_restore_mall_state,
+};
+
+static uint32_t read_pipe_fuses(struct dc_context *ctx)
+{
+       uint32_t value = REG_READ(CC_DC_PIPE_DIS);
+       /* DCN321 support max 4 pipes */
+       value = value & 0xf;
+       return value;
+}
+
+
+static bool dcn321_resource_construct(
+       uint8_t num_virtual_links,
+       struct dc *dc,
+       struct dcn321_resource_pool *pool)
+{
+       int i, j;
+       struct dc_context *ctx = dc->ctx;
+       struct irq_service_init_data init_data;
+       struct ddc_service_init_data ddc_init_data = {0};
+       uint32_t pipe_fuses = 0;
+       uint32_t num_pipes  = 4;
+
+#undef REG_STRUCT
+#define REG_STRUCT bios_regs
+       bios_regs_init();
+
+#undef REG_STRUCT
+#define REG_STRUCT clk_src_regs
+       clk_src_regs_init(0, A),
+       clk_src_regs_init(1, B),
+       clk_src_regs_init(2, C),
+       clk_src_regs_init(3, D),
+       clk_src_regs_init(4, E);
+
+#undef REG_STRUCT
+#define REG_STRUCT abm_regs
+       abm_regs_init(0),
+       abm_regs_init(1),
+       abm_regs_init(2),
+       abm_regs_init(3);
+
+#undef REG_STRUCT
+#define REG_STRUCT dccg_regs
+       dccg_regs_init();
+
+
+       ctx->dc_bios->regs = &bios_regs;
+
+       pool->base.res_cap = &res_cap_dcn321;
+       /* max number of pipes for ASIC before checking for pipe fuses */
+       num_pipes  = pool->base.res_cap->num_timing_generator;
+       pipe_fuses = read_pipe_fuses(ctx);
+
+       for (i = 0; i < pool->base.res_cap->num_timing_generator; i++)
+               if (pipe_fuses & 1 << i)
+                       num_pipes--;
+
+       if (pipe_fuses & 1)
+               ASSERT(0); //Unexpected - Pipe 0 should always be fully functional!
+
+       if (pipe_fuses & CC_DC_PIPE_DIS__DC_FULL_DIS_MASK)
+               ASSERT(0); //Entire DCN is harvested!
+
+       /* within dml lib, initial value is hard coded, if ASIC pipe is fused, the
+        * value will be changed, update max_num_dpp and max_num_otg for dml.
+        */
+       dcn3_21_ip.max_num_dpp = num_pipes;
+       dcn3_21_ip.max_num_otg = num_pipes;
+
+       pool->base.funcs = &dcn321_res_pool_funcs;
+
+       /*************************************************
+        *  Resource + asic cap harcoding                *
+        *************************************************/
+       pool->base.underlay_pipe_index = NO_UNDERLAY_PIPE;
+       pool->base.timing_generator_count = num_pipes;
+       pool->base.pipe_count = num_pipes;
+       pool->base.mpcc_count = num_pipes;
+       dc->caps.max_downscale_ratio = 600;
+       dc->caps.i2c_speed_in_khz = 100;
+       dc->caps.i2c_speed_in_khz_hdcp = 100; /*1.4 w/a applied by default*/
+       /* TODO: Bring max cursor size back to 256 after subvp cursor corruption is fixed*/
+       dc->caps.max_cursor_size = 64;
+       dc->caps.min_horizontal_blanking_period = 80;
+       dc->caps.dmdata_alloc_size = 2048;
+       dc->caps.mall_size_per_mem_channel = 4;
+       dc->caps.mall_size_total = 0;
+       dc->caps.cursor_cache_size = dc->caps.max_cursor_size * dc->caps.max_cursor_size * 8;
+       dc->caps.cache_line_size = 64;
+       dc->caps.cache_num_ways = 16;
+
+       /* Calculate the available MALL space */
+       dc->caps.max_cab_allocation_bytes = dcn32_calc_num_avail_chans_for_mall(
+               dc, dc->ctx->dc_bios->vram_info.num_chans) *
+               dc->caps.mall_size_per_mem_channel * 1024 * 1024;
+       dc->caps.mall_size_total = dc->caps.max_cab_allocation_bytes;
+
+       dc->caps.subvp_fw_processing_delay_us = 15;
+       dc->caps.subvp_drr_max_vblank_margin_us = 40;
+       dc->caps.subvp_prefetch_end_to_mall_start_us = 15;
+       dc->caps.subvp_swath_height_margin_lines = 16;
+       dc->caps.subvp_pstate_allow_width_us = 20;
+       dc->caps.subvp_vertical_int_margin_us = 30;
+       dc->caps.subvp_drr_vblank_start_margin_us = 100; // 100us margin
+       dc->caps.max_slave_planes = 2;
+       dc->caps.max_slave_yuv_planes = 2;
+       dc->caps.max_slave_rgb_planes = 2;
+       dc->caps.post_blend_color_processing = true;
+       dc->caps.force_dp_tps4_for_cp2520 = true;
+       dc->caps.dp_hpo = true;
+       dc->caps.dp_hdmi21_pcon_support = true;
+       dc->caps.edp_dsc_support = true;
+       dc->caps.extended_aux_timeout_support = true;
+       dc->caps.dmcub_support = true;
+       dc->caps.max_v_total = (1 << 15) - 1;
+
+       /* Color pipeline capabilities */
+       dc->caps.color.dpp.dcn_arch = 1;
+       dc->caps.color.dpp.input_lut_shared = 0;
+       dc->caps.color.dpp.icsc = 1;
+       dc->caps.color.dpp.dgam_ram = 0; // must use gamma_corr
+       dc->caps.color.dpp.dgam_rom_caps.srgb = 1;
+       dc->caps.color.dpp.dgam_rom_caps.bt2020 = 1;
+       dc->caps.color.dpp.dgam_rom_caps.gamma2_2 = 1;
+       dc->caps.color.dpp.dgam_rom_caps.pq = 1;
+       dc->caps.color.dpp.dgam_rom_caps.hlg = 1;
+       dc->caps.color.dpp.post_csc = 1;
+       dc->caps.color.dpp.gamma_corr = 1;
+       dc->caps.color.dpp.dgam_rom_for_yuv = 0;
+
+       dc->caps.color.dpp.hw_3d_lut = 1;
+       dc->caps.color.dpp.ogam_ram = 1;
+       // no OGAM ROM on DCN2 and later ASICs
+       dc->caps.color.dpp.ogam_rom_caps.srgb = 0;
+       dc->caps.color.dpp.ogam_rom_caps.bt2020 = 0;
+       dc->caps.color.dpp.ogam_rom_caps.gamma2_2 = 0;
+       dc->caps.color.dpp.ogam_rom_caps.pq = 0;
+       dc->caps.color.dpp.ogam_rom_caps.hlg = 0;
+       dc->caps.color.dpp.ocsc = 0;
+
+       dc->caps.color.mpc.gamut_remap = 1;
+       dc->caps.color.mpc.num_3dluts = pool->base.res_cap->num_mpc_3dlut; //4, configurable to be before or after BLND in MPCC
+       dc->caps.color.mpc.ogam_ram = 1;
+       dc->caps.color.mpc.ogam_rom_caps.srgb = 0;
+       dc->caps.color.mpc.ogam_rom_caps.bt2020 = 0;
+       dc->caps.color.mpc.ogam_rom_caps.gamma2_2 = 0;
+       dc->caps.color.mpc.ogam_rom_caps.pq = 0;
+       dc->caps.color.mpc.ogam_rom_caps.hlg = 0;
+       dc->caps.color.mpc.ocsc = 1;
+
+       dc->config.dc_mode_clk_limit_support = true;
+       /* read VBIOS LTTPR caps */
+       {
+               if (ctx->dc_bios->funcs->get_lttpr_caps) {
+                       enum bp_result bp_query_result;
+                       uint8_t is_vbios_lttpr_enable = 0;
+
+                       bp_query_result = ctx->dc_bios->funcs->get_lttpr_caps(ctx->dc_bios, &is_vbios_lttpr_enable);
+                       dc->caps.vbios_lttpr_enable = (bp_query_result == BP_RESULT_OK) && !!is_vbios_lttpr_enable;
+               }
+
+               /* interop bit is implicit */
+               {
+                       dc->caps.vbios_lttpr_aware = true;
+               }
+       }
+
+       if (dc->ctx->dce_environment == DCE_ENV_PRODUCTION_DRV)
+               dc->debug = debug_defaults_drv;
+
+       // Init the vm_helper
+       if (dc->vm_helper)
+               vm_helper_init(dc->vm_helper, 16);
+
+       /*************************************************
+        *  Create resources                             *
+        *************************************************/
+
+       /* Clock Sources for Pixel Clock*/
+       pool->base.clock_sources[DCN321_CLK_SRC_PLL0] =
+                       dcn321_clock_source_create(ctx, ctx->dc_bios,
+                               CLOCK_SOURCE_COMBO_PHY_PLL0,
+                               &clk_src_regs[0], false);
+       pool->base.clock_sources[DCN321_CLK_SRC_PLL1] =
+                       dcn321_clock_source_create(ctx, ctx->dc_bios,
+                               CLOCK_SOURCE_COMBO_PHY_PLL1,
+                               &clk_src_regs[1], false);
+       pool->base.clock_sources[DCN321_CLK_SRC_PLL2] =
+                       dcn321_clock_source_create(ctx, ctx->dc_bios,
+                               CLOCK_SOURCE_COMBO_PHY_PLL2,
+                               &clk_src_regs[2], false);
+       pool->base.clock_sources[DCN321_CLK_SRC_PLL3] =
+                       dcn321_clock_source_create(ctx, ctx->dc_bios,
+                               CLOCK_SOURCE_COMBO_PHY_PLL3,
+                               &clk_src_regs[3], false);
+       pool->base.clock_sources[DCN321_CLK_SRC_PLL4] =
+                       dcn321_clock_source_create(ctx, ctx->dc_bios,
+                               CLOCK_SOURCE_COMBO_PHY_PLL4,
+                               &clk_src_regs[4], false);
+
+       pool->base.clk_src_count = DCN321_CLK_SRC_TOTAL;
+
+       /* todo: not reuse phy_pll registers */
+       pool->base.dp_clock_source =
+                       dcn321_clock_source_create(ctx, ctx->dc_bios,
+                               CLOCK_SOURCE_ID_DP_DTO,
+                               &clk_src_regs[0], true);
+
+       for (i = 0; i < pool->base.clk_src_count; i++) {
+               if (pool->base.clock_sources[i] == NULL) {
+                       dm_error("DC: failed to create clock sources!\n");
+                       BREAK_TO_DEBUGGER();
+                       goto create_fail;
+               }
+       }
+
+       /* DCCG */
+       pool->base.dccg = dccg32_create(ctx, &dccg_regs, &dccg_shift, &dccg_mask);
+       if (pool->base.dccg == NULL) {
+               dm_error("DC: failed to create dccg!\n");
+               BREAK_TO_DEBUGGER();
+               goto create_fail;
+       }
+
+       /* DML */
+       dml_init_instance(&dc->dml, &dcn3_21_soc, &dcn3_21_ip, DML_PROJECT_DCN32);
+
+       /* IRQ Service */
+       init_data.ctx = dc->ctx;
+       pool->base.irqs = dal_irq_service_dcn32_create(&init_data);
+       if (!pool->base.irqs)
+               goto create_fail;
+
+       /* HUBBUB */
+       pool->base.hubbub = dcn321_hubbub_create(ctx);
+       if (pool->base.hubbub == NULL) {
+               BREAK_TO_DEBUGGER();
+               dm_error("DC: failed to create hubbub!\n");
+               goto create_fail;
+       }
+
+       /* HUBPs, DPPs, OPPs, TGs, ABMs */
+       for (i = 0, j = 0; i < pool->base.res_cap->num_timing_generator; i++) {
+
+               /* if pipe is disabled, skip instance of HW pipe,
+                * i.e, skip ASIC register instance
+                */
+               if (pipe_fuses & 1 << i)
+                       continue;
+
+               pool->base.hubps[j] = dcn321_hubp_create(ctx, i);
+               if (pool->base.hubps[j] == NULL) {
+                       BREAK_TO_DEBUGGER();
+                       dm_error(
+                               "DC: failed to create hubps!\n");
+                       goto create_fail;
+               }
+
+               pool->base.dpps[j] = dcn321_dpp_create(ctx, i);
+               if (pool->base.dpps[j] == NULL) {
+                       BREAK_TO_DEBUGGER();
+                       dm_error(
+                               "DC: failed to create dpps!\n");
+                       goto create_fail;
+               }
+
+               pool->base.opps[j] = dcn321_opp_create(ctx, i);
+               if (pool->base.opps[j] == NULL) {
+                       BREAK_TO_DEBUGGER();
+                       dm_error(
+                               "DC: failed to create output pixel processor!\n");
+                       goto create_fail;
+               }
+
+               pool->base.timing_generators[j] = dcn321_timing_generator_create(
+                               ctx, i);
+               if (pool->base.timing_generators[j] == NULL) {
+                       BREAK_TO_DEBUGGER();
+                       dm_error("DC: failed to create tg!\n");
+                       goto create_fail;
+               }
+
+               pool->base.multiple_abms[j] = dmub_abm_create(ctx,
+                               &abm_regs[i],
+                               &abm_shift,
+                               &abm_mask);
+               if (pool->base.multiple_abms[j] == NULL) {
+                       dm_error("DC: failed to create abm for pipe %d!\n", i);
+                       BREAK_TO_DEBUGGER();
+                       goto create_fail;
+               }
+
+               /* index for resource pool arrays for next valid pipe */
+               j++;
+       }
+
+       /* PSR */
+       pool->base.psr = dmub_psr_create(ctx);
+       if (pool->base.psr == NULL) {
+               dm_error("DC: failed to create psr obj!\n");
+               BREAK_TO_DEBUGGER();
+               goto create_fail;
+       }
+
+       /* MPCCs */
+       pool->base.mpc = dcn321_mpc_create(ctx,  pool->base.res_cap->num_timing_generator, pool->base.res_cap->num_mpc_3dlut);
+       if (pool->base.mpc == NULL) {
+               BREAK_TO_DEBUGGER();
+               dm_error("DC: failed to create mpc!\n");
+               goto create_fail;
+       }
+
+       /* DSCs */
+       for (i = 0; i < pool->base.res_cap->num_dsc; i++) {
+               pool->base.dscs[i] = dcn321_dsc_create(ctx, i);
+               if (pool->base.dscs[i] == NULL) {
+                       BREAK_TO_DEBUGGER();
+                       dm_error("DC: failed to create display stream compressor %d!\n", i);
+                       goto create_fail;
+               }
+       }
+
+       /* DWB */
+       if (!dcn321_dwbc_create(ctx, &pool->base)) {
+               BREAK_TO_DEBUGGER();
+               dm_error("DC: failed to create dwbc!\n");
+               goto create_fail;
+       }
+
+       /* MMHUBBUB */
+       if (!dcn321_mmhubbub_create(ctx, &pool->base)) {
+               BREAK_TO_DEBUGGER();
+               dm_error("DC: failed to create mcif_wb!\n");
+               goto create_fail;
+       }
+
+       /* AUX and I2C */
+       for (i = 0; i < pool->base.res_cap->num_ddc; i++) {
+               pool->base.engines[i] = dcn321_aux_engine_create(ctx, i);
+               if (pool->base.engines[i] == NULL) {
+                       BREAK_TO_DEBUGGER();
+                       dm_error(
+                               "DC:failed to create aux engine!!\n");
+                       goto create_fail;
+               }
+               pool->base.hw_i2cs[i] = dcn321_i2c_hw_create(ctx, i);
+               if (pool->base.hw_i2cs[i] == NULL) {
+                       BREAK_TO_DEBUGGER();
+                       dm_error(
+                               "DC:failed to create hw i2c!!\n");
+                       goto create_fail;
+               }
+               pool->base.sw_i2cs[i] = NULL;
+       }
+
+       /* Audio, HWSeq, Stream Encoders including HPO and virtual, MPC 3D LUTs */
+       if (!resource_construct(num_virtual_links, dc, &pool->base,
+                       &res_create_funcs))
+               goto create_fail;
+
+       /* HW Sequencer init functions and Plane caps */
+       dcn32_hw_sequencer_init_functions(dc);
+
+       dc->caps.max_planes =  pool->base.pipe_count;
+
+       for (i = 0; i < dc->caps.max_planes; ++i)
+               dc->caps.planes[i] = plane_cap;
+
+       dc->cap_funcs = cap_funcs;
+
+       if (dc->ctx->dc_bios->fw_info.oem_i2c_present) {
+               ddc_init_data.ctx = dc->ctx;
+               ddc_init_data.link = NULL;
+               ddc_init_data.id.id = dc->ctx->dc_bios->fw_info.oem_i2c_obj_id;
+               ddc_init_data.id.enum_id = 0;
+               ddc_init_data.id.type = OBJECT_TYPE_GENERIC;
+               pool->base.oem_device = dc->link_srv->create_ddc_service(&ddc_init_data);
+       } else {
+               pool->base.oem_device = NULL;
+       }
+
+       dc->dml2_options.dcn_pipe_count = pool->base.pipe_count;
+       dc->dml2_options.use_native_pstate_optimization = false;
+       dc->dml2_options.use_native_soc_bb_construction = true;
+       dc->dml2_options.minimize_dispclk_using_odm = true;
+
+       dc->dml2_options.callbacks.dc = dc;
+       dc->dml2_options.callbacks.build_scaling_params = &resource_build_scaling_params;
+       dc->dml2_options.callbacks.can_support_mclk_switch_using_fw_based_vblank_stretch = &dcn30_can_support_mclk_switch_using_fw_based_vblank_stretch;
+       dc->dml2_options.callbacks.acquire_secondary_pipe_for_mpc_odm = &dc_resource_acquire_secondary_pipe_for_mpc_odm_legacy;
+       dc->dml2_options.callbacks.update_pipes_for_stream_with_slice_count = &resource_update_pipes_for_stream_with_slice_count;
+       dc->dml2_options.callbacks.update_pipes_for_plane_with_slice_count = &resource_update_pipes_for_plane_with_slice_count;
+       dc->dml2_options.callbacks.get_mpc_slice_index = &resource_get_mpc_slice_index;
+       dc->dml2_options.callbacks.get_odm_slice_index = &resource_get_odm_slice_index;
+       dc->dml2_options.callbacks.get_opp_head = &resource_get_opp_head;
+
+       dc->dml2_options.svp_pstate.callbacks.dc = dc;
+       dc->dml2_options.svp_pstate.callbacks.add_plane_to_context = &dc_add_plane_to_context;
+       dc->dml2_options.svp_pstate.callbacks.add_stream_to_ctx = &dc_add_stream_to_ctx;
+       dc->dml2_options.svp_pstate.callbacks.build_scaling_params = &resource_build_scaling_params;
+       dc->dml2_options.svp_pstate.callbacks.create_plane = &dc_create_plane_state;
+       dc->dml2_options.svp_pstate.callbacks.remove_plane_from_context = &dc_remove_plane_from_context;
+       dc->dml2_options.svp_pstate.callbacks.remove_stream_from_ctx = &dc_remove_stream_from_ctx;
+       dc->dml2_options.svp_pstate.callbacks.create_stream_for_sink = &dc_create_stream_for_sink;
+       dc->dml2_options.svp_pstate.callbacks.plane_state_release = &dc_plane_state_release;
+       dc->dml2_options.svp_pstate.callbacks.stream_release = &dc_stream_release;
+       dc->dml2_options.svp_pstate.callbacks.release_dsc = &dcn20_release_dsc;
+
+       dc->dml2_options.svp_pstate.subvp_fw_processing_delay_us = dc->caps.subvp_fw_processing_delay_us;
+       dc->dml2_options.svp_pstate.subvp_prefetch_end_to_mall_start_us = dc->caps.subvp_prefetch_end_to_mall_start_us;
+       dc->dml2_options.svp_pstate.subvp_pstate_allow_width_us = dc->caps.subvp_pstate_allow_width_us;
+       dc->dml2_options.svp_pstate.subvp_swath_height_margin_lines = dc->caps.subvp_swath_height_margin_lines;
+
+       dc->dml2_options.svp_pstate.force_disable_subvp = dc->debug.force_disable_subvp;
+       dc->dml2_options.svp_pstate.force_enable_subvp = dc->debug.force_subvp_mclk_switch;
+
+       dc->dml2_options.mall_cfg.cache_line_size_bytes = dc->caps.cache_line_size;
+       dc->dml2_options.mall_cfg.cache_num_ways = dc->caps.cache_num_ways;
+       dc->dml2_options.mall_cfg.max_cab_allocation_bytes = dc->caps.max_cab_allocation_bytes;
+       dc->dml2_options.mall_cfg.mblk_height_4bpe_pixels = DCN3_2_MBLK_HEIGHT_4BPE;
+       dc->dml2_options.mall_cfg.mblk_height_8bpe_pixels = DCN3_2_MBLK_HEIGHT_8BPE;
+       dc->dml2_options.mall_cfg.mblk_size_bytes = DCN3_2_MALL_MBLK_SIZE_BYTES;
+       dc->dml2_options.mall_cfg.mblk_width_pixels = DCN3_2_MBLK_WIDTH;
+
+       dc->dml2_options.max_segments_per_hubp = 18;
+       dc->dml2_options.det_segment_size = DCN3_2_DET_SEG_SIZE;
+
+       return true;
+
+create_fail:
+
+       dcn321_resource_destruct(pool);
+
+       return false;
+}
+
+struct resource_pool *dcn321_create_resource_pool(
+               const struct dc_init_data *init_data,
+               struct dc *dc)
+{
+       struct dcn321_resource_pool *pool =
+               kzalloc(sizeof(struct dcn321_resource_pool), GFP_KERNEL);
+
+       if (!pool)
+               return NULL;
+
+       if (dcn321_resource_construct(init_data->num_virtual_links, dc, pool))
+               return &pool->base;
+
+       BREAK_TO_DEBUGGER();
+       kfree(pool);
+       return NULL;
+}
diff --git a/drivers/gpu/drm/amd/display/dc/resource/dcn321/dcn321_resource.h b/drivers/gpu/drm/amd/display/dc/resource/dcn321/dcn321_resource.h
new file mode 100644 (file)
index 0000000..82cbf00
--- /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
+ *
+ */
+
+#ifndef _DCN321_RESOURCE_H_
+#define _DCN321_RESOURCE_H_
+
+#include "core_types.h"
+
+#define TO_DCN321_RES_POOL(pool)\
+       container_of(pool, struct dcn321_resource_pool, base)
+
+extern struct _vcs_dpi_ip_params_st dcn3_21_ip;
+extern struct _vcs_dpi_soc_bounding_box_st dcn3_21_soc;
+
+struct dcn321_resource_pool {
+       struct resource_pool base;
+};
+
+struct resource_pool *dcn321_create_resource_pool(
+               const struct dc_init_data *init_data,
+               struct dc *dc);
+
+#endif /* _DCN321_RESOURCE_H_ */
diff --git a/drivers/gpu/drm/amd/display/dc/resource/dcn35/dcn35_resource.c b/drivers/gpu/drm/amd/display/dc/resource/dcn35/dcn35_resource.c
new file mode 100644 (file)
index 0000000..a4027bf
--- /dev/null
@@ -0,0 +1,2141 @@
+/* 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 "dm_services.h"
+#include "dc.h"
+
+#include "dcn31/dcn31_init.h"
+#include "dcn35/dcn35_init.h"
+
+#include "resource.h"
+#include "include/irq_service_interface.h"
+#include "dcn35_resource.h"
+#include "dml2/dml2_wrapper.h"
+
+#include "dcn20/dcn20_resource.h"
+#include "dcn30/dcn30_resource.h"
+#include "dcn31/dcn31_resource.h"
+#include "dcn32/dcn32_resource.h"
+
+#include "dcn10/dcn10_ipp.h"
+#include "dcn30/dcn30_hubbub.h"
+#include "dcn31/dcn31_hubbub.h"
+#include "dcn35/dcn35_hubbub.h"
+#include "dcn32/dcn32_mpc.h"
+#include "dcn35/dcn35_hubp.h"
+#include "irq/dcn35/irq_service_dcn35.h"
+#include "dcn35/dcn35_dpp.h"
+#include "dcn35/dcn35_optc.h"
+#include "dcn20/dcn20_hwseq.h"
+#include "dcn30/dcn30_hwseq.h"
+#include "dce110/dce110_hwseq.h"
+#include "dcn35/dcn35_opp.h"
+#include "dcn35/dcn35_dsc.h"
+#include "dcn30/dcn30_vpg.h"
+#include "dcn30/dcn30_afmt.h"
+#include "dcn31/dcn31_dio_link_encoder.h"
+#include "dcn35/dcn35_dio_stream_encoder.h"
+#include "dcn31/dcn31_hpo_dp_stream_encoder.h"
+#include "dcn31/dcn31_hpo_dp_link_encoder.h"
+#include "dcn32/dcn32_hpo_dp_link_encoder.h"
+#include "link.h"
+#include "dcn31/dcn31_apg.h"
+#include "dcn32/dcn32_dio_link_encoder.h"
+#include "dcn31/dcn31_vpg.h"
+#include "dcn31/dcn31_afmt.h"
+#include "dce/dce_clock_source.h"
+#include "dce/dce_audio.h"
+#include "dce/dce_hwseq.h"
+#include "clk_mgr.h"
+#include "virtual/virtual_stream_encoder.h"
+#include "dce110/dce110_resource.h"
+#include "dml/display_mode_vba.h"
+#include "dcn35/dcn35_dccg.h"
+#include "dcn35/dcn35_pg_cntl.h"
+#include "dcn10/dcn10_resource.h"
+#include "dcn31/dcn31_panel_cntl.h"
+#include "dcn35/dcn35_hwseq.h"
+#include "dcn35/dcn35_dio_link_encoder.h"
+#include "dml/dcn31/dcn31_fpu.h" /*todo*/
+#include "dml/dcn35/dcn35_fpu.h"
+#include "dcn35/dcn35_dwb.h"
+#include "dcn35/dcn35_mmhubbub.h"
+
+#include "dcn/dcn_3_5_0_offset.h"
+#include "dcn/dcn_3_5_0_sh_mask.h"
+#include "nbio/nbio_7_11_0_offset.h"
+#include "mmhub/mmhub_3_3_0_offset.h"
+#include "mmhub/mmhub_3_3_0_sh_mask.h"
+
+#define DSCC0_DSCC_CONFIG0__ICH_RESET_AT_END_OF_LINE__SHIFT                   0x0
+#define DSCC0_DSCC_CONFIG0__ICH_RESET_AT_END_OF_LINE_MASK                     0x0000000FL
+
+#include "reg_helper.h"
+#include "dce/dmub_abm.h"
+#include "dce/dmub_psr.h"
+#include "dce/dce_aux.h"
+#include "dce/dce_i2c.h"
+#include "dml/dcn31/display_mode_vba_31.h" /*temp*/
+#include "vm_helper.h"
+#include "dcn20/dcn20_vmid.h"
+
+#include "link_enc_cfg.h"
+#define DC_LOGGER_INIT(logger)
+
+enum dcn35_clk_src_array_id {
+       DCN35_CLK_SRC_PLL0,
+       DCN35_CLK_SRC_PLL1,
+       DCN35_CLK_SRC_PLL2,
+       DCN35_CLK_SRC_PLL3,
+       DCN35_CLK_SRC_PLL4,
+       DCN35_CLK_SRC_TOTAL
+};
+
+/* begin *********************
+ * macros to expend register list macro defined in HW object header file
+ */
+
+/* DCN */
+/* TODO awful hack. fixup dcn20_dwb.h */
+#undef BASE_INNER
+#define BASE_INNER(seg) ctx->dcn_reg_offsets[seg]
+
+#define BASE(seg) BASE_INNER(seg)
+
+#define SR(reg_name)\
+               REG_STRUCT.reg_name = BASE(reg ## reg_name ## _BASE_IDX) +  \
+                                       reg ## reg_name
+
+#define SR_ARR(reg_name, id) \
+       REG_STRUCT[id].reg_name = BASE(reg##reg_name##_BASE_IDX) + reg##reg_name
+
+#define SR_ARR_INIT(reg_name, id, value) \
+       REG_STRUCT[id].reg_name = value
+
+#define SRI(reg_name, block, id)\
+       REG_STRUCT.reg_name = BASE(reg ## block ## id ## _ ## reg_name ## _BASE_IDX) + \
+                                       reg ## block ## id ## _ ## reg_name
+
+#define SRI_ARR(reg_name, block, id)\
+       REG_STRUCT[id].reg_name = BASE(reg ## block ## id ## _ ## reg_name ## _BASE_IDX) + \
+               reg ## block ## id ## _ ## reg_name
+
+#define SR_ARR_I2C(reg_name, id) \
+       REG_STRUCT[id-1].reg_name = BASE(reg##reg_name##_BASE_IDX) + reg##reg_name
+
+#define SRI_ARR_I2C(reg_name, block, id)\
+       REG_STRUCT[id-1].reg_name = BASE(reg ## block ## id ## _ ## reg_name ## _BASE_IDX) + \
+               reg ## block ## id ## _ ## reg_name
+
+#define SRI_ARR_ALPHABET(reg_name, block, index, id)\
+       REG_STRUCT[index].reg_name = BASE(reg ## block ## id ## _ ## reg_name ## _BASE_IDX) + \
+               reg ## block ## id ## _ ## reg_name
+
+#define SRI2(reg_name, block, id)\
+       .reg_name = BASE(reg ## reg_name ## _BASE_IDX) + \
+                                       reg ## reg_name
+
+#define SRI2_ARR(reg_name, block, id)\
+       REG_STRUCT[id].reg_name = BASE(reg ## reg_name ## _BASE_IDX) +  \
+               reg ## reg_name
+
+#define SRIR(var_name, reg_name, block, id)\
+       .var_name = BASE(reg ## block ## id ## _ ## reg_name ## _BASE_IDX) + \
+                                       reg ## block ## id ## _ ## reg_name
+
+#define SRII(reg_name, block, id)\
+       REG_STRUCT.reg_name[id] = BASE(reg ## block ## id ## _ ## reg_name ## _BASE_IDX) + \
+                                       reg ## block ## id ## _ ## reg_name
+
+#define SRII_ARR_2(reg_name, block, id, inst)\
+       REG_STRUCT[inst].reg_name[id] = BASE(reg ## block ## id ## _ ## reg_name ## _BASE_IDX) + \
+               reg ## block ## id ## _ ## reg_name
+
+#define SRII_MPC_RMU(reg_name, block, id)\
+       .RMU##_##reg_name[id] = BASE(reg ## block ## id ## _ ## reg_name ## _BASE_IDX) + \
+                                       reg ## block ## id ## _ ## reg_name
+
+#define SRII_DWB(reg_name, temp_name, block, id)\
+       REG_STRUCT.reg_name[id] = BASE(reg ## block ## id ## _ ## temp_name ## _BASE_IDX) + \
+               reg ## block ## id ## _ ## temp_name
+
+#define SF_DWB2(reg_name, block, id, field_name, post_fix) \
+       .field_name = reg_name ## __ ## field_name ## post_fix
+
+#define DCCG_SRII(reg_name, block, id)\
+       REG_STRUCT.block ## _ ## reg_name[id] = BASE(reg ## block ## id ## _ ## reg_name ## _BASE_IDX) + \
+               reg ## block ## id ## _ ## reg_name
+
+#define VUPDATE_SRII(reg_name, block, id)\
+       REG_STRUCT.reg_name[id] = BASE(reg ## reg_name ## _ ## block ## id ## _BASE_IDX) + \
+               reg ## reg_name ## _ ## block ## id
+
+/* NBIO */
+#define NBIO_BASE_INNER(seg) ctx->nbio_reg_offsets[seg]
+
+#define NBIO_BASE(seg) \
+       NBIO_BASE_INNER(seg)
+
+#define NBIO_SR(reg_name)\
+       REG_STRUCT.reg_name = NBIO_BASE(regBIF_BX2_ ## reg_name ## _BASE_IDX) + \
+                               regBIF_BX2_ ## reg_name
+
+#define NBIO_SR_ARR(reg_name, id)\
+       REG_STRUCT[id].reg_name = NBIO_BASE(regBIF_BX2_ ## reg_name ## _BASE_IDX) + \
+               regBIF_BX2_ ## reg_name
+
+#define bios_regs_init() \
+               ( \
+               NBIO_SR(BIOS_SCRATCH_3),\
+               NBIO_SR(BIOS_SCRATCH_6)\
+               )
+
+static struct bios_registers bios_regs;
+
+#define clk_src_regs_init(index, pllid)\
+       CS_COMMON_REG_LIST_DCN3_0_RI(index, pllid)
+
+static struct dce110_clk_src_regs clk_src_regs[5];
+
+static const struct dce110_clk_src_shift cs_shift = {
+               CS_COMMON_MASK_SH_LIST_DCN3_1_4(__SHIFT)
+};
+
+static const struct dce110_clk_src_mask cs_mask = {
+               CS_COMMON_MASK_SH_LIST_DCN3_1_4(_MASK)
+};
+
+#define abm_regs_init(id)\
+               ABM_DCN32_REG_LIST_RI(id)
+
+static struct dce_abm_registers abm_regs[4];
+
+static const struct dce_abm_shift abm_shift = {
+               ABM_MASK_SH_LIST_DCN35(__SHIFT)
+};
+
+static const struct dce_abm_mask abm_mask = {
+               ABM_MASK_SH_LIST_DCN35(_MASK)
+};
+
+#define audio_regs_init(id)\
+               AUD_COMMON_REG_LIST_RI(id)
+
+static struct dce_audio_registers audio_regs[7];
+
+
+#define DCE120_AUD_COMMON_MASK_SH_LIST(mask_sh)\
+               SF(AZF0ENDPOINT0_AZALIA_F0_CODEC_ENDPOINT_INDEX, AZALIA_ENDPOINT_REG_INDEX, mask_sh),\
+               SF(AZF0ENDPOINT0_AZALIA_F0_CODEC_ENDPOINT_DATA, AZALIA_ENDPOINT_REG_DATA, mask_sh),\
+               AUD_COMMON_MASK_SH_LIST_BASE(mask_sh)
+
+static const struct dce_audio_shift audio_shift = {
+               DCE120_AUD_COMMON_MASK_SH_LIST(__SHIFT)
+};
+
+static const struct dce_audio_mask audio_mask = {
+               DCE120_AUD_COMMON_MASK_SH_LIST(_MASK)
+};
+
+#define vpg_regs_init(id)\
+       VPG_DCN31_REG_LIST_RI(id)
+
+static struct dcn31_vpg_registers vpg_regs[10];
+
+static const struct dcn31_vpg_shift vpg_shift = {
+       DCN31_VPG_MASK_SH_LIST(__SHIFT)
+};
+
+static const struct dcn31_vpg_mask vpg_mask = {
+       DCN31_VPG_MASK_SH_LIST(_MASK)
+};
+
+#define afmt_regs_init(id)\
+       AFMT_DCN31_REG_LIST_RI(id)
+
+static struct dcn31_afmt_registers afmt_regs[6];
+
+static const struct dcn31_afmt_shift afmt_shift = {
+       DCN31_AFMT_MASK_SH_LIST(__SHIFT)
+};
+
+static const struct dcn31_afmt_mask afmt_mask = {
+       DCN31_AFMT_MASK_SH_LIST(_MASK)
+};
+
+#define apg_regs_init(id)\
+       APG_DCN31_REG_LIST_RI(id)
+
+static struct dcn31_apg_registers apg_regs[4];
+
+static const struct dcn31_apg_shift apg_shift = {
+       DCN31_APG_MASK_SH_LIST(__SHIFT)
+};
+
+static const struct dcn31_apg_mask apg_mask = {
+       DCN31_APG_MASK_SH_LIST(_MASK)
+};
+
+#define stream_enc_regs_init(id)\
+       SE_DCN35_REG_LIST_RI(id)
+
+static struct dcn10_stream_enc_registers stream_enc_regs[5];
+
+static const struct dcn10_stream_encoder_shift se_shift = {
+               SE_COMMON_MASK_SH_LIST_DCN35(__SHIFT)
+};
+
+static const struct dcn10_stream_encoder_mask se_mask = {
+               SE_COMMON_MASK_SH_LIST_DCN35(_MASK)
+};
+
+#define aux_regs_init(id)\
+       DCN2_AUX_REG_LIST_RI(id)
+
+static struct dcn10_link_enc_aux_registers link_enc_aux_regs[5];
+
+#define hpd_regs_init(id)\
+       HPD_REG_LIST_RI(id)
+
+static struct dcn10_link_enc_hpd_registers link_enc_hpd_regs[5];
+
+
+static const struct dce110_aux_registers_shift aux_shift = {
+       DCN_AUX_MASK_SH_LIST(__SHIFT)
+};
+
+static const struct dce110_aux_registers_mask aux_mask = {
+       DCN_AUX_MASK_SH_LIST(_MASK)
+};
+
+#define link_regs_init(id, phyid)\
+       ( \
+       LE_DCN35_REG_LIST_RI(id), \
+       UNIPHY_DCN2_REG_LIST_RI(id, phyid)\
+       )
+
+static struct dcn10_link_enc_registers link_enc_regs[5];
+
+static const struct dcn10_link_enc_shift le_shift = {
+       LINK_ENCODER_MASK_SH_LIST_DCN35(__SHIFT), \
+       //DPCS_DCN31_MASK_SH_LIST(__SHIFT)
+};
+
+static const struct dcn10_link_enc_mask le_mask = {
+       LINK_ENCODER_MASK_SH_LIST_DCN35(_MASK), \
+       //DPCS_DCN31_MASK_SH_LIST(_MASK)
+};
+
+#define hpo_dp_stream_encoder_reg_init(id)\
+       DCN3_1_HPO_DP_STREAM_ENC_REG_LIST_RI(id)
+
+static struct dcn31_hpo_dp_stream_encoder_registers hpo_dp_stream_enc_regs[4];
+
+static const struct dcn31_hpo_dp_stream_encoder_shift hpo_dp_se_shift = {
+       DCN3_1_HPO_DP_STREAM_ENC_MASK_SH_LIST(__SHIFT)
+};
+
+static const struct dcn31_hpo_dp_stream_encoder_mask hpo_dp_se_mask = {
+       DCN3_1_HPO_DP_STREAM_ENC_MASK_SH_LIST(_MASK)
+};
+
+#define hpo_dp_link_encoder_reg_init(id)\
+       DCN3_1_HPO_DP_LINK_ENC_REG_LIST_RI(id)
+       /*DCN3_1_RDPCSTX_REG_LIST(0),*/
+       /*DCN3_1_RDPCSTX_REG_LIST(1),*/
+       /*DCN3_1_RDPCSTX_REG_LIST(2),*/
+       /*DCN3_1_RDPCSTX_REG_LIST(3),*/
+
+static struct dcn31_hpo_dp_link_encoder_registers hpo_dp_link_enc_regs[2];
+
+static const struct dcn31_hpo_dp_link_encoder_shift hpo_dp_le_shift = {
+       DCN3_1_HPO_DP_LINK_ENC_COMMON_MASK_SH_LIST(__SHIFT)
+};
+
+static const struct dcn31_hpo_dp_link_encoder_mask hpo_dp_le_mask = {
+       DCN3_1_HPO_DP_LINK_ENC_COMMON_MASK_SH_LIST(_MASK)
+};
+
+#define dpp_regs_init(id)\
+       DPP_REG_LIST_DCN35_RI(id)
+
+static struct dcn3_dpp_registers dpp_regs[4];
+
+static const struct dcn35_dpp_shift tf_shift = {
+               DPP_REG_LIST_SH_MASK_DCN35(__SHIFT)
+};
+
+static const struct dcn35_dpp_mask tf_mask = {
+               DPP_REG_LIST_SH_MASK_DCN35(_MASK)
+};
+
+#define opp_regs_init(id)\
+       OPP_REG_LIST_DCN35_RI(id)
+
+static struct dcn35_opp_registers opp_regs[4];
+
+static const struct dcn35_opp_shift opp_shift = {
+       OPP_MASK_SH_LIST_DCN35(__SHIFT)
+};
+
+static const struct dcn35_opp_mask opp_mask = {
+       OPP_MASK_SH_LIST_DCN35(_MASK)
+};
+
+#define aux_engine_regs_init(id)\
+       ( \
+       AUX_COMMON_REG_LIST0_RI(id), \
+       SR_ARR_INIT(AUXN_IMPCAL, id, 0), \
+       SR_ARR_INIT(AUXP_IMPCAL, id, 0), \
+       SR_ARR_INIT(AUX_RESET_MASK, id, DP_AUX0_AUX_CONTROL__AUX_RESET_MASK) \
+       )
+
+static struct dce110_aux_registers aux_engine_regs[5];
+
+#define dwbc_regs_dcn3_init(id)\
+       DWBC_COMMON_REG_LIST_DCN30_RI(id)
+
+static struct dcn30_dwbc_registers dwbc35_regs[1];
+
+static const struct dcn35_dwbc_shift dwbc35_shift = {
+       DWBC_COMMON_MASK_SH_LIST_DCN35(__SHIFT)
+};
+
+static const struct dcn35_dwbc_mask dwbc35_mask = {
+       DWBC_COMMON_MASK_SH_LIST_DCN35(_MASK)
+};
+
+#define mcif_wb_regs_dcn3_init(id)\
+       MCIF_WB_COMMON_REG_LIST_DCN3_5_RI(id)
+
+static struct dcn35_mmhubbub_registers mcif_wb35_regs[1];
+
+static const struct dcn35_mmhubbub_shift mcif_wb35_shift = {
+       MCIF_WB_COMMON_MASK_SH_LIST_DCN3_5(__SHIFT)
+};
+
+static const struct dcn35_mmhubbub_mask mcif_wb35_mask = {
+       MCIF_WB_COMMON_MASK_SH_LIST_DCN3_5(_MASK)
+};
+
+#define dsc_regsDCN35_init(id)\
+       DSC_REG_LIST_DCN20_RI(id)
+
+static struct dcn20_dsc_registers dsc_regs[4];
+
+static const struct dcn35_dsc_shift dsc_shift = {
+       DSC_REG_LIST_SH_MASK_DCN35(__SHIFT)
+};
+
+static const struct dcn35_dsc_mask dsc_mask = {
+       DSC_REG_LIST_SH_MASK_DCN35(_MASK)
+};
+
+static struct dcn30_mpc_registers mpc_regs;
+
+#define dcn_mpc_regs_init() \
+       MPC_REG_LIST_DCN3_2_RI(0),\
+       MPC_REG_LIST_DCN3_2_RI(1),\
+       MPC_REG_LIST_DCN3_2_RI(2),\
+       MPC_REG_LIST_DCN3_2_RI(3),\
+       MPC_OUT_MUX_REG_LIST_DCN3_0_RI(0),\
+       MPC_OUT_MUX_REG_LIST_DCN3_0_RI(1),\
+       MPC_OUT_MUX_REG_LIST_DCN3_0_RI(2),\
+       MPC_OUT_MUX_REG_LIST_DCN3_0_RI(3),\
+       MPC_DWB_MUX_REG_LIST_DCN3_0_RI(0)
+
+static const struct dcn30_mpc_shift mpc_shift = {
+       MPC_COMMON_MASK_SH_LIST_DCN32(__SHIFT)
+};
+
+static const struct dcn30_mpc_mask mpc_mask = {
+       MPC_COMMON_MASK_SH_LIST_DCN32(_MASK)
+};
+
+#define optc_regs_init(id)\
+       OPTC_COMMON_REG_LIST_DCN3_5_RI(id)
+
+static struct dcn_optc_registers optc_regs[4];
+
+static const struct dcn_optc_shift optc_shift = {
+       OPTC_COMMON_MASK_SH_LIST_DCN3_5(__SHIFT)
+};
+
+static const struct dcn_optc_mask optc_mask = {
+       OPTC_COMMON_MASK_SH_LIST_DCN3_5(_MASK)
+};
+
+#define hubp_regs_init(id)\
+       HUBP_REG_LIST_DCN30_RI(id)
+
+static struct dcn_hubp2_registers hubp_regs[4];
+
+
+static const struct dcn35_hubp2_shift hubp_shift = {
+               HUBP_MASK_SH_LIST_DCN35(__SHIFT)
+};
+
+static const struct dcn35_hubp2_mask hubp_mask = {
+               HUBP_MASK_SH_LIST_DCN35(_MASK)
+};
+
+static struct dcn_hubbub_registers hubbub_reg;
+
+#define hubbub_reg_init()\
+               HUBBUB_REG_LIST_DCN35(0)
+
+static const struct dcn_hubbub_shift hubbub_shift = {
+               HUBBUB_MASK_SH_LIST_DCN35(__SHIFT)
+};
+
+static const struct dcn_hubbub_mask hubbub_mask = {
+               HUBBUB_MASK_SH_LIST_DCN35(_MASK)
+};
+
+static struct dccg_registers dccg_regs;
+
+#define dccg_regs_init()\
+       DCCG_REG_LIST_DCN35()
+
+static const struct dccg_shift dccg_shift = {
+               DCCG_MASK_SH_LIST_DCN35(__SHIFT)
+};
+
+static const struct dccg_mask dccg_mask = {
+               DCCG_MASK_SH_LIST_DCN35(_MASK)
+};
+
+static struct pg_cntl_registers pg_cntl_regs;
+
+#define pg_cntl_dcn35_regs_init() \
+       PG_CNTL_REG_LIST_DCN35()
+
+static const struct pg_cntl_shift pg_cntl_shift = {
+               PG_CNTL_MASK_SH_LIST_DCN35(__SHIFT)
+};
+
+static const struct pg_cntl_mask pg_cntl_mask = {
+               PG_CNTL_MASK_SH_LIST_DCN35(_MASK)
+};
+
+#define SRII2(reg_name_pre, reg_name_post, id)\
+       .reg_name_pre ## _ ##  reg_name_post[id] = BASE(reg ## reg_name_pre \
+                       ## id ## _ ## reg_name_post ## _BASE_IDX) + \
+                       reg ## reg_name_pre ## id ## _ ## reg_name_post
+
+static struct dce_hwseq_registers hwseq_reg;
+
+#define hwseq_reg_init()\
+       HWSEQ_DCN35_REG_LIST()
+
+#define HWSEQ_DCN35_MASK_SH_LIST(mask_sh)\
+       HWSEQ_DCN_MASK_SH_LIST(mask_sh), \
+       HWS_SF(, DCHUBBUB_GLOBAL_TIMER_CNTL, DCHUBBUB_GLOBAL_TIMER_REFDIV, mask_sh), \
+       HWS_SF(, DCHUBBUB_ARB_HOSTVM_CNTL, DISABLE_HOSTVM_FORCE_ALLOW_PSTATE, mask_sh), \
+       HWS_SF(, DOMAIN0_PG_CONFIG, DOMAIN_POWER_FORCEON, mask_sh), \
+       HWS_SF(, DOMAIN0_PG_CONFIG, DOMAIN_POWER_GATE, mask_sh), \
+       HWS_SF(, DOMAIN1_PG_CONFIG, DOMAIN_POWER_FORCEON, mask_sh), \
+       HWS_SF(, DOMAIN1_PG_CONFIG, DOMAIN_POWER_GATE, mask_sh), \
+       HWS_SF(, DOMAIN2_PG_CONFIG, DOMAIN_POWER_FORCEON, mask_sh), \
+       HWS_SF(, DOMAIN2_PG_CONFIG, DOMAIN_POWER_GATE, mask_sh), \
+       HWS_SF(, DOMAIN3_PG_CONFIG, DOMAIN_POWER_FORCEON, mask_sh), \
+       HWS_SF(, DOMAIN3_PG_CONFIG, DOMAIN_POWER_GATE, mask_sh), \
+       HWS_SF(, DOMAIN16_PG_CONFIG, DOMAIN_POWER_FORCEON, mask_sh), \
+       HWS_SF(, DOMAIN16_PG_CONFIG, DOMAIN_POWER_GATE, mask_sh), \
+       HWS_SF(, DOMAIN17_PG_CONFIG, DOMAIN_POWER_FORCEON, mask_sh), \
+       HWS_SF(, DOMAIN17_PG_CONFIG, DOMAIN_POWER_GATE, mask_sh), \
+       HWS_SF(, DOMAIN18_PG_CONFIG, DOMAIN_POWER_FORCEON, mask_sh), \
+       HWS_SF(, DOMAIN18_PG_CONFIG, DOMAIN_POWER_GATE, mask_sh), \
+       HWS_SF(, DOMAIN19_PG_CONFIG, DOMAIN_POWER_FORCEON, mask_sh), \
+       HWS_SF(, DOMAIN19_PG_CONFIG, DOMAIN_POWER_GATE, mask_sh), \
+       HWS_SF(, DOMAIN22_PG_CONFIG, DOMAIN_POWER_FORCEON, mask_sh), \
+       HWS_SF(, DOMAIN22_PG_CONFIG, DOMAIN_POWER_GATE, mask_sh), \
+       HWS_SF(, DOMAIN23_PG_CONFIG, DOMAIN_POWER_FORCEON, mask_sh), \
+       HWS_SF(, DOMAIN23_PG_CONFIG, DOMAIN_POWER_GATE, mask_sh), \
+       HWS_SF(, DOMAIN24_PG_CONFIG, DOMAIN_POWER_FORCEON, mask_sh), \
+       HWS_SF(, DOMAIN24_PG_CONFIG, DOMAIN_POWER_GATE, mask_sh), \
+       HWS_SF(, DOMAIN25_PG_CONFIG, DOMAIN_POWER_FORCEON, mask_sh), \
+       HWS_SF(, DOMAIN25_PG_CONFIG, DOMAIN_POWER_GATE, mask_sh), \
+       HWS_SF(, DOMAIN0_PG_STATUS, DOMAIN_PGFSM_PWR_STATUS, mask_sh), \
+       HWS_SF(, DOMAIN1_PG_STATUS, DOMAIN_PGFSM_PWR_STATUS, mask_sh), \
+       HWS_SF(, DOMAIN2_PG_STATUS, DOMAIN_PGFSM_PWR_STATUS, mask_sh), \
+       HWS_SF(, DOMAIN3_PG_STATUS, DOMAIN_PGFSM_PWR_STATUS, mask_sh), \
+       HWS_SF(, DOMAIN16_PG_STATUS, DOMAIN_PGFSM_PWR_STATUS, mask_sh), \
+       HWS_SF(, DOMAIN17_PG_STATUS, DOMAIN_PGFSM_PWR_STATUS, mask_sh), \
+       HWS_SF(, DOMAIN18_PG_STATUS, DOMAIN_PGFSM_PWR_STATUS, mask_sh), \
+       HWS_SF(, DOMAIN19_PG_STATUS, DOMAIN_PGFSM_PWR_STATUS, mask_sh), \
+       HWS_SF(, DOMAIN22_PG_STATUS, DOMAIN_PGFSM_PWR_STATUS, mask_sh), \
+       HWS_SF(, DOMAIN23_PG_STATUS, DOMAIN_PGFSM_PWR_STATUS, mask_sh), \
+       HWS_SF(, DOMAIN24_PG_STATUS, DOMAIN_PGFSM_PWR_STATUS, mask_sh), \
+       HWS_SF(, DOMAIN25_PG_STATUS, DOMAIN_PGFSM_PWR_STATUS, mask_sh), \
+       HWS_SF(, DC_IP_REQUEST_CNTL, IP_REQUEST_EN, mask_sh), \
+       HWS_SF(, AZALIA_AUDIO_DTO, AZALIA_AUDIO_DTO_MODULE, mask_sh), \
+       HWS_SF(, HPO_TOP_CLOCK_CONTROL, HPO_HDMISTREAMCLK_G_GATE_DIS, mask_sh), \
+       HWS_SF(, ODM_MEM_PWR_CTRL3, ODM_MEM_UNASSIGNED_PWR_MODE, mask_sh), \
+       HWS_SF(, ODM_MEM_PWR_CTRL3, ODM_MEM_VBLANK_PWR_MODE, mask_sh), \
+       HWS_SF(, DIO_MEM_PWR_CTRL, I2C_LIGHT_SLEEP_FORCE, mask_sh), \
+       HWS_SF(, HPO_TOP_HW_CONTROL, HPO_IO_EN, mask_sh),\
+       HWS_SF(, DMU_CLK_CNTL, DISPCLK_R_DMU_GATE_DIS, mask_sh),\
+       HWS_SF(, DMU_CLK_CNTL, DISPCLK_G_RBBMIF_GATE_DIS, mask_sh),\
+       HWS_SF(, DMU_CLK_CNTL, RBBMIF_FGCG_REP_DIS, mask_sh),\
+       HWS_SF(, DMU_CLK_CNTL, DPREFCLK_ALLOW_DS_CLKSTOP, mask_sh),\
+       HWS_SF(, DMU_CLK_CNTL, DISPCLK_ALLOW_DS_CLKSTOP, mask_sh),\
+       HWS_SF(, DMU_CLK_CNTL, DPPCLK_ALLOW_DS_CLKSTOP, mask_sh),\
+       HWS_SF(, DMU_CLK_CNTL, DTBCLK_ALLOW_DS_CLKSTOP, mask_sh),\
+       HWS_SF(, DMU_CLK_CNTL, DCFCLK_ALLOW_DS_CLKSTOP, mask_sh),\
+       HWS_SF(, DMU_CLK_CNTL, DPIACLK_ALLOW_DS_CLKSTOP, mask_sh),\
+       HWS_SF(, DMU_CLK_CNTL, LONO_FGCG_REP_DIS, mask_sh),\
+       HWS_SF(, DMU_CLK_CNTL, LONO_DISPCLK_GATE_DISABLE, mask_sh),\
+       HWS_SF(, DMU_CLK_CNTL, LONO_SOCCLK_GATE_DISABLE, mask_sh),\
+       HWS_SF(, DMU_CLK_CNTL, LONO_DMCUBCLK_GATE_DISABLE, mask_sh),\
+       HWS_SF(, DCCG_GATE_DISABLE_CNTL2, SYMCLKA_FE_GATE_DISABLE, mask_sh), \
+       HWS_SF(, DCCG_GATE_DISABLE_CNTL2, SYMCLKB_FE_GATE_DISABLE, mask_sh), \
+       HWS_SF(, DCCG_GATE_DISABLE_CNTL2, SYMCLKC_FE_GATE_DISABLE, mask_sh), \
+       HWS_SF(, DCCG_GATE_DISABLE_CNTL2, SYMCLKD_FE_GATE_DISABLE, mask_sh), \
+       HWS_SF(, DCCG_GATE_DISABLE_CNTL2, SYMCLKE_FE_GATE_DISABLE, mask_sh), \
+       HWS_SF(, DCCG_GATE_DISABLE_CNTL2, HDMICHARCLK0_GATE_DISABLE, mask_sh), \
+       HWS_SF(, DCCG_GATE_DISABLE_CNTL2, SYMCLKA_GATE_DISABLE, mask_sh), \
+       HWS_SF(, DCCG_GATE_DISABLE_CNTL2, SYMCLKB_GATE_DISABLE, mask_sh), \
+       HWS_SF(, DCCG_GATE_DISABLE_CNTL2, SYMCLKC_GATE_DISABLE, mask_sh), \
+       HWS_SF(, DCCG_GATE_DISABLE_CNTL2, SYMCLKD_GATE_DISABLE, mask_sh), \
+       HWS_SF(, DCCG_GATE_DISABLE_CNTL2, SYMCLKE_GATE_DISABLE, mask_sh), \
+       HWS_SF(, DCCG_GATE_DISABLE_CNTL2, PHYASYMCLK_ROOT_GATE_DISABLE, mask_sh), \
+       HWS_SF(, DCCG_GATE_DISABLE_CNTL2, PHYBSYMCLK_ROOT_GATE_DISABLE, mask_sh), \
+       HWS_SF(, DCCG_GATE_DISABLE_CNTL2, PHYCSYMCLK_ROOT_GATE_DISABLE, mask_sh), \
+       HWS_SF(, DCCG_GATE_DISABLE_CNTL2, PHYDSYMCLK_ROOT_GATE_DISABLE, mask_sh), \
+       HWS_SF(, DCCG_GATE_DISABLE_CNTL2, PHYESYMCLK_ROOT_GATE_DISABLE, mask_sh)
+
+static const struct dce_hwseq_shift hwseq_shift = {
+               HWSEQ_DCN35_MASK_SH_LIST(__SHIFT)
+};
+
+static const struct dce_hwseq_mask hwseq_mask = {
+               HWSEQ_DCN35_MASK_SH_LIST(_MASK)
+};
+
+#define vmid_regs_init(id)\
+               DCN20_VMID_REG_LIST_RI(id)
+
+static struct dcn_vmid_registers vmid_regs[16];
+
+static const struct dcn20_vmid_shift vmid_shifts = {
+               DCN20_VMID_MASK_SH_LIST(__SHIFT)
+};
+
+static const struct dcn20_vmid_mask vmid_masks = {
+               DCN20_VMID_MASK_SH_LIST(_MASK)
+};
+
+static const struct resource_caps res_cap_dcn35 = {
+       .num_timing_generator = 4,
+       .num_opp = 4,
+       .num_video_plane = 4,
+       .num_audio = 5,
+       .num_stream_encoder = 5,
+       .num_dig_link_enc = 5,
+       .num_hpo_dp_stream_encoder = 4,
+       .num_hpo_dp_link_encoder = 2,
+       .num_pll = 4,/*1 c10 edp, 3xc20 combo PHY*/
+       .num_dwb = 1,
+       .num_ddc = 5,
+       .num_vmid = 16,
+       .num_mpc_3dlut = 2,
+       .num_dsc = 4,
+};
+
+static const struct dc_plane_cap plane_cap = {
+       .type = DC_PLANE_TYPE_DCN_UNIVERSAL,
+       .per_pixel_alpha = true,
+
+       .pixel_format_support = {
+                       .argb8888 = true,
+                       .nv12 = true,
+                       .fp16 = true,
+                       .p010 = true,
+                       .ayuv = false,
+       },
+
+       .max_upscale_factor = {
+                       .argb8888 = 16000,
+                       .nv12 = 16000,
+                       .fp16 = 16000
+       },
+
+       // 6:1 downscaling ratio: 1000/6 = 166.666
+       .max_downscale_factor = {
+                       .argb8888 = 167,
+                       .nv12 = 167,
+                       .fp16 = 167
+       },
+       64,
+       64
+};
+
+static const struct dc_debug_options debug_defaults_drv = {
+       .disable_dmcu = true,
+       .force_abm_enable = false,
+       .timing_trace = false,
+       .clock_trace = true,
+       .disable_pplib_clock_request = false,
+       .pipe_split_policy = MPC_SPLIT_AVOID,
+       .force_single_disp_pipe_split = false,
+       .disable_dcc = DCC_ENABLE,
+       .disable_dpp_power_gate = true,
+       .disable_hubp_power_gate = true,
+       .disable_clock_gate = true,
+       .disable_dsc_power_gate = true,
+       .vsr_support = true,
+       .performance_trace = false,
+       .max_downscale_src_width = 4096,/*upto true 4k*/
+       .disable_pplib_wm_range = false,
+       .scl_reset_length10 = true,
+       .sanity_checks = false,
+       .underflow_assert_delay_us = 0xFFFFFFFF,
+       .dwb_fi_phase = -1, // -1 = disable,
+       .dmub_command_table = true,
+       .pstate_enabled = true,
+       .use_max_lb = true,
+       .enable_mem_low_power = {
+               .bits = {
+                       .vga = false,
+                       .i2c = true,
+                       .dmcu = false, // This is previously known to cause hang on S3 cycles if enabled
+                       .dscl = true,
+                       .cm = true,
+                       .mpc = true,
+                       .optc = true,
+                       .vpg = true,
+                       .afmt = true,
+               }
+       },
+       .root_clock_optimization = {
+               .bits = {
+                       .dpp = true,
+                       .dsc = true,/*dscclk and dsc pg*/
+                       .hdmistream = true,
+                       .hdmichar = true,
+                       .dpstream = true,
+                       .symclk32_se = true,
+                       .symclk32_le = true,
+                       .symclk_fe = true,
+                       .physymclk = true,
+                       .dpiasymclk = true,
+               }
+       },
+       .seamless_boot_odm_combine = DML_FAIL_SOURCE_PIXEL_FORMAT,
+       .enable_z9_disable_interface = true, /* Allow support for the PMFW interface for disable Z9*/
+       .using_dml2 = true,
+       .support_eDP1_5 = true,
+       .enable_hpo_pg_support = false,
+       .enable_legacy_fast_update = true,
+       .enable_single_display_2to1_odm_policy = false,
+       .disable_idle_power_optimizations = true,
+       .dmcub_emulation = false,
+       .disable_boot_optimizations = false,
+       .disable_unbounded_requesting = false,
+       .disable_mem_low_power = false,
+       //must match enable_single_display_2to1_odm_policy to support dynamic ODM transitions
+       .enable_double_buffered_dsc_pg_support = true,
+       .enable_dp_dig_pixel_rate_div_policy = 1,
+       .disable_z10 = false,
+       .ignore_pg = true,
+       .psp_disabled_wa = true,
+       .ips2_eval_delay_us = 200,
+       .ips2_entry_delay_us = 400
+};
+
+static const struct dc_panel_config panel_config_defaults = {
+       .psr = {
+               .disable_psr = false,
+               .disallow_psrsu = false,
+       },
+       .ilr = {
+               .optimize_edp_link_rate = true,
+       },
+};
+
+static void dcn35_dpp_destroy(struct dpp **dpp)
+{
+       kfree(TO_DCN20_DPP(*dpp));
+       *dpp = NULL;
+}
+
+static struct dpp *dcn35_dpp_create(struct dc_context *ctx, uint32_t inst)
+{
+       struct dcn3_dpp *dpp = kzalloc(sizeof(struct dcn3_dpp), GFP_KERNEL);
+       bool success = (dpp != NULL);
+
+       if (!success)
+               return NULL;
+
+#undef REG_STRUCT
+#define REG_STRUCT dpp_regs
+       dpp_regs_init(0),
+       dpp_regs_init(1),
+       dpp_regs_init(2),
+       dpp_regs_init(3);
+
+       success = dpp35_construct(dpp, ctx, inst, &dpp_regs[inst], &tf_shift,
+                                 &tf_mask);
+       if (success) {
+               dpp35_set_fgcg(
+                       dpp,
+                       ctx->dc->debug.enable_fine_grain_clock_gating.bits.dpp);
+               return &dpp->base;
+       }
+
+       BREAK_TO_DEBUGGER();
+       kfree(dpp);
+       return NULL;
+}
+
+static struct output_pixel_processor *dcn35_opp_create(
+       struct dc_context *ctx, uint32_t inst)
+{
+       struct dcn20_opp *opp =
+               kzalloc(sizeof(struct dcn20_opp), GFP_KERNEL);
+
+       if (!opp) {
+               BREAK_TO_DEBUGGER();
+               return NULL;
+       }
+
+#undef REG_STRUCT
+#define REG_STRUCT opp_regs
+       opp_regs_init(0),
+       opp_regs_init(1),
+       opp_regs_init(2),
+       opp_regs_init(3);
+
+       dcn35_opp_construct(opp, ctx, inst,
+                       &opp_regs[inst], &opp_shift, &opp_mask);
+
+       dcn35_opp_set_fgcg(opp, ctx->dc->debug.enable_fine_grain_clock_gating.bits.opp);
+
+       return &opp->base;
+}
+
+static struct dce_aux *dcn31_aux_engine_create(
+       struct dc_context *ctx,
+       uint32_t inst)
+{
+       struct aux_engine_dce110 *aux_engine =
+               kzalloc(sizeof(struct aux_engine_dce110), GFP_KERNEL);
+
+       if (!aux_engine)
+               return NULL;
+
+#undef REG_STRUCT
+#define REG_STRUCT aux_engine_regs
+       aux_engine_regs_init(0),
+       aux_engine_regs_init(1),
+       aux_engine_regs_init(2),
+       aux_engine_regs_init(3),
+       aux_engine_regs_init(4);
+
+       dce110_aux_engine_construct(aux_engine, ctx, inst,
+                                   SW_AUX_TIMEOUT_PERIOD_MULTIPLIER * AUX_TIMEOUT_PERIOD,
+                                   &aux_engine_regs[inst],
+                                       &aux_mask,
+                                       &aux_shift,
+                                       ctx->dc->caps.extended_aux_timeout_support);
+
+       return &aux_engine->base;
+}
+
+#define i2c_inst_regs_init(id)\
+       I2C_HW_ENGINE_COMMON_REG_LIST_DCN30_RI(id)
+
+static struct dce_i2c_registers i2c_hw_regs[5];
+
+static const struct dce_i2c_shift i2c_shifts = {
+               I2C_COMMON_MASK_SH_LIST_DCN35(__SHIFT)
+};
+
+static const struct dce_i2c_mask i2c_masks = {
+               I2C_COMMON_MASK_SH_LIST_DCN35(_MASK)
+};
+
+/* ========================================================== */
+
+/*
+ * DPIA index | Preferred Encoder     |    Host Router
+ *   0        |      C                |       0
+ *   1        |      First Available  |       0
+ *   2        |      D                |       1
+ *   3        |      First Available  |       1
+ */
+/* ========================================================== */
+static const enum engine_id dpia_to_preferred_enc_id_table[] = {
+               ENGINE_ID_DIGC,
+               ENGINE_ID_DIGC,
+               ENGINE_ID_DIGD,
+               ENGINE_ID_DIGD
+};
+
+static enum engine_id dcn35_get_preferred_eng_id_dpia(unsigned int dpia_index)
+{
+       return dpia_to_preferred_enc_id_table[dpia_index];
+}
+
+static struct dce_i2c_hw *dcn31_i2c_hw_create(
+       struct dc_context *ctx,
+       uint32_t inst)
+{
+       struct dce_i2c_hw *dce_i2c_hw =
+               kzalloc(sizeof(struct dce_i2c_hw), GFP_KERNEL);
+
+       if (!dce_i2c_hw)
+               return NULL;
+
+#undef REG_STRUCT
+#define REG_STRUCT i2c_hw_regs
+       i2c_inst_regs_init(1),
+       i2c_inst_regs_init(2),
+       i2c_inst_regs_init(3),
+       i2c_inst_regs_init(4),
+       i2c_inst_regs_init(5);
+
+       dcn2_i2c_hw_construct(dce_i2c_hw, ctx, inst,
+                                   &i2c_hw_regs[inst], &i2c_shifts, &i2c_masks);
+
+       return dce_i2c_hw;
+}
+static struct mpc *dcn35_mpc_create(
+               struct dc_context *ctx,
+               int num_mpcc,
+               int num_rmu)
+{
+       struct dcn30_mpc *mpc30 = kzalloc(sizeof(struct dcn30_mpc), GFP_KERNEL);
+
+       if (!mpc30)
+               return NULL;
+
+#undef REG_STRUCT
+#define REG_STRUCT mpc_regs
+       dcn_mpc_regs_init();
+
+       dcn32_mpc_construct(mpc30, ctx,
+                       &mpc_regs,
+                       &mpc_shift,
+                       &mpc_mask,
+                       num_mpcc,
+                       num_rmu);
+
+       return &mpc30->base;
+}
+
+static struct hubbub *dcn35_hubbub_create(struct dc_context *ctx)
+{
+       int i;
+
+       struct dcn20_hubbub *hubbub3 = kzalloc(sizeof(struct dcn20_hubbub),
+                                         GFP_KERNEL);
+
+       if (!hubbub3)
+               return NULL;
+
+#undef REG_STRUCT
+#define REG_STRUCT hubbub_reg
+       hubbub_reg_init();
+
+#undef REG_STRUCT
+#define REG_STRUCT vmid_regs
+       vmid_regs_init(0),
+       vmid_regs_init(1),
+       vmid_regs_init(2),
+       vmid_regs_init(3),
+       vmid_regs_init(4),
+       vmid_regs_init(5),
+       vmid_regs_init(6),
+       vmid_regs_init(7),
+       vmid_regs_init(8),
+       vmid_regs_init(9),
+       vmid_regs_init(10),
+       vmid_regs_init(11),
+       vmid_regs_init(12),
+       vmid_regs_init(13),
+       vmid_regs_init(14),
+       vmid_regs_init(15);
+
+       hubbub35_construct(hubbub3, ctx,
+                       &hubbub_reg,
+                       &hubbub_shift,
+                       &hubbub_mask,
+                       384,/*ctx->dc->dml.ip.det_buffer_size_kbytes,*/
+                       8, /*ctx->dc->dml.ip.pixel_chunk_size_kbytes,*/
+                       1792 /*ctx->dc->dml.ip.config_return_buffer_size_in_kbytes*/);
+
+
+       for (i = 0; i < res_cap_dcn35.num_vmid; i++) {
+               struct dcn20_vmid *vmid = &hubbub3->vmid[i];
+
+               vmid->ctx = ctx;
+
+               vmid->regs = &vmid_regs[i];
+               vmid->shifts = &vmid_shifts;
+               vmid->masks = &vmid_masks;
+       }
+
+       return &hubbub3->base;
+}
+
+static struct timing_generator *dcn35_timing_generator_create(
+               struct dc_context *ctx,
+               uint32_t instance)
+{
+       struct optc *tgn10 =
+               kzalloc(sizeof(struct optc), GFP_KERNEL);
+
+       if (!tgn10)
+               return NULL;
+
+#undef REG_STRUCT
+#define REG_STRUCT optc_regs
+       optc_regs_init(0),
+       optc_regs_init(1),
+       optc_regs_init(2),
+       optc_regs_init(3);
+
+       tgn10->base.inst = instance;
+       tgn10->base.ctx = ctx;
+
+       tgn10->tg_regs = &optc_regs[instance];
+       tgn10->tg_shift = &optc_shift;
+       tgn10->tg_mask = &optc_mask;
+
+       dcn35_timing_generator_init(tgn10);
+
+       return &tgn10->base;
+}
+
+static const struct encoder_feature_support link_enc_feature = {
+               .max_hdmi_deep_color = COLOR_DEPTH_121212,
+               .max_hdmi_pixel_clock = 600000,
+               .hdmi_ycbcr420_supported = true,
+               .dp_ycbcr420_supported = true,
+               .fec_supported = true,
+               .flags.bits.IS_HBR2_CAPABLE = true,
+               .flags.bits.IS_HBR3_CAPABLE = true,
+               .flags.bits.IS_TPS3_CAPABLE = true,
+               .flags.bits.IS_TPS4_CAPABLE = true
+};
+
+static struct link_encoder *dcn35_link_encoder_create(
+       struct dc_context *ctx,
+       const struct encoder_init_data *enc_init_data)
+{
+       struct dcn20_link_encoder *enc20 =
+               kzalloc(sizeof(struct dcn20_link_encoder), GFP_KERNEL);
+
+       if (!enc20)
+               return NULL;
+
+#undef REG_STRUCT
+#define REG_STRUCT link_enc_aux_regs
+       aux_regs_init(0),
+       aux_regs_init(1),
+       aux_regs_init(2),
+       aux_regs_init(3),
+       aux_regs_init(4);
+
+#undef REG_STRUCT
+#define REG_STRUCT link_enc_hpd_regs
+       hpd_regs_init(0),
+       hpd_regs_init(1),
+       hpd_regs_init(2),
+       hpd_regs_init(3),
+       hpd_regs_init(4);
+
+#undef REG_STRUCT
+#define REG_STRUCT link_enc_regs
+       link_regs_init(0, A),
+       link_regs_init(1, B),
+       link_regs_init(2, C),
+       link_regs_init(3, D),
+       link_regs_init(4, E);
+
+       dcn35_link_encoder_construct(enc20,
+                       enc_init_data,
+                       &link_enc_feature,
+                       &link_enc_regs[enc_init_data->transmitter],
+                       &link_enc_aux_regs[enc_init_data->channel - 1],
+                       &link_enc_hpd_regs[enc_init_data->hpd_source],
+                       &le_shift,
+                       &le_mask);
+
+       return &enc20->enc10.base;
+}
+
+/* Create a minimal link encoder object not associated with a particular
+ * physical connector.
+ * resource_funcs.link_enc_create_minimal
+ */
+static struct link_encoder *dcn31_link_enc_create_minimal(
+               struct dc_context *ctx, enum engine_id eng_id)
+{
+       struct dcn20_link_encoder *enc20;
+
+       if ((eng_id - ENGINE_ID_DIGA) > ctx->dc->res_pool->res_cap->num_dig_link_enc)
+               return NULL;
+
+       enc20 = kzalloc(sizeof(struct dcn20_link_encoder), GFP_KERNEL);
+       if (!enc20)
+               return NULL;
+
+       dcn31_link_encoder_construct_minimal(
+                       enc20,
+                       ctx,
+                       &link_enc_feature,
+                       &link_enc_regs[eng_id - ENGINE_ID_DIGA],
+                       eng_id);
+
+       return &enc20->enc10.base;
+}
+
+static struct panel_cntl *dcn31_panel_cntl_create(const struct panel_cntl_init_data *init_data)
+{
+       struct dcn31_panel_cntl *panel_cntl =
+               kzalloc(sizeof(struct dcn31_panel_cntl), GFP_KERNEL);
+
+       if (!panel_cntl)
+               return NULL;
+
+       dcn31_panel_cntl_construct(panel_cntl, init_data);
+
+       return &panel_cntl->base;
+}
+
+static void read_dce_straps(
+       struct dc_context *ctx,
+       struct resource_straps *straps)
+{
+       generic_reg_get(ctx, regDC_PINSTRAPS + BASE(regDC_PINSTRAPS_BASE_IDX),
+               FN(DC_PINSTRAPS, DC_PINSTRAPS_AUDIO), &straps->dc_pinstraps_audio);
+
+}
+
+static struct audio *dcn31_create_audio(
+               struct dc_context *ctx, unsigned int inst)
+{
+
+#undef REG_STRUCT
+#define REG_STRUCT audio_regs
+       audio_regs_init(0),
+       audio_regs_init(1),
+       audio_regs_init(2),
+       audio_regs_init(3),
+       audio_regs_init(4);
+       audio_regs_init(5);
+       audio_regs_init(6);
+
+       return dce_audio_create(ctx, inst,
+                       &audio_regs[inst], &audio_shift, &audio_mask);
+}
+
+static struct vpg *dcn31_vpg_create(
+       struct dc_context *ctx,
+       uint32_t inst)
+{
+       struct dcn31_vpg *vpg31 = kzalloc(sizeof(struct dcn31_vpg), GFP_KERNEL);
+
+       if (!vpg31)
+               return NULL;
+
+#undef REG_STRUCT
+#define REG_STRUCT vpg_regs
+       vpg_regs_init(0),
+       vpg_regs_init(1),
+       vpg_regs_init(2),
+       vpg_regs_init(3),
+       vpg_regs_init(4),
+       vpg_regs_init(5),
+       vpg_regs_init(6),
+       vpg_regs_init(7),
+       vpg_regs_init(8),
+       vpg_regs_init(9);
+
+       vpg31_construct(vpg31, ctx, inst,
+                       &vpg_regs[inst],
+                       &vpg_shift,
+                       &vpg_mask);
+
+       return &vpg31->base;
+}
+
+static struct afmt *dcn31_afmt_create(
+       struct dc_context *ctx,
+       uint32_t inst)
+{
+       struct dcn31_afmt *afmt31 = kzalloc(sizeof(struct dcn31_afmt), GFP_KERNEL);
+
+       if (!afmt31)
+               return NULL;
+
+#undef REG_STRUCT
+#define REG_STRUCT afmt_regs
+       afmt_regs_init(0),
+       afmt_regs_init(1),
+       afmt_regs_init(2),
+       afmt_regs_init(3),
+       afmt_regs_init(4),
+       afmt_regs_init(5);
+
+       afmt31_construct(afmt31, ctx, inst,
+                       &afmt_regs[inst],
+                       &afmt_shift,
+                       &afmt_mask);
+
+       // Light sleep by default, no need to power down here
+
+       return &afmt31->base;
+}
+
+static struct apg *dcn31_apg_create(
+       struct dc_context *ctx,
+       uint32_t inst)
+{
+       struct dcn31_apg *apg31 = kzalloc(sizeof(struct dcn31_apg), GFP_KERNEL);
+
+       if (!apg31)
+               return NULL;
+
+#undef REG_STRUCT
+#define REG_STRUCT apg_regs
+       apg_regs_init(0),
+       apg_regs_init(1),
+       apg_regs_init(2),
+       apg_regs_init(3);
+
+       apg31_construct(apg31, ctx, inst,
+                       &apg_regs[inst],
+                       &apg_shift,
+                       &apg_mask);
+
+       return &apg31->base;
+}
+
+static struct stream_encoder *dcn35_stream_encoder_create(
+       enum engine_id eng_id,
+       struct dc_context *ctx)
+{
+       struct dcn10_stream_encoder *enc1;
+       struct vpg *vpg;
+       struct afmt *afmt;
+       int vpg_inst;
+       int afmt_inst;
+
+       /* Mapping of VPG, AFMT, DME register blocks to DIO block instance */
+       if (eng_id <= ENGINE_ID_DIGF) {
+               vpg_inst = eng_id;
+               afmt_inst = eng_id;
+       } else
+               return NULL;
+
+       enc1 = kzalloc(sizeof(struct dcn10_stream_encoder), GFP_KERNEL);
+       vpg = dcn31_vpg_create(ctx, vpg_inst);
+       afmt = dcn31_afmt_create(ctx, afmt_inst);
+
+       if (!enc1 || !vpg || !afmt) {
+               kfree(enc1);
+               kfree(vpg);
+               kfree(afmt);
+               return NULL;
+       }
+
+#undef REG_STRUCT
+#define REG_STRUCT stream_enc_regs
+       stream_enc_regs_init(0),
+       stream_enc_regs_init(1),
+       stream_enc_regs_init(2),
+       stream_enc_regs_init(3),
+       stream_enc_regs_init(4);
+
+       dcn35_dio_stream_encoder_construct(enc1, ctx, ctx->dc_bios,
+                                       eng_id, vpg, afmt,
+                                       &stream_enc_regs[eng_id],
+                                       &se_shift, &se_mask);
+
+       return &enc1->base;
+}
+
+static struct hpo_dp_stream_encoder *dcn31_hpo_dp_stream_encoder_create(
+       enum engine_id eng_id,
+       struct dc_context *ctx)
+{
+       struct dcn31_hpo_dp_stream_encoder *hpo_dp_enc31;
+       struct vpg *vpg;
+       struct apg *apg;
+       uint32_t hpo_dp_inst;
+       uint32_t vpg_inst;
+       uint32_t apg_inst;
+
+       ASSERT((eng_id >= ENGINE_ID_HPO_DP_0) && (eng_id <= ENGINE_ID_HPO_DP_3));
+       hpo_dp_inst = eng_id - ENGINE_ID_HPO_DP_0;
+
+       /* Mapping of VPG register blocks to HPO DP block instance:
+        * VPG[6] -> HPO_DP[0]
+        * VPG[7] -> HPO_DP[1]
+        * VPG[8] -> HPO_DP[2]
+        * VPG[9] -> HPO_DP[3]
+        */
+       vpg_inst = hpo_dp_inst + 6;
+
+       /* Mapping of APG register blocks to HPO DP block instance:
+        * APG[0] -> HPO_DP[0]
+        * APG[1] -> HPO_DP[1]
+        * APG[2] -> HPO_DP[2]
+        * APG[3] -> HPO_DP[3]
+        */
+       apg_inst = hpo_dp_inst;
+
+       /* allocate HPO stream encoder and create VPG sub-block */
+       hpo_dp_enc31 = kzalloc(sizeof(struct dcn31_hpo_dp_stream_encoder), GFP_KERNEL);
+       vpg = dcn31_vpg_create(ctx, vpg_inst);
+       apg = dcn31_apg_create(ctx, apg_inst);
+
+       if (!hpo_dp_enc31 || !vpg || !apg) {
+               kfree(hpo_dp_enc31);
+               kfree(vpg);
+               kfree(apg);
+               return NULL;
+       }
+
+#undef REG_STRUCT
+#define REG_STRUCT hpo_dp_stream_enc_regs
+       hpo_dp_stream_encoder_reg_init(0),
+       hpo_dp_stream_encoder_reg_init(1),
+       hpo_dp_stream_encoder_reg_init(2),
+       hpo_dp_stream_encoder_reg_init(3);
+
+       dcn31_hpo_dp_stream_encoder_construct(hpo_dp_enc31, ctx, ctx->dc_bios,
+                                       hpo_dp_inst, eng_id, vpg, apg,
+                                       &hpo_dp_stream_enc_regs[hpo_dp_inst],
+                                       &hpo_dp_se_shift, &hpo_dp_se_mask);
+
+       return &hpo_dp_enc31->base;
+}
+
+static struct hpo_dp_link_encoder *dcn31_hpo_dp_link_encoder_create(
+       uint8_t inst,
+       struct dc_context *ctx)
+{
+       struct dcn31_hpo_dp_link_encoder *hpo_dp_enc31;
+
+       /* allocate HPO link encoder */
+       hpo_dp_enc31 = kzalloc(sizeof(struct dcn31_hpo_dp_link_encoder), GFP_KERNEL);
+
+#undef REG_STRUCT
+#define REG_STRUCT hpo_dp_link_enc_regs
+       hpo_dp_link_encoder_reg_init(0),
+       hpo_dp_link_encoder_reg_init(1);
+
+       hpo_dp_link_encoder31_construct(hpo_dp_enc31, ctx, inst,
+                                       &hpo_dp_link_enc_regs[inst],
+                                       &hpo_dp_le_shift, &hpo_dp_le_mask);
+
+       return &hpo_dp_enc31->base;
+}
+
+static struct dce_hwseq *dcn35_hwseq_create(
+       struct dc_context *ctx)
+{
+       struct dce_hwseq *hws = kzalloc(sizeof(struct dce_hwseq), GFP_KERNEL);
+
+#undef REG_STRUCT
+#define REG_STRUCT hwseq_reg
+       hwseq_reg_init();
+
+       if (hws) {
+               hws->ctx = ctx;
+               hws->regs = &hwseq_reg;
+               hws->shifts = &hwseq_shift;
+               hws->masks = &hwseq_mask;
+       }
+       return hws;
+}
+static const struct resource_create_funcs res_create_funcs = {
+       .read_dce_straps = read_dce_straps,
+       .create_audio = dcn31_create_audio,
+       .create_stream_encoder = dcn35_stream_encoder_create,
+       .create_hpo_dp_stream_encoder = dcn31_hpo_dp_stream_encoder_create,
+       .create_hpo_dp_link_encoder = dcn31_hpo_dp_link_encoder_create,
+       .create_hwseq = dcn35_hwseq_create,
+};
+
+static void dcn35_resource_destruct(struct dcn35_resource_pool *pool)
+{
+       unsigned int i;
+
+       for (i = 0; i < pool->base.stream_enc_count; i++) {
+               if (pool->base.stream_enc[i] != NULL) {
+                       if (pool->base.stream_enc[i]->vpg != NULL) {
+                               kfree(DCN30_VPG_FROM_VPG(pool->base.stream_enc[i]->vpg));
+                               pool->base.stream_enc[i]->vpg = NULL;
+                       }
+                       if (pool->base.stream_enc[i]->afmt != NULL) {
+                               kfree(DCN30_AFMT_FROM_AFMT(pool->base.stream_enc[i]->afmt));
+                               pool->base.stream_enc[i]->afmt = NULL;
+                       }
+                       kfree(DCN10STRENC_FROM_STRENC(pool->base.stream_enc[i]));
+                       pool->base.stream_enc[i] = NULL;
+               }
+       }
+
+       for (i = 0; i < pool->base.hpo_dp_stream_enc_count; i++) {
+               if (pool->base.hpo_dp_stream_enc[i] != NULL) {
+                       if (pool->base.hpo_dp_stream_enc[i]->vpg != NULL) {
+                               kfree(DCN30_VPG_FROM_VPG(pool->base.hpo_dp_stream_enc[i]->vpg));
+                               pool->base.hpo_dp_stream_enc[i]->vpg = NULL;
+                       }
+                       if (pool->base.hpo_dp_stream_enc[i]->apg != NULL) {
+                               kfree(DCN31_APG_FROM_APG(pool->base.hpo_dp_stream_enc[i]->apg));
+                               pool->base.hpo_dp_stream_enc[i]->apg = NULL;
+                       }
+                       kfree(DCN3_1_HPO_DP_STREAM_ENC_FROM_HPO_STREAM_ENC(pool->base.hpo_dp_stream_enc[i]));
+                       pool->base.hpo_dp_stream_enc[i] = NULL;
+               }
+       }
+
+       for (i = 0; i < pool->base.hpo_dp_link_enc_count; i++) {
+               if (pool->base.hpo_dp_link_enc[i] != NULL) {
+                       kfree(DCN3_1_HPO_DP_LINK_ENC_FROM_HPO_LINK_ENC(pool->base.hpo_dp_link_enc[i]));
+                       pool->base.hpo_dp_link_enc[i] = NULL;
+               }
+       }
+
+       for (i = 0; i < pool->base.res_cap->num_dsc; i++) {
+               if (pool->base.dscs[i] != NULL)
+                       dcn20_dsc_destroy(&pool->base.dscs[i]);
+       }
+
+       if (pool->base.mpc != NULL) {
+               kfree(TO_DCN20_MPC(pool->base.mpc));
+               pool->base.mpc = NULL;
+       }
+       if (pool->base.hubbub != NULL) {
+               kfree(pool->base.hubbub);
+               pool->base.hubbub = NULL;
+       }
+       for (i = 0; i < pool->base.pipe_count; i++) {
+               if (pool->base.dpps[i] != NULL)
+                       dcn35_dpp_destroy(&pool->base.dpps[i]);
+
+               if (pool->base.ipps[i] != NULL)
+                       pool->base.ipps[i]->funcs->ipp_destroy(&pool->base.ipps[i]);
+
+               if (pool->base.hubps[i] != NULL) {
+                       kfree(TO_DCN20_HUBP(pool->base.hubps[i]));
+                       pool->base.hubps[i] = NULL;
+               }
+
+               if (pool->base.irqs != NULL) {
+                       dal_irq_service_destroy(&pool->base.irqs);
+               }
+       }
+
+       for (i = 0; i < pool->base.res_cap->num_ddc; i++) {
+               if (pool->base.engines[i] != NULL)
+                       dce110_engine_destroy(&pool->base.engines[i]);
+               if (pool->base.hw_i2cs[i] != NULL) {
+                       kfree(pool->base.hw_i2cs[i]);
+                       pool->base.hw_i2cs[i] = NULL;
+               }
+               if (pool->base.sw_i2cs[i] != NULL) {
+                       kfree(pool->base.sw_i2cs[i]);
+                       pool->base.sw_i2cs[i] = NULL;
+               }
+       }
+
+       for (i = 0; i < pool->base.res_cap->num_opp; i++) {
+               if (pool->base.opps[i] != NULL)
+                       pool->base.opps[i]->funcs->opp_destroy(&pool->base.opps[i]);
+       }
+
+       for (i = 0; i < pool->base.res_cap->num_timing_generator; i++) {
+               if (pool->base.timing_generators[i] != NULL)    {
+                       kfree(DCN10TG_FROM_TG(pool->base.timing_generators[i]));
+                       pool->base.timing_generators[i] = NULL;
+               }
+       }
+
+       for (i = 0; i < pool->base.res_cap->num_dwb; i++) {
+               if (pool->base.dwbc[i] != NULL) {
+                       kfree(TO_DCN30_DWBC(pool->base.dwbc[i]));
+                       pool->base.dwbc[i] = NULL;
+               }
+               if (pool->base.mcif_wb[i] != NULL) {
+                       kfree(TO_DCN30_MMHUBBUB(pool->base.mcif_wb[i]));
+                       pool->base.mcif_wb[i] = NULL;
+               }
+       }
+
+       for (i = 0; i < pool->base.audio_count; i++) {
+               if (pool->base.audios[i])
+                       dce_aud_destroy(&pool->base.audios[i]);
+       }
+
+       for (i = 0; i < pool->base.clk_src_count; i++) {
+               if (pool->base.clock_sources[i] != NULL) {
+                       dcn20_clock_source_destroy(&pool->base.clock_sources[i]);
+                       pool->base.clock_sources[i] = NULL;
+               }
+       }
+
+       for (i = 0; i < pool->base.res_cap->num_mpc_3dlut; i++) {
+               if (pool->base.mpc_lut[i] != NULL) {
+                       dc_3dlut_func_release(pool->base.mpc_lut[i]);
+                       pool->base.mpc_lut[i] = NULL;
+               }
+               if (pool->base.mpc_shaper[i] != NULL) {
+                       dc_transfer_func_release(pool->base.mpc_shaper[i]);
+                       pool->base.mpc_shaper[i] = NULL;
+               }
+       }
+
+       if (pool->base.dp_clock_source != NULL) {
+               dcn20_clock_source_destroy(&pool->base.dp_clock_source);
+               pool->base.dp_clock_source = NULL;
+       }
+
+       for (i = 0; i < pool->base.res_cap->num_timing_generator; i++) {
+               if (pool->base.multiple_abms[i] != NULL)
+                       dce_abm_destroy(&pool->base.multiple_abms[i]);
+       }
+
+       if (pool->base.psr != NULL)
+               dmub_psr_destroy(&pool->base.psr);
+
+       if (pool->base.pg_cntl != NULL)
+               dcn_pg_cntl_destroy(&pool->base.pg_cntl);
+
+       if (pool->base.dccg != NULL)
+               dcn_dccg_destroy(&pool->base.dccg);
+}
+
+static struct hubp *dcn35_hubp_create(
+       struct dc_context *ctx,
+       uint32_t inst)
+{
+       struct dcn20_hubp *hubp2 =
+               kzalloc(sizeof(struct dcn20_hubp), GFP_KERNEL);
+
+       if (!hubp2)
+               return NULL;
+
+#undef REG_STRUCT
+#define REG_STRUCT hubp_regs
+       hubp_regs_init(0),
+       hubp_regs_init(1),
+       hubp_regs_init(2),
+       hubp_regs_init(3);
+
+       if (hubp35_construct(hubp2, ctx, inst,
+                       &hubp_regs[inst], &hubp_shift, &hubp_mask))
+               return &hubp2->base;
+
+       BREAK_TO_DEBUGGER();
+       kfree(hubp2);
+       return NULL;
+}
+
+static void dcn35_dwbc_init(struct dcn30_dwbc *dwbc30, struct dc_context *ctx)
+{
+       dcn35_dwbc_set_fgcg(
+               dwbc30, ctx->dc->debug.enable_fine_grain_clock_gating.bits.dwb);
+}
+
+static bool dcn35_dwbc_create(struct dc_context *ctx, struct resource_pool *pool)
+{
+       int i;
+       uint32_t pipe_count = pool->res_cap->num_dwb;
+
+       for (i = 0; i < pipe_count; i++) {
+               struct dcn30_dwbc *dwbc30 = kzalloc(sizeof(struct dcn30_dwbc),
+                                                   GFP_KERNEL);
+
+               if (!dwbc30) {
+                       dm_error("DC: failed to create dwbc30!\n");
+                       return false;
+               }
+
+#undef REG_STRUCT
+#define REG_STRUCT dwbc35_regs
+               dwbc_regs_dcn3_init(0);
+
+               dcn35_dwbc_construct(dwbc30, ctx,
+                               &dwbc35_regs[i],
+                               &dwbc35_shift,
+                               &dwbc35_mask,
+                               i);
+
+               pool->dwbc[i] = &dwbc30->base;
+
+               dcn35_dwbc_init(dwbc30, ctx);
+       }
+       return true;
+}
+
+static void dcn35_mmhubbub_init(struct dcn30_mmhubbub *mcif_wb30,
+                               struct dc_context *ctx)
+{
+       dcn35_mmhubbub_set_fgcg(
+               mcif_wb30,
+               ctx->dc->debug.enable_fine_grain_clock_gating.bits.mmhubbub);
+}
+
+static bool dcn35_mmhubbub_create(struct dc_context *ctx, struct resource_pool *pool)
+{
+       int i;
+       uint32_t pipe_count = pool->res_cap->num_dwb;
+
+       for (i = 0; i < pipe_count; i++) {
+               struct dcn30_mmhubbub *mcif_wb30 = kzalloc(sizeof(struct dcn30_mmhubbub),
+                                                   GFP_KERNEL);
+
+               if (!mcif_wb30) {
+                       dm_error("DC: failed to create mcif_wb30!\n");
+                       return false;
+               }
+
+#undef REG_STRUCT
+#define REG_STRUCT mcif_wb35_regs
+               mcif_wb_regs_dcn3_init(0);
+
+               dcn35_mmhubbub_construct(mcif_wb30, ctx,
+                               &mcif_wb35_regs[i],
+                               &mcif_wb35_shift,
+                               &mcif_wb35_mask,
+                               i);
+
+               dcn35_mmhubbub_init(mcif_wb30, ctx);
+
+               pool->mcif_wb[i] = &mcif_wb30->base;
+       }
+       return true;
+}
+
+static struct display_stream_compressor *dcn35_dsc_create(
+       struct dc_context *ctx, uint32_t inst)
+{
+       struct dcn20_dsc *dsc =
+               kzalloc(sizeof(struct dcn20_dsc), GFP_KERNEL);
+
+       if (!dsc) {
+               BREAK_TO_DEBUGGER();
+               return NULL;
+       }
+
+#undef REG_STRUCT
+#define REG_STRUCT dsc_regs
+       dsc_regsDCN35_init(0),
+       dsc_regsDCN35_init(1),
+       dsc_regsDCN35_init(2),
+       dsc_regsDCN35_init(3);
+
+       dsc35_construct(dsc, ctx, inst, &dsc_regs[inst], &dsc_shift, &dsc_mask);
+       dsc35_set_fgcg(dsc,
+                      ctx->dc->debug.enable_fine_grain_clock_gating.bits.dsc);
+       return &dsc->base;
+}
+
+static void dcn35_destroy_resource_pool(struct resource_pool **pool)
+{
+       struct dcn35_resource_pool *dcn35_pool = TO_DCN35_RES_POOL(*pool);
+
+       dcn35_resource_destruct(dcn35_pool);
+       kfree(dcn35_pool);
+       *pool = NULL;
+}
+
+static struct clock_source *dcn35_clock_source_create(
+               struct dc_context *ctx,
+               struct dc_bios *bios,
+               enum clock_source_id id,
+               const struct dce110_clk_src_regs *regs,
+               bool dp_clk_src)
+{
+       struct dce110_clk_src *clk_src =
+               kzalloc(sizeof(struct dce110_clk_src), GFP_KERNEL);
+
+       if (!clk_src)
+               return NULL;
+
+       if (dcn31_clk_src_construct(clk_src, ctx, bios, id,
+                       regs, &cs_shift, &cs_mask)) {
+               clk_src->base.dp_clk_src = dp_clk_src;
+               return &clk_src->base;
+       }
+
+       BREAK_TO_DEBUGGER();
+       return NULL;
+}
+
+static struct dc_cap_funcs cap_funcs = {
+       .get_dcc_compression_cap = dcn20_get_dcc_compression_cap
+};
+
+static void dcn35_get_panel_config_defaults(struct dc_panel_config *panel_config)
+{
+       *panel_config = panel_config_defaults;
+}
+
+
+static bool dcn35_validate_bandwidth(struct dc *dc,
+               struct dc_state *context,
+               bool fast_validate)
+{
+       bool out = false;
+
+       out = dml2_validate(dc, context, fast_validate);
+
+       return out;
+}
+
+
+static struct resource_funcs dcn35_res_pool_funcs = {
+       .destroy = dcn35_destroy_resource_pool,
+       .link_enc_create = dcn35_link_encoder_create,
+       .link_enc_create_minimal = dcn31_link_enc_create_minimal,
+       .link_encs_assign = link_enc_cfg_link_encs_assign,
+       .link_enc_unassign = link_enc_cfg_link_enc_unassign,
+       .panel_cntl_create = dcn31_panel_cntl_create,
+       .validate_bandwidth = dcn35_validate_bandwidth,
+       .calculate_wm_and_dlg = NULL,
+       .update_soc_for_wm_a = dcn31_update_soc_for_wm_a,
+       .populate_dml_pipes = dcn35_populate_dml_pipes_from_context_fpu,
+       .acquire_free_pipe_as_secondary_dpp_pipe = dcn20_acquire_free_pipe_for_layer,
+       .release_pipe = dcn20_release_pipe,
+       .add_stream_to_ctx = dcn30_add_stream_to_ctx,
+       .add_dsc_to_stream_resource = dcn20_add_dsc_to_stream_resource,
+       .remove_stream_from_ctx = dcn20_remove_stream_from_ctx,
+       .populate_dml_writeback_from_context = dcn30_populate_dml_writeback_from_context,
+       .set_mcif_arb_params = dcn30_set_mcif_arb_params,
+       .find_first_free_match_stream_enc_for_link = dcn10_find_first_free_match_stream_enc_for_link,
+       .acquire_post_bldn_3dlut = dcn30_acquire_post_bldn_3dlut,
+       .release_post_bldn_3dlut = dcn30_release_post_bldn_3dlut,
+       .update_bw_bounding_box = dcn35_update_bw_bounding_box_fpu,
+       .patch_unknown_plane_state = dcn20_patch_unknown_plane_state,
+       .get_panel_config_defaults = dcn35_get_panel_config_defaults,
+       .get_preferred_eng_id_dpia = dcn35_get_preferred_eng_id_dpia,
+};
+
+static bool dcn35_resource_construct(
+       uint8_t num_virtual_links,
+       struct dc *dc,
+       struct dcn35_resource_pool *pool)
+{
+       int i;
+       struct dc_context *ctx = dc->ctx;
+       struct irq_service_init_data init_data;
+
+#undef REG_STRUCT
+#define REG_STRUCT bios_regs
+       bios_regs_init();
+
+#undef REG_STRUCT
+#define REG_STRUCT clk_src_regs
+       clk_src_regs_init(0, A),
+       clk_src_regs_init(1, B),
+       clk_src_regs_init(2, C),
+       clk_src_regs_init(3, D),
+       clk_src_regs_init(4, E);
+
+#undef REG_STRUCT
+#define REG_STRUCT abm_regs
+       abm_regs_init(0),
+       abm_regs_init(1),
+       abm_regs_init(2),
+       abm_regs_init(3);
+
+#undef REG_STRUCT
+#define REG_STRUCT dccg_regs
+       dccg_regs_init();
+
+       ctx->dc_bios->regs = &bios_regs;
+
+       pool->base.res_cap = &res_cap_dcn35;
+
+       pool->base.funcs = &dcn35_res_pool_funcs;
+
+       /*************************************************
+        *  Resource + asic cap harcoding                *
+        *************************************************/
+       pool->base.underlay_pipe_index = NO_UNDERLAY_PIPE;
+       pool->base.pipe_count = pool->base.res_cap->num_timing_generator;
+       pool->base.mpcc_count = pool->base.res_cap->num_timing_generator;
+       dc->caps.max_downscale_ratio = 600;
+       dc->caps.i2c_speed_in_khz = 100;
+       dc->caps.i2c_speed_in_khz_hdcp = 100;
+       dc->caps.max_cursor_size = 256;
+       dc->caps.min_horizontal_blanking_period = 80;
+       dc->caps.dmdata_alloc_size = 2048;
+       dc->caps.max_slave_planes = 2;
+       dc->caps.max_slave_yuv_planes = 2;
+       dc->caps.max_slave_rgb_planes = 2;
+       dc->caps.post_blend_color_processing = true;
+       dc->caps.force_dp_tps4_for_cp2520 = true;
+       if (dc->config.forceHBR2CP2520)
+               dc->caps.force_dp_tps4_for_cp2520 = false;
+       dc->caps.dp_hpo = true;
+       dc->caps.dp_hdmi21_pcon_support = true;
+
+       dc->caps.edp_dsc_support = true;
+       dc->caps.extended_aux_timeout_support = true;
+       dc->caps.dmcub_support = true;
+       dc->caps.is_apu = true;
+       dc->caps.seamless_odm = true;
+
+       dc->caps.zstate_support = true;
+       dc->caps.ips_support = true;
+       dc->caps.max_v_total = (1 << 15) - 1;
+
+       /* Color pipeline capabilities */
+       dc->caps.color.dpp.dcn_arch = 1;
+       dc->caps.color.dpp.input_lut_shared = 0;
+       dc->caps.color.dpp.icsc = 1;
+       dc->caps.color.dpp.dgam_ram = 0; // must use gamma_corr
+       dc->caps.color.dpp.dgam_rom_caps.srgb = 1;
+       dc->caps.color.dpp.dgam_rom_caps.bt2020 = 1;
+       dc->caps.color.dpp.dgam_rom_caps.gamma2_2 = 1;
+       dc->caps.color.dpp.dgam_rom_caps.pq = 1;
+       dc->caps.color.dpp.dgam_rom_caps.hlg = 1;
+       dc->caps.color.dpp.post_csc = 1;
+       dc->caps.color.dpp.gamma_corr = 1;
+       dc->caps.color.dpp.dgam_rom_for_yuv = 0;
+
+       dc->caps.color.dpp.hw_3d_lut = 1;
+       dc->caps.color.dpp.ogam_ram = 0;  // no OGAM in DPP since DCN1
+       // no OGAM ROM on DCN301
+       dc->caps.color.dpp.ogam_rom_caps.srgb = 0;
+       dc->caps.color.dpp.ogam_rom_caps.bt2020 = 0;
+       dc->caps.color.dpp.ogam_rom_caps.gamma2_2 = 0;
+       dc->caps.color.dpp.ogam_rom_caps.pq = 0;
+       dc->caps.color.dpp.ogam_rom_caps.hlg = 0;
+       dc->caps.color.dpp.ocsc = 0;
+
+       dc->caps.color.mpc.gamut_remap = 1;
+       dc->caps.color.mpc.num_3dluts = pool->base.res_cap->num_mpc_3dlut; //2
+       dc->caps.color.mpc.ogam_ram = 1;
+       dc->caps.color.mpc.ogam_rom_caps.srgb = 0;
+       dc->caps.color.mpc.ogam_rom_caps.bt2020 = 0;
+       dc->caps.color.mpc.ogam_rom_caps.gamma2_2 = 0;
+       dc->caps.color.mpc.ogam_rom_caps.pq = 0;
+       dc->caps.color.mpc.ogam_rom_caps.hlg = 0;
+       dc->caps.color.mpc.ocsc = 1;
+
+       /* max_disp_clock_khz_at_vmin is slightly lower than the STA value in order
+        * to provide some margin.
+        * It's expected for furture ASIC to have equal or higher value, in order to
+        * have determinstic power improvement from generate to genration.
+        * (i.e., we should not expect new ASIC generation with lower vmin rate)
+        */
+       dc->caps.max_disp_clock_khz_at_vmin = 650000;
+
+       /* Use pipe context based otg sync logic */
+       dc->config.use_pipe_ctx_sync_logic = true;
+       dc->config.use_default_clock_table = false;
+       /* read VBIOS LTTPR caps */
+       {
+               if (ctx->dc_bios->funcs->get_lttpr_caps) {
+                       enum bp_result bp_query_result;
+                       uint8_t is_vbios_lttpr_enable = 0;
+
+                       bp_query_result = ctx->dc_bios->funcs->get_lttpr_caps(ctx->dc_bios, &is_vbios_lttpr_enable);
+                       dc->caps.vbios_lttpr_enable = (bp_query_result == BP_RESULT_OK) && !!is_vbios_lttpr_enable;
+               }
+
+               /* interop bit is implicit */
+               {
+                       dc->caps.vbios_lttpr_aware = true;
+               }
+       }
+
+       if (dc->ctx->dce_environment == DCE_ENV_PRODUCTION_DRV)
+               dc->debug = debug_defaults_drv;
+
+       // Init the vm_helper
+       if (dc->vm_helper)
+               vm_helper_init(dc->vm_helper, 16);
+
+       /*************************************************
+        *  Create resources                             *
+        *************************************************/
+
+       /* Clock Sources for Pixel Clock*/
+       pool->base.clock_sources[DCN35_CLK_SRC_PLL0] =
+                       dcn35_clock_source_create(ctx, ctx->dc_bios,
+                               CLOCK_SOURCE_COMBO_PHY_PLL0,
+                               &clk_src_regs[0], false);
+       pool->base.clock_sources[DCN35_CLK_SRC_PLL1] =
+                       dcn35_clock_source_create(ctx, ctx->dc_bios,
+                               CLOCK_SOURCE_COMBO_PHY_PLL1,
+                               &clk_src_regs[1], false);
+       pool->base.clock_sources[DCN35_CLK_SRC_PLL2] =
+                       dcn35_clock_source_create(ctx, ctx->dc_bios,
+                               CLOCK_SOURCE_COMBO_PHY_PLL2,
+                               &clk_src_regs[2], false);
+       pool->base.clock_sources[DCN35_CLK_SRC_PLL3] =
+                       dcn35_clock_source_create(ctx, ctx->dc_bios,
+                               CLOCK_SOURCE_COMBO_PHY_PLL3,
+                               &clk_src_regs[3], false);
+       pool->base.clock_sources[DCN35_CLK_SRC_PLL4] =
+                       dcn35_clock_source_create(ctx, ctx->dc_bios,
+                               CLOCK_SOURCE_COMBO_PHY_PLL4,
+                               &clk_src_regs[4], false);
+
+       pool->base.clk_src_count = DCN35_CLK_SRC_TOTAL;
+
+       /* todo: not reuse phy_pll registers */
+       pool->base.dp_clock_source =
+                       dcn35_clock_source_create(ctx, ctx->dc_bios,
+                               CLOCK_SOURCE_ID_DP_DTO,
+                               &clk_src_regs[0], true);
+
+       for (i = 0; i < pool->base.clk_src_count; i++) {
+               if (pool->base.clock_sources[i] == NULL) {
+                       dm_error("DC: failed to create clock sources!\n");
+                       BREAK_TO_DEBUGGER();
+                       goto create_fail;
+               }
+       }
+       /*temp till dml2 fully work without dml1*/
+       dml_init_instance(&dc->dml, &dcn3_5_soc, &dcn3_5_ip, DML_PROJECT_DCN31);
+
+       /* TODO: DCCG */
+       pool->base.dccg = dccg35_create(ctx, &dccg_regs, &dccg_shift, &dccg_mask);
+       if (pool->base.dccg == NULL) {
+               dm_error("DC: failed to create dccg!\n");
+               BREAK_TO_DEBUGGER();
+               goto create_fail;
+       }
+
+#undef REG_STRUCT
+#define REG_STRUCT pg_cntl_regs
+       pg_cntl_dcn35_regs_init();
+
+       pool->base.pg_cntl = pg_cntl35_create(ctx, &pg_cntl_regs, &pg_cntl_shift, &pg_cntl_mask);
+       if (pool->base.pg_cntl == NULL) {
+               dm_error("DC: failed to create power gate control!\n");
+               BREAK_TO_DEBUGGER();
+               goto create_fail;
+       }
+
+       /* TODO: IRQ */
+       init_data.ctx = dc->ctx;
+       pool->base.irqs = dal_irq_service_dcn35_create(&init_data);
+       if (!pool->base.irqs)
+               goto create_fail;
+
+       /* HUBBUB */
+       pool->base.hubbub = dcn35_hubbub_create(ctx);
+       if (pool->base.hubbub == NULL) {
+               BREAK_TO_DEBUGGER();
+               dm_error("DC: failed to create hubbub!\n");
+               goto create_fail;
+       }
+
+       /* HUBPs, DPPs, OPPs and TGs */
+       for (i = 0; i < pool->base.pipe_count; i++) {
+               pool->base.hubps[i] = dcn35_hubp_create(ctx, i);
+               if (pool->base.hubps[i] == NULL) {
+                       BREAK_TO_DEBUGGER();
+                       dm_error(
+                               "DC: failed to create hubps!\n");
+                       goto create_fail;
+               }
+
+               pool->base.dpps[i] = dcn35_dpp_create(ctx, i);
+               if (pool->base.dpps[i] == NULL) {
+                       BREAK_TO_DEBUGGER();
+                       dm_error(
+                               "DC: failed to create dpps!\n");
+                       goto create_fail;
+               }
+       }
+
+       for (i = 0; i < pool->base.res_cap->num_opp; i++) {
+               pool->base.opps[i] = dcn35_opp_create(ctx, i);
+               if (pool->base.opps[i] == NULL) {
+                       BREAK_TO_DEBUGGER();
+                       dm_error(
+                               "DC: failed to create output pixel processor!\n");
+                       goto create_fail;
+               }
+       }
+
+       for (i = 0; i < pool->base.res_cap->num_timing_generator; i++) {
+               pool->base.timing_generators[i] = dcn35_timing_generator_create(
+                               ctx, i);
+               if (pool->base.timing_generators[i] == NULL) {
+                       BREAK_TO_DEBUGGER();
+                       dm_error("DC: failed to create tg!\n");
+                       goto create_fail;
+               }
+       }
+       pool->base.timing_generator_count = i;
+
+       /* PSR */
+       pool->base.psr = dmub_psr_create(ctx);
+       if (pool->base.psr == NULL) {
+               dm_error("DC: failed to create psr obj!\n");
+               BREAK_TO_DEBUGGER();
+               goto create_fail;
+       }
+
+       /* ABM */
+       for (i = 0; i < pool->base.res_cap->num_timing_generator; i++) {
+               pool->base.multiple_abms[i] = dmub_abm_create(ctx,
+                               &abm_regs[i],
+                               &abm_shift,
+                               &abm_mask);
+               if (pool->base.multiple_abms[i] == NULL) {
+                       dm_error("DC: failed to create abm for pipe %d!\n", i);
+                       BREAK_TO_DEBUGGER();
+                       goto create_fail;
+               }
+       }
+
+       /* MPC and DSC */
+       pool->base.mpc = dcn35_mpc_create(ctx, pool->base.mpcc_count, pool->base.res_cap->num_mpc_3dlut);
+       if (pool->base.mpc == NULL) {
+               BREAK_TO_DEBUGGER();
+               dm_error("DC: failed to create mpc!\n");
+               goto create_fail;
+       }
+
+       for (i = 0; i < pool->base.res_cap->num_dsc; i++) {
+               pool->base.dscs[i] = dcn35_dsc_create(ctx, i);
+               if (pool->base.dscs[i] == NULL) {
+                       BREAK_TO_DEBUGGER();
+                       dm_error("DC: failed to create display stream compressor %d!\n", i);
+                       goto create_fail;
+               }
+       }
+
+       /* DWB and MMHUBBUB */
+       if (!dcn35_dwbc_create(ctx, &pool->base)) {
+               BREAK_TO_DEBUGGER();
+               dm_error("DC: failed to create dwbc!\n");
+               goto create_fail;
+       }
+
+       if (!dcn35_mmhubbub_create(ctx, &pool->base)) {
+               BREAK_TO_DEBUGGER();
+               dm_error("DC: failed to create mcif_wb!\n");
+               goto create_fail;
+       }
+
+       /* AUX and I2C */
+       for (i = 0; i < pool->base.res_cap->num_ddc; i++) {
+               pool->base.engines[i] = dcn31_aux_engine_create(ctx, i);
+               if (pool->base.engines[i] == NULL) {
+                       BREAK_TO_DEBUGGER();
+                       dm_error(
+                               "DC:failed to create aux engine!!\n");
+                       goto create_fail;
+               }
+               pool->base.hw_i2cs[i] = dcn31_i2c_hw_create(ctx, i);
+               if (pool->base.hw_i2cs[i] == NULL) {
+                       BREAK_TO_DEBUGGER();
+                       dm_error(
+                               "DC:failed to create hw i2c!!\n");
+                       goto create_fail;
+               }
+               pool->base.sw_i2cs[i] = NULL;
+       }
+
+       /* DCN3.5 has 6 DPIA */
+       pool->base.usb4_dpia_count = 4;
+       if (dc->debug.dpia_debug.bits.disable_dpia)
+               pool->base.usb4_dpia_count = 0;
+
+       /* Audio, Stream Encoders including HPO and virtual, MPC 3D LUTs */
+       if (!resource_construct(num_virtual_links, dc, &pool->base,
+                       &res_create_funcs))
+               goto create_fail;
+
+       /* HW Sequencer and Plane caps */
+       dcn35_hw_sequencer_construct(dc);
+
+       dc->caps.max_planes =  pool->base.pipe_count;
+
+       for (i = 0; i < dc->caps.max_planes; ++i)
+               dc->caps.planes[i] = plane_cap;
+
+       dc->cap_funcs = cap_funcs;
+
+       dc->dcn_ip->max_num_dpp = pool->base.pipe_count;
+
+       dc->dml2_options.dcn_pipe_count = pool->base.pipe_count;
+       dc->dml2_options.use_native_pstate_optimization = true;
+       dc->dml2_options.use_native_soc_bb_construction = true;
+       if (dc->config.EnableMinDispClkODM)
+               dc->dml2_options.minimize_dispclk_using_odm = true;
+       dc->dml2_options.enable_windowed_mpo_odm = dc->config.enable_windowed_mpo_odm;
+
+       dc->dml2_options.callbacks.dc = dc;
+       dc->dml2_options.callbacks.build_scaling_params = &resource_build_scaling_params;
+       dc->dml2_options.callbacks.can_support_mclk_switch_using_fw_based_vblank_stretch = &dcn30_can_support_mclk_switch_using_fw_based_vblank_stretch;
+       dc->dml2_options.callbacks.acquire_secondary_pipe_for_mpc_odm = &dc_resource_acquire_secondary_pipe_for_mpc_odm_legacy;
+       dc->dml2_options.callbacks.update_pipes_for_stream_with_slice_count = &resource_update_pipes_for_stream_with_slice_count;
+       dc->dml2_options.callbacks.update_pipes_for_plane_with_slice_count = &resource_update_pipes_for_plane_with_slice_count;
+       dc->dml2_options.callbacks.get_mpc_slice_index = &resource_get_mpc_slice_index;
+       dc->dml2_options.callbacks.get_odm_slice_index = &resource_get_odm_slice_index;
+       dc->dml2_options.callbacks.get_opp_head = &resource_get_opp_head;
+       dc->dml2_options.max_segments_per_hubp = 24;
+
+       dc->dml2_options.det_segment_size = DCN3_2_DET_SEG_SIZE;/*todo*/
+
+       if (dc->config.sdpif_request_limit_words_per_umc == 0)
+               dc->config.sdpif_request_limit_words_per_umc = 16;/*todo*/
+
+       return true;
+
+create_fail:
+
+       dcn35_resource_destruct(pool);
+
+       return false;
+}
+
+struct resource_pool *dcn35_create_resource_pool(
+               const struct dc_init_data *init_data,
+               struct dc *dc)
+{
+       struct dcn35_resource_pool *pool =
+               kzalloc(sizeof(struct dcn35_resource_pool), GFP_KERNEL);
+
+       if (!pool)
+               return NULL;
+
+       if (dcn35_resource_construct(init_data->num_virtual_links, dc, pool))
+               return &pool->base;
+
+       BREAK_TO_DEBUGGER();
+       kfree(pool);
+       return NULL;
+}
diff --git a/drivers/gpu/drm/amd/display/dc/resource/dcn35/dcn35_resource.h b/drivers/gpu/drm/amd/display/dc/resource/dcn35/dcn35_resource.h
new file mode 100644 (file)
index 0000000..99aea10
--- /dev/null
@@ -0,0 +1,310 @@
+/* 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_RESOURCE_H_
+#define _DCN35_RESOURCE_H_
+
+#include "core_types.h"
+
+#define DCN3_5_VMIN_DISPCLK_HZ 717000000
+#define TO_DCN35_RES_POOL(pool)\
+       container_of(pool, struct dcn35_resource_pool, base)
+
+extern struct _vcs_dpi_ip_params_st dcn3_5_ip;
+extern struct _vcs_dpi_soc_bounding_box_st dcn3_5_soc;
+
+struct dcn35_resource_pool {
+       struct resource_pool base;
+};
+
+struct resource_pool *dcn35_create_resource_pool(
+               const struct dc_init_data *init_data,
+               struct dc *dc);
+
+/* Defs for runtime init of registers */
+
+#define OPP_REG_LIST_DCN20_RI(id) \
+       OPP_REG_LIST_DCN10_RI(id), \
+       OPP_DPG_REG_LIST_RI(id), \
+       SRI_ARR(FMT_422_CONTROL, FMT, id), \
+       SRI_ARR(OPPBUF_CONTROL1, OPPBUF, id)
+
+#define OPP_REG_LIST_DCN35_RI(id) \
+       OPP_REG_LIST_DCN20_RI(id), \
+       SRI2_ARR(OPP_TOP_CLK_CONTROL, OPP, id)
+
+#define VPG_DCN31_REG_LIST_RI(id) \
+       SRI_ARR(VPG_GENERIC_STATUS, VPG, id), \
+       SRI_ARR(VPG_GENERIC_PACKET_ACCESS_CTRL, VPG, id), \
+       SRI_ARR(VPG_GENERIC_PACKET_DATA, VPG, id), \
+       SRI_ARR(VPG_GSP_FRAME_UPDATE_CTRL, VPG, id), \
+       SRI_ARR(VPG_GSP_IMMEDIATE_UPDATE_CTRL, VPG, id), \
+       SRI_ARR(VPG_MEM_PWR, VPG, id)
+
+#define AFMT_DCN31_REG_LIST_RI(id) \
+       SRI_ARR(AFMT_INFOFRAME_CONTROL0, AFMT, id), \
+       SRI_ARR(AFMT_VBI_PACKET_CONTROL, AFMT, id), \
+       SRI_ARR(AFMT_AUDIO_PACKET_CONTROL, AFMT, id), \
+       SRI_ARR(AFMT_AUDIO_PACKET_CONTROL2, AFMT, id), \
+       SRI_ARR(AFMT_AUDIO_SRC_CONTROL, AFMT, id), \
+       SRI_ARR(AFMT_60958_0, AFMT, id), \
+       SRI_ARR(AFMT_60958_1, AFMT, id), \
+       SRI_ARR(AFMT_60958_2, AFMT, id), \
+       SRI_ARR(AFMT_MEM_PWR, AFMT, id)
+
+/* Stream encoder */
+#define SE_DCN35_REG_LIST_RI(id) \
+       SRI_ARR(AFMT_CNTL, DIG, id), \
+       SRI_ARR(DIG_FE_CNTL, DIG, id), \
+       SRI_ARR(HDMI_CONTROL, DIG, id), \
+       SRI_ARR(HDMI_DB_CONTROL, DIG, id), \
+       SRI_ARR(HDMI_GC, DIG, id), \
+       SRI_ARR(HDMI_GENERIC_PACKET_CONTROL0, DIG, id), \
+       SRI_ARR(HDMI_GENERIC_PACKET_CONTROL1, DIG, id), \
+       SRI_ARR(HDMI_GENERIC_PACKET_CONTROL2, DIG, id), \
+       SRI_ARR(HDMI_GENERIC_PACKET_CONTROL3, DIG, id), \
+       SRI_ARR(HDMI_GENERIC_PACKET_CONTROL4, DIG, id), \
+       SRI_ARR(HDMI_GENERIC_PACKET_CONTROL5, DIG, id), \
+       SRI_ARR(HDMI_GENERIC_PACKET_CONTROL6, DIG, id), \
+       SRI_ARR(HDMI_GENERIC_PACKET_CONTROL7, DIG, id), \
+       SRI_ARR(HDMI_GENERIC_PACKET_CONTROL8, DIG, id), \
+       SRI_ARR(HDMI_GENERIC_PACKET_CONTROL9, DIG, id), \
+       SRI_ARR(HDMI_GENERIC_PACKET_CONTROL10, DIG, id), \
+       SRI_ARR(HDMI_INFOFRAME_CONTROL0, DIG, id), \
+       SRI_ARR(HDMI_INFOFRAME_CONTROL1, DIG, id), \
+       SRI_ARR(HDMI_VBI_PACKET_CONTROL, DIG, id), \
+       SRI_ARR(HDMI_AUDIO_PACKET_CONTROL, DIG, id),\
+       SRI_ARR(HDMI_ACR_PACKET_CONTROL, DIG, id),\
+       SRI_ARR(HDMI_ACR_32_0, DIG, id),\
+       SRI_ARR(HDMI_ACR_32_1, DIG, id),\
+       SRI_ARR(HDMI_ACR_44_0, DIG, id),\
+       SRI_ARR(HDMI_ACR_44_1, DIG, id),\
+       SRI_ARR(HDMI_ACR_48_0, DIG, id),\
+       SRI_ARR(HDMI_ACR_48_1, DIG, id),\
+       SRI_ARR(DP_DB_CNTL, DP, id), \
+       SRI_ARR(DP_MSA_MISC, DP, id), \
+       SRI_ARR(DP_MSA_VBID_MISC, DP, id), \
+       SRI_ARR(DP_MSA_COLORIMETRY, DP, id), \
+       SRI_ARR(DP_MSA_TIMING_PARAM1, DP, id), \
+       SRI_ARR(DP_MSA_TIMING_PARAM2, DP, id), \
+       SRI_ARR(DP_MSA_TIMING_PARAM3, DP, id), \
+       SRI_ARR(DP_MSA_TIMING_PARAM4, DP, id), \
+       SRI_ARR(DP_MSE_RATE_CNTL, DP, id), \
+       SRI_ARR(DP_MSE_RATE_UPDATE, DP, id), \
+       SRI_ARR(DP_PIXEL_FORMAT, DP, id), \
+       SRI_ARR(DP_SEC_CNTL, DP, id), \
+       SRI_ARR(DP_SEC_CNTL1, DP, id), \
+       SRI_ARR(DP_SEC_CNTL2, DP, id), \
+       SRI_ARR(DP_SEC_CNTL5, DP, id), \
+       SRI_ARR(DP_SEC_CNTL6, DP, id), \
+       SRI_ARR(DP_STEER_FIFO, DP, id), \
+       SRI_ARR(DP_VID_M, DP, id), \
+       SRI_ARR(DP_VID_N, DP, id), \
+       SRI_ARR(DP_VID_STREAM_CNTL, DP, id), \
+       SRI_ARR(DP_VID_TIMING, DP, id), \
+       SRI_ARR(DP_SEC_AUD_N, DP, id), \
+       SRI_ARR(DP_SEC_TIMESTAMP, DP, id), \
+       SRI_ARR(DP_DSC_CNTL, DP, id), \
+       SRI_ARR(DP_SEC_METADATA_TRANSMISSION, DP, id), \
+       SRI_ARR(HDMI_METADATA_PACKET_CONTROL, DIG, id), \
+       SRI_ARR(DP_SEC_FRAMING4, DP, id), \
+       SRI_ARR(DP_GSP11_CNTL, DP, id), \
+       SRI_ARR(DME_CONTROL, DME, id),\
+       SRI_ARR(DP_SEC_METADATA_TRANSMISSION, DP, id), \
+       SRI_ARR(HDMI_METADATA_PACKET_CONTROL, DIG, id), \
+       SRI_ARR(DIG_FE_CNTL, DIG, id), \
+       SRI_ARR(DIG_FE_EN_CNTL, DIG, id), \
+       SRI_ARR(DIG_FE_CLK_CNTL, DIG, id), \
+       SRI_ARR(DIG_CLOCK_PATTERN, DIG, id), \
+       SRI_ARR(DIG_FIFO_CTRL0, DIG, id), \
+       SRI_ARR(STREAM_MAPPER_CONTROL, DIG, id)
+
+#define LE_DCN35_REG_LIST_RI(id)\
+       LE_DCN3_REG_LIST_RI(id),\
+       SRI_ARR(DP_DPHY_INTERNAL_CTRL, DP, id), \
+       SR_ARR(DIO_LINKA_CNTL, id), \
+       SR_ARR(DIO_LINKB_CNTL, id), \
+       SR_ARR(DIO_LINKC_CNTL, id), \
+       SR_ARR(DIO_LINKD_CNTL, id), \
+       SR_ARR(DIO_LINKE_CNTL, id), \
+       SR_ARR(DIO_LINKF_CNTL, id),\
+       SRI_ARR(DIG_BE_CLK_CNTL, DIG, id),\
+       SR_ARR(DIO_CLK_CNTL, id)
+
+#define MCIF_WB_COMMON_REG_LIST_DCN3_5_RI(inst)  \
+       MCIF_WB_COMMON_REG_LIST_DCN32_RI(inst), \
+               SRI2_ARR(MMHUBBUB_CLOCK_CNTL, MMHUBBUB, inst)
+
+#define HWSEQ_DCN35_REG_LIST()\
+       SR(DCHUBBUB_GLOBAL_TIMER_CNTL), \
+       SR(DCHUBBUB_ARB_HOSTVM_CNTL), \
+       SR(DIO_MEM_PWR_CTRL), \
+       SR(ODM_MEM_PWR_CTRL3), \
+       SR(MMHUBBUB_MEM_PWR_CNTL), \
+       SR(DCCG_GATE_DISABLE_CNTL), \
+       SR(DCCG_GATE_DISABLE_CNTL2), \
+       SR(DCCG_GATE_DISABLE_CNTL5), \
+       SR(DCFCLK_CNTL),\
+       SR(DC_MEM_GLOBAL_PWR_REQ_CNTL), \
+       SRII(PIXEL_RATE_CNTL, OTG, 0), \
+       SRII(PIXEL_RATE_CNTL, OTG, 1),\
+       SRII(PIXEL_RATE_CNTL, OTG, 2),\
+       SRII(PIXEL_RATE_CNTL, OTG, 3),\
+       SRII(PHYPLL_PIXEL_RATE_CNTL, OTG, 0),\
+       SRII(PHYPLL_PIXEL_RATE_CNTL, OTG, 1),\
+       SRII(PHYPLL_PIXEL_RATE_CNTL, OTG, 2),\
+       SRII(PHYPLL_PIXEL_RATE_CNTL, OTG, 3),\
+       SR(MICROSECOND_TIME_BASE_DIV), \
+       SR(MILLISECOND_TIME_BASE_DIV), \
+       SR(DISPCLK_FREQ_CHANGE_CNTL), \
+       SR(RBBMIF_TIMEOUT_DIS), \
+       SR(RBBMIF_TIMEOUT_DIS_2), \
+       SR(DCHUBBUB_CRC_CTRL), \
+       SR(DPP_TOP0_DPP_CRC_CTRL), \
+       SR(DPP_TOP0_DPP_CRC_VAL_B_A), \
+       SR(DPP_TOP0_DPP_CRC_VAL_R_G), \
+       SR(MPC_CRC_CTRL), \
+       SR(MPC_CRC_RESULT_GB), \
+       SR(MPC_CRC_RESULT_C), \
+       SR(MPC_CRC_RESULT_AR), \
+       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(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(DC_IP_REQUEST_CNTL), \
+       SR(AZALIA_AUDIO_DTO), \
+       SR(AZALIA_CONTROLLER_CLOCK_GATING), \
+       SR(HPO_TOP_HW_CONTROL),\
+       SR(DMU_CLK_CNTL)
+
+/* OPTC */
+#define OPTC_COMMON_REG_LIST_DCN3_5_RI(inst)                                   \
+       SRI_ARR(OTG_VSTARTUP_PARAM, OTG, inst),\
+       SRI_ARR(OTG_VUPDATE_PARAM, OTG, inst),\
+       SRI_ARR(OTG_VREADY_PARAM, OTG, inst),\
+       SRI_ARR(OTG_MASTER_UPDATE_LOCK, OTG, inst),\
+       SRI_ARR(OTG_GLOBAL_CONTROL0, OTG, inst),\
+       SRI_ARR(OTG_GLOBAL_CONTROL1, OTG, inst),\
+       SRI_ARR(OTG_GLOBAL_CONTROL2, OTG, inst),\
+       SRI_ARR(OTG_GLOBAL_CONTROL4, OTG, inst),\
+       SRI_ARR(OTG_DOUBLE_BUFFER_CONTROL, OTG, inst),\
+       SRI_ARR(OTG_H_TOTAL, OTG, inst),\
+       SRI_ARR(OTG_H_BLANK_START_END, OTG, inst),\
+       SRI_ARR(OTG_H_SYNC_A, OTG, inst),\
+       SRI_ARR(OTG_H_SYNC_A_CNTL, OTG, inst),\
+       SRI_ARR(OTG_H_TIMING_CNTL, OTG, inst),\
+       SRI_ARR(OTG_V_TOTAL, OTG, inst),\
+       SRI_ARR(OTG_V_BLANK_START_END, OTG, inst),\
+       SRI_ARR(OTG_V_SYNC_A, OTG, inst),\
+       SRI_ARR(OTG_V_SYNC_A_CNTL, OTG, inst),\
+       SRI_ARR(OTG_CONTROL, OTG, inst),\
+       SRI_ARR(OTG_STEREO_CONTROL, OTG, inst),\
+       SRI_ARR(OTG_3D_STRUCTURE_CONTROL, OTG, inst),\
+       SRI_ARR(OTG_STEREO_STATUS, OTG, inst),\
+       SRI_ARR(OTG_V_TOTAL_MAX, OTG, inst),\
+       SRI_ARR(OTG_V_TOTAL_MIN, OTG, inst),\
+       SRI_ARR(OTG_V_TOTAL_CONTROL, OTG, inst),\
+       SRI_ARR(OTG_TRIGA_CNTL, OTG, inst),\
+       SRI_ARR(OTG_FORCE_COUNT_NOW_CNTL, OTG, inst),\
+       SRI_ARR(OTG_STATIC_SCREEN_CONTROL, OTG, inst),\
+       SRI_ARR(OTG_STATUS_FRAME_COUNT, OTG, inst),\
+       SRI_ARR(OTG_STATUS, OTG, inst),\
+       SRI_ARR(OTG_STATUS_POSITION, OTG, inst),\
+       SRI_ARR(OTG_NOM_VERT_POSITION, OTG, inst),\
+       SRI_ARR(OTG_M_CONST_DTO0, OTG, inst),\
+       SRI_ARR(OTG_M_CONST_DTO1, OTG, inst),\
+       SRI_ARR(OTG_CLOCK_CONTROL, OTG, inst),\
+       SRI_ARR(OTG_VERTICAL_INTERRUPT0_CONTROL, OTG, inst),\
+       SRI_ARR(OTG_VERTICAL_INTERRUPT0_POSITION, OTG, inst),\
+       SRI_ARR(OTG_VERTICAL_INTERRUPT1_CONTROL, OTG, inst),\
+       SRI_ARR(OTG_VERTICAL_INTERRUPT1_POSITION, OTG, inst),\
+       SRI_ARR(OTG_VERTICAL_INTERRUPT2_CONTROL, OTG, inst),\
+       SRI_ARR(OTG_VERTICAL_INTERRUPT2_POSITION, OTG, inst),\
+       SRI_ARR(OPTC_INPUT_CLOCK_CONTROL, ODM, inst),\
+       SRI_ARR(OPTC_DATA_SOURCE_SELECT, ODM, inst),\
+       SRI_ARR(OPTC_INPUT_GLOBAL_CONTROL, ODM, inst),\
+       SRI_ARR(CONTROL, VTG, inst),\
+       SRI_ARR(OTG_VERT_SYNC_CONTROL, OTG, inst),\
+       SRI_ARR(OTG_GSL_CONTROL, OTG, inst),\
+       SRI_ARR(OTG_CRC_CNTL, OTG, inst),\
+       SRI_ARR(OTG_CRC0_DATA_RG, OTG, inst),\
+       SRI_ARR(OTG_CRC0_DATA_B, OTG, inst),\
+       SRI_ARR(OTG_CRC1_DATA_RG, OTG, inst),\
+       SRI_ARR(OTG_CRC1_DATA_B, OTG, inst),\
+       SRI_ARR(OTG_CRC2_DATA_RG, OTG, inst),\
+       SRI_ARR(OTG_CRC2_DATA_B, OTG, inst),\
+       SRI_ARR(OTG_CRC3_DATA_RG, OTG, inst),\
+       SRI_ARR(OTG_CRC3_DATA_B, OTG, inst),\
+       SRI_ARR(OTG_CRC0_WINDOWA_X_CONTROL, OTG, inst),\
+       SRI_ARR(OTG_CRC0_WINDOWA_Y_CONTROL, OTG, inst),\
+       SRI_ARR(OTG_CRC0_WINDOWB_X_CONTROL, OTG, inst),\
+       SRI_ARR(OTG_CRC0_WINDOWB_Y_CONTROL, OTG, inst),\
+       SRI_ARR(OTG_CRC1_WINDOWA_X_CONTROL, OTG, inst),\
+       SRI_ARR(OTG_CRC1_WINDOWA_Y_CONTROL, OTG, inst),\
+       SRI_ARR(OTG_CRC1_WINDOWB_X_CONTROL, OTG, inst),\
+       SRI_ARR(OTG_CRC1_WINDOWB_Y_CONTROL, OTG, inst),\
+       SRI_ARR(OTG_CRC0_WINDOWA_X_CONTROL_READBACK, OTG, inst),\
+       SRI_ARR(OTG_CRC0_WINDOWA_Y_CONTROL_READBACK, OTG, inst),\
+       SRI_ARR(OTG_CRC0_WINDOWB_X_CONTROL_READBACK, OTG, inst),\
+       SRI_ARR(OTG_CRC0_WINDOWB_Y_CONTROL_READBACK, OTG, inst),\
+       SRI_ARR(OTG_CRC1_WINDOWA_X_CONTROL_READBACK, OTG, inst),\
+       SRI_ARR(OTG_CRC1_WINDOWA_Y_CONTROL_READBACK, OTG, inst),\
+       SRI_ARR(OTG_CRC1_WINDOWB_X_CONTROL_READBACK, OTG, inst),\
+       SRI_ARR(OTG_CRC1_WINDOWB_Y_CONTROL_READBACK, OTG, inst),\
+       SR_ARR(GSL_SOURCE_SELECT, inst),\
+       SRI_ARR(OTG_TRIGA_MANUAL_TRIG, OTG, inst),\
+       SRI_ARR(OTG_GLOBAL_CONTROL1, OTG, inst),\
+       SRI_ARR(OTG_GLOBAL_CONTROL2, OTG, inst),\
+       SRI_ARR(OTG_GSL_WINDOW_X, OTG, inst),\
+       SRI_ARR(OTG_GSL_WINDOW_Y, OTG, inst),\
+       SRI_ARR(OTG_VUPDATE_KEEPOUT, OTG, inst),\
+       SRI_ARR(OTG_DSC_START_POSITION, OTG, inst),\
+       SRI_ARR(OTG_DRR_TRIGGER_WINDOW, OTG, inst),\
+       SRI_ARR(OTG_DRR_V_TOTAL_CHANGE, OTG, inst),\
+       SRI_ARR(OPTC_DATA_FORMAT_CONTROL, ODM, inst),\
+       SRI_ARR(OPTC_BYTES_PER_PIXEL, ODM, inst),\
+       SRI_ARR(OPTC_WIDTH_CONTROL, ODM, inst),\
+       SRI_ARR(OPTC_MEMORY_CONFIG, ODM, inst),\
+       SRI_ARR(OTG_DRR_CONTROL, OTG, inst),\
+       SRI2_ARR(OPTC_CLOCK_CONTROL, OPTC, inst)
+
+/* DPP */
+#define DPP_REG_LIST_DCN35_RI(id)\
+       DPP_REG_LIST_DCN30_COMMON_RI(id)
+
+#endif /* _DCN35_RESOURCE_H_ */