drm/amd/display: Add Z8 allow states to z-state support list
authorjsg <jsg@openbsd.org>
Tue, 13 Jun 2023 03:48:04 +0000 (03:48 +0000)
committerjsg <jsg@openbsd.org>
Tue, 13 Jun 2023 03:48:04 +0000 (03:48 +0000)
From Nicholas Kazlauskas
bcde2c8779932e21c42cf1797bef92651e9aa567 in linux-6.1.y/6.1.29
80676936805e46c79c38008e5142a77a1b2f2dc7 in mainline linux

sys/dev/pci/drm/amd/display/dc/clk_mgr/dcn31/dcn31_smu.c
sys/dev/pci/drm/amd/display/dc/clk_mgr/dcn314/dcn314_smu.c
sys/dev/pci/drm/amd/display/dc/dc.h
sys/dev/pci/drm/amd/display/dc/dml/dcn20/dcn20_fpu.c

index ee973f6..12c517b 100644 (file)
@@ -333,8 +333,8 @@ void dcn31_smu_set_zstate_support(struct clk_mgr_internal *clk_mgr, enum dcn_zst
                        (support == DCN_ZSTATE_SUPPORT_ALLOW_Z10_ONLY))
                support = DCN_ZSTATE_SUPPORT_DISALLOW;
 
-
-       if (support == DCN_ZSTATE_SUPPORT_ALLOW_Z10_ONLY)
+       if (support == DCN_ZSTATE_SUPPORT_ALLOW_Z10_ONLY ||
+           support == DCN_ZSTATE_SUPPORT_ALLOW_Z8_Z10_ONLY)
                param = 1;
        else
                param = 0;
index 8bcb83d..2156525 100644 (file)
@@ -349,8 +349,6 @@ void dcn314_smu_set_zstate_support(struct clk_mgr_internal *clk_mgr, enum dcn_zs
        if (!clk_mgr->smu_present)
                return;
 
-       // Arg[15:0] = 8/9/0 for Z8/Z9/disallow -> existing bits
-       // Arg[16] = Disallow Z9 -> new bit
        switch (support) {
 
        case DCN_ZSTATE_SUPPORT_ALLOW:
@@ -369,6 +367,16 @@ void dcn314_smu_set_zstate_support(struct clk_mgr_internal *clk_mgr, enum dcn_zs
                param = (1 << 10);
                break;
 
+       case DCN_ZSTATE_SUPPORT_ALLOW_Z8_Z10_ONLY:
+               msg_id = VBIOSSMC_MSG_AllowZstatesEntry;
+               param = (1 << 10) | (1 << 8);
+               break;
+
+       case DCN_ZSTATE_SUPPORT_ALLOW_Z8_ONLY:
+               msg_id = VBIOSSMC_MSG_AllowZstatesEntry;
+               param = (1 << 8);
+               break;
+
        default: //DCN_ZSTATE_SUPPORT_UNKNOWN
                msg_id = VBIOSSMC_MSG_AllowZstatesEntry;
                param = 0;
index 98bfba0..0c21946 100644 (file)
@@ -491,6 +491,8 @@ enum dcn_pwr_state {
 enum dcn_zstate_support_state {
        DCN_ZSTATE_SUPPORT_UNKNOWN,
        DCN_ZSTATE_SUPPORT_ALLOW,
+       DCN_ZSTATE_SUPPORT_ALLOW_Z8_ONLY,
+       DCN_ZSTATE_SUPPORT_ALLOW_Z8_Z10_ONLY,
        DCN_ZSTATE_SUPPORT_ALLOW_Z10_ONLY,
        DCN_ZSTATE_SUPPORT_DISALLOW,
 };
index 602e885..feef0a7 100644 (file)
@@ -949,6 +949,7 @@ static enum dcn_zstate_support_state  decide_zstate_support(struct dc *dc, struc
        int plane_count;
        int i;
        unsigned int optimized_min_dst_y_next_start_us;
+       bool allow_z8 = context->bw_ctx.dml.vba.StutterPeriod > 1000.0;
 
        plane_count = 0;
        optimized_min_dst_y_next_start_us = 0;
@@ -963,6 +964,8 @@ static enum dcn_zstate_support_state  decide_zstate_support(struct dc *dc, struc
         *      2. single eDP, on link 0, 1 plane and stutter period > 5ms
         * Z10 only cases:
         *      1. single eDP, on link 0, 1 plane and stutter period >= 5ms
+        * Z8 cases:
+        *      1. stutter period sufficient
         * Zstate not allowed cases:
         *      1. Everything else
         */
@@ -990,11 +993,14 @@ static enum dcn_zstate_support_state  decide_zstate_support(struct dc *dc, struc
                if (context->bw_ctx.dml.vba.StutterPeriod > 5000.0 || optimized_min_dst_y_next_start_us > 5000)
                        return DCN_ZSTATE_SUPPORT_ALLOW;
                else if (link->psr_settings.psr_version == DC_PSR_VERSION_1 && !link->panel_config.psr.disable_psr)
-                       return DCN_ZSTATE_SUPPORT_ALLOW_Z10_ONLY;
+                       return allow_z8 ? DCN_ZSTATE_SUPPORT_ALLOW_Z8_Z10_ONLY : DCN_ZSTATE_SUPPORT_ALLOW_Z10_ONLY;
                else
-                       return DCN_ZSTATE_SUPPORT_DISALLOW;
-       } else
+                       return allow_z8 ? DCN_ZSTATE_SUPPORT_ALLOW_Z8_ONLY : DCN_ZSTATE_SUPPORT_DISALLOW;
+       } else if (allow_z8) {
+               return DCN_ZSTATE_SUPPORT_ALLOW_Z8_ONLY;
+       } else {
                return DCN_ZSTATE_SUPPORT_DISALLOW;
+       }
 }
 
 void dcn20_calculate_dlg_params(