aboutsummaryrefslogtreecommitdiffstats
path: root/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/2648-drm-amd-display-create-new-files-for-hubbub-function.patch
diff options
context:
space:
mode:
Diffstat (limited to 'meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/2648-drm-amd-display-create-new-files-for-hubbub-function.patch')
-rw-r--r--meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/2648-drm-amd-display-create-new-files-for-hubbub-function.patch1170
1 files changed, 1170 insertions, 0 deletions
diff --git a/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/2648-drm-amd-display-create-new-files-for-hubbub-function.patch b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/2648-drm-amd-display-create-new-files-for-hubbub-function.patch
new file mode 100644
index 00000000..af915bbb
--- /dev/null
+++ b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/2648-drm-amd-display-create-new-files-for-hubbub-function.patch
@@ -0,0 +1,1170 @@
+From cfc7f8a2184849a4496c139e8bccfee4d6e3f21e Mon Sep 17 00:00:00 2001
+From: Yue Hin Lau <Yuehin.Lau@amd.com>
+Date: Wed, 18 Oct 2017 11:59:42 -0400
+Subject: [PATCH 2648/4131] drm/amd/display: create new files for hubbub
+ functions
+
+moving hubbub functions to new file
+
+Signed-off-by: Yue Hin Lau <Yuehin.Lau@amd.com>
+Reviewed-by: Tony Cheng <Tony.Cheng@amd.com>
+Acked-by: Harry Wentland <harry.wentland@amd.com>
+Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
+---
+ drivers/gpu/drm/amd/display/dc/dcn10/Makefile | 3 +-
+ .../gpu/drm/amd/display/dc/dcn10/dcn10_hubbub.c | 494 +++++++++++++++++++++
+ .../gpu/drm/amd/display/dc/dcn10/dcn10_hubbub.h | 67 +++
+ .../drm/amd/display/dc/dcn10/dcn10_hw_sequencer.c | 490 +-------------------
+ .../drm/amd/display/dc/dcn10/dcn10_hw_sequencer.h | 1 +
+ 5 files changed, 579 insertions(+), 476 deletions(-)
+ create mode 100644 drivers/gpu/drm/amd/display/dc/dcn10/dcn10_hubbub.c
+ create mode 100644 drivers/gpu/drm/amd/display/dc/dcn10/dcn10_hubbub.h
+
+diff --git a/drivers/gpu/drm/amd/display/dc/dcn10/Makefile b/drivers/gpu/drm/amd/display/dc/dcn10/Makefile
+index ebeb882..a6ca1f9 100644
+--- a/drivers/gpu/drm/amd/display/dc/dcn10/Makefile
++++ b/drivers/gpu/drm/amd/display/dc/dcn10/Makefile
+@@ -4,7 +4,8 @@
+ DCN10 = dcn10_resource.o dcn10_ipp.o dcn10_hw_sequencer.o \
+ dcn10_dpp.o dcn10_opp.o dcn10_timing_generator.o \
+ dcn10_hubp.o dcn10_mpc.o \
+- dcn10_dpp_dscl.o dcn10_dpp_cm.o dcn10_cm_common.o
++ dcn10_dpp_dscl.o dcn10_dpp_cm.o dcn10_cm_common.o \
++ dcn10_hubbub.o
+
+ AMD_DAL_DCN10 = $(addprefix $(AMDDALPATH)/dc/dcn10/,$(DCN10))
+
+diff --git a/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_hubbub.c b/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_hubbub.c
+new file mode 100644
+index 0000000..e6670f6
+--- /dev/null
++++ b/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_hubbub.c
+@@ -0,0 +1,494 @@
++/*
++ * 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 "dcn10_hubp.h"
++#include "dcn10_hubbub.h"
++#include "dcn10_hw_sequencer.h"
++#include "dce110/dce110_hw_sequencer.h"
++#include "dce/dce_hwseq.h"
++#include "reg_helper.h"
++
++#define CTX \
++ hws->ctx
++#define REG(reg)\
++ hws->regs->reg
++
++#undef FN
++#define FN(reg_name, field_name) \
++ hws->shifts->field_name, hws->masks->field_name
++
++void dcn10_hubbub_wm_read_state(struct dce_hwseq *hws,
++ struct dcn_hubbub_wm *wm)
++{
++ struct dcn_hubbub_wm_set *s;
++
++ s = &wm->sets[0];
++ s->wm_set = 0;
++ s->data_urgent = REG_READ(DCHUBBUB_ARB_DATA_URGENCY_WATERMARK_A);
++ s->pte_meta_urgent = REG_READ(DCHUBBUB_ARB_PTE_META_URGENCY_WATERMARK_A);
++ s->sr_enter = REG_READ(DCHUBBUB_ARB_ALLOW_SR_ENTER_WATERMARK_A);
++ s->sr_exit = REG_READ(DCHUBBUB_ARB_ALLOW_SR_EXIT_WATERMARK_A);
++ s->dram_clk_chanage = REG_READ(DCHUBBUB_ARB_ALLOW_DRAM_CLK_CHANGE_WATERMARK_A);
++
++ s = &wm->sets[1];
++ s->wm_set = 1;
++ s->data_urgent = REG_READ(DCHUBBUB_ARB_DATA_URGENCY_WATERMARK_B);
++ s->pte_meta_urgent = REG_READ(DCHUBBUB_ARB_PTE_META_URGENCY_WATERMARK_B);
++ s->sr_enter = REG_READ(DCHUBBUB_ARB_ALLOW_SR_ENTER_WATERMARK_B);
++ s->sr_exit = REG_READ(DCHUBBUB_ARB_ALLOW_SR_EXIT_WATERMARK_B);
++ s->dram_clk_chanage = REG_READ(DCHUBBUB_ARB_ALLOW_DRAM_CLK_CHANGE_WATERMARK_B);
++
++ s = &wm->sets[2];
++ s->wm_set = 2;
++ s->data_urgent = REG_READ(DCHUBBUB_ARB_DATA_URGENCY_WATERMARK_C);
++ s->pte_meta_urgent = REG_READ(DCHUBBUB_ARB_PTE_META_URGENCY_WATERMARK_C);
++ s->sr_enter = REG_READ(DCHUBBUB_ARB_ALLOW_SR_ENTER_WATERMARK_C);
++ s->sr_exit = REG_READ(DCHUBBUB_ARB_ALLOW_SR_EXIT_WATERMARK_C);
++ s->dram_clk_chanage = REG_READ(DCHUBBUB_ARB_ALLOW_DRAM_CLK_CHANGE_WATERMARK_C);
++
++ s = &wm->sets[3];
++ s->wm_set = 3;
++ s->data_urgent = REG_READ(DCHUBBUB_ARB_DATA_URGENCY_WATERMARK_D);
++ s->pte_meta_urgent = REG_READ(DCHUBBUB_ARB_PTE_META_URGENCY_WATERMARK_D);
++ s->sr_enter = REG_READ(DCHUBBUB_ARB_ALLOW_SR_ENTER_WATERMARK_D);
++ s->sr_exit = REG_READ(DCHUBBUB_ARB_ALLOW_SR_EXIT_WATERMARK_D);
++ s->dram_clk_chanage = REG_READ(DCHUBBUB_ARB_ALLOW_DRAM_CLK_CHANGE_WATERMARK_D);
++}
++
++void verify_allow_pstate_change_high(
++ struct dce_hwseq *hws)
++{
++ /* pstate latency is ~20us so if we wait over 40us and pstate allow
++ * still not asserted, we are probably stuck and going to hang
++ *
++ * TODO: Figure out why it takes ~100us on linux
++ * pstate takes around ~100us on linux. Unknown currently as to
++ * why it takes that long on linux
++ */
++ static unsigned int pstate_wait_timeout_us = 200;
++ static unsigned int pstate_wait_expected_timeout_us = 40;
++ static unsigned int max_sampled_pstate_wait_us; /* data collection */
++ static bool forced_pstate_allow; /* help with revert wa */
++ static bool should_log_hw_state; /* prevent hw state log by default */
++
++ unsigned int debug_index = 0x7;
++ unsigned int debug_data;
++ unsigned int i;
++
++ if (forced_pstate_allow) {
++ /* we hacked to force pstate allow to prevent hang last time
++ * we verify_allow_pstate_change_high. so disable force
++ * here so we can check status
++ */
++ REG_UPDATE_2(DCHUBBUB_ARB_DRAM_STATE_CNTL,
++ DCHUBBUB_ARB_ALLOW_PSTATE_CHANGE_FORCE_VALUE, 0,
++ DCHUBBUB_ARB_ALLOW_PSTATE_CHANGE_FORCE_ENABLE, 0);
++ forced_pstate_allow = false;
++ }
++
++ /* description "3-0: Pipe0 cursor0 QOS
++ * 7-4: Pipe1 cursor0 QOS
++ * 11-8: Pipe2 cursor0 QOS
++ * 15-12: Pipe3 cursor0 QOS
++ * 16: Pipe0 Plane0 Allow Pstate Change
++ * 17: Pipe1 Plane0 Allow Pstate Change
++ * 18: Pipe2 Plane0 Allow Pstate Change
++ * 19: Pipe3 Plane0 Allow Pstate Change
++ * 20: Pipe0 Plane1 Allow Pstate Change
++ * 21: Pipe1 Plane1 Allow Pstate Change
++ * 22: Pipe2 Plane1 Allow Pstate Change
++ * 23: Pipe3 Plane1 Allow Pstate Change
++ * 24: Pipe0 cursor0 Allow Pstate Change
++ * 25: Pipe1 cursor0 Allow Pstate Change
++ * 26: Pipe2 cursor0 Allow Pstate Change
++ * 27: Pipe3 cursor0 Allow Pstate Change
++ * 28: WB0 Allow Pstate Change
++ * 29: WB1 Allow Pstate Change
++ * 30: Arbiter's allow_pstate_change
++ * 31: SOC pstate change request
++ */
++
++ REG_WRITE(DCHUBBUB_TEST_DEBUG_INDEX, debug_index);
++
++ for (i = 0; i < pstate_wait_timeout_us; i++) {
++ debug_data = REG_READ(DCHUBBUB_TEST_DEBUG_DATA);
++
++ if (debug_data & (1 << 30)) {
++
++ if (i > pstate_wait_expected_timeout_us)
++ dm_logger_write(hws->ctx->logger, LOG_WARNING,
++ "pstate took longer than expected ~%dus\n",
++ i);
++
++ return;
++ }
++ if (max_sampled_pstate_wait_us < i)
++ max_sampled_pstate_wait_us = i;
++
++ udelay(1);
++ }
++
++ /* force pstate allow to prevent system hang
++ * and break to debugger to investigate
++ */
++ REG_UPDATE_2(DCHUBBUB_ARB_DRAM_STATE_CNTL,
++ DCHUBBUB_ARB_ALLOW_PSTATE_CHANGE_FORCE_VALUE, 1,
++ DCHUBBUB_ARB_ALLOW_PSTATE_CHANGE_FORCE_ENABLE, 1);
++ forced_pstate_allow = true;
++
++ if (should_log_hw_state) {
++ dcn10_log_hw_state(hws->ctx->dc);
++ }
++
++ dm_logger_write(hws->ctx->logger, LOG_WARNING,
++ "pstate TEST_DEBUG_DATA: 0x%X\n",
++ debug_data);
++ BREAK_TO_DEBUGGER();
++}
++
++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;
++}
++
++
++void program_watermarks(
++ struct dce_hwseq *hws,
++ struct dcn_watermark_set *watermarks,
++ unsigned int refclk_mhz)
++{
++ uint32_t force_en = hws->ctx->dc->debug.disable_stutter ? 1 : 0;
++ /*
++ * 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;
++
++ REG_UPDATE(DCHUBBUB_ARB_WATERMARK_CHANGE_CNTL,
++ DCHUBBUB_ARB_WATERMARK_CHANGE_REQUEST, 0);
++
++ /* 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(hws->ctx->logger, LOG_BANDWIDTH_CALCS,
++ "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(hws->ctx->logger, LOG_BANDWIDTH_CALCS,
++ "PTE_META_URGENCY_WATERMARK_A calculated =%d\n"
++ "HW register value = 0x%x\n",
++ watermarks->a.pte_meta_urgent_ns, prog_wm_value);
++
++ if (REG(DCHUBBUB_ARB_ALLOW_SR_ENTER_WATERMARK_A)) {
++ 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(hws->ctx->logger, LOG_BANDWIDTH_CALCS,
++ "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(hws->ctx->logger, LOG_BANDWIDTH_CALCS,
++ "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(hws->ctx->logger, LOG_BANDWIDTH_CALCS,
++ "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(hws->ctx->logger, LOG_BANDWIDTH_CALCS,
++ "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(hws->ctx->logger, LOG_BANDWIDTH_CALCS,
++ "PTE_META_URGENCY_WATERMARK_B calculated =%d\n"
++ "HW register value = 0x%x\n",
++ watermarks->b.pte_meta_urgent_ns, prog_wm_value);
++
++
++ if (REG(DCHUBBUB_ARB_ALLOW_SR_ENTER_WATERMARK_B)) {
++ 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(hws->ctx->logger, LOG_BANDWIDTH_CALCS,
++ "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(hws->ctx->logger, LOG_BANDWIDTH_CALCS,
++ "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(hws->ctx->logger, LOG_BANDWIDTH_CALCS,
++ "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(hws->ctx->logger, LOG_BANDWIDTH_CALCS,
++ "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(hws->ctx->logger, LOG_BANDWIDTH_CALCS,
++ "PTE_META_URGENCY_WATERMARK_C calculated =%d\n"
++ "HW register value = 0x%x\n",
++ watermarks->c.pte_meta_urgent_ns, prog_wm_value);
++
++
++ if (REG(DCHUBBUB_ARB_ALLOW_SR_ENTER_WATERMARK_C)) {
++ 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(hws->ctx->logger, LOG_BANDWIDTH_CALCS,
++ "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(hws->ctx->logger, LOG_BANDWIDTH_CALCS,
++ "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(hws->ctx->logger, LOG_BANDWIDTH_CALCS,
++ "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(hws->ctx->logger, LOG_BANDWIDTH_CALCS,
++ "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(hws->ctx->logger, LOG_BANDWIDTH_CALCS,
++ "PTE_META_URGENCY_WATERMARK_D calculated =%d\n"
++ "HW register value = 0x%x\n",
++ watermarks->d.pte_meta_urgent_ns, prog_wm_value);
++
++
++ if (REG(DCHUBBUB_ARB_ALLOW_SR_ENTER_WATERMARK_D)) {
++ 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(hws->ctx->logger, LOG_BANDWIDTH_CALCS,
++ "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(hws->ctx->logger, LOG_BANDWIDTH_CALCS,
++ "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(hws->ctx->logger, LOG_BANDWIDTH_CALCS,
++ "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_SAT_LEVEL,
++ DCHUBBUB_ARB_SAT_LEVEL, 60 * refclk_mhz);
++ REG_UPDATE(DCHUBBUB_ARB_DF_REQ_OUTSTAND,
++ DCHUBBUB_ARB_MIN_REQ_OUTSTAND, 68);
++
++ REG_UPDATE_2(DCHUBBUB_ARB_DRAM_STATE_CNTL,
++ DCHUBBUB_ARB_ALLOW_SELF_REFRESH_FORCE_VALUE, 0,
++ DCHUBBUB_ARB_ALLOW_SELF_REFRESH_FORCE_ENABLE, force_en);
++
++#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
++}
++
++void dcn10_update_dchub(
++ struct dce_hwseq *hws,
++ struct dchub_init_data *dh_data)
++{
++ /* 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;
++}
++
++void toggle_watermark_change_req(struct dce_hwseq *hws)
++{
++ uint32_t watermark_change_req;
++
++ REG_GET(DCHUBBUB_ARB_WATERMARK_CHANGE_CNTL,
++ DCHUBBUB_ARB_WATERMARK_CHANGE_REQUEST, &watermark_change_req);
++
++ if (watermark_change_req)
++ watermark_change_req = 0;
++ else
++ watermark_change_req = 1;
++
++ REG_UPDATE(DCHUBBUB_ARB_WATERMARK_CHANGE_CNTL,
++ DCHUBBUB_ARB_WATERMARK_CHANGE_REQUEST, watermark_change_req);
++}
++
++
+diff --git a/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_hubbub.h b/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_hubbub.h
+new file mode 100644
+index 0000000..fe3f787
+--- /dev/null
++++ b/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_hubbub.h
+@@ -0,0 +1,67 @@
++/*
++ * 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_HUBBUB_DCN10_H__
++#define __DC_HUBBUB_DCN10_H__
++
++#include "core_types.h"
++
++struct dc;
++
++struct dcn_hubbub_wm_set {
++ uint32_t wm_set;
++ uint32_t data_urgent;
++ uint32_t pte_meta_urgent;
++ uint32_t sr_enter;
++ uint32_t sr_exit;
++ uint32_t dram_clk_chanage;
++};
++
++struct dcn_hubbub_wm {
++ struct dcn_hubbub_wm_set sets[4];
++};
++
++void dcn10_update_dchub(
++ struct dce_hwseq *hws,
++ struct dchub_init_data *dh_data);
++
++void dcn10_log_hw_state(
++ struct dc *dc);
++
++void verify_allow_pstate_change_high(
++ struct dce_hwseq *hws);
++
++void program_watermarks(
++ struct dce_hwseq *hws,
++ struct dcn_watermark_set *watermarks,
++ unsigned int refclk_mhz);
++
++void toggle_watermark_change_req(
++ struct dce_hwseq *hws);
++
++void dcn10_hubbub_wm_read_state(struct dce_hwseq *hws,
++ struct dcn_hubbub_wm *wm);
++
++#endif
+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
+index 63bed92..4cc2df6 100644
+--- a/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_hw_sequencer.c
++++ b/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_hw_sequencer.c
+@@ -42,6 +42,7 @@
+ #include "reg_helper.h"
+ #include "custom_float.h"
+ #include "dcn10_hubp.h"
++#include "dcn10_hubbub.h"
+
+ #define CTX \
+ hws->ctx
+@@ -52,18 +53,8 @@
+ #define FN(reg_name, field_name) \
+ hws->shifts->field_name, hws->masks->field_name
+
+-static void log_mpc_crc(struct dc *dc)
+-{
+- struct dc_context *dc_ctx = dc->ctx;
+- struct dce_hwseq *hws = dc->hwseq;
+-
+- if (REG(MPC_CRC_RESULT_GB))
+- DTN_INFO("MPC_CRC_RESULT_GB:%d MPC_CRC_RESULT_C:%d MPC_CRC_RESULT_AR:%d\n",
+- REG_READ(MPC_CRC_RESULT_GB), REG_READ(MPC_CRC_RESULT_C), REG_READ(MPC_CRC_RESULT_AR));
+- if (REG(DPP_TOP0_DPP_CRC_VAL_B_A))
+- DTN_INFO("DPP_TOP0_DPP_CRC_VAL_B_A:%d DPP_TOP0_DPP_CRC_VAL_R_G:%d\n",
+- REG_READ(DPP_TOP0_DPP_CRC_VAL_B_A), REG_READ(DPP_TOP0_DPP_CRC_VAL_R_G));
+-}
++#define DTN_INFO_MICRO_SEC(ref_cycle) \
++ print_microsec(dc_ctx, ref_cycle)
+
+ void print_microsec(struct dc_context *dc_ctx, uint32_t ref_cycle)
+ {
+@@ -76,61 +67,21 @@ void print_microsec(struct dc_context *dc_ctx, uint32_t ref_cycle)
+ us_x10 % frac);
+ }
+
+-#define DTN_INFO_MICRO_SEC(ref_cycle) \
+- print_microsec(dc_ctx, ref_cycle)
+-
+-struct dcn_hubbub_wm_set {
+- uint32_t wm_set;
+- uint32_t data_urgent;
+- uint32_t pte_meta_urgent;
+- uint32_t sr_enter;
+- uint32_t sr_exit;
+- uint32_t dram_clk_chanage;
+-};
+
+-struct dcn_hubbub_wm {
+- struct dcn_hubbub_wm_set sets[4];
+-};
+-
+-static void dcn10_hubbub_wm_read_state(struct dce_hwseq *hws,
+- struct dcn_hubbub_wm *wm)
++static void log_mpc_crc(struct dc *dc)
+ {
+- struct dcn_hubbub_wm_set *s;
+-
+- s = &wm->sets[0];
+- s->wm_set = 0;
+- s->data_urgent = REG_READ(DCHUBBUB_ARB_DATA_URGENCY_WATERMARK_A);
+- s->pte_meta_urgent = REG_READ(DCHUBBUB_ARB_PTE_META_URGENCY_WATERMARK_A);
+- s->sr_enter = REG_READ(DCHUBBUB_ARB_ALLOW_SR_ENTER_WATERMARK_A);
+- s->sr_exit = REG_READ(DCHUBBUB_ARB_ALLOW_SR_EXIT_WATERMARK_A);
+- s->dram_clk_chanage = REG_READ(DCHUBBUB_ARB_ALLOW_DRAM_CLK_CHANGE_WATERMARK_A);
+-
+- s = &wm->sets[1];
+- s->wm_set = 1;
+- s->data_urgent = REG_READ(DCHUBBUB_ARB_DATA_URGENCY_WATERMARK_B);
+- s->pte_meta_urgent = REG_READ(DCHUBBUB_ARB_PTE_META_URGENCY_WATERMARK_B);
+- s->sr_enter = REG_READ(DCHUBBUB_ARB_ALLOW_SR_ENTER_WATERMARK_B);
+- s->sr_exit = REG_READ(DCHUBBUB_ARB_ALLOW_SR_EXIT_WATERMARK_B);
+- s->dram_clk_chanage = REG_READ(DCHUBBUB_ARB_ALLOW_DRAM_CLK_CHANGE_WATERMARK_B);
+-
+- s = &wm->sets[2];
+- s->wm_set = 2;
+- s->data_urgent = REG_READ(DCHUBBUB_ARB_DATA_URGENCY_WATERMARK_C);
+- s->pte_meta_urgent = REG_READ(DCHUBBUB_ARB_PTE_META_URGENCY_WATERMARK_C);
+- s->sr_enter = REG_READ(DCHUBBUB_ARB_ALLOW_SR_ENTER_WATERMARK_C);
+- s->sr_exit = REG_READ(DCHUBBUB_ARB_ALLOW_SR_EXIT_WATERMARK_C);
+- s->dram_clk_chanage = REG_READ(DCHUBBUB_ARB_ALLOW_DRAM_CLK_CHANGE_WATERMARK_C);
+-
+- s = &wm->sets[3];
+- s->wm_set = 3;
+- s->data_urgent = REG_READ(DCHUBBUB_ARB_DATA_URGENCY_WATERMARK_D);
+- s->pte_meta_urgent = REG_READ(DCHUBBUB_ARB_PTE_META_URGENCY_WATERMARK_D);
+- s->sr_enter = REG_READ(DCHUBBUB_ARB_ALLOW_SR_ENTER_WATERMARK_D);
+- s->sr_exit = REG_READ(DCHUBBUB_ARB_ALLOW_SR_EXIT_WATERMARK_D);
+- s->dram_clk_chanage = REG_READ(DCHUBBUB_ARB_ALLOW_DRAM_CLK_CHANGE_WATERMARK_D);
++ struct dc_context *dc_ctx = dc->ctx;
++ struct dce_hwseq *hws = dc->hwseq;
++
++ if (REG(MPC_CRC_RESULT_GB))
++ DTN_INFO("MPC_CRC_RESULT_GB:%d MPC_CRC_RESULT_C:%d MPC_CRC_RESULT_AR:%d\n",
++ REG_READ(MPC_CRC_RESULT_GB), REG_READ(MPC_CRC_RESULT_C), REG_READ(MPC_CRC_RESULT_AR));
++ if (REG(DPP_TOP0_DPP_CRC_VAL_B_A))
++ DTN_INFO("DPP_TOP0_DPP_CRC_VAL_B_A:%d DPP_TOP0_DPP_CRC_VAL_R_G:%d\n",
++ REG_READ(DPP_TOP0_DPP_CRC_VAL_B_A), REG_READ(DPP_TOP0_DPP_CRC_VAL_R_G));
+ }
+
+-static void dcn10_log_hubbub_state(struct dc *dc)
++void dcn10_log_hubbub_state(struct dc *dc)
+ {
+ struct dc_context *dc_ctx = dc->ctx;
+ struct dcn_hubbub_wm wm;
+@@ -157,7 +108,7 @@ static void dcn10_log_hubbub_state(struct dc *dc)
+ DTN_INFO("\n");
+ }
+
+-static void dcn10_log_hw_state(struct dc *dc)
++void dcn10_log_hw_state(struct dc *dc)
+ {
+ struct dc_context *dc_ctx = dc->ctx;
+ struct resource_pool *pool = dc->res_pool;
+@@ -241,97 +192,6 @@ static void dcn10_log_hw_state(struct dc *dc)
+ DTN_INFO_END();
+ }
+
+-static void verify_allow_pstate_change_high(
+- struct dce_hwseq *hws)
+-{
+- /* pstate latency is ~20us so if we wait over 40us and pstate allow
+- * still not asserted, we are probably stuck and going to hang
+- *
+- * TODO: Figure out why it takes ~100us on linux
+- * pstate takes around ~100us on linux. Unknown currently as to
+- * why it takes that long on linux
+- */
+- static unsigned int pstate_wait_timeout_us = 200;
+- static unsigned int pstate_wait_expected_timeout_us = 40;
+- static unsigned int max_sampled_pstate_wait_us; /* data collection */
+- static bool forced_pstate_allow; /* help with revert wa */
+- static bool should_log_hw_state; /* prevent hw state log by default */
+-
+- unsigned int debug_index = 0x7;
+- unsigned int debug_data;
+- unsigned int i;
+-
+- if (forced_pstate_allow) {
+- /* we hacked to force pstate allow to prevent hang last time
+- * we verify_allow_pstate_change_high. so disable force
+- * here so we can check status
+- */
+- REG_UPDATE_2(DCHUBBUB_ARB_DRAM_STATE_CNTL,
+- DCHUBBUB_ARB_ALLOW_PSTATE_CHANGE_FORCE_VALUE, 0,
+- DCHUBBUB_ARB_ALLOW_PSTATE_CHANGE_FORCE_ENABLE, 0);
+- forced_pstate_allow = false;
+- }
+-
+- /* description "3-0: Pipe0 cursor0 QOS
+- * 7-4: Pipe1 cursor0 QOS
+- * 11-8: Pipe2 cursor0 QOS
+- * 15-12: Pipe3 cursor0 QOS
+- * 16: Pipe0 Plane0 Allow Pstate Change
+- * 17: Pipe1 Plane0 Allow Pstate Change
+- * 18: Pipe2 Plane0 Allow Pstate Change
+- * 19: Pipe3 Plane0 Allow Pstate Change
+- * 20: Pipe0 Plane1 Allow Pstate Change
+- * 21: Pipe1 Plane1 Allow Pstate Change
+- * 22: Pipe2 Plane1 Allow Pstate Change
+- * 23: Pipe3 Plane1 Allow Pstate Change
+- * 24: Pipe0 cursor0 Allow Pstate Change
+- * 25: Pipe1 cursor0 Allow Pstate Change
+- * 26: Pipe2 cursor0 Allow Pstate Change
+- * 27: Pipe3 cursor0 Allow Pstate Change
+- * 28: WB0 Allow Pstate Change
+- * 29: WB1 Allow Pstate Change
+- * 30: Arbiter's allow_pstate_change
+- * 31: SOC pstate change request
+- */
+-
+- REG_WRITE(DCHUBBUB_TEST_DEBUG_INDEX, debug_index);
+-
+- for (i = 0; i < pstate_wait_timeout_us; i++) {
+- debug_data = REG_READ(DCHUBBUB_TEST_DEBUG_DATA);
+-
+- if (debug_data & (1 << 30)) {
+-
+- if (i > pstate_wait_expected_timeout_us)
+- dm_logger_write(hws->ctx->logger, LOG_WARNING,
+- "pstate took longer than expected ~%dus\n",
+- i);
+-
+- return;
+- }
+- if (max_sampled_pstate_wait_us < i)
+- max_sampled_pstate_wait_us = i;
+-
+- udelay(1);
+- }
+-
+- /* force pstate allow to prevent system hang
+- * and break to debugger to investigate
+- */
+- REG_UPDATE_2(DCHUBBUB_ARB_DRAM_STATE_CNTL,
+- DCHUBBUB_ARB_ALLOW_PSTATE_CHANGE_FORCE_VALUE, 1,
+- DCHUBBUB_ARB_ALLOW_PSTATE_CHANGE_FORCE_ENABLE, 1);
+- forced_pstate_allow = true;
+-
+- if (should_log_hw_state) {
+- dcn10_log_hw_state(hws->ctx->dc);
+- }
+-
+- dm_logger_write(hws->ctx->logger, LOG_WARNING,
+- "pstate TEST_DEBUG_DATA: 0x%X\n",
+- debug_data);
+- BREAK_TO_DEBUGGER();
+-}
+-
+ static void enable_dppclk(
+ struct dce_hwseq *hws,
+ uint8_t plane_id,
+@@ -433,312 +293,6 @@ static void dpp_pg_control(
+ }
+ }
+
+-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 dce_hwseq *hws,
+- struct dcn_watermark_set *watermarks,
+- unsigned int refclk_mhz)
+-{
+- uint32_t force_en = hws->ctx->dc->debug.disable_stutter ? 1 : 0;
+- /*
+- * 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;
+-
+- REG_UPDATE(DCHUBBUB_ARB_WATERMARK_CHANGE_CNTL,
+- DCHUBBUB_ARB_WATERMARK_CHANGE_REQUEST, 0);
+-
+- /* 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(hws->ctx->logger, LOG_BANDWIDTH_CALCS,
+- "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(hws->ctx->logger, LOG_BANDWIDTH_CALCS,
+- "PTE_META_URGENCY_WATERMARK_A calculated =%d\n"
+- "HW register value = 0x%x\n",
+- watermarks->a.pte_meta_urgent_ns, prog_wm_value);
+-
+- if (REG(DCHUBBUB_ARB_ALLOW_SR_ENTER_WATERMARK_A)) {
+- 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(hws->ctx->logger, LOG_BANDWIDTH_CALCS,
+- "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(hws->ctx->logger, LOG_BANDWIDTH_CALCS,
+- "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(hws->ctx->logger, LOG_BANDWIDTH_CALCS,
+- "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(hws->ctx->logger, LOG_BANDWIDTH_CALCS,
+- "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(hws->ctx->logger, LOG_BANDWIDTH_CALCS,
+- "PTE_META_URGENCY_WATERMARK_B calculated =%d\n"
+- "HW register value = 0x%x\n",
+- watermarks->b.pte_meta_urgent_ns, prog_wm_value);
+-
+-
+- if (REG(DCHUBBUB_ARB_ALLOW_SR_ENTER_WATERMARK_B)) {
+- 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(hws->ctx->logger, LOG_BANDWIDTH_CALCS,
+- "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(hws->ctx->logger, LOG_BANDWIDTH_CALCS,
+- "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(hws->ctx->logger, LOG_BANDWIDTH_CALCS,
+- "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(hws->ctx->logger, LOG_BANDWIDTH_CALCS,
+- "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(hws->ctx->logger, LOG_BANDWIDTH_CALCS,
+- "PTE_META_URGENCY_WATERMARK_C calculated =%d\n"
+- "HW register value = 0x%x\n",
+- watermarks->c.pte_meta_urgent_ns, prog_wm_value);
+-
+-
+- if (REG(DCHUBBUB_ARB_ALLOW_SR_ENTER_WATERMARK_C)) {
+- 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(hws->ctx->logger, LOG_BANDWIDTH_CALCS,
+- "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(hws->ctx->logger, LOG_BANDWIDTH_CALCS,
+- "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(hws->ctx->logger, LOG_BANDWIDTH_CALCS,
+- "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(hws->ctx->logger, LOG_BANDWIDTH_CALCS,
+- "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(hws->ctx->logger, LOG_BANDWIDTH_CALCS,
+- "PTE_META_URGENCY_WATERMARK_D calculated =%d\n"
+- "HW register value = 0x%x\n",
+- watermarks->d.pte_meta_urgent_ns, prog_wm_value);
+-
+-
+- if (REG(DCHUBBUB_ARB_ALLOW_SR_ENTER_WATERMARK_D)) {
+- 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(hws->ctx->logger, LOG_BANDWIDTH_CALCS,
+- "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(hws->ctx->logger, LOG_BANDWIDTH_CALCS,
+- "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(hws->ctx->logger, LOG_BANDWIDTH_CALCS,
+- "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_SAT_LEVEL,
+- DCHUBBUB_ARB_SAT_LEVEL, 60 * refclk_mhz);
+- REG_UPDATE(DCHUBBUB_ARB_DF_REQ_OUTSTAND,
+- DCHUBBUB_ARB_MIN_REQ_OUTSTAND, 68);
+-
+- REG_UPDATE_2(DCHUBBUB_ARB_DRAM_STATE_CNTL,
+- DCHUBBUB_ARB_ALLOW_SELF_REFRESH_FORCE_VALUE, 0,
+- DCHUBBUB_ARB_ALLOW_SELF_REFRESH_FORCE_ENABLE, force_en);
+-
+-#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 dcn10_update_dchub(
+- struct dce_hwseq *hws,
+- struct dchub_init_data *dh_data)
+-{
+- /* 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;
+-}
+-
+ static void hubp_pg_control(
+ struct dce_hwseq *hws,
+ unsigned int hubp_inst,
+@@ -1337,21 +891,7 @@ static bool patch_address_for_sbs_tb_stereo(
+ return false;
+ }
+
+-static void toggle_watermark_change_req(struct dce_hwseq *hws)
+-{
+- uint32_t watermark_change_req;
+-
+- REG_GET(DCHUBBUB_ARB_WATERMARK_CHANGE_CNTL,
+- DCHUBBUB_ARB_WATERMARK_CHANGE_REQUEST, &watermark_change_req);
+
+- if (watermark_change_req)
+- watermark_change_req = 0;
+- else
+- watermark_change_req = 1;
+-
+- REG_UPDATE(DCHUBBUB_ARB_WATERMARK_CHANGE_CNTL,
+- DCHUBBUB_ARB_WATERMARK_CHANGE_REQUEST, watermark_change_req);
+-}
+
+ static void dcn10_update_plane_addr(const struct dc *dc, struct pipe_ctx *pipe_ctx)
+ {
+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
+index ca53dc1..b9d3260 100644
+--- a/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_hw_sequencer.h
++++ b/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_hw_sequencer.h
+@@ -35,4 +35,5 @@ extern void fill_display_configs(
+ const struct dc_state *context,
+ struct dm_pp_display_configuration *pp_display_cfg);
+
++
+ #endif /* __DC_HWSS_DCN10_H__ */
+--
+2.7.4
+