Documentation/gpu/amdgpu/driver-misc.rst                     |    8 
 drivers/accel/ivpu/ivpu_jsm_msg.c                            |    3 
 drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.c                   |    8 
 drivers/gpu/drm/amd/amdgpu/amdgpu_atomfirmware.c             |   18 +
 drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c                       |   18 -
 drivers/gpu/drm/amd/amdgpu/amdgpu_device.c                   |   30 ++
 drivers/gpu/drm/amd/amdgpu/amdgpu_discovery.c                |   15 +
 drivers/gpu/drm/amd/amdgpu/amdgpu_display.c                  |   26 ++
 drivers/gpu/drm/amd/amdgpu/amdgpu_gfx.h                      |    3 
 drivers/gpu/drm/amd/amdgpu/amdgpu_psp.c                      |   11 +
 drivers/gpu/drm/amd/amdgpu/amdgpu_psp.h                      |    3 
 drivers/gpu/drm/amd/amdgpu/amdgpu_ras.c                      |   15 -
 drivers/gpu/drm/amd/amdgpu/amdgpu_ras_eeprom.c               |    3 
 drivers/gpu/drm/amd/amdgpu/gfx_v9_4_3.c                      |   26 +-
 drivers/gpu/drm/amd/amdgpu/jpeg_v4_0_3.c                     |    6 
 drivers/gpu/drm/amd/amdgpu/nbio_v7_9.c                       |   18 +
 drivers/gpu/drm/amd/amdgpu/psp_v13_0.c                       |   40 +++
 drivers/gpu/drm/amd/amdgpu/soc15.c                           |    4 
 drivers/gpu/drm/amd/amdkfd/kfd_int_process_v9.c              |    2 
 drivers/gpu/drm/amd/amdkfd/kfd_mqd_manager_v11.c             |    3 
 drivers/gpu/drm/amd/amdkfd/kfd_svm.c                         |    2 
 drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c            |   24 ++
 drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_crtc.c       |    9 
 drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_plane.c      |   16 +
 drivers/gpu/drm/amd/display/dc/Makefile                      |    1 
 drivers/gpu/drm/amd/display/dc/clk_mgr/dcn315/dcn315_smu.c   |   20 +
 drivers/gpu/drm/amd/display/dc/core/dc.c                     |   68 ++++--
 drivers/gpu/drm/amd/display/dc/dcn20/dcn20_hwseq.c           |   47 ----
 drivers/gpu/drm/amd/display/dc/dcn30/dcn30_hwseq.c           |   17 +
 drivers/gpu/drm/amd/display/dc/dcn30/dcn30_hwseq.h           |    2 
 drivers/gpu/drm/amd/display/dc/dcn30/dcn30_init.c            |    2 
 drivers/gpu/drm/amd/display/dc/dcn301/dcn301_init.c          |    1 
 drivers/gpu/drm/amd/display/dc/dcn31/dcn31_init.c            |    2 
 drivers/gpu/drm/amd/display/dc/dcn314/dcn314_init.c          |    2 
 drivers/gpu/drm/amd/display/dc/dcn32/dcn32_init.c            |    2 
 drivers/gpu/drm/amd/display/dc/dcn32/dcn32_resource.c        |  118 ++++++++++-
 drivers/gpu/drm/amd/display/dc/dml/dcn20/dcn20_fpu.c         |   25 --
 drivers/gpu/drm/amd/display/dc/dml/dcn314/dcn314_fpu.c       |   21 +
 drivers/gpu/drm/amd/display/modules/freesync/freesync.c      |    9 
 drivers/gpu/drm/amd/include/amd_shared.h                     |    2 
 drivers/gpu/drm/amd/include/atomfirmware.h                   |   18 +
 drivers/gpu/drm/amd/include/discovery.h                      |   38 +++
 drivers/gpu/drm/amd/pm/amdgpu_pm.c                           |   11 -
 drivers/gpu/drm/amd/pm/swsmu/inc/amdgpu_smu.h                |    5 
 drivers/gpu/drm/amd/pm/swsmu/inc/pmfw_if/smu_v13_0_0_ppsmc.h |    5 
 drivers/gpu/drm/amd/pm/swsmu/inc/pmfw_if/smu_v13_0_6_pmfw.h  |    4 
 drivers/gpu/drm/amd/pm/swsmu/inc/pmfw_if/smu_v13_0_6_ppsmc.h |   16 +
 drivers/gpu/drm/amd/pm/swsmu/inc/smu_types.h                 |    4 
 drivers/gpu/drm/amd/pm/swsmu/smu13/smu_v13_0.c               |    8 
 drivers/gpu/drm/amd/pm/swsmu/smu13/smu_v13_0_0_ppt.c         |    2 
 drivers/gpu/drm/amd/pm/swsmu/smu13/smu_v13_0_6_ppt.c         |   54 ++++-
 drivers/gpu/drm/i915/gt/intel_engine_types.h                 |    1 
 drivers/gpu/drm/i915/gt/uc/intel_guc_submission.c            |    3 
 drivers/gpu/drm/i915/i915_request.c                          |    7 
 drivers/gpu/drm/nouveau/dispnv04/crtc.c                      |    9 
 drivers/gpu/drm/nouveau/nouveau_bo.c                         |    8 
 drivers/gpu/drm/nouveau/nouveau_chan.c                       |    6 
 drivers/gpu/drm/nouveau/nouveau_dmem.c                       |    9 
 drivers/gpu/drm/nouveau/nouveau_exec.c                       |   11 -
 drivers/gpu/drm/nouveau/nouveau_fence.c                      |   32 ++
 drivers/gpu/drm/nouveau/nouveau_fence.h                      |    5 
 drivers/gpu/drm/nouveau/nouveau_gem.c                        |    5 
 62 files changed, 684 insertions(+), 227 deletions(-)

New commits:
commit 1115578119292161a2bb5fbd3229e1e9b4de4be0
Merge: 25fb9355f855 43ffcd6fa163
Author: Kevin Brace <kevinbr...@bracecomputerlab.com>
Date:   Sat Sep 9 17:38:29 2023 -0700

    Merge tag 'drm-next-2023-09-08' of git://anongit.freedesktop.org/drm/drm 
into drm-next-6.6
    
    drm fixes for 6.6-rc1
    
    amdgpu:
    - Display replay fixes
    - Fixes for headless boards
    - Fix documentation breakage
    - RAS fixes
    - Handle newer IP discovery tables
    - SMU 13.0.6 fixes
    - SR-IOV fixes
    - Display vstartup fixes
    - NBIO 7.9 fixes
    - Display scaling mode fixes
    - Debugfs power reporting fix
    - GC 9.4.3 fixes
    - Dirty framebuffer fixes for fbcon
    - eDP fixes
    - DCN 3.1.5 fix
    - Display ODM fixes
    - GPU core dump fix
    - Re-enable zops property now that IGT test is fixed
    - Fix possible UAF in CS code
    - Cursor degamma fix
    
    amdkfd:
    - HMM fixes
    - Interrupt masking fix
    - GFX11 MQD fixes
    
    i915:
    - Mark requests for GuC virtual engines to avoid use-after-free
    
    nouveau:
    - Fix fence state in nouveau_fence_emit()
    
    ivpu:
    - replace strncpy

commit 43ffcd6fa1635f479ad73145dfbba59edc2b3b28
Merge: 51eed9d4ce21 fbe1a9e0c781
Author: Dave Airlie <airl...@redhat.com>
Date:   Fri Sep 8 10:43:59 2023 +1000

    Merge tag 'amd-drm-fixes-6.6-2023-09-06' of 
https://gitlab.freedesktop.org/agd5f/linux into drm-next
    
    amd-drm-fixes-6.6-2023-09-06:
    
    amdgpu:
    - Display replay fixes
    - Fixes for headless boards
    - Fix documentation breakage
    - RAS fixes
    - Handle newer IP discovery tables
    - SMU 13.0.6 fixes
    - SR-IOV fixes
    - Display vstartup fixes
    - NBIO 7.9 fixes
    - Display scaling mode fixes
    - Debugfs power reporting fix
    - GC 9.4.3 fixes
    - Dirty framebuffer fixes for fbcon
    - eDP fixes
    - DCN 3.1.5 fix
    - Display ODM fixes
    - GPU core dump fix
    - Re-enable zops property now that IGT test is fixed
    - Fix possible UAF in CS code
    - Cursor degamma fix
    
    amdkfd:
    - HMM fixes
    - Interrupt masking fix
    - GFX11 MQD fixes
    
    Signed-off-by: Dave Airlie <airl...@redhat.com>
    
    From: Alex Deucher <alexander.deuc...@amd.com>
    Link: 
https://patchwork.freedesktop.org/patch/msgid/20230907033049.7811-1-alexander.deuc...@amd.com

commit 51eed9d4ce21f969894b2bc89eb5444b76615f54
Merge: d9809d242ff5 5eefc5307c98
Author: Dave Airlie <airl...@redhat.com>
Date:   Fri Sep 8 10:35:17 2023 +1000

    Merge tag 'drm-intel-next-fixes-2023-08-31' of 
git://anongit.freedesktop.org/drm/drm-intel into drm-next
    
    - Mark requests for GuC virtual engines to avoid use-after-free (Andrzej).
    
    Signed-off-by: Dave Airlie <airl...@redhat.com>
    
    From: Rodrigo Vivi <rodrigo.v...@intel.com>
    Link: 
https://patchwork.freedesktop.org/patch/msgid/zpegeep2ewctx...@intel.com

commit d9809d242ff501734e716634e0b3f3e0dce823ec
Merge: 3698a75f5a98 978474dc8278
Author: Dave Airlie <airl...@redhat.com>
Date:   Fri Sep 8 06:36:29 2023 +1000

    Merge tag 'drm-misc-next-fixes-2023-09-01' of 
git://anongit.freedesktop.org/drm/drm-misc into drm-next
    
    Short summary of fixes pull:
    
     * ivpu: Replace strncpy
     * nouveau: Fix fence state in nouveau_fence_emit()
    
    Signed-off-by: Dave Airlie <airl...@redhat.com>
    
    From: Thomas Zimmermann <tzimmerm...@suse.de>
    Link: 
https://patchwork.freedesktop.org/patch/msgid/20230901070123.GA6987@linux-uq9g

commit fbe1a9e0c78134db7e7f48322ab7d6a0530f2ee2
Author: Lijo Lazar <lijo.la...@amd.com>
Date:   Mon Sep 4 18:15:13 2023 +0530

    drm/amdgpu: Restrict bootloader wait to SMUv13.0.6
    
    Restrict the wait for boot loader steady state only to SMUv13.0.6. For
    older SOCs, ASIC init has a longer wait period and that takes care.
    
    Signed-off-by: Lijo Lazar <lijo.la...@amd.com>
    Reviewed-by: Asad Kamal <asad.ka...@amd.com>
    Signed-off-by: Alex Deucher <alexander.deuc...@amd.com>

diff --git a/drivers/gpu/drm/amd/amdgpu/psp_v13_0.c 
b/drivers/gpu/drm/amd/amdgpu/psp_v13_0.c
index d2a88bc630d2..469eed084976 100644
--- a/drivers/gpu/drm/amd/amdgpu/psp_v13_0.c
+++ b/drivers/gpu/drm/amd/amdgpu/psp_v13_0.c
@@ -160,9 +160,6 @@ static int psp_v13_0_wait_for_bootloader(struct psp_context 
*psp)
        struct amdgpu_device *adev = psp->adev;
        int retry_loop, ret;
 
-       if (adev->ip_versions[MP0_HWIP][0] == IP_VERSION(13, 0, 6))
-               psp_v13_0_wait_for_vmbx_ready(psp);
-
        /* Wait for bootloader to signify that it is ready having bit 31 of
         * C2PMSG_35 set to 1. All other bits are expected to be cleared.
         * If there is an error in processing command, bits[7:0] will be set.
@@ -180,6 +177,19 @@ static int psp_v13_0_wait_for_bootloader(struct 
psp_context *psp)
        return ret;
 }
 
+static int psp_v13_0_wait_for_bootloader_steady_state(struct psp_context *psp)
+{
+       struct amdgpu_device *adev = psp->adev;
+
+       if (adev->ip_versions[MP0_HWIP][0] == IP_VERSION(13, 0, 6)) {
+               psp_v13_0_wait_for_vmbx_ready(psp);
+
+               return psp_v13_0_wait_for_bootloader(psp);
+       }
+
+       return 0;
+}
+
 static int psp_v13_0_bootloader_load_component(struct psp_context      *psp,
                                               struct psp_bin_desc      
*bin_desc,
                                               enum psp_bootloader_cmd  bl_cmd)
@@ -737,7 +747,7 @@ static int psp_v13_0_fatal_error_recovery_quirk(struct 
psp_context *psp)
 
 static const struct psp_funcs psp_v13_0_funcs = {
        .init_microcode = psp_v13_0_init_microcode,
-       .wait_for_bootloader = psp_v13_0_wait_for_bootloader,
+       .wait_for_bootloader = psp_v13_0_wait_for_bootloader_steady_state,
        .bootloader_load_kdb = psp_v13_0_bootloader_load_kdb,
        .bootloader_load_spl = psp_v13_0_bootloader_load_spl,
        .bootloader_load_sysdrv = psp_v13_0_bootloader_load_sysdrv,
commit 07e388aab042774f284a2ad75a70a194517cdad4
Author: Hamza Mahfooz <hamza.mahf...@amd.com>
Date:   Tue Sep 5 13:27:22 2023 -0400

    drm/amd/display: prevent potential division by zero errors
    
    There are two places in apply_below_the_range() where it's possible for
    a divide by zero error to occur. So, to fix this make sure the divisor
    is non-zero before attempting the computation in both cases.
    
    Cc: sta...@vger.kernel.org
    Link: https://gitlab.freedesktop.org/drm/amd/-/issues/2637
    Fixes: a463b263032f ("drm/amd/display: Fix frames_to_insert math")
    Fixes: ded6119e825a ("drm/amd/display: Reinstate LFC optimization")
    Reviewed-by: Aurabindo Pillai <aurabindo.pil...@amd.com>
    Signed-off-by: Hamza Mahfooz <hamza.mahf...@amd.com>
    Signed-off-by: Alex Deucher <alexander.deuc...@amd.com>

diff --git a/drivers/gpu/drm/amd/display/modules/freesync/freesync.c 
b/drivers/gpu/drm/amd/display/modules/freesync/freesync.c
index dbd60811f95d..ef3a67409021 100644
--- a/drivers/gpu/drm/amd/display/modules/freesync/freesync.c
+++ b/drivers/gpu/drm/amd/display/modules/freesync/freesync.c
@@ -338,7 +338,9 @@ static void apply_below_the_range(struct core_freesync 
*core_freesync,
                 *  - Delta for CEIL: delta_from_mid_point_in_us_1
                 *  - Delta for FLOOR: delta_from_mid_point_in_us_2
                 */
-               if ((last_render_time_in_us / mid_point_frames_ceil) < 
in_out_vrr->min_duration_in_us) {
+               if (mid_point_frames_ceil &&
+                   (last_render_time_in_us / mid_point_frames_ceil) <
+                   in_out_vrr->min_duration_in_us) {
                        /* Check for out of range.
                         * If using CEIL produces a value that is out of range,
                         * then we are forced to use FLOOR.
@@ -385,8 +387,9 @@ static void apply_below_the_range(struct core_freesync 
*core_freesync,
                /* Either we've calculated the number of frames to insert,
                 * or we need to insert min duration frames
                 */
-               if (last_render_time_in_us / frames_to_insert <
-                               in_out_vrr->min_duration_in_us){
+               if (frames_to_insert &&
+                   (last_render_time_in_us / frames_to_insert) <
+                   in_out_vrr->min_duration_in_us){
                        frames_to_insert -= (frames_to_insert > 1) ?
                                        1 : 0;
                }
commit 57a943ebfcdb4a97fbb409640234bdb44bfa1953
Author: Melissa Wen <m...@igalia.com>
Date:   Thu Aug 31 15:12:28 2023 -0100

    drm/amd/display: enable cursor degamma for DCN3+ DRM legacy gamma
    
    For DRM legacy gamma, AMD display manager applies implicit sRGB degamma
    using a pre-defined sRGB transfer function. It works fine for DCN2
    family where degamma ROM and custom curves go to the same color block.
    But, on DCN3+, degamma is split into two blocks: degamma ROM for
    pre-defined TFs and `gamma correction` for user/custom curves and
    degamma ROM settings doesn't apply to cursor plane. To get DRM legacy
    gamma working as expected, enable cursor degamma ROM for implict sRGB
    degamma on HW with this configuration.
    
    Cc: sta...@vger.kernel.org
    Link: https://gitlab.freedesktop.org/drm/amd/-/issues/2803
    Fixes: 96b020e2163f ("drm/amd/display: check attr flag before set cursor 
degamma on DCN3+")
    Signed-off-by: Melissa Wen <m...@igalia.com>
    Signed-off-by: Alex Deucher <alexander.deuc...@amd.com>

diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_plane.c 
b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_plane.c
index 2198df96ed6f..cc74dd69acf2 100644
--- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_plane.c
+++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_plane.c
@@ -1269,6 +1269,13 @@ void amdgpu_dm_plane_handle_cursor_update(struct 
drm_plane *plane,
        attributes.rotation_angle    = 0;
        attributes.attribute_flags.value = 0;
 
+       /* Enable cursor degamma ROM on DCN3+ for implicit sRGB degamma in DRM
+        * legacy gamma setup.
+        */
+       if (crtc_state->cm_is_degamma_srgb &&
+           adev->dm.dc->caps.color.dpp.gamma_corr)
+               attributes.attribute_flags.bits.ENABLE_CURSOR_DEGAMMA = 1;
+
        attributes.pitch = afb->base.pitches[0] / afb->base.format->cpp[0];
 
        if (crtc_state->stream) {
commit 47428f4b638d3b3264a2efa1a567b0bbddbb6107
Author: Hamza Mahfooz <hamza.mahf...@amd.com>
Date:   Thu Aug 31 15:22:35 2023 -0400

    drm/amd/display: limit the v_startup workaround to ASICs older than DCN3.1
    
    Since, calling dcn20_adjust_freesync_v_startup() on DCN3.1+ ASICs
    can cause the display to flicker and underflow to occur, we shouldn't
    call it for them. So, ensure that the DCN version is less than
    DCN_VERSION_3_1 before calling dcn20_adjust_freesync_v_startup().
    
    Cc: sta...@vger.kernel.org
    Reviewed-by: Fangzhi Zuo <jerry....@amd.com>
    Signed-off-by: Hamza Mahfooz <hamza.mahf...@amd.com>
    Signed-off-by: Alex Deucher <alexander.deuc...@amd.com>

diff --git a/drivers/gpu/drm/amd/display/dc/dml/dcn20/dcn20_fpu.c 
b/drivers/gpu/drm/amd/display/dc/dml/dcn20/dcn20_fpu.c
index d01bc2dff49b..5805fb02af14 100644
--- a/drivers/gpu/drm/amd/display/dc/dml/dcn20/dcn20_fpu.c
+++ b/drivers/gpu/drm/amd/display/dc/dml/dcn20/dcn20_fpu.c
@@ -1099,7 +1099,8 @@ void dcn20_calculate_dlg_params(struct dc *dc,
                context->res_ctx.pipe_ctx[i].plane_res.bw.dppclk_khz =
                                                
pipes[pipe_idx].clks_cfg.dppclk_mhz * 1000;
                context->res_ctx.pipe_ctx[i].pipe_dlg_param = 
pipes[pipe_idx].pipe.dest;
-               if 
(context->res_ctx.pipe_ctx[i].stream->adaptive_sync_infopacket.valid)
+               if (dc->ctx->dce_version < DCN_VERSION_3_1 &&
+                   
context->res_ctx.pipe_ctx[i].stream->adaptive_sync_infopacket.valid)
                        dcn20_adjust_freesync_v_startup(
                                &context->res_ctx.pipe_ctx[i].stream->timing,
                                
&context->res_ctx.pipe_ctx[i].pipe_dlg_param.vstartup_start);
commit a81de4a22bbe3183b7f0d6f13f592b8f5b5a3c18
Author: Hamza Mahfooz <hamza.mahf...@amd.com>
Date:   Thu Aug 31 15:17:14 2023 -0400

    Revert "drm/amd/display: Remove v_startup workaround for dcn3+"
    
    This reverts commit 3a31e8b89b7240d9a17ace8a1ed050bdcb560f9e.
    
    We still need to call dcn20_adjust_freesync_v_startup() for older DCN3+
    ASICs. Otherwise, it can cause DP to HDMI 2.1 PCONs to fail to light up.
    
    Cc: sta...@vger.kernel.org
    Link: https://gitlab.freedesktop.org/drm/amd/-/issues/2809
    Reviewed-by: Fangzhi Zuo <jerry....@amd.com>
    Reviewed-by: Harry Wentland <harry.wentl...@amd.com>
    Signed-off-by: Hamza Mahfooz <hamza.mahf...@amd.com>
    Signed-off-by: Alex Deucher <alexander.deuc...@amd.com>

diff --git a/drivers/gpu/drm/amd/display/dc/dml/dcn20/dcn20_fpu.c 
b/drivers/gpu/drm/amd/display/dc/dml/dcn20/dcn20_fpu.c
index 8afda5ecc0cd..d01bc2dff49b 100644
--- a/drivers/gpu/drm/amd/display/dc/dml/dcn20/dcn20_fpu.c
+++ b/drivers/gpu/drm/amd/display/dc/dml/dcn20/dcn20_fpu.c
@@ -1099,6 +1099,10 @@ void dcn20_calculate_dlg_params(struct dc *dc,
                context->res_ctx.pipe_ctx[i].plane_res.bw.dppclk_khz =
                                                
pipes[pipe_idx].clks_cfg.dppclk_mhz * 1000;
                context->res_ctx.pipe_ctx[i].pipe_dlg_param = 
pipes[pipe_idx].pipe.dest;
+               if 
(context->res_ctx.pipe_ctx[i].stream->adaptive_sync_infopacket.valid)
+                       dcn20_adjust_freesync_v_startup(
+                               &context->res_ctx.pipe_ctx[i].stream->timing,
+                               
&context->res_ctx.pipe_ctx[i].pipe_dlg_param.vstartup_start);
 
                pipe_idx++;
        }
@@ -1927,7 +1931,6 @@ static bool dcn20_validate_bandwidth_internal(struct dc 
*dc, struct dc_state *co
        int vlevel = 0;
        int pipe_split_from[MAX_PIPES];
        int pipe_cnt = 0;
-       int i = 0;
        display_e2e_pipe_params_st *pipes = kzalloc(dc->res_pool->pipe_count * 
sizeof(display_e2e_pipe_params_st), GFP_ATOMIC);
        DC_LOGGER_INIT(dc->ctx->logger);
 
@@ -1951,15 +1954,6 @@ static bool dcn20_validate_bandwidth_internal(struct dc 
*dc, struct dc_state *co
        dcn20_calculate_wm(dc, context, pipes, &pipe_cnt, pipe_split_from, 
vlevel, fast_validate);
        dcn20_calculate_dlg_params(dc, context, pipes, pipe_cnt, vlevel);
 
-       for (i = 0; i < dc->res_pool->pipe_count; i++) {
-               if (!context->res_ctx.pipe_ctx[i].stream)
-                       continue;
-               if 
(context->res_ctx.pipe_ctx[i].stream->adaptive_sync_infopacket.valid)
-                       dcn20_adjust_freesync_v_startup(
-                               &context->res_ctx.pipe_ctx[i].stream->timing,
-                               
&context->res_ctx.pipe_ctx[i].pipe_dlg_param.vstartup_start);
-       }
-
        BW_VAL_TRACE_END_WATERMARKS();
 
        goto validate_out;
@@ -2232,7 +2226,6 @@ bool dcn21_validate_bandwidth_fp(struct dc *dc,
        int vlevel = 0;
        int pipe_split_from[MAX_PIPES];
        int pipe_cnt = 0;
-       int i = 0;
        display_e2e_pipe_params_st *pipes = kzalloc(dc->res_pool->pipe_count * 
sizeof(display_e2e_pipe_params_st), GFP_ATOMIC);
        DC_LOGGER_INIT(dc->ctx->logger);
 
@@ -2261,15 +2254,6 @@ bool dcn21_validate_bandwidth_fp(struct dc *dc,
        dcn21_calculate_wm(dc, context, pipes, &pipe_cnt, pipe_split_from, 
vlevel, fast_validate);
        dcn20_calculate_dlg_params(dc, context, pipes, pipe_cnt, vlevel);
 
-       for (i = 0; i < dc->res_pool->pipe_count; i++) {
-               if (!context->res_ctx.pipe_ctx[i].stream)
-                       continue;
-               if 
(context->res_ctx.pipe_ctx[i].stream->adaptive_sync_infopacket.valid)
-                       dcn20_adjust_freesync_v_startup(
-                               &context->res_ctx.pipe_ctx[i].stream->timing,
-                               
&context->res_ctx.pipe_ctx[i].pipe_dlg_param.vstartup_start);
-       }
-
        BW_VAL_TRACE_END_WATERMARKS();
 
        goto validate_out;
commit 35588314e963938dfdcdb792c9170108399377d6
Author: Christian König <christian.koe...@amd.com>
Date:   Fri Aug 25 15:28:00 2023 +0200

    drm/amdgpu: fix amdgpu_cs_p1_user_fence
    
    The offset is just 32bits here so this can potentially overflow if
    somebody specifies a large value. Instead reduce the size to calculate
    the last possible offset.
    
    The error handling path incorrectly drops the reference to the user
    fence BO resulting in potential reference count underflow.
    
    Signed-off-by: Christian König <christian.koe...@amd.com>
    Reviewed-by: Alex Deucher <alexander.deuc...@amd.com>
    Signed-off-by: Alex Deucher <alexander.deuc...@amd.com>
    Cc: sta...@vger.kernel.org

diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c 
b/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c
index 49dd9aa8da70..efdb1c48f431 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c
@@ -127,7 +127,6 @@ static int amdgpu_cs_p1_user_fence(struct amdgpu_cs_parser 
*p,
 {
        struct drm_gem_object *gobj;
        unsigned long size;
-       int r;
 
        gobj = drm_gem_object_lookup(p->filp, data->handle);
        if (gobj == NULL)
@@ -137,23 +136,14 @@ static int amdgpu_cs_p1_user_fence(struct 
amdgpu_cs_parser *p,
        drm_gem_object_put(gobj);
 
        size = amdgpu_bo_size(p->uf_bo);
-       if (size != PAGE_SIZE || (data->offset + 8) > size) {
-               r = -EINVAL;
-               goto error_unref;
-       }
+       if (size != PAGE_SIZE || data->offset > (size - 8))
+               return -EINVAL;
 
-       if (amdgpu_ttm_tt_get_usermm(p->uf_bo->tbo.ttm)) {
-               r = -EINVAL;
-               goto error_unref;
-       }
+       if (amdgpu_ttm_tt_get_usermm(p->uf_bo->tbo.ttm))
+               return -EINVAL;
 
        *offset = data->offset;
-
        return 0;
-
-error_unref:
-       amdgpu_bo_unref(&p->uf_bo);
-       return r;
 }
 
 static int amdgpu_cs_p1_bo_handles(struct amdgpu_cs_parser *p,
commit 46528db35561e45ff0a5e9c80d6e6e69a5877150
Author: Hamza Mahfooz <hamza.mahf...@amd.com>
Date:   Tue Aug 29 07:27:15 2023 -0400

    Revert "Revert "drm/amd/display: Implement zpos property""
    
    This reverts commit e2066eb4efe0e7d2d329d6e6765ed637a523ac45.
    
    The problematic IGT test case (i.e. kms_atomic@plane-immutable-zpos) has
    been fixed as of commit cb77add45011 ("tests/kms_atomic: remove zpos <
    N-planes assert") to the IGT repo. So, reintroduce the reverted code.
    
    Link: 
https://gitlab.freedesktop.org/drm/igt-gpu-tools/-/commit/cb77add45011b129e21f3cb2a4089a73dde56179
    Acked-by: Alex Deucher <alexander.deuc...@amd.com>
    Reviewed-by: Melissa Wen <m...@igalia.com>
    Signed-off-by: Hamza Mahfooz <hamza.mahf...@amd.com>
    Signed-off-by: Alex Deucher <alexander.deuc...@amd.com>

diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_plane.c 
b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_plane.c
index 8eeca160d434..2198df96ed6f 100644
--- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_plane.c
+++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_plane.c
@@ -1468,6 +1468,15 @@ int amdgpu_dm_plane_init(struct amdgpu_display_manager 
*dm,
                drm_plane_create_blend_mode_property(plane, blend_caps);
        }
 
+       if (plane->type == DRM_PLANE_TYPE_PRIMARY) {
+               drm_plane_create_zpos_immutable_property(plane, 0);
+       } else if (plane->type == DRM_PLANE_TYPE_OVERLAY) {
+               unsigned int zpos = 1 + drm_plane_index(plane);
+               drm_plane_create_zpos_property(plane, zpos, 1, 254);
+       } else if (plane->type == DRM_PLANE_TYPE_CURSOR) {
+               drm_plane_create_zpos_immutable_property(plane, 255);
+       }
+
        if (plane->type == DRM_PLANE_TYPE_PRIMARY &&
            plane_cap &&
            (plane_cap->pixel_format_support.nv12 ||
commit e9dca969b2426702a73719ab9207e43c6d80b581
Author: Jay Cornwall <jay.cornw...@amd.com>
Date:   Fri Aug 25 12:18:41 2023 -0400

    drm/amdkfd: Add missing gfx11 MQD manager callbacks
    
    mqd_stride function was introduced in commit 2f77b9a242a2
    ("drm/amdkfd: Update MQD management on multi XCC setup")
    but not assigned for gfx11. Fixes a NULL dereference in debugfs.
    
    Signed-off-by: Jay Cornwall <jay.cornw...@amd.com>
    Signed-off-by: Harish Kasiviswanathan <harish.kasiviswanat...@amd.com>
    Acked-by: Alex Deucher <alexander.deuc...@amd.com>
    Signed-off-by: Alex Deucher <alexander.deuc...@amd.com>
    Cc: sta...@vger.kernel.org # 6.5.x

diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_mqd_manager_v11.c 
b/drivers/gpu/drm/amd/amdkfd/kfd_mqd_manager_v11.c
index 2319467d2d95..0bbf0edbabd4 100644
--- a/drivers/gpu/drm/amd/amdkfd/kfd_mqd_manager_v11.c
+++ b/drivers/gpu/drm/amd/amdkfd/kfd_mqd_manager_v11.c
@@ -457,6 +457,7 @@ struct mqd_manager *mqd_manager_init_v11(enum KFD_MQD_TYPE 
type,
                mqd->is_occupied = kfd_is_occupied_cp;
                mqd->mqd_size = sizeof(struct v11_compute_mqd);
                mqd->get_wave_state = get_wave_state;
+               mqd->mqd_stride = kfd_mqd_stride;
 #if defined(CONFIG_DEBUG_FS)
                mqd->debugfs_show_mqd = debugfs_show_mqd;
 #endif
@@ -472,6 +473,7 @@ struct mqd_manager *mqd_manager_init_v11(enum KFD_MQD_TYPE 
type,
                mqd->destroy_mqd = destroy_hiq_mqd;
                mqd->is_occupied = kfd_is_occupied_cp;
                mqd->mqd_size = sizeof(struct v11_compute_mqd);
+               mqd->mqd_stride = kfd_mqd_stride;
 #if defined(CONFIG_DEBUG_FS)
                mqd->debugfs_show_mqd = debugfs_show_mqd;
 #endif
@@ -501,6 +503,7 @@ struct mqd_manager *mqd_manager_init_v11(enum KFD_MQD_TYPE 
type,
                mqd->destroy_mqd = kfd_destroy_mqd_sdma;
                mqd->is_occupied = kfd_is_occupied_sdma;
                mqd->mqd_size = sizeof(struct v11_sdma_mqd);
+               mqd->mqd_stride = kfd_mqd_stride;
 #if defined(CONFIG_DEBUG_FS)
                mqd->debugfs_show_mqd = debugfs_show_mqd_sdma;
 #endif
commit 9f051d6ff13fb20b424a86672db42746aa27d963
Author: Hawking Zhang <hawking.zh...@amd.com>
Date:   Tue Aug 29 23:20:27 2023 +0800

    drm/amdgpu: Free ras cmd input buffer properly
    
    Do not access the pointer for ras input cmd buffer
    if it is even not allocated.
    
    Signed-off-by: Hawking Zhang <hawking.zh...@amd.com>
    Reviewed-by: Stanley Yang <stanley.y...@amd.com>
    Signed-off-by: Alex Deucher <alexander.deuc...@amd.com>

diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ras.c 
b/drivers/gpu/drm/amd/amdgpu/amdgpu_ras.c
index 378478cf9c21..3c4600e15b86 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ras.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ras.c
@@ -764,7 +764,7 @@ int amdgpu_ras_feature_enable(struct amdgpu_device *adev,
 {
        struct amdgpu_ras *con = amdgpu_ras_get_context(adev);
        union ta_ras_cmd_input *info;
-       int ret = 0;
+       int ret;
 
        if (!con)
                return -EINVAL;
@@ -773,7 +773,7 @@ int amdgpu_ras_feature_enable(struct amdgpu_device *adev,
        if (enable &&
            head->block != AMDGPU_RAS_BLOCK__GFX &&
            !amdgpu_ras_is_feature_allowed(adev, head))
-               goto out;
+               return 0;
 
        /* Only enable gfx ras feature from host side */
        if (head->block == AMDGPU_RAS_BLOCK__GFX &&
@@ -801,16 +801,16 @@ int amdgpu_ras_feature_enable(struct amdgpu_device *adev,
                                enable ? "enable":"disable",
                                get_ras_block_str(head),
                                amdgpu_ras_is_poison_mode_supported(adev), ret);
-                       goto out;
+                       return ret;
                }
+
+               kfree(info);
        }
 
        /* setup the obj */
        __amdgpu_ras_feature_enable(adev, head, enable);
-out:
-       if (head->block == AMDGPU_RAS_BLOCK__GFX)
-               kfree(info);
-       return ret;
+
+       return 0;
 }
 
 /* Only used in device probe stage and called only once. */
commit 2031c46b09843c9f135468fe03a333f9fa0a30a7
Author: Rajneesh Bhardwaj <rajneesh.bhard...@amd.com>
Date:   Thu Aug 24 11:16:40 2023 -0400

    drm/amdgpu: Hide xcp partition sysfs under SRIOV
    
    XCP partitions should not be visible for the VF for GFXIP 9.4.3.
    
    Reviewed-by: Lijo Lazar <lijo.la...@amd.com>
    Signed-off-by: Rajneesh Bhardwaj <rajneesh.bhard...@amd.com>
    Signed-off-by: Alex Deucher <alexander.deuc...@amd.com>

diff --git a/drivers/gpu/drm/amd/amdgpu/gfx_v9_4_3.c 
b/drivers/gpu/drm/amd/amdgpu/gfx_v9_4_3.c
index f24a5474db35..0a26a00074a6 100644
--- a/drivers/gpu/drm/amd/amdgpu/gfx_v9_4_3.c
+++ b/drivers/gpu/drm/amd/amdgpu/gfx_v9_4_3.c
@@ -863,11 +863,15 @@ static int gfx_v9_4_3_sw_init(void *handle)
        if (r)
                return r;
 
-       r = amdgpu_gfx_sysfs_init(adev);
+       r = amdgpu_gfx_ras_sw_init(adev);
        if (r)
                return r;
 
-       return amdgpu_gfx_ras_sw_init(adev);
+
+       if (!amdgpu_sriov_vf(adev))
+               r = amdgpu_gfx_sysfs_init(adev);
+
+       return r;
 }
 
 static int gfx_v9_4_3_sw_fini(void *handle)
@@ -888,7 +892,8 @@ static int gfx_v9_4_3_sw_fini(void *handle)
        gfx_v9_4_3_mec_fini(adev);
        amdgpu_bo_unref(&adev->gfx.rlc.clear_state_obj);
        gfx_v9_4_3_free_microcode(adev);
-       amdgpu_gfx_sysfs_fini(adev);
+       if (!amdgpu_sriov_vf(adev))
+               amdgpu_gfx_sysfs_fini(adev);
 
        return 0;
 }
commit e23b10675ac610b26f24a6e8b3eb9bc6d38e5342
Author: Tao Zhou <tao.zh...@amd.com>
Date:   Fri Aug 25 15:13:57 2023 +0800

    drm/amdgpu: use read-modify-write mode for gfx v9_4_3 SQ setting
    
    Instead of using direct update, avoid touching unrelated fields.
    
    Signed-off-by: Tao Zhou <tao.zh...@amd.com>
    Reviewed-by: Hawking Zhang <hawking.zh...@amd.com>
    Signed-off-by: Alex Deucher <alexander.deuc...@amd.com>

diff --git a/drivers/gpu/drm/amd/amdgpu/gfx_v9_4_3.c 
b/drivers/gpu/drm/amd/amdgpu/gfx_v9_4_3.c
index b4fdb269f856..f24a5474db35 100644
--- a/drivers/gpu/drm/amd/amdgpu/gfx_v9_4_3.c
+++ b/drivers/gpu/drm/amd/amdgpu/gfx_v9_4_3.c
@@ -4042,7 +4042,8 @@ static void gfx_v9_4_3_inst_enable_watchdog_timer(struct 
amdgpu_device *adev,
        uint32_t i;
        uint32_t data;
 
-       data = REG_SET_FIELD(0, SQ_TIMEOUT_CONFIG, TIMEOUT_FATAL_DISABLE,
+       data = RREG32_SOC15(GC, GET_INST(GC, 0), regSQ_TIMEOUT_CONFIG);
+       data = REG_SET_FIELD(data, SQ_TIMEOUT_CONFIG, TIMEOUT_FATAL_DISABLE,
                             amdgpu_watchdog_timer.timeout_fatal_disable ? 1 : 
0);
 
        if (amdgpu_watchdog_timer.timeout_fatal_disable &&
commit a1fe9e9f73ce42f8cfcd07b5af221c17b850ebdf
Author: Alex Sierra <alex.sie...@amd.com>
Date:   Mon Aug 28 09:47:21 2023 -0500

    drm/amdkfd: use mask to get v9 interrupt sq data bits correctly
    
    Interrupt sq data bits were not taken properly from contextid0 and 
contextid1.
    Use macro KFD_CONTEXT_ID_GET_SQ_INT_DATA instead.
    
    Signed-off-by: Alex Sierra <alex.sie...@amd.com>
    Reviewed-by: Felix Kuehling <felix.kuehl...@amd.com>
    Signed-off-by: Alex Deucher <alexander.deuc...@amd.com>

diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_int_process_v9.c 
b/drivers/gpu/drm/amd/amdkfd/kfd_int_process_v9.c
index f0731a6a5306..830396b1c3b1 100644
--- a/drivers/gpu/drm/amd/amdkfd/kfd_int_process_v9.c
+++ b/drivers/gpu/drm/amd/amdkfd/kfd_int_process_v9.c
@@ -384,7 +384,7 @@ static void event_interrupt_wq_v9(struct kfd_node *dev,
                        default:
                                break;
                        }
-                       kfd_signal_event_interrupt(pasid, context_id0 & 
0xffffff, 24);
+                       kfd_signal_event_interrupt(pasid, sq_int_data, 24);
                } else if (source_id == SOC15_INTSRC_CP_BAD_OPCODE) {
                        kfd_set_dbg_ev_from_interrupt(dev, pasid,
                                KFD_DEBUG_DOORBELL_ID(context_id0),
commit 6d1b3455481a2cc1c6cd478770755c31e932130f
Author: André Almeida <andrealm...@igalia.com>
Date:   Thu Aug 17 15:20:46 2023 -0300

    drm/amdgpu: Allocate coredump memory in a nonblocking way
    
    During a GPU reset, a normal memory reclaim could block to reclaim
    memory. Giving that coredump is a best effort mechanism, it shouldn't
    disturb the reset path. Change its memory allocation flag to a
    nonblocking one.
    
    Signed-off-by: André Almeida <andrealm...@igalia.com>
    Reviewed-by: Christian König <christian.koe...@amd.com>
    Signed-off-by: Alex Deucher <alexander.deuc...@amd.com>

diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c 
b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
index 533daba2accb..3f001a50b34a 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
@@ -4869,7 +4869,7 @@ static void amdgpu_reset_capture_coredumpm(struct 
amdgpu_device *adev)
        struct drm_device *dev = adev_to_drm(adev);
 
        ktime_get_ts64(&adev->reset_time);
-       dev_coredumpm(dev->dev, THIS_MODULE, adev, 0, GFP_KERNEL,
+       dev_coredumpm(dev->dev, THIS_MODULE, adev, 0, GFP_NOWAIT,
                      amdgpu_devcoredump_read, amdgpu_devcoredump_free);
 }
 #endif
commit e0c5c387ac608591c1ce60383b43a99b261483de
Author: Hawking Zhang <hawking.zh...@amd.com>
Date:   Wed Aug 23 17:43:46 2023 +0800

    drm/amdgpu: Support query ecc cap for aqua_vanjaram
    
    Driver queries umc_info v4_0 to identify ecc cap
    for aqua_vanjaram
    
    Signed-off-by: Hawking Zhang <hawking.zh...@amd.com>
    Reviewed-by: Candice Li <candice...@amd.com>
    Signed-off-by: Alex Deucher <alexander.deuc...@amd.com>

diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_atomfirmware.c 
b/drivers/gpu/drm/amd/amdgpu/amdgpu_atomfirmware.c
index 835980e94b9e..fb2681dd6b33 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_atomfirmware.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_atomfirmware.c
@@ -217,6 +217,7 @@ union umc_info {
        struct atom_umc_info_v3_1 v31;
        struct atom_umc_info_v3_2 v32;
        struct atom_umc_info_v3_3 v33;
+       struct atom_umc_info_v4_0 v40;
 };
 
 union vram_info {
@@ -508,9 +509,8 @@ bool amdgpu_atomfirmware_mem_ecc_supported(struct 
amdgpu_device *adev)
 
        if (amdgpu_atom_parse_data_header(mode_info->atom_context,
                                index, &size, &frev, &crev, &data_offset)) {
+               umc_info = (union umc_info *)(mode_info->atom_context->bios + 
data_offset);
                if (frev == 3) {
-                       umc_info = (union umc_info *)
-                               (mode_info->atom_context->bios + data_offset);
                        switch (crev) {
                        case 1:
                                umc_config = 
le32_to_cpu(umc_info->v31.umc_config);
@@ -533,6 +533,20 @@ bool amdgpu_atomfirmware_mem_ecc_supported(struct 
amdgpu_device *adev)
                                /* unsupported crev */
                                return false;
                        }
+               } else if (frev == 4) {
+                       switch (crev) {
+                       case 0:
+                               umc_config1 = 
le32_to_cpu(umc_info->v40.umc_config1);
+                               ecc_default_enabled =
+                                       (umc_config1 & 
UMC_CONFIG1__ENABLE_ECC_CAPABLE) ? true : false;
+                               break;
+                       default:
+                               /* unsupported crev */
+                               return false;
+                       }
+               } else {
+                       /* unsupported frev */
+                       return false;
                }
        }
 
commit 48d02dcba17aae6a1de4f9814aa5cbe4c977abbb
Author: Hawking Zhang <hawking.zh...@amd.com>
Date:   Wed Aug 23 17:41:44 2023 +0800

    drm/amdgpu: Add umc_info v4_0 structure
    
    To be used by aqua_vanjaram
    
    Signed-off-by: Hawking Zhang <hawking.zh...@amd.com>
    Reviewed-by: Candice Li <candice...@amd.com>
    Signed-off-by: Alex Deucher <alexander.deuc...@amd.com>

diff --git a/drivers/gpu/drm/amd/include/atomfirmware.h 
b/drivers/gpu/drm/amd/include/atomfirmware.h
index e68c1e280322..fa7d6ced786f 100644
--- a/drivers/gpu/drm/amd/include/atomfirmware.h
+++ b/drivers/gpu/drm/amd/include/atomfirmware.h
@@ -3117,6 +3117,24 @@ enum atom_umc_config1_def {
        UMC_CONFIG1__ENABLE_ECC_CAPABLE = 0x00010000,
 };
 
+struct atom_umc_info_v4_0 {
+       struct atom_common_table_header table_header;
+       uint32_t ucode_reserved[5];
+       uint8_t umcip_min_ver;
+       uint8_t umcip_max_ver;
+       uint8_t vram_type;
+       uint8_t umc_config;
+       uint32_t mem_refclk_10khz;
+       uint32_t clk_reserved[4];
+       uint32_t golden_reserved;
+       uint32_t umc_config1;
+       uint32_t reserved[2];
+       uint8_t channel_num;
+       uint8_t channel_width;
+       uint8_t channel_reserve[2];
+       uint8_t umc_info_reserved[16];
+};
+
 /* 
   ***************************************************************************
     Data Table vram_info  structure
commit 49a30c3d1a2258fc93cfe6eea8e4951dabadc824
Author: Wenjing Liu <wenjing....@amd.com>
Date:   Tue Aug 15 10:47:52 2023 -0400

    drm/amd/display: always switch off ODM before committing more streams
    
    ODM power optimization is only supported with single stream. When ODM
    power optimization is enabled, we might not have enough free pipes for
    enabling other stream. So when we are committing more than 1 stream we
    should first switch off ODM power optimization to make room for new
    stream and then allocating pipe resource for the new stream.
    
    Cc: sta...@vger.kernel.org
    Fixes: 59de751e3845 ("drm/amd/display: add ODM case when looking for first 
split pipe")
    Reviewed-by: Dillon Varone <dillon.var...@amd.com>
    Acked-by: Hamza Mahfooz <hamza.mahf...@amd.com>
    Signed-off-by: Wenjing Liu <wenjing....@amd.com>
    Signed-off-by: Alex Deucher <alexander.deuc...@amd.com>

diff --git a/drivers/gpu/drm/amd/display/dc/core/dc.c 
b/drivers/gpu/drm/amd/display/dc/core/dc.c
index 54da304b38f0..3a9077b60029 100644
--- a/drivers/gpu/drm/amd/display/dc/core/dc.c
+++ b/drivers/gpu/drm/amd/display/dc/core/dc.c
@@ -2073,12 +2073,12 @@ enum dc_status dc_commit_streams(struct dc *dc,
                }
        }
 
-       /* Check for case where we are going from odm 2:1 to max
-        *  pipe scenario.  For these cases, we will call
-        *  commit_minimal_transition_state() to exit out of odm 2:1
-        *  first before processing new streams
+       /* ODM Combine 2:1 power optimization is only applied for single stream
+        * scenario, it uses extra pipes than needed to reduce power consumption
+        * We need to switch off this feature to make room for new streams.
         */
-       if (stream_count == dc->res_pool->pipe_count) {
+       if (stream_count > dc->current_state->stream_count &&
+                       dc->current_state->stream_count == 1) {
                for (i = 0; i < dc->res_pool->pipe_count; i++) {
                        pipe = &dc->current_state->res_ctx.pipe_ctx[i];
                        if (pipe->next_odm_pipe)
commit 5a3ccb1400339268c5e3dc1fa044a7f6c7f59a02
Author: Gabe Teeger <gabe.tee...@amd.com>
Date:   Mon Aug 14 16:06:18 2023 -0400

    drm/amd/display: Remove wait while locked
    
    [Why]
    We wait for mpc idle while in a locked state, leading to potential
    deadlock.
    
    [What]
    Move the wait_for_idle call to outside of HW lock. This and a
    call to wait_drr_doublebuffer_pending_clear are moved added to a new
    static helper function called wait_for_outstanding_hw_updates, to make
    the interface clearer.
    
    Cc: sta...@vger.kernel.org
    Fixes: 8f0d304d21b3 ("drm/amd/display: Do not commit pipe when updating 
DRR")
    Reviewed-by: Jun Lei <jun....@amd.com>
    Acked-by: Hamza Mahfooz <hamza.mahf...@amd.com>
    Signed-off-by: Gabe Teeger <gabe.tee...@amd.com>
    Signed-off-by: Alex Deucher <alexander.deuc...@amd.com>

diff --git a/drivers/gpu/drm/amd/display/dc/Makefile 
b/drivers/gpu/drm/amd/display/dc/Makefile
index 69ffd4424dc7..1b8c2aef4633 100644
--- a/drivers/gpu/drm/amd/display/dc/Makefile
+++ b/drivers/gpu/drm/amd/display/dc/Makefile
@@ -78,3 +78,4 @@ DC_EDID += dc_edid_parser.o
 AMD_DISPLAY_DMUB = $(addprefix $(AMDDALPATH)/dc/,$(DC_DMUB))
 AMD_DISPLAY_EDID = $(addprefix $(AMDDALPATH)/dc/,$(DC_EDID))
 AMD_DISPLAY_FILES += $(AMD_DISPLAY_DMUB) $(AMD_DISPLAY_EDID)
+
diff --git a/drivers/gpu/drm/amd/display/dc/core/dc.c 
b/drivers/gpu/drm/amd/display/dc/core/dc.c
index 566d7045b2de..54da304b38f0 100644
--- a/drivers/gpu/drm/amd/display/dc/core/dc.c
+++ b/drivers/gpu/drm/amd/display/dc/core/dc.c
@@ -3501,6 +3501,45 @@ static void commit_planes_for_stream_fast(struct dc *dc,
                top_pipe_to_program->stream->update_flags.raw = 0;
 }
 
+static void wait_for_outstanding_hw_updates(struct dc *dc, const struct 
dc_state *dc_context)
+{
+/*
+ * This function calls HWSS to wait for any potentially double buffered
+ * operations to complete. It should be invoked as a pre-amble prior
+ * to full update programming before asserting any HW locks.
+ */
+       int pipe_idx;
+       int opp_inst;
+       int opp_count = dc->res_pool->pipe_count;
+       struct hubp *hubp;
+       int mpcc_inst;
+       const struct pipe_ctx *pipe_ctx;
+
+       for (pipe_idx = 0; pipe_idx < dc->res_pool->pipe_count; pipe_idx++) {
+               pipe_ctx = &dc_context->res_ctx.pipe_ctx[pipe_idx];
+
+               if (!pipe_ctx->stream)
+                       continue;
+
+               if 
(pipe_ctx->stream_res.tg->funcs->wait_drr_doublebuffer_pending_clear)
+                       
pipe_ctx->stream_res.tg->funcs->wait_drr_doublebuffer_pending_clear(pipe_ctx->stream_res.tg);
+
+               hubp = pipe_ctx->plane_res.hubp;
+               if (!hubp)
+                       continue;
+
+               mpcc_inst = hubp->inst;
+               // MPCC inst is equal to pipe index in practice
+               for (opp_inst = 0; opp_inst < opp_count; opp_inst++) {
+                       if 
(dc->res_pool->opps[opp_inst]->mpcc_disconnect_pending[mpcc_inst]) {
+                               
dc->res_pool->mpc->funcs->wait_for_idle(dc->res_pool->mpc, mpcc_inst);
+                               
dc->res_pool->opps[opp_inst]->mpcc_disconnect_pending[mpcc_inst] = false;
+                               break;
+                       }
+               }
+       }
+}
+
 static void commit_planes_for_stream(struct dc *dc,
                struct dc_surface_update *srf_updates,
                int surface_count,
@@ -3519,24 +3558,9 @@ static void commit_planes_for_stream(struct dc *dc,
        // dc->current_state anymore, so we have to cache it before we apply
        // the new SubVP context
        subvp_prev_use = false;
-
-
        dc_z10_restore(dc);
-
-       if (update_type == UPDATE_TYPE_FULL) {
-               /* wait for all double-buffer activity to clear on all pipes */
-               int pipe_idx;
-
-               for (pipe_idx = 0; pipe_idx < dc->res_pool->pipe_count; 
pipe_idx++) {
-                       struct pipe_ctx *pipe_ctx = 
&context->res_ctx.pipe_ctx[pipe_idx];
-
-                       if (!pipe_ctx->stream)
-                               continue;
-
-                       if 
(pipe_ctx->stream_res.tg->funcs->wait_drr_doublebuffer_pending_clear)
-                               
pipe_ctx->stream_res.tg->funcs->wait_drr_doublebuffer_pending_clear(pipe_ctx->stream_res.tg);
-               }
-       }
+       if (update_type == UPDATE_TYPE_FULL)
+               wait_for_outstanding_hw_updates(dc, context);
 
        if (update_type == UPDATE_TYPE_FULL) {
                dc_allow_idle_optimizations(dc, false);
diff --git a/drivers/gpu/drm/amd/display/dc/dcn20/dcn20_hwseq.c 
b/drivers/gpu/drm/amd/display/dc/dcn20/dcn20_hwseq.c
index 87c1ac40240b..e72f15ac0048 100644
--- a/drivers/gpu/drm/amd/display/dc/dcn20/dcn20_hwseq.c
+++ b/drivers/gpu/drm/amd/display/dc/dcn20/dcn20_hwseq.c
@@ -1561,17 +1561,6 @@ static void dcn20_update_dchubp_dpp(
                        || plane_state->update_flags.bits.global_alpha_change
                        || 
plane_state->update_flags.bits.per_pixel_alpha_change) {
                // MPCC inst is equal to pipe index in practice
-               int mpcc_inst = hubp->inst;
-               int opp_inst;
-               int opp_count = dc->res_pool->pipe_count;
-
-               for (opp_inst = 0; opp_inst < opp_count; opp_inst++) {
-                       if 
(dc->res_pool->opps[opp_inst]->mpcc_disconnect_pending[mpcc_inst]) {
-                               
dc->res_pool->mpc->funcs->wait_for_idle(dc->res_pool->mpc, mpcc_inst);
-                               
dc->res_pool->opps[opp_inst]->mpcc_disconnect_pending[mpcc_inst] = false;
-                               break;
-                       }
-               }
                hws->funcs.update_mpcc(dc, pipe_ctx);
        }
 
commit 1482650bc7ef01ebb24ec2c3a2e4d50e45da4d8c
Author: Wenjing Liu <wenjing....@amd.com>
Date:   Mon Aug 14 17:11:16 2023 -0400

    drm/amd/display: update blank state on ODM changes
    
    When we are dynamically adding new ODM slices, we didn't update
    blank state, if the pipe used by new ODM slice is previously blanked,
    we will continue outputting blank pixel data on that slice causing
    right half of the screen showing blank image.
    
    The previous fix was a temporary hack to directly update current state
    when committing new state. This could potentially cause hw and sw
    state synchronization issues and it is not permitted by dc commit
    design.
    
    Cc: sta...@vger.kernel.org
    Fixes: 7fbf451e7639 ("drm/amd/display: Reinit DPG when exiting dynamic ODM")
    Reviewed-by: Dillon Varone <dillon.var...@amd.com>
    Acked-by: Hamza Mahfooz <hamza.mahf...@amd.com>
    Signed-off-by: Wenjing Liu <wenjing....@amd.com>
    Signed-off-by: Alex Deucher <alexander.deuc...@amd.com>

diff --git a/drivers/gpu/drm/amd/display/dc/dcn20/dcn20_hwseq.c 
b/drivers/gpu/drm/amd/display/dc/dcn20/dcn20_hwseq.c
index 65fa9e21ad9c..87c1ac40240b 100644
--- a/drivers/gpu/drm/amd/display/dc/dcn20/dcn20_hwseq.c
+++ b/drivers/gpu/drm/amd/display/dc/dcn20/dcn20_hwseq.c
@@ -1106,29 +1106,6 @@ void dcn20_blank_pixel_data(
                        v_active,
                        offset);
 
-       if (!blank && dc->debug.enable_single_display_2to1_odm_policy) {
-               /* when exiting dynamic ODM need to reinit DPG state for unused 
pipes */
-               struct pipe_ctx *old_odm_pipe = 
dc->current_state->res_ctx.pipe_ctx[pipe_ctx->pipe_idx].next_odm_pipe;
-
-               odm_pipe = pipe_ctx->next_odm_pipe;
-
-               while (old_odm_pipe) {
-                       if (!odm_pipe || old_odm_pipe->pipe_idx != 
odm_pipe->pipe_idx)
-                               dc->hwss.set_disp_pattern_generator(dc,
-                                               old_odm_pipe,
-                                               
CONTROLLER_DP_TEST_PATTERN_VIDEOMODE,
-                                               
CONTROLLER_DP_COLOR_SPACE_UDEFINED,
-                                               COLOR_DEPTH_888,
-                                               NULL,
-                                               0,
-                                               0,
-                                               0);
-                       old_odm_pipe = old_odm_pipe->next_odm_pipe;
-                       if (odm_pipe)
-                               odm_pipe = odm_pipe->next_odm_pipe;
-               }
-       }
-
        if (!blank)
                if (stream_res->abm) {
                        dc->hwss.set_pipe(pipe_ctx);
@@ -1722,11 +1699,16 @@ static void dcn20_program_pipe(
                struct dc_state *context)
 {
        struct dce_hwseq *hws = dc->hwseq;
-       /* Only need to unblank on top pipe */
 
-       if ((pipe_ctx->update_flags.bits.enable || 
pipe_ctx->stream->update_flags.bits.abm_level)
-                       && !pipe_ctx->top_pipe && !pipe_ctx->prev_odm_pipe)
-               hws->funcs.blank_pixel_data(dc, pipe_ctx, 
!pipe_ctx->plane_state->visible);
+       /* Only need to unblank on top pipe */
+       if (resource_is_pipe_type(pipe_ctx, OTG_MASTER)) {
+               if (pipe_ctx->update_flags.bits.enable ||
+                               pipe_ctx->update_flags.bits.odm ||
+                               pipe_ctx->stream->update_flags.bits.abm_level)
+                       hws->funcs.blank_pixel_data(dc, pipe_ctx,
+                                       !pipe_ctx->plane_state ||
+                                       !pipe_ctx->plane_state->visible);
+       }
 
        /* Only update TG on top pipe */
        if (pipe_ctx->update_flags.bits.global_sync && !pipe_ctx->top_pipe
commit 72105dcfa3d12b5af49311f857e3490baa225135
Author: Fudong Wang <fudong.w...@amd.com>
Date:   Fri Aug 11 08:24:59 2023 +0800

    drm/amd/display: Add smu write msg id fail retry process
    
    A benchmark stress test (12-40 machines x 48hours) found that DCN315 has
    cases where DC writes to an indirect register to set the smu clock msg
    id, but when we go to read the same indirect register the returned msg
    id doesn't match with what we just set it to. So, to fix this retry the
    write until the register's value matches with the requested value.
    
    Cc: sta...@vger.kernel.org # 6.1+
    Fixes: f94903996140 ("drm/amd/display: Add DCN315 CLK_MGR")
    Reviewed-by: Charlene Liu <charlene....@amd.com>
    Acked-by: Hamza Mahfooz <hamza.mahf...@amd.com>
    Signed-off-by: Fudong Wang <fudong.w...@amd.com>
    Signed-off-by: Alex Deucher <alexander.deuc...@amd.com>

diff --git a/drivers/gpu/drm/amd/display/dc/clk_mgr/dcn315/dcn315_smu.c 
b/drivers/gpu/drm/amd/display/dc/clk_mgr/dcn315/dcn315_smu.c
index 3e0da873cf4c..1042cf1a3ab0 100644
--- a/drivers/gpu/drm/amd/display/dc/clk_mgr/dcn315/dcn315_smu.c
+++ b/drivers/gpu/drm/amd/display/dc/clk_mgr/dcn315/dcn315_smu.c
@@ -32,6 +32,7 @@
 
 #define MAX_INSTANCE                                        6
 #define MAX_SEGMENT                                         6
+#define SMU_REGISTER_WRITE_RETRY_COUNT                      5
 
 struct IP_BASE_INSTANCE {
     unsigned int segment[MAX_SEGMENT];
@@ -132,6 +133,8 @@ static int dcn315_smu_send_msg_with_param(
                unsigned int msg_id, unsigned int param)
 {
        uint32_t result;
+       uint32_t i = 0;
+       uint32_t read_back_data;
 
        result = dcn315_smu_wait_for_response(clk_mgr, 10, 200000);
 
@@ -148,10 +151,19 @@ static int dcn315_smu_send_msg_with_param(
        /* Set the parameter register for the SMU message, unit is Mhz */
        REG_WRITE(MP1_SMN_C2PMSG_37, param);
 
-       /* Trigger the message transaction by writing the message ID */
-       generic_write_indirect_reg(CTX,
-               REG_NBIO(RSMU_INDEX), REG_NBIO(RSMU_DATA),
-               mmMP1_C2PMSG_3, msg_id);
+       for (i = 0; i < SMU_REGISTER_WRITE_RETRY_COUNT; i++) {
+               /* Trigger the message transaction by writing the message ID */
+               generic_write_indirect_reg(CTX,
+                       REG_NBIO(RSMU_INDEX), REG_NBIO(RSMU_DATA),
+                       mmMP1_C2PMSG_3, msg_id);
+               read_back_data = generic_read_indirect_reg(CTX,
+                       REG_NBIO(RSMU_INDEX), REG_NBIO(RSMU_DATA),
+                       mmMP1_C2PMSG_3);
+               if (read_back_data == msg_id)
+                       break;
+               udelay(2);
+               smu_print("SMU msg id write fail %x times. \n", i + 1);
+       }
 
        result = dcn315_smu_wait_for_response(clk_mgr, 10, 200000);
 
commit 05347402d1c1e52924786cd0c0326080c33e00dc
Author: Lijo Lazar <lijo.la...@amd.com>
Date:   Wed Jul 19 13:31:47 2023 +0530

    drm/amdgpu: Add SMU v13.0.6 default reset methods
    
    For APUs with SMU v13.0.6, mode-2 reset is kept as default and for
    others mode-1 is the default reset method.
    
    Signed-off-by: Lijo Lazar <lijo.la...@amd.com>
    Reviewed-by: Hawking Zhang <hawking.zh...@amd.com>
    Reviewed-by: Asad Kamal <asad.ka...@amd.com>
    Tested-by: Asad Kamal <asad.ka...@amd.com>
    Signed-off-by: Alex Deucher <alexander.deuc...@amd.com>

diff --git a/drivers/gpu/drm/amd/amdgpu/soc15.c 
b/drivers/gpu/drm/amd/amdgpu/soc15.c
index c45721ca916e..f5be40d7ba36 100644
--- a/drivers/gpu/drm/amd/amdgpu/soc15.c
+++ b/drivers/gpu/drm/amd/amdgpu/soc15.c
@@ -559,8 +559,10 @@ soc15_asic_reset_method(struct amdgpu_device *adev)
                 */
                if (amdgpu_gpu_recovery == 4 || amdgpu_gpu_recovery == 5)
                        return AMD_RESET_METHOD_MODE2;
+               else if (!(adev->flags & AMD_IS_APU))
+                       return AMD_RESET_METHOD_MODE1;
                else
-                       return AMD_RESET_METHOD_NONE;
+                       return AMD_RESET_METHOD_MODE2;
        default:
                break;
        }
diff --git a/drivers/gpu/drm/amd/pm/swsmu/smu13/smu_v13_0_6_ppt.c 
b/drivers/gpu/drm/amd/pm/swsmu/smu13/smu_v13_0_6_ppt.c
index d3b578e6bc2a..199a673b8120 100644
--- a/drivers/gpu/drm/amd/pm/swsmu/smu13/smu_v13_0_6_ppt.c
+++ b/drivers/gpu/drm/amd/pm/swsmu/smu13/smu_v13_0_6_ppt.c
@@ -2158,8 +2158,7 @@ static int smu_v13_0_6_mode1_reset(struct smu_context 
*smu)
 
 static bool smu_v13_0_6_is_mode1_reset_supported(struct smu_context *smu)
 {
-       /* TODO: Enable this when FW support is added */
-       return false;
+       return true;
 }
 
 static bool smu_v13_0_6_is_mode2_reset_supported(struct smu_context *smu)
commit 39c8b93a105678821cbf1674d56bd58d775b932f
Author: Wenjing Liu <wenjing....@amd.com>
Date:   Tue Aug 8 18:49:20 2023 -0400

    Partially revert "drm/amd/display: update add plane to context logic with a 
new algorithm"
    
    This partially reverts commit 460ea8980511 ("drm/amd/display: update add
    plane to context logic with a new algorithm").
    
    The new secondary pipe allocation logic triggers an issue with a
    specific hardware state transition and causes a frame of corruption when
    toggling between windowed MPO and ODM desktop only mode. Ideally hwss is
    supposed to handle this scenario. We are temporarily reverting the logic
    and investigate the root cause why this transition would cause
    corruptions.
    
    Fixes: 460ea8980511 ("drm/amd/display: update add plane to context logic 
with a new algorithm")
    Reviewed-by: Martin Leung <martin.le...@amd.com>
    Acked-by: Hamza Mahfooz <hamza.mahf...@amd.com>
    Signed-off-by: Wenjing Liu <wenjing....@amd.com>
    Signed-off-by: Alex Deucher <alexander.deuc...@amd.com>

diff --git a/drivers/gpu/drm/amd/display/dc/dcn32/dcn32_resource.c 
b/drivers/gpu/drm/amd/display/dc/dcn32/dcn32_resource.c
index 935cd23e6a01..f9d601c8c721 100644
--- a/drivers/gpu/drm/amd/display/dc/dcn32/dcn32_resource.c
+++ b/drivers/gpu/drm/amd/display/dc/dcn32/dcn32_resource.c
@@ -2564,18 +2564,128 @@ static int 
find_optimal_free_pipe_as_secondary_dpp_pipe(
        return free_pipe_idx;
 }
 
+static struct pipe_ctx *find_idle_secondary_pipe_check_mpo(
+               struct resource_context *res_ctx,
+               const struct resource_pool *pool,
+               const struct pipe_ctx *primary_pipe)
+{
+       int i;
+       struct pipe_ctx *secondary_pipe = NULL;
+       struct pipe_ctx *next_odm_mpo_pipe = NULL;
+       int primary_index, preferred_pipe_idx;
+       struct pipe_ctx *old_primary_pipe = NULL;
+
+       /*
+        * Modified from find_idle_secondary_pipe
+        * With windowed MPO and ODM, we want to avoid the case where we want a
+        *  free pipe for the left side but the free pipe is being used on the
+        *  right side.
+        * Add check on current_state if the primary_pipe is the left side,
+        *  to check the right side ( primary_pipe->next_odm_pipe ) to see if
+        *  it is using a pipe for MPO ( 
primary_pipe->next_odm_pipe->bottom_pipe )
+        * - If so, then don't use this pipe
+        * EXCEPTION - 3 plane ( 2 MPO plane ) case
+        * - in this case, the primary pipe has already gotten a free pipe for 
the
+        *  MPO window in the left
+        * - when it tries to get a free pipe for the MPO window on the right,
+        *  it will see that it is already assigned to the right side
+        *  ( primary_pipe->next_odm_pipe ).  But in this case, we want this
+        *  free pipe, since it will be for the right side.  So add an
+        *  additional condition, that skipping the free pipe on the right only
+        *  applies if the primary pipe has no bottom pipe currently assigned
+        */
+       if (primary_pipe) {
+               primary_index = primary_pipe->pipe_idx;
+               old_primary_pipe = 
&primary_pipe->stream->ctx->dc->current_state->res_ctx.pipe_ctx[primary_index];
+               if ((old_primary_pipe->next_odm_pipe) && 
(old_primary_pipe->next_odm_pipe->bottom_pipe)
+                       && (!primary_pipe->bottom_pipe))
+                       next_odm_mpo_pipe = 
old_primary_pipe->next_odm_pipe->bottom_pipe;
+
+               preferred_pipe_idx = (pool->pipe_count - 1) - 
primary_pipe->pipe_idx;
+               if ((res_ctx->pipe_ctx[preferred_pipe_idx].stream == NULL) &&
+                       !(next_odm_mpo_pipe && next_odm_mpo_pipe->pipe_idx == 
preferred_pipe_idx)) {
+                       secondary_pipe = &res_ctx->pipe_ctx[preferred_pipe_idx];
+                       secondary_pipe->pipe_idx = preferred_pipe_idx;
+               }
+       }
+
+       /*
+        * search backwards for the second pipe to keep pipe
+        * assignment more consistent
+        */
+       if (!secondary_pipe)
+               for (i = pool->pipe_count - 1; i >= 0; i--) {
+                       if ((res_ctx->pipe_ctx[i].stream == NULL) &&
+                               !(next_odm_mpo_pipe && 
next_odm_mpo_pipe->pipe_idx == i)) {
+                               secondary_pipe = &res_ctx->pipe_ctx[i];
+                               secondary_pipe->pipe_idx = i;
+                               break;
+                       }
+               }
+
+       return secondary_pipe;
+}
+
+static struct pipe_ctx *dcn32_acquire_idle_pipe_for_head_pipe_in_layer(
+               struct dc_state *state,
+               const struct resource_pool *pool,
+               struct dc_stream_state *stream,
+               const struct pipe_ctx *head_pipe)
+{
+       struct resource_context *res_ctx = &state->res_ctx;
+       struct pipe_ctx *idle_pipe, *pipe;
+       struct resource_context *old_ctx = 
&stream->ctx->dc->current_state->res_ctx;
+       int head_index;
+
+       if (!head_pipe)
+               ASSERT(0);
+
+       /*
+        * Modified from dcn20_acquire_idle_pipe_for_layer
+        * Check if head_pipe in old_context already has bottom_pipe allocated.
+        * - If so, check if that pipe is available in the current context.
+        * --  If so, reuse pipe from old_context
+        */
+       head_index = head_pipe->pipe_idx;
+       pipe = &old_ctx->pipe_ctx[head_index];
+       if (pipe->bottom_pipe && 
res_ctx->pipe_ctx[pipe->bottom_pipe->pipe_idx].stream == NULL) {
+               idle_pipe = &res_ctx->pipe_ctx[pipe->bottom_pipe->pipe_idx];
+               idle_pipe->pipe_idx = pipe->bottom_pipe->pipe_idx;
+       } else {
+               idle_pipe = find_idle_secondary_pipe_check_mpo(res_ctx, pool, 
head_pipe);
+               if (!idle_pipe)
+                       return NULL;
+       }
+
+       idle_pipe->stream = head_pipe->stream;
+       idle_pipe->stream_res.tg = head_pipe->stream_res.tg;
+       idle_pipe->stream_res.opp = head_pipe->stream_res.opp;
+
+       idle_pipe->plane_res.hubp = pool->hubps[idle_pipe->pipe_idx];
+       idle_pipe->plane_res.ipp = pool->ipps[idle_pipe->pipe_idx];
+       idle_pipe->plane_res.dpp = pool->dpps[idle_pipe->pipe_idx];
+       idle_pipe->plane_res.mpcc_inst = pool->dpps[idle_pipe->pipe_idx]->inst;
+
+       return idle_pipe;
+}
+
 struct pipe_ctx *dcn32_acquire_free_pipe_as_secondary_dpp_pipe(
                const struct dc_state *cur_ctx,
                struct dc_state *new_ctx,
                const struct resource_pool *pool,
                const struct pipe_ctx *opp_head_pipe)
 {
-       int free_pipe_idx =
-                       find_optimal_free_pipe_as_secondary_dpp_pipe(
-                                       &cur_ctx->res_ctx, &new_ctx->res_ctx,
-                                       pool, opp_head_pipe);
+
+       int free_pipe_idx;
        struct pipe_ctx *free_pipe;
 
+       if (!opp_head_pipe->stream->ctx->dc->config.enable_windowed_mpo_odm)
+               return dcn32_acquire_idle_pipe_for_head_pipe_in_layer(
+                               new_ctx, pool, opp_head_pipe->stream, 
opp_head_pipe);
+
+       free_pipe_idx = find_optimal_free_pipe_as_secondary_dpp_pipe(
+                                       &cur_ctx->res_ctx, &new_ctx->res_ctx,
+                                       pool, opp_head_pipe);
        if (free_pipe_idx >= 0) {
                free_pipe = &new_ctx->res_ctx.pipe_ctx[free_pipe_idx];
                free_pipe->pipe_idx = free_pipe_idx;
commit 1611917f39bee1abfc01501238db8ac19649042d
Author: Hamza Mahfooz <hamza.mahf...@amd.com>
Date:   Tue Aug 22 12:31:09 2023 -0400

    drm/amd/display: register edp_backlight_control() for DCN301
    
    As made mention of in commit 099303e9a9bd ("drm/amd/display: eDP
    intermittent black screen during PnP"), we need to turn off the
    display's backlight before powering off an eDP display. Not doing so
    will result in undefined behaviour according to the eDP spec. So, set
    DCN301's edp_backlight_control() function pointer to
    dce110_edp_backlight_control().
    
    Cc: sta...@vger.kernel.org
    Link: https://gitlab.freedesktop.org/drm/amd/-/issues/2765
    Fixes: 9c75891feef0 ("drm/amd/display: rework recent update PHY state 
commit")
    Suggested-by: Swapnil Patel <swapnil.pa...@amd.com>
    Reviewed-by: Harry Wentland <harry.wentl...@amd.com>
    Signed-off-by: Hamza Mahfooz <hamza.mahf...@amd.com>
    Signed-off-by: Alex Deucher <alexander.deuc...@amd.com>

diff --git a/drivers/gpu/drm/amd/display/dc/dcn301/dcn301_init.c 
b/drivers/gpu/drm/amd/display/dc/dcn301/dcn301_init.c
index 257df8660b4c..61205cdbe2d5 100644
--- a/drivers/gpu/drm/amd/display/dc/dcn301/dcn301_init.c
+++ b/drivers/gpu/drm/amd/display/dc/dcn301/dcn301_init.c
@@ -75,6 +75,7 @@ static const struct hw_sequencer_funcs dcn301_funcs = {
        .get_hw_state = dcn10_get_hw_state,
        .clear_status_bits = dcn10_clear_status_bits,
        .wait_for_mpcc_disconnect = dcn10_wait_for_mpcc_disconnect,
+       .edp_backlight_control = dce110_edp_backlight_control,
        .edp_power_control = dce110_edp_power_control,
        .edp_wait_for_hpd_ready = dce110_edp_wait_for_hpd_ready,
        .set_cursor_position = dcn10_set_cursor_position,
commit 7c2949c12e6d5c0f054ee884de6e5a6a1794f0a9
Author: Lijo Lazar <lijo.la...@amd.com>
Date:   Wed Jul 19 13:17:22 2023 +0530

    drm/amdgpu: Add bootloader wait for PSP v13
    
    Implement the wait for bootloader call back for PSP v13.0 ASICs. Only
    for ASICs with PSP v13.0.6, it needs an additional check for VBIOS
    mailbox status.
    
    Signed-off-by: Lijo Lazar <lijo.la...@amd.com>
    Reviewed-by: Hawking Zhang <hawking.zh...@amd.com>
    Reviewed-by: Asad Kamal <asad.ka...@amd.com>
    Tested-by: Asad Kamal <asad.ka...@amd.com>
    Signed-off-by: Alex Deucher <alexander.deuc...@amd.com>

diff --git a/drivers/gpu/drm/amd/amdgpu/psp_v13_0.c 
b/drivers/gpu/drm/amd/amdgpu/psp_v13_0.c
index 10b17bd5aebe..d2a88bc630d2 100644
--- a/drivers/gpu/drm/amd/amdgpu/psp_v13_0.c
+++ b/drivers/gpu/drm/amd/amdgpu/psp_v13_0.c
@@ -133,12 +133,35 @@ static bool psp_v13_0_is_sos_alive(struct psp_context 
*psp)
        return sol_reg != 0x0;
 }
 
+static int psp_v13_0_wait_for_vmbx_ready(struct psp_context *psp)
+{
+       struct amdgpu_device *adev = psp->adev;
+       int retry_loop, ret;
+
+       for (retry_loop = 0; retry_loop < 70; retry_loop++) {
+               /* Wait for bootloader to signify that is
+                  ready having bit 31 of C2PMSG_33 set to 1 */
+               ret = psp_wait_for(
+                       psp, SOC15_REG_OFFSET(MP0, 0, regMP0_SMN_C2PMSG_33),
+                       0x80000000, 0xffffffff, false);
+
+               if (ret == 0)
+                       break;
+       }
+
+       if (ret)
+               dev_warn(adev->dev, "Bootloader wait timed out");
+
+       return ret;
+}
+
 static int psp_v13_0_wait_for_bootloader(struct psp_context *psp)
 {
        struct amdgpu_device *adev = psp->adev;
+       int retry_loop, ret;
 
-       int ret;
-       int retry_loop;
+       if (adev->ip_versions[MP0_HWIP][0] == IP_VERSION(13, 0, 6))
+               psp_v13_0_wait_for_vmbx_ready(psp);
 
        /* Wait for bootloader to signify that it is ready having bit 31 of
         * C2PMSG_35 set to 1. All other bits are expected to be cleared.
@@ -714,6 +737,7 @@ static int psp_v13_0_fatal_error_recovery_quirk(struct 
psp_context *psp)
 
 static const struct psp_funcs psp_v13_0_funcs = {
        .init_microcode = psp_v13_0_init_microcode,
+       .wait_for_bootloader = psp_v13_0_wait_for_bootloader,
        .bootloader_load_kdb = psp_v13_0_bootloader_load_kdb,
        .bootloader_load_spl = psp_v13_0_bootloader_load_spl,
        .bootloader_load_sysdrv = psp_v13_0_bootloader_load_sysdrv,
commit 0a611560f53bfd489e33f4a718c915f1a6123d03
Author: Hamza Mahfooz <hamza.mahf...@amd.com>
Date:   Tue Aug 15 09:13:37 2023 -0400

    drm/amdgpu: register a dirty framebuffer callback for fbcon
    
    fbcon requires that we implement &drm_framebuffer_funcs.dirty.
    Otherwise, the framebuffer might take a while to flush (which would
    manifest as noticeable lag). However, we can't enable this callback for
    non-fbcon cases since it may cause too many atomic commits to be made at
    once. So, implement amdgpu_dirtyfb() and only enable it for fbcon
    framebuffers (we can use the "struct drm_file file" parameter in the
    callback to check for this since it is only NULL when called by fbcon,
    at least in the mainline kernel) on devices that support atomic KMS.
    
    Cc: Aurabindo Pillai <aurabindo.pil...@amd.com>
    Cc: Mario Limonciello <mario.limoncie...@amd.com>
    Cc: sta...@vger.kernel.org # 6.1+
    Link: https://gitlab.freedesktop.org/drm/amd/-/issues/2519
    Reviewed-by: Mario Limonciello <mario.limoncie...@amd.com>
    Signed-off-by: Hamza Mahfooz <hamza.mahf...@amd.com>
    Signed-off-by: Alex Deucher <alexander.deuc...@amd.com>

diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_display.c 
b/drivers/gpu/drm/amd/amdgpu/amdgpu_display.c
index d20dd3f852fc..363e6a2cad8c 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_display.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_display.c
@@ -38,6 +38,8 @@
 #include <linux/pci.h>
 #include <linux/pm_runtime.h>
 #include <drm/drm_crtc_helper.h>
+#include <drm/drm_damage_helper.h>
+#include <drm/drm_drv.h>
 #include <drm/drm_edid.h>
 #include <drm/drm_fb_helper.h>
 #include <drm/drm_gem_framebuffer_helper.h>
@@ -532,11 +534,29 @@ bool amdgpu_display_ddc_probe(struct amdgpu_connector 
*amdgpu_connector,
        return true;
 }
 
+static int amdgpu_dirtyfb(struct drm_framebuffer *fb, struct drm_file *file,
+                         unsigned int flags, unsigned int color,
+                         struct drm_clip_rect *clips, unsigned int num_clips)
+{
+
+       if (file)
+               return -ENOSYS;
+
+       return drm_atomic_helper_dirtyfb(fb, file, flags, color, clips,
+                                        num_clips);
+}
+
 static const struct drm_framebuffer_funcs amdgpu_fb_funcs = {
        .destroy = drm_gem_fb_destroy,
        .create_handle = drm_gem_fb_create_handle,
 };
 
+static const struct drm_framebuffer_funcs amdgpu_fb_funcs_atomic = {
+       .destroy = drm_gem_fb_destroy,
+       .create_handle = drm_gem_fb_create_handle,
+       .dirty = amdgpu_dirtyfb
+};
+
 uint32_t amdgpu_display_supported_domains(struct amdgpu_device *adev,
                                          uint64_t bo_flags)
 {
@@ -1139,7 +1159,11 @@ static int amdgpu_display_gem_fb_verify_and_init(struct 
drm_device *dev,
        if (ret)
                goto err;
 
-       ret = drm_framebuffer_init(dev, &rfb->base, &amdgpu_fb_funcs);
+       if (drm_drv_uses_atomic_modeset(dev))
+               ret = drm_framebuffer_init(dev, &rfb->base,
+                                          &amdgpu_fb_funcs_atomic);
+       else
+               ret = drm_framebuffer_init(dev, &rfb->base, &amdgpu_fb_funcs);
 
        if (ret)
                goto err;
commit 7b9f62353024fbf69e1df45f2df87d3cfe0806e9
Author: Mangesh Gadre <mangesh.ga...@amd.com>
Date:   Mon Aug 21 18:26:24 2023 +0800

    drm/amdgpu: Updated TCP/UTCL1 programming
    
    Update TCP/UTCL1 thrashing control settings
    
    v2: updated rev_id check
    
    Signed-off-by: Mangesh Gadre <mangesh.ga...@amd.com>
    Reviewed-by: Hawking Zhang <hawking.zh...@amd.com>
    Reviewed-by: Lijo Lazar <lijo.la...@amd.com>
    Signed-off-by: Alex Deucher <alexander.deuc...@amd.com>

diff --git a/drivers/gpu/drm/amd/amdgpu/gfx_v9_4_3.c 
b/drivers/gpu/drm/amd/amdgpu/gfx_v9_4_3.c
index a60429c3e93c..b4fdb269f856 100644
--- a/drivers/gpu/drm/amd/amdgpu/gfx_v9_4_3.c
+++ b/drivers/gpu/drm/amd/amdgpu/gfx_v9_4_3.c
@@ -203,6 +203,9 @@ static void gfx_v9_4_3_init_golden_registers(struct 
amdgpu_device *adev)
                if (adev->rev_id == 0) {
                        WREG32_FIELD15_PREREG(GC, dev_inst, TCP_UTCL1_CNTL1,
                                              REDUCE_FIFO_DEPTH_BY_2, 2);
+               } else {
+                       WREG32_FIELD15_PREREG(GC, dev_inst, TCP_UTCL1_CNTL2,
+                                               SPARE, 0x1);
                }
        }
 }
commit a7dd9b97fd5b12549721bbdc7977b5671870f4bb
Author: Alex Deucher <alexander.deuc...@amd.com>
Date:   Fri Aug 18 15:18:07 2023 -0400

    drm/amd/pm: fix debugfs pm_info output
    
    Print both input and avg power.
    
    Fixes: 47f1724db4fe ("drm/amd: Introduce 
`AMDGPU_PP_SENSOR_GPU_INPUT_POWER`")
    Reviewed-by: Guchun Chen <guchun.c...@amd.com>
    Signed-off-by: Alex Deucher <alexander.deuc...@amd.com>

diff --git a/drivers/gpu/drm/amd/pm/amdgpu_pm.c 
b/drivers/gpu/drm/amd/pm/amdgpu_pm.c
index f03647fa3df6..41147da54458 100644
--- a/drivers/gpu/drm/amd/pm/amdgpu_pm.c
+++ b/drivers/gpu/drm/amd/pm/amdgpu_pm.c
@@ -3471,6 +3471,9 @@ static int amdgpu_debugfs_pm_info_pp(struct seq_file *m, 
struct amdgpu_device *a
        size = sizeof(uint32_t);
        if (!amdgpu_dpm_read_sensor(adev, AMDGPU_PP_SENSOR_GPU_AVG_POWER, (void 
*)&query, &size))
                seq_printf(m, "\t%u.%u W (average GPU)\n", query >> 8, query & 
0xff);
+       size = sizeof(uint32_t);
+       if (!amdgpu_dpm_read_sensor(adev, AMDGPU_PP_SENSOR_GPU_INPUT_POWER, 
(void *)&query, &size))
+               seq_printf(m, "\t%u.%u W (current GPU)\n", query >> 8, query & 
0xff);
        size = sizeof(value);
        seq_printf(m, "\n");
 
commit 7d4424373daacf3b0938d6278136678060690096
Author: Hawking Zhang <hawking.zh...@amd.com>
Date:   Sat Aug 19 14:15:08 2023 +0800

    drm/amdgpu: Fix the return for gpu mode1_reset
    
    amdgpu_device_mode1_reset will return gpu mode1_reset
    succeed (ret = 0) as long as wait_for_bootloader call
    succeed, regardless of the status reported by smu or
    psp firmware. This results to driver continue executing
    recovery even smu or psp fail to perform mode1 reset.
    
    Signed-off-by: Hawking Zhang <hawking.zh...@amd.com>
    Reviewed-by: Asad Kamal <asad.ka...@amd.com>
    Signed-off-by: Alex Deucher <alexander.deuc...@amd.com>

diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c 
b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
index 5586146b8c76..533daba2accb 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
@@ -4701,12 +4701,12 @@ int amdgpu_device_mode1_reset(struct amdgpu_device 
*adev)
        }
 
        if (ret)
-               dev_err(adev->dev, "GPU mode1 reset failed\n");
+               goto mode1_reset_failed;
 
        amdgpu_device_load_pci_state(adev->pdev);
        ret = amdgpu_psp_wait_for_bootloader(adev);
        if (ret)
-               return ret;
+               goto mode1_reset_failed;
 
        /* wait for asic to come out of reset */
        for (i = 0; i < adev->usec_timeout; i++) {
@@ -4717,8 +4717,17 @@ int amdgpu_device_mode1_reset(struct amdgpu_device *adev)
                udelay(1);
        }
 
+       if (i >= adev->usec_timeout) {
+               ret = -ETIMEDOUT;
+               goto mode1_reset_failed;
+       }
+
        amdgpu_atombios_scratch_regs_engine_hung(adev, false);
 
+       return 0;
+
+mode1_reset_failed:
+       dev_err(adev->dev, "GPU mode1 reset failed\n");
        return ret;
 }
 
commit a9366b944bfdca3c60e463869c8bdb7136b5b6ec
Author: SungHuai Wang <danny.w...@amd.com>
Date:   Fri Aug 11 11:15:37 2023 +0800

    drm/amd/display: fix static screen detection setting
    
    [WHY]
    OTG_STATIC_SCREEN_EVENT_MASK is changed in DCN3,
    but we still follow DCN2 to apply setting for
    OTG_STATIC_SCREEN_EVENT_MASK.
    
    [How]
    Add new function to apply correct settings for DCN3 series.
    
    Reviewed-by: Anthony Koo <anthony....@amd.com>
    Acked-by: Wayne Lin <wayne....@amd.com>
    Signed-off-by: SungHuai Wang <danny.w...@amd.com>
    Tested-by: Daniel Wheeler <daniel.whee...@amd.com>
    Signed-off-by: Alex Deucher <alexander.deuc...@amd.com>

diff --git a/drivers/gpu/drm/amd/display/dc/dcn30/dcn30_hwseq.c 
b/drivers/gpu/drm/amd/display/dc/dcn30/dcn30_hwseq.c
index 6cef62d7a2e5..255713ec29bb 100644
--- a/drivers/gpu/drm/amd/display/dc/dcn30/dcn30_hwseq.c
+++ b/drivers/gpu/drm/amd/display/dc/dcn30/dcn30_hwseq.c
@@ -987,3 +987,20 @@ void dcn30_prepare_bandwidth(struct dc *dc,
        }
 }
 
+void dcn30_set_static_screen_control(struct pipe_ctx **pipe_ctx,
+               int num_pipes, const struct dc_static_screen_params *params)
+{
+       unsigned int i;
+       unsigned int triggers = 0;
+
+       if (params->triggers.surface_update)
+               triggers |= 0x100;
+       if (params->triggers.cursor_update)
+               triggers |= 0x8;
+       if (params->triggers.force_trigger)
+               triggers |= 0x1;
+
+       for (i = 0; i < num_pipes; i++)
+               
pipe_ctx[i]->stream_res.tg->funcs->set_static_screen_control(pipe_ctx[i]->stream_res.tg,
+                                       triggers, params->num_frames);
+}
diff --git a/drivers/gpu/drm/amd/display/dc/dcn30/dcn30_hwseq.h 
b/drivers/gpu/drm/amd/display/dc/dcn30/dcn30_hwseq.h
index a24a8e33a3d2..ce19c54097f8 100644
--- a/drivers/gpu/drm/amd/display/dc/dcn30/dcn30_hwseq.h
+++ b/drivers/gpu/drm/amd/display/dc/dcn30/dcn30_hwseq.h
@@ -87,5 +87,7 @@ void dcn30_set_hubp_blank(const struct dc *dc,
 void dcn30_prepare_bandwidth(struct dc *dc,
        struct dc_state *context);
 
+void dcn30_set_static_screen_control(struct pipe_ctx **pipe_ctx,
+               int num_pipes, const struct dc_static_screen_params *params);
 
 #endif /* __DC_HWSS_DCN30_H__ */
diff --git a/drivers/gpu/drm/amd/display/dc/dcn30/dcn30_init.c 
b/drivers/gpu/drm/amd/display/dc/dcn30/dcn30_init.c
index 3d19acaa12f3..0de8b2783cf6 100644
--- a/drivers/gpu/drm/amd/display/dc/dcn30/dcn30_init.c
+++ b/drivers/gpu/drm/amd/display/dc/dcn30/dcn30_init.c
@@ -64,7 +64,7 @@ static const struct hw_sequencer_funcs dcn30_funcs = {
        .update_bandwidth = dcn20_update_bandwidth,
        .set_drr = dcn10_set_drr,
        .get_position = dcn10_get_position,
-       .set_static_screen_control = dcn10_set_static_screen_control,
+       .set_static_screen_control = dcn30_set_static_screen_control,
        .setup_stereo = dcn10_setup_stereo,
        .set_avmute = dcn30_set_avmute,
        .log_hw_state = dcn10_log_hw_state,
diff --git a/drivers/gpu/drm/amd/display/dc/dcn31/dcn31_init.c 
b/drivers/gpu/drm/amd/display/dc/dcn31/dcn31_init.c
index fc25cc300a17..1d7bc1e39afe 100644
--- a/drivers/gpu/drm/amd/display/dc/dcn31/dcn31_init.c
+++ b/drivers/gpu/drm/amd/display/dc/dcn31/dcn31_init.c
@@ -67,7 +67,7 @@ static const struct hw_sequencer_funcs dcn31_funcs = {
        .update_bandwidth = dcn20_update_bandwidth,
        .set_drr = dcn10_set_drr,
        .get_position = dcn10_get_position,
-       .set_static_screen_control = dcn10_set_static_screen_control,
+       .set_static_screen_control = dcn30_set_static_screen_control,
        .setup_stereo = dcn10_setup_stereo,
        .set_avmute = dcn30_set_avmute,
        .log_hw_state = dcn10_log_hw_state,
diff --git a/drivers/gpu/drm/amd/display/dc/dcn314/dcn314_init.c 
b/drivers/gpu/drm/amd/display/dc/dcn314/dcn314_init.c
index ca8fe55c33b8..4ef85c3a0688 100644
--- a/drivers/gpu/drm/amd/display/dc/dcn314/dcn314_init.c
+++ b/drivers/gpu/drm/amd/display/dc/dcn314/dcn314_init.c
@@ -69,7 +69,7 @@ static const struct hw_sequencer_funcs dcn314_funcs = {
        .update_bandwidth = dcn20_update_bandwidth,
        .set_drr = dcn10_set_drr,
        .get_position = dcn10_get_position,
-       .set_static_screen_control = dcn10_set_static_screen_control,
+       .set_static_screen_control = dcn30_set_static_screen_control,
        .setup_stereo = dcn10_setup_stereo,
        .set_avmute = dcn30_set_avmute,
        .log_hw_state = dcn10_log_hw_state,
diff --git a/drivers/gpu/drm/amd/display/dc/dcn32/dcn32_init.c 
b/drivers/gpu/drm/amd/display/dc/dcn32/dcn32_init.c
index 777b2fac20c4..c7417147dff1 100644
--- a/drivers/gpu/drm/amd/display/dc/dcn32/dcn32_init.c
+++ b/drivers/gpu/drm/amd/display/dc/dcn32/dcn32_init.c
@@ -65,7 +65,7 @@ static const struct hw_sequencer_funcs dcn32_funcs = {
        .update_bandwidth = dcn20_update_bandwidth,
        .set_drr = dcn10_set_drr,
        .get_position = dcn10_get_position,
-       .set_static_screen_control = dcn10_set_static_screen_control,
+       .set_static_screen_control = dcn30_set_static_screen_control,
        .setup_stereo = dcn10_setup_stereo,
        .set_avmute = dcn30_set_avmute,
        .log_hw_state = dcn10_log_hw_state,
commit ea7971af7a911a7a388b4c47db2a231a6b8dcc29
Author: Hamza Mahfooz <hamza.mahf...@amd.com>
Date:   Fri Aug 18 09:11:11 2023 -0400

    drm/amd/display: fix mode scaling (RMX_.*)
    
    As made mention of in commit 4a2df0d1f28e ("drm/amd/display: Fixed
    non-native modes not lighting up"), we shouldn't call
    drm_mode_set_crtcinfo() once the crtc timings have been decided. Since,
    it can cause settings to be unintentionally overwritten. So, since
    dm_state is never NULL now, we can use old_stream to determine if we
    should call drm_mode_set_crtcinfo() because we only need to set the crtc
    timing parameters for entirely new streams.
    
    Cc: Harry Wentland <harry.wentl...@amd.com>
    Cc: Rodrigo Siqueira <rodrigo.sique...@amd.com>
    Fixes: bd49f19039c1 ("drm/amd/display: Always set crtcinfo from 
create_stream_for_sink")
    Reviewed-by: Harry Wentland <harry.wentl...@amd.com>
    Signed-off-by: Hamza Mahfooz <hamza.mahf...@amd.com>
    Signed-off-by: Alex Deucher <alexander.deuc...@amd.com>

diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c 
b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
index f2b4f1720abd..88ba8b66de1f 100644
--- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
+++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
@@ -6026,7 +6026,7 @@ create_stream_for_sink(struct amdgpu_dm_connector 
*aconnector,
 
        if (recalculate_timing)
                drm_mode_set_crtcinfo(&saved_mode, 0);
-       else
+       else if (!old_stream)
                drm_mode_set_crtcinfo(&mode, 0);
 
        /*
commit e1c0d2e7066b5675cb62daa2f7cb3899756f789c
Author: Asad Kamal <asad.ka...@amd.com>
Date:   Fri Aug 18 18:23:36 2023 +0800

    drm/amd/pm: Fix critical temp unit of SMU v13.0.6
    
    Critical Temperature needs to be reported in
    millidegree Celsius.
    
    Signed-off-by: Asad Kamal <asad.ka...@amd.com>
    Reviewed-by: Yang Wang <kevinyang.w...@amd.com>
    Reviewed-by: Lijo Lazar <lijo.la...@amd.com>
    Signed-off-by: Alex Deucher <alexander.deuc...@amd.com>

diff --git a/drivers/gpu/drm/amd/pm/swsmu/smu13/smu_v13_0_6_ppt.c 
b/drivers/gpu/drm/amd/pm/swsmu/smu13/smu_v13_0_6_ppt.c
index 7d8af9b309b7..d3b578e6bc2a 100644
--- a/drivers/gpu/drm/amd/pm/swsmu/smu13/smu_v13_0_6_ppt.c
+++ b/drivers/gpu/drm/amd/pm/swsmu/smu13/smu_v13_0_6_ppt.c
@@ -2086,7 +2086,7 @@ static int 
smu_v13_0_6_get_thermal_temperature_range(struct smu_context *smu,
                                                     struct 
smu_temperature_range *range)
 {
        struct amdgpu_device *adev = smu->adev;
-       u32 aid_temp, xcd_temp;
+       u32 aid_temp, xcd_temp, mem_temp;
        uint32_t smu_version;
        u32 ccd_temp = 0;
        int ret;
@@ -2119,13 +2119,14 @@ static int 
smu_v13_0_6_get_thermal_temperature_range(struct smu_context *smu,
        if (ret)
                goto failed;
 
-       range->hotspot_crit_max = max3(aid_temp, xcd_temp, ccd_temp);
+       range->hotspot_crit_max = max3(aid_temp, xcd_temp, ccd_temp) *
+                                      SMU_TEMPERATURE_UNITS_PER_CENTIGRADES;
        ret = smu_cmn_send_smc_msg_with_param(smu, SMU_MSG_GetCTFLimit,
-                                             PPSMC_HBM_THM_TYPE, 
&range->mem_crit_max);
+                                             PPSMC_HBM_THM_TYPE, &mem_temp);
        if (ret)
                goto failed;
 
-       return 0;
+       range->mem_crit_max = mem_temp * SMU_TEMPERATURE_UNITS_PER_CENTIGRADES;
 failed:
        return ret;
 }
commit 3f16096795dff2ae6c91653338d507fc91905160
Author: Mangesh Gadre <mangesh.ga...@amd.com>
Date:   Wed Aug 16 12:57:28 2023 +0800

    drm/amdgpu: Remove SRAM clock gater override by driver
    
    rlc firmware does required setting, driver need not do it.
    
    Signed-off-by: Mangesh Gadre <mangesh.ga...@amd.com>
    Reviewed-by: Lijo Lazar <lijo.la...@amd.com>
    Reviewed-by: Hawking Zhang <hawking.zh...@amd.com>
    Signed-off-by: Alex Deucher <alexander.deuc...@amd.com>

diff --git a/drivers/gpu/drm/amd/amdgpu/gfx_v9_4_3.c 
b/drivers/gpu/drm/amd/amdgpu/gfx_v9_4_3.c
index 57ed4e5c294c..a60429c3e93c 100644
--- a/drivers/gpu/drm/amd/amdgpu/gfx_v9_4_3.c
+++ b/drivers/gpu/drm/amd/amdgpu/gfx_v9_4_3.c
@@ -2219,15 +2219,6 @@ static void gfx_v9_4_3_xcc_update_sram_fgcg(struct 
amdgpu_device *adev,
                WREG32_SOC15(GC, GET_INST(GC, xcc_id),
                             regRLC_CGTT_MGCG_OVERRIDE, data);
 
-       def = data = RREG32_SOC15(GC, GET_INST(GC, xcc_id), regRLC_CLK_CNTL);
-
-       if (enable)
-               data &= ~RLC_CLK_CNTL__RLC_SRAM_CLK_GATER_OVERRIDE_MASK;
-       else
-               data |= RLC_CLK_CNTL__RLC_SRAM_CLK_GATER_OVERRIDE_MASK;
-
-       if (def != data)
-               WREG32_SOC15(GC, GET_INST(GC, xcc_id), regRLC_CLK_CNTL, data);
 }
 
 static void gfx_v9_4_3_xcc_update_repeater_fgcg(struct amdgpu_device *adev,
commit 7656168a8a83f8fc6d062d944fd52d18d4da05d7
Author: Lijo Lazar <lijo.la...@amd.com>
Date:   Wed Jul 19 13:03:25 2023 +0530

    drm/amdgpu: Add bootloader status check
    
    Add a function to wait till bootloader has reached steady state.
    
    Signed-off-by: Lijo Lazar <lijo.la...@amd.com>
    Reviewed-by: Hawking Zhang <hawking.zh...@amd.com>
    Reviewed-by: Asad Kamal <asad.ka...@amd.com>
    Tested-by: Asad Kamal <asad.ka...@amd.com>
    Signed-off-by: Alex Deucher <alexander.deuc...@amd.com>

diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c 
b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
index e77f048c99d8..5586146b8c76 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
@@ -885,13 +885,20 @@ static void amdgpu_block_invalid_wreg(struct 
amdgpu_device *adev,
  */
 static int amdgpu_device_asic_init(struct amdgpu_device *adev)
 {
+       int ret;
+
        amdgpu_asic_pre_asic_init(adev);
 
        if (adev->ip_versions[GC_HWIP][0] == IP_VERSION(9, 4, 3) ||
-           adev->ip_versions[GC_HWIP][0] >= IP_VERSION(11, 0, 0))
-               return amdgpu_atomfirmware_asic_init(adev, true);
-       else
+           adev->ip_versions[GC_HWIP][0] >= IP_VERSION(11, 0, 0)) {
+               amdgpu_psp_wait_for_bootloader(adev);
+               ret = amdgpu_atomfirmware_asic_init(adev, true);
+               return ret;
+       } else {
                return amdgpu_atom_asic_init(adev->mode_info.atom_context);
+       }
+
+       return 0;
 }
 
 /**
@@ -4697,6 +4704,9 @@ int amdgpu_device_mode1_reset(struct amdgpu_device *adev)
                dev_err(adev->dev, "GPU mode1 reset failed\n");
 
        amdgpu_device_load_pci_state(adev->pdev);
+       ret = amdgpu_psp_wait_for_bootloader(adev);
+       if (ret)
+               return ret;
 
        /* wait for asic to come out of reset */
        for (i = 0; i < adev->usec_timeout; i++) {
@@ -4708,6 +4718,7 @@ int amdgpu_device_mode1_reset(struct amdgpu_device *adev)
        }
 
        amdgpu_atombios_scratch_regs_engine_hung(adev, false);
+
        return ret;
 }
 
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_psp.c 
b/drivers/gpu/drm/amd/amdgpu/amdgpu_psp.c
index 8fdca54bb8a1..429ef212c1f2 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_psp.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_psp.c
@@ -2078,6 +2078,17 @@ int psp_securedisplay_invoke(struct psp_context *psp, 
uint32_t ta_cmd_id)
 }
 /* SECUREDISPLAY end */
 
+int amdgpu_psp_wait_for_bootloader(struct amdgpu_device *adev)
+{
+       struct psp_context *psp = &adev->psp;
+       int ret = 0;
+
+       if (!amdgpu_sriov_vf(adev) && psp->funcs && 
psp->funcs->wait_for_bootloader != NULL)
+               ret = psp->funcs->wait_for_bootloader(psp);
+
+       return ret;
+}
+
 static int psp_hw_start(struct psp_context *psp)
 {
        struct amdgpu_device *adev = psp->adev;
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_psp.h 
b/drivers/gpu/drm/amd/amdgpu/amdgpu_psp.h
index 3384eb94fde0..3e67ed63e638 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_psp.h
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_psp.h
@@ -109,6 +109,7 @@ enum psp_reg_prog_id {
 
 struct psp_funcs {
        int (*init_microcode)(struct psp_context *psp);
+       int (*wait_for_bootloader)(struct psp_context *psp);
        int (*bootloader_load_kdb)(struct psp_context *psp);
        int (*bootloader_load_spl)(struct psp_context *psp);
        int (*bootloader_load_sysdrv)(struct psp_context *psp);
@@ -533,4 +534,6 @@ int psp_spatial_partition(struct psp_context *psp, int 
mode);
 
 int is_psp_fw_valid(struct psp_bin_desc bin);
 
+int amdgpu_psp_wait_for_bootloader(struct amdgpu_device *adev);
+
 #endif
commit 8c97e87c13d9d181c14545864dbf6bbbd83f639b
Author: Horace Chen <horace.c...@amd.com>
Date:   Thu Aug 17 17:38:29 2023 +0800

    drm/amdkfd: use correct method to get clock under SRIOV
    
    [What]
    Current SRIOV still using adev->clock.default_XX which gets from
    atomfirmware. But these fields are abandoned in atomfirmware long ago.
    Which may cause function to return a 0 value.
    
    [How]
    We don't need to check whether SR-IOV. For SR-IOV one-vf-mode,
    pm is enabled and VF is able to read dpm clock
    from pmfw, so we can use dpm clock interface directly. For
    multi-VF mode, VF pm is disabled, so driver can just react as pm
    disabled. One-vf-mode is introduced from GFX9 so it shall not have
    any backward compatibility issue.
    
    Signed-off-by: Horace Chen <horace.c...@amd.com>
    Acked-by: Felix Kuehling <felix.kuehl...@amd.com>
    Signed-off-by: Alex Deucher <alexander.deuc...@amd.com>

diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.c 
b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.c
index df633e9ce920..cdf6087706aa 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.c
@@ -442,9 +442,7 @@ void amdgpu_amdkfd_get_local_mem_info(struct amdgpu_device 
*adev,
                        mem_info->local_mem_size_public,
                        mem_info->local_mem_size_private);
 
-       if (amdgpu_sriov_vf(adev))
-               mem_info->mem_clk_max = adev->clock.default_mclk / 100;
-       else if (adev->pm.dpm_enabled) {
+       if (adev->pm.dpm_enabled) {
                if (amdgpu_emu_mode == 1)
                        mem_info->mem_clk_max = 0;
                else
@@ -463,9 +461,7 @@ uint64_t amdgpu_amdkfd_get_gpu_clock_counter(struct 
amdgpu_device *adev)
 uint32_t amdgpu_amdkfd_get_max_engine_clock_in_mhz(struct amdgpu_device *adev)
 {
        /* the sclk is in quantas of 10kHz */
-       if (amdgpu_sriov_vf(adev))
-               return adev->clock.default_sclk / 100;
-       else if (adev->pm.dpm_enabled)
+       if (adev->pm.dpm_enabled)
                return amdgpu_dpm_get_sclk(adev, false) / 100;
        else
                return 100;
commit 8f1778939b2f22664737a44aa5acf0308bb6518d
Author: Lijo Lazar <lijo.la...@amd.com>
Date:   Fri Jul 14 17:02:45 2023 +0530

    drm/amdgpu: Unset baco dummy mode on nbio v7.9
    
    BACO dummy mode could be set under reset conditions and that affects
    framebuffer access. Check If baco dummy mode is set, unset it if so.
    
    Signed-off-by: Lijo Lazar <lijo.la...@amd.com>
    Signed-off-by: Le Ma <le...@amd.com>
    Reviewed-by: Hawking Zhang <hawking.zh...@amd.com>
    Reviewed-by: Asad Kamal <asad.ka...@amd.com>
    Tested-by: Asad Kamal <asad.ka...@amd.com>
    Signed-off-by: Alex Deucher <alexander.deuc...@amd.com>

diff --git a/drivers/gpu/drm/amd/amdgpu/nbio_v7_9.c 
b/drivers/gpu/drm/amd/amdgpu/nbio_v7_9.c
index 9ea072374cb7..f85eec05d218 100644
--- a/drivers/gpu/drm/amd/amdgpu/nbio_v7_9.c
+++ b/drivers/gpu/drm/amd/amdgpu/nbio_v7_9.c
@@ -437,6 +437,24 @@ static void nbio_v7_9_init_registers(struct amdgpu_device 
*adev)
                        XCC_DOORBELL_FENCE__SHUB_SLV_MODE_MASK);
 
        }
+
+       if (!amdgpu_sriov_vf(adev)) {
+               u32 baco_cntl;
+               for_each_inst(i, adev->aid_mask) {
+                       baco_cntl = RREG32_SOC15(NBIO, i, regBIF_BX0_BACO_CNTL);
+                       if (baco_cntl & (BIF_BX0_BACO_CNTL__BACO_DUMMY_EN_MASK |
+                                        BIF_BX0_BACO_CNTL__BACO_EN_MASK)) {
+                               baco_cntl &= ~(
+                                       BIF_BX0_BACO_CNTL__BACO_DUMMY_EN_MASK |
+                                       BIF_BX0_BACO_CNTL__BACO_EN_MASK);
+                               dev_dbg(adev->dev,
+                                       "Unsetting baco dummy mode %x",
+                                       baco_cntl);
+                               WREG32_SOC15(NBIO, i, regBIF_BX0_BACO_CNTL,
+                                            baco_cntl);
+                       }
+               }
+       }
 }
 
 static u64 nbio_v7_9_get_pcie_replay_count(struct amdgpu_device *adev)
commit ed6445f5894dc5a952766725b0689451a58fcfd8
Author: ChunTao Tso <chuntao....@amd.com>
Date:   Fri Aug 4 14:57:44 2023 +0800

    drm/amd/display: set minimum of VBlank_nom
    
    [Why]
    If VBlank_nom is too small, it will cause
    VStartUP_Start smaller than VBackPorch + VSync width which is an
    invalid case for VStartUP_Start and where to send AS-SDP.
    
    [How]
    Setup a minimum value to VBlank_nom
    
    Reviewed-by: Reza Amini <reza.am...@amd.com>
    Acked-by: Wayne Lin <wayne....@amd.com>
    Signed-off-by: ChunTao Tso <chuntao....@amd.com>
    Tested-by: Daniel Wheeler <daniel.whee...@amd.com>
    Signed-off-by: Alex Deucher <alexander.deuc...@amd.com>

diff --git a/drivers/gpu/drm/amd/display/dc/dml/dcn314/dcn314_fpu.c 
b/drivers/gpu/drm/amd/display/dc/dml/dcn314/dcn314_fpu.c
index 07adb614366e..fb21572750e8 100644
--- a/drivers/gpu/drm/amd/display/dc/dml/dcn314/dcn314_fpu.c
+++ b/drivers/gpu/drm/amd/display/dc/dml/dcn314/dcn314_fpu.c
@@ -293,6 +293,17 @@ static unsigned int micro_sec_to_vert_lines(unsigned int 
num_us, struct dc_crtc_
        return num_lines;
 }
 
+static unsigned int get_vertical_back_porch(struct dc_crtc_timing *timing)
+{
+       unsigned int v_active = 0, v_blank = 0, v_back_porch = 0;
+
+       v_active = timing->v_border_top + timing->v_addressable + 
timing->v_border_bottom;
+       v_blank = timing->v_total - v_active;
+       v_back_porch = v_blank - timing->v_front_porch - timing->v_sync_width;
+
+       return v_back_porch;
+}
+
 int dcn314_populate_dml_pipes_from_context_fpu(struct dc *dc, struct dc_state 
*context,
                                               display_e2e_pipe_params_st 
*pipes,
                                               bool fast_validate)
@@ -310,6 +321,7 @@ int dcn314_populate_dml_pipes_from_context_fpu(struct dc 
*dc, struct dc_state *c
        for (i = 0, pipe_cnt = 0; i < dc->res_pool->pipe_count; i++) {
                struct dc_crtc_timing *timing;
                unsigned int num_lines = 0;
+               unsigned int v_back_porch = 0;
 
                if (!res_ctx->pipe_ctx[i].stream)
                        continue;
@@ -323,9 +335,16 @@ int dcn314_populate_dml_pipes_from_context_fpu(struct dc 
*dc, struct dc_state *c
                else
                        pipes[pipe_cnt].pipe.dest.vtotal = timing->v_total;
 
+               v_back_porch  = get_vertical_back_porch(timing);
+
                pipes[pipe_cnt].pipe.dest.vblank_nom = timing->v_total - 
pipes[pipe_cnt].pipe.dest.vactive;
                pipes[pipe_cnt].pipe.dest.vblank_nom = 
min(pipes[pipe_cnt].pipe.dest.vblank_nom, num_lines);
-               pipes[pipe_cnt].pipe.dest.vblank_nom = 
max(pipes[pipe_cnt].pipe.dest.vblank_nom, timing->v_sync_width);
+               // vblank_nom should not smaller than (VSync 
(timing->v_sync_width + v_back_porch) + 2)
+               // + 2 is because
+               // 1 -> VStartup_start should be 1 line before VSync
+               // 1 -> always reserve 1 line between start of vblank to 
vstartup signal
+               pipes[pipe_cnt].pipe.dest.vblank_nom =
+                       max(pipes[pipe_cnt].pipe.dest.vblank_nom, 
timing->v_sync_width + v_back_porch + 2);
                pipes[pipe_cnt].pipe.dest.vblank_nom = 
min(pipes[pipe_cnt].pipe.dest.vblank_nom, max_allowed_vblank_nom);
 
                if (pipe->plane_state &&
commit 8f31c7be3e89634767686ffab869cd3ebfea188f
Author: Reza Amini <reza.am...@amd.com>
Date:   Fri Jul 14 10:43:05 2023 -0400

    drm/amd/display: Correct unit conversion for vstartup
    
    [why]
    vstartup is calculated to be a large number. it works because
    it is within vertical blank, but it reduces region of blank that
    can be used for power gating.
    
    [how]
    Calculation needs to convert micro seconds to number of
    vertical lines.
    
    Reviewed-by: Kazlauskas Nicholas <nicholas.kazlaus...@amd.com>
    Acked-by: Wayne Lin <wayne....@amd.com>
    Signed-off-by: Reza Amini <reza.am...@amd.com>
    Tested-by: Daniel Wheeler <daniel.whee...@amd.com>
    Signed-off-by: Alex Deucher <alexander.deuc...@amd.com>

diff --git a/drivers/gpu/drm/amd/display/dc/dml/dcn314/dcn314_fpu.c 
b/drivers/gpu/drm/amd/display/dc/dml/dcn314/dcn314_fpu.c
index ed8ddb75b333..07adb614366e 100644
--- a/drivers/gpu/drm/amd/display/dc/dml/dcn314/dcn314_fpu.c
+++ b/drivers/gpu/drm/amd/display/dc/dml/dcn314/dcn314_fpu.c
@@ -31,6 +31,7 @@
 #include "dml/dcn20/dcn20_fpu.h"
 #include "dml/dcn31/dcn31_fpu.h"
 #include "dml/display_mode_vba.h"
+#include "dml/dml_inline_defs.h"
 
 struct _vcs_dpi_ip_params_st dcn3_14_ip = {
        .VBlankNomDefaultUS = 668,
@@ -273,6 +274,25 @@ static bool is_dual_plane(enum surface_pixel_format format)
        return format >= SURFACE_PIXEL_FORMAT_VIDEO_BEGIN || format == 
SURFACE_PIXEL_FORMAT_GRPH_RGBE_ALPHA;
 }
 
+/*
+ * micro_sec_to_vert_lines () - converts time to number of vertical lines for 
a given timing
+ *
+ * @param: num_us: number of microseconds
+ * @return: number of vertical lines. If exact number of vertical lines is not 
found then
+ *          it will round up to next number of lines to guarantee num_us
+ */
+static unsigned int micro_sec_to_vert_lines(unsigned int num_us, struct 
dc_crtc_timing *timing)
+{
+       unsigned int num_lines = 0;
+       unsigned int lines_time_in_ns = 1000.0 *
+                       (((float)timing->h_total * 1000.0) /
+                        ((float)timing->pix_clk_100hz / 10.0));
+
+       num_lines = dml_ceil(1000.0 * num_us / lines_time_in_ns, 1.0);
+
+       return num_lines;
+}
+
 int dcn314_populate_dml_pipes_from_context_fpu(struct dc *dc, struct dc_state 
*context,
                                               display_e2e_pipe_params_st 
*pipes,
                                               bool fast_validate)
@@ -289,19 +309,22 @@ int dcn314_populate_dml_pipes_from_context_fpu(struct dc 
*dc, struct dc_state *c
 
        for (i = 0, pipe_cnt = 0; i < dc->res_pool->pipe_count; i++) {
                struct dc_crtc_timing *timing;
+               unsigned int num_lines = 0;
 
                if (!res_ctx->pipe_ctx[i].stream)
                        continue;
                pipe = &res_ctx->pipe_ctx[i];
                timing = &pipe->stream->timing;
 
+               num_lines = 
micro_sec_to_vert_lines(dcn3_14_ip.VBlankNomDefaultUS, timing);
+
                if (pipe->stream->adjust.v_total_min != 0)
                        pipes[pipe_cnt].pipe.dest.vtotal = 
pipe->stream->adjust.v_total_min;
                else
                        pipes[pipe_cnt].pipe.dest.vtotal = timing->v_total;
 
                pipes[pipe_cnt].pipe.dest.vblank_nom = timing->v_total - 
pipes[pipe_cnt].pipe.dest.vactive;
-               pipes[pipe_cnt].pipe.dest.vblank_nom = 
min(pipes[pipe_cnt].pipe.dest.vblank_nom, dcn3_14_ip.VBlankNomDefaultUS);
+               pipes[pipe_cnt].pipe.dest.vblank_nom = 
min(pipes[pipe_cnt].pipe.dest.vblank_nom, num_lines);
                pipes[pipe_cnt].pipe.dest.vblank_nom = 
max(pipes[pipe_cnt].pipe.dest.vblank_nom, timing->v_sync_width);
                pipes[pipe_cnt].pipe.dest.vblank_nom = 
min(pipes[pipe_cnt].pipe.dest.vblank_nom, max_allowed_vblank_nom);
 
commit bab9bec6b6fb6d24f6c9205628cd9c46d768e5c1
Author: Ovidiu Bunea <ovidiu.bu...@amd.com>
Date:   Wed Aug 9 11:55:14 2023 -0400

    drm/amd/display: Roll back unit correction
    
    [why]
    This Unit correction exposes a Replay corruption.
    
    [how]
    This reverts commit:
    commit dbd29029c7b5 ("drm/amd/display: Correct unit conversion for 
vstartup")
    
    Roll back unit conversion until Replay can fix their corruption.
    
    Fixes: dbd29029c7b5 ("drm/amd/display: Correct unit conversion for 
vstartup")
    Reviewed-by: Reza Amini <reza.am...@amd.com>
    Acked-by: Wayne Lin <wayne....@amd.com>
    Signed-off-by: Ovidiu Bunea <ovidiu.bu...@amd.com>
    Tested-by: Daniel Wheeler <daniel.whee...@amd.com>
    Signed-off-by: Alex Deucher <alexander.deuc...@amd.com>

diff --git a/drivers/gpu/drm/amd/display/dc/dml/dcn314/dcn314_fpu.c 
b/drivers/gpu/drm/amd/display/dc/dml/dcn314/dcn314_fpu.c
index 07adb614366e..ed8ddb75b333 100644
--- a/drivers/gpu/drm/amd/display/dc/dml/dcn314/dcn314_fpu.c
+++ b/drivers/gpu/drm/amd/display/dc/dml/dcn314/dcn314_fpu.c
@@ -31,7 +31,6 @@
 #include "dml/dcn20/dcn20_fpu.h"
 #include "dml/dcn31/dcn31_fpu.h"
 #include "dml/display_mode_vba.h"
-#include "dml/dml_inline_defs.h"
 
 struct _vcs_dpi_ip_params_st dcn3_14_ip = {
        .VBlankNomDefaultUS = 668,
@@ -274,25 +273,6 @@ static bool is_dual_plane(enum surface_pixel_format format)
        return format >= SURFACE_PIXEL_FORMAT_VIDEO_BEGIN || format == 
SURFACE_PIXEL_FORMAT_GRPH_RGBE_ALPHA;
 }
 
-/*
- * micro_sec_to_vert_lines () - converts time to number of vertical lines for 
a given timing
- *
- * @param: num_us: number of microseconds
- * @return: number of vertical lines. If exact number of vertical lines is not 
found then
- *          it will round up to next number of lines to guarantee num_us
- */
-static unsigned int micro_sec_to_vert_lines(unsigned int num_us, struct 
dc_crtc_timing *timing)
-{
-       unsigned int num_lines = 0;
-       unsigned int lines_time_in_ns = 1000.0 *
-                       (((float)timing->h_total * 1000.0) /
-                        ((float)timing->pix_clk_100hz / 10.0));
-
-       num_lines = dml_ceil(1000.0 * num_us / lines_time_in_ns, 1.0);
-
-       return num_lines;
-}
-
 int dcn314_populate_dml_pipes_from_context_fpu(struct dc *dc, struct dc_state 
*context,
                                               display_e2e_pipe_params_st 
*pipes,
                                               bool fast_validate)
@@ -309,22 +289,19 @@ int dcn314_populate_dml_pipes_from_context_fpu(struct dc 
*dc, struct dc_state *c
 
        for (i = 0, pipe_cnt = 0; i < dc->res_pool->pipe_count; i++) {
                struct dc_crtc_timing *timing;
-               unsigned int num_lines = 0;
 
                if (!res_ctx->pipe_ctx[i].stream)
                        continue;
                pipe = &res_ctx->pipe_ctx[i];
                timing = &pipe->stream->timing;
 
-               num_lines = 
micro_sec_to_vert_lines(dcn3_14_ip.VBlankNomDefaultUS, timing);
-
                if (pipe->stream->adjust.v_total_min != 0)
                        pipes[pipe_cnt].pipe.dest.vtotal = 
pipe->stream->adjust.v_total_min;
                else
                        pipes[pipe_cnt].pipe.dest.vtotal = timing->v_total;
 
                pipes[pipe_cnt].pipe.dest.vblank_nom = timing->v_total - 
pipes[pipe_cnt].pipe.dest.vactive;
-               pipes[pipe_cnt].pipe.dest.vblank_nom = 
min(pipes[pipe_cnt].pipe.dest.vblank_nom, num_lines);
+               pipes[pipe_cnt].pipe.dest.vblank_nom = 
min(pipes[pipe_cnt].pipe.dest.vblank_nom, dcn3_14_ip.VBlankNomDefaultUS);
                pipes[pipe_cnt].pipe.dest.vblank_nom = 
max(pipes[pipe_cnt].pipe.dest.vblank_nom, timing->v_sync_width);
                pipes[pipe_cnt].pipe.dest.vblank_nom = 
min(pipes[pipe_cnt].pipe.dest.vblank_nom, max_allowed_vblank_nom);
 
commit e81c45568505913a2275c6f60577e348d9786743
Author: YiPeng Chai <yipeng.c...@amd.com>
Date:   Tue Aug 15 17:39:30 2023 +0800

    drm/amdgpu: Enable ras for mp0 v13_0_6 sriov
    
    Enable ras for mp0 v13_0_6 sriov
    
    Signed-off-by: YiPeng Chai <yipeng.c...@amd.com>
    Reviewed-by: Stanley.Yang <stanley.y...@amd.com>
    Signed-off-by: Alex Deucher <alexander.deuc...@amd.com>

diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ras.c 
b/drivers/gpu/drm/amd/amdgpu/amdgpu_ras.c
index 7689395e44fd..378478cf9c21 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ras.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ras.c
@@ -2399,6 +2399,7 @@ static bool amdgpu_ras_asic_supported(struct 
amdgpu_device *adev)
        if (amdgpu_sriov_vf(adev)) {
                switch (adev->ip_versions[MP0_HWIP][0]) {
                case IP_VERSION(13, 0, 2):
+               case IP_VERSION(13, 0, 6):
                        return true;
                default:
                        return false;
commit 3aca8cca606be64c7cd6b61b36c8208bab37d44b
Author: Alex Sierra <alex.sie...@amd.com>
Date:   Tue Aug 15 15:42:52 2023 -0500

    drm/amdkfd: retry after EBUSY is returned from hmm_ranges_get_pages
    
    if hmm_range_get_pages returns EBUSY error during
    svm_range_validate_and_map, within the context of a page fault
    interrupt. This should retry through svm_range_restore_pages
    callback. Therefore we treat this as EAGAIN error instead, and defer
    it to restore pages fallback.
    
    Signed-off-by: Alex Sierra <alex.sie...@amd.com>
    Reviewed-by: Felix Kuehling <felix.kuehl...@amd.com>
    Signed-off-by: Alex Deucher <alexander.deuc...@amd.com>

diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_svm.c 
b/drivers/gpu/drm/amd/amdkfd/kfd_svm.c
index dbbe6559d6bc..49b62c2172cc 100644
--- a/drivers/gpu/drm/amd/amdkfd/kfd_svm.c
+++ b/drivers/gpu/drm/amd/amdkfd/kfd_svm.c
@@ -1686,6 +1686,8 @@ static int svm_range_validate_and_map(struct mm_struct 
*mm,
                WRITE_ONCE(p->svms.faulting_task, NULL);
                if (r) {
                        pr_debug("failed %d to get svm range pages\n", r);
+                       if (r == -EBUSY)
+                               r = -EAGAIN;
                        goto unreserve_out;
                }
 
commit bae44a8fcb6e7e244a524b7f3da35b69aa7bb4b3
Author: Samir Dhume <samir.dh...@amd.com>
Date:   Wed Aug 16 15:28:17 2023 -0400

    drm/amdgpu/jpeg - skip change of power-gating state for sriov
    
    Powergating is handled in the host driver.
    
    Reviewed-by: Zhigang Luo <zhigang....@amd.com>
    Signed-off-by: Samir Dhume <samir.dh...@amd.com>
    Signed-off-by: Alex Deucher <alexander.deuc...@amd.com>

diff --git a/drivers/gpu/drm/amd/amdgpu/jpeg_v4_0_3.c 
b/drivers/gpu/drm/amd/amdgpu/jpeg_v4_0_3.c
index 15612915bb6c..1de79d660285 100644
--- a/drivers/gpu/drm/amd/amdgpu/jpeg_v4_0_3.c
+++ b/drivers/gpu/drm/amd/amdgpu/jpeg_v4_0_3.c
@@ -360,8 +360,10 @@ static int jpeg_v4_0_3_hw_fini(void *handle)
 
        cancel_delayed_work_sync(&adev->jpeg.idle_work);
 
-       if (adev->jpeg.cur_state != AMD_PG_STATE_GATE)
-               ret = jpeg_v4_0_3_set_powergating_state(adev, 
AMD_PG_STATE_GATE);
+       if (!amdgpu_sriov_vf(adev)) {
+               if (adev->jpeg.cur_state != AMD_PG_STATE_GATE)
+                       ret = jpeg_v4_0_3_set_powergating_state(adev, 
AMD_PG_STATE_GATE);
+       }
 
        return ret;
 }
commit 1836bb0a9d09b42ca1e56e90814eb70658aa7c96
Author: Asad Kamal <asad.ka...@amd.com>
Date:   Sat Aug 12 22:22:10 2023 +0800

    drm/amd/pm: Add critical temp for GC v9.4.3
    
    Add critical temperature message support func for smu v13.0.6
    and expose critical temperature as part of hw mon attributes
    for GC v9.4.3
    
    v2:
    Added comment for pmfw version requirement & move the check
    to get_thermal_temperature_range function
    
    Signed-off-by: Asad Kamal <asad.ka...@amd.com>
    Reviewed-by: Lijo Lazar <lijo.la...@amd.com>
    Reviewed-by: Hawking Zhang <hawking.zh...@amd.com>
    Signed-off-by: Alex Deucher <alexander.deuc...@amd.com>

diff --git a/drivers/gpu/drm/amd/pm/amdgpu_pm.c 
b/drivers/gpu/drm/amd/pm/amdgpu_pm.c
index 5b1d73b00ef7..f03647fa3df6 100644
--- a/drivers/gpu/drm/amd/pm/amdgpu_pm.c
+++ b/drivers/gpu/drm/amd/pm/amdgpu_pm.c
@@ -3311,8 +3311,10 @@ static umode_t hwmon_attributes_visible(struct kobject 
*kobj,
            (gc_ver != IP_VERSION(9, 4, 3)) &&
            (attr == &sensor_dev_attr_temp2_input.dev_attr.attr ||
             attr == &sensor_dev_attr_temp2_label.dev_attr.attr ||
+            attr == &sensor_dev_attr_temp2_crit.dev_attr.attr ||
             attr == &sensor_dev_attr_temp3_input.dev_attr.attr ||
-            attr == &sensor_dev_attr_temp3_label.dev_attr.attr))
+            attr == &sensor_dev_attr_temp3_label.dev_attr.attr ||
+            attr == &sensor_dev_attr_temp3_crit.dev_attr.attr))
                return 0;
 
        /* hotspot temperature for gc 9,4,3*/
@@ -3324,9 +3326,7 @@ static umode_t hwmon_attributes_visible(struct kobject 
*kobj,
        /* only SOC15 dGPUs support hotspot and mem temperatures */
        if (((adev->flags & AMD_IS_APU) || gc_ver < IP_VERSION(9, 0, 0) ||
            (gc_ver == IP_VERSION(9, 4, 3))) &&
-           (attr == &sensor_dev_attr_temp2_crit.dev_attr.attr ||
-            attr == &sensor_dev_attr_temp2_crit_hyst.dev_attr.attr ||
-            attr == &sensor_dev_attr_temp3_crit.dev_attr.attr ||
+            (attr == &sensor_dev_attr_temp2_crit_hyst.dev_attr.attr ||
             attr == &sensor_dev_attr_temp3_crit_hyst.dev_attr.attr ||
             attr == &sensor_dev_attr_temp1_emergency.dev_attr.attr ||
             attr == &sensor_dev_attr_temp2_emergency.dev_attr.attr ||
diff --git a/drivers/gpu/drm/amd/pm/swsmu/inc/smu_types.h 
b/drivers/gpu/drm/amd/pm/swsmu/inc/smu_types.h
index f71fc99447f2..e57265cf637c 100644
--- a/drivers/gpu/drm/amd/pm/swsmu/inc/smu_types.h
+++ b/drivers/gpu/drm/amd/pm/swsmu/inc/smu_types.h
@@ -84,6 +84,7 @@
        __SMU_DUMMY_MAP(SetTjMax),                     \
        __SMU_DUMMY_MAP(SetFanTemperatureTarget),      \
        __SMU_DUMMY_MAP(PrepareMp1ForUnload),          \
+       __SMU_DUMMY_MAP(GetCTFLimit),                  \
        __SMU_DUMMY_MAP(DramLogSetDramAddrHigh),       \
        __SMU_DUMMY_MAP(DramLogSetDramAddrLow),        \
        __SMU_DUMMY_MAP(DramLogSetDramSize),           \
diff --git a/drivers/gpu/drm/amd/pm/swsmu/smu13/smu_v13_0_6_ppt.c 
b/drivers/gpu/drm/amd/pm/swsmu/smu13/smu_v13_0_6_ppt.c
index 6ed9cd0a1e4e..7d8af9b309b7 100644
--- a/drivers/gpu/drm/amd/pm/swsmu/smu13/smu_v13_0_6_ppt.c
+++ b/drivers/gpu/drm/amd/pm/swsmu/smu13/smu_v13_0_6_ppt.c
@@ -132,6 +132,7 @@ static const struct cmn2asic_msg_mapping 
smu_v13_0_6_message_map[SMU_MSG_MAX_COU
        MSG_MAP(SetSoftMinGfxclk,                    
PPSMC_MSG_SetSoftMinGfxClk,                0),
        MSG_MAP(SetSoftMaxGfxClk,                    
PPSMC_MSG_SetSoftMaxGfxClk,                0),
        MSG_MAP(PrepareMp1ForUnload,                 
PPSMC_MSG_PrepareForDriverUnload,          0),
+       MSG_MAP(GetCTFLimit,                         PPSMC_MSG_GetCTFLimit,     
                0),
 };
 
 static const struct cmn2asic_mapping smu_v13_0_6_clk_map[SMU_CLK_COUNT] = {
@@ -2081,6 +2082,54 @@ out:
        return ret;
 }
 
+static int smu_v13_0_6_get_thermal_temperature_range(struct smu_context *smu,
+                                                    struct 
smu_temperature_range *range)
+{
+       struct amdgpu_device *adev = smu->adev;
+       u32 aid_temp, xcd_temp;
+       uint32_t smu_version;
+       u32 ccd_temp = 0;
+       int ret;
+
+       if (amdgpu_sriov_vf(smu->adev))
+               return 0;
+
+       if (!range)
+               return -EINVAL;
+
+       /*Check smu version, GetCtfLimit message only supported for smu version 
85.69 or higher */
+       smu_cmn_get_smc_version(smu, NULL, &smu_version);
+       if (smu_version < 0x554500)
+               return 0;
+
+       ret = smu_cmn_send_smc_msg_with_param(smu, SMU_MSG_GetCTFLimit,
+                                             PPSMC_AID_THM_TYPE, &aid_temp);
+       if (ret)
+               goto failed;
+
+       if (adev->flags & AMD_IS_APU) {
+               ret = smu_cmn_send_smc_msg_with_param(smu, SMU_MSG_GetCTFLimit,
+                                                     PPSMC_CCD_THM_TYPE, 
&ccd_temp);
+               if (ret)
+                       goto failed;
+       }
+
+       ret = smu_cmn_send_smc_msg_with_param(smu, SMU_MSG_GetCTFLimit,
+                                             PPSMC_XCD_THM_TYPE, &xcd_temp);
+       if (ret)
+               goto failed;
+
+       range->hotspot_crit_max = max3(aid_temp, xcd_temp, ccd_temp);
+       ret = smu_cmn_send_smc_msg_with_param(smu, SMU_MSG_GetCTFLimit,
+                                             PPSMC_HBM_THM_TYPE, 
&range->mem_crit_max);
+       if (ret)
+               goto failed;
+
+       return 0;
+failed:
+       return ret;
+}
+
 static int smu_v13_0_6_mode1_reset(struct smu_context *smu)
 {
        struct amdgpu_device *adev = smu->adev;
@@ -2177,6 +2226,7 @@ static const struct pptable_funcs smu_v13_0_6_ppt_funcs = 
{
        .get_pp_feature_mask = smu_cmn_get_pp_feature_mask,
        .set_pp_feature_mask = smu_cmn_set_pp_feature_mask,
        .get_gpu_metrics = smu_v13_0_6_get_gpu_metrics,
+       .get_thermal_temperature_range = 
smu_v13_0_6_get_thermal_temperature_range,
        .mode1_reset_is_support = smu_v13_0_6_is_mode1_reset_supported,
        .mode2_reset_is_support = smu_v13_0_6_is_mode2_reset_supported,
        .mode1_reset = smu_v13_0_6_mode1_reset,
commit 85609153102ea402e860657e04df4b839b4212ca
Author: Asad Kamal <asad.ka...@amd.com>
Date:   Sat Aug 12 21:42:20 2023 +0800

    drm/amd/pm: Update SMUv13.0.6 PMFW headers
    
    Update PMFW interface headers for updated metrics table and
    critical temperature message
    
    Signed-off-by: Asad Kamal <asad.ka...@amd.com>
    Reviewed-by: Lijo Lazar <lijo.la...@amd.com>
    Reviewed-by: Hawking Zhang <hawking.zh...@amd.com>
    Signed-off-by: Alex Deucher <alexander.deuc...@amd.com>

diff --git a/drivers/gpu/drm/amd/pm/swsmu/inc/pmfw_if/smu_v13_0_6_pmfw.h 
b/drivers/gpu/drm/amd/pm/swsmu/inc/pmfw_if/smu_v13_0_6_pmfw.h
index 252aef190c5c..9be4051c0865 100644
--- a/drivers/gpu/drm/amd/pm/swsmu/inc/pmfw_if/smu_v13_0_6_pmfw.h
+++ b/drivers/gpu/drm/amd/pm/swsmu/inc/pmfw_if/smu_v13_0_6_pmfw.h
@@ -123,7 +123,7 @@ typedef enum {
   VOLTAGE_GUARDBAND_COUNT
 } GFX_GUARDBAND_e;
 
-#define SMU_METRICS_TABLE_VERSION 0x5
+#define SMU_METRICS_TABLE_VERSION 0x7
 
 typedef struct __attribute__((packed, aligned(4))) {
   uint32_t AccumulationCounter;
@@ -198,7 +198,7 @@ typedef struct __attribute__((packed, aligned(4))) {
   uint32_t SocketThmResidencyAcc;
   uint32_t VrThmResidencyAcc;
   uint32_t HbmThmResidencyAcc;
-  uint32_t spare;
+  uint32_t GfxLockXCDMak;
 
   // New Items at end to maintain driver compatibility
   uint32_t GfxclkFrequency[8];
diff --git a/drivers/gpu/drm/amd/pm/swsmu/inc/pmfw_if/smu_v13_0_6_ppsmc.h 
b/drivers/gpu/drm/amd/pm/swsmu/inc/pmfw_if/smu_v13_0_6_ppsmc.h
index ae4f44c4b877..70a4a717fd3f 100644
--- a/drivers/gpu/drm/amd/pm/swsmu/inc/pmfw_if/smu_v13_0_6_ppsmc.h
+++ b/drivers/gpu/drm/amd/pm/swsmu/inc/pmfw_if/smu_v13_0_6_ppsmc.h
@@ -83,13 +83,27 @@
 #define PPSMC_MSG_GetMinGfxDpmFreq                  0x32
 #define PPSMC_MSG_GetMaxGfxDpmFreq                  0x33
 #define PPSMC_MSG_PrepareForDriverUnload            0x34
-#define PPSMC_Message_Count                         0x35
+#define PPSMC_MSG_ReadThrottlerLimit                0x35
+#define PPSMC_MSG_QueryValidMcaCount                0x36
+#define PPSMC_MSG_McaBankDumpDW                     0x37
+#define PPSMC_MSG_GetCTFLimit                       0x38
+#define PPSMC_Message_Count                         0x39
 
 //PPSMC Reset Types for driver msg argument
 #define PPSMC_RESET_TYPE_DRIVER_MODE_1_RESET        0x1
 #define PPSMC_RESET_TYPE_DRIVER_MODE_2_RESET         0x2
 #define PPSMC_RESET_TYPE_DRIVER_MODE_3_RESET        0x3
 
+//PPSMC Reset Types for driver msg argument
+#define PPSMC_THROTTLING_LIMIT_TYPE_SOCKET          0x1
+#define PPSMC_THROTTLING_LIMIT_TYPE_HBM             0x2
+
+//CTF/Throttle Limit types
+#define PPSMC_AID_THM_TYPE                          0x1
+#define PPSMC_CCD_THM_TYPE                          0x2
+#define PPSMC_XCD_THM_TYPE                          0x3
+#define PPSMC_HBM_THM_TYPE                          0x4
+
 typedef uint32_t PPSMC_Result;
 typedef uint32_t PPSMC_MSG;
 
commit 46b55e25c94af1689636f4be1760fb0d9ddd8ae2
Author: Le Ma <le...@amd.com>
Date:   Mon Aug 14 18:37:28 2023 +0800

    drm/amdgpu: update gc_info v2_1 from discovery
    
    Several new fields are exposed in gc_info v2_1
    
    Signed-off-by: Le Ma <le...@amd.com>
    Reviewed-by: Shiwu Zhang <shiwu.zh...@amd.com>
    Reviewed-by: Hawking Zhang <hawking.zh...@amd.com>
    Reviewed-by: Lijo Lazar <lijo.la...@amd.com>
    Signed-off-by: Alex Deucher <alexander.deuc...@amd.com>

diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_discovery.c 
b/drivers/gpu/drm/amd/amdgpu/amdgpu_discovery.c
index d4a7e33653d9..7d5e7ad28ba8 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_discovery.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_discovery.c
@@ -1390,6 +1390,7 @@ union gc_info {
        struct gc_info_v1_1 v1_1;
        struct gc_info_v1_2 v1_2;
        struct gc_info_v2_0 v2;
+       struct gc_info_v2_1 v2_1;
 };
 
 static int amdgpu_discovery_get_gfx_info(struct amdgpu_device *adev)
@@ -1465,6 +1466,15 @@ static int amdgpu_discovery_get_gfx_info(struct 
amdgpu_device *adev)
                adev->gfx.config.num_sc_per_sh = 
le32_to_cpu(gc_info->v2.gc_num_sc_per_se) /
                        le32_to_cpu(gc_info->v2.gc_num_sh_per_se);
                adev->gfx.config.num_packer_per_sc = 
le32_to_cpu(gc_info->v2.gc_num_packer_per_sc);
+               if (gc_info->v2.header.version_minor == 1) {
+                       adev->gfx.config.gc_num_tcp_per_sa = 
le32_to_cpu(gc_info->v2_1.gc_num_tcp_per_sh);
+                       adev->gfx.config.gc_tcp_size_per_cu = 
le32_to_cpu(gc_info->v2_1.gc_tcp_size_per_cu);
+                       adev->gfx.config.gc_num_sdp_interface = 
le32_to_cpu(gc_info->v2_1.gc_num_sdp_interface); /* per XCD */
+                       adev->gfx.config.gc_num_cu_per_sqc = 
le32_to_cpu(gc_info->v2_1.gc_num_cu_per_sqc);
+                       adev->gfx.config.gc_l1_instruction_cache_size_per_sqc = 
le32_to_cpu(gc_info->v2_1.gc_instruction_cache_size_per_sqc);
+                       adev->gfx.config.gc_l1_data_cache_size_per_sqc = 
le32_to_cpu(gc_info->v2_1.gc_scalar_data_cache_size_per_sqc);
+                       adev->gfx.config.gc_tcc_size = 
le32_to_cpu(gc_info->v2_1.gc_tcc_size); /* per XCD */
+               }
                break;
        default:
                dev_err(adev->dev,
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_gfx.h 
b/drivers/gpu/drm/amd/amdgpu/amdgpu_gfx.h
index a4ff515ce896..395c1768b9fc 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_gfx.h
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_gfx.h
@@ -241,6 +241,9 @@ struct amdgpu_gfx_config {
        uint32_t gc_gl1c_per_sa;
        uint32_t gc_gl1c_size_per_instance;
        uint32_t gc_gl2c_per_gpu;
+       uint32_t gc_tcp_size_per_cu;
+       uint32_t gc_num_cu_per_sqc;
+       uint32_t gc_tcc_size;
 };
 
 struct amdgpu_cu_info {
diff --git a/drivers/gpu/drm/amd/include/discovery.h 
b/drivers/gpu/drm/amd/include/discovery.h
index b9884e576f98..7a9d473d0917 100644
--- a/drivers/gpu/drm/amd/include/discovery.h
+++ b/drivers/gpu/drm/amd/include/discovery.h
@@ -280,6 +280,36 @@ struct gc_info_v2_0 {
        uint32_t gc_num_packer_per_sc;
 };
 
+struct gc_info_v2_1 {
+       struct gpu_info_header header;
+
+       uint32_t gc_num_se;
+       uint32_t gc_num_cu_per_sh;
+       uint32_t gc_num_sh_per_se;
+       uint32_t gc_num_rb_per_se;
+       uint32_t gc_num_tccs;
+       uint32_t gc_num_gprs;
+       uint32_t gc_num_max_gs_thds;
+       uint32_t gc_gs_table_depth;
+       uint32_t gc_gsprim_buff_depth;
+       uint32_t gc_parameter_cache_depth;
+       uint32_t gc_double_offchip_lds_buffer;
+       uint32_t gc_wave_size;
+       uint32_t gc_max_waves_per_simd;
+       uint32_t gc_max_scratch_slots_per_cu;
+       uint32_t gc_lds_size;
+       uint32_t gc_num_sc_per_se;
+       uint32_t gc_num_packer_per_sc;
+       /* new for v2_1 */
+       uint32_t gc_num_tcp_per_sh;
+       uint32_t gc_tcp_size_per_cu;
+       uint32_t gc_num_sdp_interface;
+       uint32_t gc_num_cu_per_sqc;
+       uint32_t gc_instruction_cache_size_per_sqc;
+       uint32_t gc_scalar_data_cache_size_per_sqc;
+       uint32_t gc_tcc_size;
+};
+
 typedef struct harvest_info_header {
        uint32_t signature; /* Table Signature */
        uint32_t version;   /* Table Version */
commit d4f6425a5615bbeaee1d14663205b23f82dc0313
Author: Le Ma <le...@amd.com>
Date:   Mon Aug 14 16:27:59 2023 +0800

    drm/amdgpu: update mall info v2 from discovery
    
    Mall info v2 is introduced in ip discovery
    
    Signed-off-by: Le Ma <le...@amd.com>
    Reviewed-by: Shiwu Zhang <shiwu.zh...@amd.com>
    Reviewed-by: Hawking Zhang <hawking.zh...@amd.com>
    Reviewed-by: Lijo Lazar <lijo.la...@amd.com>
    Signed-off-by: Alex Deucher <alexander.deuc...@amd.com>

diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_discovery.c 
b/drivers/gpu/drm/amd/amdgpu/amdgpu_discovery.c
index 74ffe6581c85..d4a7e33653d9 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_discovery.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_discovery.c
@@ -1478,6 +1478,7 @@ static int amdgpu_discovery_get_gfx_info(struct 
amdgpu_device *adev)
 
 union mall_info {
        struct mall_info_v1_0 v1;
+       struct mall_info_v2_0 v2;
 };
 
 static int amdgpu_discovery_get_mall_info(struct amdgpu_device *adev)
@@ -1518,6 +1519,10 @@ static int amdgpu_discovery_get_mall_info(struct 
amdgpu_device *adev)
                adev->gmc.mall_size = mall_size;
                adev->gmc.m_half_use = half_use;
                break;
+       case 2:
+               mall_size_per_umc = 
le32_to_cpu(mall_info->v2.mall_size_per_umc);
+               adev->gmc.mall_size = mall_size_per_umc * adev->gmc.num_umc;
+               break;
        default:
                dev_err(adev->dev,
                        "Unhandled MALL info table %d.%d\n",
diff --git a/drivers/gpu/drm/amd/include/discovery.h 
b/drivers/gpu/drm/amd/include/discovery.h
index f43e29722ef7..b9884e576f98 100644
--- a/drivers/gpu/drm/amd/include/discovery.h
+++ b/drivers/gpu/drm/amd/include/discovery.h
@@ -30,7 +30,7 @@
 #define GC_TABLE_ID                     0x4347
 #define HARVEST_TABLE_SIGNATURE         0x56524148
 #define VCN_INFO_TABLE_ID               0x004E4356
-#define MALL_INFO_TABLE_ID              0x4D414C4C
+#define MALL_INFO_TABLE_ID              0x4C4C414D
 
 typedef enum
 {
@@ -312,6 +312,12 @@ struct mall_info_v1_0 {
        uint32_t reserved[5];
 };
 
+struct mall_info_v2_0 {
+       struct mall_info_header header;
+       uint32_t mall_size_per_umc;
+       uint32_t reserved[8];
+};
+
 #define VCN_INFO_TABLE_MAX_NUM_INSTANCES 4
 
 struct vcn_info_header {
commit 4b721ed87e63a654fd0eccbf9284c9436ffc0ced
Author: Candice Li <candice...@amd.com>
Date:   Wed Aug 16 21:33:04 2023 +0800

    drm/amdgpu: Only support RAS EEPROM on dGPU platform
    
    RAS EEPROM device is only supported on dGPU platform for smu v13_0_6.
    
    Signed-off-by: Candice Li <candice...@amd.com>
    Reviewed-by: Hawking Zhang <hawking.zh...@amd.com>
    Signed-off-by: Alex Deucher <alexander.deuc...@amd.com>

diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ras_eeprom.c 
b/drivers/gpu/drm/amd/amdgpu/amdgpu_ras_eeprom.c
index 4764d2171f92..595d5e535aca 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ras_eeprom.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ras_eeprom.c
@@ -158,9 +158,10 @@ static bool __is_ras_eeprom_supported(struct amdgpu_device 
*adev)
        case IP_VERSION(11, 0, 7): /* Sienna cichlid */
        case IP_VERSION(13, 0, 0):
        case IP_VERSION(13, 0, 2): /* Aldebaran */
-       case IP_VERSION(13, 0, 6):
        case IP_VERSION(13, 0, 10):
                return true;
+       case IP_VERSION(13, 0, 6):
+               return (adev->gmc.is_app_apu) ? false : true;
        default:
                return false;
        }
commit fd27af4d5dab9aab591aba3b94bf337df756d3a3
Author: Lijo Lazar <lijo.la...@amd.com>
Date:   Wed Aug 16 09:07:42 2023 +0530

    Documentation/gpu: Update amdgpu documentation
    
    7957ec80ef97 ("drm/amdgpu: Add FRU sysfs nodes only if needed") moved
    the documentation for some of the sysfs nodes to amdgpu_fru_eeprom.c.
    Update the documentation accordingly.
    
    Signed-off-by: Lijo Lazar <lijo.la...@amd.com>
    Reviewed-by: Alex Deucher <alexander.deuc...@amd.com>
    Signed-off-by: Alex Deucher <alexander.deuc...@amd.com>

diff --git a/Documentation/gpu/amdgpu/driver-misc.rst 
b/Documentation/gpu/amdgpu/driver-misc.rst
index be131e963d87..4321c38fef21 100644
--- a/Documentation/gpu/amdgpu/driver-misc.rst
+++ b/Documentation/gpu/amdgpu/driver-misc.rst
@@ -11,19 +11,19 @@ via sysfs
 product_name
 ------------
 
-.. kernel-doc:: drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
+.. kernel-doc:: drivers/gpu/drm/amd/amdgpu/amdgpu_fru_eeprom.c
    :doc: product_name
 
 product_number
 --------------
 
-.. kernel-doc:: drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
-   :doc: product_name
+.. kernel-doc:: drivers/gpu/drm/amd/amdgpu/amdgpu_fru_eeprom.c
+   :doc: product_number
 
 serial_number
 -------------
 
-.. kernel-doc:: drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
+.. kernel-doc:: drivers/gpu/drm/amd/amdgpu/amdgpu_fru_eeprom.c
    :doc: serial_number
 
 unique_id
commit 89df3dbeee40216ff23c1556bdfa8e653f296020
Author: Bokun Zhang <bokun.zh...@amd.com>
Date:   Mon Aug 14 17:06:45 2023 -0400

    drm/amdgpu/pm: Add notification for no DC support
    
    - There is a DPM issue where if DC is not present,
      FCLK will stay at low level.
      We need to send a SMU message to configure the DPM
    
    - Reuse smu_v13_0_notify_display_change() for this purpose
    
    Reviewed-by: Evan Quan <evan.q...@amd.com>
    Reviewed-by: Alex Deucher <alexander.deuc...@amd.com>
    Signed-off-by: Bokun Zhang <bokun.zh...@amd.com>
    Signed-off-by: Alex Deucher <alexander.deuc...@amd.com>

diff --git a/drivers/gpu/drm/amd/pm/swsmu/inc/amdgpu_smu.h 
b/drivers/gpu/drm/amd/pm/swsmu/inc/amdgpu_smu.h
index 95eb8a5eb54f..5a52098bcf16 100644
--- a/drivers/gpu/drm/amd/pm/swsmu/inc/amdgpu_smu.h
+++ b/drivers/gpu/drm/amd/pm/swsmu/inc/amdgpu_smu.h
@@ -1031,10 +1031,7 @@ struct pptable_funcs {
                                                   enum smu_feature_mask mask);
 
        /**
-        * @notify_display_change: Enable fast memory clock switching.
-        *
-        * Allows for fine grained memory clock switching but has more stringent
-        * timing requirements.
+        * @notify_display_change: General interface call to let SMU know about 
DC change
         */
        int (*notify_display_change)(struct smu_context *smu);
 
diff --git a/drivers/gpu/drm/amd/pm/swsmu/inc/pmfw_if/smu_v13_0_0_ppsmc.h 
b/drivers/gpu/drm/amd/pm/swsmu/inc/pmfw_if/smu_v13_0_0_ppsmc.h
index 10cff75b44d5..e2ee855c7748 100644
--- a/drivers/gpu/drm/amd/pm/swsmu/inc/pmfw_if/smu_v13_0_0_ppsmc.h
+++ b/drivers/gpu/drm/amd/pm/swsmu/inc/pmfw_if/smu_v13_0_0_ppsmc.h
@@ -138,7 +138,10 @@
 #define PPSMC_MSG_SetBadMemoryPagesRetiredFlagsPerChannel 0x4A
 #define PPSMC_MSG_SetPriorityDeltaGain           0x4B
 #define PPSMC_MSG_AllowIHHostInterrupt           0x4C
-#define PPSMC_Message_Count                      0x4D
+
+#define PPSMC_MSG_DALNotPresent                  0x4E
+
+#define PPSMC_Message_Count                      0x4F
 
 //Debug Dump Message
 #define DEBUGSMC_MSG_TestMessage                    0x1
diff --git a/drivers/gpu/drm/amd/pm/swsmu/inc/smu_types.h 
b/drivers/gpu/drm/amd/pm/swsmu/inc/smu_types.h
index 297b70b9388f..f71fc99447f2 100644
--- a/drivers/gpu/drm/amd/pm/swsmu/inc/smu_types.h
+++ b/drivers/gpu/drm/amd/pm/swsmu/inc/smu_types.h
@@ -245,7 +245,8 @@
        __SMU_DUMMY_MAP(AllowGpo),      \
        __SMU_DUMMY_MAP(Mode2Reset),    \
        __SMU_DUMMY_MAP(RequestI2cTransaction), \
-       __SMU_DUMMY_MAP(GetMetricsTable),
+       __SMU_DUMMY_MAP(GetMetricsTable), \
+       __SMU_DUMMY_MAP(DALNotPresent),
 
 #undef __SMU_DUMMY_MAP
 #define __SMU_DUMMY_MAP(type)  SMU_MSG_##type
diff --git a/drivers/gpu/drm/amd/pm/swsmu/smu13/smu_v13_0.c 
b/drivers/gpu/drm/amd/pm/swsmu/smu13/smu_v13_0.c
index f1282fc4b90a..0232adb95df3 100644
--- a/drivers/gpu/drm/amd/pm/swsmu/smu13/smu_v13_0.c
+++ b/drivers/gpu/drm/amd/pm/swsmu/smu13/smu_v13_0.c
@@ -837,12 +837,8 @@ int smu_v13_0_notify_display_change(struct smu_context 
*smu)
 {
        int ret = 0;
 
-       if (!smu->pm_enabled)
-               return ret;
-
-       if (smu_cmn_feature_is_enabled(smu, SMU_FEATURE_DPM_UCLK_BIT) &&
-           smu->adev->gmc.vram_type == AMDGPU_VRAM_TYPE_HBM)
-               ret = smu_cmn_send_smc_msg_with_param(smu, 
SMU_MSG_SetUclkFastSwitch, 1, NULL);
+       if (!amdgpu_device_has_dc_support(smu->adev))
+               ret = smu_cmn_send_smc_msg(smu, SMU_MSG_DALNotPresent, NULL);
 
        return ret;
 }
diff --git a/drivers/gpu/drm/amd/pm/swsmu/smu13/smu_v13_0_0_ppt.c 
b/drivers/gpu/drm/amd/pm/swsmu/smu13/smu_v13_0_0_ppt.c
index 8b7403ba89d7..3903a47669e4 100644
--- a/drivers/gpu/drm/amd/pm/swsmu/smu13/smu_v13_0_0_ppt.c
+++ b/drivers/gpu/drm/amd/pm/swsmu/smu13/smu_v13_0_0_ppt.c
@@ -162,6 +162,7 @@ static struct cmn2asic_msg_mapping 
smu_v13_0_0_message_map[SMU_MSG_MAX_COUNT] =
        MSG_MAP(AllowGpo,                       PPSMC_MSG_SetGpoAllow,          
 0),
        MSG_MAP(AllowIHHostInterrupt,           PPSMC_MSG_AllowIHHostInterrupt, 
      0),
        MSG_MAP(ReenableAcDcInterrupt,          
PPSMC_MSG_ReenableAcDcInterrupt,       0),
+       MSG_MAP(DALNotPresent,          PPSMC_MSG_DALNotPresent,       0),
 };
 
 static struct cmn2asic_mapping smu_v13_0_0_clk_map[SMU_CLK_COUNT] = {
@@ -2687,6 +2688,7 @@ static const struct pptable_funcs smu_v13_0_0_ppt_funcs = 
{
        .send_hbm_bad_channel_flag = smu_v13_0_0_send_bad_mem_channel_flag,
        .gpo_control = smu_v13_0_gpo_control,
        .get_ecc_info = smu_v13_0_0_get_ecc_info,
+       .notify_display_change = smu_v13_0_notify_display_change,
 };
 
 void smu_v13_0_0_set_ppt_funcs(struct smu_context *smu)
commit 44e60b14d5a72f91fd0bdeae8da59ae37a3ca8e5
Author: Bhawanpreet Lakha <bhawanpreet.la...@amd.com>
Date:   Tue May 16 12:21:19 2023 -0400

    drm/amd/display: Enable Replay for static screen use cases
    
    - Setup replay config on device init.
    - Enable replay if feature is enabled (prioritize replay over PSR, since
    it can be enabled in more usecases)
    - Add debug masks to enable replay on supported ASICs
    
    Signed-off-by: Bhawanpreet Lakha <bhawanpreet.la...@amd.com>
    Reviewed-by: Harry Wentland <harry.wentl...@amd.com>
    Signed-off-by: Alex Deucher <alexander.deuc...@amd.com>

diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c 
b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
index 268cb99a4c4b..f2b4f1720abd 100644
--- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
+++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
@@ -65,6 +65,7 @@
 #include "amdgpu_dm_debugfs.h"
 #endif
 #include "amdgpu_dm_psr.h"
+#include "amdgpu_dm_replay.h"
 
 #include "ivsrcid/ivsrcid_vislands30.h"
 
@@ -4265,6 +4266,7 @@ static int amdgpu_dm_initialize_drm_device(struct 
amdgpu_device *adev)
        enum dc_connection_type new_connection_type = dc_connection_none;
        const struct dc_plane_cap *plane;
        bool psr_feature_enabled = false;
+       bool replay_feature_enabled = false;
        int max_overlay = dm->dc->caps.max_slave_planes;
 
        dm->display_indexes_num = dm->dc->caps.max_streams;
@@ -4374,6 +4376,20 @@ static int amdgpu_dm_initialize_drm_device(struct 
amdgpu_device *adev)
                }
        }
 
+       if (!(amdgpu_dc_debug_mask & DC_DISABLE_REPLAY)) {
+               switch (adev->ip_versions[DCE_HWIP][0]) {
+               case IP_VERSION(3, 1, 4):
+               case IP_VERSION(3, 1, 5):
+               case IP_VERSION(3, 1, 6):
+               case IP_VERSION(3, 2, 0):
+               case IP_VERSION(3, 2, 1):
+                       replay_feature_enabled = true;
+                       break;
+               default:
+                       replay_feature_enabled = amdgpu_dc_feature_mask & 
DC_REPLAY_MASK;
+                       break;
+               }
+       }
        /* loops over all connectors on the board */
        for (i = 0; i < link_cnt; i++) {
                struct dc_link *link = NULL;
@@ -4422,6 +4438,12 @@ static int amdgpu_dm_initialize_drm_device(struct 
amdgpu_device *adev)
                                
amdgpu_dm_update_connector_after_detect(aconnector);
                                setup_backlight_device(dm, aconnector);
 
+                               /*
+                                * Disable psr if replay can be enabled
+                                */
+                               if (replay_feature_enabled && 
amdgpu_dm_setup_replay(link, aconnector))
+                                       psr_feature_enabled = false;
+
                                if (psr_feature_enabled)
                                        amdgpu_dm_set_psr_caps(link);
 
diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_crtc.c 
b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_crtc.c
index 30d4c6fd95f5..97b7a0b8a1c2 100644
--- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_crtc.c
+++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_crtc.c
@@ -29,6 +29,7 @@
 #include "dc.h"
 #include "amdgpu.h"
 #include "amdgpu_dm_psr.h"
+#include "amdgpu_dm_replay.h"
 #include "amdgpu_dm_crtc.h"
 #include "amdgpu_dm_plane.h"
 #include "amdgpu_dm_trace.h"
@@ -123,7 +124,12 @@ static void vblank_control_worker(struct work_struct *work)
         * fill_dc_dirty_rects().
         */
        if (vblank_work->stream && vblank_work->stream->link) {
-               if (vblank_work->enable) {
+               /*
+                * Prioritize replay, instead of psr
+                */
+               if 
(vblank_work->stream->link->replay_settings.replay_feature_enabled)
+                       amdgpu_dm_replay_enable(vblank_work->stream, false);
+               else if (vblank_work->enable) {
                        if (vblank_work->stream->link->psr_settings.psr_version 
< DC_PSR_VERSION_SU_1 &&
                            
vblank_work->stream->link->psr_settings.psr_allow_active)
                                amdgpu_dm_psr_disable(vblank_work->stream);
@@ -132,6 +138,7 @@ static void vblank_control_worker(struct work_struct *work)
 #ifdef CONFIG_DRM_AMD_SECURE_DISPLAY
                           
!amdgpu_dm_crc_window_is_activated(&vblank_work->acrtc->base) &&
 #endif
+                          
vblank_work->stream->link->panel_config.psr.disallow_replay &&
                           vblank_work->acrtc->dm_irq_params.allow_psr_entry) {
                        amdgpu_dm_psr_enable(vblank_work->stream);
                }
diff --git a/drivers/gpu/drm/amd/include/amd_shared.h 
b/drivers/gpu/drm/amd/include/amd_shared.h
index abe829bbd54a..67d7b7ee8a2a 100644
--- a/drivers/gpu/drm/amd/include/amd_shared.h
+++ b/drivers/gpu/drm/amd/include/amd_shared.h
@@ -240,6 +240,7 @@ enum DC_FEATURE_MASK {
        DC_DISABLE_LTTPR_DP2_0 = (1 << 6), //0x40, disabled by default
        DC_PSR_ALLOW_SMU_OPT = (1 << 7), //0x80, disabled by default
        DC_PSR_ALLOW_MULTI_DISP_OPT = (1 << 8), //0x100, disabled by default
+       DC_REPLAY_MASK = (1 << 9), //0x200, disabled by default for dcn < 3.1.4
 };
 
 enum DC_DEBUG_MASK {
@@ -250,6 +251,7 @@ enum DC_DEBUG_MASK {
        DC_DISABLE_PSR = 0x10,
        DC_FORCE_SUBVP_MCLK_SWITCH = 0x20,
        DC_DISABLE_MPO = 0x40,
+       DC_DISABLE_REPLAY = 0x50,
        DC_ENABLE_DPIA_TRACE = 0x80,
 };
 
commit 978474dc8278f661930e02e08d292a45a45fa01a
Author: Danilo Krummrich <d...@redhat.com>
Date:   Wed Aug 30 00:38:02 2023 +0200

    drm/nouveau: fence: fix undefined fence state after emit
    
    nouveau_fence_emit() can fail before and after initializing the
    dma-fence and hence before and after initializing the dma-fence' kref.
    
    In order to avoid nouveau_fence_emit() potentially failing before
    dma-fence initialization pass the channel to nouveau_fence_new() already
    and perform the required check before even allocating the fence.
    
    While at it, restore the original behavior of nouveau_fence_new() and
    add nouveau_fence_create() for separate (pre-)allocation instead. Always
    splitting up allocation end emit wasn't a good idea in the first place.
    Hence, limit it to the places where we actually need to pre-allocate.
    
    Fixes: 7f2a0b50b2b2 ("drm/nouveau: fence: separate fence alloc and emit")
    Signed-off-by: Danilo Krummrich <d...@redhat.com>
    Reviewed-by: Dave Airlie <airl...@redhat.com>
    Link: 
https://patchwork.freedesktop.org/patch/msgid/20230829223847.4406-1-d...@redhat.com

diff --git a/drivers/gpu/drm/nouveau/dispnv04/crtc.c 
b/drivers/gpu/drm/nouveau/dispnv04/crtc.c
index a34924523133..a34917b048f9 100644
--- a/drivers/gpu/drm/nouveau/dispnv04/crtc.c
+++ b/drivers/gpu/drm/nouveau/dispnv04/crtc.c
@@ -1122,18 +1122,11 @@ nv04_page_flip_emit(struct nouveau_channel *chan,
        PUSH_NVSQ(push, NV_SW, NV_SW_PAGE_FLIP, 0x00000000);
        PUSH_KICK(push);
 
-       ret = nouveau_fence_new(pfence);
+       ret = nouveau_fence_new(pfence, chan);
        if (ret)
                goto fail;
 
-       ret = nouveau_fence_emit(*pfence, chan);
-       if (ret)
-               goto fail_fence_unref;
-
        return 0;
-
-fail_fence_unref:
-       nouveau_fence_unref(pfence);
 fail:
        spin_lock_irqsave(&dev->event_lock, flags);
        list_del(&s->head);
diff --git a/drivers/gpu/drm/nouveau/nouveau_bo.c 
b/drivers/gpu/drm/nouveau/nouveau_bo.c
index 19cab37ac69c..0f3bd187ede6 100644
--- a/drivers/gpu/drm/nouveau/nouveau_bo.c
+++ b/drivers/gpu/drm/nouveau/nouveau_bo.c
@@ -875,16 +875,10 @@ nouveau_bo_move_m2mf(struct ttm_buffer_object *bo, int 
evict,
        if (ret)
                goto out_unlock;
 
-       ret = nouveau_fence_new(&fence);
+       ret = nouveau_fence_new(&fence, chan);
        if (ret)
                goto out_unlock;
 
-       ret = nouveau_fence_emit(fence, chan);
-       if (ret) {
-               nouveau_fence_unref(&fence);
-               goto out_unlock;
-       }
-
        /* TODO: figure out a better solution here
         *
         * wait on the fence here explicitly as going through
diff --git a/drivers/gpu/drm/nouveau/nouveau_chan.c 
b/drivers/gpu/drm/nouveau/nouveau_chan.c
index 1fd5ccf41128..bb3d6e5c122f 100644
--- a/drivers/gpu/drm/nouveau/nouveau_chan.c
+++ b/drivers/gpu/drm/nouveau/nouveau_chan.c
@@ -70,11 +70,9 @@ nouveau_channel_idle(struct nouveau_channel *chan)
                struct nouveau_fence *fence = NULL;
                int ret;
 
-               ret = nouveau_fence_new(&fence);
+               ret = nouveau_fence_new(&fence, chan);
                if (!ret) {
-                       ret = nouveau_fence_emit(fence, chan);
-                       if (!ret)
-                               ret = nouveau_fence_wait(fence, false, false);
+                       ret = nouveau_fence_wait(fence, false, false);
                        nouveau_fence_unref(&fence);
                }
 
diff --git a/drivers/gpu/drm/nouveau/nouveau_dmem.c 
b/drivers/gpu/drm/nouveau/nouveau_dmem.c
index 61e84562094a..12feecf71e75 100644
--- a/drivers/gpu/drm/nouveau/nouveau_dmem.c
+++ b/drivers/gpu/drm/nouveau/nouveau_dmem.c
@@ -209,8 +209,7 @@ static vm_fault_t nouveau_dmem_migrate_to_ram(struct 
vm_fault *vmf)
                goto done;
        }
 
-       if (!nouveau_fence_new(&fence))
-               nouveau_fence_emit(fence, dmem->migrate.chan);
+       nouveau_fence_new(&fence, dmem->migrate.chan);
        migrate_vma_pages(&args);
        nouveau_dmem_fence_done(&fence);
        dma_unmap_page(drm->dev->dev, dma_addr, PAGE_SIZE, DMA_BIDIRECTIONAL);
@@ -403,8 +402,7 @@ nouveau_dmem_evict_chunk(struct nouveau_dmem_chunk *chunk)
                }
        }
 
-       if (!nouveau_fence_new(&fence))
-               nouveau_fence_emit(fence, chunk->drm->dmem->migrate.chan);
+       nouveau_fence_new(&fence, chunk->drm->dmem->migrate.chan);
        migrate_device_pages(src_pfns, dst_pfns, npages);
        nouveau_dmem_fence_done(&fence);
        migrate_device_finalize(src_pfns, dst_pfns, npages);
@@ -677,8 +675,7 @@ static void nouveau_dmem_migrate_chunk(struct nouveau_drm 
*drm,
                addr += PAGE_SIZE;
        }
 
-       if (!nouveau_fence_new(&fence))
-               nouveau_fence_emit(fence, drm->dmem->migrate.chan);
+       nouveau_fence_new(&fence, drm->dmem->migrate.chan);
        migrate_vma_pages(args);
        nouveau_dmem_fence_done(&fence);
        nouveau_pfns_map(svmm, args->vma->vm_mm, args->start, pfns, i);
diff --git a/drivers/gpu/drm/nouveau/nouveau_exec.c 
b/drivers/gpu/drm/nouveau/nouveau_exec.c
index a90c4cd8cbb2..19024ce21fbb 100644
--- a/drivers/gpu/drm/nouveau/nouveau_exec.c
+++ b/drivers/gpu/drm/nouveau/nouveau_exec.c
@@ -96,7 +96,8 @@ nouveau_exec_job_submit(struct nouveau_job *job)
        unsigned long index;
        int ret;
 
-       ret = nouveau_fence_new(&exec_job->fence);
+       /* Create a new fence, but do not emit yet. */
+       ret = nouveau_fence_create(&exec_job->fence, exec_job->chan);
        if (ret)
                return ret;
 
@@ -170,13 +171,17 @@ nouveau_exec_job_run(struct nouveau_job *job)
                nv50_dma_push(chan, p->va, p->va_len, no_prefetch);
        }
 
-       ret = nouveau_fence_emit(fence, chan);
+       ret = nouveau_fence_emit(fence);
        if (ret) {
+               nouveau_fence_unref(&exec_job->fence);
                NV_PRINTK(err, job->cli, "error fencing pushbuf: %d\n", ret);
                WIND_RING(chan);
                return ERR_PTR(ret);
        }
 
+       /* The fence was emitted successfully, set the job's fence pointer to
+        * NULL in order to avoid freeing it up when the job is cleaned up.
+        */
        exec_job->fence = NULL;
 
        return &fence->base;
@@ -189,7 +194,7 @@ nouveau_exec_job_free(struct nouveau_job *job)
 
        nouveau_job_free(job);
 
-       nouveau_fence_unref(&exec_job->fence);
+       kfree(exec_job->fence);
        kfree(exec_job->push.s);
        kfree(exec_job);
 }
diff --git a/drivers/gpu/drm/nouveau/nouveau_fence.c 
b/drivers/gpu/drm/nouveau/nouveau_fence.c
index 77c739a55b19..61d9e70da9fd 100644
--- a/drivers/gpu/drm/nouveau/nouveau_fence.c
+++ b/drivers/gpu/drm/nouveau/nouveau_fence.c
@@ -205,16 +205,13 @@ nouveau_fence_context_new(struct nouveau_channel *chan, 
struct nouveau_fence_cha
 }
 
 int
-nouveau_fence_emit(struct nouveau_fence *fence, struct nouveau_channel *chan)
+nouveau_fence_emit(struct nouveau_fence *fence)
 {
+       struct nouveau_channel *chan = fence->channel;
        struct nouveau_fence_chan *fctx = chan->fence;
        struct nouveau_fence_priv *priv = (void*)chan->drm->fence;
        int ret;
 
-       if (unlikely(!chan->fence))
-               return -ENODEV;
-
-       fence->channel  = chan;
        fence->timeout  = jiffies + (15 * HZ);
 
        if (priv->uevent)
@@ -406,18 +403,41 @@ nouveau_fence_unref(struct nouveau_fence **pfence)
 }
 
 int
-nouveau_fence_new(struct nouveau_fence **pfence)
+nouveau_fence_create(struct nouveau_fence **pfence,
+                    struct nouveau_channel *chan)
 {
        struct nouveau_fence *fence;
 
+       if (unlikely(!chan->fence))
+               return -ENODEV;
+
        fence = kzalloc(sizeof(*fence), GFP_KERNEL);
        if (!fence)
                return -ENOMEM;
 
+       fence->channel = chan;
+
        *pfence = fence;
        return 0;
 }
 
+int
+nouveau_fence_new(struct nouveau_fence **pfence,
+                 struct nouveau_channel *chan)
+{
+       int ret = 0;
+
+       ret = nouveau_fence_create(pfence, chan);
+       if (ret)
+               return ret;
+
+       ret = nouveau_fence_emit(*pfence);
+       if (ret)
+               nouveau_fence_unref(pfence);
+
+       return ret;
+}
+
 static const char *nouveau_fence_get_get_driver_name(struct dma_fence *fence)
 {
        return "nouveau";
diff --git a/drivers/gpu/drm/nouveau/nouveau_fence.h 
b/drivers/gpu/drm/nouveau/nouveau_fence.h
index 2c72d96ef17d..64d33ae7f356 100644
--- a/drivers/gpu/drm/nouveau/nouveau_fence.h
+++ b/drivers/gpu/drm/nouveau/nouveau_fence.h
@@ -17,10 +17,11 @@ struct nouveau_fence {
        unsigned long timeout;
 };
 
-int  nouveau_fence_new(struct nouveau_fence **);
+int  nouveau_fence_create(struct nouveau_fence **, struct nouveau_channel *);
+int  nouveau_fence_new(struct nouveau_fence **, struct nouveau_channel *);
 void nouveau_fence_unref(struct nouveau_fence **);
 
-int  nouveau_fence_emit(struct nouveau_fence *, struct nouveau_channel *);
+int  nouveau_fence_emit(struct nouveau_fence *);
 bool nouveau_fence_done(struct nouveau_fence *);
 int  nouveau_fence_wait(struct nouveau_fence *, bool lazy, bool intr);
 int  nouveau_fence_sync(struct nouveau_bo *, struct nouveau_channel *, bool 
exclusive, bool intr);
diff --git a/drivers/gpu/drm/nouveau/nouveau_gem.c 
b/drivers/gpu/drm/nouveau/nouveau_gem.c
index c0b10d8d3d03..a0d303e5ce3d 100644
--- a/drivers/gpu/drm/nouveau/nouveau_gem.c
+++ b/drivers/gpu/drm/nouveau/nouveau_gem.c
@@ -914,11 +914,8 @@ revalidate:
                }
        }
 
-       ret = nouveau_fence_new(&fence);
-       if (!ret)
-               ret = nouveau_fence_emit(fence, chan);
+       ret = nouveau_fence_new(&fence, chan);
        if (ret) {
-               nouveau_fence_unref(&fence);
                NV_PRINTK(err, cli, "error fencing pushbuf: %d\n", ret);
                WIND_RING(chan);
                goto out;
commit 5eefc5307c983b59344a4cb89009819f580c84fa
Author: Andrzej Hajda <andrzej.ha...@intel.com>
Date:   Mon Aug 21 17:30:35 2023 +0200

    drm/i915: mark requests for GuC virtual engines to avoid use-after-free
    
    References to i915_requests may be trapped by userspace inside a
    sync_file or dmabuf (dma-resv) and held indefinitely across different
    proceses. To counter-act the memory leaks, we try to not to keep
    references from the request past their completion.
    On the other side on fence release we need to know if rq->engine
    is valid and points to hw engine (true for non-virtual requests).
    To make it possible extra bit has been added to rq->execution_mask,
    for marking virtual engines.
    
    Fixes: bcb9aa45d5a0 ("Revert "drm/i915: Hold reference to intel_context 
over life of i915_request"")
    Signed-off-by: Chris Wilson <chris.p.wil...@linux.intel.com>
    Signed-off-by: Andrzej Hajda <andrzej.ha...@intel.com>
    Reviewed-by: Andi Shyti <andi.sh...@linux.intel.com>
    Signed-off-by: Andi Shyti <andi.sh...@linux.intel.com>
    Link: 
https://patchwork.freedesktop.org/patch/msgid/20230821153035.3903006-1-andrzej.ha...@intel.com
    (cherry picked from commit 280410677af763f3871b93e794a199cfcf6fb580)
    Signed-off-by: Rodrigo Vivi <rodrigo.v...@intel.com>

diff --git a/drivers/gpu/drm/i915/gt/intel_engine_types.h 
b/drivers/gpu/drm/i915/gt/intel_engine_types.h
index e99a6fa03d45..a7e677598004 100644
--- a/drivers/gpu/drm/i915/gt/intel_engine_types.h
+++ b/drivers/gpu/drm/i915/gt/intel_engine_types.h
@@ -58,6 +58,7 @@ struct i915_perf_group;
 
 typedef u32 intel_engine_mask_t;
 #define ALL_ENGINES ((intel_engine_mask_t)~0ul)
+#define VIRTUAL_ENGINES BIT(BITS_PER_TYPE(intel_engine_mask_t) - 1)
 
 struct intel_hw_status_page {
        struct list_head timelines;
diff --git a/drivers/gpu/drm/i915/gt/uc/intel_guc_submission.c 
b/drivers/gpu/drm/i915/gt/uc/intel_guc_submission.c
index a0e3ef1c65d2..b5b7f2fe8c78 100644
--- a/drivers/gpu/drm/i915/gt/uc/intel_guc_submission.c
+++ b/drivers/gpu/drm/i915/gt/uc/intel_guc_submission.c
@@ -5470,6 +5470,9 @@ guc_create_virtual(struct intel_engine_cs **siblings, 
unsigned int count,
 
        ve->base.flags = I915_ENGINE_IS_VIRTUAL;
 
+       BUILD_BUG_ON(ilog2(VIRTUAL_ENGINES) < I915_NUM_ENGINES);
+       ve->base.mask = VIRTUAL_ENGINES;
+
        intel_context_init(&ve->context, &ve->base);
 
        for (n = 0; n < count; n++) {
diff --git a/drivers/gpu/drm/i915/i915_request.c 
b/drivers/gpu/drm/i915/i915_request.c
index 7c7da284990d..f59081066a19 100644
--- a/drivers/gpu/drm/i915/i915_request.c
+++ b/drivers/gpu/drm/i915/i915_request.c
@@ -134,9 +134,7 @@ static void i915_fence_release(struct dma_fence *fence)
        i915_sw_fence_fini(&rq->semaphore);
 
        /*
-        * Keep one request on each engine for reserved use under mempressure
-        * do not use with virtual engines as this really is only needed for
-        * kernel contexts.
+        * Keep one request on each engine for reserved use under mempressure.
         *
         * We do not hold a reference to the engine here and so have to be
         * very careful in what rq->engine we poke. The virtual engine is
@@ -166,8 +164,7 @@ static void i915_fence_release(struct dma_fence *fence)
         * know that if the rq->execution_mask is a single bit, rq->engine
         * can be a physical engine with the exact corresponding mask.
         */
-       if (!intel_engine_is_virtual(rq->engine) &&
-           is_power_of_2(rq->execution_mask) &&
+       if (is_power_of_2(rq->execution_mask) &&
            !cmpxchg(&rq->engine->request_pool, NULL, rq))
                return;
 
commit 4b2fd81f2af7147e844ecec0c5c07a16bca6b86e
Author: Justin Stitt <justinst...@google.com>
Date:   Thu Aug 24 21:20:25 2023 +0000

    accel/ivpu: refactor deprecated strncpy
    
    `strncpy` is deprecated for use on NUL-terminated destination strings [1].
    
    A suitable replacement is `strscpy` [2] due to the fact that it
    guarantees NUL-termination on its destination buffer argument which is
    _not_ the case for `strncpy`!
    
    Also remove extraneous if-statement as it can never be entered. The
    return value from `strncpy` is it's first argument. In this case,
    `...dyndbg_cmd` is an array:
    |       char dyndbg_cmd[VPU_DYNDBG_CMD_MAX_LEN];
                 ^^^^^^^^^^
    This can never be NULL which means `strncpy`'s return value cannot be
    NULL here. Just use `strscpy` which is more robust and results in
    simpler and less ambiguous code.
    
    Moreover, remove needless `... - 1` as `strscpy`'s implementation
    ensures NUL-termination and we do not need to carefully dance around
    ending boundaries with a "- 1" anymore.
    
    Fixes: 5d7422cfb498 ("accel/ivpu: Add IPC driver and JSM messages")
    Link: 
www.kernel.org/doc/html/latest/process/deprecated.html#strncpy-on-nul-terminated-strings
 [1]
    Link: 
https://manpages.debian.org/testing/linux-manual-4.8/strscpy.9.en.html [2]
    Link: https://github.com/KSPP/linux/issues/90
    Cc: linux-harden...@vger.kernel.org
    Signed-off-by: Justin Stitt <justinst...@google.com>
    Reviewed-by: Stanislaw Gruszka <stanislaw.grus...@linux.intel.com>
    Signed-off-by: Stanislaw Gruszka <stanislaw.grus...@linux.intel.com>
    Link: 
https://patchwork.freedesktop.org/patch/msgid/20230824-strncpy-drivers-accel-ivpu-ivpu_jsm_msg-c-v1-1-12d9b52d2...@google.com

diff --git a/drivers/accel/ivpu/ivpu_jsm_msg.c 
b/drivers/accel/ivpu/ivpu_jsm_msg.c
index 831bfd2b2d39..bdddef2c59ee 100644
--- a/drivers/accel/ivpu/ivpu_jsm_msg.c
+++ b/drivers/accel/ivpu/ivpu_jsm_msg.c
@@ -118,8 +118,7 @@ int ivpu_jsm_dyndbg_control(struct ivpu_device *vdev, char 
*command, size_t size
        struct vpu_jsm_msg resp;
        int ret;
 
-       if (!strncpy(req.payload.dyndbg_control.dyndbg_cmd, command, 
VPU_DYNDBG_CMD_MAX_LEN - 1))
-               return -ENOMEM;
+       strscpy(req.payload.dyndbg_control.dyndbg_cmd, command, 
VPU_DYNDBG_CMD_MAX_LEN);
 
        ret = ivpu_ipc_send_receive(vdev, &req, VPU_JSM_MSG_DYNDBG_CONTROL_RSP, 
&resp,
                                    VPU_IPC_CHAN_ASYNC_CMD, vdev->timeout.jsm);

Reply via email to