diff options
Diffstat (limited to 'meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/0388-drm-amdgpu-display-Add-core-dc-support-for-DCN.patch')
-rw-r--r-- | meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/0388-drm-amdgpu-display-Add-core-dc-support-for-DCN.patch | 11618 |
1 files changed, 0 insertions, 11618 deletions
diff --git a/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/0388-drm-amdgpu-display-Add-core-dc-support-for-DCN.patch b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/0388-drm-amdgpu-display-Add-core-dc-support-for-DCN.patch deleted file mode 100644 index 01eb30ca..00000000 --- a/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/0388-drm-amdgpu-display-Add-core-dc-support-for-DCN.patch +++ /dev/null @@ -1,11618 +0,0 @@ -From d81caffeb3ad1097f220cd3dbf8470ad6e45d873 Mon Sep 17 00:00:00 2001 -From: Harry Wentland <harry.wentland@amd.com> -Date: Mon, 8 May 2017 15:19:06 -0400 -Subject: [PATCH 0388/4131] drm/amdgpu/display: Add core dc support for DCN - -Core display support for DCN. - -Signed-off-by: Harry Wentland <harry.wentland@amd.com> -Signed-off-by: Alex Deucher <alexander.deucher@amd.com> ---- - drivers/gpu/drm/amd/display/dc/dcn10/Makefile | 10 + - .../drm/amd/display/dc/dcn10/dcn10_hw_sequencer.c | 1866 ++++++++++++++++++++ - .../drm/amd/display/dc/dcn10/dcn10_hw_sequencer.h | 38 + - drivers/gpu/drm/amd/display/dc/dcn10/dcn10_ipp.c | 883 +++++++++ - drivers/gpu/drm/amd/display/dc/dcn10/dcn10_ipp.h | 549 ++++++ - .../gpu/drm/amd/display/dc/dcn10/dcn10_mem_input.c | 1102 ++++++++++++ - .../gpu/drm/amd/display/dc/dcn10/dcn10_mem_input.h | 553 ++++++ - drivers/gpu/drm/amd/display/dc/dcn10/dcn10_mpc.c | 376 ++++ - drivers/gpu/drm/amd/display/dc/dcn10/dcn10_mpc.h | 135 ++ - drivers/gpu/drm/amd/display/dc/dcn10/dcn10_opp.c | 801 +++++++++ - drivers/gpu/drm/amd/display/dc/dcn10/dcn10_opp.h | 622 +++++++ - .../gpu/drm/amd/display/dc/dcn10/dcn10_resource.c | 1475 ++++++++++++++++ - .../gpu/drm/amd/display/dc/dcn10/dcn10_resource.h | 47 + - .../amd/display/dc/dcn10/dcn10_timing_generator.c | 1202 +++++++++++++ - .../amd/display/dc/dcn10/dcn10_timing_generator.h | 335 ++++ - .../gpu/drm/amd/display/dc/dcn10/dcn10_transform.c | 1057 +++++++++++ - .../gpu/drm/amd/display/dc/dcn10/dcn10_transform.h | 416 +++++ - 17 files changed, 11467 insertions(+) - create mode 100644 drivers/gpu/drm/amd/display/dc/dcn10/Makefile - create mode 100644 drivers/gpu/drm/amd/display/dc/dcn10/dcn10_hw_sequencer.c - create mode 100644 drivers/gpu/drm/amd/display/dc/dcn10/dcn10_hw_sequencer.h - create mode 100644 drivers/gpu/drm/amd/display/dc/dcn10/dcn10_ipp.c - create mode 100644 drivers/gpu/drm/amd/display/dc/dcn10/dcn10_ipp.h - create mode 100644 drivers/gpu/drm/amd/display/dc/dcn10/dcn10_mem_input.c - create mode 100644 drivers/gpu/drm/amd/display/dc/dcn10/dcn10_mem_input.h - create mode 100644 drivers/gpu/drm/amd/display/dc/dcn10/dcn10_mpc.c - create mode 100644 drivers/gpu/drm/amd/display/dc/dcn10/dcn10_mpc.h - create mode 100644 drivers/gpu/drm/amd/display/dc/dcn10/dcn10_opp.c - create mode 100644 drivers/gpu/drm/amd/display/dc/dcn10/dcn10_opp.h - create mode 100644 drivers/gpu/drm/amd/display/dc/dcn10/dcn10_resource.c - create mode 100644 drivers/gpu/drm/amd/display/dc/dcn10/dcn10_resource.h - create mode 100644 drivers/gpu/drm/amd/display/dc/dcn10/dcn10_timing_generator.c - create mode 100644 drivers/gpu/drm/amd/display/dc/dcn10/dcn10_timing_generator.h - create mode 100644 drivers/gpu/drm/amd/display/dc/dcn10/dcn10_transform.c - create mode 100644 drivers/gpu/drm/amd/display/dc/dcn10/dcn10_transform.h - -diff --git a/drivers/gpu/drm/amd/display/dc/dcn10/Makefile b/drivers/gpu/drm/amd/display/dc/dcn10/Makefile -new file mode 100644 -index 0000000..2c43ad7 ---- /dev/null -+++ b/drivers/gpu/drm/amd/display/dc/dcn10/Makefile -@@ -0,0 +1,10 @@ -+# -+# Makefile for DCN. -+ -+DCN10 = dcn10_resource.o dcn10_ipp.o dcn10_hw_sequencer.o \ -+ dcn10_transform.o dcn10_opp.o dcn10_timing_generator.o \ -+ dcn10_mem_input.o dcn10_mpc.o -+ -+AMD_DAL_DCN10 = $(addprefix $(AMDDALPATH)/dc/dcn10/,$(DCN10)) -+ -+AMD_DISPLAY_FILES += $(AMD_DAL_DCN10) -diff --git a/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_hw_sequencer.c b/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_hw_sequencer.c -new file mode 100644 -index 0000000..fb4eb43 ---- /dev/null -+++ b/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_hw_sequencer.c -@@ -0,0 +1,1866 @@ -+/* -+ * 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 "core_dc.h" -+#include "core_types.h" -+#include "core_status.h" -+#include "resource.h" -+#include "hw_sequencer.h" -+#include "dcn10_hw_sequencer.h" -+#include "dce110/dce110_hw_sequencer.h" -+#include "abm.h" -+ -+#include "dcn10/dcn10_transform.h" -+#include "dcn10/dcn10_mpc.h" -+#include "dcn10/dcn10_timing_generator.h" -+ -+#include "mem_input.h" -+#include "timing_generator.h" -+#include "opp.h" -+#include "ipp.h" -+ -+#include "dc_bios_types.h" -+ -+#include "raven1/DCN/dcn_1_0_offset.h" -+#include "raven1/DCN/dcn_1_0_sh_mask.h" -+#include "vega10/soc15ip.h" -+ -+#include "custom_float.h" -+ -+ -+struct dcn10_hwseq_reg_offsets { -+ uint32_t dchubp; -+ uint32_t dpp; -+ uint32_t otg; -+ uint32_t vtg; -+ uint32_t fmt; -+}; -+ -+/* TODO: move to resource */ -+static const struct dcn10_hwseq_reg_offsets reg_offsets[] = { -+ { -+ .dchubp = (mmHUBP0_DCHUBP_CNTL - mmHUBP0_DCHUBP_CNTL), -+ .dpp = (mmCM0_CM_DGAM_CONTROL - mmCM0_CM_DGAM_CONTROL), -+ .otg = (mmOTG0_OTG_CONTROL - mmOTG0_OTG_CONTROL), -+ .vtg = (mmVTG0_CONTROL - mmVTG0_CONTROL), -+ .fmt = (mmFMT0_FMT_BIT_DEPTH_CONTROL - -+ mmFMT0_FMT_BIT_DEPTH_CONTROL), -+ }, -+ { -+ .dchubp = (mmHUBP1_DCHUBP_CNTL - mmHUBP0_DCHUBP_CNTL), -+ .dpp = (mmCM1_CM_DGAM_CONTROL - mmCM0_CM_DGAM_CONTROL), -+ .otg = (mmOTG1_OTG_CONTROL - mmOTG0_OTG_CONTROL), -+ .vtg = (mmVTG1_CONTROL - mmVTG0_CONTROL), -+ .fmt = (mmFMT1_FMT_BIT_DEPTH_CONTROL - -+ mmFMT0_FMT_BIT_DEPTH_CONTROL), -+ }, -+ { -+ .dchubp = (mmHUBP2_DCHUBP_CNTL - mmHUBP0_DCHUBP_CNTL), -+ .dpp = (mmCM2_CM_DGAM_CONTROL - mmCM0_CM_DGAM_CONTROL), -+ .otg = (mmOTG2_OTG_CONTROL - mmOTG0_OTG_CONTROL), -+ .vtg = (mmVTG2_CONTROL - mmVTG0_CONTROL), -+ .fmt = (mmFMT2_FMT_BIT_DEPTH_CONTROL - -+ mmFMT0_FMT_BIT_DEPTH_CONTROL), -+ }, -+ { -+ .dchubp = (mmHUBP3_DCHUBP_CNTL - mmHUBP0_DCHUBP_CNTL), -+ .dpp = (mmCM3_CM_DGAM_CONTROL - mmCM0_CM_DGAM_CONTROL), -+ .otg = (mmOTG3_OTG_CONTROL - mmOTG0_OTG_CONTROL), -+ .vtg = (mmVTG3_CONTROL - mmVTG0_CONTROL), -+ .fmt = (mmFMT3_FMT_BIT_DEPTH_CONTROL - -+ mmFMT0_FMT_BIT_DEPTH_CONTROL), -+ } -+}; -+ -+#define HWSEQ_REG_UPDATE_N(reg_name, n, ...) \ -+ generic_reg_update_soc15(ctx, inst_offset, reg_name, n, __VA_ARGS__) -+ -+#define HWSEQ_REG_SET_N(reg_name, n, ...) \ -+ generic_reg_set_soc15(ctx, inst_offset, reg_name, n, __VA_ARGS__) -+ -+#define HWSEQ_REG_UPDATE(reg, field, val) \ -+ HWSEQ_REG_UPDATE_N(reg, 1, FD(reg##__##field), val) -+ -+#define HWSEQ_REG_UPDATE_2(reg, field1, val1, field2, val2) \ -+ HWSEQ_REG_UPDATE_N(reg, 2, FD(reg##__##field1), val1, FD(reg##__##field2), val2) -+ -+#define HWSEQ_REG_UPDATE_3(reg, field1, val1, field2, val2, field3, val3) \ -+ HWSEQ_REG_UPDATE_N(reg, 2, FD(reg##__##field1), val1, FD(reg##__##field2), val2, FD(reg##__##field3), val3) -+ -+ -+#define HWSEQ_REG_SET(reg, field, val) \ -+ HWSEQ_REG_SET_N(reg, 1, FD(reg##__##field), val) -+ -+/* TODO should be moved to OTG */ -+static void lock_otg_master_update( -+ struct dc_context *ctx, -+ uint8_t inst) -+{ -+ uint32_t inst_offset = reg_offsets[inst].otg; -+ -+ HWSEQ_REG_UPDATE(OTG0_OTG_GLOBAL_CONTROL0, -+ OTG_MASTER_UPDATE_LOCK_SEL, inst); -+ -+ /* unlock master locker */ -+ HWSEQ_REG_UPDATE(OTG0_OTG_MASTER_UPDATE_LOCK, -+ OTG_MASTER_UPDATE_LOCK, 1); -+ -+ /* wait for unlock happens */ -+ if (!wait_reg(ctx, inst_offset, OTG0_OTG_MASTER_UPDATE_LOCK, UPDATE_LOCK_STATUS, 1)) -+ BREAK_TO_DEBUGGER(); -+ -+} -+ -+static bool unlock_master_tg_and_wait( -+ struct dc_context *ctx, -+ uint8_t inst) -+{ -+ uint32_t inst_offset = reg_offsets[inst].otg; -+ -+ HWSEQ_REG_UPDATE(OTG0_OTG_GLOBAL_SYNC_STATUS, -+ VUPDATE_NO_LOCK_EVENT_CLEAR, 1); -+ HWSEQ_REG_UPDATE(OTG0_OTG_MASTER_UPDATE_LOCK, OTG_MASTER_UPDATE_LOCK, 0); -+ -+ if (!wait_reg(ctx, inst_offset, OTG0_OTG_GLOBAL_SYNC_STATUS, VUPDATE_NO_LOCK_EVENT_OCCURRED, 1)) { -+ dm_logger_write(ctx->logger, LOG_ERROR, -+ "wait for VUPDATE_NO_LOCK_EVENT_OCCURRED failed\n"); -+ BREAK_TO_DEBUGGER(); -+ return false; -+ } -+ return true; -+} -+ -+/* TODO: should be moved to OTG ? */ -+static void unlock_otg_master( -+ struct dc_context *ctx, -+ uint8_t inst) -+{ -+ uint32_t inst_offset = reg_offsets[inst].otg; -+ -+ /* unlock master locker */ -+ HWSEQ_REG_UPDATE(OTG0_OTG_MASTER_UPDATE_LOCK, -+ OTG_MASTER_UPDATE_LOCK, 0); -+} -+ -+ -+static void wait_no_outstanding_request( -+ struct dc_context *ctx, -+ uint8_t plane_id) -+{ -+ uint32_t inst_offset = reg_offsets[plane_id].dchubp; -+ -+ if (!wait_reg(ctx, inst_offset, HUBP0_DCHUBP_CNTL, HUBP_NO_OUTSTANDING_REQ, 1)) -+ BREAK_TO_DEBUGGER(); -+} -+ -+static void disable_clocks( -+ struct dc_context *ctx, -+ uint8_t plane_id) -+{ -+ uint32_t inst_offset = reg_offsets[plane_id].dchubp; -+ -+ generic_reg_update_soc15(ctx, inst_offset, HUBP0_HUBP_CLK_CNTL, 1, -+ FD(HUBP0_HUBP_CLK_CNTL__HUBP_CLOCK_ENABLE), 0); -+ -+ inst_offset = reg_offsets[plane_id].dpp; -+ generic_reg_update_soc15(ctx, inst_offset, DPP_TOP0_DPP_CONTROL, 1, -+ FD(DPP_TOP0_DPP_CONTROL__DPP_CLOCK_ENABLE), 0); -+} -+ -+/* TODO: This is one time program during system boot up, -+ * this should be done within BIOS or CAIL -+ */ -+static void dchubp_map_fb_to_mc(struct dc_context *ctx) -+{ -+ /* TODO: do not know where to program -+ * DCN_VM_SYSTEM_APERTURE_LOW_ADDR_LSB -+ */ -+ /* -+ * TODO: For real ASIC, FB_OFFSET may be need change to the same value -+ * as FB_BASE. Need re-visit this for real ASIC. -+ */ -+ dm_write_reg_soc15(ctx, mmDCHUBBUB_SDPIF_FB_BASE, 0, 0x80); -+ dm_write_reg_soc15(ctx, mmDCHUBBUB_SDPIF_FB_OFFSET, 0, 0); -+ dm_write_reg_soc15(ctx, mmDCHUBBUB_SDPIF_FB_TOP, 0, 0xFF); -+ -+ generic_reg_set_soc15(ctx, 0, DCHUBBUB_SDPIF_CFG0, 7, -+ FD(DCHUBBUB_SDPIF_CFG0__SDPIF_DATA_RESPONSE_STATUS_CLEAR), 0, -+ FD(DCHUBBUB_SDPIF_CFG0__SDPIF_REQ_CREDIT_ERROR_CLEAR), 0, -+ FD(DCHUBBUB_SDPIF_CFG0__SDPIF_FLUSH_REQ_CREDIT_EN), 0, -+ FD(DCHUBBUB_SDPIF_CFG0__SDPIF_REQ_CREDIT_EN), 0, -+ FD(DCHUBBUB_SDPIF_CFG0__SDPIF_PORT_CONTROL), 1, -+ FD(DCHUBBUB_SDPIF_CFG0__SDPIF_UNIT_ID_BITMASK), 0xd3, -+ FD(DCHUBBUB_SDPIF_CFG0__SDPIF_CREDIT_DISCONNECT_DELAY), 0xc); -+ -+ -+ generic_reg_set_soc15(ctx, 0, DCHUBBUB_SDPIF_CFG1, 4, -+ FD(DCHUBBUB_SDPIF_CFG1__SDPIF_INSIDE_FB_IO), 0, -+ FD(DCHUBBUB_SDPIF_CFG1__SDPIF_INSIDE_FB_VC), 6, -+ FD(DCHUBBUB_SDPIF_CFG1__SDPIF_OUTSIDE_FB_IO), 1, -+ FD(DCHUBBUB_SDPIF_CFG1__SDPIF_OUTSIDE_FB_VC), 6); -+ -+ generic_reg_set_soc15(ctx, 0, DCHUBBUB_SDPIF_FB_BASE, 1, -+ FD(DCHUBBUB_SDPIF_FB_BASE__SDPIF_FB_BASE), 0x000080); -+ -+ generic_reg_set_soc15(ctx, 0, DCHUBBUB_SDPIF_FB_TOP, 1, -+ FD(DCHUBBUB_SDPIF_FB_TOP__SDPIF_FB_TOP), 0x0000ff); -+ -+ generic_reg_set_soc15(ctx, 0, DCHUBBUB_SDPIF_AGP_BOT, 1, -+ FD(DCHUBBUB_SDPIF_AGP_BOT__SDPIF_AGP_BOT), 0x0000040); -+ -+ generic_reg_set_soc15(ctx, 0, DCHUBBUB_SDPIF_AGP_TOP, 1, -+ FD(DCHUBBUB_SDPIF_AGP_TOP__SDPIF_AGP_TOP), 0x00001ff); -+ -+ generic_reg_set_soc15(ctx, 0, DCHUBBUB_SDPIF_AGP_BASE, 1, -+ FD(DCHUBBUB_SDPIF_AGP_BASE__SDPIF_AGP_BASE), 0x0000080); -+ -+ generic_reg_set_soc15(ctx, 0, DCHUBBUB_SDPIF_APER_TOP, 1, -+ FD(DCHUBBUB_SDPIF_APER_TOP__SDPIF_APER_TOP), 0x00007ff); -+ -+ generic_reg_set_soc15(ctx, 0, DCHUBBUB_SDPIF_APER_DEF_0, 1, -+ FD(DCHUBBUB_SDPIF_APER_DEF_0__SDPIF_APER_DEF_0), 0xdeadbeef); -+ -+ generic_reg_set_soc15(ctx, 0, DCHUBBUB_SDPIF_MARC_RELOC_LO_0, 2, -+ FD(DCHUBBUB_SDPIF_MARC_RELOC_LO_0__SDPIF_MARC_EN_0), 0, -+ FD(DCHUBBUB_SDPIF_MARC_RELOC_LO_0__SDPIF_MARC_RELOC_LO_0), 0x90000); -+ -+ generic_reg_set_soc15(ctx, 0, DCHUBBUB_SDPIF_MARC_LENGTH_LO_0, 1, -+ FD(DCHUBBUB_SDPIF_MARC_LENGTH_LO_0__SDPIF_MARC_LENGTH_LO_0), 0x10000); -+ -+ generic_reg_set_soc15(ctx, 0, DCHUBBUB_SDPIF_MARC_BASE_LO_1, 1, -+ FD(DCHUBBUB_SDPIF_MARC_BASE_LO_1__SDPIF_MARC_BASE_LO_1), 0x10000); -+ -+ generic_reg_set_soc15(ctx, 0, DCHUBBUB_SDPIF_MARC_RELOC_LO_1, 2, -+ FD(DCHUBBUB_SDPIF_MARC_RELOC_LO_1__SDPIF_MARC_EN_1), 0, -+ FD(DCHUBBUB_SDPIF_MARC_RELOC_LO_1__SDPIF_MARC_RELOC_LO_1), 0xa0000); -+ -+ generic_reg_set_soc15(ctx, 0, DCHUBBUB_SDPIF_MARC_LENGTH_LO_1, 1, -+ FD(DCHUBBUB_SDPIF_MARC_LENGTH_LO_1__SDPIF_MARC_LENGTH_LO_1), 0x10000); -+ -+ generic_reg_set_soc15(ctx, 0, DCHUBBUB_SDPIF_MARC_BASE_LO_2, 1, -+ FD(DCHUBBUB_SDPIF_MARC_BASE_LO_2__SDPIF_MARC_BASE_LO_2), 0x20000); -+ -+ generic_reg_set_soc15(ctx, 0, DCHUBBUB_SDPIF_MARC_RELOC_LO_2, 2, -+ FD(DCHUBBUB_SDPIF_MARC_RELOC_LO_2__SDPIF_MARC_EN_2), 0, -+ FD(DCHUBBUB_SDPIF_MARC_RELOC_LO_2__SDPIF_MARC_RELOC_LO_2), 0xb0000); -+ -+ generic_reg_set_soc15(ctx, 0, DCHUBBUB_SDPIF_MARC_LENGTH_LO_2, 1, -+ FD(DCHUBBUB_SDPIF_MARC_LENGTH_LO_2__SDPIF_MARC_LENGTH_LO_2), 0x10000); -+ -+ generic_reg_set_soc15(ctx, 0, DCHUBBUB_SDPIF_MARC_BASE_LO_3, 1, -+ FD(DCHUBBUB_SDPIF_MARC_BASE_LO_3__SDPIF_MARC_BASE_LO_3), 0x30000); -+ -+ generic_reg_set_soc15(ctx, 0, DCHUBBUB_SDPIF_MARC_RELOC_LO_3, 2, -+ FD(DCHUBBUB_SDPIF_MARC_RELOC_LO_3__SDPIF_MARC_EN_3), 0, -+ FD(DCHUBBUB_SDPIF_MARC_RELOC_LO_3__SDPIF_MARC_RELOC_LO_3), 0xc0000); -+ -+ generic_reg_set_soc15(ctx, 0, DCHUBBUB_SDPIF_MARC_LENGTH_LO_3, 1, -+ FD(DCHUBBUB_SDPIF_MARC_LENGTH_LO_3__SDPIF_MARC_LENGTH_LO_3), 0x10000); -+ -+ /* TODO: Is DCN_VM_SYSTEM_APERTURE address one time programming? -+ * Are all 4 hubp programmed with the same address? -+ */ -+ dm_write_reg_soc15(ctx, mmHUBPREQ0_DCN_VM_SYSTEM_APERTURE_LOW_ADDR_LSB, 0, 0x80000); -+ dm_write_reg_soc15(ctx, mmHUBPREQ0_DCN_VM_SYSTEM_APERTURE_LOW_ADDR_MSB, 0, 0); -+ dm_write_reg_soc15(ctx, mmHUBPREQ0_DCN_VM_SYSTEM_APERTURE_HIGH_ADDR_LSB, 0, 0x100000); -+ dm_write_reg_soc15(ctx, mmHUBPREQ0_DCN_VM_SYSTEM_APERTURE_HIGH_ADDR_MSB, 0, 0); -+ dm_write_reg_soc15(ctx, mmHUBPREQ0_DCN_VM_SYSTEM_APERTURE_DEFAULT_ADDR_LSB, 0, 0x80000); -+ dm_write_reg_soc15(ctx, mmHUBPREQ0_DCN_VM_SYSTEM_APERTURE_DEFAULT_ADDR_MSB, 0, 0); -+ -+ dm_write_reg_soc15(ctx, mmHUBPREQ1_DCN_VM_SYSTEM_APERTURE_LOW_ADDR_LSB, 0, 0x80000); -+ dm_write_reg_soc15(ctx, mmHUBPREQ1_DCN_VM_SYSTEM_APERTURE_LOW_ADDR_MSB, 0, 0); -+ dm_write_reg_soc15(ctx, mmHUBPREQ1_DCN_VM_SYSTEM_APERTURE_HIGH_ADDR_LSB, 0, 0x100000); -+ dm_write_reg_soc15(ctx, mmHUBPREQ1_DCN_VM_SYSTEM_APERTURE_HIGH_ADDR_MSB, 0, 0); -+ dm_write_reg_soc15(ctx, mmHUBPREQ1_DCN_VM_SYSTEM_APERTURE_DEFAULT_ADDR_LSB, 0, 0x80000); -+ dm_write_reg_soc15(ctx, mmHUBPREQ1_DCN_VM_SYSTEM_APERTURE_DEFAULT_ADDR_MSB, 0, 0); -+ -+ dm_write_reg_soc15(ctx, mmHUBPREQ2_DCN_VM_SYSTEM_APERTURE_LOW_ADDR_LSB, 0, 0x80000); -+ dm_write_reg_soc15(ctx, mmHUBPREQ2_DCN_VM_SYSTEM_APERTURE_LOW_ADDR_MSB, 0, 0); -+ dm_write_reg_soc15(ctx, mmHUBPREQ2_DCN_VM_SYSTEM_APERTURE_HIGH_ADDR_LSB, 0, 0x100000); -+ dm_write_reg_soc15(ctx, mmHUBPREQ2_DCN_VM_SYSTEM_APERTURE_HIGH_ADDR_MSB, 0, 0); -+ dm_write_reg_soc15(ctx, mmHUBPREQ2_DCN_VM_SYSTEM_APERTURE_DEFAULT_ADDR_LSB, 0, 0x80000); -+ dm_write_reg_soc15(ctx, mmHUBPREQ2_DCN_VM_SYSTEM_APERTURE_DEFAULT_ADDR_MSB, 0, 0); -+ -+ dm_write_reg_soc15(ctx, mmHUBPREQ3_DCN_VM_SYSTEM_APERTURE_LOW_ADDR_LSB, 0, 0x80000); -+ dm_write_reg_soc15(ctx, mmHUBPREQ3_DCN_VM_SYSTEM_APERTURE_LOW_ADDR_MSB, 0, 0); -+ dm_write_reg_soc15(ctx, mmHUBPREQ3_DCN_VM_SYSTEM_APERTURE_HIGH_ADDR_LSB, 0, 0x100000); -+ dm_write_reg_soc15(ctx, mmHUBPREQ3_DCN_VM_SYSTEM_APERTURE_HIGH_ADDR_MSB, 0, 0); -+ dm_write_reg_soc15(ctx, mmHUBPREQ3_DCN_VM_SYSTEM_APERTURE_DEFAULT_ADDR_LSB, 0, 0x80000); -+ dm_write_reg_soc15(ctx, mmHUBPREQ3_DCN_VM_SYSTEM_APERTURE_DEFAULT_ADDR_MSB, 0, 0); -+} -+ -+/* TODO: This is one time program during system boot up, -+ * this should be done within BIOS -+ */ -+static void dchubup_setup_timer(struct dc_context *ctx) -+{ -+ dm_write_reg_soc15(ctx, mmREFCLK_CNTL, 0, 0); -+ -+ generic_reg_update_soc15(ctx, 0, DCHUBBUB_GLOBAL_TIMER_CNTL, 1, -+ FD(DCHUBBUB_GLOBAL_TIMER_CNTL__DCHUBBUB_GLOBAL_TIMER_ENABLE), 1); -+} -+ -+/* TODO: Need input parameter to tell current DCHUB pipe tie to which OTG -+ * VTG is within DCHUBBUB which is commond block share by each pipe HUBP. -+ * VTG is 1:1 mapping with OTG. Each pipe HUBP will select which VTG -+ */ -+static void select_vtg( -+ struct dc_context *ctx, -+ uint8_t plane_id, -+ uint8_t inst) -+{ -+ uint32_t inst_offset = reg_offsets[plane_id].dchubp; -+ -+ HWSEQ_REG_UPDATE(HUBP0_DCHUBP_CNTL, HUBP_VTG_SEL, inst); -+} -+ -+static void enable_dcfclk( -+ struct dc_context *ctx, -+ uint8_t plane_id, -+ uint32_t requested_pix_clk, -+ bool dppclk_div) -+{ -+ uint32_t inst_offset = reg_offsets[plane_id].dchubp; -+ -+ HWSEQ_REG_UPDATE(HUBP0_HUBP_CLK_CNTL, HUBP_CLOCK_ENABLE, 1); -+} -+ -+static void enable_dppclk( -+ struct dc_context *ctx, -+ uint8_t plane_id, -+ uint32_t requested_pix_clk, -+ bool dppclk_div) -+{ -+ uint32_t inst_offset = reg_offsets[plane_id].dpp; -+ -+ dm_logger_write(ctx->logger, LOG_SURFACE, -+ "dppclk_rate_control for pipe %d programed to %d\n", -+ plane_id, -+ dppclk_div); -+ -+ /* TODO: find condition for DPP clock to DISPCLK or 1/2 DISPCLK */ -+ if (dppclk_div) { -+ /* 1/2 DISPCLK*/ -+ HWSEQ_REG_UPDATE_2(DPP_TOP0_DPP_CONTROL, -+ DPPCLK_RATE_CONTROL, 1, -+ DPP_CLOCK_ENABLE, 1); -+ } else { -+ /* DISPCLK */ -+ HWSEQ_REG_UPDATE_2(DPP_TOP0_DPP_CONTROL, -+ DPPCLK_RATE_CONTROL, 0, -+ DPP_CLOCK_ENABLE, 1); -+ } -+} -+ -+static void enable_power_gating_plane( -+ struct dc_context *ctx, -+ bool enable) -+{ -+ uint32_t inst_offset = 0; /* each register only has one instance */ -+ bool force_on = 1; /* disable power gating */ -+ -+ if (enable) -+ force_on = 0; -+ -+ /* DCHUBP0/1/2/3 */ -+ HWSEQ_REG_UPDATE(DOMAIN0_PG_CONFIG, DOMAIN0_POWER_FORCEON, force_on); -+ HWSEQ_REG_UPDATE(DOMAIN2_PG_CONFIG, DOMAIN2_POWER_FORCEON, force_on); -+ HWSEQ_REG_UPDATE(DOMAIN4_PG_CONFIG, DOMAIN4_POWER_FORCEON, force_on); -+ HWSEQ_REG_UPDATE(DOMAIN6_PG_CONFIG, DOMAIN6_POWER_FORCEON, force_on); -+ -+ /* DPP0/1/2/3 */ -+ HWSEQ_REG_UPDATE(DOMAIN1_PG_CONFIG, DOMAIN1_POWER_FORCEON, force_on); -+ HWSEQ_REG_UPDATE(DOMAIN3_PG_CONFIG, DOMAIN3_POWER_FORCEON, force_on); -+ HWSEQ_REG_UPDATE(DOMAIN5_PG_CONFIG, DOMAIN5_POWER_FORCEON, force_on); -+ HWSEQ_REG_UPDATE(DOMAIN7_PG_CONFIG, DOMAIN7_POWER_FORCEON, force_on); -+ -+ if (ctx->dc->debug.disable_clock_gate) { -+ /* probably better to just write entire register to 0xffff to -+ * ensure all clock gating is disabled -+ */ -+ HWSEQ_REG_UPDATE_3(DCCG_GATE_DISABLE_CNTL, -+ DISPCLK_R_DCCG_GATE_DISABLE, 1, -+ DPREFCLK_R_DCCG_GATE_DISABLE, 1, -+ REFCLK_R_DIG_GATE_DISABLE, 1); -+ HWSEQ_REG_UPDATE(DCFCLK_CNTL, -+ DCFCLK_GATE_DIS, 1); -+ } -+ -+} -+ -+static void dpp_pg_control( -+ struct dc_context *ctx, -+ unsigned int dpp_inst, -+ bool power_on) -+{ -+ uint32_t inst_offset = 0; -+ uint32_t power_gate = power_on ? 0 : 1; -+ uint32_t pwr_status = power_on ? 0 : 2; -+ -+ if (ctx->dc->debug.disable_dpp_power_gate) -+ return; -+ -+ switch (dpp_inst) { -+ case 0: /* DPP0 */ -+ HWSEQ_REG_UPDATE(DOMAIN1_PG_CONFIG, -+ DOMAIN1_POWER_GATE, power_gate); -+ -+ wait_reg(ctx, 0, DOMAIN1_PG_STATUS, -+ DOMAIN1_PGFSM_PWR_STATUS, pwr_status); -+ break; -+ case 1: /* DPP1 */ -+ HWSEQ_REG_UPDATE(DOMAIN3_PG_CONFIG, -+ DOMAIN3_POWER_GATE, power_gate); -+ -+ wait_reg(ctx, 0, DOMAIN3_PG_STATUS, -+ DOMAIN3_PGFSM_PWR_STATUS, pwr_status); -+ break; -+ case 2: /* DPP2 */ -+ HWSEQ_REG_UPDATE(DOMAIN5_PG_CONFIG, -+ DOMAIN5_POWER_GATE, power_gate); -+ -+ wait_reg(ctx, 0, DOMAIN5_PG_STATUS, -+ DOMAIN5_PGFSM_PWR_STATUS, pwr_status); -+ break; -+ case 3: /* DPP3 */ -+ HWSEQ_REG_UPDATE(DOMAIN7_PG_CONFIG, -+ DOMAIN7_POWER_GATE, power_gate); -+ -+ wait_reg(ctx, 0, DOMAIN7_PG_STATUS, -+ DOMAIN7_PGFSM_PWR_STATUS, pwr_status); -+ break; -+ default: -+ BREAK_TO_DEBUGGER(); -+ break; -+ } -+} -+ -+static void hubp_pg_control( -+ struct dc_context *ctx, -+ unsigned int hubp_inst, -+ bool power_on) -+{ -+ uint32_t inst_offset = 0; -+ uint32_t power_gate = power_on ? 0 : 1; -+ uint32_t pwr_status = power_on ? 0 : 2; -+ -+ if (ctx->dc->debug.disable_hubp_power_gate) -+ return; -+ -+ switch (hubp_inst) { -+ case 0: /* DCHUBP0 */ -+ HWSEQ_REG_UPDATE(DOMAIN0_PG_CONFIG, -+ DOMAIN0_POWER_GATE, power_gate); -+ -+ wait_reg(ctx, 0, DOMAIN0_PG_STATUS, -+ DOMAIN0_PGFSM_PWR_STATUS, pwr_status); -+ break; -+ case 1: /* DCHUBP1 */ -+ HWSEQ_REG_UPDATE(DOMAIN2_PG_CONFIG, -+ DOMAIN2_POWER_GATE, power_gate); -+ -+ wait_reg(ctx, 0, DOMAIN2_PG_STATUS, -+ DOMAIN2_PGFSM_PWR_STATUS, pwr_status); -+ break; -+ case 2: /* DCHUBP2 */ -+ HWSEQ_REG_UPDATE(DOMAIN4_PG_CONFIG, -+ DOMAIN4_POWER_GATE, power_gate); -+ -+ wait_reg(ctx, 0, DOMAIN4_PG_STATUS, -+ DOMAIN4_PGFSM_PWR_STATUS, pwr_status); -+ break; -+ case 3: /* DCHUBP3 */ -+ HWSEQ_REG_UPDATE(DOMAIN6_PG_CONFIG, -+ DOMAIN6_POWER_GATE, power_gate); -+ -+ wait_reg(ctx, 0, DOMAIN6_PG_STATUS, -+ DOMAIN6_PGFSM_PWR_STATUS, pwr_status); -+ break; -+ default: -+ BREAK_TO_DEBUGGER(); -+ break; -+ } -+} -+ -+static void power_on_plane( -+ struct dc_context *ctx, -+ uint8_t plane_id, -+ uint8_t inst) -+{ -+ uint32_t inst_offset = 0; -+ -+ /* disable clock power gating */ -+ -+ /* DCCG_GATE_DISABLE_CNTL only has one instance */ -+ HWSEQ_REG_UPDATE_2(DCCG_GATE_DISABLE_CNTL, -+ DISPCLK_DCCG_GATE_DISABLE, 1, -+ DPPCLK_GATE_DISABLE, 1); -+ /* DCFCLK_CNTL only has one instance */ -+ HWSEQ_REG_UPDATE(DCFCLK_CNTL, -+ DCFCLK_GATE_DIS, 1); -+ -+ HWSEQ_REG_SET(DC_IP_REQUEST_CNTL, -+ IP_REQUEST_EN, 1); -+ dpp_pg_control(ctx, plane_id, true); -+ hubp_pg_control(ctx, plane_id, true); -+ HWSEQ_REG_SET(DC_IP_REQUEST_CNTL, -+ IP_REQUEST_EN, 0); -+ -+ if (ctx->dc->debug.disable_clock_gate) { -+ HWSEQ_REG_UPDATE(DCCG_GATE_DISABLE_CNTL, -+ DISPCLK_DCCG_GATE_DISABLE, 0); -+ } else { -+ /* DCCG_GATE_DISABLE_CNTL only has one instance. inst_offset = 0 */ -+ HWSEQ_REG_UPDATE_2(DCCG_GATE_DISABLE_CNTL, -+ DISPCLK_DCCG_GATE_DISABLE, 0, -+ DPPCLK_GATE_DISABLE, 0); -+ /* DCFCLK_CNTL only has one instance. inst_offset = 0 */ -+ HWSEQ_REG_UPDATE(DCFCLK_CNTL, -+ DCFCLK_GATE_DIS, 0); -+ } -+} -+ -+/* fully check bios enabledisplaypowergating table. dal only need dce init -+ * other power, clock gate register will be handle by dal itself. -+ * further may be put within init_hw -+ */ -+static bool dcn10_enable_display_power_gating( -+ struct core_dc *dc, -+ uint8_t controller_id, -+ struct dc_bios *dcb, -+ enum pipe_gating_control power_gating) -+{ -+ /* TODOFPGA */ -+#if 0 -+ if (power_gating != PIPE_GATING_CONTROL_ENABLE) -+ dce110_init_pte(ctx); -+#endif -+ -+ return true; -+} -+ -+static void bios_golden_init(struct core_dc *dc) -+{ -+ struct dc_bios *bp = dc->ctx->dc_bios; -+ int i; -+ -+ /* initialize dcn global */ -+ bp->funcs->enable_disp_power_gating(bp, -+ CONTROLLER_ID_D0, ASIC_PIPE_INIT); -+ -+ for (i = 0; i < dc->res_pool->pipe_count; i++) { -+ /* initialize dcn per pipe */ -+ bp->funcs->enable_disp_power_gating(bp, -+ CONTROLLER_ID_D0 + i, ASIC_PIPE_DISABLE); -+ } -+} -+ -+static void init_hw(struct core_dc *dc) -+{ -+ int i; -+ struct dc_bios *bp; -+ struct transform *xfm; -+ struct abm *abm; -+ -+ bp = dc->ctx->dc_bios; -+ -+ if (IS_FPGA_MAXIMUS_DC(dc->ctx->dce_environment)) { -+ /* TODO: this will be moved to Diag or BIOS */ -+ dchubup_setup_timer(dc->ctx); -+ -+ /* TODO: dchubp_map_fb_to_mc will be moved to dchub interface -+ * between dc and kmd -+ */ -+ dchubp_map_fb_to_mc(dc->ctx); -+ -+ enable_power_gating_plane(dc->ctx, true); -+ return; -+ } -+ /* end of FPGA. Below if real ASIC */ -+ -+ bios_golden_init(dc); -+ -+ for (i = 0; i < dc->res_pool->pipe_count; i++) { -+ xfm = dc->res_pool->transforms[i]; -+ xfm->funcs->transform_reset(xfm); -+ -+ /* TODOFPGA: may need later */ -+#if 0 -+ xfm->funcs->transform_power_up(xfm); -+ dc->hwss.enable_display_pipe_clock_gating( -+ dc->ctx, -+ true); -+#endif -+ } -+ /* TODOFPGA: light sleep */ -+#if 0 -+ dc->hwss.clock_gating_power_up(dc->ctx, false); -+#endif -+ -+ for (i = 0; i < dc->link_count; i++) { -+ /* Power up AND update implementation according to the -+ * required signal (which may be different from the -+ * default signal on connector). -+ */ -+ struct core_link *link = dc->links[i]; -+ -+ link->link_enc->funcs->hw_init(link->link_enc); -+ } -+ -+ for (i = 0; i < dc->res_pool->pipe_count; i++) { -+ struct timing_generator *tg = -+ dc->res_pool->timing_generators[i]; -+ -+ tg->funcs->disable_vga(tg); -+ -+ /* Blank controller using driver code instead of -+ * command table. -+ */ -+ tg->funcs->set_blank(tg, true); -+ hwss_wait_for_blank_complete(tg); -+ } -+ -+ for (i = 0; i < dc->res_pool->audio_count; i++) { -+ struct audio *audio = dc->res_pool->audios[i]; -+ -+ audio->funcs->hw_init(audio); -+ } -+ -+ abm = dc->res_pool->abm; -+ if (abm != NULL) { -+ abm->funcs->init_backlight(abm); -+ abm->funcs->abm_init(abm); -+ } -+ -+ /* power AFMT HDMI memory TODO: may move to dis/en output save power*/ -+ generic_reg_set_soc15(dc->ctx, 0, DIO_MEM_PWR_CTRL, 7, -+ FD(DIO_MEM_PWR_CTRL__HDMI0_MEM_PWR_FORCE), 0, -+ FD(DIO_MEM_PWR_CTRL__HDMI1_MEM_PWR_FORCE), 0, -+ FD(DIO_MEM_PWR_CTRL__HDMI2_MEM_PWR_FORCE), 0, -+ FD(DIO_MEM_PWR_CTRL__HDMI3_MEM_PWR_FORCE), 0, -+ FD(DIO_MEM_PWR_CTRL__HDMI4_MEM_PWR_FORCE), 0, -+ FD(DIO_MEM_PWR_CTRL__HDMI5_MEM_PWR_FORCE), 0, -+ FD(DIO_MEM_PWR_CTRL__HDMI6_MEM_PWR_FORCE), 0); -+ -+ /* This power gating should be one-time program for DAL. -+ * It can only change by registry key -+ * TODO: new task will for this. -+ * if power gating is disable, power_on_plane and power_off_plane -+ * should be skip. Otherwise, hand will be met in power_off_plane -+ */ -+ -+ enable_power_gating_plane(dc->ctx, true); -+} -+ -+static enum dc_status dcn10_prog_pixclk_crtc_otg( -+ struct pipe_ctx *pipe_ctx, -+ struct validate_context *context, -+ struct core_dc *dc) -+{ -+ struct core_stream *stream = pipe_ctx->stream; -+ enum dc_color_space color_space; -+ struct tg_color black_color = {0}; -+ bool enableStereo = stream->public.timing.timing_3d_format == TIMING_3D_FORMAT_NONE ? -+ false:true; -+ bool rightEyePolarity = stream->public.timing.flags.RIGHT_EYE_3D_POLARITY; -+ -+ -+ /* by upper caller loop, pipe0 is parent pipe and be called first. -+ * back end is set up by for pipe0. Other children pipe share back end -+ * with pipe 0. No program is needed. -+ */ -+ if (pipe_ctx->top_pipe != NULL) -+ return DC_OK; -+ -+ /* TODO check if timing_changed, disable stream if timing changed */ -+ -+ /* HW program guide assume display already disable -+ * by unplug sequence. OTG assume stop. -+ */ -+ pipe_ctx->tg->funcs->enable_optc_clock(pipe_ctx->tg, true); -+ -+ if (false == pipe_ctx->clock_source->funcs->program_pix_clk( -+ pipe_ctx->clock_source, -+ &pipe_ctx->pix_clk_params, -+ &pipe_ctx->pll_settings)) { -+ BREAK_TO_DEBUGGER(); -+ return DC_ERROR_UNEXPECTED; -+ } -+ pipe_ctx->tg->dlg_otg_param.vready_offset = pipe_ctx->pipe_dlg_param.vready_offset; -+ pipe_ctx->tg->dlg_otg_param.vstartup_start = pipe_ctx->pipe_dlg_param.vstartup_start; -+ pipe_ctx->tg->dlg_otg_param.vupdate_offset = pipe_ctx->pipe_dlg_param.vupdate_offset; -+ pipe_ctx->tg->dlg_otg_param.vupdate_width = pipe_ctx->pipe_dlg_param.vupdate_width; -+ -+ pipe_ctx->tg->dlg_otg_param.signal = pipe_ctx->stream->signal; -+ -+ pipe_ctx->tg->funcs->program_timing( -+ pipe_ctx->tg, -+ &stream->public.timing, -+ true); -+ -+ pipe_ctx->opp->funcs->opp_set_stereo_polarity( -+ pipe_ctx->opp, -+ enableStereo, -+ rightEyePolarity); -+ -+#if 0 /* move to after enable_crtc */ -+ /* TODO: OPP FMT, ABM. etc. should be done here. */ -+ /* or FPGA now. instance 0 only. TODO: move to opp.c */ -+ -+ inst_offset = reg_offsets[pipe_ctx->tg->inst].fmt; -+ -+ pipe_ctx->opp->funcs->opp_program_fmt( -+ pipe_ctx->opp, -+ &stream->bit_depth_params, -+ &stream->clamping); -+#endif -+ /* program otg blank color */ -+ color_space = stream->public.output_color_space; -+ color_space_to_black_color(dc, color_space, &black_color); -+ pipe_ctx->tg->funcs->set_blank_color( -+ pipe_ctx->tg, -+ &black_color); -+ -+ pipe_ctx->tg->funcs->set_blank(pipe_ctx->tg, true); -+ hwss_wait_for_blank_complete(pipe_ctx->tg); -+ -+ /* VTG is within DCHUB command block. DCFCLK is always on */ -+ if (false == pipe_ctx->tg->funcs->enable_crtc(pipe_ctx->tg)) { -+ BREAK_TO_DEBUGGER(); -+ return DC_ERROR_UNEXPECTED; -+ } -+ -+ /* TODO program crtc source select for non-virtual signal*/ -+ /* TODO program FMT */ -+ /* TODO setup link_enc */ -+ /* TODO set stream attributes */ -+ /* TODO program audio */ -+ /* TODO enable stream if timing changed */ -+ /* TODO unblank stream if DP */ -+ -+ return DC_OK; -+} -+ -+static void reset_back_end_for_pipe( -+ struct core_dc *dc, -+ struct pipe_ctx *pipe_ctx, -+ struct validate_context *context) -+{ -+ int i; -+ struct dc_bios *bp; -+ -+ bp = dc->ctx->dc_bios; -+ -+ if (pipe_ctx->stream_enc == NULL) { -+ pipe_ctx->stream = NULL; -+ return; -+ } -+ -+ /* TODOFPGA break core_link_disable_stream into 2 functions: -+ * disable_stream and disable_link. disable_link will disable PHYPLL -+ * which is used by otg. Move disable_link after disable_crtc -+ */ -+ if (!IS_FPGA_MAXIMUS_DC(dc->ctx->dce_environment)) -+ core_link_disable_stream(pipe_ctx); -+ -+ /* by upper caller loop, parent pipe: pipe0, will be reset last. -+ * back end share by all pipes and will be disable only when disable -+ * parent pipe. -+ */ -+ if (pipe_ctx->top_pipe == NULL) { -+ pipe_ctx->tg->funcs->disable_crtc(pipe_ctx->tg); -+ -+ pipe_ctx->tg->funcs->enable_optc_clock(pipe_ctx->tg, false); -+ } -+ -+ if (!IS_FPGA_MAXIMUS_DC(dc->ctx->dce_environment)) -+ resource_unreference_clock_source( -+ &context->res_ctx, dc->res_pool, -+ &pipe_ctx->clock_source); -+ -+ for (i = 0; i < dc->res_pool->pipe_count; i++) -+ if (&dc->current_context->res_ctx.pipe_ctx[i] == pipe_ctx) -+ break; -+ -+ if (i == dc->res_pool->pipe_count) -+ return; -+ -+ pipe_ctx->stream = NULL; -+} -+ -+static void reset_front_end_for_pipe( -+ struct core_dc *dc, -+ struct pipe_ctx *pipe_ctx, -+ struct validate_context *context) -+{ -+ struct dcn10_mpc *mpc = TO_DCN10_MPC(dc->res_pool->mpc); -+ struct mpc_tree_cfg *tree_cfg = NULL; -+ -+ if (!pipe_ctx->surface) -+ return; -+ -+ lock_otg_master_update(dc->ctx, pipe_ctx->tg->inst); -+ -+ /* TODO: build stream pipes group id. For now, use stream otg -+ * id as pipe group id -+ */ -+ tree_cfg = &context->res_ctx.mpc_tree[pipe_ctx->mpc_idx]; -+ -+ if (pipe_ctx->top_pipe == NULL) -+ dcn10_delete_mpc_tree(mpc, tree_cfg); -+ else { -+ if (dcn10_remove_dpp(mpc, tree_cfg, pipe_ctx->pipe_idx)) -+ pipe_ctx->top_pipe->bottom_pipe = NULL; -+ else { -+ dm_logger_write(dc->ctx->logger, LOG_RESOURCE, -+ "%s: failed to find dpp to be removed!\n", -+ __func__); -+ } -+ } -+ -+ pipe_ctx->top_pipe = NULL; -+ pipe_ctx->bottom_pipe = NULL; -+ pipe_ctx->mpc_idx = -1; -+ -+ unlock_master_tg_and_wait(dc->ctx, pipe_ctx->tg->inst); -+ -+ pipe_ctx->mi->funcs->disable_request(pipe_ctx->mi); -+ -+ wait_no_outstanding_request(dc->ctx, pipe_ctx->pipe_idx); -+ -+ wait_mpcc_idle(mpc, pipe_ctx->pipe_idx); -+ -+ disable_clocks(dc->ctx, pipe_ctx->pipe_idx); -+ -+ pipe_ctx->xfm->funcs->transform_reset(pipe_ctx->xfm); -+ -+ dm_logger_write(dc->ctx->logger, LOG_DC, -+ "Reset front end for pipe %d\n", -+ pipe_ctx->pipe_idx); -+ -+ pipe_ctx->surface = NULL; -+} -+ -+static void reset_hw_ctx(struct core_dc *dc, -+ struct validate_context *context, -+ void (*reset)(struct core_dc *dc, -+ struct pipe_ctx *pipe_ctx, -+ struct validate_context *context)) -+{ -+ int i; -+ -+ for (i = dc->res_pool->pipe_count - 1; i >= 0 ; i--) { -+ struct pipe_ctx *pipe_ctx_old = -+ &dc->current_context->res_ctx.pipe_ctx[i]; -+ struct pipe_ctx *pipe_ctx = &context->res_ctx.pipe_ctx[i]; -+ -+ if (!pipe_ctx_old->stream) -+ continue; -+ -+ if (!pipe_ctx->stream || -+ pipe_need_reprogram(pipe_ctx_old, pipe_ctx)) -+ reset(dc, pipe_ctx_old, dc->current_context); -+ } -+} -+ -+static void reset_hw_ctx_wrap( -+ struct core_dc *dc, -+ struct validate_context *context) -+{ -+ /* Reset Front End*/ -+ reset_hw_ctx(dc, context, reset_front_end_for_pipe); -+ /* Reset Back End*/ -+ reset_hw_ctx(dc, context, reset_back_end_for_pipe); -+ -+ memcpy(context->res_ctx.mpc_tree, -+ dc->current_context->res_ctx.mpc_tree, -+ sizeof(struct mpc_tree_cfg) * dc->res_pool->pipe_count); -+} -+ -+static bool patch_address_for_sbs_tb_stereo(struct pipe_ctx *pipe_ctx, -+ PHYSICAL_ADDRESS_LOC *addr) -+{ -+ struct core_surface *surface = pipe_ctx->surface; -+ bool sec_split = pipe_ctx->top_pipe && -+ pipe_ctx->top_pipe->surface == pipe_ctx->surface; -+ if (sec_split && surface->public.address.type == PLN_ADDR_TYPE_GRPH_STEREO && -+ (pipe_ctx->stream->public.timing.timing_3d_format == -+ TIMING_3D_FORMAT_SIDE_BY_SIDE || -+ pipe_ctx->stream->public.timing.timing_3d_format == -+ TIMING_3D_FORMAT_TOP_AND_BOTTOM)) { -+ *addr = surface->public.address.grph_stereo.left_addr; -+ surface->public.address.grph_stereo.left_addr =\ -+ surface->public.address.grph_stereo.right_addr; -+ return true; -+ } -+ return false; -+} -+ -+static void update_plane_addr(const struct core_dc *dc, struct pipe_ctx *pipe_ctx) -+{ -+ bool addr_patched = false; -+ PHYSICAL_ADDRESS_LOC addr; -+ struct core_surface *surface = pipe_ctx->surface; -+ -+ if (surface == NULL) -+ return; -+ addr_patched = patch_address_for_sbs_tb_stereo(pipe_ctx, &addr); -+ pipe_ctx->mi->funcs->mem_input_program_surface_flip_and_addr( -+ pipe_ctx->mi, -+ &surface->public.address, -+ surface->public.flip_immediate); -+ surface->status.requested_address = surface->public.address; -+ if (addr_patched) -+ pipe_ctx->surface->public.address.grph_stereo.left_addr = addr; -+} -+ -+static bool dcn10_set_input_transfer_func( -+ struct pipe_ctx *pipe_ctx, -+ const struct core_surface *surface) -+{ -+ struct input_pixel_processor *ipp = pipe_ctx->ipp; -+ const struct core_transfer_func *tf = NULL; -+ bool result = true; -+ -+ if (ipp == NULL) -+ return false; -+ -+ if (surface->public.in_transfer_func) -+ tf = DC_TRANSFER_FUNC_TO_CORE(surface->public.in_transfer_func); -+ -+ if (tf == NULL) -+ ipp->funcs->ipp_set_degamma(ipp, IPP_DEGAMMA_MODE_BYPASS); -+ else if (tf->public.type == TF_TYPE_PREDEFINED) { -+ switch (tf->public.tf) { -+ case TRANSFER_FUNCTION_SRGB: -+ ipp->funcs->ipp_set_degamma(ipp, -+ IPP_DEGAMMA_MODE_HW_sRGB); -+ break; -+ case TRANSFER_FUNCTION_BT709: -+ ipp->funcs->ipp_set_degamma(ipp, -+ IPP_DEGAMMA_MODE_HW_xvYCC); -+ break; -+ case TRANSFER_FUNCTION_LINEAR: -+ ipp->funcs->ipp_set_degamma(ipp, -+ IPP_DEGAMMA_MODE_BYPASS); -+ break; -+ case TRANSFER_FUNCTION_PQ: -+ result = false; -+ break; -+ default: -+ result = false; -+ break; -+ } -+ } else if (tf->public.type == TF_TYPE_BYPASS) { -+ ipp->funcs->ipp_set_degamma(ipp, IPP_DEGAMMA_MODE_BYPASS); -+ } else { -+ /*TF_TYPE_DISTRIBUTED_POINTS*/ -+ result = false; -+ } -+ -+ return result; -+} -+/*modify the method to handle rgb for arr_points*/ -+static bool convert_to_custom_float( -+ struct pwl_result_data *rgb_resulted, -+ struct curve_points *arr_points, -+ uint32_t hw_points_num) -+{ -+ struct custom_float_format fmt; -+ -+ struct pwl_result_data *rgb = rgb_resulted; -+ -+ uint32_t i = 0; -+ -+ fmt.exponenta_bits = 6; -+ fmt.mantissa_bits = 12; -+ fmt.sign = false; -+ -+ if (!convert_to_custom_float_format( -+ arr_points[0].x, -+ &fmt, -+ &arr_points[0].custom_float_x)) { -+ BREAK_TO_DEBUGGER(); -+ return false; -+ } -+ -+ if (!convert_to_custom_float_format( -+ arr_points[0].offset, -+ &fmt, -+ &arr_points[0].custom_float_offset)) { -+ BREAK_TO_DEBUGGER(); -+ return false; -+ } -+ -+ if (!convert_to_custom_float_format( -+ arr_points[0].slope, -+ &fmt, -+ &arr_points[0].custom_float_slope)) { -+ BREAK_TO_DEBUGGER(); -+ return false; -+ } -+ -+ fmt.mantissa_bits = 10; -+ fmt.sign = false; -+ -+ if (!convert_to_custom_float_format( -+ arr_points[1].x, -+ &fmt, -+ &arr_points[1].custom_float_x)) { -+ BREAK_TO_DEBUGGER(); -+ return false; -+ } -+ -+ if (!convert_to_custom_float_format( -+ arr_points[1].y, -+ &fmt, -+ &arr_points[1].custom_float_y)) { -+ BREAK_TO_DEBUGGER(); -+ return false; -+ } -+ -+ if (!convert_to_custom_float_format( -+ arr_points[1].slope, -+ &fmt, -+ &arr_points[1].custom_float_slope)) { -+ BREAK_TO_DEBUGGER(); -+ return false; -+ } -+ -+ fmt.mantissa_bits = 12; -+ fmt.sign = true; -+ -+ while (i != hw_points_num) { -+ if (!convert_to_custom_float_format( -+ rgb->red, -+ &fmt, -+ &rgb->red_reg)) { -+ BREAK_TO_DEBUGGER(); -+ return false; -+ } -+ -+ if (!convert_to_custom_float_format( -+ rgb->green, -+ &fmt, -+ &rgb->green_reg)) { -+ BREAK_TO_DEBUGGER(); -+ return false; -+ } -+ -+ if (!convert_to_custom_float_format( -+ rgb->blue, -+ &fmt, -+ &rgb->blue_reg)) { -+ BREAK_TO_DEBUGGER(); -+ return false; -+ } -+ -+ if (!convert_to_custom_float_format( -+ rgb->delta_red, -+ &fmt, -+ &rgb->delta_red_reg)) { -+ BREAK_TO_DEBUGGER(); -+ return false; -+ } -+ -+ if (!convert_to_custom_float_format( -+ rgb->delta_green, -+ &fmt, -+ &rgb->delta_green_reg)) { -+ BREAK_TO_DEBUGGER(); -+ return false; -+ } -+ -+ if (!convert_to_custom_float_format( -+ rgb->delta_blue, -+ &fmt, -+ &rgb->delta_blue_reg)) { -+ BREAK_TO_DEBUGGER(); -+ return false; -+ } -+ -+ ++rgb; -+ ++i; -+ } -+ -+ return true; -+} -+#define MAX_REGIONS_NUMBER 34 -+#define MAX_LOW_POINT 25 -+#define NUMBER_SEGMENTS 32 -+ -+static bool dcn10_translate_regamma_to_hw_format(const struct dc_transfer_func -+ *output_tf, struct pwl_params *regamma_params) -+{ -+ struct curve_points *arr_points; -+ struct pwl_result_data *rgb_resulted; -+ struct pwl_result_data *rgb; -+ struct pwl_result_data *rgb_plus_1; -+ struct fixed31_32 y_r; -+ struct fixed31_32 y_g; -+ struct fixed31_32 y_b; -+ struct fixed31_32 y1_min; -+ struct fixed31_32 y3_max; -+ -+ int32_t segment_start, segment_end; -+ int32_t i; -+ uint32_t j, k, seg_distr[MAX_REGIONS_NUMBER], increment, start_index, hw_points; -+ -+ if (output_tf == NULL || regamma_params == NULL || -+ output_tf->type == TF_TYPE_BYPASS) -+ return false; -+ -+ arr_points = regamma_params->arr_points; -+ rgb_resulted = regamma_params->rgb_resulted; -+ hw_points = 0; -+ -+ memset(regamma_params, 0, sizeof(struct pwl_params)); -+ memset(seg_distr, 0, sizeof(seg_distr)); -+ -+ if (output_tf->tf == TRANSFER_FUNCTION_PQ) { -+ /* 32 segments -+ * segments are from 2^-25 to 2^7 -+ */ -+ for (i = 0; i < 32 ; i++) -+ seg_distr[i] = 3; -+ -+ segment_start = -25; -+ segment_end = 7; -+ } else { -+ /* 10 segments -+ * segment is from 2^-10 to 2^0 -+ * There are less than 256 points, for optimization -+ */ -+ seg_distr[0] = 3; -+ seg_distr[1] = 4; -+ seg_distr[2] = 4; -+ seg_distr[3] = 4; -+ seg_distr[4] = 4; -+ seg_distr[5] = 4; -+ seg_distr[6] = 4; -+ seg_distr[7] = 4; -+ seg_distr[8] = 5; -+ seg_distr[9] = 5; -+ -+ segment_start = -10; -+ segment_end = 0; -+ } -+ -+ for (i = segment_end - segment_start; i < MAX_REGIONS_NUMBER ; i++) -+ seg_distr[i] = -1; -+ -+ for (k = 0; k < MAX_REGIONS_NUMBER; k++) { -+ if (seg_distr[k] != -1) -+ hw_points += (1 << seg_distr[k]); -+ } -+ -+ j = 0; -+ for (k = 0; k < (segment_end - segment_start); k++) { -+ increment = NUMBER_SEGMENTS / (1 << seg_distr[k]); -+ start_index = (segment_start + k + MAX_LOW_POINT) * NUMBER_SEGMENTS; -+ for (i = start_index; i < start_index + NUMBER_SEGMENTS; i += increment) { -+ if (j == hw_points - 1) -+ break; -+ rgb_resulted[j].red = output_tf->tf_pts.red[i]; -+ rgb_resulted[j].green = output_tf->tf_pts.green[i]; -+ rgb_resulted[j].blue = output_tf->tf_pts.blue[i]; -+ j++; -+ } -+ } -+ -+ /* last point */ -+ start_index = (segment_end + MAX_LOW_POINT) * NUMBER_SEGMENTS; -+ rgb_resulted[hw_points - 1].red = -+ output_tf->tf_pts.red[start_index]; -+ rgb_resulted[hw_points - 1].green = -+ output_tf->tf_pts.green[start_index]; -+ rgb_resulted[hw_points - 1].blue = -+ output_tf->tf_pts.blue[start_index]; -+ -+ arr_points[0].x = dal_fixed31_32_pow(dal_fixed31_32_from_int(2), -+ dal_fixed31_32_from_int(segment_start)); -+ arr_points[1].x = dal_fixed31_32_pow(dal_fixed31_32_from_int(2), -+ dal_fixed31_32_from_int(segment_end)); -+ arr_points[2].x = dal_fixed31_32_pow(dal_fixed31_32_from_int(2), -+ dal_fixed31_32_from_int(segment_end)); -+ -+ y_r = rgb_resulted[0].red; -+ y_g = rgb_resulted[0].green; -+ y_b = rgb_resulted[0].blue; -+ -+ y1_min = dal_fixed31_32_min(y_r, dal_fixed31_32_min(y_g, y_b)); -+ -+ arr_points[0].y = y1_min; -+ arr_points[0].slope = dal_fixed31_32_div( -+ arr_points[0].y, -+ arr_points[0].x); -+ y_r = rgb_resulted[hw_points - 1].red; -+ y_g = rgb_resulted[hw_points - 1].green; -+ y_b = rgb_resulted[hw_points - 1].blue; -+ -+ /* see comment above, m_arrPoints[1].y should be the Y value for the -+ * region end (m_numOfHwPoints), not last HW point(m_numOfHwPoints - 1) -+ */ -+ y3_max = dal_fixed31_32_max(y_r, dal_fixed31_32_max(y_g, y_b)); -+ -+ arr_points[1].y = y3_max; -+ arr_points[2].y = y3_max; -+ -+ arr_points[1].slope = dal_fixed31_32_zero; -+ arr_points[2].slope = dal_fixed31_32_zero; -+ -+ if (output_tf->tf == TRANSFER_FUNCTION_PQ) { -+ /* for PQ, we want to have a straight line from last HW X point, -+ * and the slope to be such that we hit 1.0 at 10000 nits. -+ */ -+ const struct fixed31_32 end_value = -+ dal_fixed31_32_from_int(125); -+ -+ arr_points[1].slope = dal_fixed31_32_div( -+ dal_fixed31_32_sub(dal_fixed31_32_one, arr_points[1].y), -+ dal_fixed31_32_sub(end_value, arr_points[1].x)); -+ arr_points[2].slope = dal_fixed31_32_div( -+ dal_fixed31_32_sub(dal_fixed31_32_one, arr_points[1].y), -+ dal_fixed31_32_sub(end_value, arr_points[1].x)); -+ } -+ -+ regamma_params->hw_points_num = hw_points; -+ -+ i = 1; -+ for (k = 0; k < MAX_REGIONS_NUMBER && i < MAX_REGIONS_NUMBER; k++) { -+ if (seg_distr[k] != -1) { -+ regamma_params->arr_curve_points[k].segments_num = -+ seg_distr[k]; -+ regamma_params->arr_curve_points[i].offset = -+ regamma_params->arr_curve_points[k]. -+ offset + (1 << seg_distr[k]); -+ } -+ i++; -+ } -+ -+ if (seg_distr[k] != -1) -+ regamma_params->arr_curve_points[k].segments_num = -+ seg_distr[k]; -+ -+ rgb = rgb_resulted; -+ rgb_plus_1 = rgb_resulted + 1; -+ -+ i = 1; -+ -+ while (i != hw_points + 1) { -+ if (dal_fixed31_32_lt(rgb_plus_1->red, rgb->red)) -+ rgb_plus_1->red = rgb->red; -+ if (dal_fixed31_32_lt(rgb_plus_1->green, rgb->green)) -+ rgb_plus_1->green = rgb->green; -+ if (dal_fixed31_32_lt(rgb_plus_1->blue, rgb->blue)) -+ rgb_plus_1->blue = rgb->blue; -+ -+ rgb->delta_red = dal_fixed31_32_sub( -+ rgb_plus_1->red, -+ rgb->red); -+ rgb->delta_green = dal_fixed31_32_sub( -+ rgb_plus_1->green, -+ rgb->green); -+ rgb->delta_blue = dal_fixed31_32_sub( -+ rgb_plus_1->blue, -+ rgb->blue); -+ -+ ++rgb_plus_1; -+ ++rgb; -+ ++i; -+ } -+ -+ convert_to_custom_float(rgb_resulted, arr_points, hw_points); -+ -+ return true; -+} -+ -+static bool dcn10_set_output_transfer_func( -+ struct pipe_ctx *pipe_ctx, -+ const struct core_surface *surface, -+ const struct core_stream *stream) -+{ -+ struct output_pixel_processor *opp = pipe_ctx->opp; -+ -+ opp->regamma_params.hw_points_num = GAMMA_HW_POINTS_NUM; -+ -+ if (stream->public.out_transfer_func && -+ stream->public.out_transfer_func->type == -+ TF_TYPE_PREDEFINED && -+ stream->public.out_transfer_func->tf == -+ TRANSFER_FUNCTION_SRGB) { -+ opp->funcs->opp_set_regamma_mode(opp, OPP_REGAMMA_SRGB); -+ } else if (dcn10_translate_regamma_to_hw_format( -+ stream->public.out_transfer_func, &opp->regamma_params)) { -+ opp->funcs->opp_program_regamma_pwl(opp, &opp->regamma_params); -+ opp->funcs->opp_set_regamma_mode(opp, OPP_REGAMMA_USER); -+ } else { -+ opp->funcs->opp_set_regamma_mode(opp, OPP_REGAMMA_BYPASS); -+ } -+ -+ return true; -+} -+ -+static void dcn10_pipe_control_lock( -+ struct core_dc *dc, -+ struct pipe_ctx *pipe, -+ bool lock) -+{ -+ struct dce_hwseq *hws = hws = dc->hwseq; -+ -+ /* use TG master update lock to lock everything on the TG -+ * therefore only top pipe need to lock -+ */ -+ if (pipe->top_pipe) -+ return; -+ -+ if (lock) -+ dcn10_lock(pipe->tg); -+ else -+ dcn10_unlock(pipe->tg); -+} -+ -+static bool wait_for_reset_trigger_to_occur( -+ struct dc_context *dc_ctx, -+ struct timing_generator *tg) -+{ -+ bool rc = false; -+ -+ /* To avoid endless loop we wait at most -+ * frames_to_wait_on_triggered_reset frames for the reset to occur. */ -+ const uint32_t frames_to_wait_on_triggered_reset = 10; -+ int i; -+ -+ for (i = 0; i < frames_to_wait_on_triggered_reset; i++) { -+ -+ if (!tg->funcs->is_counter_moving(tg)) { -+ DC_ERROR("TG counter is not moving!\n"); -+ break; -+ } -+ -+ if (tg->funcs->did_triggered_reset_occur(tg)) { -+ rc = true; -+ /* usually occurs at i=1 */ -+ DC_SYNC_INFO("GSL: reset occurred at wait count: %d\n", -+ i); -+ break; -+ } -+ -+ /* Wait for one frame. */ -+ tg->funcs->wait_for_state(tg, CRTC_STATE_VACTIVE); -+ tg->funcs->wait_for_state(tg, CRTC_STATE_VBLANK); -+ } -+ -+ if (false == rc) -+ DC_ERROR("GSL: Timeout on reset trigger!\n"); -+ -+ return rc; -+} -+ -+static void dcn10_enable_timing_synchronization( -+ struct core_dc *dc, -+ int group_index, -+ int group_size, -+ struct pipe_ctx *grouped_pipes[]) -+{ -+ struct dc_context *dc_ctx = dc->ctx; -+ int i; -+ -+ DC_SYNC_INFO("Setting up OTG reset trigger\n"); -+ -+ for (i = 1; i < group_size; i++) -+ grouped_pipes[i]->tg->funcs->enable_reset_trigger( -+ grouped_pipes[i]->tg, grouped_pipes[0]->tg->inst); -+ -+ -+ DC_SYNC_INFO("Waiting for trigger\n"); -+ -+ /* Need to get only check 1 pipe for having reset as all the others are -+ * synchronized. Look at last pipe programmed to reset. -+ */ -+ wait_for_reset_trigger_to_occur(dc_ctx, grouped_pipes[1]->tg); -+ for (i = 1; i < group_size; i++) -+ grouped_pipes[i]->tg->funcs->disable_reset_trigger( -+ grouped_pipes[i]->tg); -+ -+ DC_SYNC_INFO("Sync complete\n"); -+} -+ -+static void dcn10_power_on_fe( -+ struct core_dc *dc, -+ struct pipe_ctx *pipe_ctx, -+ struct validate_context *context) -+{ -+ struct dc_surface *dc_surface = &pipe_ctx->surface->public; -+ -+ /* power up DCHUP and DPP from pseudo code pipe_move.c */ -+ /*TODO: function: power_on_plane. If already power up, skip -+ */ -+ { -+ power_on_plane(dc->ctx, -+ pipe_ctx->pipe_idx, pipe_ctx->tg->inst); -+ -+ /* enable DCFCLK current DCHUB */ -+ enable_dcfclk(dc->ctx, -+ pipe_ctx->pipe_idx, -+ pipe_ctx->pix_clk_params.requested_pix_clk, -+ context->dppclk_div); -+ -+ if (dc_surface) { -+ dm_logger_write(dc->ctx->logger, LOG_DC, -+ "Pipe:%d 0x%x: addr hi:0x%x, " -+ "addr low:0x%x, " -+ "src: %d, %d, %d," -+ " %d; dst: %d, %d, %d, %d;\n", -+ pipe_ctx->pipe_idx, -+ dc_surface, -+ dc_surface->address.grph.addr.high_part, -+ dc_surface->address.grph.addr.low_part, -+ dc_surface->src_rect.x, -+ dc_surface->src_rect.y, -+ dc_surface->src_rect.width, -+ dc_surface->src_rect.height, -+ dc_surface->dst_rect.x, -+ dc_surface->dst_rect.y, -+ dc_surface->dst_rect.width, -+ dc_surface->dst_rect.height); -+ -+ dm_logger_write(dc->ctx->logger, LOG_HW_SET_MODE, -+ "Pipe %d: width, height, x, y\n" -+ "viewport:%d, %d, %d, %d\n" -+ "recout: %d, %d, %d, %d\n", -+ pipe_ctx->pipe_idx, -+ pipe_ctx->scl_data.viewport.width, -+ pipe_ctx->scl_data.viewport.height, -+ pipe_ctx->scl_data.viewport.x, -+ pipe_ctx->scl_data.viewport.y, -+ pipe_ctx->scl_data.recout.width, -+ pipe_ctx->scl_data.recout.height, -+ pipe_ctx->scl_data.recout.x, -+ pipe_ctx->scl_data.recout.y); -+ } -+ } -+ -+} -+ -+static void program_gamut_remap(struct pipe_ctx *pipe_ctx) -+{ -+ struct xfm_grph_csc_adjustment adjust; -+ memset(&adjust, 0, sizeof(adjust)); -+ adjust.gamut_adjust_type = GRAPHICS_GAMUT_ADJUST_TYPE_BYPASS; -+ -+ -+ if (pipe_ctx->stream->public.gamut_remap_matrix.enable_remap == true) { -+ adjust.gamut_adjust_type = GRAPHICS_GAMUT_ADJUST_TYPE_SW; -+ adjust.temperature_matrix[0] = -+ pipe_ctx->stream-> -+ public.gamut_remap_matrix.matrix[0]; -+ adjust.temperature_matrix[1] = -+ pipe_ctx->stream-> -+ public.gamut_remap_matrix.matrix[1]; -+ adjust.temperature_matrix[2] = -+ pipe_ctx->stream-> -+ public.gamut_remap_matrix.matrix[2]; -+ adjust.temperature_matrix[3] = -+ pipe_ctx->stream-> -+ public.gamut_remap_matrix.matrix[4]; -+ adjust.temperature_matrix[4] = -+ pipe_ctx->stream-> -+ public.gamut_remap_matrix.matrix[5]; -+ adjust.temperature_matrix[5] = -+ pipe_ctx->stream-> -+ public.gamut_remap_matrix.matrix[6]; -+ adjust.temperature_matrix[6] = -+ pipe_ctx->stream-> -+ public.gamut_remap_matrix.matrix[8]; -+ adjust.temperature_matrix[7] = -+ pipe_ctx->stream-> -+ public.gamut_remap_matrix.matrix[9]; -+ adjust.temperature_matrix[8] = -+ pipe_ctx->stream-> -+ public.gamut_remap_matrix.matrix[10]; -+ } -+ -+ pipe_ctx->xfm->funcs->transform_set_gamut_remap(pipe_ctx->xfm, &adjust); -+} -+ -+static void update_dchubp_dpp( -+ struct core_dc *dc, -+ struct pipe_ctx *pipe_ctx, -+ struct validate_context *context) -+{ -+ struct mem_input *mi = pipe_ctx->mi; -+ struct input_pixel_processor *ipp = pipe_ctx->ipp; -+ struct core_surface *surface = pipe_ctx->surface; -+ union plane_size size = surface->public.plane_size; -+ struct mpc_tree_cfg *tree_cfg = NULL; -+ struct default_adjustment ocsc = {0}; -+ enum dc_color_space color_space; -+ struct tg_color black_color = {0}; -+ struct dcn10_mpc *mpc = TO_DCN10_MPC(dc->res_pool->mpc); -+ -+ /* depends on DML calculation, DPP clock value may change dynamically */ -+ enable_dppclk( -+ dc->ctx, -+ pipe_ctx->pipe_idx, -+ pipe_ctx->pix_clk_params.requested_pix_clk, -+ context->dppclk_div); -+ -+ select_vtg(dc->ctx, pipe_ctx->pipe_idx, pipe_ctx->tg->inst); -+ -+ update_plane_addr(dc, pipe_ctx); -+ -+ mi->funcs->mem_input_setup( -+ mi, -+ &pipe_ctx->dlg_regs, -+ &pipe_ctx->ttu_regs, -+ &pipe_ctx->rq_regs, -+ &pipe_ctx->pipe_dlg_param); -+ -+ size.grph.surface_size = pipe_ctx->scl_data.viewport; -+ -+ if (dc->public.config.gpu_vm_support) -+ mi->funcs->mem_input_program_pte_vm( -+ pipe_ctx->mi, -+ surface->public.format, -+ &surface->public.tiling_info, -+ surface->public.rotation); -+ -+ ipp->funcs->ipp_setup(ipp, -+ surface->public.format, -+ 1, -+ IPP_OUTPUT_FORMAT_12_BIT_FIX); -+ -+ /* mpc TODO un-hardcode object ids -+ * for pseudo code pipe_move.c : -+ * add_plane_mpcc(added_plane_inst, mpcc_inst, ...); -+ * Do we want to cache the tree_cfg? -+ */ -+ -+ /* TODO: build stream pipes group id. For now, use stream otg -+ * id as pipe group id -+ */ -+ pipe_ctx->mpc_idx = pipe_ctx->tg->inst; -+ tree_cfg = &context->res_ctx.mpc_tree[pipe_ctx->mpc_idx]; -+ /* enable when bottom pipe is present and -+ * it does not share a surface with current pipe -+ */ -+ if (pipe_ctx->bottom_pipe && surface != pipe_ctx->bottom_pipe->surface) { -+ pipe_ctx->scl_data.lb_params.alpha_en = 1; -+ tree_cfg->mode = TOP_BLND; -+ } else { -+ pipe_ctx->scl_data.lb_params.alpha_en = 0; -+ tree_cfg->mode = TOP_PASSTHRU; -+ } -+ if (!pipe_ctx->top_pipe) { -+ /* primary pipe, set mpc tree index 0 only */ -+ tree_cfg->num_pipes = 1; -+ tree_cfg->opp_id = pipe_ctx->tg->inst; -+ tree_cfg->dpp[0] = pipe_ctx->pipe_idx; -+ tree_cfg->mpcc[0] = pipe_ctx->pipe_idx; -+ dcn10_set_mpc_tree(mpc, tree_cfg); -+ } else { -+ /* TODO: add position is hard code to 1 for now -+ * If more than 2 pipes are supported, calculate position -+ */ -+ dcn10_add_dpp(mpc, tree_cfg, -+ pipe_ctx->pipe_idx, pipe_ctx->pipe_idx, 1); -+ } -+ -+ color_space = pipe_ctx->stream->public.output_color_space; -+ color_space_to_black_color(dc, color_space, &black_color); -+ dcn10_set_mpc_background_color(mpc, pipe_ctx->pipe_idx, &black_color); -+ -+ pipe_ctx->scl_data.lb_params.depth = LB_PIXEL_DEPTH_30BPP; -+ /* scaler configuration */ -+ pipe_ctx->xfm->funcs->transform_set_scaler( -+ pipe_ctx->xfm, &pipe_ctx->scl_data); -+ -+ /*gamut remap*/ -+ program_gamut_remap(pipe_ctx); -+ -+ /*TODO add adjustments parameters*/ -+ ocsc.out_color_space = pipe_ctx->stream->public.output_color_space; -+ pipe_ctx->opp->funcs->opp_set_csc_default(pipe_ctx->opp, &ocsc); -+ -+ mi->funcs->mem_input_program_surface_config( -+ mi, -+ surface->public.format, -+ &surface->public.tiling_info, -+ &size, -+ surface->public.rotation, -+ &surface->public.dcc, -+ surface->public.horizontal_mirror, -+ surface->public.visible); -+ -+ /* Only support one plane for now. */ -+ pipe_ctx->tg->funcs->set_blank(pipe_ctx->tg, !surface->public.visible); -+ -+} -+ -+static void program_all_pipe_in_tree( -+ struct core_dc *dc, -+ struct pipe_ctx *pipe_ctx, -+ struct validate_context *context) -+{ -+ unsigned int ref_clk_mhz = dc->res_pool->ref_clock_inKhz/1000; -+ -+ if (pipe_ctx->surface->public.visible || pipe_ctx->top_pipe == NULL) { -+ dcn10_power_on_fe(dc, pipe_ctx, context); -+ -+ /* lock otg_master_update to process all pipes associated with -+ * this OTG. this is done only one time. -+ */ -+ if (pipe_ctx->top_pipe == NULL) { -+ /* watermark is for all pipes */ -+ pipe_ctx->mi->funcs->program_watermarks( -+ pipe_ctx->mi, &context->watermarks, ref_clk_mhz); -+ lock_otg_master_update(dc->ctx, pipe_ctx->tg->inst); -+ } -+ pipe_ctx->tg->dlg_otg_param.vready_offset = pipe_ctx->pipe_dlg_param.vready_offset; -+ pipe_ctx->tg->dlg_otg_param.vstartup_start = pipe_ctx->pipe_dlg_param.vstartup_start; -+ pipe_ctx->tg->dlg_otg_param.vupdate_offset = pipe_ctx->pipe_dlg_param.vupdate_offset; -+ pipe_ctx->tg->dlg_otg_param.vupdate_width = pipe_ctx->pipe_dlg_param.vupdate_width; -+ pipe_ctx->tg->dlg_otg_param.signal = pipe_ctx->stream->signal; -+ pipe_ctx->tg->funcs->program_global_sync( -+ pipe_ctx->tg); -+ update_dchubp_dpp(dc, pipe_ctx, context); -+ } -+ -+ if (pipe_ctx->bottom_pipe != NULL) -+ program_all_pipe_in_tree(dc, pipe_ctx->bottom_pipe, context); -+} -+ -+static void dcn10_pplib_apply_display_requirements( -+ struct core_dc *dc, -+ struct validate_context *context) -+{ -+ struct dm_pp_display_configuration *pp_display_cfg = &context->pp_display_cfg; -+ -+ pp_display_cfg->all_displays_in_sync = false;/*todo*/ -+ pp_display_cfg->nb_pstate_switch_disable = false; -+ pp_display_cfg->min_engine_clock_khz = context->dcfclk_khz; -+ pp_display_cfg->min_memory_clock_khz = context->fclk_khz; -+ pp_display_cfg->min_engine_clock_deep_sleep_khz = context->dcfclk_deep_sleep_khz; -+ pp_display_cfg->min_dcfc_deep_sleep_clock_khz = context->dcfclk_deep_sleep_khz; -+ pp_display_cfg->avail_mclk_switch_time_us = -+ context->dram_ccm_us > 0 ? context->dram_ccm_us : 0; -+ pp_display_cfg->avail_mclk_switch_time_in_disp_active_us = -+ context->min_active_dram_ccm_us > 0 ? context->min_active_dram_ccm_us : 0; -+ pp_display_cfg->min_dcfclock_khz = context->dcfclk_khz; -+ pp_display_cfg->disp_clk_khz = context->dispclk_khz; -+ dce110_fill_display_configs(context, pp_display_cfg); -+ -+ if (memcmp(&dc->prev_display_config, pp_display_cfg, sizeof( -+ struct dm_pp_display_configuration)) != 0) -+ dm_pp_apply_display_requirements(dc->ctx, pp_display_cfg); -+ -+ dc->prev_display_config = *pp_display_cfg; -+} -+ -+static void dcn10_apply_ctx_for_surface( -+ struct core_dc *dc, -+ struct core_surface *surface, -+ struct validate_context *context) -+{ -+ int i; -+ -+ memcpy(context->res_ctx.mpc_tree, -+ dc->current_context->res_ctx.mpc_tree, -+ sizeof(struct mpc_tree_cfg) * dc->res_pool->pipe_count); -+ -+ for (i = 0; i < dc->res_pool->pipe_count; i++) { -+ struct pipe_ctx *pipe_ctx = &context->res_ctx.pipe_ctx[i]; -+ -+ if (!pipe_ctx->surface) -+ continue; -+ -+ /* looking for top pipe to program */ -+ if (!pipe_ctx->top_pipe) -+ program_all_pipe_in_tree(dc, pipe_ctx, context); -+ } -+ -+ for (i = 0; i < dc->res_pool->pipe_count; i++) { -+ struct pipe_ctx *pipe_ctx = &context->res_ctx.pipe_ctx[i]; -+ -+ if (!pipe_ctx->surface || pipe_ctx->top_pipe) -+ continue; -+ -+ /* unlock master update lock */ -+ unlock_otg_master(dc->ctx, pipe_ctx->tg->inst); -+ } -+ -+ /* reset unused pipe */ -+ for (i = 0; i < dc->res_pool->pipe_count; i++) { -+ struct pipe_ctx *pipe_ctx = &context->res_ctx.pipe_ctx[i]; -+ struct pipe_ctx *old_pipe_ctx = -+ &dc->current_context->res_ctx.pipe_ctx[i]; -+ -+ if ((!pipe_ctx->surface && old_pipe_ctx->surface) -+ || (!pipe_ctx->stream && old_pipe_ctx->stream)) -+ reset_front_end_for_pipe(dc, -+ old_pipe_ctx, dc->current_context); -+ } -+} -+ -+static void dcn10_set_bandwidth( -+ struct core_dc *dc, -+ struct validate_context *context, -+ bool decrease_allowed) -+{ -+ struct dm_pp_clock_for_voltage_req clock; -+ -+ if (IS_FPGA_MAXIMUS_DC(dc->ctx->dce_environment)) -+ return; -+ -+ if (decrease_allowed || context->dispclk_khz > dc->current_context->dispclk_khz) { -+ dc->res_pool->display_clock->funcs->set_clock( -+ dc->res_pool->display_clock, -+ context->dispclk_khz); -+ dc->current_context->dispclk_khz = context->dispclk_khz; -+ } -+ if (decrease_allowed || context->dcfclk_khz > dc->current_context->dcfclk_khz) { -+ clock.clk_type = DM_PP_CLOCK_TYPE_DCFCLK; -+ clock.clocks_in_khz = context->dcfclk_khz; -+ dm_pp_apply_clock_for_voltage_request(dc->ctx, &clock); -+ } -+ if (decrease_allowed || context->fclk_khz > dc->current_context->fclk_khz) { -+ clock.clk_type = DM_PP_CLOCK_TYPE_FCLK; -+ clock.clocks_in_khz = context->fclk_khz; -+ dm_pp_apply_clock_for_voltage_request(dc->ctx, &clock); -+ dc->current_context->fclk_khz = clock.clocks_in_khz ; -+ } -+ dcn10_pplib_apply_display_requirements(dc, context); -+} -+ -+static void dcn10_power_down_fe(struct core_dc *dc, struct pipe_ctx *pipe) -+{ -+ struct dc_context *ctx = dc->ctx; -+ uint32_t inst_offset = 0; -+ -+ HWSEQ_REG_SET(DC_IP_REQUEST_CNTL, -+ IP_REQUEST_EN, 1); -+ dpp_pg_control(ctx, pipe->pipe_idx, false); -+ hubp_pg_control(ctx, pipe->pipe_idx, false); -+ HWSEQ_REG_SET(DC_IP_REQUEST_CNTL, -+ IP_REQUEST_EN, 0); -+ -+ if (pipe->xfm) -+ pipe->xfm->funcs->transform_reset(pipe->xfm); -+ memset(&pipe->scl_data, 0, sizeof(pipe->scl_data)); -+} -+ -+static void set_drr(struct pipe_ctx **pipe_ctx, -+ int num_pipes, int vmin, int vmax) -+{ -+ int i = 0; -+ struct drr_params params = {0}; -+ -+ params.vertical_total_max = vmax; -+ params.vertical_total_min = vmin; -+ -+ /* TODO: If multiple pipes are to be supported, you need -+ * some GSL stuff -+ */ -+ for (i = 0; i < num_pipes; i++) { -+ pipe_ctx[i]->tg->funcs->set_drr(pipe_ctx[i]->tg, ¶ms); -+ } -+} -+ -+static void get_position(struct pipe_ctx **pipe_ctx, -+ int num_pipes, -+ struct crtc_position *position) -+{ -+ int i = 0; -+ -+ /* TODO: handle pipes > 1 -+ */ -+ for (i = 0; i < num_pipes; i++) -+ pipe_ctx[i]->tg->funcs->get_position(pipe_ctx[i]->tg, position); -+} -+ -+static void set_static_screen_control(struct pipe_ctx **pipe_ctx, -+ int num_pipes, const struct dc_static_screen_events *events) -+{ -+ unsigned int i; -+ unsigned int value = 0; -+ -+ if (events->surface_update) -+ value |= 0x80; -+ if (events->cursor_update) -+ value |= 0x2; -+ -+ for (i = 0; i < num_pipes; i++) -+ pipe_ctx[i]->tg->funcs-> -+ set_static_screen_control(pipe_ctx[i]->tg, value); -+} -+ -+static void set_plane_config( -+ const struct core_dc *dc, -+ struct pipe_ctx *pipe_ctx, -+ struct resource_context *res_ctx) -+{ -+ /* TODO */ -+ program_gamut_remap(pipe_ctx); -+} -+ -+static const struct hw_sequencer_funcs dcn10_funcs = { -+ .init_hw = init_hw, -+ .apply_ctx_to_hw = dce110_apply_ctx_to_hw, -+ .apply_ctx_for_surface = dcn10_apply_ctx_for_surface, -+ .set_plane_config = set_plane_config, -+ .update_plane_addr = update_plane_addr, -+ .update_pending_status = dce110_update_pending_status, -+ .set_input_transfer_func = dcn10_set_input_transfer_func, -+ .set_output_transfer_func = dcn10_set_output_transfer_func, -+ .power_down = dce110_power_down, -+ .enable_accelerated_mode = dce110_enable_accelerated_mode, -+ .enable_timing_synchronization = dcn10_enable_timing_synchronization, -+ .update_info_frame = dce110_update_info_frame, -+ .enable_stream = dce110_enable_stream, -+ .disable_stream = dce110_disable_stream, -+ .unblank_stream = dce110_unblank_stream, -+ .enable_display_pipe_clock_gating = NULL, /* TODOFPGA */ -+ .enable_display_power_gating = dcn10_enable_display_power_gating, -+ .power_down_front_end = dcn10_power_down_fe, -+ .power_on_front_end = dcn10_power_on_fe, -+ .pipe_control_lock = dcn10_pipe_control_lock, -+ .set_bandwidth = dcn10_set_bandwidth, -+ .reset_hw_ctx_wrap = reset_hw_ctx_wrap, -+ .prog_pixclk_crtc_otg = dcn10_prog_pixclk_crtc_otg, -+ .set_drr = set_drr, -+ .get_position = get_position, -+ .set_static_screen_control = set_static_screen_control -+}; -+ -+ -+bool dcn10_hw_sequencer_construct(struct core_dc *dc) -+{ -+ dc->hwss = dcn10_funcs; -+ return true; -+} -+ -diff --git a/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_hw_sequencer.h b/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_hw_sequencer.h -new file mode 100644 -index 0000000..c3aff2e ---- /dev/null -+++ b/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_hw_sequencer.h -@@ -0,0 +1,38 @@ -+/* -+* 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_HWSS_DCN10_H__ -+#define __DC_HWSS_DCN10_H__ -+ -+#include "core_types.h" -+ -+struct core_dc; -+ -+bool dcn10_hw_sequencer_construct(struct core_dc *dc); -+extern void fill_display_configs( -+ const struct validate_context *context, -+ struct dm_pp_display_configuration *pp_display_cfg); -+ -+#endif /* __DC_HWSS_DCN10_H__ */ -diff --git a/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_ipp.c b/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_ipp.c -new file mode 100644 -index 0000000..3062b7d ---- /dev/null -+++ b/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_ipp.c -@@ -0,0 +1,883 @@ -+/* -+ * 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 -+ * -+ */ -+ -+#include "dm_services.h" -+#include "dcn10_ipp.h" -+#include "reg_helper.h" -+ -+#define REG(reg) \ -+ (ippn10->regs->reg) -+ -+#undef FN -+#define FN(reg_name, field_name) \ -+ ippn10->ipp_shift->field_name, ippn10->ipp_mask->field_name -+ -+#define CTX \ -+ ippn10->base.ctx -+ -+ -+struct dcn10_input_csc_matrix { -+ enum dc_color_space color_space; -+ uint32_t regval[12]; -+}; -+ -+static const struct dcn10_input_csc_matrix dcn10_input_csc_matrix[] = { -+ {COLOR_SPACE_SRGB, -+ {0x2000, 0, 0, 0, 0, 0x2000, 0, 0, 0, 0, 0x2000, 0} }, -+ {COLOR_SPACE_SRGB_LIMITED, -+ {0x2000, 0, 0, 0, 0, 0x2000, 0, 0, 0, 0, 0x2000, 0} }, -+ {COLOR_SPACE_YCBCR601, -+ {0x2cdd, 0x2000, 0, 0xe991, 0xe926, 0x2000, 0xf4fd, 0x10ef, -+ 0, 0x2000, 0x38b4, 0xe3a6} }, -+ {COLOR_SPACE_YCBCR601_LIMITED, -+ {0x3353, 0x2568, 0, 0xe400, 0xe5dc, 0x2568, 0xf367, 0x1108, -+ 0, 0x2568, 0x40de, 0xdd3a} }, -+ {COLOR_SPACE_YCBCR709, -+ {0x3265, 0x2000, 0, 0xe6ce, 0xf105, 0x2000, 0xfa01, 0xa7d, 0, -+ 0x2000, 0x3b61, 0xe24f} }, -+ -+ {COLOR_SPACE_YCBCR709_LIMITED, -+ {0x39a6, 0x2568, 0, 0xe0d6, 0xeedd, 0x2568, 0xf925, 0x9a8, 0, -+ 0x2568, 0x43ee, 0xdbb2} } -+}; -+ -+enum dcn10_input_csc_select { -+ INPUT_CSC_SELECT_BYPASS = 0, -+ INPUT_CSC_SELECT_ICSC, -+ INPUT_CSC_SELECT_COMA -+}; -+ -+static void dcn10_program_input_csc( -+ struct input_pixel_processor *ipp, -+ enum dc_color_space color_space, -+ enum dcn10_input_csc_select select) -+{ -+ struct dcn10_ipp *ippn10 = TO_DCN10_IPP(ipp); -+ int i; -+ int arr_size = sizeof(dcn10_input_csc_matrix)/sizeof(struct dcn10_input_csc_matrix); -+ const uint32_t *regval = NULL; -+ uint32_t selection = 1; -+ -+ if (select == INPUT_CSC_SELECT_BYPASS) { -+ REG_SET(CM_ICSC_CONTROL, 0, CM_ICSC_MODE, 0); -+ return; -+ } -+ -+ for (i = 0; i < arr_size; i++) -+ if (dcn10_input_csc_matrix[i].color_space == color_space) { -+ regval = dcn10_input_csc_matrix[i].regval; -+ break; -+ } -+ -+ if (regval == NULL) { -+ BREAK_TO_DEBUGGER(); -+ return; -+ } -+ -+ if (select == INPUT_CSC_SELECT_COMA) -+ selection = 2; -+ REG_SET(CM_ICSC_CONTROL, 0, -+ CM_ICSC_MODE, selection); -+ -+ if (select == INPUT_CSC_SELECT_ICSC) { -+ /*R*/ -+ REG_SET_2(CM_ICSC_C11_C12, 0, -+ CM_ICSC_C11, regval[0], -+ CM_ICSC_C12, regval[1]); -+ regval += 2; -+ REG_SET_2(CM_ICSC_C13_C14, 0, -+ CM_ICSC_C13, regval[0], -+ CM_ICSC_C14, regval[1]); -+ /*G*/ -+ regval += 2; -+ REG_SET_2(CM_ICSC_C21_C22, 0, -+ CM_ICSC_C21, regval[0], -+ CM_ICSC_C22, regval[1]); -+ regval += 2; -+ REG_SET_2(CM_ICSC_C23_C24, 0, -+ CM_ICSC_C23, regval[0], -+ CM_ICSC_C24, regval[1]); -+ /*B*/ -+ regval += 2; -+ REG_SET_2(CM_ICSC_C31_C32, 0, -+ CM_ICSC_C31, regval[0], -+ CM_ICSC_C32, regval[1]); -+ regval += 2; -+ REG_SET_2(CM_ICSC_C33_C34, 0, -+ CM_ICSC_C33, regval[0], -+ CM_ICSC_C34, regval[1]); -+ } else { -+ /*R*/ -+ REG_SET_2(CM_COMA_C11_C12, 0, -+ CM_COMA_C11, regval[0], -+ CM_COMA_C12, regval[1]); -+ regval += 2; -+ REG_SET_2(CM_COMA_C13_C14, 0, -+ CM_COMA_C13, regval[0], -+ CM_COMA_C14, regval[1]); -+ /*G*/ -+ regval += 2; -+ REG_SET_2(CM_COMA_C21_C22, 0, -+ CM_COMA_C21, regval[0], -+ CM_COMA_C22, regval[1]); -+ regval += 2; -+ REG_SET_2(CM_COMA_C23_C24, 0, -+ CM_COMA_C23, regval[0], -+ CM_COMA_C24, regval[1]); -+ /*B*/ -+ regval += 2; -+ REG_SET_2(CM_COMA_C31_C32, 0, -+ CM_COMA_C31, regval[0], -+ CM_COMA_C32, regval[1]); -+ regval += 2; -+ REG_SET_2(CM_COMA_C33_C34, 0, -+ CM_COMA_C33, regval[0], -+ CM_COMA_C34, regval[1]); -+ } -+} -+ -+/*program de gamma RAM B*/ -+static void dcn10_ipp_program_degamma_lutb_settings( -+ struct input_pixel_processor *ipp, -+ const struct pwl_params *params) -+{ -+ const struct gamma_curve *curve; -+ struct dcn10_ipp *ippn10 = TO_DCN10_IPP(ipp); -+ -+ REG_SET_2(CM_DGAM_RAMB_START_CNTL_B, 0, -+ CM_DGAM_RAMB_EXP_REGION_START_B, params->arr_points[0].custom_float_x, -+ CM_DGAM_RAMB_EXP_REGION_START_SEGMENT_B, 0); -+ -+ REG_SET_2(CM_DGAM_RAMB_START_CNTL_G, 0, -+ CM_DGAM_RAMB_EXP_REGION_START_G, params->arr_points[0].custom_float_x, -+ CM_DGAM_RAMB_EXP_REGION_START_SEGMENT_G, 0); -+ -+ REG_SET_2(CM_DGAM_RAMB_START_CNTL_R, 0, -+ CM_DGAM_RAMB_EXP_REGION_START_R, params->arr_points[0].custom_float_x, -+ CM_DGAM_RAMB_EXP_REGION_START_SEGMENT_R, 0); -+ -+ REG_SET(CM_DGAM_RAMB_SLOPE_CNTL_B, 0, -+ CM_DGAM_RAMB_EXP_REGION_LINEAR_SLOPE_B, params->arr_points[0].custom_float_slope); -+ -+ REG_SET(CM_DGAM_RAMB_SLOPE_CNTL_G, 0, -+ CM_DGAM_RAMB_EXP_REGION_LINEAR_SLOPE_G, params->arr_points[0].custom_float_slope); -+ -+ REG_SET(CM_DGAM_RAMB_SLOPE_CNTL_R, 0, -+ CM_DGAM_RAMB_EXP_REGION_LINEAR_SLOPE_R, params->arr_points[0].custom_float_slope); -+ -+ REG_SET(CM_DGAM_RAMB_END_CNTL1_B, 0, -+ CM_DGAM_RAMB_EXP_REGION_END_B, params->arr_points[1].custom_float_x); -+ -+ REG_SET_2(CM_DGAM_RAMB_END_CNTL2_B, 0, -+ CM_DGAM_RAMB_EXP_REGION_END_SLOPE_B, params->arr_points[1].custom_float_y, -+ CM_DGAM_RAMB_EXP_REGION_END_BASE_B, params->arr_points[2].custom_float_slope); -+ -+ REG_SET(CM_DGAM_RAMB_END_CNTL1_G, 0, -+ CM_DGAM_RAMB_EXP_REGION_END_G, params->arr_points[1].custom_float_x); -+ -+ REG_SET_2(CM_DGAM_RAMB_END_CNTL2_G, 0, -+ CM_DGAM_RAMB_EXP_REGION_END_SLOPE_G, params->arr_points[1].custom_float_y, -+ CM_DGAM_RAMB_EXP_REGION_END_BASE_G, params->arr_points[2].custom_float_slope); -+ -+ REG_SET(CM_DGAM_RAMB_END_CNTL1_R, 0, -+ CM_DGAM_RAMB_EXP_REGION_END_R, params->arr_points[1].custom_float_x); -+ -+ REG_SET_2(CM_DGAM_RAMB_END_CNTL2_R, 0, -+ CM_DGAM_RAMB_EXP_REGION_END_SLOPE_R, params->arr_points[1].custom_float_y, -+ CM_DGAM_RAMB_EXP_REGION_END_BASE_R, params->arr_points[2].custom_float_slope); -+ -+ curve = params->arr_curve_points; -+ REG_SET_4(CM_DGAM_RAMB_REGION_0_1, 0, -+ CM_DGAM_RAMB_EXP_REGION0_LUT_OFFSET, curve[0].offset, -+ CM_DGAM_RAMB_EXP_REGION0_NUM_SEGMENTS, curve[0].segments_num, -+ CM_DGAM_RAMB_EXP_REGION1_LUT_OFFSET, curve[1].offset, -+ CM_DGAM_RAMB_EXP_REGION1_NUM_SEGMENTS, curve[1].segments_num); -+ -+ curve += 2; -+ REG_SET_4(CM_DGAM_RAMB_REGION_2_3, 0, -+ CM_DGAM_RAMB_EXP_REGION2_LUT_OFFSET, curve[0].offset, -+ CM_DGAM_RAMB_EXP_REGION2_NUM_SEGMENTS, curve[0].segments_num, -+ CM_DGAM_RAMB_EXP_REGION3_LUT_OFFSET, curve[1].offset, -+ CM_DGAM_RAMB_EXP_REGION3_NUM_SEGMENTS, curve[1].segments_num); -+ -+ curve += 2; -+ REG_SET_4(CM_DGAM_RAMB_REGION_4_5, 0, -+ CM_DGAM_RAMB_EXP_REGION4_LUT_OFFSET, curve[0].offset, -+ CM_DGAM_RAMB_EXP_REGION4_NUM_SEGMENTS, curve[0].segments_num, -+ CM_DGAM_RAMB_EXP_REGION5_LUT_OFFSET, curve[1].offset, -+ CM_DGAM_RAMB_EXP_REGION5_NUM_SEGMENTS, curve[1].segments_num); -+ -+ curve += 2; -+ REG_SET_4(CM_DGAM_RAMB_REGION_6_7, 0, -+ CM_DGAM_RAMB_EXP_REGION6_LUT_OFFSET, curve[0].offset, -+ CM_DGAM_RAMB_EXP_REGION6_NUM_SEGMENTS, curve[0].segments_num, -+ CM_DGAM_RAMB_EXP_REGION7_LUT_OFFSET, curve[1].offset, -+ CM_DGAM_RAMB_EXP_REGION7_NUM_SEGMENTS, curve[1].segments_num); -+ -+ curve += 2; -+ REG_SET_4(CM_DGAM_RAMB_REGION_8_9, 0, -+ CM_DGAM_RAMB_EXP_REGION8_LUT_OFFSET, curve[0].offset, -+ CM_DGAM_RAMB_EXP_REGION8_NUM_SEGMENTS, curve[0].segments_num, -+ CM_DGAM_RAMB_EXP_REGION9_LUT_OFFSET, curve[1].offset, -+ CM_DGAM_RAMB_EXP_REGION9_NUM_SEGMENTS, curve[1].segments_num); -+ -+ curve += 2; -+ REG_SET_4(CM_DGAM_RAMB_REGION_10_11, 0, -+ CM_DGAM_RAMB_EXP_REGION10_LUT_OFFSET, curve[0].offset, -+ CM_DGAM_RAMB_EXP_REGION10_NUM_SEGMENTS, curve[0].segments_num, -+ CM_DGAM_RAMB_EXP_REGION11_LUT_OFFSET, curve[1].offset, -+ CM_DGAM_RAMB_EXP_REGION11_NUM_SEGMENTS, curve[1].segments_num); -+ -+ curve += 2; -+ REG_SET_4(CM_DGAM_RAMB_REGION_12_13, 0, -+ CM_DGAM_RAMB_EXP_REGION12_LUT_OFFSET, curve[0].offset, -+ CM_DGAM_RAMB_EXP_REGION12_NUM_SEGMENTS, curve[0].segments_num, -+ CM_DGAM_RAMB_EXP_REGION13_LUT_OFFSET, curve[1].offset, -+ CM_DGAM_RAMB_EXP_REGION13_NUM_SEGMENTS, curve[1].segments_num); -+ -+ curve += 2; -+ REG_SET_4(CM_DGAM_RAMB_REGION_14_15, 0, -+ CM_DGAM_RAMB_EXP_REGION14_LUT_OFFSET, curve[0].offset, -+ CM_DGAM_RAMB_EXP_REGION14_NUM_SEGMENTS, curve[0].segments_num, -+ CM_DGAM_RAMB_EXP_REGION15_LUT_OFFSET, curve[1].offset, -+ CM_DGAM_RAMB_EXP_REGION15_NUM_SEGMENTS, curve[1].segments_num); -+} -+ -+/*program de gamma RAM A*/ -+static void dcn10_ipp_program_degamma_luta_settings( -+ struct input_pixel_processor *ipp, -+ const struct pwl_params *params) -+{ -+ const struct gamma_curve *curve; -+ struct dcn10_ipp *ippn10 = TO_DCN10_IPP(ipp); -+ -+ REG_SET_2(CM_DGAM_RAMA_START_CNTL_B, 0, -+ CM_DGAM_RAMA_EXP_REGION_START_B, params->arr_points[0].custom_float_x, -+ CM_DGAM_RAMA_EXP_REGION_START_SEGMENT_B, 0); -+ -+ REG_SET_2(CM_DGAM_RAMA_START_CNTL_G, 0, -+ CM_DGAM_RAMA_EXP_REGION_START_G, params->arr_points[0].custom_float_x, -+ CM_DGAM_RAMA_EXP_REGION_START_SEGMENT_G, 0); -+ -+ REG_SET_2(CM_DGAM_RAMA_START_CNTL_R, 0, -+ CM_DGAM_RAMA_EXP_REGION_START_R, params->arr_points[0].custom_float_x, -+ CM_DGAM_RAMA_EXP_REGION_START_SEGMENT_R, 0); -+ -+ REG_SET(CM_DGAM_RAMA_SLOPE_CNTL_B, 0, -+ CM_DGAM_RAMA_EXP_REGION_LINEAR_SLOPE_B, params->arr_points[0].custom_float_slope); -+ -+ REG_SET(CM_DGAM_RAMA_SLOPE_CNTL_G, 0, -+ CM_DGAM_RAMA_EXP_REGION_LINEAR_SLOPE_G, params->arr_points[0].custom_float_slope); -+ -+ REG_SET(CM_DGAM_RAMA_SLOPE_CNTL_R, 0, -+ CM_DGAM_RAMA_EXP_REGION_LINEAR_SLOPE_R, params->arr_points[0].custom_float_slope); -+ -+ REG_SET(CM_DGAM_RAMA_END_CNTL1_B, 0, -+ CM_DGAM_RAMA_EXP_REGION_END_B, params->arr_points[1].custom_float_x); -+ -+ REG_SET_2(CM_DGAM_RAMA_END_CNTL2_B, 0, -+ CM_DGAM_RAMA_EXP_REGION_END_SLOPE_B, params->arr_points[1].custom_float_y, -+ CM_DGAM_RAMA_EXP_REGION_END_BASE_B, params->arr_points[2].custom_float_slope); -+ -+ REG_SET(CM_DGAM_RAMA_END_CNTL1_G, 0, -+ CM_DGAM_RAMA_EXP_REGION_END_G, params->arr_points[1].custom_float_x); -+ -+ REG_SET_2(CM_DGAM_RAMA_END_CNTL2_G, 0, -+ CM_DGAM_RAMA_EXP_REGION_END_SLOPE_G, params->arr_points[1].custom_float_y, -+ CM_DGAM_RAMA_EXP_REGION_END_BASE_G, params->arr_points[2].custom_float_slope); -+ -+ REG_SET(CM_DGAM_RAMA_END_CNTL1_R, 0, -+ CM_DGAM_RAMA_EXP_REGION_END_R, params->arr_points[1].custom_float_x); -+ -+ REG_SET_2(CM_DGAM_RAMA_END_CNTL2_R, 0, -+ CM_DGAM_RAMA_EXP_REGION_END_SLOPE_R, params->arr_points[1].custom_float_y, -+ CM_DGAM_RAMA_EXP_REGION_END_BASE_R, params->arr_points[2].custom_float_slope); -+ -+ curve = params->arr_curve_points; -+ REG_SET_4(CM_DGAM_RAMA_REGION_0_1, 0, -+ CM_DGAM_RAMA_EXP_REGION0_LUT_OFFSET, curve[0].offset, -+ CM_DGAM_RAMA_EXP_REGION0_NUM_SEGMENTS, curve[0].segments_num, -+ CM_DGAM_RAMA_EXP_REGION1_LUT_OFFSET, curve[1].offset, -+ CM_DGAM_RAMA_EXP_REGION1_NUM_SEGMENTS, curve[1].segments_num); -+ -+ curve += 2; -+ REG_SET_4(CM_DGAM_RAMA_REGION_2_3, 0, -+ CM_DGAM_RAMA_EXP_REGION2_LUT_OFFSET, curve[0].offset, -+ CM_DGAM_RAMA_EXP_REGION2_NUM_SEGMENTS, curve[0].segments_num, -+ CM_DGAM_RAMA_EXP_REGION3_LUT_OFFSET, curve[1].offset, -+ CM_DGAM_RAMA_EXP_REGION3_NUM_SEGMENTS, curve[1].segments_num); -+ -+ curve += 2; -+ REG_SET_4(CM_DGAM_RAMA_REGION_4_5, 0, -+ CM_DGAM_RAMA_EXP_REGION4_LUT_OFFSET, curve[0].offset, -+ CM_DGAM_RAMA_EXP_REGION4_NUM_SEGMENTS, curve[0].segments_num, -+ CM_DGAM_RAMA_EXP_REGION5_LUT_OFFSET, curve[1].offset, -+ CM_DGAM_RAMA_EXP_REGION5_NUM_SEGMENTS, curve[1].segments_num); -+ -+ curve += 2; -+ REG_SET_4(CM_DGAM_RAMA_REGION_6_7, 0, -+ CM_DGAM_RAMA_EXP_REGION6_LUT_OFFSET, curve[0].offset, -+ CM_DGAM_RAMA_EXP_REGION6_NUM_SEGMENTS, curve[0].segments_num, -+ CM_DGAM_RAMA_EXP_REGION7_LUT_OFFSET, curve[1].offset, -+ CM_DGAM_RAMA_EXP_REGION7_NUM_SEGMENTS, curve[1].segments_num); -+ -+ curve += 2; -+ REG_SET_4(CM_DGAM_RAMA_REGION_8_9, 0, -+ CM_DGAM_RAMA_EXP_REGION8_LUT_OFFSET, curve[0].offset, -+ CM_DGAM_RAMA_EXP_REGION8_NUM_SEGMENTS, curve[0].segments_num, -+ CM_DGAM_RAMA_EXP_REGION9_LUT_OFFSET, curve[1].offset, -+ CM_DGAM_RAMA_EXP_REGION9_NUM_SEGMENTS, curve[1].segments_num); -+ -+ curve += 2; -+ REG_SET_4(CM_DGAM_RAMA_REGION_10_11, 0, -+ CM_DGAM_RAMA_EXP_REGION10_LUT_OFFSET, curve[0].offset, -+ CM_DGAM_RAMA_EXP_REGION10_NUM_SEGMENTS, curve[0].segments_num, -+ CM_DGAM_RAMA_EXP_REGION11_LUT_OFFSET, curve[1].offset, -+ CM_DGAM_RAMA_EXP_REGION11_NUM_SEGMENTS, curve[1].segments_num); -+ -+ curve += 2; -+ REG_SET_4(CM_DGAM_RAMA_REGION_12_13, 0, -+ CM_DGAM_RAMA_EXP_REGION12_LUT_OFFSET, curve[0].offset, -+ CM_DGAM_RAMA_EXP_REGION12_NUM_SEGMENTS, curve[0].segments_num, -+ CM_DGAM_RAMA_EXP_REGION13_LUT_OFFSET, curve[1].offset, -+ CM_DGAM_RAMA_EXP_REGION13_NUM_SEGMENTS, curve[1].segments_num); -+ -+ curve += 2; -+ REG_SET_4(CM_DGAM_RAMA_REGION_14_15, 0, -+ CM_DGAM_RAMA_EXP_REGION14_LUT_OFFSET, curve[0].offset, -+ CM_DGAM_RAMA_EXP_REGION14_NUM_SEGMENTS, curve[0].segments_num, -+ CM_DGAM_RAMA_EXP_REGION15_LUT_OFFSET, curve[1].offset, -+ CM_DGAM_RAMA_EXP_REGION15_NUM_SEGMENTS, curve[1].segments_num); -+} -+ -+static void ipp_power_on_degamma_lut( -+ struct input_pixel_processor *ipp, -+ bool power_on) -+{ -+ struct dcn10_ipp *ippn10 = TO_DCN10_IPP(ipp); -+ -+ REG_SET(CM_MEM_PWR_CTRL, 0, -+ SHARED_MEM_PWR_DIS, power_on == true ? 0:1); -+ -+} -+ -+static void ipp_program_degamma_lut( -+ struct input_pixel_processor *ipp, -+ const struct pwl_result_data *rgb, -+ uint32_t num, -+ bool is_ram_a) -+{ -+ uint32_t i; -+ -+ struct dcn10_ipp *ippn10 = TO_DCN10_IPP(ipp); -+ REG_UPDATE(CM_IGAM_LUT_RW_CONTROL, CM_IGAM_LUT_HOST_EN, 0); -+ REG_UPDATE(CM_DGAM_LUT_WRITE_EN_MASK, -+ CM_DGAM_LUT_WRITE_EN_MASK, 7); -+ REG_UPDATE(CM_DGAM_LUT_WRITE_EN_MASK, CM_DGAM_LUT_WRITE_SEL, -+ is_ram_a == true ? 0:1); -+ -+ REG_SET(CM_DGAM_LUT_INDEX, 0, CM_DGAM_LUT_INDEX, 0); -+ for (i = 0 ; i < num; i++) { -+ REG_SET(CM_DGAM_LUT_DATA, 0, CM_DGAM_LUT_DATA, rgb[i].red_reg); -+ REG_SET(CM_DGAM_LUT_DATA, 0, CM_DGAM_LUT_DATA, rgb[i].green_reg); -+ REG_SET(CM_DGAM_LUT_DATA, 0, CM_DGAM_LUT_DATA, rgb[i].blue_reg); -+ -+ REG_SET(CM_DGAM_LUT_DATA, 0, -+ CM_DGAM_LUT_DATA, rgb[i].delta_red_reg); -+ REG_SET(CM_DGAM_LUT_DATA, 0, -+ CM_DGAM_LUT_DATA, rgb[i].delta_green_reg); -+ REG_SET(CM_DGAM_LUT_DATA, 0, -+ CM_DGAM_LUT_DATA, rgb[i].delta_blue_reg); -+ -+ } -+ -+} -+ -+static void dcn10_ipp_enable_cm_block( -+ struct input_pixel_processor *ipp) -+{ -+ struct dcn10_ipp *ippn10 = TO_DCN10_IPP(ipp); -+ -+ REG_UPDATE(DPP_CONTROL, DPP_CLOCK_ENABLE, 1); -+ REG_UPDATE(CM_CONTROL, CM_BYPASS_EN, 0); -+} -+ -+ -+static void dcn10_ipp_full_bypass(struct input_pixel_processor *ipp) -+{ -+ struct dcn10_ipp *ippn10 = TO_DCN10_IPP(ipp); -+ -+ /* Input pixel format: ARGB8888 */ -+ REG_SET(CNVC_SURFACE_PIXEL_FORMAT, 0, -+ CNVC_SURFACE_PIXEL_FORMAT, 0x8); -+ -+ /* Zero expansion */ -+ REG_SET_3(FORMAT_CONTROL, 0, -+ CNVC_BYPASS, 0, -+ ALPHA_EN, 0, -+ FORMAT_EXPANSION_MODE, 0); -+ -+ /* COLOR_KEYER_CONTROL.COLOR_KEYER_EN = 0 this should be default */ -+ REG_SET(CM_CONTROL, 0, CM_BYPASS_EN, 1); -+ -+ /* Setting degamma bypass for now */ -+ REG_SET(CM_DGAM_CONTROL, 0, CM_DGAM_LUT_MODE, 0); -+ REG_SET(CM_IGAM_CONTROL, 0, CM_IGAM_LUT_MODE, 0); -+} -+ -+static void dcn10_ipp_set_degamma( -+ struct input_pixel_processor *ipp, -+ enum ipp_degamma_mode mode) -+{ -+ struct dcn10_ipp *ippn10 = TO_DCN10_IPP(ipp); -+ dcn10_ipp_enable_cm_block(ipp); -+ -+ switch (mode) { -+ case IPP_DEGAMMA_MODE_BYPASS: -+ /* Setting de gamma bypass for now */ -+ REG_UPDATE(CM_DGAM_CONTROL, CM_DGAM_LUT_MODE, 0); -+ break; -+ case IPP_DEGAMMA_MODE_HW_sRGB: -+ REG_UPDATE(CM_DGAM_CONTROL, CM_DGAM_LUT_MODE, 1); -+ break; -+ case IPP_DEGAMMA_MODE_HW_xvYCC: -+ REG_UPDATE(CM_DGAM_CONTROL, CM_DGAM_LUT_MODE, 2); -+ break; -+ default: -+ BREAK_TO_DEBUGGER(); -+ break; -+ } -+} -+ -+static bool dcn10_cursor_program_control( -+ struct dcn10_ipp *ippn10, -+ bool pixel_data_invert, -+ enum dc_cursor_color_format color_format) -+{ -+ REG_SET_2(CURSOR_SETTINS, 0, -+ /* no shift of the cursor HDL schedule */ -+ CURSOR0_DST_Y_OFFSET, 0, -+ /* used to shift the cursor chunk request deadline */ -+ CURSOR0_CHUNK_HDL_ADJUST, 3); -+ -+ REG_UPDATE_2(CURSOR0_CONTROL, -+ CUR0_MODE, color_format, -+ CUR0_INVERT_MODE, 0); -+ -+ if (color_format == CURSOR_MODE_MONO) { -+ /* todo: clarify what to program these to */ -+ REG_UPDATE(CURSOR0_COLOR0, -+ CUR0_COLOR0, 0x00000000); -+ REG_UPDATE(CURSOR0_COLOR1, -+ CUR0_COLOR1, 0xFFFFFFFF); -+ } -+ -+ /* TODO: Fixed vs float */ -+ -+ REG_UPDATE_3(FORMAT_CONTROL, -+ CNVC_BYPASS, 0, -+ ALPHA_EN, 1, -+ FORMAT_EXPANSION_MODE, 0); -+ -+ REG_UPDATE(CURSOR0_CONTROL, -+ CUR0_EXPANSION_MODE, 0); -+ -+ if (0 /*attributes->attribute_flags.bits.MIN_MAX_INVERT*/) { -+ REG_UPDATE(CURSOR0_CONTROL, -+ CUR0_MAX, -+ 0 /* TODO */); -+ REG_UPDATE(CURSOR0_CONTROL, -+ CUR0_MIN, -+ 0 /* TODO */); -+ } -+ -+ return true; -+} -+ -+enum cursor_pitch { -+ CURSOR_PITCH_64_PIXELS = 0, -+ CURSOR_PITCH_128_PIXELS, -+ CURSOR_PITCH_256_PIXELS -+}; -+ -+enum cursor_lines_per_chunk { -+ CURSOR_LINE_PER_CHUNK_2 = 1, -+ CURSOR_LINE_PER_CHUNK_4, -+ CURSOR_LINE_PER_CHUNK_8, -+ CURSOR_LINE_PER_CHUNK_16 -+}; -+ -+static enum cursor_pitch dcn10_get_cursor_pitch( -+ unsigned int pitch) -+{ -+ enum cursor_pitch hw_pitch; -+ -+ switch (pitch) { -+ case 64: -+ hw_pitch = CURSOR_PITCH_64_PIXELS; -+ break; -+ case 128: -+ hw_pitch = CURSOR_PITCH_128_PIXELS; -+ break; -+ case 256: -+ hw_pitch = CURSOR_PITCH_256_PIXELS; -+ break; -+ default: -+ DC_ERR("Invalid cursor pitch of %d. " -+ "Only 64/128/256 is supported on DCN.\n", pitch); -+ hw_pitch = CURSOR_PITCH_64_PIXELS; -+ break; -+ } -+ return hw_pitch; -+} -+ -+static enum cursor_lines_per_chunk dcn10_get_lines_per_chunk( -+ unsigned int cur_width, -+ enum dc_cursor_color_format format) -+{ -+ enum cursor_lines_per_chunk line_per_chunk; -+ -+ if (format == CURSOR_MODE_MONO) -+ /* impl B. expansion in CUR Buffer reader */ -+ line_per_chunk = CURSOR_LINE_PER_CHUNK_16; -+ else if (cur_width <= 32) -+ line_per_chunk = CURSOR_LINE_PER_CHUNK_16; -+ else if (cur_width <= 64) -+ line_per_chunk = CURSOR_LINE_PER_CHUNK_8; -+ else if (cur_width <= 128) -+ line_per_chunk = CURSOR_LINE_PER_CHUNK_4; -+ else -+ line_per_chunk = CURSOR_LINE_PER_CHUNK_2; -+ -+ return line_per_chunk; -+} -+ -+static void dcn10_cursor_set_attributes( -+ struct input_pixel_processor *ipp, -+ const struct dc_cursor_attributes *attr) -+{ -+ struct dcn10_ipp *ippn10 = TO_DCN10_IPP(ipp); -+ enum cursor_pitch hw_pitch = dcn10_get_cursor_pitch(attr->pitch); -+ enum cursor_lines_per_chunk lpc = dcn10_get_lines_per_chunk( -+ attr->width, attr->color_format); -+ -+ ippn10->curs_attr = *attr; -+ -+ REG_UPDATE(CURSOR_SURFACE_ADDRESS_HIGH, -+ CURSOR_SURFACE_ADDRESS_HIGH, attr->address.high_part); -+ REG_UPDATE(CURSOR_SURFACE_ADDRESS, -+ CURSOR_SURFACE_ADDRESS, attr->address.low_part); -+ -+ REG_UPDATE_2(CURSOR_SIZE, -+ CURSOR_WIDTH, attr->width, -+ CURSOR_HEIGHT, attr->height); -+ -+ REG_UPDATE_3(CURSOR_CONTROL, -+ CURSOR_MODE, attr->color_format, -+ CURSOR_PITCH, hw_pitch, -+ CURSOR_LINES_PER_CHUNK, lpc); -+ -+ dcn10_cursor_program_control(ippn10, -+ attr->attribute_flags.bits.INVERT_PIXEL_DATA, -+ attr->color_format); -+} -+ -+static void dcn10_cursor_set_position( -+ struct input_pixel_processor *ipp, -+ const struct dc_cursor_position *pos, -+ const struct dc_cursor_mi_param *param) -+{ -+ struct dcn10_ipp *ippn10 = TO_DCN10_IPP(ipp); -+ int src_x_offset = pos->x - pos->x_hotspot - param->viewport_x_start; -+ uint32_t cur_en = pos->enable ? 1 : 0; -+ uint32_t dst_x_offset = (src_x_offset >= 0) ? src_x_offset : 0; -+ -+ dst_x_offset *= param->ref_clk_khz; -+ dst_x_offset /= param->pixel_clk_khz; -+ -+ ASSERT(param->h_scale_ratio.value); -+ -+ if (param->h_scale_ratio.value) -+ dst_x_offset = dal_fixed31_32_floor(dal_fixed31_32_div( -+ dal_fixed31_32_from_int(dst_x_offset), -+ param->h_scale_ratio)); -+ -+ if (src_x_offset >= (int)param->viewport_width) -+ cur_en = 0; /* not visible beyond right edge*/ -+ -+ if (src_x_offset + (int)ippn10->curs_attr.width < 0) -+ cur_en = 0; /* not visible beyond left edge*/ -+ -+ if (cur_en && REG_READ(CURSOR_SURFACE_ADDRESS) == 0) -+ dcn10_cursor_set_attributes(ipp, &ippn10->curs_attr); -+ REG_UPDATE(CURSOR_CONTROL, -+ CURSOR_ENABLE, cur_en); -+ REG_UPDATE(CURSOR0_CONTROL, -+ CUR0_ENABLE, cur_en); -+ -+ REG_SET_2(CURSOR_POSITION, 0, -+ CURSOR_X_POSITION, pos->x, -+ CURSOR_Y_POSITION, pos->y); -+ -+ REG_SET_2(CURSOR_HOT_SPOT, 0, -+ CURSOR_HOT_SPOT_X, pos->x_hotspot, -+ CURSOR_HOT_SPOT_Y, pos->y_hotspot); -+ -+ REG_SET(CURSOR_DST_OFFSET, 0, -+ CURSOR_DST_X_OFFSET, dst_x_offset); -+ /* TODO Handle surface pixel formats other than 4:4:4 */ -+} -+ -+enum pixel_format_description { -+ PIXEL_FORMAT_FIXED = 0, -+ PIXEL_FORMAT_FIXED16, -+ PIXEL_FORMAT_FLOAT -+ -+}; -+ -+static void dcn10_setup_format_flags(enum surface_pixel_format input_format,\ -+ enum pixel_format_description *fmt) -+{ -+ -+ if (input_format == SURFACE_PIXEL_FORMAT_GRPH_ARGB16161616F || -+ input_format == SURFACE_PIXEL_FORMAT_GRPH_ABGR16161616F) -+ *fmt = PIXEL_FORMAT_FLOAT; -+ else if (input_format == SURFACE_PIXEL_FORMAT_GRPH_ARGB16161616) -+ *fmt = PIXEL_FORMAT_FIXED16; -+ else -+ *fmt = PIXEL_FORMAT_FIXED; -+} -+ -+static void dcn10_ipp_set_degamma_format_float(struct input_pixel_processor *ipp, -+ bool is_float) -+{ -+ struct dcn10_ipp *ippn10 = TO_DCN10_IPP(ipp); -+ -+ if (is_float) { -+ REG_UPDATE(CM_IGAM_CONTROL, CM_IGAM_INPUT_FORMAT, 3); -+ REG_UPDATE(CM_IGAM_CONTROL, CM_IGAM_LUT_MODE, 1); -+ } else { -+ REG_UPDATE(CM_IGAM_CONTROL, CM_IGAM_INPUT_FORMAT, 2); -+ REG_UPDATE(CM_IGAM_CONTROL, CM_IGAM_LUT_MODE, 0); -+ } -+} -+ -+ -+static void dcn10_ipp_cnv_setup ( -+ struct input_pixel_processor *ipp, -+ enum surface_pixel_format input_format, -+ enum expansion_mode mode, -+ enum ipp_output_format cnv_out_format) -+{ -+ uint32_t pixel_format; -+ uint32_t alpha_en; -+ enum pixel_format_description fmt ; -+ enum dc_color_space color_space; -+ enum dcn10_input_csc_select select; -+ bool is_float; -+ struct dcn10_ipp *ippn10 = TO_DCN10_IPP(ipp); -+ bool force_disable_cursor = false; -+ -+ dcn10_setup_format_flags(input_format, &fmt); -+ alpha_en = 1; -+ pixel_format = 0; -+ color_space = COLOR_SPACE_SRGB; -+ select = INPUT_CSC_SELECT_BYPASS; -+ is_float = false; -+ -+ switch (fmt) { -+ case PIXEL_FORMAT_FIXED: -+ case PIXEL_FORMAT_FIXED16: -+ /*when output is float then FORMAT_CONTROL__OUTPUT_FP=1*/ -+ REG_SET_3(FORMAT_CONTROL, 0, -+ CNVC_BYPASS, 0, -+ FORMAT_EXPANSION_MODE, mode, -+ OUTPUT_FP, 0); -+ break; -+ case PIXEL_FORMAT_FLOAT: -+ REG_SET_3(FORMAT_CONTROL, 0, -+ CNVC_BYPASS, 0, -+ FORMAT_EXPANSION_MODE, mode, -+ OUTPUT_FP, 1); -+ is_float = true; -+ break; -+ default: -+ -+ break; -+ } -+ -+ dcn10_ipp_set_degamma_format_float(ipp, is_float); -+ -+ switch (input_format) { -+ case SURFACE_PIXEL_FORMAT_GRPH_ARGB1555: -+ pixel_format = 1; -+ break; -+ case SURFACE_PIXEL_FORMAT_GRPH_RGB565: -+ pixel_format = 3; -+ alpha_en = 0; -+ break; -+ case SURFACE_PIXEL_FORMAT_GRPH_ARGB8888: -+ case SURFACE_PIXEL_FORMAT_GRPH_ABGR8888: -+ pixel_format = 8; -+ break; -+ case SURFACE_PIXEL_FORMAT_GRPH_ARGB2101010: -+ case SURFACE_PIXEL_FORMAT_GRPH_ABGR2101010: -+ pixel_format = 10; -+ break; -+ case SURFACE_PIXEL_FORMAT_VIDEO_420_YCbCr: -+ force_disable_cursor = false; -+ pixel_format = 65; -+ color_space = COLOR_SPACE_YCBCR709; -+ select = INPUT_CSC_SELECT_ICSC; -+ break; -+ case SURFACE_PIXEL_FORMAT_VIDEO_420_YCrCb: -+ force_disable_cursor = true; -+ pixel_format = 64; -+ color_space = COLOR_SPACE_YCBCR709; -+ select = INPUT_CSC_SELECT_ICSC; -+ break; -+ case SURFACE_PIXEL_FORMAT_VIDEO_420_10bpc_YCbCr: -+ force_disable_cursor = true; -+ pixel_format = 67; -+ color_space = COLOR_SPACE_YCBCR709; -+ select = INPUT_CSC_SELECT_ICSC; -+ break; -+ case SURFACE_PIXEL_FORMAT_VIDEO_420_10bpc_YCrCb: -+ force_disable_cursor = true; -+ pixel_format = 66; -+ color_space = COLOR_SPACE_YCBCR709; -+ select = INPUT_CSC_SELECT_ICSC; -+ break; -+ case SURFACE_PIXEL_FORMAT_GRPH_ARGB16161616: -+ pixel_format = 22; -+ break; -+ case SURFACE_PIXEL_FORMAT_GRPH_ARGB16161616F: -+ pixel_format = 24; -+ break; -+ case SURFACE_PIXEL_FORMAT_GRPH_ABGR16161616F: -+ pixel_format = 25; -+ break; -+ default: -+ break; -+ } -+ REG_SET(CNVC_SURFACE_PIXEL_FORMAT, 0, -+ CNVC_SURFACE_PIXEL_FORMAT, pixel_format); -+ REG_UPDATE(FORMAT_CONTROL, ALPHA_EN, alpha_en); -+ -+ dcn10_program_input_csc(ipp, color_space, select); -+ -+ if (force_disable_cursor) { -+ REG_UPDATE(CURSOR_CONTROL, -+ CURSOR_ENABLE, 0); -+ REG_UPDATE(CURSOR0_CONTROL, -+ CUR0_ENABLE, 0); -+ } -+} -+ -+ -+static bool dcn10_degamma_ram_inuse(struct input_pixel_processor *ipp, -+ bool *ram_a_inuse) -+{ -+ bool ret = false; -+ uint32_t status_reg = 0; -+ struct dcn10_ipp *ippn10 = TO_DCN10_IPP(ipp); -+ -+ status_reg = (REG_READ(CM_IGAM_LUT_RW_CONTROL) & 0x0F00) >>16; -+ if (status_reg == 9) { -+ *ram_a_inuse = true; -+ ret = true; -+ } else if (status_reg == 10) { -+ *ram_a_inuse = false; -+ ret = true; -+ } -+ return ret; -+} -+ -+static void dcn10_degamma_ram_select(struct input_pixel_processor *ipp, -+ bool use_ram_a) -+{ -+ struct dcn10_ipp *ippn10 = TO_DCN10_IPP(ipp); -+ -+ if (use_ram_a) -+ REG_UPDATE(CM_DGAM_CONTROL, CM_DGAM_LUT_MODE, 3); -+ else -+ REG_UPDATE(CM_DGAM_CONTROL, CM_DGAM_LUT_MODE, 4); -+ -+} -+ -+static void dcn10_ipp_set_degamma_pwl(struct input_pixel_processor *ipp, -+ const struct pwl_params *params) -+{ -+ bool is_ram_a = true; -+ -+ ipp_power_on_degamma_lut(ipp, true); -+ dcn10_ipp_enable_cm_block(ipp); -+ dcn10_degamma_ram_inuse(ipp, &is_ram_a); -+ if (is_ram_a == true) -+ dcn10_ipp_program_degamma_lutb_settings(ipp, params); -+ else -+ dcn10_ipp_program_degamma_luta_settings(ipp, params); -+ -+ ipp_program_degamma_lut(ipp, params->rgb_resulted, -+ params->hw_points_num, !is_ram_a); -+ dcn10_degamma_ram_select(ipp, !is_ram_a); -+} -+ -+/*****************************************/ -+/* Constructor, Destructor */ -+/*****************************************/ -+ -+static void dcn10_ipp_destroy(struct input_pixel_processor **ipp) -+{ -+ dm_free(TO_DCN10_IPP(*ipp)); -+ *ipp = NULL; -+} -+ -+static const struct ipp_funcs dcn10_ipp_funcs = { -+ .ipp_cursor_set_attributes = dcn10_cursor_set_attributes, -+ .ipp_cursor_set_position = dcn10_cursor_set_position, -+ .ipp_set_degamma = dcn10_ipp_set_degamma, -+ .ipp_full_bypass = dcn10_ipp_full_bypass, -+ .ipp_setup = dcn10_ipp_cnv_setup, -+ .ipp_program_degamma_pwl = dcn10_ipp_set_degamma_pwl, -+ .ipp_destroy = dcn10_ipp_destroy -+}; -+ -+void dcn10_ipp_construct( -+ struct dcn10_ipp *ippn10, -+ struct dc_context *ctx, -+ int inst, -+ const struct dcn10_ipp_registers *regs, -+ const struct dcn10_ipp_shift *ipp_shift, -+ const struct dcn10_ipp_mask *ipp_mask) -+{ -+ ippn10->base.ctx = ctx; -+ ippn10->base.inst = inst; -+ ippn10->base.funcs = &dcn10_ipp_funcs; -+ -+ ippn10->regs = regs; -+ ippn10->ipp_shift = ipp_shift; -+ ippn10->ipp_mask = ipp_mask; -+} -diff --git a/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_ipp.h b/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_ipp.h -new file mode 100644 -index 0000000..a4ea4e7 ---- /dev/null -+++ b/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_ipp.h -@@ -0,0 +1,549 @@ -+/* -+ * 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 _DCN10_IPP_H_ -+#define _DCN10_IPP_H_ -+ -+#include "ipp.h" -+ -+#define TO_DCN10_IPP(ipp)\ -+ container_of(ipp, struct dcn10_ipp, base) -+ -+#define IPP_DCN10_REG_LIST(id) \ -+ SRI(CM_ICSC_CONTROL, CM, id), \ -+ SRI(CM_ICSC_C11_C12, CM, id), \ -+ SRI(CM_ICSC_C13_C14, CM, id), \ -+ SRI(CM_ICSC_C21_C22, CM, id), \ -+ SRI(CM_ICSC_C23_C24, CM, id), \ -+ SRI(CM_ICSC_C31_C32, CM, id), \ -+ SRI(CM_ICSC_C33_C34, CM, id), \ -+ SRI(CM_COMA_C11_C12, CM, id), \ -+ SRI(CM_COMA_C13_C14, CM, id), \ -+ SRI(CM_COMA_C21_C22, CM, id), \ -+ SRI(CM_COMA_C23_C24, CM, id), \ -+ SRI(CM_COMA_C31_C32, CM, id), \ -+ SRI(CM_COMA_C33_C34, CM, id), \ -+ SRI(CM_DGAM_RAMB_START_CNTL_B, CM, id), \ -+ SRI(CM_DGAM_RAMB_START_CNTL_G, CM, id), \ -+ SRI(CM_DGAM_RAMB_START_CNTL_R, CM, id), \ -+ SRI(CM_DGAM_RAMB_SLOPE_CNTL_B, CM, id), \ -+ SRI(CM_DGAM_RAMB_SLOPE_CNTL_G, CM, id), \ -+ SRI(CM_DGAM_RAMB_SLOPE_CNTL_R, CM, id), \ -+ SRI(CM_DGAM_RAMB_END_CNTL1_B, CM, id), \ -+ SRI(CM_DGAM_RAMB_END_CNTL2_B, CM, id), \ -+ SRI(CM_DGAM_RAMB_END_CNTL1_G, CM, id), \ -+ SRI(CM_DGAM_RAMB_END_CNTL2_G, CM, id), \ -+ SRI(CM_DGAM_RAMB_END_CNTL1_R, CM, id), \ -+ SRI(CM_DGAM_RAMB_END_CNTL2_R, CM, id), \ -+ SRI(CM_DGAM_RAMB_REGION_0_1, CM, id), \ -+ SRI(CM_DGAM_RAMB_REGION_2_3, CM, id), \ -+ SRI(CM_DGAM_RAMB_REGION_4_5, CM, id), \ -+ SRI(CM_DGAM_RAMB_REGION_6_7, CM, id), \ -+ SRI(CM_DGAM_RAMB_REGION_8_9, CM, id), \ -+ SRI(CM_DGAM_RAMB_REGION_10_11, CM, id), \ -+ SRI(CM_DGAM_RAMB_REGION_12_13, CM, id), \ -+ SRI(CM_DGAM_RAMB_REGION_14_15, CM, id), \ -+ SRI(CM_DGAM_RAMA_START_CNTL_B, CM, id), \ -+ SRI(CM_DGAM_RAMA_START_CNTL_G, CM, id), \ -+ SRI(CM_DGAM_RAMA_START_CNTL_R, CM, id), \ -+ SRI(CM_DGAM_RAMA_SLOPE_CNTL_B, CM, id), \ -+ SRI(CM_DGAM_RAMA_SLOPE_CNTL_G, CM, id), \ -+ SRI(CM_DGAM_RAMA_SLOPE_CNTL_R, CM, id), \ -+ SRI(CM_DGAM_RAMA_END_CNTL1_B, CM, id), \ -+ SRI(CM_DGAM_RAMA_END_CNTL2_B, CM, id), \ -+ SRI(CM_DGAM_RAMA_END_CNTL1_G, CM, id), \ -+ SRI(CM_DGAM_RAMA_END_CNTL2_G, CM, id), \ -+ SRI(CM_DGAM_RAMA_END_CNTL1_R, CM, id), \ -+ SRI(CM_DGAM_RAMA_END_CNTL2_R, CM, id), \ -+ SRI(CM_DGAM_RAMA_REGION_0_1, CM, id), \ -+ SRI(CM_DGAM_RAMA_REGION_2_3, CM, id), \ -+ SRI(CM_DGAM_RAMA_REGION_4_5, CM, id), \ -+ SRI(CM_DGAM_RAMA_REGION_6_7, CM, id), \ -+ SRI(CM_DGAM_RAMA_REGION_8_9, CM, id), \ -+ SRI(CM_DGAM_RAMA_REGION_10_11, CM, id), \ -+ SRI(CM_DGAM_RAMA_REGION_12_13, CM, id), \ -+ SRI(CM_DGAM_RAMA_REGION_14_15, CM, id), \ -+ SRI(CM_MEM_PWR_CTRL, CM, id), \ -+ SRI(CM_IGAM_LUT_RW_CONTROL, CM, id), \ -+ SRI(CM_DGAM_LUT_WRITE_EN_MASK, CM, id), \ -+ SRI(CM_DGAM_LUT_INDEX, CM, id), \ -+ SRI(CM_DGAM_LUT_DATA, CM, id), \ -+ SRI(CM_CONTROL, CM, id), \ -+ SRI(CM_DGAM_CONTROL, CM, id), \ -+ SRI(CM_IGAM_CONTROL, CM, id), \ -+ SRI(DPP_CONTROL, DPP_TOP, id), \ -+ SRI(CURSOR_SETTINS, HUBPREQ, id), \ -+ SRI(CNVC_SURFACE_PIXEL_FORMAT, CNVC_CFG, id), \ -+ SRI(CURSOR0_CONTROL, CNVC_CUR, id), \ -+ SRI(CURSOR0_COLOR0, CNVC_CUR, id), \ -+ SRI(CURSOR0_COLOR1, CNVC_CUR, id), \ -+ SRI(FORMAT_CONTROL, CNVC_CFG, id), \ -+ SRI(CURSOR_SURFACE_ADDRESS_HIGH, CURSOR, id), \ -+ SRI(CURSOR_SURFACE_ADDRESS, CURSOR, id), \ -+ SRI(CURSOR_SIZE, CURSOR, id), \ -+ SRI(CURSOR_CONTROL, CURSOR, id), \ -+ SRI(CURSOR_POSITION, CURSOR, id), \ -+ SRI(CURSOR_HOT_SPOT, CURSOR, id), \ -+ SRI(CURSOR_DST_OFFSET, CURSOR, id) -+ -+#define IPP_SF(reg_name, field_name, post_fix)\ -+ .field_name = reg_name ## __ ## field_name ## post_fix -+ -+#define IPP_DCN10_MASK_SH_LIST(mask_sh) \ -+ IPP_SF(CM0_CM_ICSC_CONTROL, CM_ICSC_MODE, mask_sh), \ -+ IPP_SF(CM0_CM_ICSC_C11_C12, CM_ICSC_C11, mask_sh), \ -+ IPP_SF(CM0_CM_ICSC_C11_C12, CM_ICSC_C12, mask_sh), \ -+ IPP_SF(CM0_CM_ICSC_C13_C14, CM_ICSC_C13, mask_sh), \ -+ IPP_SF(CM0_CM_ICSC_C13_C14, CM_ICSC_C14, mask_sh), \ -+ IPP_SF(CM0_CM_ICSC_C21_C22, CM_ICSC_C21, mask_sh), \ -+ IPP_SF(CM0_CM_ICSC_C21_C22, CM_ICSC_C22, mask_sh), \ -+ IPP_SF(CM0_CM_ICSC_C23_C24, CM_ICSC_C23, mask_sh), \ -+ IPP_SF(CM0_CM_ICSC_C23_C24, CM_ICSC_C24, mask_sh), \ -+ IPP_SF(CM0_CM_ICSC_C31_C32, CM_ICSC_C31, mask_sh), \ -+ IPP_SF(CM0_CM_ICSC_C31_C32, CM_ICSC_C32, mask_sh), \ -+ IPP_SF(CM0_CM_ICSC_C33_C34, CM_ICSC_C33, mask_sh), \ -+ IPP_SF(CM0_CM_ICSC_C33_C34, CM_ICSC_C34, mask_sh), \ -+ IPP_SF(CM0_CM_COMA_C11_C12, CM_COMA_C11, mask_sh), \ -+ IPP_SF(CM0_CM_COMA_C11_C12, CM_COMA_C12, mask_sh), \ -+ IPP_SF(CM0_CM_COMA_C13_C14, CM_COMA_C13, mask_sh), \ -+ IPP_SF(CM0_CM_COMA_C13_C14, CM_COMA_C14, mask_sh), \ -+ IPP_SF(CM0_CM_COMA_C21_C22, CM_COMA_C21, mask_sh), \ -+ IPP_SF(CM0_CM_COMA_C21_C22, CM_COMA_C22, mask_sh), \ -+ IPP_SF(CM0_CM_COMA_C23_C24, CM_COMA_C23, mask_sh), \ -+ IPP_SF(CM0_CM_COMA_C23_C24, CM_COMA_C24, mask_sh), \ -+ IPP_SF(CM0_CM_COMA_C31_C32, CM_COMA_C31, mask_sh), \ -+ IPP_SF(CM0_CM_COMA_C31_C32, CM_COMA_C32, mask_sh), \ -+ IPP_SF(CM0_CM_COMA_C33_C34, CM_COMA_C33, mask_sh), \ -+ IPP_SF(CM0_CM_COMA_C33_C34, CM_COMA_C34, mask_sh), \ -+ IPP_SF(CM0_CM_DGAM_RAMB_START_CNTL_B, CM_DGAM_RAMB_EXP_REGION_START_B, mask_sh), \ -+ IPP_SF(CM0_CM_DGAM_RAMB_START_CNTL_B, CM_DGAM_RAMB_EXP_REGION_START_SEGMENT_B, mask_sh), \ -+ IPP_SF(CM0_CM_DGAM_RAMB_START_CNTL_G, CM_DGAM_RAMB_EXP_REGION_START_G, mask_sh), \ -+ IPP_SF(CM0_CM_DGAM_RAMB_START_CNTL_G, CM_DGAM_RAMB_EXP_REGION_START_SEGMENT_G, mask_sh), \ -+ IPP_SF(CM0_CM_DGAM_RAMB_START_CNTL_R, CM_DGAM_RAMB_EXP_REGION_START_R, mask_sh), \ -+ IPP_SF(CM0_CM_DGAM_RAMB_START_CNTL_R, CM_DGAM_RAMB_EXP_REGION_START_SEGMENT_R, mask_sh), \ -+ IPP_SF(CM0_CM_DGAM_RAMB_SLOPE_CNTL_B, CM_DGAM_RAMB_EXP_REGION_LINEAR_SLOPE_B, mask_sh), \ -+ IPP_SF(CM0_CM_DGAM_RAMB_SLOPE_CNTL_G, CM_DGAM_RAMB_EXP_REGION_LINEAR_SLOPE_G, mask_sh), \ -+ IPP_SF(CM0_CM_DGAM_RAMB_SLOPE_CNTL_R, CM_DGAM_RAMB_EXP_REGION_LINEAR_SLOPE_R, mask_sh), \ -+ IPP_SF(CM0_CM_DGAM_RAMB_END_CNTL1_B, CM_DGAM_RAMB_EXP_REGION_END_B, mask_sh), \ -+ IPP_SF(CM0_CM_DGAM_RAMB_END_CNTL2_B, CM_DGAM_RAMB_EXP_REGION_END_SLOPE_B, mask_sh), \ -+ IPP_SF(CM0_CM_DGAM_RAMB_END_CNTL2_B, CM_DGAM_RAMB_EXP_REGION_END_BASE_B, mask_sh), \ -+ IPP_SF(CM0_CM_DGAM_RAMB_END_CNTL1_G, CM_DGAM_RAMB_EXP_REGION_END_G, mask_sh), \ -+ IPP_SF(CM0_CM_DGAM_RAMB_END_CNTL2_G, CM_DGAM_RAMB_EXP_REGION_END_SLOPE_G, mask_sh), \ -+ IPP_SF(CM0_CM_DGAM_RAMB_END_CNTL2_G, CM_DGAM_RAMB_EXP_REGION_END_BASE_G, mask_sh), \ -+ IPP_SF(CM0_CM_DGAM_RAMB_END_CNTL1_R, CM_DGAM_RAMB_EXP_REGION_END_R, mask_sh), \ -+ IPP_SF(CM0_CM_DGAM_RAMB_END_CNTL2_R, CM_DGAM_RAMB_EXP_REGION_END_SLOPE_R, mask_sh), \ -+ IPP_SF(CM0_CM_DGAM_RAMB_END_CNTL2_R, CM_DGAM_RAMB_EXP_REGION_END_BASE_R, mask_sh), \ -+ IPP_SF(CM0_CM_DGAM_RAMB_REGION_0_1, CM_DGAM_RAMB_EXP_REGION0_LUT_OFFSET, mask_sh), \ -+ IPP_SF(CM0_CM_DGAM_RAMB_REGION_0_1, CM_DGAM_RAMB_EXP_REGION0_NUM_SEGMENTS, mask_sh), \ -+ IPP_SF(CM0_CM_DGAM_RAMB_REGION_0_1, CM_DGAM_RAMB_EXP_REGION1_LUT_OFFSET, mask_sh), \ -+ IPP_SF(CM0_CM_DGAM_RAMB_REGION_0_1, CM_DGAM_RAMB_EXP_REGION1_NUM_SEGMENTS, mask_sh), \ -+ IPP_SF(CM0_CM_DGAM_RAMB_REGION_2_3, CM_DGAM_RAMB_EXP_REGION2_LUT_OFFSET, mask_sh), \ -+ IPP_SF(CM0_CM_DGAM_RAMB_REGION_2_3, CM_DGAM_RAMB_EXP_REGION2_NUM_SEGMENTS, mask_sh), \ -+ IPP_SF(CM0_CM_DGAM_RAMB_REGION_2_3, CM_DGAM_RAMB_EXP_REGION3_LUT_OFFSET, mask_sh), \ -+ IPP_SF(CM0_CM_DGAM_RAMB_REGION_2_3, CM_DGAM_RAMB_EXP_REGION3_NUM_SEGMENTS, mask_sh), \ -+ IPP_SF(CM0_CM_DGAM_RAMB_REGION_4_5, CM_DGAM_RAMB_EXP_REGION4_LUT_OFFSET, mask_sh), \ -+ IPP_SF(CM0_CM_DGAM_RAMB_REGION_4_5, CM_DGAM_RAMB_EXP_REGION4_NUM_SEGMENTS, mask_sh), \ -+ IPP_SF(CM0_CM_DGAM_RAMB_REGION_4_5, CM_DGAM_RAMB_EXP_REGION5_LUT_OFFSET, mask_sh), \ -+ IPP_SF(CM0_CM_DGAM_RAMB_REGION_4_5, CM_DGAM_RAMB_EXP_REGION5_NUM_SEGMENTS, mask_sh), \ -+ IPP_SF(CM0_CM_DGAM_RAMB_REGION_6_7, CM_DGAM_RAMB_EXP_REGION6_LUT_OFFSET, mask_sh), \ -+ IPP_SF(CM0_CM_DGAM_RAMB_REGION_6_7, CM_DGAM_RAMB_EXP_REGION6_NUM_SEGMENTS, mask_sh), \ -+ IPP_SF(CM0_CM_DGAM_RAMB_REGION_6_7, CM_DGAM_RAMB_EXP_REGION7_LUT_OFFSET, mask_sh), \ -+ IPP_SF(CM0_CM_DGAM_RAMB_REGION_6_7, CM_DGAM_RAMB_EXP_REGION7_NUM_SEGMENTS, mask_sh), \ -+ IPP_SF(CM0_CM_DGAM_RAMB_REGION_8_9, CM_DGAM_RAMB_EXP_REGION8_LUT_OFFSET, mask_sh), \ -+ IPP_SF(CM0_CM_DGAM_RAMB_REGION_8_9, CM_DGAM_RAMB_EXP_REGION8_NUM_SEGMENTS, mask_sh), \ -+ IPP_SF(CM0_CM_DGAM_RAMB_REGION_8_9, CM_DGAM_RAMB_EXP_REGION9_LUT_OFFSET, mask_sh), \ -+ IPP_SF(CM0_CM_DGAM_RAMB_REGION_8_9, CM_DGAM_RAMB_EXP_REGION9_NUM_SEGMENTS, mask_sh), \ -+ IPP_SF(CM0_CM_DGAM_RAMB_REGION_10_11, CM_DGAM_RAMB_EXP_REGION10_LUT_OFFSET, mask_sh), \ -+ IPP_SF(CM0_CM_DGAM_RAMB_REGION_10_11, CM_DGAM_RAMB_EXP_REGION10_NUM_SEGMENTS, mask_sh), \ -+ IPP_SF(CM0_CM_DGAM_RAMB_REGION_10_11, CM_DGAM_RAMB_EXP_REGION11_LUT_OFFSET, mask_sh), \ -+ IPP_SF(CM0_CM_DGAM_RAMB_REGION_10_11, CM_DGAM_RAMB_EXP_REGION11_NUM_SEGMENTS, mask_sh), \ -+ IPP_SF(CM0_CM_DGAM_RAMB_REGION_12_13, CM_DGAM_RAMB_EXP_REGION12_LUT_OFFSET, mask_sh), \ -+ IPP_SF(CM0_CM_DGAM_RAMB_REGION_12_13, CM_DGAM_RAMB_EXP_REGION12_NUM_SEGMENTS, mask_sh), \ -+ IPP_SF(CM0_CM_DGAM_RAMB_REGION_12_13, CM_DGAM_RAMB_EXP_REGION13_LUT_OFFSET, mask_sh), \ -+ IPP_SF(CM0_CM_DGAM_RAMB_REGION_12_13, CM_DGAM_RAMB_EXP_REGION13_NUM_SEGMENTS, mask_sh), \ -+ IPP_SF(CM0_CM_DGAM_RAMB_REGION_14_15, CM_DGAM_RAMB_EXP_REGION14_LUT_OFFSET, mask_sh), \ -+ IPP_SF(CM0_CM_DGAM_RAMB_REGION_14_15, CM_DGAM_RAMB_EXP_REGION14_NUM_SEGMENTS, mask_sh), \ -+ IPP_SF(CM0_CM_DGAM_RAMB_REGION_14_15, CM_DGAM_RAMB_EXP_REGION15_LUT_OFFSET, mask_sh), \ -+ IPP_SF(CM0_CM_DGAM_RAMB_REGION_14_15, CM_DGAM_RAMB_EXP_REGION15_NUM_SEGMENTS, mask_sh), \ -+ IPP_SF(CM0_CM_DGAM_RAMA_START_CNTL_B, CM_DGAM_RAMA_EXP_REGION_START_B, mask_sh), \ -+ IPP_SF(CM0_CM_DGAM_RAMA_START_CNTL_B, CM_DGAM_RAMA_EXP_REGION_START_SEGMENT_B, mask_sh), \ -+ IPP_SF(CM0_CM_DGAM_RAMA_START_CNTL_G, CM_DGAM_RAMA_EXP_REGION_START_G, mask_sh), \ -+ IPP_SF(CM0_CM_DGAM_RAMA_START_CNTL_G, CM_DGAM_RAMA_EXP_REGION_START_SEGMENT_G, mask_sh), \ -+ IPP_SF(CM0_CM_DGAM_RAMA_START_CNTL_R, CM_DGAM_RAMA_EXP_REGION_START_R, mask_sh), \ -+ IPP_SF(CM0_CM_DGAM_RAMA_START_CNTL_R, CM_DGAM_RAMA_EXP_REGION_START_SEGMENT_R, mask_sh), \ -+ IPP_SF(CM0_CM_DGAM_RAMA_SLOPE_CNTL_B, CM_DGAM_RAMA_EXP_REGION_LINEAR_SLOPE_B, mask_sh), \ -+ IPP_SF(CM0_CM_DGAM_RAMA_SLOPE_CNTL_G, CM_DGAM_RAMA_EXP_REGION_LINEAR_SLOPE_G, mask_sh), \ -+ IPP_SF(CM0_CM_DGAM_RAMA_SLOPE_CNTL_R, CM_DGAM_RAMA_EXP_REGION_LINEAR_SLOPE_R, mask_sh), \ -+ IPP_SF(CM0_CM_DGAM_RAMA_END_CNTL1_B, CM_DGAM_RAMA_EXP_REGION_END_B, mask_sh), \ -+ IPP_SF(CM0_CM_DGAM_RAMA_END_CNTL2_B, CM_DGAM_RAMA_EXP_REGION_END_SLOPE_B, mask_sh), \ -+ IPP_SF(CM0_CM_DGAM_RAMA_END_CNTL2_B, CM_DGAM_RAMA_EXP_REGION_END_BASE_B, mask_sh), \ -+ IPP_SF(CM0_CM_DGAM_RAMA_END_CNTL1_G, CM_DGAM_RAMA_EXP_REGION_END_G, mask_sh), \ -+ IPP_SF(CM0_CM_DGAM_RAMA_END_CNTL2_G, CM_DGAM_RAMA_EXP_REGION_END_SLOPE_G, mask_sh), \ -+ IPP_SF(CM0_CM_DGAM_RAMA_END_CNTL2_G, CM_DGAM_RAMA_EXP_REGION_END_BASE_G, mask_sh), \ -+ IPP_SF(CM0_CM_DGAM_RAMA_END_CNTL1_R, CM_DGAM_RAMA_EXP_REGION_END_R, mask_sh), \ -+ IPP_SF(CM0_CM_DGAM_RAMA_END_CNTL2_R, CM_DGAM_RAMA_EXP_REGION_END_SLOPE_R, mask_sh), \ -+ IPP_SF(CM0_CM_DGAM_RAMA_END_CNTL2_R, CM_DGAM_RAMA_EXP_REGION_END_BASE_R, mask_sh), \ -+ IPP_SF(CM0_CM_DGAM_RAMA_REGION_0_1, CM_DGAM_RAMA_EXP_REGION0_LUT_OFFSET, mask_sh), \ -+ IPP_SF(CM0_CM_DGAM_RAMA_REGION_0_1, CM_DGAM_RAMA_EXP_REGION0_NUM_SEGMENTS, mask_sh), \ -+ IPP_SF(CM0_CM_DGAM_RAMA_REGION_0_1, CM_DGAM_RAMA_EXP_REGION1_LUT_OFFSET, mask_sh), \ -+ IPP_SF(CM0_CM_DGAM_RAMA_REGION_0_1, CM_DGAM_RAMA_EXP_REGION1_NUM_SEGMENTS, mask_sh), \ -+ IPP_SF(CM0_CM_DGAM_RAMA_REGION_2_3, CM_DGAM_RAMA_EXP_REGION2_LUT_OFFSET, mask_sh), \ -+ IPP_SF(CM0_CM_DGAM_RAMA_REGION_2_3, CM_DGAM_RAMA_EXP_REGION2_NUM_SEGMENTS, mask_sh), \ -+ IPP_SF(CM0_CM_DGAM_RAMA_REGION_2_3, CM_DGAM_RAMA_EXP_REGION3_LUT_OFFSET, mask_sh), \ -+ IPP_SF(CM0_CM_DGAM_RAMA_REGION_2_3, CM_DGAM_RAMA_EXP_REGION3_NUM_SEGMENTS, mask_sh), \ -+ IPP_SF(CM0_CM_DGAM_RAMA_REGION_4_5, CM_DGAM_RAMA_EXP_REGION4_LUT_OFFSET, mask_sh), \ -+ IPP_SF(CM0_CM_DGAM_RAMA_REGION_4_5, CM_DGAM_RAMA_EXP_REGION4_NUM_SEGMENTS, mask_sh), \ -+ IPP_SF(CM0_CM_DGAM_RAMA_REGION_4_5, CM_DGAM_RAMA_EXP_REGION5_LUT_OFFSET, mask_sh), \ -+ IPP_SF(CM0_CM_DGAM_RAMA_REGION_4_5, CM_DGAM_RAMA_EXP_REGION5_NUM_SEGMENTS, mask_sh), \ -+ IPP_SF(CM0_CM_DGAM_RAMA_REGION_6_7, CM_DGAM_RAMA_EXP_REGION6_LUT_OFFSET, mask_sh), \ -+ IPP_SF(CM0_CM_DGAM_RAMA_REGION_6_7, CM_DGAM_RAMA_EXP_REGION6_NUM_SEGMENTS, mask_sh), \ -+ IPP_SF(CM0_CM_DGAM_RAMA_REGION_6_7, CM_DGAM_RAMA_EXP_REGION7_LUT_OFFSET, mask_sh), \ -+ IPP_SF(CM0_CM_DGAM_RAMA_REGION_6_7, CM_DGAM_RAMA_EXP_REGION7_NUM_SEGMENTS, mask_sh), \ -+ IPP_SF(CM0_CM_DGAM_RAMA_REGION_8_9, CM_DGAM_RAMA_EXP_REGION8_LUT_OFFSET, mask_sh), \ -+ IPP_SF(CM0_CM_DGAM_RAMA_REGION_8_9, CM_DGAM_RAMA_EXP_REGION8_NUM_SEGMENTS, mask_sh), \ -+ IPP_SF(CM0_CM_DGAM_RAMA_REGION_8_9, CM_DGAM_RAMA_EXP_REGION9_LUT_OFFSET, mask_sh), \ -+ IPP_SF(CM0_CM_DGAM_RAMA_REGION_8_9, CM_DGAM_RAMA_EXP_REGION9_NUM_SEGMENTS, mask_sh), \ -+ IPP_SF(CM0_CM_DGAM_RAMA_REGION_10_11, CM_DGAM_RAMA_EXP_REGION10_LUT_OFFSET, mask_sh), \ -+ IPP_SF(CM0_CM_DGAM_RAMA_REGION_10_11, CM_DGAM_RAMA_EXP_REGION10_NUM_SEGMENTS, mask_sh), \ -+ IPP_SF(CM0_CM_DGAM_RAMA_REGION_10_11, CM_DGAM_RAMA_EXP_REGION11_LUT_OFFSET, mask_sh), \ -+ IPP_SF(CM0_CM_DGAM_RAMA_REGION_10_11, CM_DGAM_RAMA_EXP_REGION11_NUM_SEGMENTS, mask_sh), \ -+ IPP_SF(CM0_CM_DGAM_RAMA_REGION_12_13, CM_DGAM_RAMA_EXP_REGION12_LUT_OFFSET, mask_sh), \ -+ IPP_SF(CM0_CM_DGAM_RAMA_REGION_12_13, CM_DGAM_RAMA_EXP_REGION12_NUM_SEGMENTS, mask_sh), \ -+ IPP_SF(CM0_CM_DGAM_RAMA_REGION_12_13, CM_DGAM_RAMA_EXP_REGION13_LUT_OFFSET, mask_sh), \ -+ IPP_SF(CM0_CM_DGAM_RAMA_REGION_12_13, CM_DGAM_RAMA_EXP_REGION13_NUM_SEGMENTS, mask_sh), \ -+ IPP_SF(CM0_CM_DGAM_RAMA_REGION_14_15, CM_DGAM_RAMA_EXP_REGION14_LUT_OFFSET, mask_sh), \ -+ IPP_SF(CM0_CM_DGAM_RAMA_REGION_14_15, CM_DGAM_RAMA_EXP_REGION14_NUM_SEGMENTS, mask_sh), \ -+ IPP_SF(CM0_CM_DGAM_RAMA_REGION_14_15, CM_DGAM_RAMA_EXP_REGION15_LUT_OFFSET, mask_sh), \ -+ IPP_SF(CM0_CM_DGAM_RAMA_REGION_14_15, CM_DGAM_RAMA_EXP_REGION15_NUM_SEGMENTS, mask_sh), \ -+ IPP_SF(CM0_CM_MEM_PWR_CTRL, SHARED_MEM_PWR_DIS, mask_sh), \ -+ IPP_SF(CM0_CM_IGAM_LUT_RW_CONTROL, CM_IGAM_LUT_HOST_EN, mask_sh), \ -+ IPP_SF(CM0_CM_DGAM_LUT_WRITE_EN_MASK, CM_DGAM_LUT_WRITE_EN_MASK, mask_sh), \ -+ IPP_SF(CM0_CM_DGAM_LUT_WRITE_EN_MASK, CM_DGAM_LUT_WRITE_SEL, mask_sh), \ -+ IPP_SF(CM0_CM_DGAM_LUT_INDEX, CM_DGAM_LUT_INDEX, mask_sh), \ -+ IPP_SF(CM0_CM_DGAM_LUT_DATA, CM_DGAM_LUT_DATA, mask_sh), \ -+ IPP_SF(DPP_TOP0_DPP_CONTROL, DPP_CLOCK_ENABLE, mask_sh), \ -+ IPP_SF(CM0_CM_CONTROL, CM_BYPASS_EN, mask_sh), \ -+ IPP_SF(CNVC_CFG0_CNVC_SURFACE_PIXEL_FORMAT, CNVC_SURFACE_PIXEL_FORMAT, mask_sh), \ -+ IPP_SF(CNVC_CFG0_FORMAT_CONTROL, CNVC_BYPASS, mask_sh), \ -+ IPP_SF(CNVC_CFG0_FORMAT_CONTROL, ALPHA_EN, mask_sh), \ -+ IPP_SF(CNVC_CFG0_FORMAT_CONTROL, FORMAT_EXPANSION_MODE, mask_sh), \ -+ IPP_SF(CM0_CM_DGAM_CONTROL, CM_DGAM_LUT_MODE, mask_sh), \ -+ IPP_SF(CM0_CM_IGAM_CONTROL, CM_IGAM_LUT_MODE, mask_sh), \ -+ IPP_SF(HUBPREQ0_CURSOR_SETTINS, CURSOR0_DST_Y_OFFSET, mask_sh), \ -+ IPP_SF(HUBPREQ0_CURSOR_SETTINS, CURSOR0_CHUNK_HDL_ADJUST, mask_sh), \ -+ IPP_SF(CNVC_CUR0_CURSOR0_CONTROL, CUR0_MODE, mask_sh), \ -+ IPP_SF(CNVC_CUR0_CURSOR0_CONTROL, CUR0_INVERT_MODE, mask_sh), \ -+ IPP_SF(CNVC_CUR0_CURSOR0_COLOR0, CUR0_COLOR0, mask_sh), \ -+ IPP_SF(CNVC_CUR0_CURSOR0_COLOR1, CUR0_COLOR1, mask_sh), \ -+ IPP_SF(CNVC_CUR0_CURSOR0_CONTROL, CUR0_EXPANSION_MODE, mask_sh), \ -+ IPP_SF(CNVC_CUR0_CURSOR0_CONTROL, CUR0_MAX, mask_sh), \ -+ IPP_SF(CNVC_CUR0_CURSOR0_CONTROL, CUR0_MIN, mask_sh), \ -+ IPP_SF(CURSOR0_CURSOR_SURFACE_ADDRESS_HIGH, CURSOR_SURFACE_ADDRESS_HIGH, mask_sh), \ -+ IPP_SF(CURSOR0_CURSOR_SURFACE_ADDRESS, CURSOR_SURFACE_ADDRESS, mask_sh), \ -+ IPP_SF(CURSOR0_CURSOR_SIZE, CURSOR_WIDTH, mask_sh), \ -+ IPP_SF(CURSOR0_CURSOR_SIZE, CURSOR_HEIGHT, mask_sh), \ -+ IPP_SF(CURSOR0_CURSOR_CONTROL, CURSOR_MODE, mask_sh), \ -+ IPP_SF(CURSOR0_CURSOR_CONTROL, CURSOR_PITCH, mask_sh), \ -+ IPP_SF(CURSOR0_CURSOR_CONTROL, CURSOR_LINES_PER_CHUNK, mask_sh), \ -+ IPP_SF(CURSOR0_CURSOR_CONTROL, CURSOR_ENABLE, mask_sh), \ -+ IPP_SF(CNVC_CUR0_CURSOR0_CONTROL, CUR0_ENABLE, mask_sh), \ -+ IPP_SF(CURSOR0_CURSOR_POSITION, CURSOR_X_POSITION, mask_sh), \ -+ IPP_SF(CURSOR0_CURSOR_POSITION, CURSOR_Y_POSITION, mask_sh), \ -+ IPP_SF(CURSOR0_CURSOR_HOT_SPOT, CURSOR_HOT_SPOT_X, mask_sh), \ -+ IPP_SF(CURSOR0_CURSOR_HOT_SPOT, CURSOR_HOT_SPOT_Y, mask_sh), \ -+ IPP_SF(CURSOR0_CURSOR_DST_OFFSET, CURSOR_DST_X_OFFSET, mask_sh), \ -+ IPP_SF(CM0_CM_IGAM_CONTROL, CM_IGAM_INPUT_FORMAT, mask_sh), \ -+ IPP_SF(CNVC_CFG0_FORMAT_CONTROL, OUTPUT_FP, mask_sh) -+ -+#define IPP_DCN10_REG_FIELD_LIST(type) \ -+ type CM_ICSC_MODE; \ -+ type CM_ICSC_C11; \ -+ type CM_ICSC_C12; \ -+ type CM_ICSC_C13; \ -+ type CM_ICSC_C14; \ -+ type CM_ICSC_C21; \ -+ type CM_ICSC_C22; \ -+ type CM_ICSC_C23; \ -+ type CM_ICSC_C24; \ -+ type CM_ICSC_C31; \ -+ type CM_ICSC_C32; \ -+ type CM_ICSC_C33; \ -+ type CM_ICSC_C34; \ -+ type CM_COMA_C11; \ -+ type CM_COMA_C12; \ -+ type CM_COMA_C13; \ -+ type CM_COMA_C14; \ -+ type CM_COMA_C21; \ -+ type CM_COMA_C22; \ -+ type CM_COMA_C23; \ -+ type CM_COMA_C24; \ -+ type CM_COMA_C31; \ -+ type CM_COMA_C32; \ -+ type CM_COMA_C33; \ -+ type CM_COMA_C34; \ -+ type CM_DGAM_RAMB_EXP_REGION_START_B; \ -+ type CM_DGAM_RAMB_EXP_REGION_START_SEGMENT_B; \ -+ type CM_DGAM_RAMB_EXP_REGION_START_G; \ -+ type CM_DGAM_RAMB_EXP_REGION_START_SEGMENT_G; \ -+ type CM_DGAM_RAMB_EXP_REGION_START_R; \ -+ type CM_DGAM_RAMB_EXP_REGION_START_SEGMENT_R; \ -+ type CM_DGAM_RAMB_EXP_REGION_LINEAR_SLOPE_B; \ -+ type CM_DGAM_RAMB_EXP_REGION_LINEAR_SLOPE_G; \ -+ type CM_DGAM_RAMB_EXP_REGION_LINEAR_SLOPE_R; \ -+ type CM_DGAM_RAMB_EXP_REGION_END_B; \ -+ type CM_DGAM_RAMB_EXP_REGION_END_SLOPE_B; \ -+ type CM_DGAM_RAMB_EXP_REGION_END_BASE_B; \ -+ type CM_DGAM_RAMB_EXP_REGION_END_G; \ -+ type CM_DGAM_RAMB_EXP_REGION_END_SLOPE_G; \ -+ type CM_DGAM_RAMB_EXP_REGION_END_BASE_G; \ -+ type CM_DGAM_RAMB_EXP_REGION_END_R; \ -+ type CM_DGAM_RAMB_EXP_REGION_END_SLOPE_R; \ -+ type CM_DGAM_RAMB_EXP_REGION_END_BASE_R; \ -+ type CM_DGAM_RAMB_EXP_REGION0_LUT_OFFSET; \ -+ type CM_DGAM_RAMB_EXP_REGION0_NUM_SEGMENTS; \ -+ type CM_DGAM_RAMB_EXP_REGION1_LUT_OFFSET; \ -+ type CM_DGAM_RAMB_EXP_REGION1_NUM_SEGMENTS; \ -+ type CM_DGAM_RAMB_EXP_REGION2_LUT_OFFSET; \ -+ type CM_DGAM_RAMB_EXP_REGION2_NUM_SEGMENTS; \ -+ type CM_DGAM_RAMB_EXP_REGION3_LUT_OFFSET; \ -+ type CM_DGAM_RAMB_EXP_REGION3_NUM_SEGMENTS; \ -+ type CM_DGAM_RAMB_EXP_REGION4_LUT_OFFSET; \ -+ type CM_DGAM_RAMB_EXP_REGION4_NUM_SEGMENTS; \ -+ type CM_DGAM_RAMB_EXP_REGION5_LUT_OFFSET; \ -+ type CM_DGAM_RAMB_EXP_REGION5_NUM_SEGMENTS; \ -+ type CM_DGAM_RAMB_EXP_REGION6_LUT_OFFSET; \ -+ type CM_DGAM_RAMB_EXP_REGION6_NUM_SEGMENTS; \ -+ type CM_DGAM_RAMB_EXP_REGION7_LUT_OFFSET; \ -+ type CM_DGAM_RAMB_EXP_REGION7_NUM_SEGMENTS; \ -+ type CM_DGAM_RAMB_EXP_REGION8_LUT_OFFSET; \ -+ type CM_DGAM_RAMB_EXP_REGION8_NUM_SEGMENTS; \ -+ type CM_DGAM_RAMB_EXP_REGION9_LUT_OFFSET; \ -+ type CM_DGAM_RAMB_EXP_REGION9_NUM_SEGMENTS; \ -+ type CM_DGAM_RAMB_EXP_REGION10_LUT_OFFSET; \ -+ type CM_DGAM_RAMB_EXP_REGION10_NUM_SEGMENTS; \ -+ type CM_DGAM_RAMB_EXP_REGION11_LUT_OFFSET; \ -+ type CM_DGAM_RAMB_EXP_REGION11_NUM_SEGMENTS; \ -+ type CM_DGAM_RAMB_EXP_REGION12_LUT_OFFSET; \ -+ type CM_DGAM_RAMB_EXP_REGION12_NUM_SEGMENTS; \ -+ type CM_DGAM_RAMB_EXP_REGION13_LUT_OFFSET; \ -+ type CM_DGAM_RAMB_EXP_REGION13_NUM_SEGMENTS; \ -+ type CM_DGAM_RAMB_EXP_REGION14_LUT_OFFSET; \ -+ type CM_DGAM_RAMB_EXP_REGION14_NUM_SEGMENTS; \ -+ type CM_DGAM_RAMB_EXP_REGION15_LUT_OFFSET; \ -+ type CM_DGAM_RAMB_EXP_REGION15_NUM_SEGMENTS; \ -+ type CM_DGAM_RAMA_EXP_REGION_START_B; \ -+ type CM_DGAM_RAMA_EXP_REGION_START_SEGMENT_B; \ -+ type CM_DGAM_RAMA_EXP_REGION_START_G; \ -+ type CM_DGAM_RAMA_EXP_REGION_START_SEGMENT_G; \ -+ type CM_DGAM_RAMA_EXP_REGION_START_R; \ -+ type CM_DGAM_RAMA_EXP_REGION_START_SEGMENT_R; \ -+ type CM_DGAM_RAMA_EXP_REGION_LINEAR_SLOPE_B; \ -+ type CM_DGAM_RAMA_EXP_REGION_LINEAR_SLOPE_G; \ -+ type CM_DGAM_RAMA_EXP_REGION_LINEAR_SLOPE_R; \ -+ type CM_DGAM_RAMA_EXP_REGION_END_B; \ -+ type CM_DGAM_RAMA_EXP_REGION_END_SLOPE_B; \ -+ type CM_DGAM_RAMA_EXP_REGION_END_BASE_B; \ -+ type CM_DGAM_RAMA_EXP_REGION_END_G; \ -+ type CM_DGAM_RAMA_EXP_REGION_END_SLOPE_G; \ -+ type CM_DGAM_RAMA_EXP_REGION_END_BASE_G; \ -+ type CM_DGAM_RAMA_EXP_REGION_END_R; \ -+ type CM_DGAM_RAMA_EXP_REGION_END_SLOPE_R; \ -+ type CM_DGAM_RAMA_EXP_REGION_END_BASE_R; \ -+ type CM_DGAM_RAMA_EXP_REGION0_LUT_OFFSET; \ -+ type CM_DGAM_RAMA_EXP_REGION0_NUM_SEGMENTS; \ -+ type CM_DGAM_RAMA_EXP_REGION1_LUT_OFFSET; \ -+ type CM_DGAM_RAMA_EXP_REGION1_NUM_SEGMENTS; \ -+ type CM_DGAM_RAMA_EXP_REGION2_LUT_OFFSET; \ -+ type CM_DGAM_RAMA_EXP_REGION2_NUM_SEGMENTS; \ -+ type CM_DGAM_RAMA_EXP_REGION3_LUT_OFFSET; \ -+ type CM_DGAM_RAMA_EXP_REGION3_NUM_SEGMENTS; \ -+ type CM_DGAM_RAMA_EXP_REGION4_LUT_OFFSET; \ -+ type CM_DGAM_RAMA_EXP_REGION4_NUM_SEGMENTS; \ -+ type CM_DGAM_RAMA_EXP_REGION5_LUT_OFFSET; \ -+ type CM_DGAM_RAMA_EXP_REGION5_NUM_SEGMENTS; \ -+ type CM_DGAM_RAMA_EXP_REGION6_LUT_OFFSET; \ -+ type CM_DGAM_RAMA_EXP_REGION6_NUM_SEGMENTS; \ -+ type CM_DGAM_RAMA_EXP_REGION7_LUT_OFFSET; \ -+ type CM_DGAM_RAMA_EXP_REGION7_NUM_SEGMENTS; \ -+ type CM_DGAM_RAMA_EXP_REGION8_LUT_OFFSET; \ -+ type CM_DGAM_RAMA_EXP_REGION8_NUM_SEGMENTS; \ -+ type CM_DGAM_RAMA_EXP_REGION9_LUT_OFFSET; \ -+ type CM_DGAM_RAMA_EXP_REGION9_NUM_SEGMENTS; \ -+ type CM_DGAM_RAMA_EXP_REGION10_LUT_OFFSET; \ -+ type CM_DGAM_RAMA_EXP_REGION10_NUM_SEGMENTS; \ -+ type CM_DGAM_RAMA_EXP_REGION11_LUT_OFFSET; \ -+ type CM_DGAM_RAMA_EXP_REGION11_NUM_SEGMENTS; \ -+ type CM_DGAM_RAMA_EXP_REGION12_LUT_OFFSET; \ -+ type CM_DGAM_RAMA_EXP_REGION12_NUM_SEGMENTS; \ -+ type CM_DGAM_RAMA_EXP_REGION13_LUT_OFFSET; \ -+ type CM_DGAM_RAMA_EXP_REGION13_NUM_SEGMENTS; \ -+ type CM_DGAM_RAMA_EXP_REGION14_LUT_OFFSET; \ -+ type CM_DGAM_RAMA_EXP_REGION14_NUM_SEGMENTS; \ -+ type CM_DGAM_RAMA_EXP_REGION15_LUT_OFFSET; \ -+ type CM_DGAM_RAMA_EXP_REGION15_NUM_SEGMENTS; \ -+ type SHARED_MEM_PWR_DIS; \ -+ type CM_IGAM_LUT_HOST_EN; \ -+ type CM_DGAM_LUT_WRITE_EN_MASK; \ -+ type CM_DGAM_LUT_WRITE_SEL; \ -+ type CM_DGAM_LUT_INDEX; \ -+ type CM_DGAM_LUT_DATA; \ -+ type DPP_CLOCK_ENABLE; \ -+ type CM_BYPASS_EN; \ -+ type CNVC_SURFACE_PIXEL_FORMAT; \ -+ type CNVC_BYPASS; \ -+ type ALPHA_EN; \ -+ type FORMAT_EXPANSION_MODE; \ -+ type CM_DGAM_LUT_MODE; \ -+ type CM_IGAM_LUT_MODE; \ -+ type CURSOR0_DST_Y_OFFSET; \ -+ type CURSOR0_CHUNK_HDL_ADJUST; \ -+ type CUR0_MODE; \ -+ type CUR0_INVERT_MODE; \ -+ type CUR0_COLOR0; \ -+ type CUR0_COLOR1; \ -+ type CUR0_EXPANSION_MODE; \ -+ type CUR0_MAX; \ -+ type CUR0_MIN; \ -+ type CURSOR_SURFACE_ADDRESS_HIGH; \ -+ type CURSOR_SURFACE_ADDRESS; \ -+ type CURSOR_WIDTH; \ -+ type CURSOR_HEIGHT; \ -+ type CURSOR_MODE; \ -+ type CURSOR_PITCH; \ -+ type CURSOR_LINES_PER_CHUNK; \ -+ type CURSOR_ENABLE; \ -+ type CUR0_ENABLE; \ -+ type CURSOR_X_POSITION; \ -+ type CURSOR_Y_POSITION; \ -+ type CURSOR_HOT_SPOT_X; \ -+ type CURSOR_HOT_SPOT_Y; \ -+ type CURSOR_DST_X_OFFSET; \ -+ type CM_IGAM_INPUT_FORMAT; \ -+ type OUTPUT_FP -+ -+struct dcn10_ipp_shift { -+ IPP_DCN10_REG_FIELD_LIST(uint8_t); -+}; -+ -+struct dcn10_ipp_mask { -+ IPP_DCN10_REG_FIELD_LIST(uint32_t); -+}; -+ -+struct dcn10_ipp_registers { -+ uint32_t CM_ICSC_CONTROL; -+ uint32_t CM_ICSC_C11_C12; -+ uint32_t CM_ICSC_C13_C14; -+ uint32_t CM_ICSC_C21_C22; -+ uint32_t CM_ICSC_C23_C24; -+ uint32_t CM_ICSC_C31_C32; -+ uint32_t CM_ICSC_C33_C34; -+ uint32_t CM_COMA_C11_C12; -+ uint32_t CM_COMA_C13_C14; -+ uint32_t CM_COMA_C21_C22; -+ uint32_t CM_COMA_C23_C24; -+ uint32_t CM_COMA_C31_C32; -+ uint32_t CM_COMA_C33_C34; -+ uint32_t CM_DGAM_RAMB_START_CNTL_B; -+ uint32_t CM_DGAM_RAMB_START_CNTL_G; -+ uint32_t CM_DGAM_RAMB_START_CNTL_R; -+ uint32_t CM_DGAM_RAMB_SLOPE_CNTL_B; -+ uint32_t CM_DGAM_RAMB_SLOPE_CNTL_G; -+ uint32_t CM_DGAM_RAMB_SLOPE_CNTL_R; -+ uint32_t CM_DGAM_RAMB_END_CNTL1_B; -+ uint32_t CM_DGAM_RAMB_END_CNTL2_B; -+ uint32_t CM_DGAM_RAMB_END_CNTL1_G; -+ uint32_t CM_DGAM_RAMB_END_CNTL2_G; -+ uint32_t CM_DGAM_RAMB_END_CNTL1_R; -+ uint32_t CM_DGAM_RAMB_END_CNTL2_R; -+ uint32_t CM_DGAM_RAMB_REGION_0_1; -+ uint32_t CM_DGAM_RAMB_REGION_2_3; -+ uint32_t CM_DGAM_RAMB_REGION_4_5; -+ uint32_t CM_DGAM_RAMB_REGION_6_7; -+ uint32_t CM_DGAM_RAMB_REGION_8_9; -+ uint32_t CM_DGAM_RAMB_REGION_10_11; -+ uint32_t CM_DGAM_RAMB_REGION_12_13; -+ uint32_t CM_DGAM_RAMB_REGION_14_15; -+ uint32_t CM_DGAM_RAMA_START_CNTL_B; -+ uint32_t CM_DGAM_RAMA_START_CNTL_G; -+ uint32_t CM_DGAM_RAMA_START_CNTL_R; -+ uint32_t CM_DGAM_RAMA_SLOPE_CNTL_B; -+ uint32_t CM_DGAM_RAMA_SLOPE_CNTL_G; -+ uint32_t CM_DGAM_RAMA_SLOPE_CNTL_R; -+ uint32_t CM_DGAM_RAMA_END_CNTL1_B; -+ uint32_t CM_DGAM_RAMA_END_CNTL2_B; -+ uint32_t CM_DGAM_RAMA_END_CNTL1_G; -+ uint32_t CM_DGAM_RAMA_END_CNTL2_G; -+ uint32_t CM_DGAM_RAMA_END_CNTL1_R; -+ uint32_t CM_DGAM_RAMA_END_CNTL2_R; -+ uint32_t CM_DGAM_RAMA_REGION_0_1; -+ uint32_t CM_DGAM_RAMA_REGION_2_3; -+ uint32_t CM_DGAM_RAMA_REGION_4_5; -+ uint32_t CM_DGAM_RAMA_REGION_6_7; -+ uint32_t CM_DGAM_RAMA_REGION_8_9; -+ uint32_t CM_DGAM_RAMA_REGION_10_11; -+ uint32_t CM_DGAM_RAMA_REGION_12_13; -+ uint32_t CM_DGAM_RAMA_REGION_14_15; -+ uint32_t CM_MEM_PWR_CTRL; -+ uint32_t CM_IGAM_LUT_RW_CONTROL; -+ uint32_t CM_DGAM_LUT_WRITE_EN_MASK; -+ uint32_t CM_DGAM_LUT_INDEX; -+ uint32_t CM_DGAM_LUT_DATA; -+ uint32_t CM_CONTROL; -+ uint32_t CM_DGAM_CONTROL; -+ uint32_t CM_IGAM_CONTROL; -+ uint32_t DPP_CONTROL; -+ uint32_t CURSOR_SETTINS; -+ uint32_t CNVC_SURFACE_PIXEL_FORMAT; -+ uint32_t CURSOR0_CONTROL; -+ uint32_t CURSOR0_COLOR0; -+ uint32_t CURSOR0_COLOR1; -+ uint32_t FORMAT_CONTROL; -+ uint32_t CURSOR_SURFACE_ADDRESS_HIGH; -+ uint32_t CURSOR_SURFACE_ADDRESS; -+ uint32_t CURSOR_SIZE; -+ uint32_t CURSOR_CONTROL; -+ uint32_t CURSOR_POSITION; -+ uint32_t CURSOR_HOT_SPOT; -+ uint32_t CURSOR_DST_OFFSET; -+}; -+ -+struct dcn10_ipp { -+ struct input_pixel_processor base; -+ -+ const struct dcn10_ipp_registers *regs; -+ const struct dcn10_ipp_shift *ipp_shift; -+ const struct dcn10_ipp_mask *ipp_mask; -+ -+ struct dc_cursor_attributes curs_attr; -+}; -+ -+void dcn10_ipp_construct(struct dcn10_ipp *ippn10, -+ struct dc_context *ctx, -+ int inst, -+ const struct dcn10_ipp_registers *regs, -+ const struct dcn10_ipp_shift *ipp_shift, -+ const struct dcn10_ipp_mask *ipp_mask); -+ -+#endif /* _DCN10_IPP_H_ */ -diff --git a/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_mem_input.c b/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_mem_input.c -new file mode 100644 -index 0000000..bf89608 ---- /dev/null -+++ b/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_mem_input.c -@@ -0,0 +1,1102 @@ -+/* -+ * 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 "dce_calcs.h" -+#include "dcn10_mem_input.h" -+#include "reg_helper.h" -+#include "basics/conversion.h" -+ -+#define REG(reg)\ -+ mi->mi_regs->reg -+ -+#define CTX \ -+ mi->base.ctx -+ -+#undef FN -+#define FN(reg_name, field_name) \ -+ mi->mi_shift->field_name, mi->mi_mask->field_name -+ -+static void set_blank(struct dcn10_mem_input *mi, bool blank) -+{ -+ uint32_t blank_en = blank ? 1 : 0; -+ -+ REG_UPDATE_2(DCHUBP_CNTL, -+ HUBP_BLANK_EN, blank_en, -+ HUBP_TTU_DISABLE, blank_en); -+} -+ -+ -+static void disable_request(struct mem_input *mem_input) -+{ -+ struct dcn10_mem_input *mi = TO_DCN10_MEM_INPUT(mem_input); -+ -+ /* To disable the requestors, set blank_en to 1 */ -+ set_blank(mi, true); -+} -+ -+static void vready_workaround(struct mem_input *mem_input, -+ struct _vcs_dpi_display_pipe_dest_params_st *pipe_dest) -+{ -+ uint32_t value = 0; -+ struct dcn10_mem_input *mi = TO_DCN10_MEM_INPUT(mem_input); -+ -+ /* set HBUBREQ_DEBUG_DB[12] = 1 */ -+ value = REG_READ(HUBPREQ_DEBUG_DB); -+ -+ /* hack mode disable */ -+ value |= 0x100; -+ value &= ~0x1000; -+ -+ if ((pipe_dest->vstartup_start - 2*(pipe_dest->vready_offset+pipe_dest->vupdate_width -+ + pipe_dest->vupdate_offset) / pipe_dest->htotal) <= pipe_dest->vblank_end) { -+ /* if (eco_fix_needed(otg_global_sync_timing) -+ * set HBUBREQ_DEBUG_DB[12] = 1 */ -+ value |= 0x1000; -+ } -+ -+ REG_WRITE(HUBPREQ_DEBUG_DB, value); -+} -+ -+static void program_tiling( -+ struct dcn10_mem_input *mi, -+ const union dc_tiling_info *info, -+ const enum surface_pixel_format pixel_format) -+{ -+ REG_UPDATE_6(DCSURF_ADDR_CONFIG, -+ NUM_PIPES, log_2(info->gfx9.num_pipes), -+ NUM_BANKS, log_2(info->gfx9.num_banks), -+ PIPE_INTERLEAVE, info->gfx9.pipe_interleave, -+ NUM_SE, log_2(info->gfx9.num_shader_engines), -+ NUM_RB_PER_SE, log_2(info->gfx9.num_rb_per_se), -+ MAX_COMPRESSED_FRAGS, log_2(info->gfx9.max_compressed_frags)); -+ -+ REG_UPDATE_4(DCSURF_TILING_CONFIG, -+ SW_MODE, info->gfx9.swizzle, -+ META_LINEAR, info->gfx9.meta_linear, -+ RB_ALIGNED, info->gfx9.rb_aligned, -+ PIPE_ALIGNED, info->gfx9.pipe_aligned); -+} -+ -+static void program_size_and_rotation( -+ struct dcn10_mem_input *mi, -+ enum dc_rotation_angle rotation, -+ enum surface_pixel_format format, -+ const union plane_size *plane_size, -+ struct dc_plane_dcc_param *dcc, -+ bool horizontal_mirror) -+{ -+ uint32_t pitch, meta_pitch, pitch_c, meta_pitch_c, mirror; -+ -+ /* Program data and meta surface pitch (calculation from addrlib) -+ * 444 or 420 luma -+ */ -+ if (format >= SURFACE_PIXEL_FORMAT_VIDEO_BEGIN) { -+ pitch = plane_size->video.luma_pitch - 1; -+ meta_pitch = dcc->video.meta_pitch_l - 1; -+ pitch_c = plane_size->video.chroma_pitch - 1; -+ meta_pitch_c = dcc->video.meta_pitch_c - 1; -+ } else { -+ pitch = plane_size->grph.surface_pitch - 1; -+ meta_pitch = dcc->grph.meta_pitch - 1; -+ pitch_c = 0; -+ meta_pitch_c = 0; -+ } -+ -+ if (!dcc->enable) { -+ meta_pitch = 0; -+ meta_pitch_c = 0; -+ } -+ -+ REG_UPDATE_2(DCSURF_SURFACE_PITCH, -+ PITCH, pitch, META_PITCH, meta_pitch); -+ -+ if (format >= SURFACE_PIXEL_FORMAT_VIDEO_BEGIN) -+ REG_UPDATE_2(DCSURF_SURFACE_PITCH_C, -+ PITCH_C, pitch_c, META_PITCH_C, meta_pitch_c); -+ -+ if (horizontal_mirror) -+ mirror = 1; -+ else -+ mirror = 0; -+ -+ -+ /* Program rotation angle and horz mirror - no mirror */ -+ if (rotation == ROTATION_ANGLE_0) -+ REG_UPDATE_2(DCSURF_SURFACE_CONFIG, -+ ROTATION_ANGLE, 0, -+ H_MIRROR_EN, mirror); -+ else if (rotation == ROTATION_ANGLE_90) -+ REG_UPDATE_2(DCSURF_SURFACE_CONFIG, -+ ROTATION_ANGLE, 1, -+ H_MIRROR_EN, mirror); -+ else if (rotation == ROTATION_ANGLE_180) -+ REG_UPDATE_2(DCSURF_SURFACE_CONFIG, -+ ROTATION_ANGLE, 2, -+ H_MIRROR_EN, mirror); -+ else if (rotation == ROTATION_ANGLE_270) -+ REG_UPDATE_2(DCSURF_SURFACE_CONFIG, -+ ROTATION_ANGLE, 3, -+ H_MIRROR_EN, mirror); -+} -+ -+static void program_pixel_format( -+ struct dcn10_mem_input *mi, -+ enum surface_pixel_format format) -+{ -+ uint32_t red_bar = 3; -+ uint32_t blue_bar = 2; -+ -+ /* swap for ABGR format */ -+ if (format == SURFACE_PIXEL_FORMAT_GRPH_ABGR8888 -+ || format == SURFACE_PIXEL_FORMAT_GRPH_ABGR2101010 -+ || format == SURFACE_PIXEL_FORMAT_GRPH_ABGR2101010_XR_BIAS -+ || format == SURFACE_PIXEL_FORMAT_GRPH_ABGR16161616F) { -+ red_bar = 2; -+ blue_bar = 3; -+ } -+ -+ REG_UPDATE_2(HUBPRET_CONTROL, -+ CROSSBAR_SRC_CB_B, blue_bar, -+ CROSSBAR_SRC_CR_R, red_bar); -+ -+ /* Mapping is same as ipp programming (cnvc) */ -+ -+ switch (format) { -+ case SURFACE_PIXEL_FORMAT_GRPH_ARGB1555: -+ REG_UPDATE(DCSURF_SURFACE_CONFIG, -+ SURFACE_PIXEL_FORMAT, 1); -+ break; -+ case SURFACE_PIXEL_FORMAT_GRPH_RGB565: -+ REG_UPDATE(DCSURF_SURFACE_CONFIG, -+ SURFACE_PIXEL_FORMAT, 3); -+ break; -+ case SURFACE_PIXEL_FORMAT_GRPH_ARGB8888: -+ case SURFACE_PIXEL_FORMAT_GRPH_ABGR8888: -+ REG_UPDATE(DCSURF_SURFACE_CONFIG, -+ SURFACE_PIXEL_FORMAT, 8); -+ break; -+ case SURFACE_PIXEL_FORMAT_GRPH_ARGB2101010: -+ case SURFACE_PIXEL_FORMAT_GRPH_ABGR2101010: -+ case SURFACE_PIXEL_FORMAT_GRPH_ABGR2101010_XR_BIAS: -+ REG_UPDATE(DCSURF_SURFACE_CONFIG, -+ SURFACE_PIXEL_FORMAT, 10); -+ break; -+ case SURFACE_PIXEL_FORMAT_GRPH_ARGB16161616: -+ REG_UPDATE(DCSURF_SURFACE_CONFIG, -+ SURFACE_PIXEL_FORMAT, 22); -+ break; -+ case SURFACE_PIXEL_FORMAT_GRPH_ARGB16161616F: -+ case SURFACE_PIXEL_FORMAT_GRPH_ABGR16161616F:/*we use crossbar already*/ -+ REG_UPDATE(DCSURF_SURFACE_CONFIG, -+ SURFACE_PIXEL_FORMAT, 24); -+ break; -+ -+ case SURFACE_PIXEL_FORMAT_VIDEO_420_YCbCr: -+ REG_UPDATE(DCSURF_SURFACE_CONFIG, -+ SURFACE_PIXEL_FORMAT, 65); -+ break; -+ case SURFACE_PIXEL_FORMAT_VIDEO_420_YCrCb: -+ REG_UPDATE(DCSURF_SURFACE_CONFIG, -+ SURFACE_PIXEL_FORMAT, 64); -+ break; -+ case SURFACE_PIXEL_FORMAT_VIDEO_420_10bpc_YCbCr: -+ REG_UPDATE(DCSURF_SURFACE_CONFIG, -+ SURFACE_PIXEL_FORMAT, 67); -+ break; -+ case SURFACE_PIXEL_FORMAT_VIDEO_420_10bpc_YCrCb: -+ REG_UPDATE(DCSURF_SURFACE_CONFIG, -+ SURFACE_PIXEL_FORMAT, 66); -+ break; -+ default: -+ BREAK_TO_DEBUGGER(); -+ break; -+ } -+ -+ /* don't see the need of program the xbar in DCN 1.0 */ -+} -+ -+static bool mem_input_program_surface_flip_and_addr( -+ struct mem_input *mem_input, -+ const struct dc_plane_address *address, -+ bool flip_immediate) -+{ -+ struct dcn10_mem_input *mi = TO_DCN10_MEM_INPUT(mem_input); -+ -+ /* program flip type */ -+ -+ REG_UPDATE(DCSURF_FLIP_CONTROL, -+ SURFACE_FLIP_TYPE, flip_immediate); -+ -+ /* REG_UPDATE(FLIP_CONTROL, SURFACE_UPDATE_LOCK, 1); */ -+ -+ -+ /* program high first and then the low addr, order matters! */ -+ switch (address->type) { -+ case PLN_ADDR_TYPE_GRAPHICS: -+ if (address->grph.addr.quad_part == 0) -+ break; -+ -+ if (address->grph.meta_addr.quad_part != 0) { -+ -+ REG_UPDATE(DCSURF_PRIMARY_META_SURFACE_ADDRESS_HIGH, -+ PRIMARY_META_SURFACE_ADDRESS_HIGH, -+ address->grph.meta_addr.high_part); -+ -+ REG_UPDATE(DCSURF_PRIMARY_META_SURFACE_ADDRESS, -+ PRIMARY_META_SURFACE_ADDRESS, -+ address->grph.meta_addr.low_part); -+ } -+ -+ REG_UPDATE(DCSURF_PRIMARY_SURFACE_ADDRESS_HIGH, -+ PRIMARY_SURFACE_ADDRESS_HIGH, -+ address->grph.addr.high_part); -+ -+ REG_UPDATE(DCSURF_PRIMARY_SURFACE_ADDRESS, -+ PRIMARY_SURFACE_ADDRESS, -+ address->grph.addr.low_part); -+ -+ -+ /* DCN1.0 does not support const color -+ * TODO: program DCHUBBUB_RET_PATH_DCC_CFGx_0/1 -+ * base on address->grph.dcc_const_color -+ * x = 0, 2, 4, 6 for pipe 0, 1, 2, 3 for rgb and luma -+ * x = 1, 3, 5, 7 for pipe 0, 1, 2, 3 for chroma -+ */ -+ break; -+ case PLN_ADDR_TYPE_VIDEO_PROGRESSIVE: -+ if (address->video_progressive.luma_addr.quad_part == 0 -+ || address->video_progressive.chroma_addr.quad_part == 0) -+ break; -+ -+ if (address->video_progressive.luma_meta_addr.quad_part != 0) { -+ -+ REG_UPDATE(DCSURF_PRIMARY_META_SURFACE_ADDRESS_HIGH, -+ PRIMARY_META_SURFACE_ADDRESS_HIGH, -+ address->video_progressive.luma_meta_addr.high_part); -+ -+ REG_UPDATE(DCSURF_PRIMARY_META_SURFACE_ADDRESS, -+ PRIMARY_META_SURFACE_ADDRESS, -+ address->video_progressive.luma_meta_addr.low_part); -+ -+ REG_UPDATE(DCSURF_PRIMARY_META_SURFACE_ADDRESS_HIGH_C, -+ PRIMARY_META_SURFACE_ADDRESS_HIGH_C, -+ address->video_progressive.chroma_meta_addr.high_part); -+ -+ REG_UPDATE(DCSURF_PRIMARY_META_SURFACE_ADDRESS_C, -+ PRIMARY_META_SURFACE_ADDRESS_C, -+ address->video_progressive.chroma_meta_addr.low_part); -+ } -+ -+ REG_UPDATE(DCSURF_PRIMARY_SURFACE_ADDRESS_HIGH, -+ PRIMARY_SURFACE_ADDRESS_HIGH, -+ address->video_progressive.luma_addr.high_part); -+ -+ REG_UPDATE(DCSURF_PRIMARY_SURFACE_ADDRESS, -+ PRIMARY_SURFACE_ADDRESS, -+ address->video_progressive.luma_addr.low_part); -+ -+ REG_UPDATE(DCSURF_PRIMARY_SURFACE_ADDRESS_HIGH_C, -+ PRIMARY_SURFACE_ADDRESS_HIGH_C, -+ address->video_progressive.chroma_addr.high_part); -+ -+ REG_UPDATE(DCSURF_PRIMARY_SURFACE_ADDRESS_C, -+ PRIMARY_SURFACE_ADDRESS_C, -+ address->video_progressive.chroma_addr.low_part); -+ -+ break; -+ case PLN_ADDR_TYPE_GRPH_STEREO: -+ if (address->grph_stereo.left_addr.quad_part == 0) -+ break; -+ if (address->grph_stereo.right_addr.quad_part == 0) -+ break; -+ if (address->grph_stereo.right_meta_addr.quad_part != 0) { -+ -+ REG_UPDATE(DCSURF_SECONDARY_META_SURFACE_ADDRESS_HIGH, -+ SECONDARY_META_SURFACE_ADDRESS_HIGH, -+ address->grph_stereo.right_meta_addr.high_part); -+ -+ REG_UPDATE(DCSURF_SECONDARY_META_SURFACE_ADDRESS, -+ SECONDARY_META_SURFACE_ADDRESS, -+ address->grph_stereo.right_meta_addr.low_part); -+ } -+ if (address->grph_stereo.left_meta_addr.quad_part != 0) { -+ -+ REG_UPDATE(DCSURF_PRIMARY_META_SURFACE_ADDRESS_HIGH, -+ PRIMARY_META_SURFACE_ADDRESS_HIGH, -+ address->grph_stereo.left_meta_addr.high_part); -+ -+ REG_UPDATE(DCSURF_PRIMARY_META_SURFACE_ADDRESS, -+ PRIMARY_META_SURFACE_ADDRESS, -+ address->grph_stereo.left_meta_addr.low_part); -+ } -+ -+ REG_UPDATE(DCSURF_SECONDARY_SURFACE_ADDRESS_HIGH, -+ SECONDARY_SURFACE_ADDRESS_HIGH, -+ address->grph_stereo.right_addr.high_part); -+ -+ REG_UPDATE(DCSURF_SECONDARY_SURFACE_ADDRESS, -+ SECONDARY_SURFACE_ADDRESS, -+ address->grph_stereo.right_addr.low_part); -+ -+ -+ REG_UPDATE(DCSURF_PRIMARY_SURFACE_ADDRESS_HIGH, -+ PRIMARY_SURFACE_ADDRESS_HIGH, -+ address->grph_stereo.left_addr.high_part); -+ -+ REG_UPDATE(DCSURF_PRIMARY_SURFACE_ADDRESS, -+ PRIMARY_SURFACE_ADDRESS, -+ address->grph_stereo.left_addr.low_part); -+ break; -+ default: -+ BREAK_TO_DEBUGGER(); -+ break; -+ } -+ /* REG_UPDATE(FLIP_CONTROL, SURFACE_UPDATE_LOCK, 0); */ -+ -+ mem_input->request_address = *address; -+ -+ if (flip_immediate) -+ mem_input->current_address = *address; -+ -+ return true; -+} -+ -+static void program_control(struct dcn10_mem_input *mi, -+ struct dc_plane_dcc_param *dcc) -+{ -+ uint32_t dcc_en = dcc->enable ? 1 : 0; -+ uint32_t dcc_ind_64b_blk = dcc->grph.independent_64b_blks ? 1 : 0; -+ -+ REG_UPDATE_2(DCSURF_SURFACE_CONTROL, -+ PRIMARY_SURFACE_DCC_EN, dcc_en, -+ PRIMARY_SURFACE_DCC_IND_64B_BLK, dcc_ind_64b_blk); -+ -+} -+ -+static void mem_input_program_surface_config( -+ struct mem_input *mem_input, -+ enum surface_pixel_format format, -+ union dc_tiling_info *tiling_info, -+ union plane_size *plane_size, -+ enum dc_rotation_angle rotation, -+ struct dc_plane_dcc_param *dcc, -+ bool horizontal_mirror, -+ bool visible) -+{ -+ struct dcn10_mem_input *mi = TO_DCN10_MEM_INPUT(mem_input); -+ -+ program_control(mi, dcc); -+ program_tiling(mi, tiling_info, format); -+ program_size_and_rotation( -+ mi, rotation, format, plane_size, dcc, horizontal_mirror); -+ program_pixel_format(mi, format); -+ -+ set_blank(mi, !visible); -+} -+ -+static void program_requestor( -+ struct mem_input *mem_input, -+ struct _vcs_dpi_display_rq_regs_st *rq_regs) -+{ -+ -+ struct dcn10_mem_input *mi = TO_DCN10_MEM_INPUT(mem_input); -+ -+ REG_UPDATE(HUBPRET_CONTROL, -+ DET_BUF_PLANE1_BASE_ADDRESS, rq_regs->plane1_base_address); -+ REG_SET_4(DCN_EXPANSION_MODE, 0, -+ DRQ_EXPANSION_MODE, rq_regs->drq_expansion_mode, -+ PRQ_EXPANSION_MODE, rq_regs->prq_expansion_mode, -+ MRQ_EXPANSION_MODE, rq_regs->mrq_expansion_mode, -+ CRQ_EXPANSION_MODE, rq_regs->crq_expansion_mode); -+ REG_SET_8(DCHUBP_REQ_SIZE_CONFIG, 0, -+ CHUNK_SIZE, rq_regs->rq_regs_l.chunk_size, -+ MIN_CHUNK_SIZE, rq_regs->rq_regs_l.min_chunk_size, -+ META_CHUNK_SIZE, rq_regs->rq_regs_l.meta_chunk_size, -+ MIN_META_CHUNK_SIZE, rq_regs->rq_regs_l.min_meta_chunk_size, -+ DPTE_GROUP_SIZE, rq_regs->rq_regs_l.dpte_group_size, -+ MPTE_GROUP_SIZE, rq_regs->rq_regs_l.mpte_group_size, -+ SWATH_HEIGHT, rq_regs->rq_regs_l.swath_height, -+ PTE_ROW_HEIGHT_LINEAR, rq_regs->rq_regs_l.pte_row_height_linear); -+ REG_SET_8(DCHUBP_REQ_SIZE_CONFIG_C, 0, -+ CHUNK_SIZE_C, rq_regs->rq_regs_c.chunk_size, -+ MIN_CHUNK_SIZE_C, rq_regs->rq_regs_c.min_chunk_size, -+ META_CHUNK_SIZE_C, rq_regs->rq_regs_c.meta_chunk_size, -+ MIN_META_CHUNK_SIZE_C, rq_regs->rq_regs_c.min_meta_chunk_size, -+ DPTE_GROUP_SIZE_C, rq_regs->rq_regs_c.dpte_group_size, -+ MPTE_GROUP_SIZE_C, rq_regs->rq_regs_c.mpte_group_size, -+ SWATH_HEIGHT_C, rq_regs->rq_regs_c.swath_height, -+ PTE_ROW_HEIGHT_LINEAR_C, rq_regs->rq_regs_c.pte_row_height_linear); -+} -+ -+ -+static void program_deadline( -+ struct mem_input *mem_input, -+ struct _vcs_dpi_display_dlg_regs_st *dlg_attr, -+ struct _vcs_dpi_display_ttu_regs_st *ttu_attr) -+{ -+ struct dcn10_mem_input *mi = TO_DCN10_MEM_INPUT(mem_input); -+ -+ /* DLG - Per hubp */ -+ REG_SET_2(BLANK_OFFSET_0, 0, -+ REFCYC_H_BLANK_END, dlg_attr->refcyc_h_blank_end, -+ DLG_V_BLANK_END, dlg_attr->dlg_vblank_end); -+ -+ REG_SET(BLANK_OFFSET_1, 0, -+ MIN_DST_Y_NEXT_START, dlg_attr->min_dst_y_next_start); -+ -+ REG_SET(DST_DIMENSIONS, 0, -+ REFCYC_PER_HTOTAL, dlg_attr->refcyc_per_htotal); -+ -+ REG_SET_2(DST_AFTER_SCALER, 0, -+ REFCYC_X_AFTER_SCALER, dlg_attr->refcyc_x_after_scaler, -+ DST_Y_AFTER_SCALER, dlg_attr->dst_y_after_scaler); -+ -+ REG_SET_2(PREFETCH_SETTINS, 0, -+ DST_Y_PREFETCH, dlg_attr->dst_y_prefetch, -+ VRATIO_PREFETCH, dlg_attr->vratio_prefetch); -+ -+ REG_SET_2(VBLANK_PARAMETERS_0, 0, -+ DST_Y_PER_VM_VBLANK, dlg_attr->dst_y_per_vm_vblank, -+ DST_Y_PER_ROW_VBLANK, dlg_attr->dst_y_per_row_vblank); -+ -+ REG_SET(REF_FREQ_TO_PIX_FREQ, 0, -+ REF_FREQ_TO_PIX_FREQ, dlg_attr->ref_freq_to_pix_freq); -+ -+ /* DLG - Per luma/chroma */ -+ REG_SET(VBLANK_PARAMETERS_1, 0, -+ REFCYC_PER_PTE_GROUP_VBLANK_L, dlg_attr->refcyc_per_pte_group_vblank_l); -+ -+ REG_SET(VBLANK_PARAMETERS_3, 0, -+ REFCYC_PER_META_CHUNK_VBLANK_L, dlg_attr->refcyc_per_meta_chunk_vblank_l); -+ -+ REG_SET(NOM_PARAMETERS_0, 0, -+ DST_Y_PER_PTE_ROW_NOM_L, dlg_attr->dst_y_per_pte_row_nom_l); -+ -+ REG_SET(NOM_PARAMETERS_1, 0, -+ REFCYC_PER_PTE_GROUP_NOM_L, dlg_attr->refcyc_per_pte_group_nom_l); -+ -+ REG_SET(NOM_PARAMETERS_4, 0, -+ DST_Y_PER_META_ROW_NOM_L, dlg_attr->dst_y_per_meta_row_nom_l); -+ -+ REG_SET(NOM_PARAMETERS_5, 0, -+ REFCYC_PER_META_CHUNK_NOM_L, dlg_attr->refcyc_per_meta_chunk_nom_l); -+ -+ REG_SET_2(PER_LINE_DELIVERY_PRE, 0, -+ REFCYC_PER_LINE_DELIVERY_PRE_L, dlg_attr->refcyc_per_line_delivery_pre_l, -+ REFCYC_PER_LINE_DELIVERY_PRE_C, dlg_attr->refcyc_per_line_delivery_pre_c); -+ -+ REG_SET_2(PER_LINE_DELIVERY, 0, -+ REFCYC_PER_LINE_DELIVERY_L, dlg_attr->refcyc_per_line_delivery_l, -+ REFCYC_PER_LINE_DELIVERY_C, dlg_attr->refcyc_per_line_delivery_c); -+ -+ REG_SET(PREFETCH_SETTINS_C, 0, -+ VRATIO_PREFETCH_C, dlg_attr->vratio_prefetch_c); -+ -+ REG_SET(VBLANK_PARAMETERS_2, 0, -+ REFCYC_PER_PTE_GROUP_VBLANK_C, dlg_attr->refcyc_per_pte_group_vblank_c); -+ -+ REG_SET(VBLANK_PARAMETERS_4, 0, -+ REFCYC_PER_META_CHUNK_VBLANK_C, dlg_attr->refcyc_per_meta_chunk_vblank_c); -+ -+ REG_SET(NOM_PARAMETERS_2, 0, -+ DST_Y_PER_PTE_ROW_NOM_C, dlg_attr->dst_y_per_pte_row_nom_c); -+ -+ REG_SET(NOM_PARAMETERS_3, 0, -+ REFCYC_PER_PTE_GROUP_NOM_C, dlg_attr->refcyc_per_pte_group_nom_c); -+ -+ REG_SET(NOM_PARAMETERS_6, 0, -+ DST_Y_PER_META_ROW_NOM_C, dlg_attr->dst_y_per_meta_row_nom_c); -+ -+ REG_SET(NOM_PARAMETERS_7, 0, -+ REFCYC_PER_META_CHUNK_NOM_C, dlg_attr->refcyc_per_meta_chunk_nom_c); -+ -+ /* TTU - per hubp */ -+ REG_SET_2(DCN_TTU_QOS_WM, 0, -+ QoS_LEVEL_LOW_WM, ttu_attr->qos_level_low_wm, -+ QoS_LEVEL_HIGH_WM, ttu_attr->qos_level_high_wm); -+ -+ REG_SET_2(DCN_GLOBAL_TTU_CNTL, 0, -+ MIN_TTU_VBLANK, ttu_attr->min_ttu_vblank, -+ QoS_LEVEL_FLIP, ttu_attr->qos_level_flip); -+ -+ /* TTU - per luma/chroma */ -+ /* Assumed surf0 is luma and 1 is chroma */ -+ -+ REG_SET_3(DCN_SURF0_TTU_CNTL0, 0, -+ REFCYC_PER_REQ_DELIVERY, ttu_attr->refcyc_per_req_delivery_l, -+ QoS_LEVEL_FIXED, ttu_attr->qos_level_fixed_l, -+ QoS_RAMP_DISABLE, ttu_attr->qos_ramp_disable_l); -+ -+ REG_SET(DCN_SURF0_TTU_CNTL1, 0, -+ REFCYC_PER_REQ_DELIVERY_PRE, -+ ttu_attr->refcyc_per_req_delivery_pre_l); -+ -+ REG_SET_3(DCN_SURF1_TTU_CNTL0, 0, -+ REFCYC_PER_REQ_DELIVERY, ttu_attr->refcyc_per_req_delivery_c, -+ QoS_LEVEL_FIXED, ttu_attr->qos_level_fixed_c, -+ QoS_RAMP_DISABLE, ttu_attr->qos_ramp_disable_c); -+ -+ REG_SET(DCN_SURF1_TTU_CNTL1, 0, -+ REFCYC_PER_REQ_DELIVERY_PRE, -+ ttu_attr->refcyc_per_req_delivery_pre_c); -+} -+ -+static void mem_input_setup( -+ struct mem_input *mem_input, -+ struct _vcs_dpi_display_dlg_regs_st *dlg_attr, -+ struct _vcs_dpi_display_ttu_regs_st *ttu_attr, -+ struct _vcs_dpi_display_rq_regs_st *rq_regs, -+ struct _vcs_dpi_display_pipe_dest_params_st *pipe_dest) -+{ -+ /* otg is locked when this func is called. Register are double buffered. -+ * disable the requestors is not needed -+ */ -+ /* disable_request(mem_input); */ -+ program_requestor(mem_input, rq_regs); -+ program_deadline(mem_input, dlg_attr, ttu_attr); -+ vready_workaround(mem_input, pipe_dest); -+} -+ -+static uint32_t convert_and_clamp( -+ uint32_t wm_ns, -+ uint32_t refclk_mhz, -+ uint32_t clamp_value) -+{ -+ uint32_t ret_val = 0; -+ ret_val = wm_ns * refclk_mhz; -+ ret_val /= 1000; -+ -+ if (ret_val > clamp_value) -+ ret_val = clamp_value; -+ -+ return ret_val; -+} -+ -+static void program_watermarks( -+ struct mem_input *mem_input, -+ struct dcn_watermark_set *watermarks, -+ unsigned int refclk_mhz) -+{ -+ struct dcn10_mem_input *mi = TO_DCN10_MEM_INPUT(mem_input); -+ /* -+ * Need to clamp to max of the register values (i.e. no wrap) -+ * for dcn1, all wm registers are 21-bit wide -+ */ -+ uint32_t prog_wm_value; -+ -+ /* Repeat for water mark set A, B, C and D. */ -+ /* clock state A */ -+ prog_wm_value = convert_and_clamp(watermarks->a.urgent_ns, -+ refclk_mhz, 0x1fffff); -+ REG_WRITE(DCHUBBUB_ARB_DATA_URGENCY_WATERMARK_A, prog_wm_value); -+ -+ dm_logger_write(mem_input->ctx->logger, LOG_HW_MARKS, -+ "URGENCY_WATERMARK_A calculated =%d\n" -+ "HW register value = 0x%x\n", -+ watermarks->a.urgent_ns, prog_wm_value); -+ -+ prog_wm_value = convert_and_clamp(watermarks->a.pte_meta_urgent_ns, -+ refclk_mhz, 0x1fffff); -+ REG_WRITE(DCHUBBUB_ARB_PTE_META_URGENCY_WATERMARK_A, prog_wm_value); -+ dm_logger_write(mem_input->ctx->logger, LOG_HW_MARKS, -+ "PTE_META_URGENCY_WATERMARK_A calculated =%d\n" -+ "HW register value = 0x%x\n", -+ watermarks->a.pte_meta_urgent_ns, prog_wm_value); -+ -+ -+ prog_wm_value = convert_and_clamp( -+ watermarks->a.cstate_pstate.cstate_enter_plus_exit_ns, -+ refclk_mhz, 0x1fffff); -+ -+ REG_WRITE(DCHUBBUB_ARB_ALLOW_SR_ENTER_WATERMARK_A, prog_wm_value); -+ dm_logger_write(mem_input->ctx->logger, LOG_HW_MARKS, -+ "SR_ENTER_EXIT_WATERMARK_A calculated =%d\n" -+ "HW register value = 0x%x\n", -+ watermarks->a.cstate_pstate.cstate_enter_plus_exit_ns, prog_wm_value); -+ -+ -+ prog_wm_value = convert_and_clamp( -+ watermarks->a.cstate_pstate.cstate_exit_ns, -+ refclk_mhz, 0x1fffff); -+ REG_WRITE(DCHUBBUB_ARB_ALLOW_SR_EXIT_WATERMARK_A, prog_wm_value); -+ dm_logger_write(mem_input->ctx->logger, LOG_HW_MARKS, -+ "SR_EXIT_WATERMARK_A calculated =%d\n" -+ "HW register value = 0x%x\n", -+ watermarks->a.cstate_pstate.cstate_exit_ns, prog_wm_value); -+ -+ -+ prog_wm_value = convert_and_clamp( -+ watermarks->a.cstate_pstate.pstate_change_ns, -+ refclk_mhz, 0x1fffff); -+ REG_WRITE(DCHUBBUB_ARB_ALLOW_DRAM_CLK_CHANGE_WATERMARK_A, prog_wm_value); -+ dm_logger_write(mem_input->ctx->logger, LOG_HW_MARKS, -+ "DRAM_CLK_CHANGE_WATERMARK_A calculated =%d\n" -+ "HW register value = 0x%x\n\n", -+ watermarks->a.cstate_pstate.pstate_change_ns, prog_wm_value); -+ -+ -+ /* clock state B */ -+ prog_wm_value = convert_and_clamp( -+ watermarks->b.urgent_ns, refclk_mhz, 0x1fffff); -+ REG_WRITE(DCHUBBUB_ARB_DATA_URGENCY_WATERMARK_B, prog_wm_value); -+ dm_logger_write(mem_input->ctx->logger, LOG_HW_MARKS, -+ "URGENCY_WATERMARK_B calculated =%d\n" -+ "HW register value = 0x%x\n", -+ watermarks->b.urgent_ns, prog_wm_value); -+ -+ -+ prog_wm_value = convert_and_clamp( -+ watermarks->b.pte_meta_urgent_ns, -+ refclk_mhz, 0x1fffff); -+ REG_WRITE(DCHUBBUB_ARB_PTE_META_URGENCY_WATERMARK_B, prog_wm_value); -+ dm_logger_write(mem_input->ctx->logger, LOG_HW_MARKS, -+ "PTE_META_URGENCY_WATERMARK_B calculated =%d\n" -+ "HW register value = 0x%x\n", -+ watermarks->b.pte_meta_urgent_ns, prog_wm_value); -+ -+ -+ prog_wm_value = convert_and_clamp( -+ watermarks->b.cstate_pstate.cstate_enter_plus_exit_ns, -+ refclk_mhz, 0x1fffff); -+ REG_WRITE(DCHUBBUB_ARB_ALLOW_SR_ENTER_WATERMARK_B, prog_wm_value); -+ dm_logger_write(mem_input->ctx->logger, LOG_HW_MARKS, -+ "SR_ENTER_WATERMARK_B calculated =%d\n" -+ "HW register value = 0x%x\n", -+ watermarks->b.cstate_pstate.cstate_enter_plus_exit_ns, prog_wm_value); -+ -+ -+ prog_wm_value = convert_and_clamp( -+ watermarks->b.cstate_pstate.cstate_exit_ns, -+ refclk_mhz, 0x1fffff); -+ REG_WRITE(DCHUBBUB_ARB_ALLOW_SR_EXIT_WATERMARK_B, prog_wm_value); -+ dm_logger_write(mem_input->ctx->logger, LOG_HW_MARKS, -+ "SR_EXIT_WATERMARK_B calculated =%d\n" -+ "HW register value = 0x%x\n", -+ watermarks->b.cstate_pstate.cstate_exit_ns, prog_wm_value); -+ -+ prog_wm_value = convert_and_clamp( -+ watermarks->b.cstate_pstate.pstate_change_ns, -+ refclk_mhz, 0x1fffff); -+ REG_WRITE(DCHUBBUB_ARB_ALLOW_DRAM_CLK_CHANGE_WATERMARK_B, prog_wm_value); -+ dm_logger_write(mem_input->ctx->logger, LOG_HW_MARKS, -+ "DRAM_CLK_CHANGE_WATERMARK_B calculated =%d\n\n" -+ "HW register value = 0x%x\n", -+ watermarks->b.cstate_pstate.pstate_change_ns, prog_wm_value); -+ -+ /* clock state C */ -+ prog_wm_value = convert_and_clamp( -+ watermarks->c.urgent_ns, refclk_mhz, 0x1fffff); -+ REG_WRITE(DCHUBBUB_ARB_DATA_URGENCY_WATERMARK_C, prog_wm_value); -+ dm_logger_write(mem_input->ctx->logger, LOG_HW_MARKS, -+ "URGENCY_WATERMARK_C calculated =%d\n" -+ "HW register value = 0x%x\n", -+ watermarks->c.urgent_ns, prog_wm_value); -+ -+ -+ prog_wm_value = convert_and_clamp( -+ watermarks->c.pte_meta_urgent_ns, -+ refclk_mhz, 0x1fffff); -+ REG_WRITE(DCHUBBUB_ARB_PTE_META_URGENCY_WATERMARK_C, prog_wm_value); -+ dm_logger_write(mem_input->ctx->logger, LOG_HW_MARKS, -+ "PTE_META_URGENCY_WATERMARK_C calculated =%d\n" -+ "HW register value = 0x%x\n", -+ watermarks->c.pte_meta_urgent_ns, prog_wm_value); -+ -+ -+ prog_wm_value = convert_and_clamp( -+ watermarks->c.cstate_pstate.cstate_enter_plus_exit_ns, -+ refclk_mhz, 0x1fffff); -+ REG_WRITE(DCHUBBUB_ARB_ALLOW_SR_ENTER_WATERMARK_C, prog_wm_value); -+ dm_logger_write(mem_input->ctx->logger, LOG_HW_MARKS, -+ "SR_ENTER_WATERMARK_C calculated =%d\n" -+ "HW register value = 0x%x\n", -+ watermarks->c.cstate_pstate.cstate_enter_plus_exit_ns, prog_wm_value); -+ -+ -+ prog_wm_value = convert_and_clamp( -+ watermarks->c.cstate_pstate.cstate_exit_ns, -+ refclk_mhz, 0x1fffff); -+ REG_WRITE(DCHUBBUB_ARB_ALLOW_SR_EXIT_WATERMARK_C, prog_wm_value); -+ dm_logger_write(mem_input->ctx->logger, LOG_HW_MARKS, -+ "SR_EXIT_WATERMARK_C calculated =%d\n" -+ "HW register value = 0x%x\n", -+ watermarks->c.cstate_pstate.cstate_exit_ns, prog_wm_value); -+ -+ -+ prog_wm_value = convert_and_clamp( -+ watermarks->c.cstate_pstate.pstate_change_ns, -+ refclk_mhz, 0x1fffff); -+ REG_WRITE(DCHUBBUB_ARB_ALLOW_DRAM_CLK_CHANGE_WATERMARK_C, prog_wm_value); -+ dm_logger_write(mem_input->ctx->logger, LOG_HW_MARKS, -+ "DRAM_CLK_CHANGE_WATERMARK_C calculated =%d\n\n" -+ "HW register value = 0x%x\n", -+ watermarks->c.cstate_pstate.pstate_change_ns, prog_wm_value); -+ -+ /* clock state D */ -+ prog_wm_value = convert_and_clamp( -+ watermarks->d.urgent_ns, refclk_mhz, 0x1fffff); -+ REG_WRITE(DCHUBBUB_ARB_DATA_URGENCY_WATERMARK_D, prog_wm_value); -+ dm_logger_write(mem_input->ctx->logger, LOG_HW_MARKS, -+ "URGENCY_WATERMARK_D calculated =%d\n" -+ "HW register value = 0x%x\n", -+ watermarks->d.urgent_ns, prog_wm_value); -+ -+ prog_wm_value = convert_and_clamp( -+ watermarks->d.pte_meta_urgent_ns, -+ refclk_mhz, 0x1fffff); -+ REG_WRITE(DCHUBBUB_ARB_PTE_META_URGENCY_WATERMARK_D, prog_wm_value); -+ dm_logger_write(mem_input->ctx->logger, LOG_HW_MARKS, -+ "PTE_META_URGENCY_WATERMARK_D calculated =%d\n" -+ "HW register value = 0x%x\n", -+ watermarks->d.pte_meta_urgent_ns, prog_wm_value); -+ -+ -+ prog_wm_value = convert_and_clamp( -+ watermarks->d.cstate_pstate.cstate_enter_plus_exit_ns, -+ refclk_mhz, 0x1fffff); -+ REG_WRITE(DCHUBBUB_ARB_ALLOW_SR_ENTER_WATERMARK_D, prog_wm_value); -+ dm_logger_write(mem_input->ctx->logger, LOG_HW_MARKS, -+ "SR_ENTER_WATERMARK_D calculated =%d\n" -+ "HW register value = 0x%x\n", -+ watermarks->d.cstate_pstate.cstate_enter_plus_exit_ns, prog_wm_value); -+ -+ -+ prog_wm_value = convert_and_clamp( -+ watermarks->d.cstate_pstate.cstate_exit_ns, -+ refclk_mhz, 0x1fffff); -+ REG_WRITE(DCHUBBUB_ARB_ALLOW_SR_EXIT_WATERMARK_D, prog_wm_value); -+ dm_logger_write(mem_input->ctx->logger, LOG_HW_MARKS, -+ "SR_EXIT_WATERMARK_D calculated =%d\n" -+ "HW register value = 0x%x\n", -+ watermarks->d.cstate_pstate.cstate_exit_ns, prog_wm_value); -+ -+ -+ prog_wm_value = convert_and_clamp( -+ watermarks->d.cstate_pstate.pstate_change_ns, -+ refclk_mhz, 0x1fffff); -+ REG_WRITE(DCHUBBUB_ARB_ALLOW_DRAM_CLK_CHANGE_WATERMARK_D, prog_wm_value); -+ dm_logger_write(mem_input->ctx->logger, LOG_HW_MARKS, -+ "DRAM_CLK_CHANGE_WATERMARK_D calculated =%d\n" -+ "HW register value = 0x%x\n\n", -+ watermarks->d.cstate_pstate.pstate_change_ns, prog_wm_value); -+ -+ REG_UPDATE(DCHUBBUB_ARB_WATERMARK_CHANGE_CNTL, -+ DCHUBBUB_ARB_WATERMARK_CHANGE_REQUEST, 1); -+ REG_UPDATE(DCHUBBUB_ARB_WATERMARK_CHANGE_CNTL, -+ DCHUBBUB_ARB_WATERMARK_CHANGE_REQUEST, 0); -+ REG_UPDATE(DCHUBBUB_ARB_SAT_LEVEL, -+ DCHUBBUB_ARB_SAT_LEVEL, 60 * refclk_mhz); -+ REG_UPDATE(DCHUBBUB_ARB_DF_REQ_OUTSTAND, -+ DCHUBBUB_ARB_MIN_REQ_OUTSTAND, 68); -+ -+#if 0 -+ REG_UPDATE_2(DCHUBBUB_ARB_WATERMARK_CHANGE_CNTL, -+ DCHUBBUB_ARB_WATERMARK_CHANGE_DONE_INTERRUPT_DISABLE, 1, -+ DCHUBBUB_ARB_WATERMARK_CHANGE_REQUEST, 1); -+#endif -+} -+ -+static void mem_input_program_display_marks( -+ struct mem_input *mem_input, -+ struct bw_watermarks nbp, -+ struct bw_watermarks stutter, -+ struct bw_watermarks urgent, -+ uint32_t total_dest_line_time_ns) -+{ -+ /* only for dce -+ * dcn use only program_watermarks -+ */ -+} -+ -+bool mem_input_is_flip_pending(struct mem_input *mem_input) -+{ -+ uint32_t update_pending = 0; -+ struct dcn10_mem_input *mi = TO_DCN10_MEM_INPUT(mem_input); -+ -+ REG_GET(DCSURF_FLIP_CONTROL, -+ SURFACE_UPDATE_PENDING, &update_pending); -+ -+ if (update_pending) -+ return true; -+ -+ mem_input->current_address = mem_input->request_address; -+ return false; -+} -+ -+static void mem_input_update_dchub( -+ struct mem_input *mem_input, -+ struct dchub_init_data *dh_data) -+{ -+ struct dcn10_mem_input *mi = TO_DCN10_MEM_INPUT(mem_input); -+ /* TODO: port code from dal2 */ -+ switch (dh_data->fb_mode) { -+ case FRAME_BUFFER_MODE_ZFB_ONLY: -+ /*For ZFB case need to put DCHUB FB BASE and TOP upside down to indicate ZFB mode*/ -+ REG_UPDATE(DCHUBBUB_SDPIF_FB_TOP, -+ SDPIF_FB_TOP, 0); -+ -+ REG_UPDATE(DCHUBBUB_SDPIF_FB_BASE, -+ SDPIF_FB_BASE, 0x0FFFF); -+ -+ REG_UPDATE(DCHUBBUB_SDPIF_AGP_BASE, -+ SDPIF_AGP_BASE, dh_data->zfb_phys_addr_base >> 22); -+ -+ REG_UPDATE(DCHUBBUB_SDPIF_AGP_BOT, -+ SDPIF_AGP_BOT, dh_data->zfb_mc_base_addr >> 22); -+ -+ REG_UPDATE(DCHUBBUB_SDPIF_AGP_TOP, -+ SDPIF_AGP_TOP, (dh_data->zfb_mc_base_addr + -+ dh_data->zfb_size_in_byte - 1) >> 22); -+ break; -+ case FRAME_BUFFER_MODE_MIXED_ZFB_AND_LOCAL: -+ /*Should not touch FB LOCATION (done by VBIOS on AsicInit table)*/ -+ -+ REG_UPDATE(DCHUBBUB_SDPIF_AGP_BASE, -+ SDPIF_AGP_BASE, dh_data->zfb_phys_addr_base >> 22); -+ -+ REG_UPDATE(DCHUBBUB_SDPIF_AGP_BOT, -+ SDPIF_AGP_BOT, dh_data->zfb_mc_base_addr >> 22); -+ -+ REG_UPDATE(DCHUBBUB_SDPIF_AGP_TOP, -+ SDPIF_AGP_TOP, (dh_data->zfb_mc_base_addr + -+ dh_data->zfb_size_in_byte - 1) >> 22); -+ break; -+ case FRAME_BUFFER_MODE_LOCAL_ONLY: -+ /*Should not touch FB LOCATION (done by VBIOS on AsicInit table)*/ -+ REG_UPDATE(DCHUBBUB_SDPIF_AGP_BASE, -+ SDPIF_AGP_BASE, 0); -+ -+ REG_UPDATE(DCHUBBUB_SDPIF_AGP_BOT, -+ SDPIF_AGP_BOT, 0X03FFFF); -+ -+ REG_UPDATE(DCHUBBUB_SDPIF_AGP_TOP, -+ SDPIF_AGP_TOP, 0); -+ break; -+ default: -+ break; -+ } -+ -+ dh_data->dchub_initialzied = true; -+ dh_data->dchub_info_valid = false; -+} -+ -+struct vm_system_aperture_param { -+ PHYSICAL_ADDRESS_LOC sys_default; -+ PHYSICAL_ADDRESS_LOC sys_low; -+ PHYSICAL_ADDRESS_LOC sys_high; -+}; -+ -+static void read_vm_system_aperture_settings(struct dcn10_mem_input *mi, -+ struct vm_system_aperture_param *apt) -+{ -+ PHYSICAL_ADDRESS_LOC physical_page_number; -+ uint32_t logical_addr_low; -+ uint32_t logical_addr_high; -+ -+ REG_GET(MC_VM_SYSTEM_APERTURE_DEFAULT_ADDR_MSB, -+ PHYSICAL_PAGE_NUMBER_MSB, &physical_page_number.high_part); -+ REG_GET(MC_VM_SYSTEM_APERTURE_DEFAULT_ADDR_LSB, -+ PHYSICAL_PAGE_NUMBER_LSB, &physical_page_number.low_part); -+ -+ REG_GET(MC_VM_SYSTEM_APERTURE_LOW_ADDR, -+ LOGICAL_ADDR, &logical_addr_low); -+ -+ REG_GET(MC_VM_SYSTEM_APERTURE_HIGH_ADDR, -+ LOGICAL_ADDR, &logical_addr_high); -+ -+ apt->sys_default.quad_part = physical_page_number.quad_part << 12; -+ apt->sys_low.quad_part = (int64_t)logical_addr_low << 18; -+ apt->sys_high.quad_part = (int64_t)logical_addr_high << 18; -+} -+ -+static void set_vm_system_aperture_settings(struct dcn10_mem_input *mi, -+ struct vm_system_aperture_param *apt) -+{ -+ PHYSICAL_ADDRESS_LOC mc_vm_apt_default; -+ PHYSICAL_ADDRESS_LOC mc_vm_apt_low; -+ PHYSICAL_ADDRESS_LOC mc_vm_apt_high; -+ -+ mc_vm_apt_default.quad_part = apt->sys_default.quad_part >> 12; -+ mc_vm_apt_low.quad_part = apt->sys_low.quad_part >> 12; -+ mc_vm_apt_high.quad_part = apt->sys_high.quad_part >> 12; -+ -+ REG_SET_2(DCN_VM_SYSTEM_APERTURE_DEFAULT_ADDR_MSB, 0, -+ MC_VM_SYSTEM_APERTURE_DEFAULT_SYSTEM, 1, /* 1 = system physical memory */ -+ MC_VM_SYSTEM_APERTURE_DEFAULT_ADDR_MSB, mc_vm_apt_default.high_part); -+ REG_SET(DCN_VM_SYSTEM_APERTURE_DEFAULT_ADDR_LSB, 0, -+ MC_VM_SYSTEM_APERTURE_DEFAULT_ADDR_LSB, mc_vm_apt_default.low_part); -+ -+ REG_SET(DCN_VM_SYSTEM_APERTURE_LOW_ADDR_MSB, 0, -+ MC_VM_SYSTEM_APERTURE_LOW_ADDR_MSB, mc_vm_apt_low.high_part); -+ REG_SET(DCN_VM_SYSTEM_APERTURE_LOW_ADDR_LSB, 0, -+ MC_VM_SYSTEM_APERTURE_LOW_ADDR_LSB, mc_vm_apt_low.low_part); -+ -+ REG_SET(DCN_VM_SYSTEM_APERTURE_HIGH_ADDR_MSB, 0, -+ MC_VM_SYSTEM_APERTURE_HIGH_ADDR_MSB, mc_vm_apt_high.high_part); -+ REG_SET(DCN_VM_SYSTEM_APERTURE_HIGH_ADDR_LSB, 0, -+ MC_VM_SYSTEM_APERTURE_HIGH_ADDR_LSB, mc_vm_apt_high.low_part); -+} -+ -+struct vm_context0_param { -+ PHYSICAL_ADDRESS_LOC pte_base; -+ PHYSICAL_ADDRESS_LOC pte_start; -+ PHYSICAL_ADDRESS_LOC pte_end; -+ PHYSICAL_ADDRESS_LOC fault_default; -+}; -+ -+/* Temporary read settings, future will get values from kmd directly */ -+static void read_vm_context0_settings(struct dcn10_mem_input *mi, -+ struct vm_context0_param *vm0) -+{ -+ PHYSICAL_ADDRESS_LOC fb_base; -+ PHYSICAL_ADDRESS_LOC fb_offset; -+ uint32_t fb_base_value; -+ uint32_t fb_offset_value; -+ -+ REG_GET(DCHUBBUB_SDPIF_FB_BASE, SDPIF_FB_BASE, &fb_base_value); -+ REG_GET(DCHUBBUB_SDPIF_FB_OFFSET, SDPIF_FB_OFFSET, &fb_offset_value); -+ -+ REG_GET(VM_CONTEXT0_PAGE_TABLE_BASE_ADDR_HI32, -+ PAGE_DIRECTORY_ENTRY_HI32, &vm0->pte_base.high_part); -+ REG_GET(VM_CONTEXT0_PAGE_TABLE_BASE_ADDR_LO32, -+ PAGE_DIRECTORY_ENTRY_LO32, &vm0->pte_base.low_part); -+ -+ REG_GET(VM_CONTEXT0_PAGE_TABLE_START_ADDR_HI32, -+ LOGICAL_PAGE_NUMBER_HI4, &vm0->pte_start.high_part); -+ REG_GET(VM_CONTEXT0_PAGE_TABLE_START_ADDR_LO32, -+ LOGICAL_PAGE_NUMBER_LO32, &vm0->pte_start.low_part); -+ -+ REG_GET(VM_CONTEXT0_PAGE_TABLE_END_ADDR_HI32, -+ LOGICAL_PAGE_NUMBER_HI4, &vm0->pte_end.high_part); -+ REG_GET(VM_CONTEXT0_PAGE_TABLE_END_ADDR_LO32, -+ LOGICAL_PAGE_NUMBER_LO32, &vm0->pte_end.low_part); -+ -+ REG_GET(VM_L2_PROTECTION_FAULT_DEFAULT_ADDR_HI32, -+ PHYSICAL_PAGE_ADDR_HI4, &vm0->fault_default.high_part); -+ REG_GET(VM_L2_PROTECTION_FAULT_DEFAULT_ADDR_LO32, -+ PHYSICAL_PAGE_ADDR_LO32, &vm0->fault_default.low_part); -+ -+ /* -+ * The values in VM_CONTEXT0_PAGE_TABLE_BASE_ADDR is in UMA space. -+ * Therefore we need to do -+ * DCN_VM_CONTEXT0_PAGE_TABLE_BASE_ADDR = VM_CONTEXT0_PAGE_TABLE_BASE_ADDR -+ * - DCHUBBUB_SDPIF_FB_OFFSET + DCHUBBUB_SDPIF_FB_BASE -+ */ -+ fb_base.quad_part = (uint64_t)fb_base_value << 24; -+ fb_offset.quad_part = (uint64_t)fb_offset_value << 24; -+ vm0->pte_base.quad_part += fb_base.quad_part; -+ vm0->pte_base.quad_part -= fb_offset.quad_part; -+} -+ -+static void set_vm_context0_settings(struct dcn10_mem_input *mi, -+ const struct vm_context0_param *vm0) -+{ -+ /* pte base */ -+ REG_SET(DCN_VM_CONTEXT0_PAGE_TABLE_BASE_ADDR_MSB, 0, -+ VM_CONTEXT0_PAGE_TABLE_BASE_ADDR_MSB, vm0->pte_base.high_part); -+ REG_SET(DCN_VM_CONTEXT0_PAGE_TABLE_BASE_ADDR_LSB, 0, -+ VM_CONTEXT0_PAGE_TABLE_BASE_ADDR_LSB, vm0->pte_base.low_part); -+ -+ /* pte start */ -+ REG_SET(DCN_VM_CONTEXT0_PAGE_TABLE_START_ADDR_MSB, 0, -+ VM_CONTEXT0_PAGE_TABLE_START_ADDR_MSB, vm0->pte_start.high_part); -+ REG_SET(DCN_VM_CONTEXT0_PAGE_TABLE_START_ADDR_LSB, 0, -+ VM_CONTEXT0_PAGE_TABLE_START_ADDR_LSB, vm0->pte_start.low_part); -+ -+ /* pte end */ -+ REG_SET(DCN_VM_CONTEXT0_PAGE_TABLE_END_ADDR_MSB, 0, -+ VM_CONTEXT0_PAGE_TABLE_END_ADDR_MSB, vm0->pte_end.high_part); -+ REG_SET(DCN_VM_CONTEXT0_PAGE_TABLE_END_ADDR_LSB, 0, -+ VM_CONTEXT0_PAGE_TABLE_END_ADDR_LSB, vm0->pte_end.low_part); -+ -+ /* fault handling */ -+ REG_SET(DCN_VM_CONTEXT0_PROTECTION_FAULT_DEFAULT_ADDR_MSB, 0, -+ VM_CONTEXT0_PAGE_TABLE_END_ADDR_MSB, vm0->fault_default.high_part); -+ /* VM_CONTEXT0_PROTECTION_FAULT_DEFAULT_SYSTEM, 0 */ -+ REG_SET(DCN_VM_CONTEXT0_PROTECTION_FAULT_DEFAULT_ADDR_LSB, 0, -+ VM_CONTEXT0_PROTECTION_FAULT_DEFAULT_ADDR_LSB, vm0->fault_default.low_part); -+} -+ -+void dcn_mem_input_program_pte_vm(struct mem_input *mem_input, -+ enum surface_pixel_format format, -+ union dc_tiling_info *tiling_info, -+ enum dc_rotation_angle rotation) -+{ -+ struct dcn10_mem_input *mi = TO_DCN10_MEM_INPUT(mem_input); -+ struct vm_system_aperture_param apt = { {{ 0 } } }; -+ struct vm_context0_param vm0 = { { { 0 } } }; -+ -+ -+ read_vm_system_aperture_settings(mi, &apt); -+ read_vm_context0_settings(mi, &vm0); -+ -+ set_vm_system_aperture_settings(mi, &apt); -+ set_vm_context0_settings(mi, &vm0); -+ -+ /* control: enable VM PTE*/ -+ REG_SET_2(DCN_VM_MX_L1_TLB_CNTL, 0, -+ ENABLE_L1_TLB, 1, -+ SYSTEM_ACCESS_MODE, 3); -+} -+ -+static struct mem_input_funcs dcn10_mem_input_funcs = { -+ .mem_input_program_display_marks = mem_input_program_display_marks, -+ .allocate_mem_input = NULL, -+ .free_mem_input = NULL, -+ .disable_request = disable_request, -+ .mem_input_program_surface_flip_and_addr = -+ mem_input_program_surface_flip_and_addr, -+ .mem_input_program_surface_config = -+ mem_input_program_surface_config, -+ .mem_input_is_flip_pending = mem_input_is_flip_pending, -+ .mem_input_setup = mem_input_setup, -+ .program_watermarks = program_watermarks, -+ .mem_input_update_dchub = mem_input_update_dchub, -+ .mem_input_program_pte_vm = dcn_mem_input_program_pte_vm, -+}; -+ -+ -+/*****************************************/ -+/* Constructor, Destructor */ -+/*****************************************/ -+ -+bool dcn10_mem_input_construct( -+ struct dcn10_mem_input *mi, -+ struct dc_context *ctx, -+ uint32_t inst, -+ const struct dcn_mi_registers *mi_regs, -+ const struct dcn_mi_shift *mi_shift, -+ const struct dcn_mi_mask *mi_mask) -+{ -+ mi->base.funcs = &dcn10_mem_input_funcs; -+ mi->base.ctx = ctx; -+ mi->mi_regs = mi_regs; -+ mi->mi_shift = mi_shift; -+ mi->mi_mask = mi_mask; -+ mi->base.inst = inst; -+ -+ return true; -+} -+ -diff --git a/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_mem_input.h b/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_mem_input.h -new file mode 100644 -index 0000000..4a5eb6a ---- /dev/null -+++ b/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_mem_input.h -@@ -0,0 +1,553 @@ -+/* 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_MEM_INPUT_DCN10_H__ -+#define __DC_MEM_INPUT_DCN10_H__ -+ -+#include "mem_input.h" -+ -+#define TO_DCN10_MEM_INPUT(mi)\ -+ container_of(mi, struct dcn10_mem_input, base) -+ -+ -+#define MI_DCN10_REG_LIST(id)\ -+ SRI(DCHUBP_CNTL, HUBP, id),\ -+ SRI(HUBPREQ_DEBUG_DB, HUBP, id),\ -+ SRI(DCSURF_ADDR_CONFIG, HUBP, id),\ -+ SRI(DCSURF_TILING_CONFIG, HUBP, id),\ -+ SRI(DCSURF_SURFACE_PITCH, HUBPREQ, id),\ -+ SRI(DCSURF_SURFACE_PITCH_C, HUBPREQ, id),\ -+ SRI(DCSURF_SURFACE_CONFIG, HUBP, id),\ -+ SRI(DCSURF_FLIP_CONTROL, HUBPREQ, id),\ -+ SRI(DCSURF_PRIMARY_SURFACE_ADDRESS_HIGH, HUBPREQ, id),\ -+ SRI(DCSURF_PRIMARY_SURFACE_ADDRESS, HUBPREQ, id),\ -+ SRI(DCSURF_SECONDARY_SURFACE_ADDRESS_HIGH, HUBPREQ, id),\ -+ SRI(DCSURF_SECONDARY_SURFACE_ADDRESS, HUBPREQ, id),\ -+ SRI(DCSURF_PRIMARY_META_SURFACE_ADDRESS_HIGH, HUBPREQ, id),\ -+ SRI(DCSURF_PRIMARY_META_SURFACE_ADDRESS, HUBPREQ, id),\ -+ SRI(DCSURF_SECONDARY_META_SURFACE_ADDRESS_HIGH, HUBPREQ, id),\ -+ SRI(DCSURF_SECONDARY_META_SURFACE_ADDRESS, HUBPREQ, id),\ -+ SRI(DCSURF_PRIMARY_SURFACE_ADDRESS_HIGH_C, HUBPREQ, id),\ -+ SRI(DCSURF_PRIMARY_SURFACE_ADDRESS_C, HUBPREQ, id),\ -+ SRI(DCSURF_PRIMARY_META_SURFACE_ADDRESS_HIGH_C, HUBPREQ, id),\ -+ SRI(DCSURF_PRIMARY_META_SURFACE_ADDRESS_C, HUBPREQ, id),\ -+ SRI(DCSURF_SURFACE_CONTROL, HUBPREQ, id),\ -+ SRI(HUBPRET_CONTROL, HUBPRET, id),\ -+ SRI(DCN_EXPANSION_MODE, HUBPREQ, id),\ -+ SRI(DCHUBP_REQ_SIZE_CONFIG, HUBP, id),\ -+ SRI(DCHUBP_REQ_SIZE_CONFIG_C, HUBP, id),\ -+ SRI(BLANK_OFFSET_0, HUBPREQ, id),\ -+ SRI(BLANK_OFFSET_1, HUBPREQ, id),\ -+ SRI(DST_DIMENSIONS, HUBPREQ, id),\ -+ SRI(DST_AFTER_SCALER, HUBPREQ, id),\ -+ SRI(PREFETCH_SETTINS, HUBPREQ, id),\ -+ SRI(VBLANK_PARAMETERS_0, HUBPREQ, id),\ -+ SRI(REF_FREQ_TO_PIX_FREQ, HUBPREQ, id),\ -+ SRI(VBLANK_PARAMETERS_1, HUBPREQ, id),\ -+ SRI(VBLANK_PARAMETERS_3, HUBPREQ, id),\ -+ SRI(NOM_PARAMETERS_0, HUBPREQ, id),\ -+ SRI(NOM_PARAMETERS_1, HUBPREQ, id),\ -+ SRI(NOM_PARAMETERS_4, HUBPREQ, id),\ -+ SRI(NOM_PARAMETERS_5, HUBPREQ, id),\ -+ SRI(PER_LINE_DELIVERY_PRE, HUBPREQ, id),\ -+ SRI(PER_LINE_DELIVERY, HUBPREQ, id),\ -+ SRI(PREFETCH_SETTINS_C, HUBPREQ, id),\ -+ SRI(VBLANK_PARAMETERS_2, HUBPREQ, id),\ -+ SRI(VBLANK_PARAMETERS_4, HUBPREQ, id),\ -+ SRI(NOM_PARAMETERS_2, HUBPREQ, id),\ -+ SRI(NOM_PARAMETERS_3, HUBPREQ, id),\ -+ SRI(NOM_PARAMETERS_6, HUBPREQ, id),\ -+ SRI(NOM_PARAMETERS_7, HUBPREQ, id),\ -+ SRI(DCN_TTU_QOS_WM, HUBPREQ, id),\ -+ SRI(DCN_GLOBAL_TTU_CNTL, HUBPREQ, id),\ -+ SRI(DCN_SURF0_TTU_CNTL0, HUBPREQ, id),\ -+ SRI(DCN_SURF0_TTU_CNTL1, HUBPREQ, id),\ -+ SRI(DCN_SURF1_TTU_CNTL0, HUBPREQ, id),\ -+ SRI(DCN_SURF1_TTU_CNTL1, HUBPREQ, id),\ -+ SRI(DCN_VM_CONTEXT0_PAGE_TABLE_BASE_ADDR_MSB, HUBPREQ, id),\ -+ SRI(DCN_VM_CONTEXT0_PAGE_TABLE_BASE_ADDR_LSB, HUBPREQ, id),\ -+ SRI(DCN_VM_CONTEXT0_PAGE_TABLE_START_ADDR_MSB, HUBPREQ, id),\ -+ SRI(DCN_VM_CONTEXT0_PAGE_TABLE_START_ADDR_LSB, HUBPREQ, id),\ -+ SRI(DCN_VM_CONTEXT0_PAGE_TABLE_END_ADDR_MSB, HUBPREQ, id),\ -+ SRI(DCN_VM_CONTEXT0_PAGE_TABLE_END_ADDR_LSB, HUBPREQ, id),\ -+ SRI(DCN_VM_CONTEXT0_PROTECTION_FAULT_DEFAULT_ADDR_MSB, HUBPREQ, id),\ -+ SRI(DCN_VM_CONTEXT0_PROTECTION_FAULT_DEFAULT_ADDR_LSB, HUBPREQ, id),\ -+ SRI(DCN_VM_MX_L1_TLB_CNTL, HUBPREQ, id),\ -+ SRI(DCN_VM_SYSTEM_APERTURE_DEFAULT_ADDR_MSB, HUBPREQ, id),\ -+ SRI(DCN_VM_SYSTEM_APERTURE_DEFAULT_ADDR_LSB, HUBPREQ, id),\ -+ SRI(DCN_VM_SYSTEM_APERTURE_LOW_ADDR_MSB, HUBPREQ, id),\ -+ SRI(DCN_VM_SYSTEM_APERTURE_LOW_ADDR_LSB, HUBPREQ, id),\ -+ SRI(DCN_VM_SYSTEM_APERTURE_HIGH_ADDR_MSB, HUBPREQ, id),\ -+ SRI(DCN_VM_SYSTEM_APERTURE_HIGH_ADDR_LSB, HUBPREQ, id),\ -+ SR(DCHUBBUB_SDPIF_FB_TOP),\ -+ SR(DCHUBBUB_SDPIF_FB_BASE),\ -+ SR(DCHUBBUB_SDPIF_FB_OFFSET),\ -+ SR(DCHUBBUB_SDPIF_AGP_BASE),\ -+ SR(DCHUBBUB_SDPIF_AGP_BOT),\ -+ SR(DCHUBBUB_SDPIF_AGP_TOP),\ -+ SR(DCHUBBUB_ARB_DATA_URGENCY_WATERMARK_A),\ -+ SR(DCHUBBUB_ARB_PTE_META_URGENCY_WATERMARK_A),\ -+ SR(DCHUBBUB_ARB_ALLOW_SR_ENTER_WATERMARK_A),\ -+ SR(DCHUBBUB_ARB_ALLOW_SR_EXIT_WATERMARK_A),\ -+ SR(DCHUBBUB_ARB_ALLOW_DRAM_CLK_CHANGE_WATERMARK_A),\ -+ SR(DCHUBBUB_ARB_DATA_URGENCY_WATERMARK_B),\ -+ SR(DCHUBBUB_ARB_PTE_META_URGENCY_WATERMARK_B),\ -+ SR(DCHUBBUB_ARB_ALLOW_SR_ENTER_WATERMARK_B),\ -+ SR(DCHUBBUB_ARB_ALLOW_SR_EXIT_WATERMARK_B),\ -+ SR(DCHUBBUB_ARB_ALLOW_DRAM_CLK_CHANGE_WATERMARK_B),\ -+ SR(DCHUBBUB_ARB_DATA_URGENCY_WATERMARK_C),\ -+ SR(DCHUBBUB_ARB_PTE_META_URGENCY_WATERMARK_C),\ -+ SR(DCHUBBUB_ARB_ALLOW_SR_ENTER_WATERMARK_C),\ -+ SR(DCHUBBUB_ARB_ALLOW_SR_EXIT_WATERMARK_C),\ -+ SR(DCHUBBUB_ARB_ALLOW_DRAM_CLK_CHANGE_WATERMARK_C),\ -+ SR(DCHUBBUB_ARB_DATA_URGENCY_WATERMARK_D),\ -+ SR(DCHUBBUB_ARB_PTE_META_URGENCY_WATERMARK_D),\ -+ SR(DCHUBBUB_ARB_ALLOW_SR_ENTER_WATERMARK_D),\ -+ SR(DCHUBBUB_ARB_ALLOW_SR_EXIT_WATERMARK_D),\ -+ SR(DCHUBBUB_ARB_ALLOW_DRAM_CLK_CHANGE_WATERMARK_D),\ -+ SR(DCHUBBUB_ARB_WATERMARK_CHANGE_CNTL),\ -+ SR(DCHUBBUB_ARB_SAT_LEVEL),\ -+ SR(DCHUBBUB_ARB_DF_REQ_OUTSTAND),\ -+ /* todo: get these from GVM instead of reading registers ourselves */\ -+ GC_SR(VM_CONTEXT0_PAGE_TABLE_BASE_ADDR_HI32),\ -+ GC_SR(VM_CONTEXT0_PAGE_TABLE_BASE_ADDR_LO32),\ -+ GC_SR(VM_CONTEXT0_PAGE_TABLE_START_ADDR_HI32),\ -+ GC_SR(VM_CONTEXT0_PAGE_TABLE_START_ADDR_LO32),\ -+ GC_SR(VM_CONTEXT0_PAGE_TABLE_END_ADDR_HI32),\ -+ GC_SR(VM_CONTEXT0_PAGE_TABLE_END_ADDR_LO32),\ -+ GC_SR(VM_L2_PROTECTION_FAULT_DEFAULT_ADDR_HI32),\ -+ GC_SR(VM_L2_PROTECTION_FAULT_DEFAULT_ADDR_LO32),\ -+ GC_SR(MC_VM_SYSTEM_APERTURE_DEFAULT_ADDR_MSB),\ -+ GC_SR(MC_VM_SYSTEM_APERTURE_DEFAULT_ADDR_LSB),\ -+ GC_SR(MC_VM_SYSTEM_APERTURE_LOW_ADDR),\ -+ GC_SR(MC_VM_SYSTEM_APERTURE_HIGH_ADDR) -+ -+struct dcn_mi_registers { -+ uint32_t DCHUBP_CNTL; -+ uint32_t HUBPREQ_DEBUG_DB; -+ uint32_t DCSURF_ADDR_CONFIG; -+ uint32_t DCSURF_TILING_CONFIG; -+ uint32_t DCSURF_SURFACE_PITCH; -+ uint32_t DCSURF_SURFACE_PITCH_C; -+ uint32_t DCSURF_SURFACE_CONFIG; -+ uint32_t DCSURF_FLIP_CONTROL; -+ uint32_t DCSURF_PRIMARY_SURFACE_ADDRESS_HIGH; -+ uint32_t DCSURF_PRIMARY_SURFACE_ADDRESS; -+ uint32_t DCSURF_SECONDARY_SURFACE_ADDRESS_HIGH; -+ uint32_t DCSURF_SECONDARY_SURFACE_ADDRESS; -+ uint32_t DCSURF_PRIMARY_META_SURFACE_ADDRESS_HIGH; -+ uint32_t DCSURF_PRIMARY_META_SURFACE_ADDRESS; -+ uint32_t DCSURF_SECONDARY_META_SURFACE_ADDRESS_HIGH; -+ uint32_t DCSURF_SECONDARY_META_SURFACE_ADDRESS; -+ uint32_t DCSURF_PRIMARY_SURFACE_ADDRESS_HIGH_C; -+ uint32_t DCSURF_PRIMARY_SURFACE_ADDRESS_C; -+ uint32_t DCSURF_PRIMARY_META_SURFACE_ADDRESS_HIGH_C; -+ uint32_t DCSURF_PRIMARY_META_SURFACE_ADDRESS_C; -+ uint32_t DCSURF_SURFACE_CONTROL; -+ uint32_t HUBPRET_CONTROL; -+ uint32_t DCN_EXPANSION_MODE; -+ uint32_t DCHUBP_REQ_SIZE_CONFIG; -+ uint32_t DCHUBP_REQ_SIZE_CONFIG_C; -+ uint32_t BLANK_OFFSET_0; -+ uint32_t BLANK_OFFSET_1; -+ uint32_t DST_DIMENSIONS; -+ uint32_t DST_AFTER_SCALER; -+ uint32_t PREFETCH_SETTINS; -+ uint32_t VBLANK_PARAMETERS_0; -+ uint32_t REF_FREQ_TO_PIX_FREQ; -+ uint32_t VBLANK_PARAMETERS_1; -+ uint32_t VBLANK_PARAMETERS_3; -+ uint32_t NOM_PARAMETERS_0; -+ uint32_t NOM_PARAMETERS_1; -+ uint32_t NOM_PARAMETERS_4; -+ uint32_t NOM_PARAMETERS_5; -+ uint32_t PER_LINE_DELIVERY_PRE; -+ uint32_t PER_LINE_DELIVERY; -+ uint32_t PREFETCH_SETTINS_C; -+ uint32_t VBLANK_PARAMETERS_2; -+ uint32_t VBLANK_PARAMETERS_4; -+ uint32_t NOM_PARAMETERS_2; -+ uint32_t NOM_PARAMETERS_3; -+ uint32_t NOM_PARAMETERS_6; -+ uint32_t NOM_PARAMETERS_7; -+ uint32_t DCN_TTU_QOS_WM; -+ uint32_t DCN_GLOBAL_TTU_CNTL; -+ uint32_t DCN_SURF0_TTU_CNTL0; -+ uint32_t DCN_SURF0_TTU_CNTL1; -+ uint32_t DCN_SURF1_TTU_CNTL0; -+ uint32_t DCN_SURF1_TTU_CNTL1; -+ uint32_t DCN_VM_CONTEXT0_PAGE_TABLE_BASE_ADDR_MSB; -+ uint32_t DCN_VM_CONTEXT0_PAGE_TABLE_BASE_ADDR_LSB; -+ uint32_t DCN_VM_CONTEXT0_PAGE_TABLE_START_ADDR_MSB; -+ uint32_t DCN_VM_CONTEXT0_PAGE_TABLE_START_ADDR_LSB; -+ uint32_t DCN_VM_CONTEXT0_PAGE_TABLE_END_ADDR_MSB; -+ uint32_t DCN_VM_CONTEXT0_PAGE_TABLE_END_ADDR_LSB; -+ uint32_t DCN_VM_CONTEXT0_PROTECTION_FAULT_DEFAULT_ADDR_MSB; -+ uint32_t DCN_VM_CONTEXT0_PROTECTION_FAULT_DEFAULT_ADDR_LSB; -+ uint32_t DCN_VM_MX_L1_TLB_CNTL; -+ uint32_t DCN_VM_SYSTEM_APERTURE_DEFAULT_ADDR_MSB; -+ uint32_t DCN_VM_SYSTEM_APERTURE_DEFAULT_ADDR_LSB; -+ uint32_t DCN_VM_SYSTEM_APERTURE_LOW_ADDR_MSB; -+ uint32_t DCN_VM_SYSTEM_APERTURE_LOW_ADDR_LSB; -+ uint32_t DCN_VM_SYSTEM_APERTURE_HIGH_ADDR_MSB; -+ uint32_t DCN_VM_SYSTEM_APERTURE_HIGH_ADDR_LSB; -+ uint32_t DCHUBBUB_SDPIF_FB_TOP; -+ uint32_t DCHUBBUB_SDPIF_FB_BASE; -+ uint32_t DCHUBBUB_SDPIF_FB_OFFSET; -+ uint32_t DCHUBBUB_SDPIF_AGP_BASE; -+ uint32_t DCHUBBUB_SDPIF_AGP_BOT; -+ uint32_t DCHUBBUB_SDPIF_AGP_TOP; -+ uint32_t DCHUBBUB_ARB_DATA_URGENCY_WATERMARK_A; -+ uint32_t DCHUBBUB_ARB_PTE_META_URGENCY_WATERMARK_A; -+ uint32_t DCHUBBUB_ARB_ALLOW_SR_ENTER_WATERMARK_A; -+ uint32_t DCHUBBUB_ARB_ALLOW_SR_EXIT_WATERMARK_A; -+ uint32_t DCHUBBUB_ARB_ALLOW_DRAM_CLK_CHANGE_WATERMARK_A; -+ uint32_t DCHUBBUB_ARB_DATA_URGENCY_WATERMARK_B; -+ uint32_t DCHUBBUB_ARB_PTE_META_URGENCY_WATERMARK_B; -+ uint32_t DCHUBBUB_ARB_ALLOW_SR_ENTER_WATERMARK_B; -+ uint32_t DCHUBBUB_ARB_ALLOW_SR_EXIT_WATERMARK_B; -+ uint32_t DCHUBBUB_ARB_ALLOW_DRAM_CLK_CHANGE_WATERMARK_B; -+ uint32_t DCHUBBUB_ARB_DATA_URGENCY_WATERMARK_C; -+ uint32_t DCHUBBUB_ARB_PTE_META_URGENCY_WATERMARK_C; -+ uint32_t DCHUBBUB_ARB_ALLOW_SR_ENTER_WATERMARK_C; -+ uint32_t DCHUBBUB_ARB_ALLOW_SR_EXIT_WATERMARK_C; -+ uint32_t DCHUBBUB_ARB_ALLOW_DRAM_CLK_CHANGE_WATERMARK_C; -+ uint32_t DCHUBBUB_ARB_DATA_URGENCY_WATERMARK_D; -+ uint32_t DCHUBBUB_ARB_PTE_META_URGENCY_WATERMARK_D; -+ uint32_t DCHUBBUB_ARB_ALLOW_SR_ENTER_WATERMARK_D; -+ uint32_t DCHUBBUB_ARB_ALLOW_SR_EXIT_WATERMARK_D; -+ uint32_t DCHUBBUB_ARB_ALLOW_DRAM_CLK_CHANGE_WATERMARK_D; -+ uint32_t DCHUBBUB_ARB_WATERMARK_CHANGE_CNTL; -+ uint32_t DCHUBBUB_ARB_SAT_LEVEL; -+ uint32_t DCHUBBUB_ARB_DF_REQ_OUTSTAND; -+ -+ /* GC registers. read only. temporary hack */ -+ uint32_t VM_CONTEXT0_PAGE_TABLE_BASE_ADDR_HI32; -+ uint32_t VM_CONTEXT0_PAGE_TABLE_BASE_ADDR_LO32; -+ uint32_t VM_CONTEXT0_PAGE_TABLE_START_ADDR_HI32; -+ uint32_t VM_CONTEXT0_PAGE_TABLE_START_ADDR_LO32; -+ uint32_t VM_CONTEXT0_PAGE_TABLE_END_ADDR_HI32; -+ uint32_t VM_CONTEXT0_PAGE_TABLE_END_ADDR_LO32; -+ uint32_t VM_L2_PROTECTION_FAULT_DEFAULT_ADDR_HI32; -+ uint32_t VM_L2_PROTECTION_FAULT_DEFAULT_ADDR_LO32; -+ uint32_t MC_VM_SYSTEM_APERTURE_DEFAULT_ADDR_MSB; -+ uint32_t MC_VM_SYSTEM_APERTURE_DEFAULT_ADDR_LSB; -+ uint32_t MC_VM_SYSTEM_APERTURE_LOW_ADDR; -+ uint32_t MC_VM_SYSTEM_APERTURE_HIGH_ADDR; -+}; -+ -+#define MI_SF(reg_name, field_name, post_fix)\ -+ .field_name = reg_name ## __ ## field_name ## post_fix -+ -+#define MI_DCN10_MASK_SH_LIST(mask_sh)\ -+ MI_SF(HUBP0_DCHUBP_CNTL, HUBP_BLANK_EN, mask_sh),\ -+ MI_SF(HUBP0_DCHUBP_CNTL, HUBP_TTU_DISABLE, mask_sh),\ -+ MI_SF(HUBP0_DCSURF_ADDR_CONFIG, NUM_PIPES, mask_sh),\ -+ MI_SF(HUBP0_DCSURF_ADDR_CONFIG, NUM_BANKS, mask_sh),\ -+ MI_SF(HUBP0_DCSURF_ADDR_CONFIG, PIPE_INTERLEAVE, mask_sh),\ -+ MI_SF(HUBP0_DCSURF_ADDR_CONFIG, NUM_SE, mask_sh),\ -+ MI_SF(HUBP0_DCSURF_ADDR_CONFIG, NUM_RB_PER_SE, mask_sh),\ -+ MI_SF(HUBP0_DCSURF_ADDR_CONFIG, MAX_COMPRESSED_FRAGS, mask_sh),\ -+ MI_SF(HUBP0_DCSURF_TILING_CONFIG, SW_MODE, mask_sh),\ -+ MI_SF(HUBP0_DCSURF_TILING_CONFIG, META_LINEAR, mask_sh),\ -+ MI_SF(HUBP0_DCSURF_TILING_CONFIG, RB_ALIGNED, mask_sh),\ -+ MI_SF(HUBP0_DCSURF_TILING_CONFIG, PIPE_ALIGNED, mask_sh),\ -+ MI_SF(HUBPREQ0_DCSURF_SURFACE_PITCH, PITCH, mask_sh),\ -+ MI_SF(HUBPREQ0_DCSURF_SURFACE_PITCH, META_PITCH, mask_sh),\ -+ MI_SF(HUBPREQ0_DCSURF_SURFACE_PITCH_C, PITCH_C, mask_sh),\ -+ MI_SF(HUBPREQ0_DCSURF_SURFACE_PITCH_C, META_PITCH_C, mask_sh),\ -+ MI_SF(HUBP0_DCSURF_SURFACE_CONFIG, ROTATION_ANGLE, mask_sh),\ -+ MI_SF(HUBP0_DCSURF_SURFACE_CONFIG, H_MIRROR_EN, mask_sh),\ -+ MI_SF(HUBP0_DCSURF_SURFACE_CONFIG, SURFACE_PIXEL_FORMAT, mask_sh),\ -+ MI_SF(HUBPREQ0_DCSURF_FLIP_CONTROL, SURFACE_FLIP_TYPE, mask_sh),\ -+ MI_SF(HUBPREQ0_DCSURF_FLIP_CONTROL, SURFACE_UPDATE_PENDING, mask_sh),\ -+ MI_SF(HUBPREQ0_DCSURF_PRIMARY_SURFACE_ADDRESS_HIGH, PRIMARY_SURFACE_ADDRESS_HIGH, mask_sh),\ -+ MI_SF(HUBPREQ0_DCSURF_PRIMARY_SURFACE_ADDRESS, PRIMARY_SURFACE_ADDRESS, mask_sh),\ -+ MI_SF(HUBPREQ0_DCSURF_SECONDARY_SURFACE_ADDRESS_HIGH, SECONDARY_SURFACE_ADDRESS_HIGH, mask_sh),\ -+ MI_SF(HUBPREQ0_DCSURF_SECONDARY_SURFACE_ADDRESS, SECONDARY_SURFACE_ADDRESS, mask_sh),\ -+ MI_SF(HUBPREQ0_DCSURF_PRIMARY_META_SURFACE_ADDRESS_HIGH, PRIMARY_META_SURFACE_ADDRESS_HIGH, mask_sh),\ -+ MI_SF(HUBPREQ0_DCSURF_PRIMARY_META_SURFACE_ADDRESS, PRIMARY_META_SURFACE_ADDRESS, mask_sh),\ -+ MI_SF(HUBPREQ0_DCSURF_SECONDARY_META_SURFACE_ADDRESS_HIGH, SECONDARY_META_SURFACE_ADDRESS_HIGH, mask_sh),\ -+ MI_SF(HUBPREQ0_DCSURF_SECONDARY_META_SURFACE_ADDRESS, SECONDARY_META_SURFACE_ADDRESS, mask_sh),\ -+ MI_SF(HUBPREQ0_DCSURF_PRIMARY_SURFACE_ADDRESS_HIGH_C, PRIMARY_SURFACE_ADDRESS_HIGH_C, mask_sh),\ -+ MI_SF(HUBPREQ0_DCSURF_PRIMARY_SURFACE_ADDRESS_C, PRIMARY_SURFACE_ADDRESS_C, mask_sh),\ -+ MI_SF(HUBPREQ0_DCSURF_PRIMARY_META_SURFACE_ADDRESS_HIGH_C, PRIMARY_META_SURFACE_ADDRESS_HIGH_C, mask_sh),\ -+ MI_SF(HUBPREQ0_DCSURF_PRIMARY_META_SURFACE_ADDRESS_C, PRIMARY_META_SURFACE_ADDRESS_C, mask_sh),\ -+ MI_SF(HUBPREQ0_DCSURF_SURFACE_CONTROL, PRIMARY_SURFACE_DCC_EN, mask_sh),\ -+ MI_SF(HUBPREQ0_DCSURF_SURFACE_CONTROL, PRIMARY_SURFACE_DCC_IND_64B_BLK, mask_sh),\ -+ MI_SF(HUBPRET0_HUBPRET_CONTROL, DET_BUF_PLANE1_BASE_ADDRESS, mask_sh),\ -+ MI_SF(HUBPRET0_HUBPRET_CONTROL, CROSSBAR_SRC_CB_B, mask_sh),\ -+ MI_SF(HUBPRET0_HUBPRET_CONTROL, CROSSBAR_SRC_CR_R, mask_sh),\ -+ MI_SF(HUBPREQ0_DCN_EXPANSION_MODE, DRQ_EXPANSION_MODE, mask_sh),\ -+ MI_SF(HUBPREQ0_DCN_EXPANSION_MODE, PRQ_EXPANSION_MODE, mask_sh),\ -+ MI_SF(HUBPREQ0_DCN_EXPANSION_MODE, MRQ_EXPANSION_MODE, mask_sh),\ -+ MI_SF(HUBPREQ0_DCN_EXPANSION_MODE, CRQ_EXPANSION_MODE, mask_sh),\ -+ MI_SF(HUBP0_DCHUBP_REQ_SIZE_CONFIG, CHUNK_SIZE, mask_sh),\ -+ MI_SF(HUBP0_DCHUBP_REQ_SIZE_CONFIG, MIN_CHUNK_SIZE, mask_sh),\ -+ MI_SF(HUBP0_DCHUBP_REQ_SIZE_CONFIG, META_CHUNK_SIZE, mask_sh),\ -+ MI_SF(HUBP0_DCHUBP_REQ_SIZE_CONFIG, MIN_META_CHUNK_SIZE, mask_sh),\ -+ MI_SF(HUBP0_DCHUBP_REQ_SIZE_CONFIG, DPTE_GROUP_SIZE, mask_sh),\ -+ MI_SF(HUBP0_DCHUBP_REQ_SIZE_CONFIG, MPTE_GROUP_SIZE, mask_sh),\ -+ MI_SF(HUBP0_DCHUBP_REQ_SIZE_CONFIG, SWATH_HEIGHT, mask_sh),\ -+ MI_SF(HUBP0_DCHUBP_REQ_SIZE_CONFIG, PTE_ROW_HEIGHT_LINEAR, mask_sh),\ -+ MI_SF(HUBP0_DCHUBP_REQ_SIZE_CONFIG_C, CHUNK_SIZE_C, mask_sh),\ -+ MI_SF(HUBP0_DCHUBP_REQ_SIZE_CONFIG_C, MIN_CHUNK_SIZE_C, mask_sh),\ -+ MI_SF(HUBP0_DCHUBP_REQ_SIZE_CONFIG_C, META_CHUNK_SIZE_C, mask_sh),\ -+ MI_SF(HUBP0_DCHUBP_REQ_SIZE_CONFIG_C, MIN_META_CHUNK_SIZE_C, mask_sh),\ -+ MI_SF(HUBP0_DCHUBP_REQ_SIZE_CONFIG_C, DPTE_GROUP_SIZE_C, mask_sh),\ -+ MI_SF(HUBP0_DCHUBP_REQ_SIZE_CONFIG_C, MPTE_GROUP_SIZE_C, mask_sh),\ -+ MI_SF(HUBP0_DCHUBP_REQ_SIZE_CONFIG_C, SWATH_HEIGHT_C, mask_sh),\ -+ MI_SF(HUBP0_DCHUBP_REQ_SIZE_CONFIG_C, PTE_ROW_HEIGHT_LINEAR_C, mask_sh),\ -+ MI_SF(HUBPREQ0_BLANK_OFFSET_0, REFCYC_H_BLANK_END, mask_sh),\ -+ MI_SF(HUBPREQ0_BLANK_OFFSET_0, DLG_V_BLANK_END, mask_sh),\ -+ MI_SF(HUBPREQ0_BLANK_OFFSET_1, MIN_DST_Y_NEXT_START, mask_sh),\ -+ MI_SF(HUBPREQ0_DST_DIMENSIONS, REFCYC_PER_HTOTAL, mask_sh),\ -+ MI_SF(HUBPREQ0_DST_AFTER_SCALER, REFCYC_X_AFTER_SCALER, mask_sh),\ -+ MI_SF(HUBPREQ0_DST_AFTER_SCALER, DST_Y_AFTER_SCALER, mask_sh),\ -+ MI_SF(HUBPREQ0_PREFETCH_SETTINS, DST_Y_PREFETCH, mask_sh),\ -+ MI_SF(HUBPREQ0_PREFETCH_SETTINS, VRATIO_PREFETCH, mask_sh),\ -+ MI_SF(HUBPREQ0_VBLANK_PARAMETERS_0, DST_Y_PER_VM_VBLANK, mask_sh),\ -+ MI_SF(HUBPREQ0_VBLANK_PARAMETERS_0, DST_Y_PER_ROW_VBLANK, mask_sh),\ -+ MI_SF(HUBPREQ0_REF_FREQ_TO_PIX_FREQ, REF_FREQ_TO_PIX_FREQ, mask_sh),\ -+ MI_SF(HUBPREQ0_VBLANK_PARAMETERS_1, REFCYC_PER_PTE_GROUP_VBLANK_L, mask_sh),\ -+ MI_SF(HUBPREQ0_VBLANK_PARAMETERS_3, REFCYC_PER_META_CHUNK_VBLANK_L, mask_sh),\ -+ MI_SF(HUBPREQ0_NOM_PARAMETERS_0, DST_Y_PER_PTE_ROW_NOM_L, mask_sh),\ -+ MI_SF(HUBPREQ0_NOM_PARAMETERS_1, REFCYC_PER_PTE_GROUP_NOM_L, mask_sh),\ -+ MI_SF(HUBPREQ0_NOM_PARAMETERS_4, DST_Y_PER_META_ROW_NOM_L, mask_sh),\ -+ MI_SF(HUBPREQ0_NOM_PARAMETERS_5, REFCYC_PER_META_CHUNK_NOM_L, mask_sh),\ -+ MI_SF(HUBPREQ0_PER_LINE_DELIVERY_PRE, REFCYC_PER_LINE_DELIVERY_PRE_L, mask_sh),\ -+ MI_SF(HUBPREQ0_PER_LINE_DELIVERY_PRE, REFCYC_PER_LINE_DELIVERY_PRE_C, mask_sh),\ -+ MI_SF(HUBPREQ0_PER_LINE_DELIVERY, REFCYC_PER_LINE_DELIVERY_L, mask_sh),\ -+ MI_SF(HUBPREQ0_PER_LINE_DELIVERY, REFCYC_PER_LINE_DELIVERY_C, mask_sh),\ -+ MI_SF(HUBPREQ0_PREFETCH_SETTINS_C, VRATIO_PREFETCH_C, mask_sh),\ -+ MI_SF(HUBPREQ0_VBLANK_PARAMETERS_2, REFCYC_PER_PTE_GROUP_VBLANK_C, mask_sh),\ -+ MI_SF(HUBPREQ0_VBLANK_PARAMETERS_4, REFCYC_PER_META_CHUNK_VBLANK_C, mask_sh),\ -+ MI_SF(HUBPREQ0_NOM_PARAMETERS_2, DST_Y_PER_PTE_ROW_NOM_C, mask_sh),\ -+ MI_SF(HUBPREQ0_NOM_PARAMETERS_3, REFCYC_PER_PTE_GROUP_NOM_C, mask_sh),\ -+ MI_SF(HUBPREQ0_NOM_PARAMETERS_6, DST_Y_PER_META_ROW_NOM_C, mask_sh),\ -+ MI_SF(HUBPREQ0_NOM_PARAMETERS_7, REFCYC_PER_META_CHUNK_NOM_C, mask_sh),\ -+ MI_SF(HUBPREQ0_DCN_TTU_QOS_WM, QoS_LEVEL_LOW_WM, mask_sh),\ -+ MI_SF(HUBPREQ0_DCN_TTU_QOS_WM, QoS_LEVEL_HIGH_WM, mask_sh),\ -+ MI_SF(HUBPREQ0_DCN_GLOBAL_TTU_CNTL, MIN_TTU_VBLANK, mask_sh),\ -+ MI_SF(HUBPREQ0_DCN_GLOBAL_TTU_CNTL, QoS_LEVEL_FLIP, mask_sh),\ -+ MI_SF(HUBPREQ0_DCN_SURF0_TTU_CNTL0, REFCYC_PER_REQ_DELIVERY, mask_sh),\ -+ MI_SF(HUBPREQ0_DCN_SURF0_TTU_CNTL0, QoS_LEVEL_FIXED, mask_sh),\ -+ MI_SF(HUBPREQ0_DCN_SURF0_TTU_CNTL0, QoS_RAMP_DISABLE, mask_sh),\ -+ MI_SF(HUBPREQ0_DCN_SURF0_TTU_CNTL1, REFCYC_PER_REQ_DELIVERY_PRE, mask_sh),\ -+ MI_SF(HUBPREQ0_DCN_VM_CONTEXT0_PAGE_TABLE_BASE_ADDR_MSB, VM_CONTEXT0_PAGE_TABLE_BASE_ADDR_MSB, mask_sh),\ -+ MI_SF(HUBPREQ0_DCN_VM_CONTEXT0_PAGE_TABLE_BASE_ADDR_LSB, VM_CONTEXT0_PAGE_TABLE_BASE_ADDR_LSB, mask_sh),\ -+ MI_SF(HUBPREQ0_DCN_VM_CONTEXT0_PAGE_TABLE_START_ADDR_MSB, VM_CONTEXT0_PAGE_TABLE_START_ADDR_MSB, mask_sh),\ -+ MI_SF(HUBPREQ0_DCN_VM_CONTEXT0_PAGE_TABLE_START_ADDR_LSB, VM_CONTEXT0_PAGE_TABLE_START_ADDR_LSB, mask_sh),\ -+ MI_SF(HUBPREQ0_DCN_VM_CONTEXT0_PAGE_TABLE_END_ADDR_MSB, VM_CONTEXT0_PAGE_TABLE_END_ADDR_MSB, mask_sh),\ -+ MI_SF(HUBPREQ0_DCN_VM_CONTEXT0_PAGE_TABLE_END_ADDR_LSB, VM_CONTEXT0_PAGE_TABLE_END_ADDR_LSB, mask_sh),\ -+ MI_SF(HUBPREQ0_DCN_VM_CONTEXT0_PROTECTION_FAULT_DEFAULT_ADDR_MSB, VM_CONTEXT0_PROTECTION_FAULT_DEFAULT_ADDR_MSB, mask_sh),\ -+ MI_SF(HUBPREQ0_DCN_VM_CONTEXT0_PROTECTION_FAULT_DEFAULT_ADDR_LSB, VM_CONTEXT0_PROTECTION_FAULT_DEFAULT_ADDR_LSB, mask_sh),\ -+ MI_SF(HUBPREQ0_DCN_VM_MX_L1_TLB_CNTL, ENABLE_L1_TLB, mask_sh),\ -+ MI_SF(HUBPREQ0_DCN_VM_MX_L1_TLB_CNTL, SYSTEM_ACCESS_MODE, mask_sh),\ -+ MI_SF(HUBPREQ0_DCN_VM_SYSTEM_APERTURE_DEFAULT_ADDR_MSB, MC_VM_SYSTEM_APERTURE_DEFAULT_SYSTEM, mask_sh),\ -+ MI_SF(HUBPREQ0_DCN_VM_SYSTEM_APERTURE_DEFAULT_ADDR_MSB, MC_VM_SYSTEM_APERTURE_DEFAULT_ADDR_MSB, mask_sh),\ -+ MI_SF(HUBPREQ0_DCN_VM_SYSTEM_APERTURE_DEFAULT_ADDR_LSB, MC_VM_SYSTEM_APERTURE_DEFAULT_ADDR_LSB, mask_sh),\ -+ MI_SF(HUBPREQ0_DCN_VM_SYSTEM_APERTURE_LOW_ADDR_MSB, MC_VM_SYSTEM_APERTURE_LOW_ADDR_MSB, mask_sh),\ -+ MI_SF(HUBPREQ0_DCN_VM_SYSTEM_APERTURE_LOW_ADDR_LSB, MC_VM_SYSTEM_APERTURE_LOW_ADDR_LSB, mask_sh),\ -+ MI_SF(HUBPREQ0_DCN_VM_SYSTEM_APERTURE_HIGH_ADDR_MSB, MC_VM_SYSTEM_APERTURE_HIGH_ADDR_MSB, mask_sh),\ -+ MI_SF(HUBPREQ0_DCN_VM_SYSTEM_APERTURE_HIGH_ADDR_LSB, MC_VM_SYSTEM_APERTURE_HIGH_ADDR_LSB, mask_sh),\ -+ MI_SF(DCHUBBUB_SDPIF_FB_TOP, SDPIF_FB_TOP, mask_sh),\ -+ MI_SF(DCHUBBUB_SDPIF_FB_BASE, SDPIF_FB_BASE, mask_sh),\ -+ MI_SF(DCHUBBUB_SDPIF_FB_OFFSET, SDPIF_FB_OFFSET, mask_sh),\ -+ MI_SF(DCHUBBUB_SDPIF_AGP_BASE, SDPIF_AGP_BASE, mask_sh),\ -+ MI_SF(DCHUBBUB_SDPIF_AGP_BOT, SDPIF_AGP_BOT, mask_sh),\ -+ MI_SF(DCHUBBUB_SDPIF_AGP_TOP, SDPIF_AGP_TOP, mask_sh),\ -+ MI_SF(DCHUBBUB_ARB_WATERMARK_CHANGE_CNTL, DCHUBBUB_ARB_WATERMARK_CHANGE_REQUEST, mask_sh),\ -+ MI_SF(DCHUBBUB_ARB_WATERMARK_CHANGE_CNTL, DCHUBBUB_ARB_WATERMARK_CHANGE_DONE_INTERRUPT_DISABLE, mask_sh),\ -+ MI_SF(DCHUBBUB_ARB_SAT_LEVEL, DCHUBBUB_ARB_SAT_LEVEL, mask_sh),\ -+ MI_SF(DCHUBBUB_ARB_DF_REQ_OUTSTAND, DCHUBBUB_ARB_MIN_REQ_OUTSTAND, mask_sh),\ -+ /* todo: get these from GVM instead of reading registers ourselves */\ -+ MI_SF(VM_CONTEXT0_PAGE_TABLE_BASE_ADDR_HI32, PAGE_DIRECTORY_ENTRY_HI32, mask_sh),\ -+ MI_SF(VM_CONTEXT0_PAGE_TABLE_BASE_ADDR_LO32, PAGE_DIRECTORY_ENTRY_LO32, mask_sh),\ -+ MI_SF(VM_CONTEXT0_PAGE_TABLE_START_ADDR_HI32, LOGICAL_PAGE_NUMBER_HI4, mask_sh),\ -+ MI_SF(VM_CONTEXT0_PAGE_TABLE_START_ADDR_LO32, LOGICAL_PAGE_NUMBER_LO32, mask_sh),\ -+ MI_SF(VM_L2_PROTECTION_FAULT_DEFAULT_ADDR_HI32, PHYSICAL_PAGE_ADDR_HI4, mask_sh),\ -+ MI_SF(VM_L2_PROTECTION_FAULT_DEFAULT_ADDR_LO32, PHYSICAL_PAGE_ADDR_LO32, mask_sh),\ -+ MI_SF(MC_VM_SYSTEM_APERTURE_DEFAULT_ADDR_MSB, PHYSICAL_PAGE_NUMBER_MSB, mask_sh),\ -+ MI_SF(MC_VM_SYSTEM_APERTURE_DEFAULT_ADDR_LSB, PHYSICAL_PAGE_NUMBER_LSB, mask_sh),\ -+ MI_SF(MC_VM_SYSTEM_APERTURE_LOW_ADDR, LOGICAL_ADDR, mask_sh) -+ -+#define DCN_MI_REG_FIELD_LIST(type) \ -+ type HUBP_BLANK_EN;\ -+ type HUBP_TTU_DISABLE;\ -+ type NUM_PIPES;\ -+ type NUM_BANKS;\ -+ type PIPE_INTERLEAVE;\ -+ type NUM_SE;\ -+ type NUM_RB_PER_SE;\ -+ type MAX_COMPRESSED_FRAGS;\ -+ type SW_MODE;\ -+ type META_LINEAR;\ -+ type RB_ALIGNED;\ -+ type PIPE_ALIGNED;\ -+ type PITCH;\ -+ type META_PITCH;\ -+ type PITCH_C;\ -+ type META_PITCH_C;\ -+ type ROTATION_ANGLE;\ -+ type H_MIRROR_EN;\ -+ type SURFACE_PIXEL_FORMAT;\ -+ type SURFACE_FLIP_TYPE;\ -+ type SURFACE_UPDATE_PENDING;\ -+ type PRIMARY_SURFACE_ADDRESS_HIGH;\ -+ type PRIMARY_SURFACE_ADDRESS;\ -+ type SECONDARY_SURFACE_ADDRESS_HIGH;\ -+ type SECONDARY_SURFACE_ADDRESS;\ -+ type PRIMARY_META_SURFACE_ADDRESS_HIGH;\ -+ type PRIMARY_META_SURFACE_ADDRESS;\ -+ type SECONDARY_META_SURFACE_ADDRESS_HIGH;\ -+ type SECONDARY_META_SURFACE_ADDRESS;\ -+ type PRIMARY_SURFACE_ADDRESS_HIGH_C;\ -+ type PRIMARY_SURFACE_ADDRESS_C;\ -+ type PRIMARY_META_SURFACE_ADDRESS_HIGH_C;\ -+ type PRIMARY_META_SURFACE_ADDRESS_C;\ -+ type PRIMARY_SURFACE_DCC_EN;\ -+ type PRIMARY_SURFACE_DCC_IND_64B_BLK;\ -+ type DET_BUF_PLANE1_BASE_ADDRESS;\ -+ type CROSSBAR_SRC_CB_B;\ -+ type CROSSBAR_SRC_CR_R;\ -+ type DRQ_EXPANSION_MODE;\ -+ type PRQ_EXPANSION_MODE;\ -+ type MRQ_EXPANSION_MODE;\ -+ type CRQ_EXPANSION_MODE;\ -+ type CHUNK_SIZE;\ -+ type MIN_CHUNK_SIZE;\ -+ type META_CHUNK_SIZE;\ -+ type MIN_META_CHUNK_SIZE;\ -+ type DPTE_GROUP_SIZE;\ -+ type MPTE_GROUP_SIZE;\ -+ type SWATH_HEIGHT;\ -+ type PTE_ROW_HEIGHT_LINEAR;\ -+ type CHUNK_SIZE_C;\ -+ type MIN_CHUNK_SIZE_C;\ -+ type META_CHUNK_SIZE_C;\ -+ type MIN_META_CHUNK_SIZE_C;\ -+ type DPTE_GROUP_SIZE_C;\ -+ type MPTE_GROUP_SIZE_C;\ -+ type SWATH_HEIGHT_C;\ -+ type PTE_ROW_HEIGHT_LINEAR_C;\ -+ type REFCYC_H_BLANK_END;\ -+ type DLG_V_BLANK_END;\ -+ type MIN_DST_Y_NEXT_START;\ -+ type REFCYC_PER_HTOTAL;\ -+ type REFCYC_X_AFTER_SCALER;\ -+ type DST_Y_AFTER_SCALER;\ -+ type DST_Y_PREFETCH;\ -+ type VRATIO_PREFETCH;\ -+ type DST_Y_PER_VM_VBLANK;\ -+ type DST_Y_PER_ROW_VBLANK;\ -+ type REF_FREQ_TO_PIX_FREQ;\ -+ type REFCYC_PER_PTE_GROUP_VBLANK_L;\ -+ type REFCYC_PER_META_CHUNK_VBLANK_L;\ -+ type DST_Y_PER_PTE_ROW_NOM_L;\ -+ type REFCYC_PER_PTE_GROUP_NOM_L;\ -+ type DST_Y_PER_META_ROW_NOM_L;\ -+ type REFCYC_PER_META_CHUNK_NOM_L;\ -+ type REFCYC_PER_LINE_DELIVERY_PRE_L;\ -+ type REFCYC_PER_LINE_DELIVERY_PRE_C;\ -+ type REFCYC_PER_LINE_DELIVERY_L;\ -+ type REFCYC_PER_LINE_DELIVERY_C;\ -+ type VRATIO_PREFETCH_C;\ -+ type REFCYC_PER_PTE_GROUP_VBLANK_C;\ -+ type REFCYC_PER_META_CHUNK_VBLANK_C;\ -+ type DST_Y_PER_PTE_ROW_NOM_C;\ -+ type REFCYC_PER_PTE_GROUP_NOM_C;\ -+ type DST_Y_PER_META_ROW_NOM_C;\ -+ type REFCYC_PER_META_CHUNK_NOM_C;\ -+ type QoS_LEVEL_LOW_WM;\ -+ type QoS_LEVEL_HIGH_WM;\ -+ type MIN_TTU_VBLANK;\ -+ type QoS_LEVEL_FLIP;\ -+ type REFCYC_PER_REQ_DELIVERY;\ -+ type QoS_LEVEL_FIXED;\ -+ type QoS_RAMP_DISABLE;\ -+ type REFCYC_PER_REQ_DELIVERY_PRE;\ -+ type VM_CONTEXT0_PAGE_TABLE_BASE_ADDR_MSB;\ -+ type VM_CONTEXT0_PAGE_TABLE_BASE_ADDR_LSB;\ -+ type VM_CONTEXT0_PAGE_TABLE_START_ADDR_MSB;\ -+ type VM_CONTEXT0_PAGE_TABLE_START_ADDR_LSB;\ -+ type VM_CONTEXT0_PAGE_TABLE_END_ADDR_MSB;\ -+ type VM_CONTEXT0_PAGE_TABLE_END_ADDR_LSB;\ -+ type VM_CONTEXT0_PROTECTION_FAULT_DEFAULT_ADDR_MSB;\ -+ type VM_CONTEXT0_PROTECTION_FAULT_DEFAULT_ADDR_LSB;\ -+ type ENABLE_L1_TLB;\ -+ type SYSTEM_ACCESS_MODE;\ -+ type MC_VM_SYSTEM_APERTURE_DEFAULT_SYSTEM;\ -+ type MC_VM_SYSTEM_APERTURE_DEFAULT_ADDR_MSB;\ -+ type MC_VM_SYSTEM_APERTURE_DEFAULT_ADDR_LSB;\ -+ type MC_VM_SYSTEM_APERTURE_LOW_ADDR_MSB;\ -+ type MC_VM_SYSTEM_APERTURE_LOW_ADDR_LSB;\ -+ type MC_VM_SYSTEM_APERTURE_HIGH_ADDR_MSB;\ -+ type MC_VM_SYSTEM_APERTURE_HIGH_ADDR_LSB;\ -+ type SDPIF_FB_TOP;\ -+ type SDPIF_FB_BASE;\ -+ type SDPIF_FB_OFFSET;\ -+ type SDPIF_AGP_BASE;\ -+ type SDPIF_AGP_BOT;\ -+ type SDPIF_AGP_TOP;\ -+ type DCHUBBUB_ARB_WATERMARK_CHANGE_REQUEST;\ -+ type DCHUBBUB_ARB_WATERMARK_CHANGE_DONE_INTERRUPT_DISABLE;\ -+ type DCHUBBUB_ARB_SAT_LEVEL;\ -+ type DCHUBBUB_ARB_MIN_REQ_OUTSTAND;\ -+ /* todo: get these from GVM instead of reading registers ourselves */\ -+ type PAGE_DIRECTORY_ENTRY_HI32;\ -+ type PAGE_DIRECTORY_ENTRY_LO32;\ -+ type LOGICAL_PAGE_NUMBER_HI4;\ -+ type LOGICAL_PAGE_NUMBER_LO32;\ -+ type PHYSICAL_PAGE_ADDR_HI4;\ -+ type PHYSICAL_PAGE_ADDR_LO32;\ -+ type PHYSICAL_PAGE_NUMBER_MSB;\ -+ type PHYSICAL_PAGE_NUMBER_LSB;\ -+ type LOGICAL_ADDR -+ -+struct dcn_mi_shift { -+ DCN_MI_REG_FIELD_LIST(uint8_t); -+}; -+ -+struct dcn_mi_mask { -+ DCN_MI_REG_FIELD_LIST(uint32_t); -+}; -+ -+struct dcn10_mem_input { -+ struct mem_input base; -+ const struct dcn_mi_registers *mi_regs; -+ const struct dcn_mi_shift *mi_shift; -+ const struct dcn_mi_mask *mi_mask; -+}; -+ -+bool dcn10_mem_input_construct( -+ struct dcn10_mem_input *mi, -+ struct dc_context *ctx, -+ uint32_t inst, -+ const struct dcn_mi_registers *mi_regs, -+ const struct dcn_mi_shift *mi_shift, -+ const struct dcn_mi_mask *mi_mask); -+ -+ -+#endif -diff --git a/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_mpc.c b/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_mpc.c -new file mode 100644 -index 0000000..cb22cd1 ---- /dev/null -+++ b/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_mpc.c -@@ -0,0 +1,376 @@ -+/* -+ * 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 "reg_helper.h" -+#include "dcn10_mpc.h" -+ -+#define REG(reg)\ -+ mpc->mpc_regs->reg -+ -+#define CTX \ -+ mpc->base.ctx -+ -+#undef FN -+#define FN(reg_name, field_name) \ -+ mpc->mpc_shift->field_name, mpc->mpc_mask->field_name -+ -+/* Internal function to set mpc output mux */ -+static void set_output_mux(struct dcn10_mpc *mpc, -+ uint8_t opp_id, -+ uint8_t mpcc_id) -+{ -+ if (mpcc_id != 0xf) -+ REG_UPDATE(OPP_PIPE_CONTROL[opp_id], -+ OPP_PIPE_CLOCK_EN, 1); -+ -+ REG_SET(MUX[opp_id], 0, -+ MPC_OUT_MUX, mpcc_id); -+ -+/* TODO: Move to post when ready. -+ if (mpcc_id == 0xf) { -+ MPCC_REG_UPDATE(OPP_PIPE0_OPP_PIPE_CONTROL, -+ OPP_PIPE_CLOCK_EN, 0); -+ } -+*/ -+} -+ -+static void set_blend_mode(struct dcn10_mpc *mpc, -+ enum blend_mode mode, -+ uint8_t mpcc_id) -+{ -+ /* Enable per-pixel alpha on this pipe */ -+ if (mode == TOP_BLND) -+ REG_UPDATE_3(MPCC_CONTROL[mpcc_id], -+ MPCC_ALPHA_BLND_MODE, 0, -+ MPCC_ALPHA_MULTIPLIED_MODE, 0, -+ MPCC_BLND_ACTIVE_OVERLAP_ONLY, 0); -+ else -+ REG_UPDATE_3(MPCC_CONTROL[mpcc_id], -+ MPCC_ALPHA_BLND_MODE, 0, -+ MPCC_ALPHA_MULTIPLIED_MODE, 1, -+ MPCC_BLND_ACTIVE_OVERLAP_ONLY, 1); -+} -+ -+void dcn10_set_mpc_background_color(struct dcn10_mpc *mpc, -+ unsigned int mpcc_inst, -+ struct tg_color *bg_color) -+{ -+ /* mpc color is 12 bit. tg_color is 10 bit */ -+ /* todo: might want to use 16 bit to represent color and have each -+ * hw block translate to correct color depth. -+ */ -+ uint32_t bg_r_cr = bg_color->color_r_cr << 2; -+ uint32_t bg_g_y = bg_color->color_g_y << 2; -+ uint32_t bg_b_cb = bg_color->color_b_cb << 2; -+ -+ REG_SET(MPCC_BG_R_CR[mpcc_inst], 0, -+ MPCC_BG_R_CR, bg_r_cr); -+ REG_SET(MPCC_BG_G_Y[mpcc_inst], 0, -+ MPCC_BG_G_Y, bg_g_y); -+ REG_SET(MPCC_BG_B_CB[mpcc_inst], 0, -+ MPCC_BG_B_CB, bg_b_cb); -+} -+ -+/* This function programs MPC tree configuration -+ * Assume it is the initial time to setup MPC tree_configure, means -+ * the instance of dpp/mpcc/opp specified in structure tree_cfg are -+ * in idle status. -+ * Before invoke this function, ensure that master lock of OPTC specified -+ * by opp_id is set. -+ * -+ * tree_cfg[in] - new MPC_TREE_CFG -+ */ -+ -+void dcn10_set_mpc_tree(struct dcn10_mpc *mpc, -+ struct mpc_tree_cfg *tree_cfg) -+{ -+ int i; -+ -+ for (i = 0; i < tree_cfg->num_pipes; i++) { -+ uint8_t mpcc_inst = tree_cfg->mpcc[i]; -+ -+ REG_SET(MPCC_OPP_ID[mpcc_inst], 0, -+ MPCC_OPP_ID, tree_cfg->opp_id); -+ -+ REG_SET(MPCC_TOP_SEL[mpcc_inst], 0, -+ MPCC_TOP_SEL, tree_cfg->dpp[i]); -+ -+ if (i == tree_cfg->num_pipes-1) { -+ REG_SET(MPCC_BOT_SEL[mpcc_inst], 0, -+ MPCC_BOT_SEL, 0xF); -+ -+ /* MPCC_CONTROL->MPCC_MODE */ -+ REG_UPDATE(MPCC_CONTROL[mpcc_inst], -+ MPCC_MODE, tree_cfg->mode); -+ } else { -+ REG_SET(MPCC_BOT_SEL[mpcc_inst], 0, -+ MPCC_BOT_SEL, tree_cfg->dpp[i+1]); -+ -+ /* MPCC_CONTROL->MPCC_MODE */ -+ REG_UPDATE(MPCC_CONTROL[mpcc_inst], -+ MPCC_MODE, 3); -+ } -+ -+ if (i == 0) -+ set_output_mux( -+ mpc, tree_cfg->opp_id, mpcc_inst); -+ -+ set_blend_mode(mpc, tree_cfg->mode, mpcc_inst); -+ } -+} -+ -+void dcn10_set_mpc_passthrough(struct dcn10_mpc *mpc, -+ uint8_t dpp_idx, -+ uint8_t mpcc_idx, -+ uint8_t opp_idx) -+{ -+ struct mpc_tree_cfg tree_cfg = { 0 }; -+ -+ tree_cfg.num_pipes = 1; -+ tree_cfg.opp_id = opp_idx; -+ tree_cfg.mode = TOP_PASSTHRU; -+ /* TODO: FPGA bring up one MPC has only 1 DPP and 1 MPCC -+ * For blend case, need fill mode DPP and cascade MPCC -+ */ -+ tree_cfg.dpp[0] = dpp_idx; -+ tree_cfg.mpcc[0] = mpcc_idx; -+ dcn10_set_mpc_tree(mpc, &tree_cfg); -+} -+ -+/* -+ * This is the function to remove current MPC tree specified by tree_cfg -+ * Before invoke this function, ensure that master lock of OPTC specified -+ * by opp_id is set. -+ * -+ *tree_cfg[in/out] - current MPC_TREE_CFG -+ */ -+void dcn10_delete_mpc_tree(struct dcn10_mpc *mpc, -+ struct mpc_tree_cfg *tree_cfg) -+{ -+ int i; -+ -+ for (i = 0; i < tree_cfg->num_pipes; i++) { -+ uint8_t mpcc_inst = tree_cfg->mpcc[i]; -+ -+ REG_SET(MPCC_OPP_ID[mpcc_inst], 0, -+ MPCC_OPP_ID, 0xf); -+ -+ REG_SET(MPCC_TOP_SEL[mpcc_inst], 0, -+ MPCC_TOP_SEL, 0xf); -+ -+ REG_SET(MPCC_BOT_SEL[mpcc_inst], 0, -+ MPCC_BOT_SEL, 0xF); -+ -+ /* add remove dpp/mpcc pair into pending list -+ * TODO FPGA AddToPendingList if empty from pseudo code -+ */ -+ tree_cfg->dpp[i] = 0xf; -+ tree_cfg->mpcc[i] = 0xf; -+ } -+ set_output_mux(mpc, tree_cfg->opp_id, 0xf); -+ tree_cfg->opp_id = 0xf; -+ tree_cfg->num_pipes = 0; -+} -+ -+/* TODO FPGA: how to handle DPP? -+ * Function to remove one of pipe from MPC configure tree by dpp idx -+ * Before invoke this function, ensure that master lock of OPTC specified -+ * by opp_id is set -+ * This function can be invoke multiple times to remove more than 1 dpps. -+ * -+ * tree_cfg[in/out] - current MPC_TREE_CFG -+ * idx[in] - index of dpp from tree_cfg to be removed. -+ */ -+bool dcn10_remove_dpp(struct dcn10_mpc *mpc, -+ struct mpc_tree_cfg *tree_cfg, -+ uint8_t idx) -+{ -+ int i; -+ bool found = false; -+ -+ /* find dpp_idx from dpp array of tree_cfg */ -+ for (i = 0; i < tree_cfg->num_pipes; i++) { -+ if (tree_cfg->dpp[i] == idx) { -+ found = true; -+ break; -+ } -+ } -+ -+ if (found) { -+ /* add remove dpp/mpcc pair into pending list */ -+ -+ /* TODO FPGA AddToPendingList if empty from pseudo code -+ * AddToPendingList(tree_cfg->dpp[i],tree_cfg->mpcc[i]); -+ */ -+ uint8_t mpcc_inst = tree_cfg->mpcc[i]; -+ -+ REG_SET(MPCC_OPP_ID[mpcc_inst], 0, -+ MPCC_OPP_ID, 0xf); -+ -+ REG_SET(MPCC_TOP_SEL[mpcc_inst], 0, -+ MPCC_TOP_SEL, 0xf); -+ -+ REG_SET(MPCC_BOT_SEL[mpcc_inst], 0, -+ MPCC_BOT_SEL, 0xF); -+ -+ if (i == 0) { -+ if (tree_cfg->num_pipes > 1) -+ set_output_mux(mpc, -+ tree_cfg->opp_id, tree_cfg->mpcc[i+1]); -+ else -+ set_output_mux(mpc, tree_cfg->opp_id, 0xf); -+ } else if (i == tree_cfg->num_pipes-1) { -+ mpcc_inst = tree_cfg->mpcc[i - 1]; -+ -+ REG_SET(MPCC_BOT_SEL[mpcc_inst], 0, -+ MPCC_BOT_SEL, 0xF); -+ -+ REG_UPDATE(MPCC_CONTROL[mpcc_inst], -+ MPCC_MODE, tree_cfg->mode); -+ } else { -+ mpcc_inst = tree_cfg->mpcc[i - 1]; -+ -+ REG_SET(MPCC_BOT_SEL[mpcc_inst], 0, -+ MPCC_BOT_SEL, tree_cfg->mpcc[i+1]); -+ } -+ set_blend_mode(mpc, tree_cfg->mode, mpcc_inst); -+ -+ /* update tree_cfg structure */ -+ while (i < tree_cfg->num_pipes - 1) { -+ tree_cfg->dpp[i] = tree_cfg->dpp[i+1]; -+ tree_cfg->mpcc[i] = tree_cfg->mpcc[i+1]; -+ i++; -+ } -+ tree_cfg->num_pipes--; -+ } -+ return found; -+} -+ -+/* TODO FPGA: how to handle DPP? -+ * Function to add DPP/MPCC pair into MPC configure tree by position. -+ * Before invoke this function, ensure that master lock of OPTC specified -+ * by opp_id is set -+ * This function can be invoke multiple times to add more than 1 pipes. -+ * -+ * tree_cfg[in/out] - current MPC_TREE_CFG -+ * dpp_idx[in] - index of an idle dpp insatnce to be added. -+ * mpcc_idx[in] - index of an idle mpcc instance to be added. -+ * poistion[in] - position of dpp/mpcc pair to be added into current tree_cfg -+ * 0 means insert to the most top layer of MPC tree -+ */ -+void dcn10_add_dpp(struct dcn10_mpc *mpc, -+ struct mpc_tree_cfg *tree_cfg, -+ uint8_t dpp_idx, -+ uint8_t mpcc_idx, -+ uint8_t position) -+{ -+ uint8_t temp; -+ uint8_t temp1; -+ -+ REG_SET(MPCC_OPP_ID[mpcc_idx], 0, -+ MPCC_OPP_ID, tree_cfg->opp_id); -+ -+ REG_SET(MPCC_TOP_SEL[mpcc_idx], 0, -+ MPCC_TOP_SEL, dpp_idx); -+ -+ if (position == 0) { -+ /* idle dpp/mpcc is added to the top layer of tree */ -+ REG_SET(MPCC_BOT_SEL[mpcc_idx], 0, -+ MPCC_BOT_SEL, tree_cfg->mpcc[0]); -+ REG_UPDATE(MPCC_CONTROL[mpcc_idx], -+ MPCC_MODE, 3); -+ -+ /* opp will get new output. from new added mpcc */ -+ set_output_mux(mpc, tree_cfg->opp_id, mpcc_idx); -+ -+ set_blend_mode(mpc, tree_cfg->mode, mpcc_idx); -+ -+ } else if (position == tree_cfg->num_pipes) { -+ /* idle dpp/mpcc is added to the bottom layer of tree */ -+ -+ /* get instance of previous bottom mpcc, set to middle layer */ -+ temp = tree_cfg->mpcc[tree_cfg->num_pipes - 1]; -+ -+ REG_SET(MPCC_BOT_SEL[temp], 0, -+ MPCC_BOT_SEL, mpcc_idx); -+ -+ REG_UPDATE(MPCC_CONTROL[temp], -+ MPCC_MODE, 3); -+ -+ /* mpcc_idx become new bottom mpcc*/ -+ REG_SET(MPCC_BOT_SEL[mpcc_idx], 0, -+ MPCC_BOT_SEL, 0xf); -+ -+ REG_UPDATE(MPCC_CONTROL[mpcc_idx], -+ MPCC_MODE, tree_cfg->mode); -+ -+ set_blend_mode(mpc, tree_cfg->mode, mpcc_idx); -+ } else { -+ /* idle dpp/mpcc is added to middle of tree */ -+ temp = tree_cfg->mpcc[position - 1]; -+ temp1 = tree_cfg->mpcc[position]; -+ -+ /* new mpcc instance temp1 is added right after temp*/ -+ REG_SET(MPCC_BOT_SEL[temp], 0, -+ MPCC_BOT_SEL, mpcc_idx); -+ -+ /* mpcc_idx connect previous temp+1 to new mpcc */ -+ REG_SET(MPCC_BOT_SEL[mpcc_idx], 0, -+ MPCC_BOT_SEL, temp1); -+ -+ /* temp TODO: may not need*/ -+ REG_UPDATE(MPCC_CONTROL[temp], -+ MPCC_MODE, 3); -+ -+ set_blend_mode(mpc, tree_cfg->mode, temp); -+ } -+ -+ /* update tree_cfg structure */ -+ temp = tree_cfg->num_pipes - 1; -+ -+ /* -+ * iterating from the last mpc/dpp pair to the one being added, shift -+ * them down one position -+ */ -+ while (temp > position) { -+ tree_cfg->dpp[temp + 1] = tree_cfg->dpp[temp]; -+ tree_cfg->mpcc[temp + 1] = tree_cfg->mpcc[temp]; -+ temp--; -+ } -+ -+ /* insert the new mpc/dpp pair into the tree_cfg*/ -+ tree_cfg->dpp[position] = dpp_idx; -+ tree_cfg->mpcc[position] = mpcc_idx; -+ tree_cfg->num_pipes++; -+} -+ -+void wait_mpcc_idle(struct dcn10_mpc *mpc, -+ uint8_t mpcc_id) -+{ -+ REG_WAIT(MPCC_STATUS[mpcc_id], -+ MPCC_IDLE, 1, -+ 1000, 1000); -+} -+ -diff --git a/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_mpc.h b/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_mpc.h -new file mode 100644 -index 0000000..6550b93 ---- /dev/null -+++ b/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_mpc.h -@@ -0,0 +1,135 @@ -+/* 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_MPC_DCN10_H__ -+#define __DC_MPC_DCN10_H__ -+ -+#include "mpc.h" -+ -+#define TO_DCN10_MPC(mpc_base)\ -+ container_of(mpc_base, struct dcn10_mpc, base) -+ -+#define MAX_MPCC 4 -+#define MAX_MPC_OUT 4 -+#define MAX_OPP 4 -+ -+#define MPC_COMMON_REG_LIST_DCN1_0(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_BG_B_CB, MPCC, inst),\ -+ SRII(MUX, MPC_OUT, inst),\ -+ SRII(OPP_PIPE_CONTROL, OPP_PIPE, inst) -+ -+struct dcn_mpc_registers { -+ uint32_t MPCC_TOP_SEL[MAX_MPCC]; -+ uint32_t MPCC_BOT_SEL[MAX_MPCC]; -+ uint32_t MPCC_CONTROL[MAX_MPCC]; -+ uint32_t MPCC_STATUS[MAX_MPCC]; -+ uint32_t MPCC_OPP_ID[MAX_MPCC]; -+ uint32_t MPCC_BG_G_Y[MAX_MPCC]; -+ uint32_t MPCC_BG_R_CR[MAX_MPCC]; -+ uint32_t MPCC_BG_B_CB[MAX_MPCC]; -+ uint32_t MUX[MAX_MPC_OUT]; -+ uint32_t OPP_PIPE_CONTROL[MAX_OPP]; -+}; -+ -+#define MPC_COMMON_MASK_SH_LIST_DCN1_0(mask_sh)\ -+ SF(MPCC0_MPCC_TOP_SEL, MPCC_TOP_SEL, mask_sh),\ -+ SF(MPCC0_MPCC_BOT_SEL, MPCC_BOT_SEL, mask_sh),\ -+ SF(MPCC0_MPCC_CONTROL, MPCC_MODE, mask_sh),\ -+ SF(MPCC0_MPCC_CONTROL, MPCC_ALPHA_BLND_MODE, mask_sh),\ -+ SF(MPCC0_MPCC_CONTROL, MPCC_ALPHA_MULTIPLIED_MODE, mask_sh),\ -+ SF(MPCC0_MPCC_CONTROL, MPCC_BLND_ACTIVE_OVERLAP_ONLY, mask_sh),\ -+ SF(MPCC0_MPCC_STATUS, MPCC_IDLE, mask_sh),\ -+ SF(MPCC0_MPCC_OPP_ID, MPCC_OPP_ID, mask_sh),\ -+ SF(MPCC0_MPCC_BG_G_Y, MPCC_BG_G_Y, mask_sh),\ -+ SF(MPCC0_MPCC_BG_R_CR, MPCC_BG_R_CR, mask_sh),\ -+ SF(MPCC0_MPCC_BG_B_CB, MPCC_BG_B_CB, mask_sh),\ -+ SF(MPC_OUT0_MUX, MPC_OUT_MUX, mask_sh),\ -+ SF(OPP_PIPE0_OPP_PIPE_CONTROL, OPP_PIPE_CLOCK_EN, mask_sh) -+ -+#define MPC_REG_FIELD_LIST(type) \ -+ type MPCC_TOP_SEL;\ -+ type MPCC_BOT_SEL;\ -+ type MPCC_MODE;\ -+ type MPCC_ALPHA_BLND_MODE;\ -+ type MPCC_ALPHA_MULTIPLIED_MODE;\ -+ type MPCC_BLND_ACTIVE_OVERLAP_ONLY;\ -+ type MPCC_IDLE;\ -+ type MPCC_OPP_ID;\ -+ type MPCC_BG_G_Y;\ -+ type MPCC_BG_R_CR;\ -+ type MPCC_BG_B_CB;\ -+ type MPC_OUT_MUX;\ -+ type OPP_PIPE_CLOCK_EN;\ -+ -+struct dcn_mpc_shift { -+ MPC_REG_FIELD_LIST(uint8_t) -+}; -+ -+struct dcn_mpc_mask { -+ MPC_REG_FIELD_LIST(uint32_t) -+}; -+ -+struct dcn10_mpc { -+ struct mpc base; -+ const struct dcn_mpc_registers *mpc_regs; -+ const struct dcn_mpc_shift *mpc_shift; -+ const struct dcn_mpc_mask *mpc_mask; -+}; -+ -+void dcn10_set_mpc_passthrough(struct dcn10_mpc *mpc, -+ uint8_t dpp_idx, -+ uint8_t mpcc_idx, -+ uint8_t opp_idx); -+ -+void dcn10_delete_mpc_tree(struct dcn10_mpc *mpc, -+ struct mpc_tree_cfg *tree_cfg); -+ -+bool dcn10_remove_dpp(struct dcn10_mpc *mpc, -+ struct mpc_tree_cfg *tree_cfg, -+ uint8_t idx); -+ -+void dcn10_add_dpp(struct dcn10_mpc *mpc, -+ struct mpc_tree_cfg *tree_cfg, -+ uint8_t dpp_idx, -+ uint8_t mpcc_idx, -+ uint8_t position); -+ -+void wait_mpcc_idle(struct dcn10_mpc *mpc, -+ uint8_t mpcc_id); -+ -+void dcn10_set_mpc_tree(struct dcn10_mpc *mpc, -+ struct mpc_tree_cfg *tree_cfg); -+ -+void dcn10_set_mpc_background_color(struct dcn10_mpc *mpc, -+ unsigned int mpcc_inst, -+ struct tg_color *bg_color); -+#endif -diff --git a/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_opp.c b/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_opp.c -new file mode 100644 -index 0000000..fce08e5 ---- /dev/null -+++ b/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_opp.c -@@ -0,0 +1,801 @@ -+/* -+ * 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 "dcn10_opp.h" -+#include "reg_helper.h" -+ -+#define REG(reg) \ -+ (oppn10->regs->reg) -+ -+#undef FN -+#define FN(reg_name, field_name) \ -+ oppn10->opp_shift->field_name, oppn10->opp_mask->field_name -+ -+#define CTX \ -+ oppn10->base.ctx -+ -+static void opp_set_regamma_mode( -+ struct output_pixel_processor *opp, -+ enum opp_regamma mode) -+{ -+ struct dcn10_opp *oppn10 = TO_DCN10_OPP(opp); -+ uint32_t re_mode = 0; -+ uint32_t obuf_bypass = 0; /* need for pipe split */ -+ uint32_t obuf_hupscale = 0; -+ -+ switch (mode) { -+ case OPP_REGAMMA_BYPASS: -+ re_mode = 0; -+ break; -+ case OPP_REGAMMA_SRGB: -+ re_mode = 1; -+ break; -+ case OPP_REGAMMA_3_6: -+ re_mode = 2; -+ break; -+ case OPP_REGAMMA_USER: -+ re_mode = oppn10->is_write_to_ram_a_safe ? 3 : 4; -+ oppn10->is_write_to_ram_a_safe = !oppn10->is_write_to_ram_a_safe; -+ break; -+ default: -+ break; -+ } -+ -+ REG_SET(CM_RGAM_CONTROL, 0, CM_RGAM_LUT_MODE, re_mode); -+ REG_UPDATE_2(OBUF_CONTROL, -+ OBUF_BYPASS, obuf_bypass, -+ OBUF_H_2X_UPSCALE_EN, obuf_hupscale); -+} -+ -+/************* FORMATTER ************/ -+ -+/** -+ * set_truncation -+ * 1) set truncation depth: 0 for 18 bpp or 1 for 24 bpp -+ * 2) enable truncation -+ * 3) HW remove 12bit FMT support for DCE11 power saving reason. -+ */ -+static void set_truncation( -+ struct dcn10_opp *oppn10, -+ const struct bit_depth_reduction_params *params) -+{ -+ REG_UPDATE_3(FMT_BIT_DEPTH_CONTROL, -+ FMT_TRUNCATE_EN, params->flags.TRUNCATE_ENABLED, -+ FMT_TRUNCATE_DEPTH, params->flags.TRUNCATE_DEPTH, -+ FMT_TRUNCATE_MODE, params->flags.TRUNCATE_MODE); -+} -+ -+static void set_spatial_dither( -+ struct dcn10_opp *oppn10, -+ const struct bit_depth_reduction_params *params) -+{ -+ /*Disable spatial (random) dithering*/ -+ REG_UPDATE_7(FMT_BIT_DEPTH_CONTROL, -+ FMT_SPATIAL_DITHER_EN, 0, -+ FMT_SPATIAL_DITHER_MODE, 0, -+ FMT_SPATIAL_DITHER_DEPTH, 0, -+ FMT_TEMPORAL_DITHER_EN, 0, -+ FMT_HIGHPASS_RANDOM_ENABLE, 0, -+ FMT_FRAME_RANDOM_ENABLE, 0, -+ FMT_RGB_RANDOM_ENABLE, 0); -+ -+ -+ /* only use FRAME_COUNTER_MAX if frameRandom == 1*/ -+ if (params->flags.FRAME_RANDOM == 1) { -+ if (params->flags.SPATIAL_DITHER_DEPTH == 0 || params->flags.SPATIAL_DITHER_DEPTH == 1) { -+ REG_UPDATE_2(FMT_CONTROL, -+ FMT_SPATIAL_DITHER_FRAME_COUNTER_MAX, 15, -+ FMT_SPATIAL_DITHER_FRAME_COUNTER_BIT_SWAP, 2); -+ } else if (params->flags.SPATIAL_DITHER_DEPTH == 2) { -+ REG_UPDATE_2(FMT_CONTROL, -+ FMT_SPATIAL_DITHER_FRAME_COUNTER_MAX, 3, -+ FMT_SPATIAL_DITHER_FRAME_COUNTER_BIT_SWAP, 1); -+ } else { -+ return; -+ } -+ } else { -+ REG_UPDATE_2(FMT_CONTROL, -+ FMT_SPATIAL_DITHER_FRAME_COUNTER_MAX, 0, -+ FMT_SPATIAL_DITHER_FRAME_COUNTER_BIT_SWAP, 0); -+ } -+ -+ /*Set seed for random values for -+ * spatial dithering for R,G,B channels*/ -+ -+ REG_SET(FMT_DITHER_RAND_R_SEED, 0, -+ FMT_RAND_R_SEED, params->r_seed_value); -+ -+ REG_SET(FMT_DITHER_RAND_G_SEED, 0, -+ FMT_RAND_G_SEED, params->g_seed_value); -+ -+ REG_SET(FMT_DITHER_RAND_B_SEED, 0, -+ FMT_RAND_B_SEED, params->b_seed_value); -+ -+ /* FMT_OFFSET_R_Cr 31:16 0x0 Setting the zero -+ * offset for the R/Cr channel, lower 4LSB -+ * is forced to zeros. Typically set to 0 -+ * RGB and 0x80000 YCbCr. -+ */ -+ /* FMT_OFFSET_G_Y 31:16 0x0 Setting the zero -+ * offset for the G/Y channel, lower 4LSB is -+ * forced to zeros. Typically set to 0 RGB -+ * and 0x80000 YCbCr. -+ */ -+ /* FMT_OFFSET_B_Cb 31:16 0x0 Setting the zero -+ * offset for the B/Cb channel, lower 4LSB is -+ * forced to zeros. Typically set to 0 RGB and -+ * 0x80000 YCbCr. -+ */ -+ -+ REG_UPDATE_6(FMT_BIT_DEPTH_CONTROL, -+ /*Enable spatial dithering*/ -+ FMT_SPATIAL_DITHER_EN, params->flags.SPATIAL_DITHER_ENABLED, -+ /* Set spatial dithering mode -+ * (default is Seed patterrn AAAA...) -+ */ -+ FMT_SPATIAL_DITHER_MODE, params->flags.SPATIAL_DITHER_MODE, -+ /*Set spatial dithering bit depth*/ -+ FMT_SPATIAL_DITHER_DEPTH, params->flags.SPATIAL_DITHER_DEPTH, -+ /*Disable High pass filter*/ -+ FMT_HIGHPASS_RANDOM_ENABLE, params->flags.HIGHPASS_RANDOM, -+ /*Reset only at startup*/ -+ FMT_FRAME_RANDOM_ENABLE, params->flags.FRAME_RANDOM, -+ /*Set RGB data dithered with x^28+x^3+1*/ -+ FMT_RGB_RANDOM_ENABLE, params->flags.RGB_RANDOM); -+} -+ -+static void opp_program_bit_depth_reduction( -+ struct output_pixel_processor *opp, -+ const struct bit_depth_reduction_params *params) -+{ -+ struct dcn10_opp *oppn10 = TO_DCN10_OPP(opp); -+ -+ set_truncation(oppn10, params); -+ set_spatial_dither(oppn10, params); -+ /* TODO -+ * set_temporal_dither(oppn10, params); -+ */ -+} -+ -+/** -+ * set_pixel_encoding -+ * -+ * Set Pixel Encoding -+ * 0: RGB 4:4:4 or YCbCr 4:4:4 or YOnly -+ * 1: YCbCr 4:2:2 -+ */ -+static void set_pixel_encoding( -+ struct dcn10_opp *oppn10, -+ const struct clamping_and_pixel_encoding_params *params) -+{ -+ switch (params->pixel_encoding) { -+ -+ case PIXEL_ENCODING_RGB: -+ case PIXEL_ENCODING_YCBCR444: -+ REG_UPDATE(FMT_CONTROL, FMT_PIXEL_ENCODING, 0); -+ break; -+ case PIXEL_ENCODING_YCBCR422: -+ REG_UPDATE(FMT_CONTROL, FMT_PIXEL_ENCODING, 1); -+ break; -+ case PIXEL_ENCODING_YCBCR420: -+ REG_UPDATE(FMT_CONTROL, FMT_PIXEL_ENCODING, 2); -+ break; -+ default: -+ break; -+ } -+} -+ -+/** -+ * Set Clamping -+ * 1) Set clamping format based on bpc - 0 for 6bpc (No clamping) -+ * 1 for 8 bpc -+ * 2 for 10 bpc -+ * 3 for 12 bpc -+ * 7 for programable -+ * 2) Enable clamp if Limited range requested -+ */ -+static void opp_set_clamping( -+ struct dcn10_opp *oppn10, -+ const struct clamping_and_pixel_encoding_params *params) -+{ -+ REG_UPDATE_2(FMT_CLAMP_CNTL, -+ FMT_CLAMP_DATA_EN, 0, -+ FMT_CLAMP_COLOR_FORMAT, 0); -+ -+ switch (params->clamping_level) { -+ case CLAMPING_FULL_RANGE: -+ REG_UPDATE_2(FMT_CLAMP_CNTL, -+ FMT_CLAMP_DATA_EN, 1, -+ FMT_CLAMP_COLOR_FORMAT, 0); -+ break; -+ case CLAMPING_LIMITED_RANGE_8BPC: -+ REG_UPDATE_2(FMT_CLAMP_CNTL, -+ FMT_CLAMP_DATA_EN, 1, -+ FMT_CLAMP_COLOR_FORMAT, 1); -+ break; -+ case CLAMPING_LIMITED_RANGE_10BPC: -+ REG_UPDATE_2(FMT_CLAMP_CNTL, -+ FMT_CLAMP_DATA_EN, 1, -+ FMT_CLAMP_COLOR_FORMAT, 2); -+ -+ break; -+ case CLAMPING_LIMITED_RANGE_12BPC: -+ REG_UPDATE_2(FMT_CLAMP_CNTL, -+ FMT_CLAMP_DATA_EN, 1, -+ FMT_CLAMP_COLOR_FORMAT, 3); -+ break; -+ case CLAMPING_LIMITED_RANGE_PROGRAMMABLE: -+ /* TODO */ -+ default: -+ break; -+ } -+ -+} -+ -+static void opp_set_dyn_expansion( -+ struct output_pixel_processor *opp, -+ enum dc_color_space color_sp, -+ enum dc_color_depth color_dpth, -+ enum signal_type signal) -+{ -+ struct dcn10_opp *oppn10 = TO_DCN10_OPP(opp); -+ -+ REG_UPDATE_2(FMT_DYNAMIC_EXP_CNTL, -+ FMT_DYNAMIC_EXP_EN, 0, -+ FMT_DYNAMIC_EXP_MODE, 0); -+ -+ /*00 - 10-bit -> 12-bit dynamic expansion*/ -+ /*01 - 8-bit -> 12-bit dynamic expansion*/ -+ if (signal == SIGNAL_TYPE_HDMI_TYPE_A || -+ signal == SIGNAL_TYPE_DISPLAY_PORT || -+ signal == SIGNAL_TYPE_DISPLAY_PORT_MST) { -+ switch (color_dpth) { -+ case COLOR_DEPTH_888: -+ REG_UPDATE_2(FMT_DYNAMIC_EXP_CNTL, -+ FMT_DYNAMIC_EXP_EN, 1, -+ FMT_DYNAMIC_EXP_MODE, 1); -+ break; -+ case COLOR_DEPTH_101010: -+ REG_UPDATE_2(FMT_DYNAMIC_EXP_CNTL, -+ FMT_DYNAMIC_EXP_EN, 1, -+ FMT_DYNAMIC_EXP_MODE, 0); -+ break; -+ case COLOR_DEPTH_121212: -+ REG_UPDATE_2(FMT_DYNAMIC_EXP_CNTL, -+ FMT_DYNAMIC_EXP_EN, 1,/*otherwise last two bits are zero*/ -+ FMT_DYNAMIC_EXP_MODE, 0); -+ break; -+ default: -+ break; -+ } -+ } -+} -+ -+static void opp_program_clamping_and_pixel_encoding( -+ struct output_pixel_processor *opp, -+ const struct clamping_and_pixel_encoding_params *params) -+{ -+ struct dcn10_opp *oppn10 = TO_DCN10_OPP(opp); -+ -+ opp_set_clamping(oppn10, params); -+ set_pixel_encoding(oppn10, params); -+} -+ -+static void opp_program_fmt( -+ struct output_pixel_processor *opp, -+ struct bit_depth_reduction_params *fmt_bit_depth, -+ struct clamping_and_pixel_encoding_params *clamping) -+{ -+ struct dcn10_opp *oppn10 = TO_DCN10_OPP(opp); -+ -+ if (clamping->pixel_encoding == PIXEL_ENCODING_YCBCR420) -+ REG_UPDATE(FMT_MAP420_MEMORY_CONTROL, FMT_MAP420MEM_PWR_FORCE, 0); -+ -+ /* dithering is affected by <CrtcSourceSelect>, hence should be -+ * programmed afterwards */ -+ opp_program_bit_depth_reduction( -+ opp, -+ fmt_bit_depth); -+ -+ opp_program_clamping_and_pixel_encoding( -+ opp, -+ clamping); -+ -+ return; -+} -+ -+static void opp_set_output_csc_default( -+ struct output_pixel_processor *opp, -+ const struct default_adjustment *default_adjust) -+{ -+ -+ struct dcn10_opp *oppn10 = TO_DCN10_OPP(opp); -+ uint32_t ocsc_mode = 0; -+ -+ if (default_adjust != NULL) { -+ switch (default_adjust->out_color_space) { -+ case COLOR_SPACE_SRGB: -+ ocsc_mode = 0; -+ break; -+ case COLOR_SPACE_SRGB_LIMITED: -+ ocsc_mode = 1; -+ break; -+ case COLOR_SPACE_YCBCR601: -+ case COLOR_SPACE_YCBCR601_LIMITED: -+ ocsc_mode = 2; -+ break; -+ case COLOR_SPACE_YCBCR709: -+ case COLOR_SPACE_YCBCR709_LIMITED: -+ ocsc_mode = 3; -+ break; -+ case COLOR_SPACE_UNKNOWN: -+ default: -+ break; -+ } -+ } -+ -+ REG_SET(CM_OCSC_CONTROL, 0, CM_OCSC_MODE, ocsc_mode); -+ -+} -+/*program re gamma RAM B*/ -+static void opp_program_regamma_lutb_settings( -+ struct output_pixel_processor *opp, -+ const struct pwl_params *params) -+{ -+ const struct gamma_curve *curve; -+ struct dcn10_opp *oppn10 = TO_DCN10_OPP(opp); -+ -+ REG_SET_2(CM_RGAM_RAMB_START_CNTL_B, 0, -+ CM_RGAM_RAMB_EXP_REGION_START_B, params->arr_points[0].custom_float_x, -+ CM_RGAM_RAMB_EXP_REGION_START_SEGMENT_B, 0); -+ REG_SET_2(CM_RGAM_RAMB_START_CNTL_G, 0, -+ CM_RGAM_RAMB_EXP_REGION_START_G, params->arr_points[0].custom_float_x, -+ CM_RGAM_RAMB_EXP_REGION_START_SEGMENT_G, 0); -+ REG_SET_2(CM_RGAM_RAMB_START_CNTL_R, 0, -+ CM_RGAM_RAMB_EXP_REGION_START_R, params->arr_points[0].custom_float_x, -+ CM_RGAM_RAMB_EXP_REGION_START_SEGMENT_R, 0); -+ -+ REG_SET(CM_RGAM_RAMB_SLOPE_CNTL_B, 0, -+ CM_RGAM_RAMB_EXP_REGION_LINEAR_SLOPE_B, params->arr_points[0].custom_float_slope); -+ REG_SET(CM_RGAM_RAMB_SLOPE_CNTL_G, 0, -+ CM_RGAM_RAMB_EXP_REGION_LINEAR_SLOPE_G, params->arr_points[0].custom_float_slope); -+ REG_SET(CM_RGAM_RAMB_SLOPE_CNTL_R, 0, -+ CM_RGAM_RAMB_EXP_REGION_LINEAR_SLOPE_R, params->arr_points[0].custom_float_slope); -+ -+ REG_SET(CM_RGAM_RAMB_END_CNTL1_B, 0, -+ CM_RGAM_RAMB_EXP_REGION_END_B, params->arr_points[1].custom_float_x); -+ REG_SET_2(CM_RGAM_RAMB_END_CNTL2_B, 0, -+ CM_RGAM_RAMB_EXP_REGION_END_SLOPE_B, params->arr_points[1].custom_float_slope, -+ CM_RGAM_RAMB_EXP_REGION_END_BASE_B, params->arr_points[1].custom_float_y); -+ -+ REG_SET(CM_RGAM_RAMB_END_CNTL1_G, 0, -+ CM_RGAM_RAMB_EXP_REGION_END_G, params->arr_points[1].custom_float_x); -+ REG_SET_2(CM_RGAM_RAMB_END_CNTL2_G, 0, -+ CM_RGAM_RAMB_EXP_REGION_END_SLOPE_G, params->arr_points[1].custom_float_slope, -+ CM_RGAM_RAMB_EXP_REGION_END_BASE_G, params->arr_points[1].custom_float_y); -+ -+ REG_SET(CM_RGAM_RAMB_END_CNTL1_R, 0, -+ CM_RGAM_RAMB_EXP_REGION_END_R, params->arr_points[1].custom_float_x); -+ REG_SET_2(CM_RGAM_RAMB_END_CNTL2_R, 0, -+ CM_RGAM_RAMB_EXP_REGION_END_SLOPE_R, params->arr_points[1].custom_float_slope, -+ CM_RGAM_RAMB_EXP_REGION_END_BASE_R, params->arr_points[1].custom_float_y); -+ -+ curve = params->arr_curve_points; -+ REG_SET_4(CM_RGAM_RAMB_REGION_0_1, 0, -+ CM_RGAM_RAMB_EXP_REGION0_LUT_OFFSET, curve[0].offset, -+ CM_RGAM_RAMB_EXP_REGION0_NUM_SEGMENTS, curve[0].segments_num, -+ CM_RGAM_RAMB_EXP_REGION1_LUT_OFFSET, curve[1].offset, -+ CM_RGAM_RAMB_EXP_REGION1_NUM_SEGMENTS, curve[1].segments_num); -+ -+ curve += 2; -+ REG_SET_4(CM_RGAM_RAMB_REGION_2_3, 0, -+ CM_RGAM_RAMB_EXP_REGION2_LUT_OFFSET, curve[0].offset, -+ CM_RGAM_RAMB_EXP_REGION2_NUM_SEGMENTS, curve[0].segments_num, -+ CM_RGAM_RAMB_EXP_REGION3_LUT_OFFSET, curve[1].offset, -+ CM_RGAM_RAMB_EXP_REGION3_NUM_SEGMENTS, curve[1].segments_num); -+ -+ curve += 2; -+ REG_SET_4(CM_RGAM_RAMB_REGION_4_5, 0, -+ CM_RGAM_RAMB_EXP_REGION4_LUT_OFFSET, curve[0].offset, -+ CM_RGAM_RAMB_EXP_REGION4_NUM_SEGMENTS, curve[0].segments_num, -+ CM_RGAM_RAMB_EXP_REGION5_LUT_OFFSET, curve[1].offset, -+ CM_RGAM_RAMB_EXP_REGION5_NUM_SEGMENTS, curve[1].segments_num); -+ -+ curve += 2; -+ REG_SET_4(CM_RGAM_RAMB_REGION_6_7, 0, -+ CM_RGAM_RAMB_EXP_REGION6_LUT_OFFSET, curve[0].offset, -+ CM_RGAM_RAMB_EXP_REGION6_NUM_SEGMENTS, curve[0].segments_num, -+ CM_RGAM_RAMB_EXP_REGION7_LUT_OFFSET, curve[1].offset, -+ CM_RGAM_RAMB_EXP_REGION7_NUM_SEGMENTS, curve[1].segments_num); -+ -+ curve += 2; -+ REG_SET_4(CM_RGAM_RAMB_REGION_8_9, 0, -+ CM_RGAM_RAMB_EXP_REGION8_LUT_OFFSET, curve[0].offset, -+ CM_RGAM_RAMB_EXP_REGION8_NUM_SEGMENTS, curve[0].segments_num, -+ CM_RGAM_RAMB_EXP_REGION9_LUT_OFFSET, curve[1].offset, -+ CM_RGAM_RAMB_EXP_REGION9_NUM_SEGMENTS, curve[1].segments_num); -+ -+ curve += 2; -+ REG_SET_4(CM_RGAM_RAMB_REGION_10_11, 0, -+ CM_RGAM_RAMB_EXP_REGION10_LUT_OFFSET, curve[0].offset, -+ CM_RGAM_RAMB_EXP_REGION10_NUM_SEGMENTS, curve[0].segments_num, -+ CM_RGAM_RAMB_EXP_REGION11_LUT_OFFSET, curve[1].offset, -+ CM_RGAM_RAMB_EXP_REGION11_NUM_SEGMENTS, curve[1].segments_num); -+ -+ curve += 2; -+ REG_SET_4(CM_RGAM_RAMB_REGION_12_13, 0, -+ CM_RGAM_RAMB_EXP_REGION12_LUT_OFFSET, curve[0].offset, -+ CM_RGAM_RAMB_EXP_REGION12_NUM_SEGMENTS, curve[0].segments_num, -+ CM_RGAM_RAMB_EXP_REGION13_LUT_OFFSET, curve[1].offset, -+ CM_RGAM_RAMB_EXP_REGION13_NUM_SEGMENTS, curve[1].segments_num); -+ -+ curve += 2; -+ REG_SET_4(CM_RGAM_RAMB_REGION_14_15, 0, -+ CM_RGAM_RAMB_EXP_REGION14_LUT_OFFSET, curve[0].offset, -+ CM_RGAM_RAMB_EXP_REGION14_NUM_SEGMENTS, curve[0].segments_num, -+ CM_RGAM_RAMB_EXP_REGION15_LUT_OFFSET, curve[1].offset, -+ CM_RGAM_RAMB_EXP_REGION15_NUM_SEGMENTS, curve[1].segments_num); -+ -+ curve += 2; -+ REG_SET_4(CM_RGAM_RAMB_REGION_16_17, 0, -+ CM_RGAM_RAMB_EXP_REGION16_LUT_OFFSET, curve[0].offset, -+ CM_RGAM_RAMB_EXP_REGION16_NUM_SEGMENTS, curve[0].segments_num, -+ CM_RGAM_RAMB_EXP_REGION17_LUT_OFFSET, curve[1].offset, -+ CM_RGAM_RAMB_EXP_REGION17_NUM_SEGMENTS, curve[1].segments_num); -+ -+ curve += 2; -+ REG_SET_4(CM_RGAM_RAMB_REGION_18_19, 0, -+ CM_RGAM_RAMB_EXP_REGION18_LUT_OFFSET, curve[0].offset, -+ CM_RGAM_RAMB_EXP_REGION18_NUM_SEGMENTS, curve[0].segments_num, -+ CM_RGAM_RAMB_EXP_REGION19_LUT_OFFSET, curve[1].offset, -+ CM_RGAM_RAMB_EXP_REGION19_NUM_SEGMENTS, curve[1].segments_num); -+ -+ curve += 2; -+ REG_SET_4(CM_RGAM_RAMB_REGION_20_21, 0, -+ CM_RGAM_RAMB_EXP_REGION20_LUT_OFFSET, curve[0].offset, -+ CM_RGAM_RAMB_EXP_REGION20_NUM_SEGMENTS, curve[0].segments_num, -+ CM_RGAM_RAMB_EXP_REGION21_LUT_OFFSET, curve[1].offset, -+ CM_RGAM_RAMB_EXP_REGION21_NUM_SEGMENTS, curve[1].segments_num); -+ -+ curve += 2; -+ REG_SET_4(CM_RGAM_RAMB_REGION_22_23, 0, -+ CM_RGAM_RAMB_EXP_REGION22_LUT_OFFSET, curve[0].offset, -+ CM_RGAM_RAMB_EXP_REGION22_NUM_SEGMENTS, curve[0].segments_num, -+ CM_RGAM_RAMB_EXP_REGION23_LUT_OFFSET, curve[1].offset, -+ CM_RGAM_RAMB_EXP_REGION23_NUM_SEGMENTS, curve[1].segments_num); -+ -+ curve += 2; -+ REG_SET_4(CM_RGAM_RAMB_REGION_24_25, 0, -+ CM_RGAM_RAMB_EXP_REGION24_LUT_OFFSET, curve[0].offset, -+ CM_RGAM_RAMB_EXP_REGION24_NUM_SEGMENTS, curve[0].segments_num, -+ CM_RGAM_RAMB_EXP_REGION25_LUT_OFFSET, curve[1].offset, -+ CM_RGAM_RAMB_EXP_REGION25_NUM_SEGMENTS, curve[1].segments_num); -+ -+ curve += 2; -+ REG_SET_4(CM_RGAM_RAMB_REGION_26_27, 0, -+ CM_RGAM_RAMB_EXP_REGION26_LUT_OFFSET, curve[0].offset, -+ CM_RGAM_RAMB_EXP_REGION26_NUM_SEGMENTS, curve[0].segments_num, -+ CM_RGAM_RAMB_EXP_REGION27_LUT_OFFSET, curve[1].offset, -+ CM_RGAM_RAMB_EXP_REGION27_NUM_SEGMENTS, curve[1].segments_num); -+ -+ curve += 2; -+ REG_SET_4(CM_RGAM_RAMB_REGION_28_29, 0, -+ CM_RGAM_RAMB_EXP_REGION28_LUT_OFFSET, curve[0].offset, -+ CM_RGAM_RAMB_EXP_REGION28_NUM_SEGMENTS, curve[0].segments_num, -+ CM_RGAM_RAMB_EXP_REGION29_LUT_OFFSET, curve[1].offset, -+ CM_RGAM_RAMB_EXP_REGION29_NUM_SEGMENTS, curve[1].segments_num); -+ -+ curve += 2; -+ REG_SET_4(CM_RGAM_RAMB_REGION_30_31, 0, -+ CM_RGAM_RAMB_EXP_REGION30_LUT_OFFSET, curve[0].offset, -+ CM_RGAM_RAMB_EXP_REGION30_NUM_SEGMENTS, curve[0].segments_num, -+ CM_RGAM_RAMB_EXP_REGION31_LUT_OFFSET, curve[1].offset, -+ CM_RGAM_RAMB_EXP_REGION31_NUM_SEGMENTS, curve[1].segments_num); -+ -+ curve += 2; -+ REG_SET_4(CM_RGAM_RAMB_REGION_32_33, 0, -+ CM_RGAM_RAMB_EXP_REGION32_LUT_OFFSET, curve[0].offset, -+ CM_RGAM_RAMB_EXP_REGION32_NUM_SEGMENTS, curve[0].segments_num, -+ CM_RGAM_RAMB_EXP_REGION33_LUT_OFFSET, curve[1].offset, -+ CM_RGAM_RAMB_EXP_REGION33_NUM_SEGMENTS, curve[1].segments_num); -+ -+} -+ -+/*program re gamma RAM A*/ -+static void opp_program_regamma_luta_settings( -+ struct output_pixel_processor *opp, -+ const struct pwl_params *params) -+{ -+ const struct gamma_curve *curve; -+ struct dcn10_opp *oppn10 = TO_DCN10_OPP(opp); -+ -+ REG_SET_2(CM_RGAM_RAMA_START_CNTL_B, 0, -+ CM_RGAM_RAMA_EXP_REGION_START_B, params->arr_points[0].custom_float_x, -+ CM_RGAM_RAMA_EXP_REGION_START_SEGMENT_B, 0); -+ REG_SET_2(CM_RGAM_RAMA_START_CNTL_G, 0, -+ CM_RGAM_RAMA_EXP_REGION_START_G, params->arr_points[0].custom_float_x, -+ CM_RGAM_RAMA_EXP_REGION_START_SEGMENT_G, 0); -+ REG_SET_2(CM_RGAM_RAMA_START_CNTL_R, 0, -+ CM_RGAM_RAMA_EXP_REGION_START_R, params->arr_points[0].custom_float_x, -+ CM_RGAM_RAMA_EXP_REGION_START_SEGMENT_R, 0); -+ -+ REG_SET(CM_RGAM_RAMA_SLOPE_CNTL_B, 0, -+ CM_RGAM_RAMA_EXP_REGION_LINEAR_SLOPE_B, params->arr_points[0].custom_float_slope); -+ REG_SET(CM_RGAM_RAMA_SLOPE_CNTL_G, 0, -+ CM_RGAM_RAMA_EXP_REGION_LINEAR_SLOPE_G, params->arr_points[0].custom_float_slope); -+ REG_SET(CM_RGAM_RAMA_SLOPE_CNTL_R, 0, -+ CM_RGAM_RAMA_EXP_REGION_LINEAR_SLOPE_R, params->arr_points[0].custom_float_slope); -+ -+ REG_SET(CM_RGAM_RAMA_END_CNTL1_B, 0, -+ CM_RGAM_RAMA_EXP_REGION_END_B, params->arr_points[1].custom_float_x); -+ REG_SET_2(CM_RGAM_RAMA_END_CNTL2_B, 0, -+ CM_RGAM_RAMA_EXP_REGION_END_SLOPE_B, params->arr_points[1].custom_float_slope, -+ CM_RGAM_RAMA_EXP_REGION_END_BASE_B, params->arr_points[1].custom_float_y); -+ -+ REG_SET(CM_RGAM_RAMA_END_CNTL1_G, 0, -+ CM_RGAM_RAMA_EXP_REGION_END_G, params->arr_points[1].custom_float_x); -+ REG_SET_2(CM_RGAM_RAMA_END_CNTL2_G, 0, -+ CM_RGAM_RAMA_EXP_REGION_END_SLOPE_G, params->arr_points[1].custom_float_slope, -+ CM_RGAM_RAMA_EXP_REGION_END_BASE_G, params->arr_points[1].custom_float_y); -+ -+ REG_SET(CM_RGAM_RAMA_END_CNTL1_R, 0, -+ CM_RGAM_RAMA_EXP_REGION_END_R, params->arr_points[1].custom_float_x); -+ REG_SET_2(CM_RGAM_RAMA_END_CNTL2_R, 0, -+ CM_RGAM_RAMA_EXP_REGION_END_SLOPE_R, params->arr_points[1].custom_float_slope, -+ CM_RGAM_RAMA_EXP_REGION_END_BASE_R, params->arr_points[1].custom_float_y); -+ -+ curve = params->arr_curve_points; -+ REG_SET_4(CM_RGAM_RAMA_REGION_0_1, 0, -+ CM_RGAM_RAMA_EXP_REGION0_LUT_OFFSET, curve[0].offset, -+ CM_RGAM_RAMA_EXP_REGION0_NUM_SEGMENTS, curve[0].segments_num, -+ CM_RGAM_RAMA_EXP_REGION1_LUT_OFFSET, curve[1].offset, -+ CM_RGAM_RAMA_EXP_REGION1_NUM_SEGMENTS, curve[1].segments_num); -+ -+ curve += 2; -+ REG_SET_4(CM_RGAM_RAMA_REGION_2_3, 0, -+ CM_RGAM_RAMA_EXP_REGION2_LUT_OFFSET, curve[0].offset, -+ CM_RGAM_RAMA_EXP_REGION2_NUM_SEGMENTS, curve[0].segments_num, -+ CM_RGAM_RAMA_EXP_REGION3_LUT_OFFSET, curve[1].offset, -+ CM_RGAM_RAMA_EXP_REGION3_NUM_SEGMENTS, curve[1].segments_num); -+ -+ curve += 2; -+ REG_SET_4(CM_RGAM_RAMA_REGION_4_5, 0, -+ CM_RGAM_RAMA_EXP_REGION4_LUT_OFFSET, curve[0].offset, -+ CM_RGAM_RAMA_EXP_REGION4_NUM_SEGMENTS, curve[0].segments_num, -+ CM_RGAM_RAMA_EXP_REGION5_LUT_OFFSET, curve[1].offset, -+ CM_RGAM_RAMA_EXP_REGION5_NUM_SEGMENTS, curve[1].segments_num); -+ -+ curve += 2; -+ REG_SET_4(CM_RGAM_RAMA_REGION_6_7, 0, -+ CM_RGAM_RAMA_EXP_REGION6_LUT_OFFSET, curve[0].offset, -+ CM_RGAM_RAMA_EXP_REGION6_NUM_SEGMENTS, curve[0].segments_num, -+ CM_RGAM_RAMA_EXP_REGION7_LUT_OFFSET, curve[1].offset, -+ CM_RGAM_RAMA_EXP_REGION7_NUM_SEGMENTS, curve[1].segments_num); -+ -+ curve += 2; -+ REG_SET_4(CM_RGAM_RAMA_REGION_8_9, 0, -+ CM_RGAM_RAMA_EXP_REGION8_LUT_OFFSET, curve[0].offset, -+ CM_RGAM_RAMA_EXP_REGION8_NUM_SEGMENTS, curve[0].segments_num, -+ CM_RGAM_RAMA_EXP_REGION9_LUT_OFFSET, curve[1].offset, -+ CM_RGAM_RAMA_EXP_REGION9_NUM_SEGMENTS, curve[1].segments_num); -+ -+ curve += 2; -+ REG_SET_4(CM_RGAM_RAMA_REGION_10_11, 0, -+ CM_RGAM_RAMA_EXP_REGION10_LUT_OFFSET, curve[0].offset, -+ CM_RGAM_RAMA_EXP_REGION10_NUM_SEGMENTS, curve[0].segments_num, -+ CM_RGAM_RAMA_EXP_REGION11_LUT_OFFSET, curve[1].offset, -+ CM_RGAM_RAMA_EXP_REGION11_NUM_SEGMENTS, curve[1].segments_num); -+ -+ curve += 2; -+ REG_SET_4(CM_RGAM_RAMA_REGION_12_13, 0, -+ CM_RGAM_RAMA_EXP_REGION12_LUT_OFFSET, curve[0].offset, -+ CM_RGAM_RAMA_EXP_REGION12_NUM_SEGMENTS, curve[0].segments_num, -+ CM_RGAM_RAMA_EXP_REGION13_LUT_OFFSET, curve[1].offset, -+ CM_RGAM_RAMA_EXP_REGION13_NUM_SEGMENTS, curve[1].segments_num); -+ -+ curve += 2; -+ REG_SET_4(CM_RGAM_RAMA_REGION_14_15, 0, -+ CM_RGAM_RAMA_EXP_REGION14_LUT_OFFSET, curve[0].offset, -+ CM_RGAM_RAMA_EXP_REGION14_NUM_SEGMENTS, curve[0].segments_num, -+ CM_RGAM_RAMA_EXP_REGION15_LUT_OFFSET, curve[1].offset, -+ CM_RGAM_RAMA_EXP_REGION15_NUM_SEGMENTS, curve[1].segments_num); -+ -+ curve += 2; -+ REG_SET_4(CM_RGAM_RAMA_REGION_16_17, 0, -+ CM_RGAM_RAMA_EXP_REGION16_LUT_OFFSET, curve[0].offset, -+ CM_RGAM_RAMA_EXP_REGION16_NUM_SEGMENTS, curve[0].segments_num, -+ CM_RGAM_RAMA_EXP_REGION17_LUT_OFFSET, curve[1].offset, -+ CM_RGAM_RAMA_EXP_REGION17_NUM_SEGMENTS, curve[1].segments_num); -+ -+ curve += 2; -+ REG_SET_4(CM_RGAM_RAMA_REGION_18_19, 0, -+ CM_RGAM_RAMA_EXP_REGION18_LUT_OFFSET, curve[0].offset, -+ CM_RGAM_RAMA_EXP_REGION18_NUM_SEGMENTS, curve[0].segments_num, -+ CM_RGAM_RAMA_EXP_REGION19_LUT_OFFSET, curve[1].offset, -+ CM_RGAM_RAMA_EXP_REGION19_NUM_SEGMENTS, curve[1].segments_num); -+ -+ curve += 2; -+ REG_SET_4(CM_RGAM_RAMA_REGION_20_21, 0, -+ CM_RGAM_RAMA_EXP_REGION20_LUT_OFFSET, curve[0].offset, -+ CM_RGAM_RAMA_EXP_REGION20_NUM_SEGMENTS, curve[0].segments_num, -+ CM_RGAM_RAMA_EXP_REGION21_LUT_OFFSET, curve[1].offset, -+ CM_RGAM_RAMA_EXP_REGION21_NUM_SEGMENTS, curve[1].segments_num); -+ -+ curve += 2; -+ REG_SET_4(CM_RGAM_RAMA_REGION_22_23, 0, -+ CM_RGAM_RAMA_EXP_REGION22_LUT_OFFSET, curve[0].offset, -+ CM_RGAM_RAMA_EXP_REGION22_NUM_SEGMENTS, curve[0].segments_num, -+ CM_RGAM_RAMA_EXP_REGION23_LUT_OFFSET, curve[1].offset, -+ CM_RGAM_RAMA_EXP_REGION23_NUM_SEGMENTS, curve[1].segments_num); -+ -+ curve += 2; -+ REG_SET_4(CM_RGAM_RAMA_REGION_24_25, 0, -+ CM_RGAM_RAMA_EXP_REGION24_LUT_OFFSET, curve[0].offset, -+ CM_RGAM_RAMA_EXP_REGION24_NUM_SEGMENTS, curve[0].segments_num, -+ CM_RGAM_RAMA_EXP_REGION25_LUT_OFFSET, curve[1].offset, -+ CM_RGAM_RAMA_EXP_REGION25_NUM_SEGMENTS, curve[1].segments_num); -+ -+ curve += 2; -+ REG_SET_4(CM_RGAM_RAMA_REGION_26_27, 0, -+ CM_RGAM_RAMA_EXP_REGION26_LUT_OFFSET, curve[0].offset, -+ CM_RGAM_RAMA_EXP_REGION26_NUM_SEGMENTS, curve[0].segments_num, -+ CM_RGAM_RAMA_EXP_REGION27_LUT_OFFSET, curve[1].offset, -+ CM_RGAM_RAMA_EXP_REGION27_NUM_SEGMENTS, curve[1].segments_num); -+ -+ curve += 2; -+ REG_SET_4(CM_RGAM_RAMA_REGION_28_29, 0, -+ CM_RGAM_RAMA_EXP_REGION28_LUT_OFFSET, curve[0].offset, -+ CM_RGAM_RAMA_EXP_REGION28_NUM_SEGMENTS, curve[0].segments_num, -+ CM_RGAM_RAMA_EXP_REGION29_LUT_OFFSET, curve[1].offset, -+ CM_RGAM_RAMA_EXP_REGION29_NUM_SEGMENTS, curve[1].segments_num); -+ -+ curve += 2; -+ REG_SET_4(CM_RGAM_RAMA_REGION_30_31, 0, -+ CM_RGAM_RAMA_EXP_REGION30_LUT_OFFSET, curve[0].offset, -+ CM_RGAM_RAMA_EXP_REGION30_NUM_SEGMENTS, curve[0].segments_num, -+ CM_RGAM_RAMA_EXP_REGION31_LUT_OFFSET, curve[1].offset, -+ CM_RGAM_RAMA_EXP_REGION31_NUM_SEGMENTS, curve[1].segments_num); -+ -+ curve += 2; -+ REG_SET_4(CM_RGAM_RAMA_REGION_32_33, 0, -+ CM_RGAM_RAMA_EXP_REGION32_LUT_OFFSET, curve[0].offset, -+ CM_RGAM_RAMA_EXP_REGION32_NUM_SEGMENTS, curve[0].segments_num, -+ CM_RGAM_RAMA_EXP_REGION33_LUT_OFFSET, curve[1].offset, -+ CM_RGAM_RAMA_EXP_REGION33_NUM_SEGMENTS, curve[1].segments_num); -+} -+ -+static void opp_configure_regamma_lut( -+ struct output_pixel_processor *opp, -+ bool is_ram_a) -+{ -+ struct dcn10_opp *oppn10 = TO_DCN10_OPP(opp); -+ -+ REG_UPDATE(CM_RGAM_LUT_WRITE_EN_MASK, -+ CM_RGAM_LUT_WRITE_EN_MASK, 7); -+ REG_UPDATE(CM_RGAM_LUT_WRITE_EN_MASK, -+ CM_RGAM_LUT_WRITE_SEL, is_ram_a == true ? 0:1); -+ REG_SET(CM_RGAM_LUT_INDEX, 0, CM_RGAM_LUT_INDEX, 0); -+} -+ -+static void opp_power_on_regamma_lut( -+ struct output_pixel_processor *opp, -+ bool power_on) -+{ -+ struct dcn10_opp *oppn10 = TO_DCN10_OPP(opp); -+ REG_SET(CM_MEM_PWR_CTRL, 0, -+ RGAM_MEM_PWR_FORCE, power_on == true ? 0:1); -+ -+} -+ -+static void opp_program_regamma_lut( -+ struct output_pixel_processor *opp, -+ const struct pwl_result_data *rgb, -+ uint32_t num) -+{ -+ uint32_t i; -+ struct dcn10_opp *oppn10 = TO_DCN10_OPP(opp); -+ for (i = 0 ; i < num; i++) { -+ REG_SET(CM_RGAM_LUT_DATA, 0, CM_RGAM_LUT_DATA, rgb[i].red_reg); -+ REG_SET(CM_RGAM_LUT_DATA, 0, CM_RGAM_LUT_DATA, rgb[i].green_reg); -+ REG_SET(CM_RGAM_LUT_DATA, 0, CM_RGAM_LUT_DATA, rgb[i].blue_reg); -+ -+ REG_SET(CM_RGAM_LUT_DATA, 0, -+ CM_RGAM_LUT_DATA, rgb[i].delta_red_reg); -+ REG_SET(CM_RGAM_LUT_DATA, 0, -+ CM_RGAM_LUT_DATA, rgb[i].delta_green_reg); -+ REG_SET(CM_RGAM_LUT_DATA, 0, -+ CM_RGAM_LUT_DATA, rgb[i].delta_blue_reg); -+ -+ } -+ -+} -+ -+static bool opp_set_regamma_pwl( -+ struct output_pixel_processor *opp, const struct pwl_params *params) -+{ -+ struct dcn10_opp *oppn10 = TO_DCN10_OPP(opp); -+ -+ opp_power_on_regamma_lut(opp, true); -+ opp_configure_regamma_lut(opp, oppn10->is_write_to_ram_a_safe); -+ -+ if (oppn10->is_write_to_ram_a_safe) -+ opp_program_regamma_luta_settings(opp, params); -+ else -+ opp_program_regamma_lutb_settings(opp, params); -+ -+ opp_program_regamma_lut( -+ opp, params->rgb_resulted, params->hw_points_num); -+ -+ return true; -+} -+ -+static void opp_set_stereo_polarity( -+ struct output_pixel_processor *opp, -+ bool enable, bool rightEyePolarity) -+{ -+ struct dcn10_opp *oppn10 = TO_DCN10_OPP(opp); -+ -+ REG_UPDATE(FMT_CONTROL, FMT_STEREOSYNC_OVERRIDE, enable); -+} -+ -+/*****************************************/ -+/* Constructor, Destructor */ -+/*****************************************/ -+ -+static void dcn10_opp_destroy(struct output_pixel_processor **opp) -+{ -+ dm_free(TO_DCN10_OPP(*opp)); -+ *opp = NULL; -+} -+ -+static struct opp_funcs dcn10_opp_funcs = { -+ .opp_power_on_regamma_lut = opp_power_on_regamma_lut, -+ .opp_set_csc_adjustment = NULL, -+ .opp_set_csc_default = opp_set_output_csc_default, -+ .opp_set_dyn_expansion = opp_set_dyn_expansion, -+ .opp_program_regamma_pwl = opp_set_regamma_pwl, -+ .opp_set_regamma_mode = opp_set_regamma_mode, -+ .opp_program_fmt = opp_program_fmt, -+ .opp_program_bit_depth_reduction = opp_program_bit_depth_reduction, -+ .opp_set_stereo_polarity = opp_set_stereo_polarity, -+ .opp_destroy = dcn10_opp_destroy -+}; -+ -+void dcn10_opp_construct(struct dcn10_opp *oppn10, -+ struct dc_context *ctx, -+ uint32_t inst, -+ const struct dcn10_opp_registers *regs, -+ const struct dcn10_opp_shift *opp_shift, -+ const struct dcn10_opp_mask *opp_mask) -+{ -+ oppn10->base.ctx = ctx; -+ oppn10->base.inst = inst; -+ oppn10->base.funcs = &dcn10_opp_funcs; -+ -+ oppn10->regs = regs; -+ oppn10->opp_shift = opp_shift; -+ oppn10->opp_mask = opp_mask; -+} -diff --git a/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_opp.h b/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_opp.h -new file mode 100644 -index 0000000..113e0bc ---- /dev/null -+++ b/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_opp.h -@@ -0,0 +1,622 @@ -+/* 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_OPP_DCN10_H__ -+#define __DC_OPP_DCN10_H__ -+ -+#include "opp.h" -+ -+#define TO_DCN10_OPP(opp)\ -+ container_of(opp, struct dcn10_opp, base) -+ -+#define OPP_SF(reg_name, field_name, post_fix)\ -+ .field_name = reg_name ## __ ## field_name ## post_fix -+ -+#define OPP_DCN10_REG_LIST(id) \ -+ SRI(CM_RGAM_LUT_WRITE_EN_MASK, CM, id), \ -+ SRI(CM_RGAM_CONTROL, CM, id), \ -+ SRI(OBUF_CONTROL, DSCL, id), \ -+ SRI(FMT_BIT_DEPTH_CONTROL, FMT, id), \ -+ SRI(FMT_CONTROL, FMT, id), \ -+ SRI(FMT_DITHER_RAND_R_SEED, FMT, id), \ -+ SRI(FMT_DITHER_RAND_G_SEED, FMT, id), \ -+ SRI(FMT_DITHER_RAND_B_SEED, FMT, id), \ -+ SRI(FMT_CLAMP_CNTL, FMT, id), \ -+ SRI(FMT_DYNAMIC_EXP_CNTL, FMT, id), \ -+ SRI(FMT_MAP420_MEMORY_CONTROL, FMT, id), \ -+ SRI(CM_OCSC_CONTROL, CM, id), \ -+ SRI(CM_RGAM_RAMB_START_CNTL_B, CM, id), \ -+ SRI(CM_RGAM_RAMB_START_CNTL_G, CM, id), \ -+ SRI(CM_RGAM_RAMB_START_CNTL_R, CM, id), \ -+ SRI(CM_RGAM_RAMB_SLOPE_CNTL_B, CM, id), \ -+ SRI(CM_RGAM_RAMB_SLOPE_CNTL_G, CM, id), \ -+ SRI(CM_RGAM_RAMB_SLOPE_CNTL_R, CM, id), \ -+ SRI(CM_RGAM_RAMB_END_CNTL1_B, CM, id), \ -+ SRI(CM_RGAM_RAMB_END_CNTL2_B, CM, id), \ -+ SRI(CM_RGAM_RAMB_END_CNTL1_G, CM, id), \ -+ SRI(CM_RGAM_RAMB_END_CNTL2_G, CM, id), \ -+ SRI(CM_RGAM_RAMB_END_CNTL1_R, CM, id), \ -+ SRI(CM_RGAM_RAMB_END_CNTL2_R, CM, id), \ -+ SRI(CM_RGAM_RAMB_REGION_0_1, CM, id), \ -+ SRI(CM_RGAM_RAMB_REGION_2_3, CM, id), \ -+ SRI(CM_RGAM_RAMB_REGION_4_5, CM, id), \ -+ SRI(CM_RGAM_RAMB_REGION_6_7, CM, id), \ -+ SRI(CM_RGAM_RAMB_REGION_8_9, CM, id), \ -+ SRI(CM_RGAM_RAMB_REGION_10_11, CM, id), \ -+ SRI(CM_RGAM_RAMB_REGION_12_13, CM, id), \ -+ SRI(CM_RGAM_RAMB_REGION_14_15, CM, id), \ -+ SRI(CM_RGAM_RAMB_REGION_16_17, CM, id), \ -+ SRI(CM_RGAM_RAMB_REGION_18_19, CM, id), \ -+ SRI(CM_RGAM_RAMB_REGION_20_21, CM, id), \ -+ SRI(CM_RGAM_RAMB_REGION_22_23, CM, id), \ -+ SRI(CM_RGAM_RAMB_REGION_24_25, CM, id), \ -+ SRI(CM_RGAM_RAMB_REGION_26_27, CM, id), \ -+ SRI(CM_RGAM_RAMB_REGION_28_29, CM, id), \ -+ SRI(CM_RGAM_RAMB_REGION_30_31, CM, id), \ -+ SRI(CM_RGAM_RAMB_REGION_32_33, CM, id), \ -+ SRI(CM_RGAM_RAMA_START_CNTL_B, CM, id), \ -+ SRI(CM_RGAM_RAMA_START_CNTL_G, CM, id), \ -+ SRI(CM_RGAM_RAMA_START_CNTL_R, CM, id), \ -+ SRI(CM_RGAM_RAMA_SLOPE_CNTL_B, CM, id), \ -+ SRI(CM_RGAM_RAMA_SLOPE_CNTL_G, CM, id), \ -+ SRI(CM_RGAM_RAMA_SLOPE_CNTL_R, CM, id), \ -+ SRI(CM_RGAM_RAMA_END_CNTL1_B, CM, id), \ -+ SRI(CM_RGAM_RAMA_END_CNTL2_B, CM, id), \ -+ SRI(CM_RGAM_RAMA_END_CNTL1_G, CM, id), \ -+ SRI(CM_RGAM_RAMA_END_CNTL2_G, CM, id), \ -+ SRI(CM_RGAM_RAMA_END_CNTL1_R, CM, id), \ -+ SRI(CM_RGAM_RAMA_END_CNTL2_R, CM, id), \ -+ SRI(CM_RGAM_RAMA_REGION_0_1, CM, id), \ -+ SRI(CM_RGAM_RAMA_REGION_2_3, CM, id), \ -+ SRI(CM_RGAM_RAMA_REGION_4_5, CM, id), \ -+ SRI(CM_RGAM_RAMA_REGION_6_7, CM, id), \ -+ SRI(CM_RGAM_RAMA_REGION_8_9, CM, id), \ -+ SRI(CM_RGAM_RAMA_REGION_10_11, CM, id), \ -+ SRI(CM_RGAM_RAMA_REGION_12_13, CM, id), \ -+ SRI(CM_RGAM_RAMA_REGION_14_15, CM, id), \ -+ SRI(CM_RGAM_RAMA_REGION_16_17, CM, id), \ -+ SRI(CM_RGAM_RAMA_REGION_18_19, CM, id), \ -+ SRI(CM_RGAM_RAMA_REGION_20_21, CM, id), \ -+ SRI(CM_RGAM_RAMA_REGION_22_23, CM, id), \ -+ SRI(CM_RGAM_RAMA_REGION_24_25, CM, id), \ -+ SRI(CM_RGAM_RAMA_REGION_26_27, CM, id), \ -+ SRI(CM_RGAM_RAMA_REGION_28_29, CM, id), \ -+ SRI(CM_RGAM_RAMA_REGION_30_31, CM, id), \ -+ SRI(CM_RGAM_RAMA_REGION_32_33, CM, id), \ -+ SRI(CM_RGAM_LUT_INDEX, CM, id), \ -+ SRI(CM_MEM_PWR_CTRL, CM, id), \ -+ SRI(CM_RGAM_LUT_DATA, CM, id) -+ -+#define OPP_DCN10_MASK_SH_LIST(mask_sh) \ -+ OPP_SF(CM0_CM_RGAM_CONTROL, CM_RGAM_LUT_MODE, mask_sh), \ -+ OPP_SF(DSCL0_OBUF_CONTROL, OBUF_BYPASS, mask_sh), \ -+ OPP_SF(DSCL0_OBUF_CONTROL, OBUF_H_2X_UPSCALE_EN, mask_sh), \ -+ OPP_SF(FMT0_FMT_BIT_DEPTH_CONTROL, FMT_TRUNCATE_EN, mask_sh), \ -+ OPP_SF(FMT0_FMT_BIT_DEPTH_CONTROL, FMT_TRUNCATE_DEPTH, mask_sh), \ -+ OPP_SF(FMT0_FMT_BIT_DEPTH_CONTROL, FMT_TRUNCATE_MODE, mask_sh), \ -+ OPP_SF(FMT0_FMT_BIT_DEPTH_CONTROL, FMT_SPATIAL_DITHER_EN, mask_sh), \ -+ OPP_SF(FMT0_FMT_BIT_DEPTH_CONTROL, FMT_SPATIAL_DITHER_MODE, mask_sh), \ -+ OPP_SF(FMT0_FMT_BIT_DEPTH_CONTROL, FMT_SPATIAL_DITHER_DEPTH, mask_sh), \ -+ OPP_SF(FMT0_FMT_BIT_DEPTH_CONTROL, FMT_TEMPORAL_DITHER_EN, mask_sh), \ -+ OPP_SF(FMT0_FMT_BIT_DEPTH_CONTROL, FMT_HIGHPASS_RANDOM_ENABLE, mask_sh), \ -+ OPP_SF(FMT0_FMT_BIT_DEPTH_CONTROL, FMT_FRAME_RANDOM_ENABLE, mask_sh), \ -+ OPP_SF(FMT0_FMT_BIT_DEPTH_CONTROL, FMT_RGB_RANDOM_ENABLE, mask_sh), \ -+ OPP_SF(FMT0_FMT_CONTROL, FMT_SPATIAL_DITHER_FRAME_COUNTER_MAX, mask_sh), \ -+ OPP_SF(FMT0_FMT_CONTROL, FMT_SPATIAL_DITHER_FRAME_COUNTER_BIT_SWAP, mask_sh), \ -+ OPP_SF(FMT0_FMT_DITHER_RAND_R_SEED, FMT_RAND_R_SEED, mask_sh), \ -+ OPP_SF(FMT0_FMT_DITHER_RAND_G_SEED, FMT_RAND_G_SEED, mask_sh), \ -+ OPP_SF(FMT0_FMT_DITHER_RAND_B_SEED, FMT_RAND_B_SEED, mask_sh), \ -+ OPP_SF(FMT0_FMT_CONTROL, FMT_PIXEL_ENCODING, mask_sh), \ -+ OPP_SF(FMT0_FMT_CLAMP_CNTL, FMT_CLAMP_DATA_EN, mask_sh), \ -+ OPP_SF(FMT0_FMT_CLAMP_CNTL, FMT_CLAMP_COLOR_FORMAT, mask_sh), \ -+ OPP_SF(FMT0_FMT_DYNAMIC_EXP_CNTL, FMT_DYNAMIC_EXP_EN, mask_sh), \ -+ OPP_SF(FMT0_FMT_DYNAMIC_EXP_CNTL, FMT_DYNAMIC_EXP_MODE, mask_sh), \ -+ OPP_SF(FMT0_FMT_MAP420_MEMORY_CONTROL, FMT_MAP420MEM_PWR_FORCE, mask_sh), \ -+ OPP_SF(CM0_CM_OCSC_CONTROL, CM_OCSC_MODE, mask_sh), \ -+ OPP_SF(CM0_CM_RGAM_RAMB_START_CNTL_B, CM_RGAM_RAMB_EXP_REGION_START_B, mask_sh), \ -+ OPP_SF(CM0_CM_RGAM_RAMB_START_CNTL_B, CM_RGAM_RAMB_EXP_REGION_START_SEGMENT_B, mask_sh), \ -+ OPP_SF(CM0_CM_RGAM_RAMB_START_CNTL_G, CM_RGAM_RAMB_EXP_REGION_START_G, mask_sh), \ -+ OPP_SF(CM0_CM_RGAM_RAMB_START_CNTL_G, CM_RGAM_RAMB_EXP_REGION_START_SEGMENT_G, mask_sh), \ -+ OPP_SF(CM0_CM_RGAM_RAMB_START_CNTL_R, CM_RGAM_RAMB_EXP_REGION_START_R, mask_sh), \ -+ OPP_SF(CM0_CM_RGAM_RAMB_START_CNTL_R, CM_RGAM_RAMB_EXP_REGION_START_SEGMENT_R, mask_sh), \ -+ OPP_SF(CM0_CM_RGAM_RAMB_SLOPE_CNTL_B, CM_RGAM_RAMB_EXP_REGION_LINEAR_SLOPE_B, mask_sh), \ -+ OPP_SF(CM0_CM_RGAM_RAMB_SLOPE_CNTL_G, CM_RGAM_RAMB_EXP_REGION_LINEAR_SLOPE_G, mask_sh), \ -+ OPP_SF(CM0_CM_RGAM_RAMB_SLOPE_CNTL_R, CM_RGAM_RAMB_EXP_REGION_LINEAR_SLOPE_R, mask_sh), \ -+ OPP_SF(CM0_CM_RGAM_RAMB_END_CNTL1_B, CM_RGAM_RAMB_EXP_REGION_END_B, mask_sh), \ -+ OPP_SF(CM0_CM_RGAM_RAMB_END_CNTL2_B, CM_RGAM_RAMB_EXP_REGION_END_SLOPE_B, mask_sh), \ -+ OPP_SF(CM0_CM_RGAM_RAMB_END_CNTL2_B, CM_RGAM_RAMB_EXP_REGION_END_BASE_B, mask_sh), \ -+ OPP_SF(CM0_CM_RGAM_RAMB_END_CNTL1_G, CM_RGAM_RAMB_EXP_REGION_END_G, mask_sh), \ -+ OPP_SF(CM0_CM_RGAM_RAMB_END_CNTL2_G, CM_RGAM_RAMB_EXP_REGION_END_SLOPE_G, mask_sh), \ -+ OPP_SF(CM0_CM_RGAM_RAMB_END_CNTL2_G, CM_RGAM_RAMB_EXP_REGION_END_BASE_G, mask_sh), \ -+ OPP_SF(CM0_CM_RGAM_RAMB_END_CNTL1_R, CM_RGAM_RAMB_EXP_REGION_END_R, mask_sh), \ -+ OPP_SF(CM0_CM_RGAM_RAMB_END_CNTL2_R, CM_RGAM_RAMB_EXP_REGION_END_SLOPE_R, mask_sh), \ -+ OPP_SF(CM0_CM_RGAM_RAMB_END_CNTL2_R, CM_RGAM_RAMB_EXP_REGION_END_BASE_R, mask_sh), \ -+ OPP_SF(CM0_CM_RGAM_RAMB_REGION_0_1, CM_RGAM_RAMB_EXP_REGION0_LUT_OFFSET, mask_sh), \ -+ OPP_SF(CM0_CM_RGAM_RAMB_REGION_0_1, CM_RGAM_RAMB_EXP_REGION0_NUM_SEGMENTS, mask_sh), \ -+ OPP_SF(CM0_CM_RGAM_RAMB_REGION_0_1, CM_RGAM_RAMB_EXP_REGION1_LUT_OFFSET, mask_sh), \ -+ OPP_SF(CM0_CM_RGAM_RAMB_REGION_0_1, CM_RGAM_RAMB_EXP_REGION1_NUM_SEGMENTS, mask_sh), \ -+ OPP_SF(CM0_CM_RGAM_RAMB_REGION_2_3, CM_RGAM_RAMB_EXP_REGION2_LUT_OFFSET, mask_sh), \ -+ OPP_SF(CM0_CM_RGAM_RAMB_REGION_2_3, CM_RGAM_RAMB_EXP_REGION2_NUM_SEGMENTS, mask_sh), \ -+ OPP_SF(CM0_CM_RGAM_RAMB_REGION_2_3, CM_RGAM_RAMB_EXP_REGION3_LUT_OFFSET, mask_sh), \ -+ OPP_SF(CM0_CM_RGAM_RAMB_REGION_2_3, CM_RGAM_RAMB_EXP_REGION3_NUM_SEGMENTS, mask_sh), \ -+ OPP_SF(CM0_CM_RGAM_RAMB_REGION_4_5, CM_RGAM_RAMB_EXP_REGION4_LUT_OFFSET, mask_sh), \ -+ OPP_SF(CM0_CM_RGAM_RAMB_REGION_4_5, CM_RGAM_RAMB_EXP_REGION4_NUM_SEGMENTS, mask_sh), \ -+ OPP_SF(CM0_CM_RGAM_RAMB_REGION_4_5, CM_RGAM_RAMB_EXP_REGION5_LUT_OFFSET, mask_sh), \ -+ OPP_SF(CM0_CM_RGAM_RAMB_REGION_4_5, CM_RGAM_RAMB_EXP_REGION5_NUM_SEGMENTS, mask_sh), \ -+ OPP_SF(CM0_CM_RGAM_RAMB_REGION_6_7, CM_RGAM_RAMB_EXP_REGION6_LUT_OFFSET, mask_sh), \ -+ OPP_SF(CM0_CM_RGAM_RAMB_REGION_6_7, CM_RGAM_RAMB_EXP_REGION6_NUM_SEGMENTS, mask_sh), \ -+ OPP_SF(CM0_CM_RGAM_RAMB_REGION_6_7, CM_RGAM_RAMB_EXP_REGION7_LUT_OFFSET, mask_sh), \ -+ OPP_SF(CM0_CM_RGAM_RAMB_REGION_6_7, CM_RGAM_RAMB_EXP_REGION7_NUM_SEGMENTS, mask_sh), \ -+ OPP_SF(CM0_CM_RGAM_RAMB_REGION_8_9, CM_RGAM_RAMB_EXP_REGION8_LUT_OFFSET, mask_sh), \ -+ OPP_SF(CM0_CM_RGAM_RAMB_REGION_8_9, CM_RGAM_RAMB_EXP_REGION8_NUM_SEGMENTS, mask_sh), \ -+ OPP_SF(CM0_CM_RGAM_RAMB_REGION_8_9, CM_RGAM_RAMB_EXP_REGION9_LUT_OFFSET, mask_sh), \ -+ OPP_SF(CM0_CM_RGAM_RAMB_REGION_8_9, CM_RGAM_RAMB_EXP_REGION9_NUM_SEGMENTS, mask_sh), \ -+ OPP_SF(CM0_CM_RGAM_RAMB_REGION_10_11, CM_RGAM_RAMB_EXP_REGION10_LUT_OFFSET, mask_sh), \ -+ OPP_SF(CM0_CM_RGAM_RAMB_REGION_10_11, CM_RGAM_RAMB_EXP_REGION10_NUM_SEGMENTS, mask_sh), \ -+ OPP_SF(CM0_CM_RGAM_RAMB_REGION_10_11, CM_RGAM_RAMB_EXP_REGION11_LUT_OFFSET, mask_sh), \ -+ OPP_SF(CM0_CM_RGAM_RAMB_REGION_10_11, CM_RGAM_RAMB_EXP_REGION11_NUM_SEGMENTS, mask_sh), \ -+ OPP_SF(CM0_CM_RGAM_RAMB_REGION_12_13, CM_RGAM_RAMB_EXP_REGION12_LUT_OFFSET, mask_sh), \ -+ OPP_SF(CM0_CM_RGAM_RAMB_REGION_12_13, CM_RGAM_RAMB_EXP_REGION12_NUM_SEGMENTS, mask_sh), \ -+ OPP_SF(CM0_CM_RGAM_RAMB_REGION_12_13, CM_RGAM_RAMB_EXP_REGION13_LUT_OFFSET, mask_sh), \ -+ OPP_SF(CM0_CM_RGAM_RAMB_REGION_12_13, CM_RGAM_RAMB_EXP_REGION13_NUM_SEGMENTS, mask_sh), \ -+ OPP_SF(CM0_CM_RGAM_RAMB_REGION_14_15, CM_RGAM_RAMB_EXP_REGION14_LUT_OFFSET, mask_sh), \ -+ OPP_SF(CM0_CM_RGAM_RAMB_REGION_14_15, CM_RGAM_RAMB_EXP_REGION14_NUM_SEGMENTS, mask_sh), \ -+ OPP_SF(CM0_CM_RGAM_RAMB_REGION_14_15, CM_RGAM_RAMB_EXP_REGION15_LUT_OFFSET, mask_sh), \ -+ OPP_SF(CM0_CM_RGAM_RAMB_REGION_14_15, CM_RGAM_RAMB_EXP_REGION15_NUM_SEGMENTS, mask_sh), \ -+ OPP_SF(CM0_CM_RGAM_RAMB_REGION_16_17, CM_RGAM_RAMB_EXP_REGION16_LUT_OFFSET, mask_sh), \ -+ OPP_SF(CM0_CM_RGAM_RAMB_REGION_16_17, CM_RGAM_RAMB_EXP_REGION16_NUM_SEGMENTS, mask_sh), \ -+ OPP_SF(CM0_CM_RGAM_RAMB_REGION_16_17, CM_RGAM_RAMB_EXP_REGION17_LUT_OFFSET, mask_sh), \ -+ OPP_SF(CM0_CM_RGAM_RAMB_REGION_16_17, CM_RGAM_RAMB_EXP_REGION17_NUM_SEGMENTS, mask_sh), \ -+ OPP_SF(CM0_CM_RGAM_RAMB_REGION_18_19, CM_RGAM_RAMB_EXP_REGION18_LUT_OFFSET, mask_sh), \ -+ OPP_SF(CM0_CM_RGAM_RAMB_REGION_18_19, CM_RGAM_RAMB_EXP_REGION18_NUM_SEGMENTS, mask_sh), \ -+ OPP_SF(CM0_CM_RGAM_RAMB_REGION_18_19, CM_RGAM_RAMB_EXP_REGION19_LUT_OFFSET, mask_sh), \ -+ OPP_SF(CM0_CM_RGAM_RAMB_REGION_18_19, CM_RGAM_RAMB_EXP_REGION19_NUM_SEGMENTS, mask_sh), \ -+ OPP_SF(CM0_CM_RGAM_RAMB_REGION_20_21, CM_RGAM_RAMB_EXP_REGION20_LUT_OFFSET, mask_sh), \ -+ OPP_SF(CM0_CM_RGAM_RAMB_REGION_20_21, CM_RGAM_RAMB_EXP_REGION20_NUM_SEGMENTS, mask_sh), \ -+ OPP_SF(CM0_CM_RGAM_RAMB_REGION_20_21, CM_RGAM_RAMB_EXP_REGION21_LUT_OFFSET, mask_sh), \ -+ OPP_SF(CM0_CM_RGAM_RAMB_REGION_20_21, CM_RGAM_RAMB_EXP_REGION21_NUM_SEGMENTS, mask_sh), \ -+ OPP_SF(CM0_CM_RGAM_RAMB_REGION_22_23, CM_RGAM_RAMB_EXP_REGION22_LUT_OFFSET, mask_sh), \ -+ OPP_SF(CM0_CM_RGAM_RAMB_REGION_22_23, CM_RGAM_RAMB_EXP_REGION22_NUM_SEGMENTS, mask_sh), \ -+ OPP_SF(CM0_CM_RGAM_RAMB_REGION_22_23, CM_RGAM_RAMB_EXP_REGION23_LUT_OFFSET, mask_sh), \ -+ OPP_SF(CM0_CM_RGAM_RAMB_REGION_22_23, CM_RGAM_RAMB_EXP_REGION23_NUM_SEGMENTS, mask_sh), \ -+ OPP_SF(CM0_CM_RGAM_RAMB_REGION_24_25, CM_RGAM_RAMB_EXP_REGION24_LUT_OFFSET, mask_sh), \ -+ OPP_SF(CM0_CM_RGAM_RAMB_REGION_24_25, CM_RGAM_RAMB_EXP_REGION24_NUM_SEGMENTS, mask_sh), \ -+ OPP_SF(CM0_CM_RGAM_RAMB_REGION_24_25, CM_RGAM_RAMB_EXP_REGION25_LUT_OFFSET, mask_sh), \ -+ OPP_SF(CM0_CM_RGAM_RAMB_REGION_24_25, CM_RGAM_RAMB_EXP_REGION25_NUM_SEGMENTS, mask_sh), \ -+ OPP_SF(CM0_CM_RGAM_RAMB_REGION_26_27, CM_RGAM_RAMB_EXP_REGION26_LUT_OFFSET, mask_sh), \ -+ OPP_SF(CM0_CM_RGAM_RAMB_REGION_26_27, CM_RGAM_RAMB_EXP_REGION26_NUM_SEGMENTS, mask_sh), \ -+ OPP_SF(CM0_CM_RGAM_RAMB_REGION_26_27, CM_RGAM_RAMB_EXP_REGION27_LUT_OFFSET, mask_sh), \ -+ OPP_SF(CM0_CM_RGAM_RAMB_REGION_26_27, CM_RGAM_RAMB_EXP_REGION27_NUM_SEGMENTS, mask_sh), \ -+ OPP_SF(CM0_CM_RGAM_RAMB_REGION_28_29, CM_RGAM_RAMB_EXP_REGION28_LUT_OFFSET, mask_sh), \ -+ OPP_SF(CM0_CM_RGAM_RAMB_REGION_28_29, CM_RGAM_RAMB_EXP_REGION28_NUM_SEGMENTS, mask_sh), \ -+ OPP_SF(CM0_CM_RGAM_RAMB_REGION_28_29, CM_RGAM_RAMB_EXP_REGION29_LUT_OFFSET, mask_sh), \ -+ OPP_SF(CM0_CM_RGAM_RAMB_REGION_28_29, CM_RGAM_RAMB_EXP_REGION29_NUM_SEGMENTS, mask_sh), \ -+ OPP_SF(CM0_CM_RGAM_RAMB_REGION_30_31, CM_RGAM_RAMB_EXP_REGION30_LUT_OFFSET, mask_sh), \ -+ OPP_SF(CM0_CM_RGAM_RAMB_REGION_30_31, CM_RGAM_RAMB_EXP_REGION30_NUM_SEGMENTS, mask_sh), \ -+ OPP_SF(CM0_CM_RGAM_RAMB_REGION_30_31, CM_RGAM_RAMB_EXP_REGION31_LUT_OFFSET, mask_sh), \ -+ OPP_SF(CM0_CM_RGAM_RAMB_REGION_30_31, CM_RGAM_RAMB_EXP_REGION31_NUM_SEGMENTS, mask_sh), \ -+ OPP_SF(CM0_CM_RGAM_RAMB_REGION_32_33, CM_RGAM_RAMB_EXP_REGION32_LUT_OFFSET, mask_sh), \ -+ OPP_SF(CM0_CM_RGAM_RAMB_REGION_32_33, CM_RGAM_RAMB_EXP_REGION32_NUM_SEGMENTS, mask_sh), \ -+ OPP_SF(CM0_CM_RGAM_RAMB_REGION_32_33, CM_RGAM_RAMB_EXP_REGION33_LUT_OFFSET, mask_sh), \ -+ OPP_SF(CM0_CM_RGAM_RAMB_REGION_32_33, CM_RGAM_RAMB_EXP_REGION33_NUM_SEGMENTS, mask_sh), \ -+ OPP_SF(CM0_CM_RGAM_RAMA_START_CNTL_B, CM_RGAM_RAMA_EXP_REGION_START_B, mask_sh), \ -+ OPP_SF(CM0_CM_RGAM_RAMA_START_CNTL_B, CM_RGAM_RAMA_EXP_REGION_START_SEGMENT_B, mask_sh), \ -+ OPP_SF(CM0_CM_RGAM_RAMA_START_CNTL_G, CM_RGAM_RAMA_EXP_REGION_START_G, mask_sh), \ -+ OPP_SF(CM0_CM_RGAM_RAMA_START_CNTL_G, CM_RGAM_RAMA_EXP_REGION_START_SEGMENT_G, mask_sh), \ -+ OPP_SF(CM0_CM_RGAM_RAMA_START_CNTL_R, CM_RGAM_RAMA_EXP_REGION_START_R, mask_sh), \ -+ OPP_SF(CM0_CM_RGAM_RAMA_START_CNTL_R, CM_RGAM_RAMA_EXP_REGION_START_SEGMENT_R, mask_sh), \ -+ OPP_SF(CM0_CM_RGAM_RAMA_SLOPE_CNTL_B, CM_RGAM_RAMA_EXP_REGION_LINEAR_SLOPE_B, mask_sh), \ -+ OPP_SF(CM0_CM_RGAM_RAMA_SLOPE_CNTL_G, CM_RGAM_RAMA_EXP_REGION_LINEAR_SLOPE_G, mask_sh), \ -+ OPP_SF(CM0_CM_RGAM_RAMA_SLOPE_CNTL_R, CM_RGAM_RAMA_EXP_REGION_LINEAR_SLOPE_R, mask_sh), \ -+ OPP_SF(CM0_CM_RGAM_RAMA_END_CNTL1_B, CM_RGAM_RAMA_EXP_REGION_END_B, mask_sh), \ -+ OPP_SF(CM0_CM_RGAM_RAMA_END_CNTL2_B, CM_RGAM_RAMA_EXP_REGION_END_SLOPE_B, mask_sh), \ -+ OPP_SF(CM0_CM_RGAM_RAMA_END_CNTL2_B, CM_RGAM_RAMA_EXP_REGION_END_BASE_B, mask_sh), \ -+ OPP_SF(CM0_CM_RGAM_RAMA_END_CNTL1_G, CM_RGAM_RAMA_EXP_REGION_END_G, mask_sh), \ -+ OPP_SF(CM0_CM_RGAM_RAMA_END_CNTL2_G, CM_RGAM_RAMA_EXP_REGION_END_SLOPE_G, mask_sh), \ -+ OPP_SF(CM0_CM_RGAM_RAMA_END_CNTL2_G, CM_RGAM_RAMA_EXP_REGION_END_BASE_G, mask_sh), \ -+ OPP_SF(CM0_CM_RGAM_RAMA_END_CNTL1_R, CM_RGAM_RAMA_EXP_REGION_END_R, mask_sh), \ -+ OPP_SF(CM0_CM_RGAM_RAMA_END_CNTL2_R, CM_RGAM_RAMA_EXP_REGION_END_SLOPE_R, mask_sh), \ -+ OPP_SF(CM0_CM_RGAM_RAMA_END_CNTL2_R, CM_RGAM_RAMA_EXP_REGION_END_BASE_R, mask_sh), \ -+ OPP_SF(CM0_CM_RGAM_RAMA_REGION_0_1, CM_RGAM_RAMA_EXP_REGION0_LUT_OFFSET, mask_sh), \ -+ OPP_SF(CM0_CM_RGAM_RAMA_REGION_0_1, CM_RGAM_RAMA_EXP_REGION0_NUM_SEGMENTS, mask_sh), \ -+ OPP_SF(CM0_CM_RGAM_RAMA_REGION_0_1, CM_RGAM_RAMA_EXP_REGION1_LUT_OFFSET, mask_sh), \ -+ OPP_SF(CM0_CM_RGAM_RAMA_REGION_0_1, CM_RGAM_RAMA_EXP_REGION1_NUM_SEGMENTS, mask_sh), \ -+ OPP_SF(CM0_CM_RGAM_RAMA_REGION_2_3, CM_RGAM_RAMA_EXP_REGION2_LUT_OFFSET, mask_sh), \ -+ OPP_SF(CM0_CM_RGAM_RAMA_REGION_2_3, CM_RGAM_RAMA_EXP_REGION2_NUM_SEGMENTS, mask_sh), \ -+ OPP_SF(CM0_CM_RGAM_RAMA_REGION_2_3, CM_RGAM_RAMA_EXP_REGION3_LUT_OFFSET, mask_sh), \ -+ OPP_SF(CM0_CM_RGAM_RAMA_REGION_2_3, CM_RGAM_RAMA_EXP_REGION3_NUM_SEGMENTS, mask_sh), \ -+ OPP_SF(CM0_CM_RGAM_RAMA_REGION_4_5, CM_RGAM_RAMA_EXP_REGION4_LUT_OFFSET, mask_sh), \ -+ OPP_SF(CM0_CM_RGAM_RAMA_REGION_4_5, CM_RGAM_RAMA_EXP_REGION4_NUM_SEGMENTS, mask_sh), \ -+ OPP_SF(CM0_CM_RGAM_RAMA_REGION_4_5, CM_RGAM_RAMA_EXP_REGION5_LUT_OFFSET, mask_sh), \ -+ OPP_SF(CM0_CM_RGAM_RAMA_REGION_4_5, CM_RGAM_RAMA_EXP_REGION5_NUM_SEGMENTS, mask_sh), \ -+ OPP_SF(CM0_CM_RGAM_RAMA_REGION_6_7, CM_RGAM_RAMA_EXP_REGION6_LUT_OFFSET, mask_sh), \ -+ OPP_SF(CM0_CM_RGAM_RAMA_REGION_6_7, CM_RGAM_RAMA_EXP_REGION6_NUM_SEGMENTS, mask_sh), \ -+ OPP_SF(CM0_CM_RGAM_RAMA_REGION_6_7, CM_RGAM_RAMA_EXP_REGION7_LUT_OFFSET, mask_sh), \ -+ OPP_SF(CM0_CM_RGAM_RAMA_REGION_6_7, CM_RGAM_RAMA_EXP_REGION7_NUM_SEGMENTS, mask_sh), \ -+ OPP_SF(CM0_CM_RGAM_RAMA_REGION_8_9, CM_RGAM_RAMA_EXP_REGION8_LUT_OFFSET, mask_sh), \ -+ OPP_SF(CM0_CM_RGAM_RAMA_REGION_8_9, CM_RGAM_RAMA_EXP_REGION8_NUM_SEGMENTS, mask_sh), \ -+ OPP_SF(CM0_CM_RGAM_RAMA_REGION_8_9, CM_RGAM_RAMA_EXP_REGION9_LUT_OFFSET, mask_sh), \ -+ OPP_SF(CM0_CM_RGAM_RAMA_REGION_8_9, CM_RGAM_RAMA_EXP_REGION9_NUM_SEGMENTS, mask_sh), \ -+ OPP_SF(CM0_CM_RGAM_RAMA_REGION_10_11, CM_RGAM_RAMA_EXP_REGION10_LUT_OFFSET, mask_sh), \ -+ OPP_SF(CM0_CM_RGAM_RAMA_REGION_10_11, CM_RGAM_RAMA_EXP_REGION10_NUM_SEGMENTS, mask_sh), \ -+ OPP_SF(CM0_CM_RGAM_RAMA_REGION_10_11, CM_RGAM_RAMA_EXP_REGION11_LUT_OFFSET, mask_sh), \ -+ OPP_SF(CM0_CM_RGAM_RAMA_REGION_10_11, CM_RGAM_RAMA_EXP_REGION11_NUM_SEGMENTS, mask_sh), \ -+ OPP_SF(CM0_CM_RGAM_RAMA_REGION_12_13, CM_RGAM_RAMA_EXP_REGION12_LUT_OFFSET, mask_sh), \ -+ OPP_SF(CM0_CM_RGAM_RAMA_REGION_12_13, CM_RGAM_RAMA_EXP_REGION12_NUM_SEGMENTS, mask_sh), \ -+ OPP_SF(CM0_CM_RGAM_RAMA_REGION_12_13, CM_RGAM_RAMA_EXP_REGION13_LUT_OFFSET, mask_sh), \ -+ OPP_SF(CM0_CM_RGAM_RAMA_REGION_12_13, CM_RGAM_RAMA_EXP_REGION13_NUM_SEGMENTS, mask_sh), \ -+ OPP_SF(CM0_CM_RGAM_RAMA_REGION_14_15, CM_RGAM_RAMA_EXP_REGION14_LUT_OFFSET, mask_sh), \ -+ OPP_SF(CM0_CM_RGAM_RAMA_REGION_14_15, CM_RGAM_RAMA_EXP_REGION14_NUM_SEGMENTS, mask_sh), \ -+ OPP_SF(CM0_CM_RGAM_RAMA_REGION_14_15, CM_RGAM_RAMA_EXP_REGION15_LUT_OFFSET, mask_sh), \ -+ OPP_SF(CM0_CM_RGAM_RAMA_REGION_14_15, CM_RGAM_RAMA_EXP_REGION15_NUM_SEGMENTS, mask_sh), \ -+ OPP_SF(CM0_CM_RGAM_RAMA_REGION_16_17, CM_RGAM_RAMA_EXP_REGION16_LUT_OFFSET, mask_sh), \ -+ OPP_SF(CM0_CM_RGAM_RAMA_REGION_16_17, CM_RGAM_RAMA_EXP_REGION16_NUM_SEGMENTS, mask_sh), \ -+ OPP_SF(CM0_CM_RGAM_RAMA_REGION_16_17, CM_RGAM_RAMA_EXP_REGION17_LUT_OFFSET, mask_sh), \ -+ OPP_SF(CM0_CM_RGAM_RAMA_REGION_16_17, CM_RGAM_RAMA_EXP_REGION17_NUM_SEGMENTS, mask_sh), \ -+ OPP_SF(CM0_CM_RGAM_RAMA_REGION_18_19, CM_RGAM_RAMA_EXP_REGION18_LUT_OFFSET, mask_sh), \ -+ OPP_SF(CM0_CM_RGAM_RAMA_REGION_18_19, CM_RGAM_RAMA_EXP_REGION18_NUM_SEGMENTS, mask_sh), \ -+ OPP_SF(CM0_CM_RGAM_RAMA_REGION_18_19, CM_RGAM_RAMA_EXP_REGION19_LUT_OFFSET, mask_sh), \ -+ OPP_SF(CM0_CM_RGAM_RAMA_REGION_18_19, CM_RGAM_RAMA_EXP_REGION19_NUM_SEGMENTS, mask_sh), \ -+ OPP_SF(CM0_CM_RGAM_RAMA_REGION_20_21, CM_RGAM_RAMA_EXP_REGION20_LUT_OFFSET, mask_sh), \ -+ OPP_SF(CM0_CM_RGAM_RAMA_REGION_20_21, CM_RGAM_RAMA_EXP_REGION20_NUM_SEGMENTS, mask_sh), \ -+ OPP_SF(CM0_CM_RGAM_RAMA_REGION_20_21, CM_RGAM_RAMA_EXP_REGION21_LUT_OFFSET, mask_sh), \ -+ OPP_SF(CM0_CM_RGAM_RAMA_REGION_20_21, CM_RGAM_RAMA_EXP_REGION21_NUM_SEGMENTS, mask_sh), \ -+ OPP_SF(CM0_CM_RGAM_RAMA_REGION_22_23, CM_RGAM_RAMA_EXP_REGION22_LUT_OFFSET, mask_sh), \ -+ OPP_SF(CM0_CM_RGAM_RAMA_REGION_22_23, CM_RGAM_RAMA_EXP_REGION22_NUM_SEGMENTS, mask_sh), \ -+ OPP_SF(CM0_CM_RGAM_RAMA_REGION_22_23, CM_RGAM_RAMA_EXP_REGION23_LUT_OFFSET, mask_sh), \ -+ OPP_SF(CM0_CM_RGAM_RAMA_REGION_22_23, CM_RGAM_RAMA_EXP_REGION23_NUM_SEGMENTS, mask_sh), \ -+ OPP_SF(CM0_CM_RGAM_RAMA_REGION_24_25, CM_RGAM_RAMA_EXP_REGION24_LUT_OFFSET, mask_sh), \ -+ OPP_SF(CM0_CM_RGAM_RAMA_REGION_24_25, CM_RGAM_RAMA_EXP_REGION24_NUM_SEGMENTS, mask_sh), \ -+ OPP_SF(CM0_CM_RGAM_RAMA_REGION_24_25, CM_RGAM_RAMA_EXP_REGION25_LUT_OFFSET, mask_sh), \ -+ OPP_SF(CM0_CM_RGAM_RAMA_REGION_24_25, CM_RGAM_RAMA_EXP_REGION25_NUM_SEGMENTS, mask_sh), \ -+ OPP_SF(CM0_CM_RGAM_RAMA_REGION_26_27, CM_RGAM_RAMA_EXP_REGION26_LUT_OFFSET, mask_sh), \ -+ OPP_SF(CM0_CM_RGAM_RAMA_REGION_26_27, CM_RGAM_RAMA_EXP_REGION26_NUM_SEGMENTS, mask_sh), \ -+ OPP_SF(CM0_CM_RGAM_RAMA_REGION_26_27, CM_RGAM_RAMA_EXP_REGION27_LUT_OFFSET, mask_sh), \ -+ OPP_SF(CM0_CM_RGAM_RAMA_REGION_26_27, CM_RGAM_RAMA_EXP_REGION27_NUM_SEGMENTS, mask_sh), \ -+ OPP_SF(CM0_CM_RGAM_RAMA_REGION_28_29, CM_RGAM_RAMA_EXP_REGION28_LUT_OFFSET, mask_sh), \ -+ OPP_SF(CM0_CM_RGAM_RAMA_REGION_28_29, CM_RGAM_RAMA_EXP_REGION28_NUM_SEGMENTS, mask_sh), \ -+ OPP_SF(CM0_CM_RGAM_RAMA_REGION_28_29, CM_RGAM_RAMA_EXP_REGION29_LUT_OFFSET, mask_sh), \ -+ OPP_SF(CM0_CM_RGAM_RAMA_REGION_28_29, CM_RGAM_RAMA_EXP_REGION29_NUM_SEGMENTS, mask_sh), \ -+ OPP_SF(CM0_CM_RGAM_RAMA_REGION_30_31, CM_RGAM_RAMA_EXP_REGION30_LUT_OFFSET, mask_sh), \ -+ OPP_SF(CM0_CM_RGAM_RAMA_REGION_30_31, CM_RGAM_RAMA_EXP_REGION30_NUM_SEGMENTS, mask_sh), \ -+ OPP_SF(CM0_CM_RGAM_RAMA_REGION_30_31, CM_RGAM_RAMA_EXP_REGION31_LUT_OFFSET, mask_sh), \ -+ OPP_SF(CM0_CM_RGAM_RAMA_REGION_30_31, CM_RGAM_RAMA_EXP_REGION31_NUM_SEGMENTS, mask_sh), \ -+ OPP_SF(CM0_CM_RGAM_RAMA_REGION_32_33, CM_RGAM_RAMA_EXP_REGION32_LUT_OFFSET, mask_sh), \ -+ OPP_SF(CM0_CM_RGAM_RAMA_REGION_32_33, CM_RGAM_RAMA_EXP_REGION32_NUM_SEGMENTS, mask_sh), \ -+ OPP_SF(CM0_CM_RGAM_RAMA_REGION_32_33, CM_RGAM_RAMA_EXP_REGION33_LUT_OFFSET, mask_sh), \ -+ OPP_SF(CM0_CM_RGAM_RAMA_REGION_32_33, CM_RGAM_RAMA_EXP_REGION33_NUM_SEGMENTS, mask_sh), \ -+ OPP_SF(CM0_CM_RGAM_LUT_WRITE_EN_MASK, CM_RGAM_LUT_WRITE_EN_MASK, mask_sh), \ -+ OPP_SF(CM0_CM_RGAM_LUT_WRITE_EN_MASK, CM_RGAM_LUT_WRITE_SEL, mask_sh), \ -+ OPP_SF(CM0_CM_RGAM_LUT_INDEX, CM_RGAM_LUT_INDEX, mask_sh), \ -+ OPP_SF(CM0_CM_MEM_PWR_CTRL, RGAM_MEM_PWR_FORCE, mask_sh), \ -+ OPP_SF(CM0_CM_RGAM_LUT_DATA, CM_RGAM_LUT_DATA, mask_sh), \ -+ OPP_SF(FMT0_FMT_CONTROL, FMT_STEREOSYNC_OVERRIDE, mask_sh) -+ -+#define OPP_DCN10_REG_FIELD_LIST(type) \ -+ type CM_RGAM_LUT_MODE; \ -+ type OBUF_BYPASS; \ -+ type OBUF_H_2X_UPSCALE_EN; \ -+ type FMT_TRUNCATE_EN; \ -+ type FMT_TRUNCATE_DEPTH; \ -+ type FMT_TRUNCATE_MODE; \ -+ type FMT_SPATIAL_DITHER_EN; \ -+ type FMT_SPATIAL_DITHER_MODE; \ -+ type FMT_SPATIAL_DITHER_DEPTH; \ -+ type FMT_TEMPORAL_DITHER_EN; \ -+ type FMT_HIGHPASS_RANDOM_ENABLE; \ -+ type FMT_FRAME_RANDOM_ENABLE; \ -+ type FMT_RGB_RANDOM_ENABLE; \ -+ type FMT_SPATIAL_DITHER_FRAME_COUNTER_MAX; \ -+ type FMT_SPATIAL_DITHER_FRAME_COUNTER_BIT_SWAP; \ -+ type FMT_RAND_R_SEED; \ -+ type FMT_RAND_G_SEED; \ -+ type FMT_RAND_B_SEED; \ -+ type FMT_PIXEL_ENCODING; \ -+ type FMT_CLAMP_DATA_EN; \ -+ type FMT_CLAMP_COLOR_FORMAT; \ -+ type FMT_DYNAMIC_EXP_EN; \ -+ type FMT_DYNAMIC_EXP_MODE; \ -+ type FMT_MAP420MEM_PWR_FORCE; \ -+ type CM_OCSC_MODE; \ -+ type CM_RGAM_RAMB_EXP_REGION_START_B; \ -+ type CM_RGAM_RAMB_EXP_REGION_START_SEGMENT_B; \ -+ type CM_RGAM_RAMB_EXP_REGION_START_G; \ -+ type CM_RGAM_RAMB_EXP_REGION_START_SEGMENT_G; \ -+ type CM_RGAM_RAMB_EXP_REGION_START_R; \ -+ type CM_RGAM_RAMB_EXP_REGION_START_SEGMENT_R; \ -+ type CM_RGAM_RAMB_EXP_REGION_LINEAR_SLOPE_B; \ -+ type CM_RGAM_RAMB_EXP_REGION_LINEAR_SLOPE_G; \ -+ type CM_RGAM_RAMB_EXP_REGION_LINEAR_SLOPE_R; \ -+ type CM_RGAM_RAMB_EXP_REGION_END_B; \ -+ type CM_RGAM_RAMB_EXP_REGION_END_SLOPE_B; \ -+ type CM_RGAM_RAMB_EXP_REGION_END_BASE_B; \ -+ type CM_RGAM_RAMB_EXP_REGION_END_G; \ -+ type CM_RGAM_RAMB_EXP_REGION_END_SLOPE_G; \ -+ type CM_RGAM_RAMB_EXP_REGION_END_BASE_G; \ -+ type CM_RGAM_RAMB_EXP_REGION_END_R; \ -+ type CM_RGAM_RAMB_EXP_REGION_END_SLOPE_R; \ -+ type CM_RGAM_RAMB_EXP_REGION_END_BASE_R; \ -+ type CM_RGAM_RAMB_EXP_REGION0_LUT_OFFSET; \ -+ type CM_RGAM_RAMB_EXP_REGION0_NUM_SEGMENTS; \ -+ type CM_RGAM_RAMB_EXP_REGION1_LUT_OFFSET; \ -+ type CM_RGAM_RAMB_EXP_REGION1_NUM_SEGMENTS; \ -+ type CM_RGAM_RAMB_EXP_REGION2_LUT_OFFSET; \ -+ type CM_RGAM_RAMB_EXP_REGION2_NUM_SEGMENTS; \ -+ type CM_RGAM_RAMB_EXP_REGION3_LUT_OFFSET; \ -+ type CM_RGAM_RAMB_EXP_REGION3_NUM_SEGMENTS; \ -+ type CM_RGAM_RAMB_EXP_REGION4_LUT_OFFSET; \ -+ type CM_RGAM_RAMB_EXP_REGION4_NUM_SEGMENTS; \ -+ type CM_RGAM_RAMB_EXP_REGION5_LUT_OFFSET; \ -+ type CM_RGAM_RAMB_EXP_REGION5_NUM_SEGMENTS; \ -+ type CM_RGAM_RAMB_EXP_REGION6_LUT_OFFSET; \ -+ type CM_RGAM_RAMB_EXP_REGION6_NUM_SEGMENTS; \ -+ type CM_RGAM_RAMB_EXP_REGION7_LUT_OFFSET; \ -+ type CM_RGAM_RAMB_EXP_REGION7_NUM_SEGMENTS; \ -+ type CM_RGAM_RAMB_EXP_REGION8_LUT_OFFSET; \ -+ type CM_RGAM_RAMB_EXP_REGION8_NUM_SEGMENTS; \ -+ type CM_RGAM_RAMB_EXP_REGION9_LUT_OFFSET; \ -+ type CM_RGAM_RAMB_EXP_REGION9_NUM_SEGMENTS; \ -+ type CM_RGAM_RAMB_EXP_REGION10_LUT_OFFSET; \ -+ type CM_RGAM_RAMB_EXP_REGION10_NUM_SEGMENTS; \ -+ type CM_RGAM_RAMB_EXP_REGION11_LUT_OFFSET; \ -+ type CM_RGAM_RAMB_EXP_REGION11_NUM_SEGMENTS; \ -+ type CM_RGAM_RAMB_EXP_REGION12_LUT_OFFSET; \ -+ type CM_RGAM_RAMB_EXP_REGION12_NUM_SEGMENTS; \ -+ type CM_RGAM_RAMB_EXP_REGION13_LUT_OFFSET; \ -+ type CM_RGAM_RAMB_EXP_REGION13_NUM_SEGMENTS; \ -+ type CM_RGAM_RAMB_EXP_REGION14_LUT_OFFSET; \ -+ type CM_RGAM_RAMB_EXP_REGION14_NUM_SEGMENTS; \ -+ type CM_RGAM_RAMB_EXP_REGION15_LUT_OFFSET; \ -+ type CM_RGAM_RAMB_EXP_REGION15_NUM_SEGMENTS; \ -+ type CM_RGAM_RAMB_EXP_REGION16_LUT_OFFSET; \ -+ type CM_RGAM_RAMB_EXP_REGION16_NUM_SEGMENTS; \ -+ type CM_RGAM_RAMB_EXP_REGION17_LUT_OFFSET; \ -+ type CM_RGAM_RAMB_EXP_REGION17_NUM_SEGMENTS; \ -+ type CM_RGAM_RAMB_EXP_REGION18_LUT_OFFSET; \ -+ type CM_RGAM_RAMB_EXP_REGION18_NUM_SEGMENTS; \ -+ type CM_RGAM_RAMB_EXP_REGION19_LUT_OFFSET; \ -+ type CM_RGAM_RAMB_EXP_REGION19_NUM_SEGMENTS; \ -+ type CM_RGAM_RAMB_EXP_REGION20_LUT_OFFSET; \ -+ type CM_RGAM_RAMB_EXP_REGION20_NUM_SEGMENTS; \ -+ type CM_RGAM_RAMB_EXP_REGION21_LUT_OFFSET; \ -+ type CM_RGAM_RAMB_EXP_REGION21_NUM_SEGMENTS; \ -+ type CM_RGAM_RAMB_EXP_REGION22_LUT_OFFSET; \ -+ type CM_RGAM_RAMB_EXP_REGION22_NUM_SEGMENTS; \ -+ type CM_RGAM_RAMB_EXP_REGION23_LUT_OFFSET; \ -+ type CM_RGAM_RAMB_EXP_REGION23_NUM_SEGMENTS; \ -+ type CM_RGAM_RAMB_EXP_REGION24_LUT_OFFSET; \ -+ type CM_RGAM_RAMB_EXP_REGION24_NUM_SEGMENTS; \ -+ type CM_RGAM_RAMB_EXP_REGION25_LUT_OFFSET; \ -+ type CM_RGAM_RAMB_EXP_REGION25_NUM_SEGMENTS; \ -+ type CM_RGAM_RAMB_EXP_REGION26_LUT_OFFSET; \ -+ type CM_RGAM_RAMB_EXP_REGION26_NUM_SEGMENTS; \ -+ type CM_RGAM_RAMB_EXP_REGION27_LUT_OFFSET; \ -+ type CM_RGAM_RAMB_EXP_REGION27_NUM_SEGMENTS; \ -+ type CM_RGAM_RAMB_EXP_REGION28_LUT_OFFSET; \ -+ type CM_RGAM_RAMB_EXP_REGION28_NUM_SEGMENTS; \ -+ type CM_RGAM_RAMB_EXP_REGION29_LUT_OFFSET; \ -+ type CM_RGAM_RAMB_EXP_REGION29_NUM_SEGMENTS; \ -+ type CM_RGAM_RAMB_EXP_REGION30_LUT_OFFSET; \ -+ type CM_RGAM_RAMB_EXP_REGION30_NUM_SEGMENTS; \ -+ type CM_RGAM_RAMB_EXP_REGION31_LUT_OFFSET; \ -+ type CM_RGAM_RAMB_EXP_REGION31_NUM_SEGMENTS; \ -+ type CM_RGAM_RAMB_EXP_REGION32_LUT_OFFSET; \ -+ type CM_RGAM_RAMB_EXP_REGION32_NUM_SEGMENTS; \ -+ type CM_RGAM_RAMB_EXP_REGION33_LUT_OFFSET; \ -+ type CM_RGAM_RAMB_EXP_REGION33_NUM_SEGMENTS; \ -+ type CM_RGAM_RAMA_EXP_REGION_START_B; \ -+ type CM_RGAM_RAMA_EXP_REGION_START_SEGMENT_B; \ -+ type CM_RGAM_RAMA_EXP_REGION_START_G; \ -+ type CM_RGAM_RAMA_EXP_REGION_START_SEGMENT_G; \ -+ type CM_RGAM_RAMA_EXP_REGION_START_R; \ -+ type CM_RGAM_RAMA_EXP_REGION_START_SEGMENT_R; \ -+ type CM_RGAM_RAMA_EXP_REGION_LINEAR_SLOPE_B; \ -+ type CM_RGAM_RAMA_EXP_REGION_LINEAR_SLOPE_G; \ -+ type CM_RGAM_RAMA_EXP_REGION_LINEAR_SLOPE_R; \ -+ type CM_RGAM_RAMA_EXP_REGION_END_B; \ -+ type CM_RGAM_RAMA_EXP_REGION_END_SLOPE_B; \ -+ type CM_RGAM_RAMA_EXP_REGION_END_BASE_B; \ -+ type CM_RGAM_RAMA_EXP_REGION_END_G; \ -+ type CM_RGAM_RAMA_EXP_REGION_END_SLOPE_G; \ -+ type CM_RGAM_RAMA_EXP_REGION_END_BASE_G; \ -+ type CM_RGAM_RAMA_EXP_REGION_END_R; \ -+ type CM_RGAM_RAMA_EXP_REGION_END_SLOPE_R; \ -+ type CM_RGAM_RAMA_EXP_REGION_END_BASE_R; \ -+ type CM_RGAM_RAMA_EXP_REGION0_LUT_OFFSET; \ -+ type CM_RGAM_RAMA_EXP_REGION0_NUM_SEGMENTS; \ -+ type CM_RGAM_RAMA_EXP_REGION1_LUT_OFFSET; \ -+ type CM_RGAM_RAMA_EXP_REGION1_NUM_SEGMENTS; \ -+ type CM_RGAM_RAMA_EXP_REGION2_LUT_OFFSET; \ -+ type CM_RGAM_RAMA_EXP_REGION2_NUM_SEGMENTS; \ -+ type CM_RGAM_RAMA_EXP_REGION3_LUT_OFFSET; \ -+ type CM_RGAM_RAMA_EXP_REGION3_NUM_SEGMENTS; \ -+ type CM_RGAM_RAMA_EXP_REGION4_LUT_OFFSET; \ -+ type CM_RGAM_RAMA_EXP_REGION4_NUM_SEGMENTS; \ -+ type CM_RGAM_RAMA_EXP_REGION5_LUT_OFFSET; \ -+ type CM_RGAM_RAMA_EXP_REGION5_NUM_SEGMENTS; \ -+ type CM_RGAM_RAMA_EXP_REGION6_LUT_OFFSET; \ -+ type CM_RGAM_RAMA_EXP_REGION6_NUM_SEGMENTS; \ -+ type CM_RGAM_RAMA_EXP_REGION7_LUT_OFFSET; \ -+ type CM_RGAM_RAMA_EXP_REGION7_NUM_SEGMENTS; \ -+ type CM_RGAM_RAMA_EXP_REGION8_LUT_OFFSET; \ -+ type CM_RGAM_RAMA_EXP_REGION8_NUM_SEGMENTS; \ -+ type CM_RGAM_RAMA_EXP_REGION9_LUT_OFFSET; \ -+ type CM_RGAM_RAMA_EXP_REGION9_NUM_SEGMENTS; \ -+ type CM_RGAM_RAMA_EXP_REGION10_LUT_OFFSET; \ -+ type CM_RGAM_RAMA_EXP_REGION10_NUM_SEGMENTS; \ -+ type CM_RGAM_RAMA_EXP_REGION11_LUT_OFFSET; \ -+ type CM_RGAM_RAMA_EXP_REGION11_NUM_SEGMENTS; \ -+ type CM_RGAM_RAMA_EXP_REGION12_LUT_OFFSET; \ -+ type CM_RGAM_RAMA_EXP_REGION12_NUM_SEGMENTS; \ -+ type CM_RGAM_RAMA_EXP_REGION13_LUT_OFFSET; \ -+ type CM_RGAM_RAMA_EXP_REGION13_NUM_SEGMENTS; \ -+ type CM_RGAM_RAMA_EXP_REGION14_LUT_OFFSET; \ -+ type CM_RGAM_RAMA_EXP_REGION14_NUM_SEGMENTS; \ -+ type CM_RGAM_RAMA_EXP_REGION15_LUT_OFFSET; \ -+ type CM_RGAM_RAMA_EXP_REGION15_NUM_SEGMENTS; \ -+ type CM_RGAM_RAMA_EXP_REGION16_LUT_OFFSET; \ -+ type CM_RGAM_RAMA_EXP_REGION16_NUM_SEGMENTS; \ -+ type CM_RGAM_RAMA_EXP_REGION17_LUT_OFFSET; \ -+ type CM_RGAM_RAMA_EXP_REGION17_NUM_SEGMENTS; \ -+ type CM_RGAM_RAMA_EXP_REGION18_LUT_OFFSET; \ -+ type CM_RGAM_RAMA_EXP_REGION18_NUM_SEGMENTS; \ -+ type CM_RGAM_RAMA_EXP_REGION19_LUT_OFFSET; \ -+ type CM_RGAM_RAMA_EXP_REGION19_NUM_SEGMENTS; \ -+ type CM_RGAM_RAMA_EXP_REGION20_LUT_OFFSET; \ -+ type CM_RGAM_RAMA_EXP_REGION20_NUM_SEGMENTS; \ -+ type CM_RGAM_RAMA_EXP_REGION21_LUT_OFFSET; \ -+ type CM_RGAM_RAMA_EXP_REGION21_NUM_SEGMENTS; \ -+ type CM_RGAM_RAMA_EXP_REGION22_LUT_OFFSET; \ -+ type CM_RGAM_RAMA_EXP_REGION22_NUM_SEGMENTS; \ -+ type CM_RGAM_RAMA_EXP_REGION23_LUT_OFFSET; \ -+ type CM_RGAM_RAMA_EXP_REGION23_NUM_SEGMENTS; \ -+ type CM_RGAM_RAMA_EXP_REGION24_LUT_OFFSET; \ -+ type CM_RGAM_RAMA_EXP_REGION24_NUM_SEGMENTS; \ -+ type CM_RGAM_RAMA_EXP_REGION25_LUT_OFFSET; \ -+ type CM_RGAM_RAMA_EXP_REGION25_NUM_SEGMENTS; \ -+ type CM_RGAM_RAMA_EXP_REGION26_LUT_OFFSET; \ -+ type CM_RGAM_RAMA_EXP_REGION26_NUM_SEGMENTS; \ -+ type CM_RGAM_RAMA_EXP_REGION27_LUT_OFFSET; \ -+ type CM_RGAM_RAMA_EXP_REGION27_NUM_SEGMENTS; \ -+ type CM_RGAM_RAMA_EXP_REGION28_LUT_OFFSET; \ -+ type CM_RGAM_RAMA_EXP_REGION28_NUM_SEGMENTS; \ -+ type CM_RGAM_RAMA_EXP_REGION29_LUT_OFFSET; \ -+ type CM_RGAM_RAMA_EXP_REGION29_NUM_SEGMENTS; \ -+ type CM_RGAM_RAMA_EXP_REGION30_LUT_OFFSET; \ -+ type CM_RGAM_RAMA_EXP_REGION30_NUM_SEGMENTS; \ -+ type CM_RGAM_RAMA_EXP_REGION31_LUT_OFFSET; \ -+ type CM_RGAM_RAMA_EXP_REGION31_NUM_SEGMENTS; \ -+ type CM_RGAM_RAMA_EXP_REGION32_LUT_OFFSET; \ -+ type CM_RGAM_RAMA_EXP_REGION32_NUM_SEGMENTS; \ -+ type CM_RGAM_RAMA_EXP_REGION33_LUT_OFFSET; \ -+ type CM_RGAM_RAMA_EXP_REGION33_NUM_SEGMENTS; \ -+ type CM_RGAM_LUT_WRITE_EN_MASK; \ -+ type CM_RGAM_LUT_WRITE_SEL; \ -+ type CM_RGAM_LUT_INDEX; \ -+ type RGAM_MEM_PWR_FORCE; \ -+ type CM_RGAM_LUT_DATA; \ -+ type FMT_STEREOSYNC_OVERRIDE -+ -+struct dcn10_opp_shift { -+ OPP_DCN10_REG_FIELD_LIST(uint8_t); -+}; -+ -+struct dcn10_opp_mask { -+ OPP_DCN10_REG_FIELD_LIST(uint32_t); -+}; -+ -+struct dcn10_opp_registers { -+ uint32_t CM_RGAM_LUT_WRITE_EN_MASK; -+ uint32_t CM_RGAM_CONTROL; -+ uint32_t OBUF_CONTROL; -+ uint32_t FMT_BIT_DEPTH_CONTROL; -+ uint32_t FMT_CONTROL; -+ uint32_t FMT_DITHER_RAND_R_SEED; -+ uint32_t FMT_DITHER_RAND_G_SEED; -+ uint32_t FMT_DITHER_RAND_B_SEED; -+ uint32_t FMT_CLAMP_CNTL; -+ uint32_t FMT_DYNAMIC_EXP_CNTL; -+ uint32_t FMT_MAP420_MEMORY_CONTROL; -+ uint32_t CM_OCSC_CONTROL; -+ uint32_t CM_RGAM_RAMB_START_CNTL_B; -+ uint32_t CM_RGAM_RAMB_START_CNTL_G; -+ uint32_t CM_RGAM_RAMB_START_CNTL_R; -+ uint32_t CM_RGAM_RAMB_SLOPE_CNTL_B; -+ uint32_t CM_RGAM_RAMB_SLOPE_CNTL_G; -+ uint32_t CM_RGAM_RAMB_SLOPE_CNTL_R; -+ uint32_t CM_RGAM_RAMB_END_CNTL1_B; -+ uint32_t CM_RGAM_RAMB_END_CNTL2_B; -+ uint32_t CM_RGAM_RAMB_END_CNTL1_G; -+ uint32_t CM_RGAM_RAMB_END_CNTL2_G; -+ uint32_t CM_RGAM_RAMB_END_CNTL1_R; -+ uint32_t CM_RGAM_RAMB_END_CNTL2_R; -+ uint32_t CM_RGAM_RAMB_REGION_0_1; -+ uint32_t CM_RGAM_RAMB_REGION_2_3; -+ uint32_t CM_RGAM_RAMB_REGION_4_5; -+ uint32_t CM_RGAM_RAMB_REGION_6_7; -+ uint32_t CM_RGAM_RAMB_REGION_8_9; -+ uint32_t CM_RGAM_RAMB_REGION_10_11; -+ uint32_t CM_RGAM_RAMB_REGION_12_13; -+ uint32_t CM_RGAM_RAMB_REGION_14_15; -+ uint32_t CM_RGAM_RAMB_REGION_16_17; -+ uint32_t CM_RGAM_RAMB_REGION_18_19; -+ uint32_t CM_RGAM_RAMB_REGION_20_21; -+ uint32_t CM_RGAM_RAMB_REGION_22_23; -+ uint32_t CM_RGAM_RAMB_REGION_24_25; -+ uint32_t CM_RGAM_RAMB_REGION_26_27; -+ uint32_t CM_RGAM_RAMB_REGION_28_29; -+ uint32_t CM_RGAM_RAMB_REGION_30_31; -+ uint32_t CM_RGAM_RAMB_REGION_32_33; -+ uint32_t CM_RGAM_RAMA_START_CNTL_B; -+ uint32_t CM_RGAM_RAMA_START_CNTL_G; -+ uint32_t CM_RGAM_RAMA_START_CNTL_R; -+ uint32_t CM_RGAM_RAMA_SLOPE_CNTL_B; -+ uint32_t CM_RGAM_RAMA_SLOPE_CNTL_G; -+ uint32_t CM_RGAM_RAMA_SLOPE_CNTL_R; -+ uint32_t CM_RGAM_RAMA_END_CNTL1_B; -+ uint32_t CM_RGAM_RAMA_END_CNTL2_B; -+ uint32_t CM_RGAM_RAMA_END_CNTL1_G; -+ uint32_t CM_RGAM_RAMA_END_CNTL2_G; -+ uint32_t CM_RGAM_RAMA_END_CNTL1_R; -+ uint32_t CM_RGAM_RAMA_END_CNTL2_R; -+ uint32_t CM_RGAM_RAMA_REGION_0_1; -+ uint32_t CM_RGAM_RAMA_REGION_2_3; -+ uint32_t CM_RGAM_RAMA_REGION_4_5; -+ uint32_t CM_RGAM_RAMA_REGION_6_7; -+ uint32_t CM_RGAM_RAMA_REGION_8_9; -+ uint32_t CM_RGAM_RAMA_REGION_10_11; -+ uint32_t CM_RGAM_RAMA_REGION_12_13; -+ uint32_t CM_RGAM_RAMA_REGION_14_15; -+ uint32_t CM_RGAM_RAMA_REGION_16_17; -+ uint32_t CM_RGAM_RAMA_REGION_18_19; -+ uint32_t CM_RGAM_RAMA_REGION_20_21; -+ uint32_t CM_RGAM_RAMA_REGION_22_23; -+ uint32_t CM_RGAM_RAMA_REGION_24_25; -+ uint32_t CM_RGAM_RAMA_REGION_26_27; -+ uint32_t CM_RGAM_RAMA_REGION_28_29; -+ uint32_t CM_RGAM_RAMA_REGION_30_31; -+ uint32_t CM_RGAM_RAMA_REGION_32_33; -+ uint32_t CM_RGAM_LUT_INDEX; -+ uint32_t CM_MEM_PWR_CTRL; -+ uint32_t CM_RGAM_LUT_DATA; -+}; -+ -+struct dcn10_opp { -+ struct output_pixel_processor base; -+ -+ const struct dcn10_opp_registers *regs; -+ const struct dcn10_opp_shift *opp_shift; -+ const struct dcn10_opp_mask *opp_mask; -+ -+ bool is_write_to_ram_a_safe; -+}; -+ -+void dcn10_opp_construct(struct dcn10_opp *oppn10, -+ struct dc_context *ctx, -+ uint32_t inst, -+ const struct dcn10_opp_registers *regs, -+ const struct dcn10_opp_shift *opp_shift, -+ const struct dcn10_opp_mask *opp_mask); -+ -+#endif -diff --git a/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_resource.c b/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_resource.c -new file mode 100644 -index 0000000..7aa438c ---- /dev/null -+++ b/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_resource.c -@@ -0,0 +1,1475 @@ -+/* -+* 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 "resource.h" -+#include "include/irq_service_interface.h" -+#include "dcn10/dcn10_resource.h" -+ -+#include "dcn10/dcn10_ipp.h" -+#include "dcn10/dcn10_mpc.h" -+#include "irq/dcn10/irq_service_dcn10.h" -+#include "dcn10/dcn10_transform.h" -+#include "dcn10/dcn10_timing_generator.h" -+#include "dcn10/dcn10_hw_sequencer.h" -+#include "dce110/dce110_hw_sequencer.h" -+#include "dcn10/dcn10_opp.h" -+#include "dce/dce_link_encoder.h" -+#include "dce/dce_stream_encoder.h" -+#include "dce/dce_clocks.h" -+#include "dce/dce_clock_source.h" -+#include "dcn10/dcn10_mem_input.h" -+#include "dce/dce_audio.h" -+#include "dce/dce_hwseq.h" -+#include "../virtual/virtual_stream_encoder.h" -+#include "dce110/dce110_resource.h" -+ -+#include "vega10/soc15ip.h" -+ -+#include "raven1/DCN/dcn_1_0_offset.h" -+#include "raven1/DCN/dcn_1_0_sh_mask.h" -+ -+#include "raven1/NBIO/nbio_7_0_offset.h" -+ -+#include "raven1/MMHUB/mmhub_9_1_offset.h" -+#include "raven1/MMHUB/mmhub_9_1_sh_mask.h" -+ -+#include "reg_helper.h" -+#include "dce/dce_abm.h" -+#include "dce/dce_dmcu.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 -+}; -+ -+/* 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 -+ -+/* 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 -+ -+/* GC */ -+#define GC_BASE_INNER(seg) \ -+ GC_BASE__INST0_SEG ## seg -+ -+#define GC_BASE(seg) \ -+ GC_BASE_INNER(seg) -+ -+#define GC_SR(reg_name)\ -+ .reg_name = GC_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_disp_clk_registers disp_clk_regs = { -+ CLK_DCN10_REG_LIST() -+}; -+ -+static const struct dce_disp_clk_shift disp_clk_shift = { -+ CLK_COMMON_MASK_SH_LIST_DCE_COMMON_BASE(__SHIFT) -+}; -+ -+static const struct dce_disp_clk_mask disp_clk_mask = { -+ CLK_COMMON_MASK_SH_LIST_DCE_COMMON_BASE(_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_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),\ -+ .TMDS_CNTL = 0,\ -+ .AFMT_AVI_INFO0 = 0,\ -+ .AFMT_AVI_INFO1 = 0,\ -+ .AFMT_AVI_INFO2 = 0,\ -+ .AFMT_AVI_INFO3 = 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), -+}; -+ -+static const struct dce_stream_encoder_shift se_shift = { -+ SE_COMMON_MASK_SH_LIST_DCN10(__SHIFT) -+}; -+ -+static const struct dce_stream_encoder_mask se_mask = { -+ SE_COMMON_MASK_SH_LIST_DCN10(_MASK), -+ .AFMT_GENERIC0_UPDATE = 0, -+ .AFMT_GENERIC2_UPDATE = 0, -+ .DP_DYN_RANGE = 0, -+ .DP_YCBCR_RANGE = 0, -+ .HDMI_AVI_INFO_SEND = 0, -+ .HDMI_AVI_INFO_CONT = 0, -+ .HDMI_AVI_INFO_LINE = 0, -+ .DP_SEC_AVI_ENABLE = 0, -+ .AFMT_AVI_INFO_VERSION = 0 -+}; -+ -+#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_aduio_mask audio_mask = { -+ DCE120_AUD_COMMON_MASK_SH_LIST(_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_DCN10_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 ipp_regs(id)\ -+[id] = {\ -+ IPP_DCN10_REG_LIST(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_DCN10_MASK_SH_LIST(__SHIFT) -+}; -+ -+static const struct dcn10_ipp_mask ipp_mask = { -+ IPP_DCN10_MASK_SH_LIST(_MASK), -+}; -+ -+#define opp_regs(id)\ -+[id] = {\ -+ OPP_DCN10_REG_LIST(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_DCN10_MASK_SH_LIST(__SHIFT) -+}; -+ -+static const struct dcn10_opp_mask opp_mask = { -+ OPP_DCN10_MASK_SH_LIST(_MASK), -+}; -+ -+#define tf_regs(id)\ -+[id] = {\ -+ TF_REG_LIST_DCN(id),\ -+} -+ -+static const struct dcn_transform_registers tf_regs[] = { -+ tf_regs(0), -+ tf_regs(1), -+ tf_regs(2), -+ tf_regs(3), -+}; -+ -+static const struct dcn_transform_shift tf_shift = { -+ TF_REG_LIST_SH_MASK_DCN(__SHIFT) -+}; -+ -+static const struct dcn_transform_mask tf_mask = { -+ TF_REG_LIST_SH_MASK_DCN(_MASK), -+}; -+ -+ -+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), -+}; -+ -+static const struct dcn_mpc_shift mpc_shift = { -+ MPC_COMMON_MASK_SH_LIST_DCN1_0(__SHIFT) -+}; -+ -+static const struct dcn_mpc_mask mpc_mask = { -+ MPC_COMMON_MASK_SH_LIST_DCN1_0(_MASK), -+}; -+ -+#define tg_regs(id)\ -+[id] = {TG_COMMON_REG_LIST_DCN1_0(id)} -+ -+static const struct dcn_tg_registers tg_regs[] = { -+ tg_regs(0), -+ tg_regs(1), -+ tg_regs(2), -+ tg_regs(3), -+}; -+ -+static const struct dcn_tg_shift tg_shift = { -+ TG_COMMON_MASK_SH_LIST_DCN1_0(__SHIFT) -+}; -+ -+static const struct dcn_tg_mask tg_mask = { -+ TG_COMMON_MASK_SH_LIST_DCN1_0(_MASK) -+}; -+ -+ -+static const struct bios_registers bios_regs = { -+ NBIO_SR(BIOS_SCRATCH_6) -+}; -+ -+#define mi_regs(id)\ -+[id] = {\ -+ MI_DCN10_REG_LIST(id)\ -+} -+ -+ -+static const struct dcn_mi_registers mi_regs[] = { -+ mi_regs(0), -+ mi_regs(1), -+ mi_regs(2), -+ mi_regs(3), -+}; -+ -+static const struct dcn_mi_shift mi_shift = { -+ MI_DCN10_MASK_SH_LIST(__SHIFT) -+}; -+ -+static const struct dcn_mi_mask mi_mask = { -+ MI_DCN10_MASK_SH_LIST(_MASK) -+}; -+ -+#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_video_plane = 4, -+ .num_audio = 4, -+ .num_stream_encoder = 4, -+ .num_pll = 4, -+}; -+ -+static const struct dc_debug debug_defaults_drv = { -+ .disable_dcc = false, -+ .disable_dpp_power_gate = false, -+ .disable_hubp_power_gate = false, -+ .disable_dmcu = true, -+ .force_abm_enable = false, -+ .timing_trace = false, -+ .disable_pplib_clock_request = true, -+ .disable_pplib_wm_range = true, -+#if defined(CONFIG_DRM_AMD_DC_DCN1_0) -+ .use_dml_wm = false, -+ .use_max_voltage = true -+#endif -+}; -+ -+static const struct dc_debug debug_defaults_diags = { -+ .disable_dpp_power_gate = false, -+ .disable_hubp_power_gate = false, -+ .disable_clock_gate = true, -+ .disable_dmcu = true, -+ .force_abm_enable = false, -+ .timing_trace = true, -+#if defined(CONFIG_DRM_AMD_DC_DCN1_0) -+ .disable_pplib_clock_request = true, -+ .disable_pplib_wm_range = true, -+ .use_dml_wm = false, -+ .use_max_voltage = false -+#endif -+}; -+ -+static void dcn10_transform_destroy(struct transform **xfm) -+{ -+ dm_free(TO_DCN10_TRANSFORM(*xfm)); -+ *xfm = NULL; -+} -+ -+static struct transform *dcn10_transform_create( -+ struct dc_context *ctx, -+ uint32_t inst) -+{ -+ struct dcn10_transform *transform = -+ dm_alloc(sizeof(struct dcn10_transform)); -+ -+ if (!transform) -+ return NULL; -+ -+ if (dcn10_transform_construct(transform, ctx, -+ &tf_regs[inst], &tf_shift, &tf_mask)) -+ return &transform->base; -+ -+ BREAK_TO_DEBUGGER(); -+ dm_free(transform); -+ return NULL; -+} -+ -+static struct input_pixel_processor *dcn10_ipp_create( -+ struct dc_context *ctx, uint32_t inst) -+{ -+ struct dcn10_ipp *ipp = -+ dm_alloc(sizeof(struct dcn10_ipp)); -+ -+ 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 = -+ dm_alloc(sizeof(struct dcn10_opp)); -+ -+ 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 mpc *dcn10_mpc_create( -+ struct dc_context *ctx) -+{ -+ struct dcn10_mpc *mpc = dm_alloc(sizeof(struct dcn10_mpc)); -+ -+ if (!mpc) -+ return NULL; -+ -+ mpc->base.ctx = ctx; -+ mpc->mpc_regs = &mpc_regs; -+ mpc->mpc_shift = &mpc_shift; -+ mpc->mpc_mask = &mpc_mask; -+ -+ return &mpc->base; -+} -+ -+static void dcn10_mpc_destroy(struct mpc **mpc_base) -+{ -+ if (*mpc_base) -+ dm_free(TO_DCN10_MPC(*mpc_base)); -+ -+ *mpc_base = NULL; -+} -+ -+static struct timing_generator *dcn10_timing_generator_create( -+ struct dc_context *ctx, -+ uint32_t instance) -+{ -+ struct dcn10_timing_generator *tgn10 = -+ dm_alloc(sizeof(struct dcn10_timing_generator)); -+ -+ 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, -+ .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, -+ .flags.bits.IS_YCBCR_CAPABLE = true -+}; -+ -+struct link_encoder *dcn10_link_encoder_create( -+ const struct encoder_init_data *enc_init_data) -+{ -+ struct dce110_link_encoder *enc110 = -+ dm_alloc(sizeof(struct dce110_link_encoder)); -+ -+ if (!enc110) -+ return NULL; -+ -+ if (dce110_link_encoder_construct( -+ enc110, -+ 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])) { -+ -+ return &enc110->base; -+ } -+ -+ BREAK_TO_DEBUGGER(); -+ dm_free(enc110); -+ return NULL; -+} -+ -+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 = -+ dm_alloc(sizeof(struct dce110_clk_src)); -+ -+ 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; -+ } -+ -+ BREAK_TO_DEBUGGER(); -+ return NULL; -+} -+ -+static void read_dce_straps( -+ struct dc_context *ctx, -+ struct resource_straps *straps) -+{ -+ /* TODO: Registers are missing */ -+ /*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 stream_encoder *dcn10_stream_encoder_create( -+ enum engine_id eng_id, -+ struct dc_context *ctx) -+{ -+ struct dce110_stream_encoder *enc110 = -+ dm_alloc(sizeof(struct dce110_stream_encoder)); -+ -+ if (!enc110) -+ return NULL; -+ -+ if (dce110_stream_encoder_construct( -+ enc110, ctx, ctx->dc_bios, eng_id, -+ &stream_enc_regs[eng_id], &se_shift, &se_mask)) -+ return &enc110->base; -+ -+ BREAK_TO_DEBUGGER(); -+ dm_free(enc110); -+ return NULL; -+} -+ -+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 = dm_alloc(sizeof(struct dce_hwseq)); -+ -+ 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 = dcn10_stream_encoder_create, -+ .create_hwseq = dcn10_hwseq_create, -+}; -+ -+static const struct resource_create_funcs res_create_maximus_funcs = { -+ .read_dce_straps = NULL, -+ .create_audio = NULL, -+ .create_stream_encoder = NULL, -+ .create_hwseq = dcn10_hwseq_create, -+}; -+ -+void dcn10_clock_source_destroy(struct clock_source **clk_src) -+{ -+ dm_free(TO_DCE110_CLK_SRC(*clk_src)); -+ *clk_src = NULL; -+} -+ -+static void 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) { -+ /* TODO: free dcn version of stream encoder once implemented -+ * rather than using virtual stream encoder -+ */ -+ dm_free(pool->base.stream_enc[i]); -+ pool->base.stream_enc[i] = 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.transforms[i] != NULL) -+ dcn10_transform_destroy(&pool->base.transforms[i]); -+ -+ if (pool->base.ipps[i] != NULL) -+ pool->base.ipps[i]->funcs->ipp_destroy(&pool->base.ipps[i]); -+ -+ if (pool->base.mis[i] != NULL) { -+ dm_free(TO_DCN10_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) { -+ dm_free(DCN10TG_FROM_TG(pool->base.timing_generators[i])); -+ pool->base.timing_generators[i] = NULL; -+ } -+ } -+ -+ for (i = 0; i < pool->base.stream_enc_count; i++) { -+ if (pool->base.stream_enc[i] != NULL) -+ dm_free(DCE110STRENC_FROM_STRENC(pool->base.stream_enc[i])); -+ } -+ -+ 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.mpc != NULL) -+ dcn10_mpc_destroy(&pool->base.mpc); -+ -+ 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.display_clock != NULL) -+ dce_disp_clk_destroy(&pool->base.display_clock); -+} -+ -+static struct mem_input *dcn10_mem_input_create( -+ struct dc_context *ctx, -+ uint32_t inst) -+{ -+ struct dcn10_mem_input *mem_inputn10 = -+ dm_alloc(sizeof(struct dcn10_mem_input)); -+ -+ if (!mem_inputn10) -+ return NULL; -+ -+ if (dcn10_mem_input_construct(mem_inputn10, ctx, inst, -+ &mi_regs[inst], &mi_shift, &mi_mask)) -+ return &mem_inputn10->base; -+ -+ BREAK_TO_DEBUGGER(); -+ dm_free(mem_inputn10); -+ return NULL; -+} -+ -+static void get_pixel_clock_parameters( -+ const struct pipe_ctx *pipe_ctx, -+ struct pixel_clk_params *pixel_clk_params) -+{ -+ const struct core_stream *stream = pipe_ctx->stream; -+ pixel_clk_params->requested_pix_clk = stream->public.timing.pix_clk_khz; -+ pixel_clk_params->encoder_object_id = stream->sink->link->link_enc->id; -+ pixel_clk_params->signal_type = pipe_ctx->stream->signal; -+ pixel_clk_params->controller_id = pipe_ctx->pipe_idx + 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->public.timing.display_color_depth; -+ pixel_clk_params->flags.DISPLAY_BLANKED = 1; -+ pixel_clk_params->pixel_encoding = stream->public.timing.pixel_encoding; -+ -+ if (stream->public.timing.pixel_encoding == PIXEL_ENCODING_YCBCR422) -+ pixel_clk_params->color_depth = COLOR_DEPTH_888; -+ -+ if (stream->public.timing.pixel_encoding == PIXEL_ENCODING_YCBCR420) -+ pixel_clk_params->requested_pix_clk /= 2; -+ -+ if (stream->public.timing. timing_3d_format == TIMING_3D_FORMAT_HW_FRAME_PACKING || -+ stream->public.timing. timing_3d_format == TIMING_3D_FORMAT_SW_FRAME_PACKING || -+ stream->public.timing. timing_3d_format == TIMING_3D_FORMAT_DP_HDMI_INBAND_FA) -+ pixel_clk_params->requested_pix_clk *= 2; -+} -+ -+static void build_clamping_params(struct core_stream *stream) -+{ -+ stream->clamping.clamping_level = CLAMPING_FULL_RANGE; -+ stream->clamping.c_depth = stream->public.timing.display_color_depth; -+ stream->clamping.pixel_encoding = stream->public.timing.pixel_encoding; -+} -+ -+static enum dc_status build_pipe_hw_param(struct pipe_ctx *pipe_ctx) -+{ -+ -+ get_pixel_clock_parameters(pipe_ctx, &pipe_ctx->pix_clk_params); -+ -+ pipe_ctx->clock_source->funcs->get_pix_clk_dividers( -+ pipe_ctx->clock_source, -+ &pipe_ctx->pix_clk_params, -+ &pipe_ctx->pll_settings); -+ -+ pipe_ctx->stream->clamping.pixel_encoding = pipe_ctx->stream->public.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; -+} -+ -+static enum dc_status validate_mapped_resource( -+ const struct core_dc *dc, -+ struct validate_context *context) -+{ -+ enum dc_status status = DC_OK; -+ uint8_t i, j; -+ -+ for (i = 0; i < context->stream_count; i++) { -+ struct core_stream *stream = context->streams[i]; -+ struct core_link *link = stream->sink->link; -+ -+ if (resource_is_stream_unchanged(dc->current_context, stream)) { -+ if (stream != NULL && dc->current_context->streams[i] != NULL) { -+ /* todo: shouldn't have to copy missing parameter here */ -+ resource_build_bit_depth_reduction_params(stream, -+ &stream->bit_depth_params); -+ stream->clamping.pixel_encoding = -+ stream->public.timing.pixel_encoding; -+ -+ resource_build_bit_depth_reduction_params(stream, -+ &stream->bit_depth_params); -+ build_clamping_params(stream); -+ -+ continue; -+ } -+ } -+ -+ for (j = 0; j < dc->res_pool->pipe_count ; j++) { -+ struct pipe_ctx *pipe_ctx = -+ &context->res_ctx.pipe_ctx[j]; -+ -+ if (context->res_ctx.pipe_ctx[j].stream != stream) -+ continue; -+ -+ -+ if (!pipe_ctx->tg->funcs->validate_timing( -+ pipe_ctx->tg, &stream->public.timing)) -+ return DC_FAIL_CONTROLLER_VALIDATE; -+ -+ status = build_pipe_hw_param(pipe_ctx); -+ -+ if (status != DC_OK) -+ return status; -+ -+ if (!link->link_enc->funcs->validate_output_with_stream( -+ link->link_enc, pipe_ctx)) -+ return DC_FAIL_ENC_VALIDATE; -+ -+ /* TODO: validate audio ASIC caps, encoder */ -+ -+ status = dc_link_validate_mode_timing( -+ stream, link, &stream->public.timing); -+ -+ if (status != DC_OK) -+ return status; -+ -+ -+ /* do not need to validate non root pipes */ -+ break; -+ } -+ } -+ -+ return DC_OK; -+} -+ -+enum dc_status dcn10_validate_with_context( -+ const struct core_dc *dc, -+ const struct dc_validation_set set[], -+ int set_count, -+ struct validate_context *context) -+{ -+ enum dc_status result = DC_OK; -+ int i; -+ -+ if (set_count == 0) -+ return result; -+ -+ for (i = 0; i < set_count; i++) { -+ context->streams[i] = DC_STREAM_TO_CORE(set[i].stream); -+ dc_stream_retain(&context->streams[i]->public); -+ context->stream_count++; -+ } -+ -+ result = resource_map_pool_resources(dc, context); -+ if (result != DC_OK) -+ return result; -+ -+ result = resource_map_phy_clock_resources(dc, context); -+ if (result != DC_OK) -+ return result; -+ -+ result = validate_mapped_resource(dc, context); -+ if (result != DC_OK) -+ return result; -+ -+ if (!resource_validate_attach_surfaces(set, set_count, -+ dc->current_context, context, dc->res_pool)) -+ return DC_FAIL_ATTACH_SURFACES; -+ -+ result = resource_build_scaling_params_for_context(dc, context); -+ if (result != DC_OK) -+ return result; -+ -+ if (!dcn_validate_bandwidth(dc, context)) -+ return DC_FAIL_BANDWIDTH_VALIDATE; -+ -+ return result; -+} -+ -+enum dc_status dcn10_validate_guaranteed( -+ const struct core_dc *dc, -+ const struct dc_stream *dc_stream, -+ struct validate_context *context) -+{ -+ enum dc_status result = DC_ERROR_UNEXPECTED; -+ -+ context->streams[0] = DC_STREAM_TO_CORE(dc_stream); -+ dc_stream_retain(&context->streams[0]->public); -+ context->stream_count++; -+ -+ result = resource_map_pool_resources(dc, context); -+ -+ if (result == DC_OK) -+ result = resource_map_phy_clock_resources(dc, context); -+ -+ if (result == DC_OK) -+ result = validate_mapped_resource(dc, context); -+ -+ if (result == DC_OK) { -+ validate_guaranteed_copy_streams( -+ context, dc->public.caps.max_streams); -+ result = resource_build_scaling_params_for_context(dc, context); -+ } -+ if (result == DC_OK && !dcn_validate_bandwidth(dc, context)) -+ return DC_FAIL_BANDWIDTH_VALIDATE; -+ -+ return result; -+} -+ -+static struct pipe_ctx *dcn10_acquire_idle_pipe_for_layer( -+ struct validate_context *context, -+ const struct resource_pool *pool, -+ struct core_stream *stream) -+{ -+ struct resource_context *res_ctx = &context->res_ctx; -+ struct pipe_ctx *head_pipe = resource_get_head_pipe_for_stream(res_ctx, stream); -+ struct pipe_ctx *idle_pipe = find_idle_secondary_pipe(res_ctx, pool); -+ -+ if (!head_pipe) -+ ASSERT(0); -+ -+ if (!idle_pipe) -+ return false; -+ -+ idle_pipe->stream = head_pipe->stream; -+ idle_pipe->tg = head_pipe->tg; -+ -+ idle_pipe->mi = pool->mis[idle_pipe->pipe_idx]; -+ idle_pipe->ipp = pool->ipps[idle_pipe->pipe_idx]; -+ idle_pipe->xfm = pool->transforms[idle_pipe->pipe_idx]; -+ idle_pipe->opp = pool->opps[idle_pipe->pipe_idx]; -+ -+ return idle_pipe; -+} -+ -+enum dcc_control { -+ dcc_control__256_256_xxx, -+ dcc_control__128_128_xxx, -+ dcc_control__256_64_64, -+}; -+ -+enum segment_order { -+ segment_order__na, -+ segment_order__contiguous, -+ segment_order__non_contiguous, -+}; -+ -+static bool dcc_support_pixel_format( -+ enum surface_pixel_format format, -+ unsigned int *bytes_per_element) -+{ -+ /* DML: get_bytes_per_element */ -+ switch (format) { -+ case SURFACE_PIXEL_FORMAT_GRPH_ARGB1555: -+ case SURFACE_PIXEL_FORMAT_GRPH_RGB565: -+ *bytes_per_element = 2; -+ return true; -+ case SURFACE_PIXEL_FORMAT_GRPH_ARGB8888: -+ case SURFACE_PIXEL_FORMAT_GRPH_ABGR8888: -+ case SURFACE_PIXEL_FORMAT_GRPH_ARGB2101010: -+ case SURFACE_PIXEL_FORMAT_GRPH_ABGR2101010: -+ *bytes_per_element = 4; -+ return true; -+ case SURFACE_PIXEL_FORMAT_GRPH_ARGB16161616: -+ case SURFACE_PIXEL_FORMAT_GRPH_ARGB16161616F: -+ case SURFACE_PIXEL_FORMAT_GRPH_ABGR16161616F: -+ *bytes_per_element = 8; -+ return true; -+ default: -+ return false; -+ } -+} -+ -+static bool dcc_support_swizzle( -+ enum swizzle_mode_values swizzle, -+ unsigned int bytes_per_element, -+ enum segment_order *segment_order_horz, -+ enum segment_order *segment_order_vert) -+{ -+ bool standard_swizzle = false; -+ bool display_swizzle = false; -+ -+ switch (swizzle) { -+ case DC_SW_4KB_S: -+ case DC_SW_64KB_S: -+ case DC_SW_VAR_S: -+ case DC_SW_4KB_S_X: -+ case DC_SW_64KB_S_X: -+ case DC_SW_VAR_S_X: -+ standard_swizzle = true; -+ break; -+ case DC_SW_4KB_D: -+ case DC_SW_64KB_D: -+ case DC_SW_VAR_D: -+ case DC_SW_4KB_D_X: -+ case DC_SW_64KB_D_X: -+ case DC_SW_VAR_D_X: -+ display_swizzle = true; -+ break; -+ default: -+ break; -+ }; -+ -+ if (bytes_per_element == 1 && standard_swizzle) { -+ *segment_order_horz = segment_order__contiguous; -+ *segment_order_vert = segment_order__na; -+ return true; -+ } -+ if (bytes_per_element == 2 && standard_swizzle) { -+ *segment_order_horz = segment_order__non_contiguous; -+ *segment_order_vert = segment_order__contiguous; -+ return true; -+ } -+ if (bytes_per_element == 4 && standard_swizzle) { -+ *segment_order_horz = segment_order__non_contiguous; -+ *segment_order_vert = segment_order__contiguous; -+ return true; -+ } -+ if (bytes_per_element == 8 && standard_swizzle) { -+ *segment_order_horz = segment_order__na; -+ *segment_order_vert = segment_order__contiguous; -+ return true; -+ } -+ if (bytes_per_element == 8 && display_swizzle) { -+ *segment_order_horz = segment_order__contiguous; -+ *segment_order_vert = segment_order__non_contiguous; -+ return true; -+ } -+ -+ return false; -+} -+ -+static void get_blk256_size(unsigned int *blk256_width, unsigned int *blk256_height, -+ unsigned int bytes_per_element) -+{ -+ /* copied from DML. might want to refactor DML to leverage from DML */ -+ /* DML : get_blk256_size */ -+ if (bytes_per_element == 1) { -+ *blk256_width = 16; -+ *blk256_height = 16; -+ } else if (bytes_per_element == 2) { -+ *blk256_width = 16; -+ *blk256_height = 8; -+ } else if (bytes_per_element == 4) { -+ *blk256_width = 8; -+ *blk256_height = 8; -+ } else if (bytes_per_element == 8) { -+ *blk256_width = 8; -+ *blk256_height = 4; -+ } -+} -+ -+static void det_request_size( -+ unsigned int height, -+ unsigned int width, -+ unsigned int bpe, -+ bool *req128_horz_wc, -+ bool *req128_vert_wc) -+{ -+ unsigned int detile_buf_size = 164 * 1024; /* 164KB for DCN1.0 */ -+ -+ unsigned int blk256_height = 0; -+ unsigned int blk256_width = 0; -+ unsigned int swath_bytes_horz_wc, swath_bytes_vert_wc; -+ -+ get_blk256_size(&blk256_width, &blk256_height, bpe); -+ -+ swath_bytes_horz_wc = height * blk256_height * bpe; -+ swath_bytes_vert_wc = width * blk256_width * bpe; -+ -+ *req128_horz_wc = (2 * swath_bytes_horz_wc <= detile_buf_size) ? -+ false : /* full 256B request */ -+ true; /* half 128b request */ -+ -+ *req128_vert_wc = (2 * swath_bytes_vert_wc <= detile_buf_size) ? -+ false : /* full 256B request */ -+ true; /* half 128b request */ -+} -+ -+static bool get_dcc_compression_cap(const struct dc *dc, -+ const struct dc_dcc_surface_param *input, -+ struct dc_surface_dcc_cap *output) -+{ -+ /* implement section 1.6.2.1 of DCN1_Programming_Guide.docx */ -+ enum dcc_control dcc_control; -+ unsigned int bpe; -+ enum segment_order segment_order_horz, segment_order_vert; -+ bool req128_horz_wc, req128_vert_wc; -+ -+ memset(output, 0, sizeof(*output)); -+ -+ if (dc->debug.disable_dcc) -+ return false; -+ -+ if (!dcc_support_pixel_format(input->format, -+ &bpe)) -+ return false; -+ -+ if (!dcc_support_swizzle(input->swizzle_mode, bpe, -+ &segment_order_horz, &segment_order_vert)) -+ return false; -+ -+ det_request_size(input->surface_size.height, input->surface_size.width, -+ bpe, &req128_horz_wc, &req128_vert_wc); -+ -+ if (!req128_horz_wc && !req128_vert_wc) { -+ dcc_control = dcc_control__256_256_xxx; -+ } else if (input->scan == SCAN_DIRECTION_HORIZONTAL) { -+ if (!req128_horz_wc) -+ dcc_control = dcc_control__256_256_xxx; -+ else if (segment_order_horz == segment_order__contiguous) -+ dcc_control = dcc_control__128_128_xxx; -+ else -+ dcc_control = dcc_control__256_64_64; -+ } else if (input->scan == SCAN_DIRECTION_VERTICAL) { -+ if (!req128_vert_wc) -+ dcc_control = dcc_control__256_256_xxx; -+ else if (segment_order_vert == segment_order__contiguous) -+ dcc_control = dcc_control__128_128_xxx; -+ else -+ dcc_control = dcc_control__256_64_64; -+ } else { -+ if ((req128_horz_wc && -+ segment_order_horz == segment_order__non_contiguous) || -+ (req128_vert_wc && -+ segment_order_vert == segment_order__non_contiguous)) -+ /* access_dir not known, must use most constraining */ -+ dcc_control = dcc_control__256_64_64; -+ else -+ /* reg128 is true for either horz and vert -+ * but segment_order is contiguous -+ */ -+ dcc_control = dcc_control__128_128_xxx; -+ } -+ -+ switch (dcc_control) { -+ case dcc_control__256_256_xxx: -+ output->grph.rgb.max_uncompressed_blk_size = 256; -+ output->grph.rgb.max_compressed_blk_size = 256; -+ output->grph.rgb.independent_64b_blks = false; -+ break; -+ case dcc_control__128_128_xxx: -+ output->grph.rgb.max_uncompressed_blk_size = 128; -+ output->grph.rgb.max_compressed_blk_size = 128; -+ output->grph.rgb.independent_64b_blks = false; -+ break; -+ case dcc_control__256_64_64: -+ output->grph.rgb.max_uncompressed_blk_size = 256; -+ output->grph.rgb.max_compressed_blk_size = 64; -+ output->grph.rgb.independent_64b_blks = true; -+ break; -+ } -+ output->capable = true; -+ output->const_color_support = false; -+ -+ return true; -+} -+ -+ -+static void dcn10_destroy_resource_pool(struct resource_pool **pool) -+{ -+ struct dcn10_resource_pool *dcn10_pool = TO_DCN10_RES_POOL(*pool); -+ -+ destruct(dcn10_pool); -+ dm_free(dcn10_pool); -+ *pool = NULL; -+} -+ -+ -+static struct dc_cap_funcs cap_funcs = { -+ .get_dcc_compression_cap = get_dcc_compression_cap -+}; -+ -+static struct resource_funcs dcn10_res_pool_funcs = { -+ .destroy = dcn10_destroy_resource_pool, -+ .link_enc_create = dcn10_link_encoder_create, -+ .validate_with_context = dcn10_validate_with_context, -+ .validate_guaranteed = dcn10_validate_guaranteed, -+ .validate_bandwidth = dcn_validate_bandwidth, -+ .acquire_idle_pipe_for_layer = dcn10_acquire_idle_pipe_for_layer, -+}; -+ -+static bool construct( -+ uint8_t num_virtual_links, -+ struct core_dc *dc, -+ struct dcn10_resource_pool *pool) -+{ -+ int i; -+ struct dc_context *ctx = dc->ctx; -+ -+ ctx->dc_bios->regs = &bios_regs; -+ -+ 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; -+ -+ /* TODO: Hardcode to correct number of functional controllers */ -+ pool->base.pipe_count = 4; -+ dc->public.caps.max_downscale_ratio = 200; -+ dc->public.caps.i2c_speed_in_khz = 100; -+ dc->public.caps.max_cursor_size = 256; -+ -+ if (dc->ctx->dce_environment == DCE_ENV_PRODUCTION_DRV) -+ dc->public.debug = debug_defaults_drv; -+ else -+ dc->public.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); -+ 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; -+ -+ 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 clock_source_create_fail; -+ } -+ } -+ -+ if (!IS_FPGA_MAXIMUS_DC(dc->ctx->dce_environment)) { -+ pool->base.display_clock = dce120_disp_clk_create(ctx, -+ &disp_clk_regs, -+ &disp_clk_shift, -+ &disp_clk_mask); -+ if (pool->base.display_clock == NULL) { -+ dm_error("DC: failed to create display clock!\n"); -+ BREAK_TO_DEBUGGER(); -+ goto disp_clk_create_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 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; -+ } -+ -+ dml_init_instance(&dc->dml, DML_PROJECT_RAVEN1); -+ dc->dcn_ip = dcn10_ip_defaults; -+ dc->dcn_soc = dcn10_soc_defaults; -+ if (!dc->public.debug.disable_pplib_clock_request) -+ dcn_bw_update_from_pplib(dc); -+ dcn_bw_sync_calcs_and_dml(dc); -+ if (!dc->public.debug.disable_pplib_wm_range) -+ dcn_bw_notify_pplib_of_wm_ranges(dc); -+ -+ { -+ #if defined(CONFIG_DRM_AMD_DC_DCN1_0) -+ 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 irqs_create_fail; -+ #endif -+ } -+ -+ /* mem input -> ipp -> transform -> opp -> TG */ -+ for (i = 0; i < pool->base.pipe_count; i++) { -+ pool->base.mis[i] = dcn10_mem_input_create(ctx, i); -+ if (pool->base.mis[i] == NULL) { -+ BREAK_TO_DEBUGGER(); -+ dm_error( -+ "DC: failed to create memory input!\n"); -+ goto mi_create_fail; -+ } -+ -+ pool->base.ipps[i] = dcn10_ipp_create(ctx, i); -+ if (pool->base.ipps[i] == NULL) { -+ BREAK_TO_DEBUGGER(); -+ dm_error( -+ "DC: failed to create input pixel processor!\n"); -+ goto ipp_create_fail; -+ } -+ -+ pool->base.transforms[i] = dcn10_transform_create(ctx, i); -+ if (pool->base.transforms[i] == NULL) { -+ BREAK_TO_DEBUGGER(); -+ dm_error( -+ "DC: failed to create transform!\n"); -+ goto transform_create_fail; -+ } -+ -+ pool->base.opps[i] = dcn10_opp_create(ctx, i); -+ if (pool->base.opps[i] == NULL) { -+ BREAK_TO_DEBUGGER(); -+ dm_error( -+ "DC: failed to create output pixel processor!\n"); -+ goto opp_create_fail; -+ } -+ -+ pool->base.timing_generators[i] = dcn10_timing_generator_create( -+ ctx, i); -+ if (pool->base.timing_generators[i] == NULL) { -+ BREAK_TO_DEBUGGER(); -+ dm_error("DC: failed to create tg!\n"); -+ goto otg_create_fail; -+ } -+ } -+ -+ pool->base.mpc = dcn10_mpc_create(ctx); -+ -+ if (!resource_construct(num_virtual_links, dc, &pool->base, -+ (!IS_FPGA_MAXIMUS_DC(dc->ctx->dce_environment) ? -+ &res_create_funcs : &res_create_maximus_funcs))) -+ goto res_create_fail; -+ -+ dcn10_hw_sequencer_construct(dc); -+ dc->public.caps.max_surfaces = pool->base.pipe_count; -+ -+ dc->public.cap_funcs = cap_funcs; -+ -+ return true; -+ -+disp_clk_create_fail: -+otg_create_fail: -+opp_create_fail: -+transform_create_fail: -+ipp_create_fail: -+mi_create_fail: -+irqs_create_fail: -+res_create_fail: -+clock_source_create_fail: -+ -+ destruct(pool); -+ -+ return false; -+} -+ -+struct resource_pool *dcn10_create_resource_pool( -+ uint8_t num_virtual_links, -+ struct core_dc *dc) -+{ -+ struct dcn10_resource_pool *pool = -+ dm_alloc(sizeof(struct dcn10_resource_pool)); -+ -+ if (!pool) -+ return NULL; -+ -+ if (construct(num_virtual_links, dc, pool)) -+ return &pool->base; -+ -+ 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 -new file mode 100644 -index 0000000..5f84dbd ---- /dev/null -+++ b/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_resource.h -@@ -0,0 +1,47 @@ -+/* -+* 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" -+ -+#define TO_DCN10_RES_POOL(pool)\ -+ container_of(pool, struct dcn10_resource_pool, base) -+ -+struct core_dc; -+struct resource_pool; -+struct _vcs_dpi_display_pipe_params_st; -+ -+struct dcn10_resource_pool { -+ struct resource_pool base; -+}; -+struct resource_pool *dcn10_create_resource_pool( -+ uint8_t num_virtual_links, -+ struct core_dc *dc); -+ -+ -+#endif /* __DC_RESOURCE_DCN10_H__ */ -+ -diff --git a/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_timing_generator.c b/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_timing_generator.c -new file mode 100644 -index 0000000..d7072132 ---- /dev/null -+++ b/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_timing_generator.c -@@ -0,0 +1,1202 @@ -+/* -+ * 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 "reg_helper.h" -+#include "dcn10_timing_generator.h" -+ -+#define REG(reg)\ -+ tgn10->tg_regs->reg -+ -+#define CTX \ -+ tgn10->base.ctx -+ -+#undef FN -+#define FN(reg_name, field_name) \ -+ tgn10->tg_shift->field_name, tgn10->tg_mask->field_name -+ -+#define STATIC_SCREEN_EVENT_MASK_RANGETIMING_DOUBLE_BUFFER_UPDATE_EN 0x100 -+ -+/** -+* apply_front_porch_workaround TODO FPGA still need? -+* -+* This is a workaround for a bug that has existed since R5xx and has not been -+* fixed keep Front porch at minimum 2 for Interlaced mode or 1 for progressive. -+*/ -+static void tg_apply_front_porch_workaround( -+ struct timing_generator *tg, -+ struct dc_crtc_timing *timing) -+{ -+ if (timing->flags.INTERLACE == 1) { -+ if (timing->v_front_porch < 2) -+ timing->v_front_porch = 2; -+ } else { -+ if (timing->v_front_porch < 1) -+ timing->v_front_porch = 1; -+ } -+} -+ -+static void dcn10_program_global_sync( -+ struct timing_generator *tg) -+{ -+ struct dcn10_timing_generator *tgn10 = DCN10TG_FROM_TG(tg); -+ -+ if (tg->dlg_otg_param.vstartup_start == 0) { -+ BREAK_TO_DEBUGGER(); -+ return; -+ } -+ -+ REG_SET(OTG_VSTARTUP_PARAM, 0, -+ VSTARTUP_START, tg->dlg_otg_param.vstartup_start); -+ -+ REG_SET_2(OTG_VUPDATE_PARAM, 0, -+ VUPDATE_OFFSET, tg->dlg_otg_param.vupdate_offset, -+ VUPDATE_WIDTH, tg->dlg_otg_param.vupdate_width); -+ -+ REG_SET(OTG_VREADY_PARAM, 0, -+ VREADY_OFFSET, tg->dlg_otg_param.vready_offset); -+} -+ -+struct crtc_stereo_flags { -+ uint8_t PROGRAM_STEREO :1; -+ uint8_t PROGRAM_POLARITY :1; -+ uint8_t RIGHT_EYE_POLARITY :1; -+ uint8_t FRAME_PACKED :1; -+ uint8_t DISABLE_STEREO_DP_SYNC :1; -+}; -+ -+static void dcn10_enable_stereo(struct timing_generator *tg, -+ const struct crtc_stereo_flags *flags, -+ const struct dc_crtc_timing *timing) -+{ -+ struct dcn10_timing_generator *tgn10 = DCN10TG_FROM_TG(tg); -+ -+ uint32_t active_width = timing->h_addressable; -+ uint32_t space1_size = timing->v_total - timing->v_addressable; -+ -+ if (flags) { -+ uint32_t stereo_en = flags->FRAME_PACKED == 0 ? 1 : 0; -+ -+ if (flags->PROGRAM_STEREO) -+ REG_UPDATE_3(OTG_STEREO_CONTROL, -+ OTG_STEREO_EN, stereo_en, -+ OTG_STEREO_SYNC_OUTPUT_LINE_NUM, 0, -+ OTG_STEREO_SYNC_OUTPUT_POLARITY, 0); -+ -+ if (flags->PROGRAM_POLARITY) -+ REG_UPDATE(OTG_STEREO_CONTROL, -+ OTG_STEREO_EYE_FLAG_POLARITY, -+ flags->RIGHT_EYE_POLARITY == 0 ? 0:1); -+ -+ if (flags->DISABLE_STEREO_DP_SYNC) -+ REG_UPDATE(OTG_STEREO_CONTROL, -+ OTG_DISABLE_STEREOSYNC_OUTPUT_FOR_DP, 1); -+ -+ if (flags->PROGRAM_STEREO && flags->FRAME_PACKED) -+ REG_UPDATE_3(OTG_3D_STRUCTURE_CONTROL, -+ OTG_3D_STRUCTURE_EN, 1, -+ OTG_3D_STRUCTURE_V_UPDATE_MODE, 1, -+ OTG_3D_STRUCTURE_STEREO_SEL_OVR, 1); -+ -+ } -+ -+ REG_UPDATE(OPPBUF_CONTROL, -+ OPPBUF_ACTIVE_WIDTH, active_width); -+ -+ REG_UPDATE(OPPBUF_3D_PARAMETERS_0, -+ OPPBUF_3D_VACT_SPACE1_SIZE, space1_size); -+ -+ return; -+} -+ -+static void dcn10_disable_stereo(struct timing_generator *tg) -+{ -+ struct dcn10_timing_generator *tgn10 = DCN10TG_FROM_TG(tg); -+ -+ REG_SET(OTG_STEREO_CONTROL, 0, -+ OTG_STEREO_EN, 0); -+ -+ REG_SET_3(OTG_3D_STRUCTURE_CONTROL, 0, -+ OTG_3D_STRUCTURE_EN, 0, -+ OTG_3D_STRUCTURE_V_UPDATE_MODE, 0, -+ OTG_3D_STRUCTURE_STEREO_SEL_OVR, 0); -+ -+ REG_UPDATE(OPPBUF_CONTROL, -+ OPPBUF_ACTIVE_WIDTH, 0); -+ REG_UPDATE(OPPBUF_3D_PARAMETERS_0, -+ OPPBUF_3D_VACT_SPACE1_SIZE, 0); -+ return; -+} -+ -+static bool is_frame_alternate_stereo(enum dc_timing_3d_format fmt) -+{ -+ bool ret = false; -+ if (fmt == TIMING_3D_FORMAT_FRAME_ALTERNATE || -+ fmt == TIMING_3D_FORMAT_INBAND_FA || -+ fmt == TIMING_3D_FORMAT_DP_HDMI_INBAND_FA || -+ fmt == TIMING_3D_FORMAT_SIDEBAND_FA) -+ ret = true; -+ return ret; -+} -+ -+static void dcn10_do_stereo(struct timing_generator *tg, -+ const struct dc_crtc_timing *dc_crtc_timing) -+{ -+ struct crtc_stereo_flags stereo_flags = {0}; -+ if (dc_crtc_timing->timing_3d_format == TIMING_3D_FORMAT_NONE || -+ dc_crtc_timing->timing_3d_format == TIMING_3D_FORMAT_SIDE_BY_SIDE || -+ dc_crtc_timing->timing_3d_format == TIMING_3D_FORMAT_TOP_AND_BOTTOM) -+ dcn10_disable_stereo(tg); -+ else { -+ stereo_flags.PROGRAM_STEREO = 1; -+ stereo_flags.PROGRAM_POLARITY = 1; -+ stereo_flags.DISABLE_STEREO_DP_SYNC = 0; -+ stereo_flags.RIGHT_EYE_POLARITY = -+ dc_crtc_timing->flags.RIGHT_EYE_3D_POLARITY; -+ if (dc_crtc_timing->timing_3d_format == -+ TIMING_3D_FORMAT_HW_FRAME_PACKING) -+ stereo_flags.FRAME_PACKED = 1; -+ -+ if (is_frame_alternate_stereo( -+ dc_crtc_timing->timing_3d_format) || -+ dc_crtc_timing->timing_3d_format == -+ TIMING_3D_FORMAT_HW_FRAME_PACKING) -+ dcn10_enable_stereo(tg, &stereo_flags, dc_crtc_timing); -+ } -+} -+ -+/** -+ * program_timing_generator used by mode timing set -+ * Program CRTC Timing Registers - OTG_H_*, OTG_V_*, Pixel repetition. -+ * Including SYNC. Call BIOS command table to program Timings. -+ */ -+static void tg_program_timing_generator( -+ struct timing_generator *tg, -+ const struct dc_crtc_timing *dc_crtc_timing) -+{ -+ struct dc_crtc_timing patched_crtc_timing; -+ uint32_t vesa_sync_start; -+ uint32_t asic_blank_end; -+ uint32_t asic_blank_start; -+ uint32_t v_total; -+ uint32_t v_sync_end; -+ uint32_t v_init, v_fp2; -+ uint32_t h_sync_polarity, v_sync_polarity; -+ uint32_t interlace_factor; -+ uint32_t start_point = 0; -+ uint32_t field_num = 0; -+ uint32_t h_div_2; -+ -+ -+ struct dcn10_timing_generator *tgn10 = DCN10TG_FROM_TG(tg); -+ -+ patched_crtc_timing = *dc_crtc_timing; -+ tg_apply_front_porch_workaround(tg, &patched_crtc_timing); -+ -+ /* Load horizontal timing */ -+ -+ /* CRTC_H_TOTAL = vesa.h_total - 1 */ -+ REG_SET(OTG_H_TOTAL, 0, -+ OTG_H_TOTAL, patched_crtc_timing.h_total - 1); -+ -+ /* h_sync_start = 0, h_sync_end = vesa.h_sync_width */ -+ REG_UPDATE_2(OTG_H_SYNC_A, -+ OTG_H_SYNC_A_START, 0, -+ OTG_H_SYNC_A_END, patched_crtc_timing.h_sync_width); -+ -+ /* asic_h_blank_end = HsyncWidth + HbackPorch = -+ * vesa. usHorizontalTotal - vesa. usHorizontalSyncStart - -+ * vesa.h_left_border -+ */ -+ vesa_sync_start = patched_crtc_timing.h_addressable + -+ patched_crtc_timing.h_border_right + -+ patched_crtc_timing.h_front_porch; -+ -+ asic_blank_end = patched_crtc_timing.h_total - -+ vesa_sync_start - -+ patched_crtc_timing.h_border_left; -+ -+ /* h_blank_start = v_blank_end + v_active */ -+ asic_blank_start = asic_blank_end + -+ patched_crtc_timing.h_border_left + -+ patched_crtc_timing.h_addressable + -+ patched_crtc_timing.h_border_right; -+ -+ REG_UPDATE_2(OTG_H_BLANK_START_END, -+ OTG_H_BLANK_START, asic_blank_start, -+ OTG_H_BLANK_END, asic_blank_end); -+ -+ /* h_sync polarity */ -+ h_sync_polarity = patched_crtc_timing.flags.HSYNC_POSITIVE_POLARITY ? -+ 0 : 1; -+ -+ REG_UPDATE(OTG_H_SYNC_A_CNTL, -+ OTG_H_SYNC_A_POL, h_sync_polarity); -+ -+ /* Load vertical timing */ -+ -+ /* CRTC_V_TOTAL = v_total - 1 */ -+ if (patched_crtc_timing.flags.INTERLACE) { -+ interlace_factor = 2; -+ v_total = 2 * patched_crtc_timing.v_total; -+ } else { -+ interlace_factor = 1; -+ v_total = patched_crtc_timing.v_total - 1; -+ } -+ REG_SET(OTG_V_TOTAL, 0, -+ OTG_V_TOTAL, v_total); -+ -+ /* v_sync_start = 0, v_sync_end = v_sync_width */ -+ v_sync_end = patched_crtc_timing.v_sync_width * interlace_factor; -+ -+ REG_UPDATE_2(OTG_V_SYNC_A, -+ OTG_V_SYNC_A_START, 0, -+ OTG_V_SYNC_A_END, v_sync_end); -+ -+ vesa_sync_start = patched_crtc_timing.v_addressable + -+ patched_crtc_timing.v_border_bottom + -+ patched_crtc_timing.v_front_porch; -+ -+ asic_blank_end = (patched_crtc_timing.v_total - -+ vesa_sync_start - -+ patched_crtc_timing.v_border_top) -+ * interlace_factor; -+ -+ /* v_blank_start = v_blank_end + v_active */ -+ asic_blank_start = asic_blank_end + -+ (patched_crtc_timing.v_border_top + -+ patched_crtc_timing.v_addressable + -+ patched_crtc_timing.v_border_bottom) -+ * interlace_factor; -+ -+ REG_UPDATE_2(OTG_V_BLANK_START_END, -+ OTG_V_BLANK_START, asic_blank_start, -+ OTG_V_BLANK_END, asic_blank_end); -+ -+ -+ /* v_sync polarity */ -+ v_sync_polarity = patched_crtc_timing.flags.VSYNC_POSITIVE_POLARITY ? -+ 0 : 1; -+ -+ REG_UPDATE(OTG_V_SYNC_A_CNTL, -+ OTG_V_SYNC_A_POL, v_sync_polarity); -+ -+ v_init = asic_blank_start; -+ if (tg->dlg_otg_param.signal == SIGNAL_TYPE_DISPLAY_PORT || -+ tg->dlg_otg_param.signal == SIGNAL_TYPE_DISPLAY_PORT_MST || -+ tg->dlg_otg_param.signal == SIGNAL_TYPE_EDP) { -+ v_init = asic_blank_start; -+ start_point = 1; -+ if (patched_crtc_timing.flags.INTERLACE == 1) -+ field_num = 1; -+ } -+ if (v_init < 0) -+ v_init = 0; -+ v_fp2 = 0; -+ if (tg->dlg_otg_param.vstartup_start > asic_blank_end) -+ v_fp2 = tg->dlg_otg_param.vstartup_start > asic_blank_end; -+ -+ /* Interlace */ -+ if (patched_crtc_timing.flags.INTERLACE == 1) { -+ REG_UPDATE(OTG_INTERLACE_CONTROL, -+ OTG_INTERLACE_ENABLE, 1); -+ v_init = v_init / 2; -+ if ((tg->dlg_otg_param.vstartup_start/2)*2 > asic_blank_end) -+ v_fp2 = v_fp2 / 2; -+ } -+ else -+ REG_UPDATE(OTG_INTERLACE_CONTROL, -+ OTG_INTERLACE_ENABLE, 0); -+ -+ -+ /* VTG enable set to 0 first VInit */ -+ REG_UPDATE(CONTROL, -+ VTG0_ENABLE, 0); -+ -+ REG_UPDATE_2(CONTROL, -+ VTG0_FP2, v_fp2, -+ VTG0_VCOUNT_INIT, v_init); -+ -+ /* original code is using VTG offset to address OTG reg, seems wrong */ -+ REG_UPDATE_2(OTG_CONTROL, -+ OTG_START_POINT_CNTL, start_point, -+ OTG_FIELD_NUMBER_CNTL, field_num); -+ -+ dcn10_program_global_sync(tg); -+ -+ /* TODO -+ * patched_crtc_timing.flags.HORZ_COUNT_BY_TWO == 1 -+ * program_horz_count_by_2 -+ * for DVI 30bpp mode, 0 otherwise -+ * program_horz_count_by_2(tg, &patched_crtc_timing); -+ */ -+ -+ /* Enable stereo - only when we need to pack 3D frame. Other types -+ * of stereo handled in explicit call -+ */ -+ h_div_2 = (dc_crtc_timing->pixel_encoding == PIXEL_ENCODING_YCBCR420) ? -+ 1 : 0; -+ -+ REG_UPDATE(OTG_H_TIMING_CNTL, -+ OTG_H_TIMING_DIV_BY2, h_div_2); -+ -+ /* Enable crtc stereo frame pack tested... todo more -+ */ -+ dcn10_do_stereo(tg, &patched_crtc_timing); -+} -+ -+/** tg_program_blanking -+ * Only programmed part of OTG_H, OTG_V register for set_plane_config -+ * Assume other OTG registers are programmed by video mode set already. -+ * This function is for underlay. DCN will have new sequence. -+ * This function will be removed. Need remove it from set_plane_config -+ */ -+ -+static void tg_program_timing(struct timing_generator *tg, -+ const struct dc_crtc_timing *timing, -+ bool use_vbios) -+{ -+ tg_program_timing_generator(tg, timing); -+} -+ -+/** -+ * unblank_crtc -+ * Call ASIC Control Object to UnBlank CRTC. -+ */ -+static void tg_unblank_crtc(struct timing_generator *tg) -+{ -+ struct dcn10_timing_generator *tgn10 = DCN10TG_FROM_TG(tg); -+ -+ REG_UPDATE_2(OTG_BLANK_CONTROL, -+ OTG_BLANK_DATA_EN, 0, -+ OTG_BLANK_DE_MODE, 0); -+} -+ -+/** -+ * blank_crtc -+ * Call ASIC Control Object to Blank CRTC. -+ */ -+ -+static void tg_blank_crtc(struct timing_generator *tg) -+{ -+ struct dcn10_timing_generator *tgn10 = DCN10TG_FROM_TG(tg); -+ -+ REG_UPDATE_2(OTG_BLANK_CONTROL, -+ OTG_BLANK_DATA_EN, 1, -+ OTG_BLANK_DE_MODE, 0); -+ -+ /* todo: why are we waiting for BLANK_DATA_EN? shouldn't we be waiting -+ * for status? -+ */ -+ REG_WAIT(OTG_BLANK_CONTROL, -+ OTG_BLANK_DATA_EN, 1, -+ 20000, 200000); -+ -+ REG_UPDATE(OTG_DOUBLE_BUFFER_CONTROL, -+ OTG_BLANK_DATA_DOUBLE_BUFFER_EN, 0); -+} -+ -+static void tg_set_blank(struct timing_generator *tg, -+ bool enable_blanking) -+{ -+ if (enable_blanking) -+ tg_blank_crtc(tg); -+ else -+ tg_unblank_crtc(tg); -+} -+ -+static bool tg_is_blanked(struct timing_generator *tg) -+{ -+ struct dcn10_timing_generator *tgn10 = DCN10TG_FROM_TG(tg); -+ uint32_t blank_en; -+ uint32_t blank_state; -+ -+ REG_GET_2(OTG_BLANK_CONTROL, -+ OTG_BLANK_DATA_EN, &blank_en, -+ OTG_CURRENT_BLANK_STATE, &blank_state); -+ -+ return blank_en && blank_state; -+} -+ -+static void enable_optc_clock(struct timing_generator *tg, bool enable) -+{ -+ struct dcn10_timing_generator *tgn10 = DCN10TG_FROM_TG(tg); -+ -+ if (enable) { -+ REG_UPDATE(OPTC_INPUT_CLOCK_CONTROL, -+ OPTC_INPUT_CLK_EN, 1); -+ -+ REG_WAIT(OPTC_INPUT_CLOCK_CONTROL, -+ OPTC_INPUT_CLK_ON, 1, -+ 20000, 200000); -+ -+ /* Enable clock */ -+ REG_UPDATE(OTG_CLOCK_CONTROL, -+ OTG_CLOCK_EN, 1); -+ -+ REG_WAIT(OTG_CLOCK_CONTROL, -+ OTG_CLOCK_ON, 1, -+ 20000, 200000); -+ } else { -+ REG_UPDATE_2(OTG_CLOCK_CONTROL, -+ OTG_CLOCK_GATE_DIS, 0, -+ OTG_CLOCK_EN, 0); -+ -+ REG_WAIT(OTG_CLOCK_CONTROL, -+ OTG_CLOCK_ON, 0, -+ 20000, 200000); -+ -+ REG_UPDATE_2(OPTC_INPUT_CLOCK_CONTROL, -+ OPTC_INPUT_CLK_GATE_DIS, 0, -+ OPTC_INPUT_CLK_EN, 0); -+ -+ REG_WAIT(OPTC_INPUT_CLOCK_CONTROL, -+ OPTC_INPUT_CLK_ON, 0, -+ 20000, 200000); -+ } -+} -+ -+/** -+ * Enable CRTC -+ * Enable CRTC - call ASIC Control Object to enable Timing generator. -+ */ -+static bool tg_enable_crtc(struct timing_generator *tg) -+{ -+ /* TODO FPGA wait for answer -+ * OTG_MASTER_UPDATE_MODE != CRTC_MASTER_UPDATE_MODE -+ * OTG_MASTER_UPDATE_LOCK != CRTC_MASTER_UPDATE_LOCK -+ */ -+ struct dcn10_timing_generator *tgn10 = DCN10TG_FROM_TG(tg); -+ -+ /* opp instance for OTG. For DCN1.0, ODM is remoed. -+ * OPP and OPTC should 1:1 mapping -+ */ -+ REG_UPDATE(OPTC_DATA_SOURCE_SELECT, -+ OPTC_SRC_SEL, tg->inst); -+ -+ /* VTG enable first is for HW workaround */ -+ REG_UPDATE(CONTROL, -+ VTG0_ENABLE, 1); -+ -+ /* Enable CRTC */ -+ REG_UPDATE_2(OTG_CONTROL, -+ OTG_DISABLE_POINT_CNTL, 3, -+ OTG_MASTER_EN, 1); -+ -+ return true; -+} -+ -+/* disable_crtc - call ASIC Control Object to disable Timing generator. */ -+static bool tg_disable_crtc(struct timing_generator *tg) -+{ -+ struct dcn10_timing_generator *tgn10 = DCN10TG_FROM_TG(tg); -+ -+ /* disable otg request until end of the first line -+ * in the vertical blank region -+ */ -+ REG_UPDATE_2(OTG_CONTROL, -+ OTG_DISABLE_POINT_CNTL, 3, -+ OTG_MASTER_EN, 0); -+ -+ REG_UPDATE(CONTROL, -+ VTG0_ENABLE, 0); -+ -+ /* CRTC disabled, so disable clock. */ -+ REG_WAIT(OTG_CLOCK_CONTROL, -+ OTG_BUSY, 0, -+ 2000, 20000); -+ -+ return true; -+} -+ -+ -+static void tg_program_blank_color( -+ struct timing_generator *tg, -+ const struct tg_color *black_color) -+{ -+ struct dcn10_timing_generator *tgn10 = DCN10TG_FROM_TG(tg); -+ -+ REG_SET_3(OTG_BLACK_COLOR, 0, -+ OTG_BLACK_COLOR_B_CB, black_color->color_b_cb, -+ OTG_BLACK_COLOR_G_Y, black_color->color_g_y, -+ OTG_BLACK_COLOR_R_CR, black_color->color_r_cr); -+} -+ -+/** -+ * dcn10_dcn10_timing_generator_disable_vga -+ * Turn OFF VGA Mode and Timing - DxVGA_CONTROL -+ * VGA Mode and VGA Timing is used by VBIOS on CRT Monitors; -+ */ -+/* TODO FPGA FPGA setup is done by Diag which does not enable VGA mode. -+ * VGA is disable by ASIC default. This function is not needed for -+ * FPGA story. -+ * usage: -+ * init_hw within dc.c -+ * disable_vga_and_power_gate_all_controllers within dce110_hw_sequencer.c -+ * We may move init_hw into DC specific so that we can remove -+ * .disable_vga from upper layer stack -+ */ -+static void dcn10_timing_generator_disable_vga( -+ struct timing_generator *tg) -+{ -+ struct dcn10_timing_generator *tgn10 = DCN10TG_FROM_TG(tg); -+ -+ switch (tgn10->base.inst) { -+ case 0: -+ REG_WRITE(D1VGA_CONTROL, 0); -+ break; -+ case 1: -+ REG_WRITE(D2VGA_CONTROL, 0); -+ break; -+ case 2: -+ REG_WRITE(D2VGA_CONTROL, 0); -+ break; -+ case 3: -+ REG_WRITE(D4VGA_CONTROL, 0); -+ break; -+ default: -+ break; -+ } -+} -+ -+static bool tg_validate_timing( -+ struct timing_generator *tg, -+ const struct dc_crtc_timing *timing) -+{ -+ uint32_t interlace_factor; -+ uint32_t v_blank; -+ uint32_t h_blank; -+ uint32_t min_v_blank; -+ struct dcn10_timing_generator *tgn10 = DCN10TG_FROM_TG(tg); -+ -+ ASSERT(timing != NULL); -+ -+ interlace_factor = timing->flags.INTERLACE ? 2 : 1; -+ v_blank = (timing->v_total - timing->v_addressable - -+ timing->v_border_top - timing->v_border_bottom) * -+ interlace_factor; -+ -+ h_blank = (timing->h_total - timing->h_addressable - -+ timing->h_border_right - -+ timing->h_border_left); -+ -+ if (timing->timing_3d_format != TIMING_3D_FORMAT_NONE && -+ timing->timing_3d_format != TIMING_3D_FORMAT_HW_FRAME_PACKING && -+ timing->timing_3d_format != TIMING_3D_FORMAT_TOP_AND_BOTTOM && -+ timing->timing_3d_format != TIMING_3D_FORMAT_SIDE_BY_SIDE && -+ timing->timing_3d_format != TIMING_3D_FORMAT_FRAME_ALTERNATE) -+ return false; -+ -+ /* Temporarily blocking interlacing mode until it's supported */ -+ if (timing->flags.INTERLACE == 1) -+ return false; -+ -+ /* Check maximum number of pixels supported by Timing Generator -+ * (Currently will never fail, in order to fail needs display which -+ * needs more than 8192 horizontal and -+ * more than 8192 vertical total pixels) -+ */ -+ if (timing->h_total > tgn10->max_h_total || -+ timing->v_total > tgn10->max_v_total) -+ return false; -+ -+ -+ if (h_blank < tgn10->min_h_blank) -+ return false; -+ -+ if (timing->h_sync_width < tgn10->min_h_sync_width || -+ timing->v_sync_width < tgn10->min_v_sync_width) -+ return false; -+ -+ min_v_blank = timing->flags.INTERLACE?tgn10->min_v_blank_interlace:tgn10->min_v_blank; -+ -+ if (v_blank < min_v_blank) -+ return false; -+ -+ return true; -+ -+} -+ -+/* -+ * get_vblank_counter -+ * -+ * @brief -+ * Get counter for vertical blanks. use register CRTC_STATUS_FRAME_COUNT which -+ * holds the counter of frames. -+ * -+ * @param -+ * struct timing_generator *tg - [in] timing generator which controls the -+ * desired CRTC -+ * -+ * @return -+ * Counter of frames, which should equal to number of vblanks. -+ */ -+static uint32_t tg_get_vblank_counter(struct timing_generator *tg) -+{ -+ struct dcn10_timing_generator *tgn10 = DCN10TG_FROM_TG(tg); -+ uint32_t frame_count; -+ -+ REG_GET(OTG_STATUS_FRAME_COUNT, -+ OTG_FRAME_COUNT, &frame_count); -+ -+ return frame_count; -+} -+ -+void dcn10_lock(struct timing_generator *tg) -+{ -+ struct dcn10_timing_generator *tgn10 = DCN10TG_FROM_TG(tg); -+ -+ REG_SET(OTG_MASTER_UPDATE_LOCK, 0, -+ OTG_MASTER_UPDATE_LOCK, 1); -+} -+ -+void dcn10_unlock(struct timing_generator *tg) -+{ -+ struct dcn10_timing_generator *tgn10 = DCN10TG_FROM_TG(tg); -+ -+ REG_SET(OTG_MASTER_UPDATE_LOCK, 0, -+ OTG_MASTER_UPDATE_LOCK, 0); -+ -+ /* why are we waiting here? */ -+ REG_WAIT(OTG_DOUBLE_BUFFER_CONTROL, -+ OTG_UPDATE_PENDING, 0, -+ 20000, 200000); -+} -+ -+static void dcn10_get_position(struct timing_generator *tg, -+ struct crtc_position *position) -+{ -+ struct dcn10_timing_generator *tgn10 = DCN10TG_FROM_TG(tg); -+ -+ REG_GET_2(OTG_STATUS_POSITION, -+ OTG_HORZ_COUNT, &position->horizontal_count, -+ OTG_VERT_COUNT, &position->vertical_count); -+ -+ REG_GET(OTG_NOM_VERT_POSITION, -+ OTG_VERT_COUNT_NOM, &position->nominal_vcount); -+} -+ -+bool dcn10_is_counter_moving(struct timing_generator *tg) -+{ -+ struct crtc_position position1, position2; -+ -+ tg->funcs->get_position(tg, &position1); -+ tg->funcs->get_position(tg, &position2); -+ -+ if (position1.horizontal_count == position2.horizontal_count && -+ position1.vertical_count == position2.vertical_count) -+ return false; -+ else -+ return true; -+} -+ -+static bool dcn10_did_triggered_reset_occur( -+ struct timing_generator *tg) -+{ -+ struct dcn10_timing_generator *tgn10 = DCN10TG_FROM_TG(tg); -+ uint32_t occurred; -+ -+ REG_GET(OTG_FORCE_COUNT_NOW_CNTL, -+ OTG_FORCE_COUNT_NOW_OCCURRED, &occurred); -+ -+ return occurred != 0; -+} -+ -+static void dcn10_enable_reset_trigger(struct timing_generator *tg, int source_tg_inst) -+{ -+ struct dcn10_timing_generator *tgn10 = DCN10TG_FROM_TG(tg); -+ uint32_t falling_edge; -+ -+ REG_GET(OTG_V_SYNC_A_CNTL, -+ OTG_V_SYNC_A_POL, &falling_edge); -+ -+ if (falling_edge) -+ REG_SET_3(OTG_TRIGA_CNTL, 0, -+ /* vsync signal from selected OTG pipe based -+ * on OTG_TRIG_SOURCE_PIPE_SELECT setting -+ */ -+ OTG_TRIGA_SOURCE_SELECT, 20, -+ OTG_TRIGA_SOURCE_PIPE_SELECT, source_tg_inst, -+ /* always detect falling edge */ -+ OTG_TRIGA_FALLING_EDGE_DETECT_CNTL, 1); -+ else -+ REG_SET_3(OTG_TRIGA_CNTL, 0, -+ /* vsync signal from selected OTG pipe based -+ * on OTG_TRIG_SOURCE_PIPE_SELECT setting -+ */ -+ OTG_TRIGA_SOURCE_SELECT, 20, -+ OTG_TRIGA_SOURCE_PIPE_SELECT, source_tg_inst, -+ /* always detect rising edge */ -+ OTG_TRIGA_RISING_EDGE_DETECT_CNTL, 1); -+ -+ REG_SET(OTG_FORCE_COUNT_NOW_CNTL, 0, -+ /* force H count to H_TOTAL and V count to V_TOTAL in -+ * progressive mode and V_TOTAL-1 in interlaced mode -+ */ -+ OTG_FORCE_COUNT_NOW_MODE, 2); -+} -+ -+static void dcn10_disable_reset_trigger(struct timing_generator *tg) -+{ -+ struct dcn10_timing_generator *tgn10 = DCN10TG_FROM_TG(tg); -+ -+ REG_WRITE(OTG_TRIGA_CNTL, 0); -+ -+ REG_SET(OTG_FORCE_COUNT_NOW_CNTL, 0, -+ OTG_FORCE_COUNT_NOW_CLEAR, 1); -+} -+ -+static void dcn10_wait_for_state(struct timing_generator *tg, -+ enum crtc_state state) -+{ -+ struct dcn10_timing_generator *tgn10 = DCN10TG_FROM_TG(tg); -+ -+ switch (state) { -+ case CRTC_STATE_VBLANK: -+ REG_WAIT(OTG_STATUS, -+ OTG_V_BLANK, 1, -+ 100, 100000); /* 1 vupdate at 10hz */ -+ break; -+ -+ case CRTC_STATE_VACTIVE: -+ REG_WAIT(OTG_STATUS, -+ OTG_V_ACTIVE_DISP, 1, -+ 100, 100000); /* 1 vupdate at 10hz */ -+ break; -+ -+ default: -+ break; -+ } -+} -+ -+static void set_early_control( -+ struct timing_generator *tg, -+ uint32_t early_cntl) -+{ -+ /* asic design change, do not need this control -+ * empty for share caller logic -+ */ -+} -+ -+ -+static void set_static_screen_control( -+ struct timing_generator *tg, -+ uint32_t value) -+{ -+ struct dcn10_timing_generator *tgn10 = DCN10TG_FROM_TG(tg); -+ -+ /* Bit 8 is no longer applicable in RV for PSR case, -+ * set bit 8 to 0 if given -+ */ -+ if ((value & STATIC_SCREEN_EVENT_MASK_RANGETIMING_DOUBLE_BUFFER_UPDATE_EN) -+ != 0) -+ value = value & -+ ~STATIC_SCREEN_EVENT_MASK_RANGETIMING_DOUBLE_BUFFER_UPDATE_EN; -+ -+ REG_SET_2(OTG_STATIC_SCREEN_CONTROL, 0, -+ OTG_STATIC_SCREEN_EVENT_MASK, value, -+ OTG_STATIC_SCREEN_FRAME_COUNT, 2); -+} -+ -+ -+/** -+ ***************************************************************************** -+ * Function: set_drr -+ * -+ * @brief -+ * Program dynamic refresh rate registers m_OTGx_OTG_V_TOTAL_*. -+ * -+ ***************************************************************************** -+ */ -+void dcn10_timing_generator_set_drr( -+ struct timing_generator *tg, -+ const struct drr_params *params) -+{ -+ struct dcn10_timing_generator *tgn10 = DCN10TG_FROM_TG(tg); -+ -+ if (params != NULL && -+ params->vertical_total_max > 0 && -+ params->vertical_total_min > 0) { -+ -+ REG_SET(OTG_V_TOTAL_MAX, 0, -+ OTG_V_TOTAL_MAX, params->vertical_total_max - 1); -+ -+ REG_SET(OTG_V_TOTAL_MIN, 0, -+ OTG_V_TOTAL_MIN, params->vertical_total_min - 1); -+ -+ REG_UPDATE_5(OTG_V_TOTAL_CONTROL, -+ OTG_V_TOTAL_MIN_SEL, 1, -+ OTG_V_TOTAL_MAX_SEL, 1, -+ OTG_FORCE_LOCK_ON_EVENT, 0, -+ OTG_SET_V_TOTAL_MIN_MASK_EN, 0, -+ OTG_SET_V_TOTAL_MIN_MASK, 0); -+ } else { -+ REG_SET(OTG_V_TOTAL_MIN, 0, -+ OTG_V_TOTAL_MIN, 0); -+ -+ REG_SET(OTG_V_TOTAL_MAX, 0, -+ OTG_V_TOTAL_MAX, 0); -+ -+ REG_UPDATE_4(OTG_V_TOTAL_CONTROL, -+ OTG_SET_V_TOTAL_MIN_MASK, 0, -+ OTG_V_TOTAL_MIN_SEL, 0, -+ OTG_V_TOTAL_MAX_SEL, 0, -+ OTG_FORCE_LOCK_ON_EVENT, 0); -+ } -+} -+ -+static void dcn10_timing_generator_set_test_pattern( -+ struct timing_generator *tg, -+ /* TODO: replace 'controller_dp_test_pattern' by 'test_pattern_mode' -+ * because this is not DP-specific (which is probably somewhere in DP -+ * encoder) */ -+ enum controller_dp_test_pattern test_pattern, -+ enum dc_color_depth color_depth) -+{ -+ struct dcn10_timing_generator *tgn10 = DCN10TG_FROM_TG(tg); -+ enum test_pattern_color_format bit_depth; -+ enum test_pattern_dyn_range dyn_range; -+ enum test_pattern_mode mode; -+ uint32_t pattern_mask; -+ uint32_t pattern_data; -+ /* color ramp generator mixes 16-bits color */ -+ uint32_t src_bpc = 16; -+ /* requested bpc */ -+ uint32_t dst_bpc; -+ uint32_t index; -+ /* RGB values of the color bars. -+ * Produce two RGB colors: RGB0 - white (all Fs) -+ * and RGB1 - black (all 0s) -+ * (three RGB components for two colors) -+ */ -+ uint16_t src_color[6] = {0xFFFF, 0xFFFF, 0xFFFF, 0x0000, -+ 0x0000, 0x0000}; -+ /* dest color (converted to the specified color format) */ -+ uint16_t dst_color[6]; -+ uint32_t inc_base; -+ -+ /* translate to bit depth */ -+ switch (color_depth) { -+ case COLOR_DEPTH_666: -+ bit_depth = TEST_PATTERN_COLOR_FORMAT_BPC_6; -+ break; -+ case COLOR_DEPTH_888: -+ bit_depth = TEST_PATTERN_COLOR_FORMAT_BPC_8; -+ break; -+ case COLOR_DEPTH_101010: -+ bit_depth = TEST_PATTERN_COLOR_FORMAT_BPC_10; -+ break; -+ case COLOR_DEPTH_121212: -+ bit_depth = TEST_PATTERN_COLOR_FORMAT_BPC_12; -+ break; -+ default: -+ bit_depth = TEST_PATTERN_COLOR_FORMAT_BPC_8; -+ break; -+ } -+ -+ switch (test_pattern) { -+ case CONTROLLER_DP_TEST_PATTERN_COLORSQUARES: -+ case CONTROLLER_DP_TEST_PATTERN_COLORSQUARES_CEA: -+ { -+ dyn_range = (test_pattern == -+ CONTROLLER_DP_TEST_PATTERN_COLORSQUARES_CEA ? -+ TEST_PATTERN_DYN_RANGE_CEA : -+ TEST_PATTERN_DYN_RANGE_VESA); -+ mode = TEST_PATTERN_MODE_COLORSQUARES_RGB; -+ -+ REG_UPDATE_2(OTG_TEST_PATTERN_PARAMETERS, -+ OTG_TEST_PATTERN_VRES, 6, -+ OTG_TEST_PATTERN_HRES, 6); -+ -+ REG_UPDATE_4(OTG_TEST_PATTERN_CONTROL, -+ OTG_TEST_PATTERN_EN, 1, -+ OTG_TEST_PATTERN_MODE, mode, -+ OTG_TEST_PATTERN_DYNAMIC_RANGE, dyn_range, -+ OTG_TEST_PATTERN_COLOR_FORMAT, bit_depth); -+ } -+ break; -+ -+ case CONTROLLER_DP_TEST_PATTERN_VERTICALBARS: -+ case CONTROLLER_DP_TEST_PATTERN_HORIZONTALBARS: -+ { -+ mode = (test_pattern == -+ CONTROLLER_DP_TEST_PATTERN_VERTICALBARS ? -+ TEST_PATTERN_MODE_VERTICALBARS : -+ TEST_PATTERN_MODE_HORIZONTALBARS); -+ -+ switch (bit_depth) { -+ case TEST_PATTERN_COLOR_FORMAT_BPC_6: -+ dst_bpc = 6; -+ break; -+ case TEST_PATTERN_COLOR_FORMAT_BPC_8: -+ dst_bpc = 8; -+ break; -+ case TEST_PATTERN_COLOR_FORMAT_BPC_10: -+ dst_bpc = 10; -+ break; -+ default: -+ dst_bpc = 8; -+ break; -+ } -+ -+ /* adjust color to the required colorFormat */ -+ for (index = 0; index < 6; index++) { -+ /* dst = 2^dstBpc * src / 2^srcBpc = src >> -+ * (srcBpc - dstBpc); -+ */ -+ dst_color[index] = -+ src_color[index] >> (src_bpc - dst_bpc); -+ /* CRTC_TEST_PATTERN_DATA has 16 bits, -+ * lowest 6 are hardwired to ZERO -+ * color bits should be left aligned aligned to MSB -+ * XXXXXXXXXX000000 for 10 bit, -+ * XXXXXXXX00000000 for 8 bit and XXXXXX0000000000 for 6 -+ */ -+ dst_color[index] <<= (16 - dst_bpc); -+ } -+ -+ REG_WRITE(OTG_TEST_PATTERN_PARAMETERS, 0); -+ -+ /* We have to write the mask before data, similar to pipeline. -+ * For example, for 8 bpc, if we want RGB0 to be magenta, -+ * and RGB1 to be cyan, -+ * we need to make 7 writes: -+ * MASK DATA -+ * 000001 00000000 00000000 set mask to R0 -+ * 000010 11111111 00000000 R0 255, 0xFF00, set mask to G0 -+ * 000100 00000000 00000000 G0 0, 0x0000, set mask to B0 -+ * 001000 11111111 00000000 B0 255, 0xFF00, set mask to R1 -+ * 010000 00000000 00000000 R1 0, 0x0000, set mask to G1 -+ * 100000 11111111 00000000 G1 255, 0xFF00, set mask to B1 -+ * 100000 11111111 00000000 B1 255, 0xFF00 -+ * -+ * we will make a loop of 6 in which we prepare the mask, -+ * then write, then prepare the color for next write. -+ * first iteration will write mask only, -+ * but each next iteration color prepared in -+ * previous iteration will be written within new mask, -+ * the last component will written separately, -+ * mask is not changing between 6th and 7th write -+ * and color will be prepared by last iteration -+ */ -+ -+ /* write color, color values mask in CRTC_TEST_PATTERN_MASK -+ * is B1, G1, R1, B0, G0, R0 -+ */ -+ pattern_data = 0; -+ for (index = 0; index < 6; index++) { -+ /* prepare color mask, first write PATTERN_DATA -+ * will have all zeros -+ */ -+ pattern_mask = (1 << index); -+ -+ /* write color component */ -+ REG_SET_2(OTG_TEST_PATTERN_COLOR, 0, -+ OTG_TEST_PATTERN_MASK, pattern_mask, -+ OTG_TEST_PATTERN_DATA, pattern_data); -+ -+ /* prepare next color component, -+ * will be written in the next iteration -+ */ -+ pattern_data = dst_color[index]; -+ } -+ /* write last color component, -+ * it's been already prepared in the loop -+ */ -+ REG_SET_2(OTG_TEST_PATTERN_COLOR, 0, -+ OTG_TEST_PATTERN_MASK, pattern_mask, -+ OTG_TEST_PATTERN_DATA, pattern_data); -+ -+ /* enable test pattern */ -+ REG_UPDATE_4(OTG_TEST_PATTERN_CONTROL, -+ OTG_TEST_PATTERN_EN, 1, -+ OTG_TEST_PATTERN_MODE, mode, -+ OTG_TEST_PATTERN_DYNAMIC_RANGE, 0, -+ OTG_TEST_PATTERN_COLOR_FORMAT, bit_depth); -+ } -+ break; -+ -+ case CONTROLLER_DP_TEST_PATTERN_COLORRAMP: -+ { -+ mode = (bit_depth == -+ TEST_PATTERN_COLOR_FORMAT_BPC_10 ? -+ TEST_PATTERN_MODE_DUALRAMP_RGB : -+ TEST_PATTERN_MODE_SINGLERAMP_RGB); -+ -+ switch (bit_depth) { -+ case TEST_PATTERN_COLOR_FORMAT_BPC_6: -+ dst_bpc = 6; -+ break; -+ case TEST_PATTERN_COLOR_FORMAT_BPC_8: -+ dst_bpc = 8; -+ break; -+ case TEST_PATTERN_COLOR_FORMAT_BPC_10: -+ dst_bpc = 10; -+ break; -+ default: -+ dst_bpc = 8; -+ break; -+ } -+ -+ /* increment for the first ramp for one color gradation -+ * 1 gradation for 6-bit color is 2^10 -+ * gradations in 16-bit color -+ */ -+ inc_base = (src_bpc - dst_bpc); -+ -+ switch (bit_depth) { -+ case TEST_PATTERN_COLOR_FORMAT_BPC_6: -+ { -+ REG_UPDATE_5(OTG_TEST_PATTERN_PARAMETERS, -+ OTG_TEST_PATTERN_INC0, inc_base, -+ OTG_TEST_PATTERN_INC1, 0, -+ OTG_TEST_PATTERN_HRES, 6, -+ OTG_TEST_PATTERN_VRES, 6, -+ OTG_TEST_PATTERN_RAMP0_OFFSET, 0); -+ } -+ break; -+ case TEST_PATTERN_COLOR_FORMAT_BPC_8: -+ { -+ REG_UPDATE_5(OTG_TEST_PATTERN_PARAMETERS, -+ OTG_TEST_PATTERN_INC0, inc_base, -+ OTG_TEST_PATTERN_INC1, 0, -+ OTG_TEST_PATTERN_HRES, 8, -+ OTG_TEST_PATTERN_VRES, 6, -+ OTG_TEST_PATTERN_RAMP0_OFFSET, 0); -+ } -+ break; -+ case TEST_PATTERN_COLOR_FORMAT_BPC_10: -+ { -+ REG_UPDATE_5(OTG_TEST_PATTERN_PARAMETERS, -+ OTG_TEST_PATTERN_INC0, inc_base, -+ OTG_TEST_PATTERN_INC1, inc_base + 2, -+ OTG_TEST_PATTERN_HRES, 8, -+ OTG_TEST_PATTERN_VRES, 5, -+ OTG_TEST_PATTERN_RAMP0_OFFSET, 384 << 6); -+ } -+ break; -+ default: -+ break; -+ } -+ -+ REG_WRITE(OTG_TEST_PATTERN_COLOR, 0); -+ -+ /* enable test pattern */ -+ REG_WRITE(OTG_TEST_PATTERN_CONTROL, 0); -+ -+ REG_SET_4(OTG_TEST_PATTERN_CONTROL, 0, -+ OTG_TEST_PATTERN_EN, 1, -+ OTG_TEST_PATTERN_MODE, mode, -+ OTG_TEST_PATTERN_DYNAMIC_RANGE, 0, -+ OTG_TEST_PATTERN_COLOR_FORMAT, bit_depth); -+ } -+ break; -+ case CONTROLLER_DP_TEST_PATTERN_VIDEOMODE: -+ { -+ REG_WRITE(OTG_TEST_PATTERN_CONTROL, 0); -+ REG_WRITE(OTG_TEST_PATTERN_COLOR, 0); -+ REG_WRITE(OTG_TEST_PATTERN_PARAMETERS, 0); -+ } -+ break; -+ default: -+ break; -+ -+ } -+} -+ -+void dcn10_timing_generator_get_crtc_scanoutpos( -+ struct timing_generator *tg, -+ uint32_t *v_blank_start, -+ uint32_t *v_blank_end, -+ uint32_t *h_position, -+ uint32_t *v_position) -+{ -+ struct dcn10_timing_generator *tgn10 = DCN10TG_FROM_TG(tg); -+ struct crtc_position position; -+ -+ REG_GET_2(OTG_V_BLANK_START_END, -+ OTG_V_BLANK_START, v_blank_start, -+ OTG_V_BLANK_END, v_blank_end); -+ -+ dcn10_get_position(tg, &position); -+ -+ *h_position = position.horizontal_count; -+ *v_position = position.vertical_count; -+} -+ -+static struct timing_generator_funcs dcn10_tg_funcs = { -+ .validate_timing = tg_validate_timing, -+ .program_timing = tg_program_timing, -+ .program_global_sync = dcn10_program_global_sync, -+ .enable_crtc = tg_enable_crtc, -+ .disable_crtc = tg_disable_crtc, -+ /* used by enable_timing_synchronization. Not need for FPGA */ -+ .is_counter_moving = dcn10_is_counter_moving, -+ /* never be called */ -+ .get_position = dcn10_get_position, -+ .get_frame_count = tg_get_vblank_counter, -+ .get_scanoutpos = dcn10_timing_generator_get_crtc_scanoutpos, -+ .set_early_control = set_early_control, -+ /* used by enable_timing_synchronization. Not need for FPGA */ -+ .wait_for_state = dcn10_wait_for_state, -+ .set_blank = tg_set_blank, -+ .is_blanked = tg_is_blanked, -+ /* never be called */ -+ .set_colors = NULL, -+ /* this function will be called by .progam_scaler. dcn and dce -+ * scaler top level functions are different. .program_scaler is -+ * not need for dcn. within program_scaler, dcn will return -+ * early before set_overscan_blank_color is reached -+ */ -+ .set_overscan_blank_color = NULL, -+ .set_blank_color = tg_program_blank_color, -+ /* dcn10_timing_generator_disable_vga */ -+ .disable_vga = dcn10_timing_generator_disable_vga, -+ .did_triggered_reset_occur = dcn10_did_triggered_reset_occur, -+ .enable_reset_trigger = dcn10_enable_reset_trigger, -+ .disable_reset_trigger = dcn10_disable_reset_trigger, -+ .lock = dcn10_lock, -+ .unlock = dcn10_unlock, -+ /* dcn10_timing_generator_enable_advanced_request*/ -+ .enable_advanced_request = NULL, -+ .enable_optc_clock = enable_optc_clock, -+ .set_drr = dcn10_timing_generator_set_drr, -+ .set_static_screen_control = set_static_screen_control, -+ .set_test_pattern = dcn10_timing_generator_set_test_pattern -+}; -+ -+void dcn10_timing_generator_init(struct dcn10_timing_generator *tgn10) -+{ -+ tgn10->base.funcs = &dcn10_tg_funcs; -+ -+ tgn10->max_h_total = tgn10->tg_mask->OTG_H_TOTAL + 1; -+ tgn10->max_v_total = tgn10->tg_mask->OTG_V_TOTAL + 1; -+ -+ tgn10->min_h_blank = 32; -+ tgn10->min_v_blank = 3; -+ tgn10->min_v_blank_interlace = 5; -+ tgn10->min_h_sync_width = 8; -+ tgn10->min_v_sync_width = 1; -+} -+ -diff --git a/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_timing_generator.h b/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_timing_generator.h -new file mode 100644 -index 0000000..85a763a ---- /dev/null -+++ b/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_timing_generator.h -@@ -0,0 +1,335 @@ -+/* -+ * 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_TIMING_GENERATOR_DCN10_H__ -+#define __DC_TIMING_GENERATOR_DCN10_H__ -+ -+#include "timing_generator.h" -+ -+#define DCN10TG_FROM_TG(tg)\ -+ container_of(tg, struct dcn10_timing_generator, base) -+ -+#define TG_COMMON_REG_LIST_DCN1_0(inst) \ -+ SRI(OTG_VSTARTUP_PARAM, OTG, inst),\ -+ SRI(OTG_VUPDATE_PARAM, OTG, inst),\ -+ SRI(OTG_VREADY_PARAM, OTG, inst),\ -+ SRI(OTG_BLANK_CONTROL, OTG, inst),\ -+ SRI(OTG_MASTER_UPDATE_LOCK, OTG, inst),\ -+ SRI(OTG_DOUBLE_BUFFER_CONTROL, OTG, inst),\ -+ SRI(OTG_H_TOTAL, OTG, inst),\ -+ SRI(OTG_H_BLANK_START_END, OTG, inst),\ -+ SRI(OTG_H_SYNC_A, OTG, inst),\ -+ SRI(OTG_H_SYNC_A_CNTL, OTG, inst),\ -+ SRI(OTG_H_TIMING_CNTL, OTG, inst),\ -+ SRI(OTG_V_TOTAL, OTG, inst),\ -+ SRI(OTG_V_BLANK_START_END, OTG, inst),\ -+ SRI(OTG_V_SYNC_A, OTG, inst),\ -+ SRI(OTG_V_SYNC_A_CNTL, OTG, inst),\ -+ SRI(OTG_INTERLACE_CONTROL, OTG, inst),\ -+ SRI(OTG_CONTROL, OTG, inst),\ -+ SRI(OTG_STEREO_CONTROL, OTG, inst),\ -+ SRI(OTG_3D_STRUCTURE_CONTROL, OTG, inst),\ -+ SRI(OTG_V_TOTAL_MAX, OTG, inst),\ -+ SRI(OTG_V_TOTAL_MIN, OTG, inst),\ -+ SRI(OTG_V_TOTAL_CONTROL, OTG, inst),\ -+ SRI(OTG_TRIGA_CNTL, OTG, inst),\ -+ SRI(OTG_FORCE_COUNT_NOW_CNTL, OTG, inst),\ -+ SRI(OTG_STATIC_SCREEN_CONTROL, OTG, inst),\ -+ SRI(OTG_STATUS_FRAME_COUNT, OTG, inst),\ -+ SRI(OTG_STATUS, OTG, inst),\ -+ SRI(OTG_STATUS_POSITION, OTG, inst),\ -+ SRI(OTG_NOM_VERT_POSITION, OTG, inst),\ -+ SRI(OTG_BLACK_COLOR, OTG, inst),\ -+ SRI(OTG_TEST_PATTERN_PARAMETERS, OTG, inst),\ -+ SRI(OTG_TEST_PATTERN_CONTROL, OTG, inst),\ -+ SRI(OTG_TEST_PATTERN_COLOR, OTG, inst),\ -+ SRI(OTG_CLOCK_CONTROL, OTG, inst),\ -+ SRI(OPTC_INPUT_CLOCK_CONTROL, ODM, inst),\ -+ SRI(OPTC_DATA_SOURCE_SELECT, ODM, inst),\ -+ SRI(OPPBUF_CONTROL, OPPBUF, inst),\ -+ SRI(OPPBUF_3D_PARAMETERS_0, OPPBUF, inst),\ -+ SRI(CONTROL, VTG, inst),\ -+ SR(D1VGA_CONTROL),\ -+ SR(D2VGA_CONTROL),\ -+ SR(D3VGA_CONTROL),\ -+ SR(D4VGA_CONTROL),\ -+ -+struct dcn_tg_registers { -+ uint32_t OTG_VSTARTUP_PARAM; -+ uint32_t OTG_VUPDATE_PARAM; -+ uint32_t OTG_VREADY_PARAM; -+ uint32_t OTG_BLANK_CONTROL; -+ uint32_t OTG_MASTER_UPDATE_LOCK; -+ uint32_t OTG_DOUBLE_BUFFER_CONTROL; -+ uint32_t OTG_H_TOTAL; -+ uint32_t OTG_H_BLANK_START_END; -+ uint32_t OTG_H_SYNC_A; -+ uint32_t OTG_H_SYNC_A_CNTL; -+ uint32_t OTG_H_TIMING_CNTL; -+ uint32_t OTG_V_TOTAL; -+ uint32_t OTG_V_BLANK_START_END; -+ uint32_t OTG_V_SYNC_A; -+ uint32_t OTG_V_SYNC_A_CNTL; -+ uint32_t OTG_INTERLACE_CONTROL; -+ uint32_t OTG_CONTROL; -+ uint32_t OTG_STEREO_CONTROL; -+ uint32_t OTG_3D_STRUCTURE_CONTROL; -+ uint32_t OTG_V_TOTAL_MAX; -+ uint32_t OTG_V_TOTAL_MIN; -+ uint32_t OTG_V_TOTAL_CONTROL; -+ uint32_t OTG_TRIGA_CNTL; -+ uint32_t OTG_FORCE_COUNT_NOW_CNTL; -+ uint32_t OTG_STATIC_SCREEN_CONTROL; -+ uint32_t OTG_STATUS_FRAME_COUNT; -+ uint32_t OTG_STATUS; -+ uint32_t OTG_STATUS_POSITION; -+ uint32_t OTG_NOM_VERT_POSITION; -+ uint32_t OTG_BLACK_COLOR; -+ uint32_t OTG_TEST_PATTERN_PARAMETERS; -+ uint32_t OTG_TEST_PATTERN_CONTROL; -+ uint32_t OTG_TEST_PATTERN_COLOR; -+ uint32_t OTG_CLOCK_CONTROL; -+ uint32_t OPTC_INPUT_CLOCK_CONTROL; -+ uint32_t OPTC_DATA_SOURCE_SELECT; -+ uint32_t OPPBUF_CONTROL; -+ uint32_t OPPBUF_3D_PARAMETERS_0; -+ uint32_t CONTROL; -+ /*todo: move VGA to HWSS */ -+ uint32_t D1VGA_CONTROL; -+ uint32_t D2VGA_CONTROL; -+ uint32_t D3VGA_CONTROL; -+ uint32_t D4VGA_CONTROL; -+}; -+ -+#define TG_COMMON_MASK_SH_LIST_DCN1_0(mask_sh)\ -+ SF(OTG0_OTG_VSTARTUP_PARAM, VSTARTUP_START, mask_sh),\ -+ SF(OTG0_OTG_VUPDATE_PARAM, VUPDATE_OFFSET, mask_sh),\ -+ SF(OTG0_OTG_VUPDATE_PARAM, VUPDATE_WIDTH, mask_sh),\ -+ SF(OTG0_OTG_VREADY_PARAM, VREADY_OFFSET, mask_sh),\ -+ SF(OTG0_OTG_BLANK_CONTROL, OTG_BLANK_DATA_EN, mask_sh),\ -+ SF(OTG0_OTG_BLANK_CONTROL, OTG_BLANK_DE_MODE, mask_sh),\ -+ SF(OTG0_OTG_BLANK_CONTROL, OTG_CURRENT_BLANK_STATE, mask_sh),\ -+ SF(OTG0_OTG_MASTER_UPDATE_LOCK, OTG_MASTER_UPDATE_LOCK, mask_sh),\ -+ SF(OTG0_OTG_DOUBLE_BUFFER_CONTROL, OTG_UPDATE_PENDING, mask_sh),\ -+ SF(OTG0_OTG_DOUBLE_BUFFER_CONTROL, OTG_BLANK_DATA_DOUBLE_BUFFER_EN, mask_sh),\ -+ SF(OTG0_OTG_H_TOTAL, OTG_H_TOTAL, mask_sh),\ -+ SF(OTG0_OTG_H_BLANK_START_END, OTG_H_BLANK_START, mask_sh),\ -+ SF(OTG0_OTG_H_BLANK_START_END, OTG_H_BLANK_END, mask_sh),\ -+ SF(OTG0_OTG_H_SYNC_A, OTG_H_SYNC_A_START, mask_sh),\ -+ SF(OTG0_OTG_H_SYNC_A, OTG_H_SYNC_A_END, mask_sh),\ -+ SF(OTG0_OTG_H_SYNC_A_CNTL, OTG_H_SYNC_A_POL, mask_sh),\ -+ SF(OTG0_OTG_H_TIMING_CNTL, OTG_H_TIMING_DIV_BY2, mask_sh),\ -+ SF(OTG0_OTG_V_TOTAL, OTG_V_TOTAL, mask_sh),\ -+ SF(OTG0_OTG_V_BLANK_START_END, OTG_V_BLANK_START, mask_sh),\ -+ SF(OTG0_OTG_V_BLANK_START_END, OTG_V_BLANK_END, mask_sh),\ -+ SF(OTG0_OTG_V_SYNC_A, OTG_V_SYNC_A_START, mask_sh),\ -+ SF(OTG0_OTG_V_SYNC_A, OTG_V_SYNC_A_END, mask_sh),\ -+ SF(OTG0_OTG_V_SYNC_A_CNTL, OTG_V_SYNC_A_POL, mask_sh),\ -+ SF(OTG0_OTG_INTERLACE_CONTROL, OTG_INTERLACE_ENABLE, mask_sh),\ -+ SF(OTG0_OTG_CONTROL, OTG_MASTER_EN, mask_sh),\ -+ SF(OTG0_OTG_CONTROL, OTG_START_POINT_CNTL, mask_sh),\ -+ SF(OTG0_OTG_CONTROL, OTG_DISABLE_POINT_CNTL, mask_sh),\ -+ SF(OTG0_OTG_CONTROL, OTG_FIELD_NUMBER_CNTL, mask_sh),\ -+ SF(OTG0_OTG_STEREO_CONTROL, OTG_STEREO_EN, mask_sh),\ -+ SF(OTG0_OTG_STEREO_CONTROL, OTG_STEREO_SYNC_OUTPUT_LINE_NUM, mask_sh),\ -+ SF(OTG0_OTG_STEREO_CONTROL, OTG_STEREO_SYNC_OUTPUT_POLARITY, mask_sh),\ -+ SF(OTG0_OTG_STEREO_CONTROL, OTG_STEREO_EYE_FLAG_POLARITY, mask_sh),\ -+ SF(OTG0_OTG_STEREO_CONTROL, OTG_DISABLE_STEREOSYNC_OUTPUT_FOR_DP, mask_sh),\ -+ SF(OTG0_OTG_3D_STRUCTURE_CONTROL, OTG_3D_STRUCTURE_EN, mask_sh),\ -+ SF(OTG0_OTG_3D_STRUCTURE_CONTROL, OTG_3D_STRUCTURE_V_UPDATE_MODE, mask_sh),\ -+ SF(OTG0_OTG_3D_STRUCTURE_CONTROL, OTG_3D_STRUCTURE_STEREO_SEL_OVR, mask_sh),\ -+ SF(OTG0_OTG_V_TOTAL_MAX, OTG_V_TOTAL_MAX, mask_sh),\ -+ SF(OTG0_OTG_V_TOTAL_MIN, OTG_V_TOTAL_MIN, mask_sh),\ -+ SF(OTG0_OTG_V_TOTAL_CONTROL, OTG_V_TOTAL_MIN_SEL, mask_sh),\ -+ SF(OTG0_OTG_V_TOTAL_CONTROL, OTG_V_TOTAL_MAX_SEL, mask_sh),\ -+ SF(OTG0_OTG_V_TOTAL_CONTROL, OTG_FORCE_LOCK_ON_EVENT, mask_sh),\ -+ SF(OTG0_OTG_V_TOTAL_CONTROL, OTG_SET_V_TOTAL_MIN_MASK_EN, mask_sh),\ -+ SF(OTG0_OTG_V_TOTAL_CONTROL, OTG_SET_V_TOTAL_MIN_MASK, mask_sh),\ -+ SF(OTG0_OTG_FORCE_COUNT_NOW_CNTL, OTG_FORCE_COUNT_NOW_CLEAR, mask_sh),\ -+ SF(OTG0_OTG_FORCE_COUNT_NOW_CNTL, OTG_FORCE_COUNT_NOW_MODE, mask_sh),\ -+ SF(OTG0_OTG_FORCE_COUNT_NOW_CNTL, OTG_FORCE_COUNT_NOW_OCCURRED, mask_sh),\ -+ SF(OTG0_OTG_TRIGA_CNTL, OTG_TRIGA_SOURCE_SELECT, mask_sh),\ -+ SF(OTG0_OTG_TRIGA_CNTL, OTG_TRIGA_SOURCE_PIPE_SELECT, mask_sh),\ -+ SF(OTG0_OTG_TRIGA_CNTL, OTG_TRIGA_RISING_EDGE_DETECT_CNTL, mask_sh),\ -+ SF(OTG0_OTG_TRIGA_CNTL, OTG_TRIGA_FALLING_EDGE_DETECT_CNTL, mask_sh),\ -+ SF(OTG0_OTG_STATIC_SCREEN_CONTROL, OTG_STATIC_SCREEN_EVENT_MASK, mask_sh),\ -+ SF(OTG0_OTG_STATIC_SCREEN_CONTROL, OTG_STATIC_SCREEN_FRAME_COUNT, mask_sh),\ -+ SF(OTG0_OTG_STATUS_FRAME_COUNT, OTG_FRAME_COUNT, mask_sh),\ -+ SF(OTG0_OTG_STATUS, OTG_V_BLANK, mask_sh),\ -+ SF(OTG0_OTG_STATUS, OTG_V_ACTIVE_DISP, mask_sh),\ -+ SF(OTG0_OTG_STATUS_POSITION, OTG_HORZ_COUNT, mask_sh),\ -+ SF(OTG0_OTG_STATUS_POSITION, OTG_VERT_COUNT, mask_sh),\ -+ SF(OTG0_OTG_NOM_VERT_POSITION, OTG_VERT_COUNT_NOM, mask_sh),\ -+ SF(OTG0_OTG_BLACK_COLOR, OTG_BLACK_COLOR_B_CB, mask_sh),\ -+ SF(OTG0_OTG_BLACK_COLOR, OTG_BLACK_COLOR_G_Y, mask_sh),\ -+ SF(OTG0_OTG_BLACK_COLOR, OTG_BLACK_COLOR_R_CR, mask_sh),\ -+ SF(OTG0_OTG_TEST_PATTERN_PARAMETERS, OTG_TEST_PATTERN_INC0, mask_sh),\ -+ SF(OTG0_OTG_TEST_PATTERN_PARAMETERS, OTG_TEST_PATTERN_INC1, mask_sh),\ -+ SF(OTG0_OTG_TEST_PATTERN_PARAMETERS, OTG_TEST_PATTERN_VRES, mask_sh),\ -+ SF(OTG0_OTG_TEST_PATTERN_PARAMETERS, OTG_TEST_PATTERN_HRES, mask_sh),\ -+ SF(OTG0_OTG_TEST_PATTERN_PARAMETERS, OTG_TEST_PATTERN_RAMP0_OFFSET, mask_sh),\ -+ SF(OTG0_OTG_TEST_PATTERN_CONTROL, OTG_TEST_PATTERN_EN, mask_sh),\ -+ SF(OTG0_OTG_TEST_PATTERN_CONTROL, OTG_TEST_PATTERN_MODE, mask_sh),\ -+ SF(OTG0_OTG_TEST_PATTERN_CONTROL, OTG_TEST_PATTERN_DYNAMIC_RANGE, mask_sh),\ -+ SF(OTG0_OTG_TEST_PATTERN_CONTROL, OTG_TEST_PATTERN_COLOR_FORMAT, mask_sh),\ -+ SF(OTG0_OTG_TEST_PATTERN_COLOR, OTG_TEST_PATTERN_MASK, mask_sh),\ -+ SF(OTG0_OTG_TEST_PATTERN_COLOR, OTG_TEST_PATTERN_DATA, mask_sh),\ -+ SF(OTG0_OTG_CLOCK_CONTROL, OTG_BUSY, mask_sh),\ -+ SF(OTG0_OTG_CLOCK_CONTROL, OTG_CLOCK_EN, mask_sh),\ -+ SF(OTG0_OTG_CLOCK_CONTROL, OTG_CLOCK_ON, mask_sh),\ -+ SF(OTG0_OTG_CLOCK_CONTROL, OTG_CLOCK_GATE_DIS, mask_sh),\ -+ SF(ODM0_OPTC_INPUT_CLOCK_CONTROL, OPTC_INPUT_CLK_EN, mask_sh),\ -+ SF(ODM0_OPTC_INPUT_CLOCK_CONTROL, OPTC_INPUT_CLK_ON, mask_sh),\ -+ SF(ODM0_OPTC_INPUT_CLOCK_CONTROL, OPTC_INPUT_CLK_GATE_DIS, mask_sh),\ -+ SF(ODM0_OPTC_DATA_SOURCE_SELECT, OPTC_SRC_SEL, mask_sh),\ -+ SF(OPPBUF0_OPPBUF_CONTROL, OPPBUF_ACTIVE_WIDTH, mask_sh),\ -+ SF(OPPBUF0_OPPBUF_3D_PARAMETERS_0, OPPBUF_3D_VACT_SPACE1_SIZE, mask_sh),\ -+ SF(VTG0_CONTROL, VTG0_ENABLE, mask_sh),\ -+ SF(VTG0_CONTROL, VTG0_FP2, mask_sh),\ -+ SF(VTG0_CONTROL, VTG0_VCOUNT_INIT, mask_sh),\ -+ -+#define TG_REG_FIELD_LIST(type) \ -+ type VSTARTUP_START;\ -+ type VUPDATE_OFFSET;\ -+ type VUPDATE_WIDTH;\ -+ type VREADY_OFFSET;\ -+ type OTG_BLANK_DATA_EN;\ -+ type OTG_BLANK_DE_MODE;\ -+ type OTG_CURRENT_BLANK_STATE;\ -+ type OTG_MASTER_UPDATE_LOCK;\ -+ type OTG_UPDATE_PENDING;\ -+ type OTG_BLANK_DATA_DOUBLE_BUFFER_EN;\ -+ type OTG_H_TOTAL;\ -+ type OTG_H_BLANK_START;\ -+ type OTG_H_BLANK_END;\ -+ type OTG_H_SYNC_A_START;\ -+ type OTG_H_SYNC_A_END;\ -+ type OTG_H_SYNC_A_POL;\ -+ type OTG_H_TIMING_DIV_BY2;\ -+ type OTG_V_TOTAL;\ -+ type OTG_V_BLANK_START;\ -+ type OTG_V_BLANK_END;\ -+ type OTG_V_SYNC_A_START;\ -+ type OTG_V_SYNC_A_END;\ -+ type OTG_V_SYNC_A_POL;\ -+ type OTG_INTERLACE_ENABLE;\ -+ type OTG_MASTER_EN;\ -+ type OTG_START_POINT_CNTL;\ -+ type OTG_DISABLE_POINT_CNTL;\ -+ type OTG_FIELD_NUMBER_CNTL;\ -+ type OTG_STEREO_EN;\ -+ type OTG_STEREO_SYNC_OUTPUT_LINE_NUM;\ -+ type OTG_STEREO_SYNC_OUTPUT_POLARITY;\ -+ type OTG_STEREO_EYE_FLAG_POLARITY;\ -+ type OTG_DISABLE_STEREOSYNC_OUTPUT_FOR_DP;\ -+ type OTG_3D_STRUCTURE_EN;\ -+ type OTG_3D_STRUCTURE_V_UPDATE_MODE;\ -+ type OTG_3D_STRUCTURE_STEREO_SEL_OVR;\ -+ type OTG_V_TOTAL_MAX;\ -+ type OTG_V_TOTAL_MIN;\ -+ type OTG_V_TOTAL_MIN_SEL;\ -+ type OTG_V_TOTAL_MAX_SEL;\ -+ type OTG_FORCE_LOCK_ON_EVENT;\ -+ type OTG_SET_V_TOTAL_MIN_MASK_EN;\ -+ type OTG_SET_V_TOTAL_MIN_MASK;\ -+ type OTG_FORCE_COUNT_NOW_CLEAR;\ -+ type OTG_FORCE_COUNT_NOW_MODE;\ -+ type OTG_FORCE_COUNT_NOW_OCCURRED;\ -+ type OTG_TRIGA_SOURCE_SELECT;\ -+ type OTG_TRIGA_SOURCE_PIPE_SELECT;\ -+ type OTG_TRIGA_RISING_EDGE_DETECT_CNTL;\ -+ type OTG_TRIGA_FALLING_EDGE_DETECT_CNTL;\ -+ type OTG_STATIC_SCREEN_EVENT_MASK;\ -+ type OTG_STATIC_SCREEN_FRAME_COUNT;\ -+ type OTG_FRAME_COUNT;\ -+ type OTG_V_BLANK;\ -+ type OTG_V_ACTIVE_DISP;\ -+ type OTG_HORZ_COUNT;\ -+ type OTG_VERT_COUNT;\ -+ type OTG_VERT_COUNT_NOM;\ -+ type OTG_BLACK_COLOR_B_CB;\ -+ type OTG_BLACK_COLOR_G_Y;\ -+ type OTG_BLACK_COLOR_R_CR;\ -+ type OTG_TEST_PATTERN_INC0;\ -+ type OTG_TEST_PATTERN_INC1;\ -+ type OTG_TEST_PATTERN_VRES;\ -+ type OTG_TEST_PATTERN_HRES;\ -+ type OTG_TEST_PATTERN_RAMP0_OFFSET;\ -+ type OTG_TEST_PATTERN_EN;\ -+ type OTG_TEST_PATTERN_MODE;\ -+ type OTG_TEST_PATTERN_DYNAMIC_RANGE;\ -+ type OTG_TEST_PATTERN_COLOR_FORMAT;\ -+ type OTG_TEST_PATTERN_MASK;\ -+ type OTG_TEST_PATTERN_DATA;\ -+ type OTG_BUSY;\ -+ type OTG_CLOCK_EN;\ -+ type OTG_CLOCK_ON;\ -+ type OTG_CLOCK_GATE_DIS;\ -+ type OPTC_INPUT_CLK_EN;\ -+ type OPTC_INPUT_CLK_ON;\ -+ type OPTC_INPUT_CLK_GATE_DIS;\ -+ type OPTC_SRC_SEL;\ -+ type OPPBUF_ACTIVE_WIDTH;\ -+ type OPPBUF_3D_VACT_SPACE1_SIZE;\ -+ type VTG0_ENABLE;\ -+ type VTG0_FP2;\ -+ type VTG0_VCOUNT_INIT;\ -+ -+struct dcn_tg_shift { -+ TG_REG_FIELD_LIST(uint8_t) -+}; -+ -+struct dcn_tg_mask { -+ TG_REG_FIELD_LIST(uint32_t) -+}; -+ -+struct dcn10_timing_generator { -+ struct timing_generator base; -+ -+ const struct dcn_tg_registers *tg_regs; -+ const struct dcn_tg_shift *tg_shift; -+ const struct dcn_tg_mask *tg_mask; -+ -+ enum controller_id controller_id; -+ -+ uint32_t max_h_total; -+ uint32_t max_v_total; -+ -+ uint32_t min_h_blank; -+ -+ uint32_t min_h_sync_width; -+ uint32_t min_v_sync_width; -+ uint32_t min_v_blank; -+ uint32_t min_v_blank_interlace; -+}; -+ -+void dcn10_timing_generator_init(struct dcn10_timing_generator *tg); -+ -+void dcn10_timing_generator_set_drr(struct timing_generator *tg, -+ const struct drr_params *params); -+ -+void dcn10_unlock(struct timing_generator *tg); -+void dcn10_lock(struct timing_generator *tg); -+#endif /* __DC_TIMING_GENERATOR_DCN10_H__ */ -diff --git a/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_transform.c b/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_transform.c -new file mode 100644 -index 0000000..3718fb5 ---- /dev/null -+++ b/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_transform.c -@@ -0,0 +1,1057 @@ -+/* -+ * 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 "core_types.h" -+ -+#include "include/grph_object_id.h" -+#include "include/fixed31_32.h" -+#include "include/logger_interface.h" -+ -+#include "reg_helper.h" -+#include "dcn10_transform.h" -+#include "basics/conversion.h" -+ -+#define NUM_PHASES 64 -+#define HORZ_MAX_TAPS 8 -+#define VERT_MAX_TAPS 8 -+ -+#define BLACK_OFFSET_RGB_Y 0x0 -+#define BLACK_OFFSET_CBCR 0x8000 -+ -+#define REG(reg)\ -+ xfm->tf_regs->reg -+ -+#define CTX \ -+ xfm->base.ctx -+ -+#undef FN -+#define FN(reg_name, field_name) \ -+ xfm->tf_shift->field_name, xfm->tf_mask->field_name -+ -+ -+enum dcn10_coef_filter_type_sel { -+ SCL_COEF_LUMA_VERT_FILTER = 0, -+ SCL_COEF_LUMA_HORZ_FILTER = 1, -+ SCL_COEF_CHROMA_VERT_FILTER = 2, -+ SCL_COEF_CHROMA_HORZ_FILTER = 3, -+ SCL_COEF_ALPHA_VERT_FILTER = 4, -+ SCL_COEF_ALPHA_HORZ_FILTER = 5 -+}; -+ -+enum lb_memory_config { -+ /* Enable all 3 pieces of memory */ -+ LB_MEMORY_CONFIG_0 = 0, -+ -+ /* Enable only the first piece of memory */ -+ LB_MEMORY_CONFIG_1 = 1, -+ -+ /* Enable only the second piece of memory */ -+ LB_MEMORY_CONFIG_2 = 2, -+ -+ /* Only applicable in 4:2:0 mode, enable all 3 pieces of memory and the -+ * last piece of chroma memory used for the luma storage -+ */ -+ LB_MEMORY_CONFIG_3 = 3 -+}; -+ -+enum dscl_autocal_mode { -+ AUTOCAL_MODE_OFF = 0, -+ -+ /* Autocal calculate the scaling ratio and initial phase and the -+ * DSCL_MODE_SEL must be set to 1 -+ */ -+ AUTOCAL_MODE_AUTOSCALE = 1, -+ /* Autocal perform auto centering without replication and the -+ * DSCL_MODE_SEL must be set to 0 -+ */ -+ AUTOCAL_MODE_AUTOCENTER = 2, -+ /* Autocal perform auto centering and auto replication and the -+ * DSCL_MODE_SEL must be set to 0 -+ */ -+ AUTOCAL_MODE_AUTOREPLICATE = 3 -+}; -+ -+enum dscl_mode_sel { -+ DSCL_MODE_SCALING_444_BYPASS = 0, -+ DSCL_MODE_SCALING_444_RGB_ENABLE = 1, -+ DSCL_MODE_SCALING_444_YCBCR_ENABLE = 2, -+ DSCL_MODE_SCALING_420_YCBCR_ENABLE = 3, -+ DSCL_MODE_SCALING_420_LUMA_BYPASS = 4, -+ DSCL_MODE_SCALING_420_CHROMA_BYPASS = 5, -+ DSCL_MODE_DSCL_BYPASS = 6 -+}; -+ -+enum gamut_remap_select { -+ GAMUT_REMAP_BYPASS = 0, -+ GAMUT_REMAP_COEFF, -+ GAMUT_REMAP_COMA_COEFF, -+ GAMUT_REMAP_COMB_COEFF -+}; -+ -+static void transform_set_overscan( -+ struct dcn10_transform *xfm, -+ const struct scaler_data *data) -+{ -+ uint32_t left = data->recout.x; -+ uint32_t top = data->recout.y; -+ -+ int right = data->h_active - data->recout.x - data->recout.width; -+ int bottom = data->v_active - data->recout.y - data->recout.height; -+ -+ if (right < 0) { -+ BREAK_TO_DEBUGGER(); -+ right = 0; -+ } -+ if (bottom < 0) { -+ BREAK_TO_DEBUGGER(); -+ bottom = 0; -+ } -+ -+ REG_SET_2(DSCL_EXT_OVERSCAN_LEFT_RIGHT, 0, -+ EXT_OVERSCAN_LEFT, left, -+ EXT_OVERSCAN_RIGHT, right); -+ -+ REG_SET_2(DSCL_EXT_OVERSCAN_TOP_BOTTOM, 0, -+ EXT_OVERSCAN_BOTTOM, bottom, -+ EXT_OVERSCAN_TOP, top); -+} -+ -+static void transform_set_otg_blank( -+ struct dcn10_transform *xfm, const struct scaler_data *data) -+{ -+ uint32_t h_blank_start = data->h_active; -+ uint32_t h_blank_end = 0; -+ uint32_t v_blank_start = data->v_active; -+ uint32_t v_blank_end = 0; -+ -+ REG_SET_2(OTG_H_BLANK, 0, -+ OTG_H_BLANK_START, h_blank_start, -+ OTG_H_BLANK_END, h_blank_end); -+ -+ REG_SET_2(OTG_V_BLANK, 0, -+ OTG_V_BLANK_START, v_blank_start, -+ OTG_V_BLANK_END, v_blank_end); -+} -+ -+static enum dscl_mode_sel get_dscl_mode(const struct scaler_data *data) -+{ -+ const long long one = dal_fixed31_32_one.value; -+ bool ycbcr = false; -+ bool format420 = false; -+ -+ if (data->format == PIXEL_FORMAT_FP16) -+ return DSCL_MODE_DSCL_BYPASS; -+ -+ if (data->format >= PIXEL_FORMAT_VIDEO_BEGIN -+ && data->format <= PIXEL_FORMAT_VIDEO_END) -+ ycbcr = true; -+ -+ if (data->format == PIXEL_FORMAT_420BPP12 || -+ data->format == PIXEL_FORMAT_420BPP15) -+ format420 = true; -+ -+ if (data->ratios.horz.value == one -+ && data->ratios.vert.value == one -+ && data->ratios.horz_c.value == one -+ && data->ratios.vert_c.value == one) -+ return DSCL_MODE_SCALING_444_BYPASS; -+ -+ if (!format420) { -+ if (ycbcr) -+ return DSCL_MODE_SCALING_444_YCBCR_ENABLE; -+ else -+ return DSCL_MODE_SCALING_444_RGB_ENABLE; -+ } -+ if (data->ratios.horz.value == one && data->ratios.vert.value == one) -+ return DSCL_MODE_SCALING_420_LUMA_BYPASS; -+ if (data->ratios.horz_c.value == one && data->ratios.vert_c.value == one) -+ return DSCL_MODE_SCALING_420_CHROMA_BYPASS; -+ -+ return DSCL_MODE_SCALING_420_YCBCR_ENABLE; -+} -+ -+static int get_pixel_depth_val(enum lb_pixel_depth depth) -+{ -+ if (depth == LB_PIXEL_DEPTH_30BPP) -+ return 0; /* 10 bpc */ -+ else if (depth == LB_PIXEL_DEPTH_24BPP) -+ return 1; /* 8 bpc */ -+ else if (depth == LB_PIXEL_DEPTH_18BPP) -+ return 2; /* 6 bpc */ -+ else if (depth == LB_PIXEL_DEPTH_36BPP) -+ return 3; /* 12 bpc */ -+ else { -+ ASSERT(0); -+ return -1; /* Unsupported */ -+ } -+} -+ -+static void transform_set_lb( -+ struct dcn10_transform *xfm, -+ const struct line_buffer_params *lb_params, -+ enum lb_memory_config mem_size_config) -+{ -+ uint32_t pixel_depth = get_pixel_depth_val(lb_params->depth); -+ uint32_t dyn_pix_depth = lb_params->dynamic_pixel_depth; -+ REG_SET_7(LB_DATA_FORMAT, 0, -+ PIXEL_DEPTH, pixel_depth, /* Pixel depth stored in LB */ -+ PIXEL_EXPAN_MODE, lb_params->pixel_expan_mode, /* Pixel expansion mode */ -+ PIXEL_REDUCE_MODE, 1, /* Pixel reduction mode: Rounding */ -+ DYNAMIC_PIXEL_DEPTH, dyn_pix_depth, /* Dynamic expansion pixel depth */ -+ DITHER_EN, 0, /* Dithering enable: Disabled */ -+ INTERLEAVE_EN, lb_params->interleave_en, /* Interleave source enable */ -+ ALPHA_EN, lb_params->alpha_en); /* Alpha enable */ -+ -+ REG_SET_2(LB_MEMORY_CTRL, 0, -+ MEMORY_CONFIG, mem_size_config, -+ LB_MAX_PARTITIONS, 63); -+} -+ -+static void transform_set_scaler_filter( -+ struct dcn10_transform *xfm, -+ uint32_t taps, -+ enum dcn10_coef_filter_type_sel filter_type, -+ const uint16_t *filter) -+{ -+ const int tap_pairs = (taps + 1) / 2; -+ int phase; -+ int pair; -+ uint16_t odd_coef, even_coef; -+ -+ REG_SET_3(SCL_COEF_RAM_TAP_SELECT, 0, -+ SCL_COEF_RAM_TAP_PAIR_IDX, 0, -+ SCL_COEF_RAM_PHASE, 0, -+ SCL_COEF_RAM_FILTER_TYPE, filter_type); -+ -+ for (phase = 0; phase < (NUM_PHASES / 2 + 1); phase++) { -+ for (pair = 0; pair < tap_pairs; pair++) { -+ even_coef = filter[phase * taps + 2 * pair]; -+ if ((pair * 2 + 1) < taps) -+ odd_coef = filter[phase * taps + 2 * pair + 1]; -+ else -+ odd_coef = 0; -+ -+ REG_SET_4(SCL_COEF_RAM_TAP_DATA, 0, -+ /* Even tap coefficient (bits 1:0 fixed to 0) */ -+ SCL_COEF_RAM_EVEN_TAP_COEF, even_coef, -+ /* Write/read control for even coefficient */ -+ SCL_COEF_RAM_EVEN_TAP_COEF_EN, 1, -+ /* Odd tap coefficient (bits 1:0 fixed to 0) */ -+ SCL_COEF_RAM_ODD_TAP_COEF, odd_coef, -+ /* Write/read control for odd coefficient */ -+ SCL_COEF_RAM_ODD_TAP_COEF_EN, 1); -+ } -+ } -+ -+} -+ -+#if 0 -+bool transform_set_pixel_storage_depth( -+ struct transform *xfm, -+ enum lb_pixel_depth depth, -+ const struct bit_depth_reduction_params *bit_depth_params) -+{ -+ struct dcn10_transform *xfm110 = TO_DCN10_TRANSFORM(xfm); -+ bool ret = true; -+ uint32_t value; -+ enum dc_color_depth color_depth; -+ -+ value = dm_read_reg(xfm->ctx, LB_REG(mmLB_DATA_FORMAT)); -+ switch (depth) { -+ case LB_PIXEL_DEPTH_18BPP: -+ color_depth = COLOR_DEPTH_666; -+ set_reg_field_value(value, 2, LB_DATA_FORMAT, PIXEL_DEPTH); -+ set_reg_field_value(value, 1, LB_DATA_FORMAT, PIXEL_EXPAN_MODE); -+ break; -+ case LB_PIXEL_DEPTH_24BPP: -+ color_depth = COLOR_DEPTH_888; -+ set_reg_field_value(value, 1, LB_DATA_FORMAT, PIXEL_DEPTH); -+ set_reg_field_value(value, 1, LB_DATA_FORMAT, PIXEL_EXPAN_MODE); -+ break; -+ case LB_PIXEL_DEPTH_30BPP: -+ color_depth = COLOR_DEPTH_101010; -+ set_reg_field_value(value, 0, LB_DATA_FORMAT, PIXEL_DEPTH); -+ set_reg_field_value(value, 1, LB_DATA_FORMAT, PIXEL_EXPAN_MODE); -+ break; -+ case LB_PIXEL_DEPTH_36BPP: -+ color_depth = COLOR_DEPTH_121212; -+ set_reg_field_value(value, 3, LB_DATA_FORMAT, PIXEL_DEPTH); -+ set_reg_field_value(value, 0, LB_DATA_FORMAT, PIXEL_EXPAN_MODE); -+ break; -+ default: -+ ret = false; -+ break; -+ } -+ -+ if (ret == true) { -+ set_denormalization(xfm110, color_depth); -+ ret = program_bit_depth_reduction(xfm110, color_depth, -+ bit_depth_params); -+ -+ set_reg_field_value(value, 0, LB_DATA_FORMAT, ALPHA_EN); -+ dm_write_reg(xfm->ctx, LB_REG(mmLB_DATA_FORMAT), value); -+ if (!(xfm110->lb_pixel_depth_supported & depth)) { -+ /* We should use unsupported capabilities -+ * unless it is required by w/a -+ */ -+ dm_logger_write(xfm->ctx->logger, LOG_WARNING, -+ "%s: Capability not supported", -+ __func__); -+ } -+ } -+ -+ return ret; -+} -+#endif -+ -+static const uint16_t *get_filter_coeffs_64p(int taps, struct fixed31_32 ratio) -+{ -+ if (taps == 8) -+ return get_filter_8tap_64p(ratio); -+ else if (taps == 7) -+ return get_filter_7tap_64p(ratio); -+ else if (taps == 6) -+ return get_filter_6tap_64p(ratio); -+ else if (taps == 5) -+ return get_filter_5tap_64p(ratio); -+ else if (taps == 4) -+ return get_filter_4tap_64p(ratio); -+ else if (taps == 3) -+ return get_filter_3tap_64p(ratio); -+ else if (taps == 2) -+ return filter_2tap_64p; -+ else if (taps == 1) -+ return NULL; -+ else { -+ /* should never happen, bug */ -+ BREAK_TO_DEBUGGER(); -+ return NULL; -+ } -+} -+ -+static void transform_set_scl_filter( -+ struct dcn10_transform *xfm, -+ const struct scaler_data *scl_data, -+ bool chroma_coef_mode) -+{ -+ bool h_2tap_hardcode_coef_en = false; -+ bool v_2tap_hardcode_coef_en = false; -+ bool h_2tap_sharp_en = false; -+ bool v_2tap_sharp_en = false; -+ uint32_t h_2tap_sharp_factor = scl_data->sharpness.horz; -+ uint32_t v_2tap_sharp_factor = scl_data->sharpness.vert; -+ bool coef_ram_current; -+ const uint16_t *filter_h = NULL; -+ const uint16_t *filter_v = NULL; -+ const uint16_t *filter_h_c = NULL; -+ const uint16_t *filter_v_c = NULL; -+ -+ h_2tap_hardcode_coef_en = scl_data->taps.h_taps < 3 -+ && scl_data->taps.h_taps_c < 3 -+ && (scl_data->taps.h_taps > 1 || scl_data->taps.h_taps_c > 1); -+ v_2tap_hardcode_coef_en = scl_data->taps.v_taps < 3 -+ && scl_data->taps.v_taps_c < 3 -+ && (scl_data->taps.v_taps > 1 || scl_data->taps.v_taps_c > 1); -+ -+ h_2tap_sharp_en = h_2tap_hardcode_coef_en && h_2tap_sharp_factor != 0; -+ v_2tap_sharp_en = v_2tap_hardcode_coef_en && v_2tap_sharp_factor != 0; -+ -+ REG_UPDATE_6(DSCL_2TAP_CONTROL, -+ SCL_H_2TAP_HARDCODE_COEF_EN, h_2tap_hardcode_coef_en, -+ SCL_H_2TAP_SHARP_EN, h_2tap_sharp_en, -+ SCL_H_2TAP_SHARP_FACTOR, h_2tap_sharp_factor, -+ SCL_V_2TAP_HARDCODE_COEF_EN, v_2tap_hardcode_coef_en, -+ SCL_V_2TAP_SHARP_EN, v_2tap_sharp_en, -+ SCL_V_2TAP_SHARP_FACTOR, v_2tap_sharp_factor); -+ -+ if (!v_2tap_hardcode_coef_en || !h_2tap_hardcode_coef_en) { -+ bool filter_updated = false; -+ -+ filter_h = get_filter_coeffs_64p( -+ scl_data->taps.h_taps, scl_data->ratios.horz); -+ filter_v = get_filter_coeffs_64p( -+ scl_data->taps.v_taps, scl_data->ratios.vert); -+ -+ filter_updated = (filter_h && (filter_h != xfm->filter_h)) -+ || (filter_v && (filter_v != xfm->filter_v)); -+ -+ if (chroma_coef_mode) { -+ filter_h_c = get_filter_coeffs_64p( -+ scl_data->taps.h_taps_c, scl_data->ratios.horz_c); -+ filter_v_c = get_filter_coeffs_64p( -+ scl_data->taps.v_taps_c, scl_data->ratios.vert_c); -+ filter_updated = filter_updated || (filter_h_c && (filter_h_c != xfm->filter_h_c)) -+ || (filter_v_c && (filter_v_c != xfm->filter_v_c)); -+ } -+ -+ if (filter_updated) { -+ uint32_t scl_mode = REG_READ(SCL_MODE); -+ -+ if (!h_2tap_hardcode_coef_en && filter_h) { -+ transform_set_scaler_filter( -+ xfm, scl_data->taps.h_taps, -+ SCL_COEF_LUMA_HORZ_FILTER, filter_h); -+ } -+ xfm->filter_h = filter_h; -+ if (!v_2tap_hardcode_coef_en && filter_v) { -+ transform_set_scaler_filter( -+ xfm, scl_data->taps.v_taps, -+ SCL_COEF_LUMA_VERT_FILTER, filter_v); -+ } -+ xfm->filter_v = filter_v; -+ if (chroma_coef_mode) { -+ if (!h_2tap_hardcode_coef_en && filter_h_c) { -+ transform_set_scaler_filter( -+ xfm, scl_data->taps.h_taps_c, -+ SCL_COEF_CHROMA_HORZ_FILTER, filter_h_c); -+ } -+ if (!v_2tap_hardcode_coef_en && filter_v_c) { -+ transform_set_scaler_filter( -+ xfm, scl_data->taps.v_taps_c, -+ SCL_COEF_CHROMA_VERT_FILTER, filter_v_c); -+ } -+ } -+ xfm->filter_h_c = filter_h_c; -+ xfm->filter_v_c = filter_v_c; -+ -+ coef_ram_current = get_reg_field_value_ex( -+ scl_mode, xfm->tf_mask->SCL_COEF_RAM_SELECT_CURRENT, -+ xfm->tf_shift->SCL_COEF_RAM_SELECT_CURRENT); -+ -+ /* Swap coefficient RAM and set chroma coefficient mode */ -+ REG_SET_2(SCL_MODE, scl_mode, -+ SCL_COEF_RAM_SELECT, !coef_ram_current, -+ SCL_CHROMA_COEF_MODE, chroma_coef_mode); -+ } -+ } -+} -+ -+static void transform_set_viewport( -+ struct dcn10_transform *xfm, -+ const struct rect *viewport, -+ const struct rect *viewport_c) -+{ -+ REG_SET_2(DCSURF_PRI_VIEWPORT_DIMENSION, 0, -+ PRI_VIEWPORT_WIDTH, viewport->width, -+ PRI_VIEWPORT_HEIGHT, viewport->height); -+ -+ REG_SET_2(DCSURF_PRI_VIEWPORT_START, 0, -+ PRI_VIEWPORT_X_START, viewport->x, -+ PRI_VIEWPORT_Y_START, viewport->y); -+ -+ /*for stereo*/ -+ REG_SET_2(DCSURF_SEC_VIEWPORT_DIMENSION, 0, -+ SEC_VIEWPORT_WIDTH, viewport->width, -+ SEC_VIEWPORT_HEIGHT, viewport->height); -+ -+ REG_SET_2(DCSURF_SEC_VIEWPORT_START, 0, -+ SEC_VIEWPORT_X_START, viewport->x, -+ SEC_VIEWPORT_Y_START, viewport->y); -+ -+ /* DC supports NV12 only at the moment */ -+ REG_SET_2(DCSURF_PRI_VIEWPORT_DIMENSION_C, 0, -+ PRI_VIEWPORT_WIDTH_C, viewport_c->width, -+ PRI_VIEWPORT_HEIGHT_C, viewport_c->height); -+ -+ REG_SET_2(DCSURF_PRI_VIEWPORT_START_C, 0, -+ PRI_VIEWPORT_X_START_C, viewport_c->x, -+ PRI_VIEWPORT_Y_START_C, viewport_c->y); -+} -+ -+static int get_lb_depth_bpc(enum lb_pixel_depth depth) -+{ -+ if (depth == LB_PIXEL_DEPTH_30BPP) -+ return 10; -+ else if (depth == LB_PIXEL_DEPTH_24BPP) -+ return 8; -+ else if (depth == LB_PIXEL_DEPTH_18BPP) -+ return 6; -+ else if (depth == LB_PIXEL_DEPTH_36BPP) -+ return 12; -+ else { -+ BREAK_TO_DEBUGGER(); -+ return -1; /* Unsupported */ -+ } -+} -+ -+static void calc_lb_num_partitions( -+ const struct scaler_data *scl_data, -+ enum lb_memory_config lb_config, -+ int *num_part_y, -+ int *num_part_c) -+{ -+ int line_size = scl_data->viewport.width < scl_data->recout.width ? -+ scl_data->viewport.width : scl_data->recout.width; -+ int line_size_c = scl_data->viewport_c.width < scl_data->recout.width ? -+ scl_data->viewport_c.width : scl_data->recout.width; -+ int lb_bpc = get_lb_depth_bpc(scl_data->lb_params.depth); -+ int memory_line_size_y = (line_size * lb_bpc + 71) / 72; /* +71 to ceil */ -+ int memory_line_size_c = (line_size_c * lb_bpc + 71) / 72; /* +71 to ceil */ -+ int memory_line_size_a = (line_size + 5) / 6; /* +5 to ceil */ -+ int lb_memory_size, lb_memory_size_c, lb_memory_size_a, num_partitions_a; -+ -+ if (lb_config == LB_MEMORY_CONFIG_1) { -+ lb_memory_size = 816; -+ lb_memory_size_c = 816; -+ lb_memory_size_a = 984; -+ } else if (lb_config == LB_MEMORY_CONFIG_2) { -+ lb_memory_size = 1088; -+ lb_memory_size_c = 1088; -+ lb_memory_size_a = 1312; -+ } else if (lb_config == LB_MEMORY_CONFIG_3) { -+ lb_memory_size = 816 + 1088 + 848 + 848 + 848; -+ lb_memory_size_c = 816 + 1088; -+ lb_memory_size_a = 984 + 1312 + 456; -+ } else { -+ lb_memory_size = 816 + 1088 + 848; -+ lb_memory_size_c = 816 + 1088 + 848; -+ lb_memory_size_a = 984 + 1312 + 456; -+ } -+ *num_part_y = lb_memory_size / memory_line_size_y; -+ *num_part_c = lb_memory_size_c / memory_line_size_c; -+ num_partitions_a = lb_memory_size_a / memory_line_size_a; -+ -+ if (scl_data->lb_params.alpha_en -+ && (num_partitions_a < *num_part_y)) -+ *num_part_y = num_partitions_a; -+ -+ if (*num_part_y > 64) -+ *num_part_y = 64; -+ if (*num_part_c > 64) -+ *num_part_c = 64; -+ -+} -+ -+static bool is_lb_conf_valid(int ceil_vratio, int num_partitions, int vtaps) -+{ -+ if (ceil_vratio > 2) -+ return vtaps <= (num_partitions - ceil_vratio + 2); -+ else -+ return vtaps <= num_partitions; -+} -+ -+/*find first match configuration which meets the min required lb size*/ -+static enum lb_memory_config find_lb_memory_config(const struct scaler_data *scl_data) -+{ -+ int num_part_y, num_part_c; -+ int vtaps = scl_data->taps.v_taps; -+ int vtaps_c = scl_data->taps.v_taps_c; -+ int ceil_vratio = dal_fixed31_32_ceil(scl_data->ratios.vert); -+ int ceil_vratio_c = dal_fixed31_32_ceil(scl_data->ratios.vert_c); -+ -+ calc_lb_num_partitions( -+ scl_data, LB_MEMORY_CONFIG_1, &num_part_y, &num_part_c); -+ -+ if (is_lb_conf_valid(ceil_vratio, num_part_y, vtaps) -+ && is_lb_conf_valid(ceil_vratio_c, num_part_c, vtaps_c)) -+ return LB_MEMORY_CONFIG_1; -+ -+ calc_lb_num_partitions( -+ scl_data, LB_MEMORY_CONFIG_2, &num_part_y, &num_part_c); -+ -+ if (is_lb_conf_valid(ceil_vratio, num_part_y, vtaps) -+ && is_lb_conf_valid(ceil_vratio_c, num_part_c, vtaps_c)) -+ return LB_MEMORY_CONFIG_2; -+ -+ if (scl_data->format == PIXEL_FORMAT_420BPP12 -+ || scl_data->format == PIXEL_FORMAT_420BPP15) { -+ calc_lb_num_partitions( -+ scl_data, LB_MEMORY_CONFIG_3, &num_part_y, &num_part_c); -+ -+ if (is_lb_conf_valid(ceil_vratio, num_part_y, vtaps) -+ && is_lb_conf_valid(ceil_vratio_c, num_part_c, vtaps_c)) -+ return LB_MEMORY_CONFIG_3; -+ } -+ -+ calc_lb_num_partitions( -+ scl_data, LB_MEMORY_CONFIG_0, &num_part_y, &num_part_c); -+ -+ /*Ensure we can support the requested number of vtaps*/ -+ ASSERT(is_lb_conf_valid(ceil_vratio, num_part_y, vtaps) -+ && is_lb_conf_valid(ceil_vratio_c, num_part_c, vtaps_c)); -+ -+ return LB_MEMORY_CONFIG_0; -+} -+ -+void transform_set_scaler_auto_scale( -+ struct transform *xfm_base, -+ const struct scaler_data *scl_data) -+{ -+ enum lb_memory_config lb_config; -+ struct dcn10_transform *xfm = TO_DCN10_TRANSFORM(xfm_base); -+ enum dscl_mode_sel dscl_mode = get_dscl_mode(scl_data); -+ bool ycbcr = scl_data->format >= PIXEL_FORMAT_VIDEO_BEGIN -+ && scl_data->format <= PIXEL_FORMAT_VIDEO_END; -+ -+ transform_set_overscan(xfm, scl_data); -+ -+ transform_set_otg_blank(xfm, scl_data); -+ -+ REG_UPDATE(SCL_MODE, DSCL_MODE, get_dscl_mode(scl_data)); -+ -+ transform_set_viewport(xfm, &scl_data->viewport, &scl_data->viewport_c); -+ -+ if (dscl_mode == DSCL_MODE_DSCL_BYPASS) -+ return; -+ -+ lb_config = find_lb_memory_config(scl_data); -+ transform_set_lb(xfm, &scl_data->lb_params, lb_config); -+ -+ if (dscl_mode == DSCL_MODE_SCALING_444_BYPASS) -+ return; -+ -+ /* TODO: v_min */ -+ REG_SET_3(DSCL_AUTOCAL, 0, -+ AUTOCAL_MODE, AUTOCAL_MODE_AUTOSCALE, -+ AUTOCAL_NUM_PIPE, 0, -+ AUTOCAL_PIPE_ID, 0); -+ -+ /* Black offsets */ -+ if (ycbcr) -+ REG_SET_2(SCL_BLACK_OFFSET, 0, -+ SCL_BLACK_OFFSET_RGB_Y, BLACK_OFFSET_RGB_Y, -+ SCL_BLACK_OFFSET_CBCR, BLACK_OFFSET_CBCR); -+ else -+ -+ REG_SET_2(SCL_BLACK_OFFSET, 0, -+ SCL_BLACK_OFFSET_RGB_Y, BLACK_OFFSET_RGB_Y, -+ SCL_BLACK_OFFSET_CBCR, BLACK_OFFSET_RGB_Y); -+ -+ REG_SET_4(SCL_TAP_CONTROL, 0, -+ SCL_V_NUM_TAPS, scl_data->taps.v_taps - 1, -+ SCL_H_NUM_TAPS, scl_data->taps.h_taps - 1, -+ SCL_V_NUM_TAPS_C, scl_data->taps.v_taps_c - 1, -+ SCL_H_NUM_TAPS_C, scl_data->taps.h_taps_c - 1); -+ -+ transform_set_scl_filter(xfm, scl_data, ycbcr); -+} -+ -+/* Program gamut remap in bypass mode */ -+void transform_set_gamut_remap_bypass(struct dcn10_transform *xfm) -+{ -+ REG_SET(CM_GAMUT_REMAP_CONTROL, 0, -+ CM_GAMUT_REMAP_MODE, 0); -+ /* Gamut remap in bypass */ -+} -+ -+static void transform_set_recout( -+ struct dcn10_transform *xfm, const struct rect *recout) -+{ -+ REG_SET_2(RECOUT_START, 0, -+ /* First pixel of RECOUT */ -+ RECOUT_START_X, recout->x, -+ /* First line of RECOUT */ -+ RECOUT_START_Y, recout->y); -+ -+ REG_SET_2(RECOUT_SIZE, 0, -+ /* Number of RECOUT horizontal pixels */ -+ RECOUT_WIDTH, recout->width, -+ /* Number of RECOUT vertical lines */ -+ RECOUT_HEIGHT, recout->height -+ - xfm->base.ctx->dc->debug.surface_visual_confirm * 2); -+} -+ -+static void transform_set_manual_ratio_init( -+ struct dcn10_transform *xfm, const struct scaler_data *data) -+{ -+ uint32_t init_frac = 0; -+ uint32_t init_int = 0; -+ -+ REG_SET(SCL_HORZ_FILTER_SCALE_RATIO, 0, -+ SCL_H_SCALE_RATIO, dal_fixed31_32_u2d19(data->ratios.horz) << 5); -+ -+ REG_SET(SCL_VERT_FILTER_SCALE_RATIO, 0, -+ SCL_V_SCALE_RATIO, dal_fixed31_32_u2d19(data->ratios.vert) << 5); -+ -+ REG_SET(SCL_HORZ_FILTER_SCALE_RATIO_C, 0, -+ SCL_H_SCALE_RATIO_C, dal_fixed31_32_u2d19(data->ratios.horz_c) << 5); -+ -+ REG_SET(SCL_VERT_FILTER_SCALE_RATIO_C, 0, -+ SCL_V_SCALE_RATIO_C, dal_fixed31_32_u2d19(data->ratios.vert_c) << 5); -+ -+ /* -+ * 0.24 format for fraction, first five bits zeroed -+ */ -+ init_frac = dal_fixed31_32_u0d19(data->inits.h) << 5; -+ init_int = dal_fixed31_32_floor(data->inits.h); -+ REG_SET_2(SCL_HORZ_FILTER_INIT, 0, -+ SCL_H_INIT_FRAC, init_frac, -+ SCL_H_INIT_INT, init_int); -+ -+ init_frac = dal_fixed31_32_u0d19(data->inits.h_c) << 5; -+ init_int = dal_fixed31_32_floor(data->inits.h_c); -+ REG_SET_2(SCL_HORZ_FILTER_INIT_C, 0, -+ SCL_H_INIT_FRAC_C, init_frac, -+ SCL_H_INIT_INT_C, init_int); -+ -+ init_frac = dal_fixed31_32_u0d19(data->inits.v) << 5; -+ init_int = dal_fixed31_32_floor(data->inits.v); -+ REG_SET_2(SCL_VERT_FILTER_INIT, 0, -+ SCL_V_INIT_FRAC, init_frac, -+ SCL_V_INIT_INT, init_int); -+ -+ init_frac = dal_fixed31_32_u0d19(data->inits.v_bot) << 5; -+ init_int = dal_fixed31_32_floor(data->inits.v_bot); -+ REG_SET_2(SCL_VERT_FILTER_INIT_BOT, 0, -+ SCL_V_INIT_FRAC_BOT, init_frac, -+ SCL_V_INIT_INT_BOT, init_int); -+ -+ init_frac = dal_fixed31_32_u0d19(data->inits.v_c) << 5; -+ init_int = dal_fixed31_32_floor(data->inits.v_c); -+ REG_SET_2(SCL_VERT_FILTER_INIT_C, 0, -+ SCL_V_INIT_FRAC_C, init_frac, -+ SCL_V_INIT_INT_C, init_int); -+ -+ init_frac = dal_fixed31_32_u0d19(data->inits.v_c_bot) << 5; -+ init_int = dal_fixed31_32_floor(data->inits.v_c_bot); -+ REG_SET_2(SCL_VERT_FILTER_INIT_BOT_C, 0, -+ SCL_V_INIT_FRAC_BOT_C, init_frac, -+ SCL_V_INIT_INT_BOT_C, init_int); -+} -+ -+/* Main function to program scaler and line buffer in manual scaling mode */ -+static void transform_set_scaler_manual_scale( -+ struct transform *xfm_base, -+ const struct scaler_data *scl_data) -+{ -+ enum lb_memory_config lb_config; -+ struct dcn10_transform *xfm = TO_DCN10_TRANSFORM(xfm_base); -+ enum dscl_mode_sel dscl_mode = get_dscl_mode(scl_data); -+ bool ycbcr = scl_data->format >= PIXEL_FORMAT_VIDEO_BEGIN -+ && scl_data->format <= PIXEL_FORMAT_VIDEO_END; -+ -+ /* Recout */ -+ transform_set_recout(xfm, &scl_data->recout); -+ -+ /* MPC Size */ -+ REG_SET_2(MPC_SIZE, 0, -+ /* Number of horizontal pixels of MPC */ -+ MPC_WIDTH, scl_data->h_active, -+ /* Number of vertical lines of MPC */ -+ MPC_HEIGHT, scl_data->v_active); -+ -+ /* SCL mode */ -+ REG_UPDATE(SCL_MODE, DSCL_MODE, dscl_mode); -+ -+ /* Viewport */ -+ transform_set_viewport(xfm, &scl_data->viewport, &scl_data->viewport_c); -+ -+ if (dscl_mode == DSCL_MODE_DSCL_BYPASS) -+ return; -+ /* LB */ -+ lb_config = find_lb_memory_config(scl_data); -+ transform_set_lb(xfm, &scl_data->lb_params, lb_config); -+ -+ if (dscl_mode == DSCL_MODE_SCALING_444_BYPASS) -+ return; -+ -+ /* Autocal off */ -+ REG_SET_3(DSCL_AUTOCAL, 0, -+ AUTOCAL_MODE, AUTOCAL_MODE_OFF, -+ AUTOCAL_NUM_PIPE, 0, -+ AUTOCAL_PIPE_ID, 0); -+ -+ /* Black offsets */ -+ if (ycbcr) -+ REG_SET_2(SCL_BLACK_OFFSET, 0, -+ SCL_BLACK_OFFSET_RGB_Y, BLACK_OFFSET_RGB_Y, -+ SCL_BLACK_OFFSET_CBCR, BLACK_OFFSET_CBCR); -+ else -+ -+ REG_SET_2(SCL_BLACK_OFFSET, 0, -+ SCL_BLACK_OFFSET_RGB_Y, BLACK_OFFSET_RGB_Y, -+ SCL_BLACK_OFFSET_CBCR, BLACK_OFFSET_RGB_Y); -+ -+ /* Manually calculate scale ratio and init values */ -+ transform_set_manual_ratio_init(xfm, scl_data); -+ -+ /* HTaps/VTaps */ -+ REG_SET_4(SCL_TAP_CONTROL, 0, -+ SCL_V_NUM_TAPS, scl_data->taps.v_taps - 1, -+ SCL_H_NUM_TAPS, scl_data->taps.h_taps - 1, -+ SCL_V_NUM_TAPS_C, scl_data->taps.v_taps_c - 1, -+ SCL_H_NUM_TAPS_C, scl_data->taps.h_taps_c - 1); -+ -+ transform_set_scl_filter(xfm, scl_data, ycbcr); -+} -+ -+#define IDENTITY_RATIO(ratio) (dal_fixed31_32_u2d19(ratio) == (1 << 19)) -+ -+ -+static bool transform_get_optimal_number_of_taps( -+ struct transform *xfm, -+ struct scaler_data *scl_data, -+ const struct scaling_taps *in_taps) -+{ -+ uint32_t pixel_width; -+ -+ if (scl_data->viewport.width > scl_data->recout.width) -+ pixel_width = scl_data->recout.width; -+ else -+ pixel_width = scl_data->viewport.width; -+ -+ /* TODO: add lb check */ -+ -+ /* No support for programming ratio of 4, drop to 3.99999.. */ -+ if (scl_data->ratios.horz.value == (4ll << 32)) -+ scl_data->ratios.horz.value--; -+ if (scl_data->ratios.vert.value == (4ll << 32)) -+ scl_data->ratios.vert.value--; -+ if (scl_data->ratios.horz_c.value == (4ll << 32)) -+ scl_data->ratios.horz_c.value--; -+ if (scl_data->ratios.vert_c.value == (4ll << 32)) -+ scl_data->ratios.vert_c.value--; -+ -+ /* Set default taps if none are provided */ -+ if (in_taps->h_taps == 0) -+ scl_data->taps.h_taps = 4; -+ else -+ scl_data->taps.h_taps = in_taps->h_taps; -+ if (in_taps->v_taps == 0) -+ scl_data->taps.v_taps = 4; -+ else -+ scl_data->taps.v_taps = in_taps->v_taps; -+ if (in_taps->v_taps_c == 0) -+ scl_data->taps.v_taps_c = 2; -+ else -+ scl_data->taps.v_taps_c = in_taps->v_taps_c; -+ if (in_taps->h_taps_c == 0) -+ scl_data->taps.h_taps_c = 2; -+ /* Only 1 and even h_taps_c are supported by hw */ -+ else if ((in_taps->h_taps_c % 2) != 0 && in_taps->h_taps_c != 1) -+ scl_data->taps.h_taps_c = in_taps->h_taps_c - 1; -+ else -+ scl_data->taps.h_taps_c = in_taps->h_taps_c; -+ -+ if (IDENTITY_RATIO(scl_data->ratios.horz)) -+ scl_data->taps.h_taps = 1; -+ if (IDENTITY_RATIO(scl_data->ratios.vert)) -+ scl_data->taps.v_taps = 1; -+ if (IDENTITY_RATIO(scl_data->ratios.horz_c)) -+ scl_data->taps.h_taps_c = 1; -+ if (IDENTITY_RATIO(scl_data->ratios.vert_c)) -+ scl_data->taps.v_taps_c = 1; -+ -+ return true; -+} -+ -+static void transform_reset(struct transform *xfm_base) -+{ -+ struct dcn10_transform *xfm = TO_DCN10_TRANSFORM(xfm_base); -+ -+ xfm->filter_h_c = NULL; -+ xfm->filter_v_c = NULL; -+ xfm->filter_h = NULL; -+ xfm->filter_v = NULL; -+ -+ /* set boundary mode to 0 */ -+ REG_SET(DSCL_CONTROL, 0, SCL_BOUNDARY_MODE, 0); -+} -+ -+static void program_gamut_remap( -+ struct dcn10_transform *xfm, -+ const uint16_t *regval, -+ enum gamut_remap_select select) -+{ -+ uint16_t selection = 0; -+ -+ if (regval == NULL || select == GAMUT_REMAP_BYPASS) { -+ REG_SET(CM_GAMUT_REMAP_CONTROL, 0, -+ CM_GAMUT_REMAP_MODE, 0); -+ return; -+ } -+ switch (select) { -+ case GAMUT_REMAP_COEFF: -+ selection = 1; -+ break; -+ case GAMUT_REMAP_COMA_COEFF: -+ selection = 2; -+ break; -+ case GAMUT_REMAP_COMB_COEFF: -+ selection = 3; -+ break; -+ default: -+ break; -+ } -+ -+ -+ if (select == GAMUT_REMAP_COEFF) { -+ -+ REG_SET_2(CM_GAMUT_REMAP_C11_C12, 0, -+ CM_GAMUT_REMAP_C11, regval[0], -+ CM_GAMUT_REMAP_C12, regval[1]); -+ regval += 2; -+ REG_SET_2(CM_GAMUT_REMAP_C13_C14, 0, -+ CM_GAMUT_REMAP_C13, regval[0], -+ CM_GAMUT_REMAP_C14, regval[1]); -+ regval += 2; -+ REG_SET_2(CM_GAMUT_REMAP_C21_C22, 0, -+ CM_GAMUT_REMAP_C21, regval[0], -+ CM_GAMUT_REMAP_C22, regval[1]); -+ regval += 2; -+ REG_SET_2(CM_GAMUT_REMAP_C23_C24, 0, -+ CM_GAMUT_REMAP_C23, regval[0], -+ CM_GAMUT_REMAP_C24, regval[1]); -+ regval += 2; -+ REG_SET_2(CM_GAMUT_REMAP_C31_C32, 0, -+ CM_GAMUT_REMAP_C31, regval[0], -+ CM_GAMUT_REMAP_C32, regval[1]); -+ regval += 2; -+ REG_SET_2(CM_GAMUT_REMAP_C33_C34, 0, -+ CM_GAMUT_REMAP_C33, regval[0], -+ CM_GAMUT_REMAP_C34, regval[1]); -+ -+ } else if (select == GAMUT_REMAP_COMA_COEFF) { -+ REG_SET_2(CM_COMA_C11_C12, 0, -+ CM_COMA_C11, regval[0], -+ CM_COMA_C12, regval[1]); -+ regval += 2; -+ REG_SET_2(CM_COMA_C13_C14, 0, -+ CM_COMA_C13, regval[0], -+ CM_COMA_C14, regval[1]); -+ regval += 2; -+ REG_SET_2(CM_COMA_C21_C22, 0, -+ CM_COMA_C21, regval[0], -+ CM_COMA_C22, regval[1]); -+ regval += 2; -+ REG_SET_2(CM_COMA_C23_C24, 0, -+ CM_COMA_C23, regval[0], -+ CM_COMA_C24, regval[1]); -+ regval += 2; -+ REG_SET_2(CM_COMA_C31_C32, 0, -+ CM_COMA_C31, regval[0], -+ CM_COMA_C32, regval[1]); -+ regval += 2; -+ REG_SET_2(CM_COMA_C33_C34, 0, -+ CM_COMA_C33, regval[0], -+ CM_COMA_C34, regval[1]); -+ -+ } else { -+ REG_SET_2(CM_COMB_C11_C12, 0, -+ CM_COMB_C11, regval[0], -+ CM_COMB_C12, regval[1]); -+ regval += 2; -+ REG_SET_2(CM_COMB_C13_C14, 0, -+ CM_COMB_C13, regval[0], -+ CM_COMB_C14, regval[1]); -+ regval += 2; -+ REG_SET_2(CM_COMB_C21_C22, 0, -+ CM_COMB_C21, regval[0], -+ CM_COMB_C22, regval[1]); -+ regval += 2; -+ REG_SET_2(CM_COMB_C23_C24, 0, -+ CM_COMB_C23, regval[0], -+ CM_COMB_C24, regval[1]); -+ regval += 2; -+ REG_SET_2(CM_COMB_C31_C32, 0, -+ CM_COMB_C31, regval[0], -+ CM_COMB_C32, regval[1]); -+ regval += 2; -+ REG_SET_2(CM_COMB_C33_C34, 0, -+ CM_COMB_C33, regval[0], -+ CM_COMB_C34, regval[1]); -+ } -+ -+ REG_SET( -+ CM_GAMUT_REMAP_CONTROL, 0, -+ CM_GAMUT_REMAP_MODE, selection); -+ -+} -+ -+static void dcn_transform_set_gamut_remap( -+ struct transform *xfm, -+ const struct xfm_grph_csc_adjustment *adjust) -+{ -+ struct dcn10_transform *dcn_xfm = TO_DCN10_TRANSFORM(xfm); -+ -+ if (adjust->gamut_adjust_type != GRAPHICS_GAMUT_ADJUST_TYPE_SW) -+ /* Bypass if type is bypass or hw */ -+ program_gamut_remap(dcn_xfm, NULL, GAMUT_REMAP_BYPASS); -+ else { -+ struct fixed31_32 arr_matrix[12]; -+ uint16_t arr_reg_val[12]; -+ -+ arr_matrix[0] = adjust->temperature_matrix[0]; -+ arr_matrix[1] = adjust->temperature_matrix[1]; -+ arr_matrix[2] = adjust->temperature_matrix[2]; -+ arr_matrix[3] = dal_fixed31_32_zero; -+ -+ arr_matrix[4] = adjust->temperature_matrix[3]; -+ arr_matrix[5] = adjust->temperature_matrix[4]; -+ arr_matrix[6] = adjust->temperature_matrix[5]; -+ arr_matrix[7] = dal_fixed31_32_zero; -+ -+ arr_matrix[8] = adjust->temperature_matrix[6]; -+ arr_matrix[9] = adjust->temperature_matrix[7]; -+ arr_matrix[10] = adjust->temperature_matrix[8]; -+ arr_matrix[11] = dal_fixed31_32_zero; -+ -+ convert_float_matrix( -+ arr_reg_val, arr_matrix, 12); -+ -+ program_gamut_remap(dcn_xfm, arr_reg_val, GAMUT_REMAP_COEFF); -+ } -+} -+ -+static struct transform_funcs dcn10_transform_funcs = { -+ -+ .transform_reset = transform_reset, -+ .transform_set_scaler = transform_set_scaler_manual_scale, -+ .transform_get_optimal_number_of_taps = -+ transform_get_optimal_number_of_taps, -+ .transform_set_gamut_remap = dcn_transform_set_gamut_remap -+}; -+ -+/*****************************************/ -+/* Constructor, Destructor */ -+/*****************************************/ -+ -+bool dcn10_transform_construct( -+ struct dcn10_transform *xfm, -+ struct dc_context *ctx, -+ const struct dcn_transform_registers *tf_regs, -+ const struct dcn_transform_shift *tf_shift, -+ const struct dcn_transform_mask *tf_mask) -+{ -+ xfm->base.ctx = ctx; -+ -+ xfm->base.funcs = &dcn10_transform_funcs; -+ -+ xfm->tf_regs = tf_regs; -+ xfm->tf_shift = tf_shift; -+ xfm->tf_mask = tf_mask; -+ -+ xfm->lb_pixel_depth_supported = -+ LB_PIXEL_DEPTH_18BPP | -+ LB_PIXEL_DEPTH_24BPP | -+ LB_PIXEL_DEPTH_30BPP; -+ -+ xfm->lb_bits_per_entry = LB_BITS_PER_ENTRY; -+ xfm->lb_memory_size = LB_TOTAL_NUMBER_OF_ENTRIES; /*0x1404*/ -+ -+ return true; -+} -diff --git a/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_transform.h b/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_transform.h -new file mode 100644 -index 0000000..7c0089d ---- /dev/null -+++ b/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_transform.h -@@ -0,0 +1,416 @@ -+/* 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 __DAL_TRANSFORM_DCN10_H__ -+#define __DAL_TRANSFORM_DCN10_H__ -+ -+#include "transform.h" -+ -+#define TO_DCN10_TRANSFORM(transform)\ -+ container_of(transform, struct dcn10_transform, base) -+ -+/* TODO: Use correct number of taps. Using polaris values for now */ -+#define LB_TOTAL_NUMBER_OF_ENTRIES 5124 -+#define LB_BITS_PER_ENTRY 144 -+ -+#define TF_SF(reg_name, field_name, post_fix)\ -+ .field_name = reg_name ## __ ## field_name ## post_fix -+ -+#define TF_REG_LIST_DCN(id) \ -+ SRI(DSCL_EXT_OVERSCAN_LEFT_RIGHT, DSCL, id), \ -+ SRI(DSCL_EXT_OVERSCAN_TOP_BOTTOM, DSCL, id), \ -+ SRI(OTG_H_BLANK, DSCL, id), \ -+ SRI(OTG_V_BLANK, DSCL, id), \ -+ SRI(SCL_MODE, DSCL, id), \ -+ SRI(LB_DATA_FORMAT, DSCL, id), \ -+ SRI(LB_MEMORY_CTRL, DSCL, id), \ -+ SRI(DSCL_AUTOCAL, DSCL, id), \ -+ SRI(SCL_BLACK_OFFSET, DSCL, id), \ -+ SRI(DSCL_CONTROL, DSCL, id), \ -+ SRI(SCL_TAP_CONTROL, DSCL, id), \ -+ SRI(SCL_COEF_RAM_TAP_SELECT, DSCL, id), \ -+ SRI(SCL_COEF_RAM_TAP_DATA, DSCL, id), \ -+ SRI(DSCL_2TAP_CONTROL, DSCL, id), \ -+ SRI(DCSURF_PRI_VIEWPORT_DIMENSION, HUBP, id), \ -+ SRI(DCSURF_PRI_VIEWPORT_START, HUBP, id), \ -+ SRI(DCSURF_SEC_VIEWPORT_DIMENSION, HUBP, id), \ -+ SRI(DCSURF_SEC_VIEWPORT_START, HUBP, id), \ -+ SRI(DCSURF_PRI_VIEWPORT_DIMENSION_C, HUBP, id), \ -+ SRI(DCSURF_PRI_VIEWPORT_START_C, HUBP, id), \ -+ SRI(CM_GAMUT_REMAP_CONTROL, CM, id), \ -+ SRI(MPC_SIZE, DSCL, id), \ -+ SRI(SCL_HORZ_FILTER_SCALE_RATIO, DSCL, id), \ -+ SRI(SCL_VERT_FILTER_SCALE_RATIO, DSCL, id), \ -+ SRI(SCL_HORZ_FILTER_SCALE_RATIO_C, DSCL, id), \ -+ SRI(SCL_VERT_FILTER_SCALE_RATIO_C, DSCL, id), \ -+ SRI(SCL_HORZ_FILTER_INIT, DSCL, id), \ -+ SRI(SCL_HORZ_FILTER_INIT_C, DSCL, id), \ -+ SRI(SCL_VERT_FILTER_INIT, DSCL, id), \ -+ SRI(SCL_VERT_FILTER_INIT_BOT, DSCL, id), \ -+ SRI(SCL_VERT_FILTER_INIT_C, DSCL, id), \ -+ SRI(SCL_VERT_FILTER_INIT_BOT_C, DSCL, id), \ -+ SRI(RECOUT_START, DSCL, id), \ -+ SRI(RECOUT_SIZE, DSCL, id), \ -+ SRI(CM_GAMUT_REMAP_CONTROL, CM, id),\ -+ SRI(CM_GAMUT_REMAP_C11_C12, CM, id),\ -+ SRI(CM_GAMUT_REMAP_C13_C14, CM, id),\ -+ SRI(CM_GAMUT_REMAP_C21_C22, CM, id),\ -+ SRI(CM_GAMUT_REMAP_C23_C24, CM, id),\ -+ SRI(CM_GAMUT_REMAP_C31_C32, CM, id),\ -+ SRI(CM_GAMUT_REMAP_C33_C34, CM, id),\ -+ SRI(CM_COMA_C11_C12, CM, id),\ -+ SRI(CM_COMA_C13_C14, CM, id),\ -+ SRI(CM_COMA_C21_C22, CM, id),\ -+ SRI(CM_COMA_C23_C24, CM, id),\ -+ SRI(CM_COMA_C31_C32, CM, id),\ -+ SRI(CM_COMA_C33_C34, CM, id),\ -+ SRI(CM_COMB_C11_C12, CM, id),\ -+ SRI(CM_COMB_C13_C14, CM, id),\ -+ SRI(CM_COMB_C21_C22, CM, id),\ -+ SRI(CM_COMB_C23_C24, CM, id),\ -+ SRI(CM_COMB_C31_C32, CM, id),\ -+ SRI(CM_COMB_C33_C34, CM, id) -+ -+ -+ -+#define TF_REG_LIST_SH_MASK_DCN(mask_sh)\ -+ TF_SF(DSCL0_DSCL_EXT_OVERSCAN_LEFT_RIGHT, EXT_OVERSCAN_LEFT, mask_sh),\ -+ TF_SF(DSCL0_DSCL_EXT_OVERSCAN_LEFT_RIGHT, EXT_OVERSCAN_RIGHT, mask_sh),\ -+ TF_SF(DSCL0_DSCL_EXT_OVERSCAN_TOP_BOTTOM, EXT_OVERSCAN_BOTTOM, mask_sh),\ -+ TF_SF(DSCL0_DSCL_EXT_OVERSCAN_TOP_BOTTOM, EXT_OVERSCAN_TOP, mask_sh),\ -+ TF_SF(DSCL0_OTG_H_BLANK, OTG_H_BLANK_START, mask_sh),\ -+ TF_SF(DSCL0_OTG_H_BLANK, OTG_H_BLANK_END, mask_sh),\ -+ TF_SF(DSCL0_OTG_V_BLANK, OTG_V_BLANK_START, mask_sh),\ -+ TF_SF(DSCL0_OTG_V_BLANK, OTG_V_BLANK_END, mask_sh),\ -+ TF_SF(DSCL0_LB_DATA_FORMAT, PIXEL_DEPTH, mask_sh),\ -+ TF_SF(DSCL0_LB_DATA_FORMAT, PIXEL_EXPAN_MODE, mask_sh),\ -+ TF_SF(DSCL0_LB_DATA_FORMAT, PIXEL_REDUCE_MODE, mask_sh),\ -+ TF_SF(DSCL0_LB_DATA_FORMAT, DYNAMIC_PIXEL_DEPTH, mask_sh),\ -+ TF_SF(DSCL0_LB_DATA_FORMAT, DITHER_EN, mask_sh),\ -+ TF_SF(DSCL0_LB_DATA_FORMAT, INTERLEAVE_EN, mask_sh),\ -+ TF_SF(DSCL0_LB_DATA_FORMAT, ALPHA_EN, mask_sh),\ -+ TF_SF(DSCL0_LB_MEMORY_CTRL, MEMORY_CONFIG, mask_sh),\ -+ TF_SF(DSCL0_LB_MEMORY_CTRL, LB_MAX_PARTITIONS, mask_sh),\ -+ TF_SF(DSCL0_DSCL_AUTOCAL, AUTOCAL_MODE, mask_sh),\ -+ TF_SF(DSCL0_DSCL_AUTOCAL, AUTOCAL_NUM_PIPE, mask_sh),\ -+ TF_SF(DSCL0_DSCL_AUTOCAL, AUTOCAL_PIPE_ID, mask_sh),\ -+ TF_SF(DSCL0_SCL_BLACK_OFFSET, SCL_BLACK_OFFSET_RGB_Y, mask_sh),\ -+ TF_SF(DSCL0_SCL_BLACK_OFFSET, SCL_BLACK_OFFSET_CBCR, mask_sh),\ -+ TF_SF(DSCL0_DSCL_CONTROL, SCL_BOUNDARY_MODE, mask_sh),\ -+ TF_SF(DSCL0_SCL_TAP_CONTROL, SCL_V_NUM_TAPS, mask_sh),\ -+ TF_SF(DSCL0_SCL_TAP_CONTROL, SCL_H_NUM_TAPS, mask_sh),\ -+ TF_SF(DSCL0_SCL_TAP_CONTROL, SCL_V_NUM_TAPS_C, mask_sh),\ -+ TF_SF(DSCL0_SCL_TAP_CONTROL, SCL_H_NUM_TAPS_C, mask_sh),\ -+ TF_SF(DSCL0_SCL_COEF_RAM_TAP_SELECT, SCL_COEF_RAM_TAP_PAIR_IDX, mask_sh),\ -+ TF_SF(DSCL0_SCL_COEF_RAM_TAP_SELECT, SCL_COEF_RAM_PHASE, mask_sh),\ -+ TF_SF(DSCL0_SCL_COEF_RAM_TAP_SELECT, SCL_COEF_RAM_FILTER_TYPE, mask_sh),\ -+ TF_SF(DSCL0_SCL_COEF_RAM_TAP_DATA, SCL_COEF_RAM_EVEN_TAP_COEF, mask_sh),\ -+ TF_SF(DSCL0_SCL_COEF_RAM_TAP_DATA, SCL_COEF_RAM_EVEN_TAP_COEF_EN, mask_sh),\ -+ TF_SF(DSCL0_SCL_COEF_RAM_TAP_DATA, SCL_COEF_RAM_ODD_TAP_COEF, mask_sh),\ -+ TF_SF(DSCL0_SCL_COEF_RAM_TAP_DATA, SCL_COEF_RAM_ODD_TAP_COEF_EN, mask_sh),\ -+ TF_SF(DSCL0_DSCL_2TAP_CONTROL, SCL_H_2TAP_HARDCODE_COEF_EN, mask_sh),\ -+ TF_SF(DSCL0_DSCL_2TAP_CONTROL, SCL_H_2TAP_SHARP_EN, mask_sh),\ -+ TF_SF(DSCL0_DSCL_2TAP_CONTROL, SCL_H_2TAP_SHARP_FACTOR, mask_sh),\ -+ TF_SF(DSCL0_DSCL_2TAP_CONTROL, SCL_V_2TAP_HARDCODE_COEF_EN, mask_sh),\ -+ TF_SF(DSCL0_DSCL_2TAP_CONTROL, SCL_V_2TAP_SHARP_EN, mask_sh),\ -+ TF_SF(DSCL0_DSCL_2TAP_CONTROL, SCL_V_2TAP_SHARP_FACTOR, mask_sh),\ -+ TF_SF(DSCL0_SCL_MODE, SCL_COEF_RAM_SELECT, mask_sh),\ -+ TF_SF(HUBP0_DCSURF_PRI_VIEWPORT_DIMENSION, PRI_VIEWPORT_WIDTH, mask_sh),\ -+ TF_SF(HUBP0_DCSURF_PRI_VIEWPORT_DIMENSION, PRI_VIEWPORT_HEIGHT, mask_sh),\ -+ TF_SF(HUBP0_DCSURF_PRI_VIEWPORT_START, PRI_VIEWPORT_X_START, mask_sh),\ -+ TF_SF(HUBP0_DCSURF_PRI_VIEWPORT_START, PRI_VIEWPORT_Y_START, mask_sh),\ -+ TF_SF(HUBP0_DCSURF_SEC_VIEWPORT_DIMENSION, SEC_VIEWPORT_WIDTH, mask_sh),\ -+ TF_SF(HUBP0_DCSURF_SEC_VIEWPORT_DIMENSION, SEC_VIEWPORT_HEIGHT, mask_sh),\ -+ TF_SF(HUBP0_DCSURF_SEC_VIEWPORT_START, SEC_VIEWPORT_X_START, mask_sh),\ -+ TF_SF(HUBP0_DCSURF_SEC_VIEWPORT_START, SEC_VIEWPORT_Y_START, mask_sh),\ -+ TF_SF(HUBP0_DCSURF_PRI_VIEWPORT_DIMENSION_C, PRI_VIEWPORT_WIDTH_C, mask_sh),\ -+ TF_SF(HUBP0_DCSURF_PRI_VIEWPORT_DIMENSION_C, PRI_VIEWPORT_HEIGHT_C, mask_sh),\ -+ TF_SF(HUBP0_DCSURF_PRI_VIEWPORT_START_C, PRI_VIEWPORT_X_START_C, mask_sh),\ -+ TF_SF(HUBP0_DCSURF_PRI_VIEWPORT_START_C, PRI_VIEWPORT_Y_START_C, mask_sh),\ -+ TF_SF(DSCL0_SCL_MODE, DSCL_MODE, mask_sh),\ -+ TF_SF(DSCL0_RECOUT_START, RECOUT_START_X, mask_sh),\ -+ TF_SF(DSCL0_RECOUT_START, RECOUT_START_Y, mask_sh),\ -+ TF_SF(DSCL0_RECOUT_SIZE, RECOUT_WIDTH, mask_sh),\ -+ TF_SF(DSCL0_RECOUT_SIZE, RECOUT_HEIGHT, mask_sh),\ -+ TF_SF(DSCL0_MPC_SIZE, MPC_WIDTH, mask_sh),\ -+ TF_SF(DSCL0_MPC_SIZE, MPC_HEIGHT, mask_sh),\ -+ TF_SF(DSCL0_SCL_HORZ_FILTER_SCALE_RATIO, SCL_H_SCALE_RATIO, mask_sh),\ -+ TF_SF(DSCL0_SCL_VERT_FILTER_SCALE_RATIO, SCL_V_SCALE_RATIO, mask_sh),\ -+ TF_SF(DSCL0_SCL_HORZ_FILTER_SCALE_RATIO_C, SCL_H_SCALE_RATIO_C, mask_sh),\ -+ TF_SF(DSCL0_SCL_VERT_FILTER_SCALE_RATIO_C, SCL_V_SCALE_RATIO_C, mask_sh),\ -+ TF_SF(DSCL0_SCL_HORZ_FILTER_INIT, SCL_H_INIT_FRAC, mask_sh),\ -+ TF_SF(DSCL0_SCL_HORZ_FILTER_INIT, SCL_H_INIT_INT, mask_sh),\ -+ TF_SF(DSCL0_SCL_HORZ_FILTER_INIT_C, SCL_H_INIT_FRAC_C, mask_sh),\ -+ TF_SF(DSCL0_SCL_HORZ_FILTER_INIT_C, SCL_H_INIT_INT_C, mask_sh),\ -+ TF_SF(DSCL0_SCL_VERT_FILTER_INIT, SCL_V_INIT_FRAC, mask_sh),\ -+ TF_SF(DSCL0_SCL_VERT_FILTER_INIT, SCL_V_INIT_INT, mask_sh),\ -+ TF_SF(DSCL0_SCL_VERT_FILTER_INIT_BOT, SCL_V_INIT_FRAC_BOT, mask_sh),\ -+ TF_SF(DSCL0_SCL_VERT_FILTER_INIT_BOT, SCL_V_INIT_INT_BOT, mask_sh),\ -+ TF_SF(DSCL0_SCL_VERT_FILTER_INIT_C, SCL_V_INIT_FRAC_C, mask_sh),\ -+ TF_SF(DSCL0_SCL_VERT_FILTER_INIT_C, SCL_V_INIT_INT_C, mask_sh),\ -+ TF_SF(DSCL0_SCL_VERT_FILTER_INIT_BOT_C, SCL_V_INIT_FRAC_BOT_C, mask_sh),\ -+ TF_SF(DSCL0_SCL_VERT_FILTER_INIT_BOT_C, SCL_V_INIT_INT_BOT_C, mask_sh),\ -+ TF_SF(DSCL0_SCL_MODE, SCL_CHROMA_COEF_MODE, mask_sh),\ -+ TF_SF(DSCL0_SCL_MODE, SCL_COEF_RAM_SELECT_CURRENT, mask_sh),\ -+ TF_SF(CM0_CM_GAMUT_REMAP_CONTROL, CM_GAMUT_REMAP_MODE, mask_sh),\ -+ TF_SF(CM0_CM_GAMUT_REMAP_C11_C12, CM_GAMUT_REMAP_C11, mask_sh),\ -+ TF_SF(CM0_CM_GAMUT_REMAP_C11_C12, CM_GAMUT_REMAP_C12, mask_sh),\ -+ TF_SF(CM0_CM_GAMUT_REMAP_C13_C14, CM_GAMUT_REMAP_C13, mask_sh),\ -+ TF_SF(CM0_CM_GAMUT_REMAP_C13_C14, CM_GAMUT_REMAP_C14, mask_sh),\ -+ TF_SF(CM0_CM_GAMUT_REMAP_C21_C22, CM_GAMUT_REMAP_C21, mask_sh),\ -+ TF_SF(CM0_CM_GAMUT_REMAP_C21_C22, CM_GAMUT_REMAP_C22, mask_sh),\ -+ TF_SF(CM0_CM_GAMUT_REMAP_C23_C24, CM_GAMUT_REMAP_C23, mask_sh),\ -+ TF_SF(CM0_CM_GAMUT_REMAP_C23_C24, CM_GAMUT_REMAP_C24, mask_sh),\ -+ TF_SF(CM0_CM_GAMUT_REMAP_C31_C32, CM_GAMUT_REMAP_C31, mask_sh),\ -+ TF_SF(CM0_CM_GAMUT_REMAP_C31_C32, CM_GAMUT_REMAP_C32, mask_sh),\ -+ TF_SF(CM0_CM_GAMUT_REMAP_C33_C34, CM_GAMUT_REMAP_C33, mask_sh),\ -+ TF_SF(CM0_CM_GAMUT_REMAP_C33_C34, CM_GAMUT_REMAP_C34, mask_sh),\ -+ TF_SF(CM0_CM_COMA_C11_C12, CM_COMA_C11, mask_sh),\ -+ TF_SF(CM0_CM_COMA_C11_C12, CM_COMA_C12, mask_sh),\ -+ TF_SF(CM0_CM_COMA_C13_C14, CM_COMA_C13, mask_sh),\ -+ TF_SF(CM0_CM_COMA_C13_C14, CM_COMA_C14, mask_sh),\ -+ TF_SF(CM0_CM_COMA_C21_C22, CM_COMA_C21, mask_sh),\ -+ TF_SF(CM0_CM_COMA_C21_C22, CM_COMA_C22, mask_sh),\ -+ TF_SF(CM0_CM_COMA_C23_C24, CM_COMA_C23, mask_sh),\ -+ TF_SF(CM0_CM_COMA_C23_C24, CM_COMA_C24, mask_sh),\ -+ TF_SF(CM0_CM_COMA_C31_C32, CM_COMA_C31, mask_sh),\ -+ TF_SF(CM0_CM_COMA_C31_C32, CM_COMA_C32, mask_sh),\ -+ TF_SF(CM0_CM_COMA_C33_C34, CM_COMA_C33, mask_sh),\ -+ TF_SF(CM0_CM_COMA_C33_C34, CM_COMA_C34, mask_sh),\ -+ TF_SF(CM0_CM_COMB_C11_C12, CM_COMB_C11, mask_sh),\ -+ TF_SF(CM0_CM_COMB_C11_C12, CM_COMB_C12, mask_sh),\ -+ TF_SF(CM0_CM_COMB_C13_C14, CM_COMB_C13, mask_sh),\ -+ TF_SF(CM0_CM_COMB_C13_C14, CM_COMB_C14, mask_sh),\ -+ TF_SF(CM0_CM_COMB_C21_C22, CM_COMB_C21, mask_sh),\ -+ TF_SF(CM0_CM_COMB_C21_C22, CM_COMB_C22, mask_sh),\ -+ TF_SF(CM0_CM_COMB_C23_C24, CM_COMB_C23, mask_sh),\ -+ TF_SF(CM0_CM_COMB_C23_C24, CM_COMB_C24, mask_sh),\ -+ TF_SF(CM0_CM_COMB_C31_C32, CM_COMB_C31, mask_sh),\ -+ TF_SF(CM0_CM_COMB_C33_C34, CM_COMB_C33, mask_sh),\ -+ TF_SF(CM0_CM_COMB_C31_C32, CM_COMB_C32, mask_sh),\ -+ TF_SF(CM0_CM_COMB_C33_C34, CM_COMB_C34, mask_sh) -+ -+ -+#define TF_REG_FIELD_LIST(type) \ -+ type EXT_OVERSCAN_LEFT; \ -+ type EXT_OVERSCAN_RIGHT; \ -+ type EXT_OVERSCAN_BOTTOM; \ -+ type EXT_OVERSCAN_TOP; \ -+ type OTG_H_BLANK_START; \ -+ type OTG_H_BLANK_END; \ -+ type OTG_V_BLANK_START; \ -+ type OTG_V_BLANK_END; \ -+ type PIXEL_DEPTH; \ -+ type PIXEL_EXPAN_MODE; \ -+ type PIXEL_REDUCE_MODE; \ -+ type DYNAMIC_PIXEL_DEPTH; \ -+ type DITHER_EN; \ -+ type INTERLEAVE_EN; \ -+ type ALPHA_EN; \ -+ type MEMORY_CONFIG; \ -+ type LB_MAX_PARTITIONS; \ -+ type AUTOCAL_MODE; \ -+ type AUTOCAL_NUM_PIPE; \ -+ type AUTOCAL_PIPE_ID; \ -+ type SCL_BLACK_OFFSET_RGB_Y; \ -+ type SCL_BLACK_OFFSET_CBCR; \ -+ type SCL_BOUNDARY_MODE; \ -+ type SCL_V_NUM_TAPS; \ -+ type SCL_H_NUM_TAPS; \ -+ type SCL_V_NUM_TAPS_C; \ -+ type SCL_H_NUM_TAPS_C; \ -+ type SCL_COEF_RAM_TAP_PAIR_IDX; \ -+ type SCL_COEF_RAM_PHASE; \ -+ type SCL_COEF_RAM_FILTER_TYPE; \ -+ type SCL_COEF_RAM_EVEN_TAP_COEF; \ -+ type SCL_COEF_RAM_EVEN_TAP_COEF_EN; \ -+ type SCL_COEF_RAM_ODD_TAP_COEF; \ -+ type SCL_COEF_RAM_ODD_TAP_COEF_EN; \ -+ type SCL_H_2TAP_HARDCODE_COEF_EN; \ -+ type SCL_H_2TAP_SHARP_EN; \ -+ type SCL_H_2TAP_SHARP_FACTOR; \ -+ type SCL_V_2TAP_HARDCODE_COEF_EN; \ -+ type SCL_V_2TAP_SHARP_EN; \ -+ type SCL_V_2TAP_SHARP_FACTOR; \ -+ type SCL_COEF_RAM_SELECT; \ -+ type PRI_VIEWPORT_WIDTH; \ -+ type PRI_VIEWPORT_HEIGHT; \ -+ type PRI_VIEWPORT_X_START; \ -+ type PRI_VIEWPORT_Y_START; \ -+ type SEC_VIEWPORT_WIDTH; \ -+ type SEC_VIEWPORT_HEIGHT; \ -+ type SEC_VIEWPORT_X_START; \ -+ type SEC_VIEWPORT_Y_START; \ -+ type PRI_VIEWPORT_WIDTH_C; \ -+ type PRI_VIEWPORT_HEIGHT_C; \ -+ type PRI_VIEWPORT_X_START_C; \ -+ type PRI_VIEWPORT_Y_START_C; \ -+ type DSCL_MODE; \ -+ type RECOUT_START_X; \ -+ type RECOUT_START_Y; \ -+ type RECOUT_WIDTH; \ -+ type RECOUT_HEIGHT; \ -+ type MPC_WIDTH; \ -+ type MPC_HEIGHT; \ -+ type SCL_H_SCALE_RATIO; \ -+ type SCL_V_SCALE_RATIO; \ -+ type SCL_H_SCALE_RATIO_C; \ -+ type SCL_V_SCALE_RATIO_C; \ -+ type SCL_H_INIT_FRAC; \ -+ type SCL_H_INIT_INT; \ -+ type SCL_H_INIT_FRAC_C; \ -+ type SCL_H_INIT_INT_C; \ -+ type SCL_V_INIT_FRAC; \ -+ type SCL_V_INIT_INT; \ -+ type SCL_V_INIT_FRAC_BOT; \ -+ type SCL_V_INIT_INT_BOT; \ -+ type SCL_V_INIT_FRAC_C; \ -+ type SCL_V_INIT_INT_C; \ -+ type SCL_V_INIT_FRAC_BOT_C; \ -+ type SCL_V_INIT_INT_BOT_C; \ -+ type SCL_CHROMA_COEF_MODE; \ -+ type SCL_COEF_RAM_SELECT_CURRENT; \ -+ type CM_GAMUT_REMAP_MODE; \ -+ type CM_GAMUT_REMAP_C11; \ -+ type CM_GAMUT_REMAP_C12; \ -+ type CM_GAMUT_REMAP_C13; \ -+ type CM_GAMUT_REMAP_C14; \ -+ type CM_GAMUT_REMAP_C21; \ -+ type CM_GAMUT_REMAP_C22; \ -+ type CM_GAMUT_REMAP_C23; \ -+ type CM_GAMUT_REMAP_C24; \ -+ type CM_GAMUT_REMAP_C31; \ -+ type CM_GAMUT_REMAP_C32; \ -+ type CM_GAMUT_REMAP_C33; \ -+ type CM_GAMUT_REMAP_C34; \ -+ type CM_COMA_C11; \ -+ type CM_COMA_C12; \ -+ type CM_COMA_C13; \ -+ type CM_COMA_C14; \ -+ type CM_COMA_C21; \ -+ type CM_COMA_C22; \ -+ type CM_COMA_C23; \ -+ type CM_COMA_C24; \ -+ type CM_COMA_C31; \ -+ type CM_COMA_C32; \ -+ type CM_COMA_C33; \ -+ type CM_COMA_C34; \ -+ type CM_COMB_C11; \ -+ type CM_COMB_C12; \ -+ type CM_COMB_C13; \ -+ type CM_COMB_C14; \ -+ type CM_COMB_C21; \ -+ type CM_COMB_C22; \ -+ type CM_COMB_C23; \ -+ type CM_COMB_C24; \ -+ type CM_COMB_C31; \ -+ type CM_COMB_C32; \ -+ type CM_COMB_C33; \ -+ type CM_COMB_C34 -+ -+struct dcn_transform_shift { -+ TF_REG_FIELD_LIST(uint8_t); -+}; -+ -+struct dcn_transform_mask { -+ TF_REG_FIELD_LIST(uint32_t); -+}; -+ -+struct dcn_transform_registers { -+ uint32_t DSCL_EXT_OVERSCAN_LEFT_RIGHT; -+ uint32_t DSCL_EXT_OVERSCAN_TOP_BOTTOM; -+ uint32_t OTG_H_BLANK; -+ uint32_t OTG_V_BLANK; -+ uint32_t SCL_MODE; -+ uint32_t LB_DATA_FORMAT; -+ uint32_t LB_MEMORY_CTRL; -+ uint32_t DSCL_AUTOCAL; -+ uint32_t SCL_BLACK_OFFSET; -+ uint32_t DSCL_CONTROL; -+ uint32_t SCL_TAP_CONTROL; -+ uint32_t SCL_COEF_RAM_TAP_SELECT; -+ uint32_t SCL_COEF_RAM_TAP_DATA; -+ uint32_t DSCL_2TAP_CONTROL; -+ uint32_t DCSURF_PRI_VIEWPORT_DIMENSION; -+ uint32_t DCSURF_PRI_VIEWPORT_START; -+ uint32_t DCSURF_SEC_VIEWPORT_DIMENSION; -+ uint32_t DCSURF_SEC_VIEWPORT_START; -+ uint32_t DCSURF_PRI_VIEWPORT_DIMENSION_C; -+ uint32_t DCSURF_PRI_VIEWPORT_START_C; -+ uint32_t MPC_SIZE; -+ uint32_t SCL_HORZ_FILTER_SCALE_RATIO; -+ uint32_t SCL_VERT_FILTER_SCALE_RATIO; -+ uint32_t SCL_HORZ_FILTER_SCALE_RATIO_C; -+ uint32_t SCL_VERT_FILTER_SCALE_RATIO_C; -+ uint32_t SCL_HORZ_FILTER_INIT; -+ uint32_t SCL_HORZ_FILTER_INIT_C; -+ uint32_t SCL_VERT_FILTER_INIT; -+ uint32_t SCL_VERT_FILTER_INIT_BOT; -+ uint32_t SCL_VERT_FILTER_INIT_C; -+ uint32_t SCL_VERT_FILTER_INIT_BOT_C; -+ uint32_t RECOUT_START; -+ uint32_t RECOUT_SIZE; -+ uint32_t CM_GAMUT_REMAP_CONTROL; -+ uint32_t CM_GAMUT_REMAP_C11_C12; -+ uint32_t CM_GAMUT_REMAP_C13_C14; -+ uint32_t CM_GAMUT_REMAP_C21_C22; -+ uint32_t CM_GAMUT_REMAP_C23_C24; -+ uint32_t CM_GAMUT_REMAP_C31_C32; -+ uint32_t CM_GAMUT_REMAP_C33_C34; -+ uint32_t CM_COMA_C11_C12; -+ uint32_t CM_COMA_C13_C14; -+ uint32_t CM_COMA_C21_C22; -+ uint32_t CM_COMA_C23_C24; -+ uint32_t CM_COMA_C31_C32; -+ uint32_t CM_COMA_C33_C34; -+ uint32_t CM_COMB_C11_C12; -+ uint32_t CM_COMB_C13_C14; -+ uint32_t CM_COMB_C21_C22; -+ uint32_t CM_COMB_C23_C24; -+ uint32_t CM_COMB_C31_C32; -+ uint32_t CM_COMB_C33_C34; -+}; -+ -+struct dcn10_transform { -+ struct transform base; -+ -+ const struct dcn_transform_registers *tf_regs; -+ const struct dcn_transform_shift *tf_shift; -+ const struct dcn_transform_mask *tf_mask; -+ -+ const uint16_t *filter_v; -+ const uint16_t *filter_h; -+ const uint16_t *filter_v_c; -+ const uint16_t *filter_h_c; -+ int lb_pixel_depth_supported; -+ int lb_memory_size; -+ int lb_bits_per_entry; -+}; -+ -+bool dcn10_transform_construct(struct dcn10_transform *xfm110, -+ struct dc_context *ctx, -+ const struct dcn_transform_registers *tf_regs, -+ const struct dcn_transform_shift *tf_shift, -+ const struct dcn_transform_mask *tf_mask); -+#endif --- -2.7.4 - |