drm/amd/display: Combine field toggle macro and sequence write macro.
[linux-2.6-microblaze.git] / drivers / gpu / drm / amd / display / dc / dcn10 / dcn10_hubbub.c
index c7d1e67..295cbd5 100644 (file)
 #include "reg_helper.h"
 
 #define CTX \
-       hubbub->ctx
+       hubbub1->base.ctx
 #define DC_LOGGER \
-       hubbub->ctx->logger
+       hubbub1->base.ctx->logger
 #define REG(reg)\
-       hubbub->regs->reg
+       hubbub1->regs->reg
 
 #undef FN
 #define FN(reg_name, field_name) \
-       hubbub->shifts->field_name, hubbub->masks->field_name
+       hubbub1->shifts->field_name, hubbub1->masks->field_name
 
 void hubbub1_wm_read_state(struct hubbub *hubbub,
                struct dcn_hubbub_wm *wm)
 {
+       struct dcn10_hubbub *hubbub1 = TO_DCN10_HUBBUB(hubbub);
        struct dcn_hubbub_wm_set *s;
 
        memset(wm, 0, sizeof(struct dcn_hubbub_wm));
@@ -87,14 +88,23 @@ void hubbub1_wm_read_state(struct hubbub *hubbub,
        s->dram_clk_chanage = REG_READ(DCHUBBUB_ARB_ALLOW_DRAM_CLK_CHANGE_WATERMARK_D);
 }
 
-void hubbub1_disable_allow_self_refresh(struct hubbub *hubbub)
+void hubbub1_allow_self_refresh_control(struct hubbub *hubbub, bool allow)
 {
-       REG_UPDATE(DCHUBBUB_ARB_DRAM_STATE_CNTL,
-                       DCHUBBUB_ARB_ALLOW_SELF_REFRESH_FORCE_ENABLE, 0);
+       struct dcn10_hubbub *hubbub1 = TO_DCN10_HUBBUB(hubbub);
+
+       /*
+        * DCHUBBUB_ARB_ALLOW_SELF_REFRESH_FORCE_ENABLE = 1 means do not allow stutter
+        * DCHUBBUB_ARB_ALLOW_SELF_REFRESH_FORCE_ENABLE = 0 means allow stutter
+        */
+
+       REG_UPDATE_2(DCHUBBUB_ARB_DRAM_STATE_CNTL,
+                       DCHUBBUB_ARB_ALLOW_SELF_REFRESH_FORCE_VALUE, 0,
+                       DCHUBBUB_ARB_ALLOW_SELF_REFRESH_FORCE_ENABLE, !allow);
 }
 
 bool hububu1_is_allow_self_refresh_enabled(struct hubbub *hubbub)
 {
+       struct dcn10_hubbub *hubbub1 = TO_DCN10_HUBBUB(hubbub);
        uint32_t enable = 0;
 
        REG_GET(DCHUBBUB_ARB_DRAM_STATE_CNTL,
@@ -107,6 +117,8 @@ bool hububu1_is_allow_self_refresh_enabled(struct hubbub *hubbub)
 bool hubbub1_verify_allow_pstate_change_high(
        struct hubbub *hubbub)
 {
+       struct dcn10_hubbub *hubbub1 = TO_DCN10_HUBBUB(hubbub);
+
        /* pstate latency is ~20us so if we wait over 40us and pstate allow
         * still not asserted, we are probably stuck and going to hang
         *
@@ -193,7 +205,7 @@ bool hubbub1_verify_allow_pstate_change_high(
         * 31:    SOC pstate change request
         */
 
-       REG_WRITE(DCHUBBUB_TEST_DEBUG_INDEX, hubbub->debug_test_index_pstate);
+       REG_WRITE(DCHUBBUB_TEST_DEBUG_INDEX, hubbub1->debug_test_index_pstate);
 
        for (i = 0; i < pstate_wait_timeout_us; i++) {
                debug_data = REG_READ(DCHUBBUB_TEST_DEBUG_DATA);
@@ -244,8 +256,11 @@ static uint32_t convert_and_clamp(
 
 void hubbub1_wm_change_req_wa(struct hubbub *hubbub)
 {
-       REG_UPDATE_SEQ(DCHUBBUB_ARB_WATERMARK_CHANGE_CNTL,
-                       DCHUBBUB_ARB_WATERMARK_CHANGE_REQUEST, 0, 1);
+       struct dcn10_hubbub *hubbub1 = TO_DCN10_HUBBUB(hubbub);
+
+       REG_UPDATE_SEQ_2(DCHUBBUB_ARB_WATERMARK_CHANGE_CNTL,
+                       DCHUBBUB_ARB_WATERMARK_CHANGE_REQUEST, 0,
+                       DCHUBBUB_ARB_WATERMARK_CHANGE_REQUEST, 1);
 }
 
 void hubbub1_program_watermarks(
@@ -254,7 +269,7 @@ void hubbub1_program_watermarks(
                unsigned int refclk_mhz,
                bool safe_to_lower)
 {
-       uint32_t force_en = hubbub->ctx->dc->debug.disable_stutter ? 1 : 0;
+       struct dcn10_hubbub *hubbub1 = TO_DCN10_HUBBUB(hubbub);
        /*
         * Need to clamp to max of the register values (i.e. no wrap)
         * for dcn1, all wm registers are 21-bit wide
@@ -264,8 +279,8 @@ void hubbub1_program_watermarks(
 
        /* Repeat for water mark set A, B, C and D. */
        /* clock state A */
-       if (safe_to_lower || watermarks->a.urgent_ns > hubbub->watermarks.a.urgent_ns) {
-               hubbub->watermarks.a.urgent_ns = watermarks->a.urgent_ns;
+       if (safe_to_lower || watermarks->a.urgent_ns > hubbub1->watermarks.a.urgent_ns) {
+               hubbub1->watermarks.a.urgent_ns = watermarks->a.urgent_ns;
                prog_wm_value = convert_and_clamp(watermarks->a.urgent_ns,
                                refclk_mhz, 0x1fffff);
                REG_WRITE(DCHUBBUB_ARB_DATA_URGENCY_WATERMARK_A, prog_wm_value);
@@ -275,20 +290,22 @@ void hubbub1_program_watermarks(
                        watermarks->a.urgent_ns, prog_wm_value);
        }
 
-       if (safe_to_lower || watermarks->a.pte_meta_urgent_ns > hubbub->watermarks.a.pte_meta_urgent_ns) {
-               hubbub->watermarks.a.pte_meta_urgent_ns = watermarks->a.pte_meta_urgent_ns;
-               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);
-               DC_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_PTE_META_URGENCY_WATERMARK_A)) {
+               if (safe_to_lower || watermarks->a.pte_meta_urgent_ns > hubbub1->watermarks.a.pte_meta_urgent_ns) {
+                       hubbub1->watermarks.a.pte_meta_urgent_ns = watermarks->a.pte_meta_urgent_ns;
+                       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);
+                       DC_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)) {
                if (safe_to_lower || watermarks->a.cstate_pstate.cstate_enter_plus_exit_ns
-                               > hubbub->watermarks.a.cstate_pstate.cstate_enter_plus_exit_ns) {
-                       hubbub->watermarks.a.cstate_pstate.cstate_enter_plus_exit_ns =
+                               > hubbub1->watermarks.a.cstate_pstate.cstate_enter_plus_exit_ns) {
+                       hubbub1->watermarks.a.cstate_pstate.cstate_enter_plus_exit_ns =
                                        watermarks->a.cstate_pstate.cstate_enter_plus_exit_ns;
                        prog_wm_value = convert_and_clamp(
                                        watermarks->a.cstate_pstate.cstate_enter_plus_exit_ns,
@@ -300,8 +317,8 @@ void hubbub1_program_watermarks(
                }
 
                if (safe_to_lower || watermarks->a.cstate_pstate.cstate_exit_ns
-                               > hubbub->watermarks.a.cstate_pstate.cstate_exit_ns) {
-                       hubbub->watermarks.a.cstate_pstate.cstate_exit_ns =
+                               > hubbub1->watermarks.a.cstate_pstate.cstate_exit_ns) {
+                       hubbub1->watermarks.a.cstate_pstate.cstate_exit_ns =
                                        watermarks->a.cstate_pstate.cstate_exit_ns;
                        prog_wm_value = convert_and_clamp(
                                        watermarks->a.cstate_pstate.cstate_exit_ns,
@@ -314,8 +331,8 @@ void hubbub1_program_watermarks(
        }
 
        if (safe_to_lower || watermarks->a.cstate_pstate.pstate_change_ns
-                       > hubbub->watermarks.a.cstate_pstate.pstate_change_ns) {
-               hubbub->watermarks.a.cstate_pstate.pstate_change_ns =
+                       > hubbub1->watermarks.a.cstate_pstate.pstate_change_ns) {
+               hubbub1->watermarks.a.cstate_pstate.pstate_change_ns =
                                watermarks->a.cstate_pstate.pstate_change_ns;
                prog_wm_value = convert_and_clamp(
                                watermarks->a.cstate_pstate.pstate_change_ns,
@@ -327,8 +344,8 @@ void hubbub1_program_watermarks(
        }
 
        /* clock state B */
-       if (safe_to_lower || watermarks->b.urgent_ns > hubbub->watermarks.b.urgent_ns) {
-               hubbub->watermarks.b.urgent_ns = watermarks->b.urgent_ns;
+       if (safe_to_lower || watermarks->b.urgent_ns > hubbub1->watermarks.b.urgent_ns) {
+               hubbub1->watermarks.b.urgent_ns = watermarks->b.urgent_ns;
                prog_wm_value = convert_and_clamp(watermarks->b.urgent_ns,
                                refclk_mhz, 0x1fffff);
                REG_WRITE(DCHUBBUB_ARB_DATA_URGENCY_WATERMARK_B, prog_wm_value);
@@ -338,20 +355,22 @@ void hubbub1_program_watermarks(
                        watermarks->b.urgent_ns, prog_wm_value);
        }
 
-       if (safe_to_lower || watermarks->b.pte_meta_urgent_ns > hubbub->watermarks.b.pte_meta_urgent_ns) {
-               hubbub->watermarks.b.pte_meta_urgent_ns = watermarks->b.pte_meta_urgent_ns;
-               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);
-               DC_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_PTE_META_URGENCY_WATERMARK_B)) {
+               if (safe_to_lower || watermarks->b.pte_meta_urgent_ns > hubbub1->watermarks.b.pte_meta_urgent_ns) {
+                       hubbub1->watermarks.b.pte_meta_urgent_ns = watermarks->b.pte_meta_urgent_ns;
+                       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);
+                       DC_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)) {
                if (safe_to_lower || watermarks->b.cstate_pstate.cstate_enter_plus_exit_ns
-                               > hubbub->watermarks.b.cstate_pstate.cstate_enter_plus_exit_ns) {
-                       hubbub->watermarks.b.cstate_pstate.cstate_enter_plus_exit_ns =
+                               > hubbub1->watermarks.b.cstate_pstate.cstate_enter_plus_exit_ns) {
+                       hubbub1->watermarks.b.cstate_pstate.cstate_enter_plus_exit_ns =
                                        watermarks->b.cstate_pstate.cstate_enter_plus_exit_ns;
                        prog_wm_value = convert_and_clamp(
                                        watermarks->b.cstate_pstate.cstate_enter_plus_exit_ns,
@@ -363,8 +382,8 @@ void hubbub1_program_watermarks(
                }
 
                if (safe_to_lower || watermarks->b.cstate_pstate.cstate_exit_ns
-                               > hubbub->watermarks.b.cstate_pstate.cstate_exit_ns) {
-                       hubbub->watermarks.b.cstate_pstate.cstate_exit_ns =
+                               > hubbub1->watermarks.b.cstate_pstate.cstate_exit_ns) {
+                       hubbub1->watermarks.b.cstate_pstate.cstate_exit_ns =
                                        watermarks->b.cstate_pstate.cstate_exit_ns;
                        prog_wm_value = convert_and_clamp(
                                        watermarks->b.cstate_pstate.cstate_exit_ns,
@@ -377,8 +396,8 @@ void hubbub1_program_watermarks(
        }
 
        if (safe_to_lower || watermarks->b.cstate_pstate.pstate_change_ns
-                       > hubbub->watermarks.b.cstate_pstate.pstate_change_ns) {
-               hubbub->watermarks.b.cstate_pstate.pstate_change_ns =
+                       > hubbub1->watermarks.b.cstate_pstate.pstate_change_ns) {
+               hubbub1->watermarks.b.cstate_pstate.pstate_change_ns =
                                watermarks->b.cstate_pstate.pstate_change_ns;
                prog_wm_value = convert_and_clamp(
                                watermarks->b.cstate_pstate.pstate_change_ns,
@@ -390,8 +409,8 @@ void hubbub1_program_watermarks(
        }
 
        /* clock state C */
-       if (safe_to_lower || watermarks->c.urgent_ns > hubbub->watermarks.c.urgent_ns) {
-               hubbub->watermarks.c.urgent_ns = watermarks->c.urgent_ns;
+       if (safe_to_lower || watermarks->c.urgent_ns > hubbub1->watermarks.c.urgent_ns) {
+               hubbub1->watermarks.c.urgent_ns = watermarks->c.urgent_ns;
                prog_wm_value = convert_and_clamp(watermarks->c.urgent_ns,
                                refclk_mhz, 0x1fffff);
                REG_WRITE(DCHUBBUB_ARB_DATA_URGENCY_WATERMARK_C, prog_wm_value);
@@ -401,20 +420,22 @@ void hubbub1_program_watermarks(
                        watermarks->c.urgent_ns, prog_wm_value);
        }
 
-       if (safe_to_lower || watermarks->c.pte_meta_urgent_ns > hubbub->watermarks.c.pte_meta_urgent_ns) {
-               hubbub->watermarks.c.pte_meta_urgent_ns = watermarks->c.pte_meta_urgent_ns;
-               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);
-               DC_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_PTE_META_URGENCY_WATERMARK_C)) {
+               if (safe_to_lower || watermarks->c.pte_meta_urgent_ns > hubbub1->watermarks.c.pte_meta_urgent_ns) {
+                       hubbub1->watermarks.c.pte_meta_urgent_ns = watermarks->c.pte_meta_urgent_ns;
+                       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);
+                       DC_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)) {
                if (safe_to_lower || watermarks->c.cstate_pstate.cstate_enter_plus_exit_ns
-                               > hubbub->watermarks.c.cstate_pstate.cstate_enter_plus_exit_ns) {
-                       hubbub->watermarks.c.cstate_pstate.cstate_enter_plus_exit_ns =
+                               > hubbub1->watermarks.c.cstate_pstate.cstate_enter_plus_exit_ns) {
+                       hubbub1->watermarks.c.cstate_pstate.cstate_enter_plus_exit_ns =
                                        watermarks->c.cstate_pstate.cstate_enter_plus_exit_ns;
                        prog_wm_value = convert_and_clamp(
                                        watermarks->c.cstate_pstate.cstate_enter_plus_exit_ns,
@@ -426,8 +447,8 @@ void hubbub1_program_watermarks(
                }
 
                if (safe_to_lower || watermarks->c.cstate_pstate.cstate_exit_ns
-                               > hubbub->watermarks.c.cstate_pstate.cstate_exit_ns) {
-                       hubbub->watermarks.c.cstate_pstate.cstate_exit_ns =
+                               > hubbub1->watermarks.c.cstate_pstate.cstate_exit_ns) {
+                       hubbub1->watermarks.c.cstate_pstate.cstate_exit_ns =
                                        watermarks->c.cstate_pstate.cstate_exit_ns;
                        prog_wm_value = convert_and_clamp(
                                        watermarks->c.cstate_pstate.cstate_exit_ns,
@@ -440,8 +461,8 @@ void hubbub1_program_watermarks(
        }
 
        if (safe_to_lower || watermarks->c.cstate_pstate.pstate_change_ns
-                       > hubbub->watermarks.c.cstate_pstate.pstate_change_ns) {
-               hubbub->watermarks.c.cstate_pstate.pstate_change_ns =
+                       > hubbub1->watermarks.c.cstate_pstate.pstate_change_ns) {
+               hubbub1->watermarks.c.cstate_pstate.pstate_change_ns =
                                watermarks->c.cstate_pstate.pstate_change_ns;
                prog_wm_value = convert_and_clamp(
                                watermarks->c.cstate_pstate.pstate_change_ns,
@@ -453,8 +474,8 @@ void hubbub1_program_watermarks(
        }
 
        /* clock state D */
-       if (safe_to_lower || watermarks->d.urgent_ns > hubbub->watermarks.d.urgent_ns) {
-               hubbub->watermarks.d.urgent_ns = watermarks->d.urgent_ns;
+       if (safe_to_lower || watermarks->d.urgent_ns > hubbub1->watermarks.d.urgent_ns) {
+               hubbub1->watermarks.d.urgent_ns = watermarks->d.urgent_ns;
                prog_wm_value = convert_and_clamp(watermarks->d.urgent_ns,
                                refclk_mhz, 0x1fffff);
                REG_WRITE(DCHUBBUB_ARB_DATA_URGENCY_WATERMARK_D, prog_wm_value);
@@ -464,20 +485,22 @@ void hubbub1_program_watermarks(
                        watermarks->d.urgent_ns, prog_wm_value);
        }
 
-       if (safe_to_lower || watermarks->d.pte_meta_urgent_ns > hubbub->watermarks.d.pte_meta_urgent_ns) {
-               hubbub->watermarks.d.pte_meta_urgent_ns = watermarks->d.pte_meta_urgent_ns;
-               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);
-               DC_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_PTE_META_URGENCY_WATERMARK_D)) {
+               if (safe_to_lower || watermarks->d.pte_meta_urgent_ns > hubbub1->watermarks.d.pte_meta_urgent_ns) {
+                       hubbub1->watermarks.d.pte_meta_urgent_ns = watermarks->d.pte_meta_urgent_ns;
+                       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);
+                       DC_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)) {
                if (safe_to_lower || watermarks->d.cstate_pstate.cstate_enter_plus_exit_ns
-                               > hubbub->watermarks.d.cstate_pstate.cstate_enter_plus_exit_ns) {
-                       hubbub->watermarks.d.cstate_pstate.cstate_enter_plus_exit_ns =
+                               > hubbub1->watermarks.d.cstate_pstate.cstate_enter_plus_exit_ns) {
+                       hubbub1->watermarks.d.cstate_pstate.cstate_enter_plus_exit_ns =
                                        watermarks->d.cstate_pstate.cstate_enter_plus_exit_ns;
                        prog_wm_value = convert_and_clamp(
                                        watermarks->d.cstate_pstate.cstate_enter_plus_exit_ns,
@@ -489,8 +512,8 @@ void hubbub1_program_watermarks(
                }
 
                if (safe_to_lower || watermarks->d.cstate_pstate.cstate_exit_ns
-                               > hubbub->watermarks.d.cstate_pstate.cstate_exit_ns) {
-                       hubbub->watermarks.d.cstate_pstate.cstate_exit_ns =
+                               > hubbub1->watermarks.d.cstate_pstate.cstate_exit_ns) {
+                       hubbub1->watermarks.d.cstate_pstate.cstate_exit_ns =
                                        watermarks->d.cstate_pstate.cstate_exit_ns;
                        prog_wm_value = convert_and_clamp(
                                        watermarks->d.cstate_pstate.cstate_exit_ns,
@@ -503,8 +526,8 @@ void hubbub1_program_watermarks(
        }
 
        if (safe_to_lower || watermarks->d.cstate_pstate.pstate_change_ns
-                       > hubbub->watermarks.d.cstate_pstate.pstate_change_ns) {
-               hubbub->watermarks.d.cstate_pstate.pstate_change_ns =
+                       > hubbub1->watermarks.d.cstate_pstate.pstate_change_ns) {
+               hubbub1->watermarks.d.cstate_pstate.pstate_change_ns =
                                watermarks->d.cstate_pstate.pstate_change_ns;
                prog_wm_value = convert_and_clamp(
                                watermarks->d.cstate_pstate.pstate_change_ns,
@@ -520,9 +543,7 @@ void hubbub1_program_watermarks(
        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);
+       hubbub1_allow_self_refresh_control(hubbub, !hubbub->ctx->dc->debug.disable_stutter);
 
 #if 0
        REG_UPDATE_2(DCHUBBUB_ARB_WATERMARK_CHANGE_CNTL,
@@ -535,6 +556,8 @@ void hubbub1_update_dchub(
        struct hubbub *hubbub,
        struct dchub_init_data *dh_data)
 {
+       struct dcn10_hubbub *hubbub1 = TO_DCN10_HUBBUB(hubbub);
+
        if (REG(DCHUBBUB_SDPIF_FB_TOP) == 0) {
                ASSERT(false);
                /*should not come here*/
@@ -594,6 +617,8 @@ void hubbub1_update_dchub(
 
 void hubbub1_toggle_watermark_change_req(struct hubbub *hubbub)
 {
+       struct dcn10_hubbub *hubbub1 = TO_DCN10_HUBBUB(hubbub);
+
        uint32_t watermark_change_req;
 
        REG_GET(DCHUBBUB_ARB_WATERMARK_CHANGE_CNTL,
@@ -610,6 +635,8 @@ void hubbub1_toggle_watermark_change_req(struct hubbub *hubbub)
 
 void hubbub1_soft_reset(struct hubbub *hubbub, bool reset)
 {
+       struct dcn10_hubbub *hubbub1 = TO_DCN10_HUBBUB(hubbub);
+
        uint32_t reset_en = reset ? 1 : 0;
 
        REG_UPDATE(DCHUBBUB_SOFT_RESET,
@@ -752,7 +779,9 @@ static bool hubbub1_get_dcc_compression_cap(struct hubbub *hubbub,
                const struct dc_dcc_surface_param *input,
                struct dc_surface_dcc_cap *output)
 {
-       struct dc *dc = hubbub->ctx->dc;
+       struct dcn10_hubbub *hubbub1 = TO_DCN10_HUBBUB(hubbub);
+       struct dc *dc = hubbub1->base.ctx->dc;
+
        /* implement section 1.6.2.1 of DCN1_Programming_Guide.docx */
        enum dcc_control dcc_control;
        unsigned int bpe;
@@ -764,10 +793,10 @@ static bool hubbub1_get_dcc_compression_cap(struct hubbub *hubbub,
        if (dc->debug.disable_dcc == DCC_DISABLE)
                return false;
 
-       if (!hubbub->funcs->dcc_support_pixel_format(input->format, &bpe))
+       if (!hubbub1->base.funcs->dcc_support_pixel_format(input->format, &bpe))
                return false;
 
-       if (!hubbub->funcs->dcc_support_swizzle(input->swizzle_mode, bpe,
+       if (!hubbub1->base.funcs->dcc_support_swizzle(input->swizzle_mode, bpe,
                        &segment_order_horz, &segment_order_vert))
                return false;
 
@@ -837,6 +866,7 @@ static const struct hubbub_funcs hubbub1_funcs = {
        .dcc_support_swizzle = hubbub1_dcc_support_swizzle,
        .dcc_support_pixel_format = hubbub1_dcc_support_pixel_format,
        .get_dcc_compression_cap = hubbub1_get_dcc_compression_cap,
+       .wm_read_state = hubbub1_wm_read_state,
 };
 
 void hubbub1_construct(struct hubbub *hubbub,
@@ -845,18 +875,20 @@ void hubbub1_construct(struct hubbub *hubbub,
        const struct dcn_hubbub_shift *hubbub_shift,
        const struct dcn_hubbub_mask *hubbub_mask)
 {
-       hubbub->ctx = ctx;
+       struct dcn10_hubbub *hubbub1 = TO_DCN10_HUBBUB(hubbub);
+
+       hubbub1->base.ctx = ctx;
 
-       hubbub->funcs = &hubbub1_funcs;
+       hubbub1->base.funcs = &hubbub1_funcs;
 
-       hubbub->regs = hubbub_regs;
-       hubbub->shifts = hubbub_shift;
-       hubbub->masks = hubbub_mask;
+       hubbub1->regs = hubbub_regs;
+       hubbub1->shifts = hubbub_shift;
+       hubbub1->masks = hubbub_mask;
 
-       hubbub->debug_test_index_pstate = 0x7;
+       hubbub1->debug_test_index_pstate = 0x7;
 #if defined(CONFIG_DRM_AMD_DC_DCN1_01)
        if (ctx->dce_version == DCN_VERSION_1_01)
-               hubbub->debug_test_index_pstate = 0xB;
+               hubbub1->debug_test_index_pstate = 0xB;
 #endif
 }